# 1数据中台-架构设计

## 一、引言

软件的概要设计又称为软件系统（程序系统）的设计，本文档应说明软件系统即程序系统设计的总体考虑，包括系统的基本处理流程、软件系统的组织结构、模块划分、功能分配、数据结构、接口、运行、出错处理和系统维护等方面的设计，为详细设计提供基础。

## 二、业务设计

### 1、统一数据标准管理

主要负责公司层面的持久化数据的定义。参考“数据架构”梳理中的数据字典excel、数据类型，设计数据统一标准的7类高级数据类型，七种高级数据类型分别为：字典、知识库、对象、关系、时序、图数据以及多维数据类型。

并在此基础上设计的统一数据模型进行管理：

1、包括模型的统一数据标准文件、数据结构、业务规则的管理，

2、包括数据模型、数据融合关系、数据模型映射、数据版本、数据业务含义的管理，

3、包括在数据模型基础上的实现代码，进行数据生成管理。

![](./image/image-20200830112919069.png)

在数据中台的搭建中，采用统一数据标准管理，可以方便地规范数据资源，并向外提供统一的数据服务。管理行业标准、企业标准，对企业业务系统中涉及到的数据标准及其数据字典进行管理，包含数据标准的维护、查询、数据合理性和逻辑性核检。

统一数据标准文件可以批量导入数据中台，作为统一数据标准。

#### 1.1数据类型

编写统一数据标准文件，用于管理七种数据类型的数据编码，对所有数据编码进行统一管理，是数据中台集成的基础，主要包含七种高级数据类型：字典、知识库、对象、关系、时序、图数据以及多维数据。

#### 1.2命名规范

制定数据标准的库、表、字段等的命名规范，确保设计的正式和统一。

**1）数据库命名规范**

​    可以采用26个英文字母 (区分大小写) 和0-9的自然数 (一般不需要) 加上下划线 ‘_’ 组成，命名简单明确 (Student_Union)，多个单词用下划线 ‘_’ 分隔，一个项目一个数据库，多个项目慎用同一个数据库

**2）表命名规范**

-  采用26字母和0-9的自然数（一般不使用）加上下互相 ‘_’ 组成，命名简洁明确，多个单词用下划线 ‘_’ 隔开

-  全部小写命名，必须避免出现大写

- 禁止使用关键字，如：select、table、show 等等

- 表名称不要取得太长（不超过三个英文单词）

- 表的名称使用名词或者动宾短语

- 也要注意单词形式，列如：使用 user ，而不是 users（因为用户表是一个的而不是多个）

- 表必须填写描述信息（建表时可以用注释详细写出表细节的作用，不同数据库的注释都不一样）

**3）字段命名规范**

- 采用26字母和0-9的自然数（一般不使用）加上下互相 ‘_’ 组成，命名简洁明确，多个单词用下划线 ‘_’ 隔开

- 全部小写命名，必须避免出现大写

- 字段必须填写描述信息

- 禁止使用数据库关键字

- 字段名称采用名词或动宾短语

- 采用字段的名字必须是易于理解，不超过三个英文单词

- 在命名表的列时，不要重复表的名称（如：在 user 表中，出现 user_name 字段）

- 字段命名使用完整名称

**4）SQL语言编码规范**

- 所有关键字大写，如：DELETE、UPDATE、INSERT等等

- 多有函数及其参数中除用户变量以外的部分必须大写

- 在定义变量时用到的数据类型必须小写

#### 1.3数据融合

1）主数据只能由一个服务、一个业务模块生成和编辑。

2）涉及主数据的字典编码由数据字典管理员统一定义、管理，研发人员、客户经理禁止做任何修改，产品只提供编码别名配置，不提供编码用户自定义。

3）非主数据的字典编码可以提供用户自定义，但是作为一种平台扩展功能，系统默认提供的编码不能被删除、修改。

4）主数据的编码采用单一代码，只采用代理主键的方式（主数据编码不强制含有业务意义，只具有主键作用，比如 UUID，看情况区分要不要前缀。）所有业务意义和业务规则依赖下的关系都由业务字段定义。

4）时间、空间坐标作为通用统一技术形式，业务上可以互相之间映射融合。

5）主数据的编码规则整个系统一但确定，禁止改变。

#### 1.4数据兼容

**1）主数据兼容**

主数据通过编码规则，在分布式系统下，所有主数据编码不产生冲突。主数据编码规则不变，所有用户、集团、项目的主数据编码不产生冲突。

**2）编码兼容**

数据标准提供一套标准的编码，形成产品统一的编码语义。每个集团自定义编码采用编码映射表管理，提供自定义编码语义、别名语义。

**3）非主数据的数据字典编码**

项目可以自定义扩展。但原则上，新字典编码（非主数据默认字典编码），不提供项目上自定义扩展。

**4）模板、产品知识等数据兼容**

产品默认提供一套标准的模板（包括流程、默认参数值等）、知识等通用业务数据。在建立集团、项目时，提供标准的业务数据，并提供集团、项目自定义。系统升级时，不改变这部分数据。 高级七种数据类型的数据结构完全兼容，条目、数值、内容是不同的。

**5）业务数据兼容**

功能、权限点、版本、报警规则、控制指令等业务数据产品统一定义，客户禁止修改。系统升级时自动兼容。

**6）接口兼容**

产品标准接口兼容。客户自定义接口默认在产品标准接口基础上形成，从而系统尽可能自动兼容。未在产品标准接口上定制的接口，系统采取不兼容方式。

#### 1.5存储原则

1）所有字典存采用MySQL存储。

2）不同用户的数据不做物理隔离，做逻辑隔离。

3）不同业务域数据分库存储，前端服务只能直接读取本业务域下的数据存储，不应跨业务域读取数据库数据。

4）kafka中存储的消息包不区分业务、用户，消息包头文件需要有消息区分，不同的业务划分采用不同的channel。

5）redis缓存中不区分业务、用户，完全由主数据编码规则保障数据不冲突。

6）ES数据也不区分业务、用户，查询时通过字典编码精确过滤掉非本业务、用户的数据。

7）用户扩展、自定义内容都在用户库中存储。每个用户自定义、定制内容采用逻辑隔离的方式存储（每个用户、项目创建一个schema）。所有用户扩展、自定义数据只能在MySQL、Hbase中存储。

8）多个不同版本产品，部署多套时，根据产品情况，数据库采用业务字段或schema方式隔离。（避免搭建很多套数据库实例）

9）Schema的命名方式：

a、产品数据随着产品版本变化的产品： “产品ID”+”产品版本”+ “DB schema id” + “ 集团” + “项目” 

b、产品数据不随着产品版本变化的产品 “产品ID”+ “DB schema id” + “ 集团” + “项目” 

### 2、数据流程管理

![](./image/image-20200830113128572.png)

1）数据存储结构生成：注明表字段、表索引、表的主键规则、Schema。自动生成数据表

2）业务配置生成：根据业务逻辑，设计配置数据表，通过配置数据表的接口生成业务配置规则

3）接口生成：基于业务配置数据，生成业务数据查询接口，如配置了指标项、指标计算规则及要生成的指标计算结果，入参为业务配置id，出参为指标计算结果（多为多条）

4）数据输出

​	a）数据文件生成：基于接口的出参生成excel文件，每个指标计算结果作为一列，

​	b）页面生成：封装web前端excel文件转化工具，将excel文件转化为Html页面

### 3、数据结构管理

七大数据类型的数据结构管理，包含字典、知识库、对象、关系、时序、图数据以及多维数据的数据表设计、数据增删改查接口管理。

（图数据的数据结构管理暂不考虑）

### 4、业务规则管理

进行业务规则数据表的设计，及业务规则数据的增删改查接口管理。

## 三、总体逻辑

![](./image/image-20200830113435070.png)

## 四、功能设计

### 1、功能服务架构

 ![](./image/image-20200830113215707.png)

本次涉及的服务主要：数据字典、数据存储、数据查询、管理监控、人员组织权限、文件管理、报警中心、资产资料、统一收费管理

#### 1.1基础数据涉及的服务

数据字典、数据存储、数据查询：用于7大基础数据类型的存储和查询

管理监控：在该服务上开发任务调度服务

#### 1.2主数据涉及的服务

数据字典、数据存储、数据查询：为主数据存储和查询的基础服务

人员组织权限：为主数据-人员、组织结构、权限管理的业务服务

文件管理：为主数据-文件（合同等文件）的业务服务

资产资料：为主数据-供应商数据、耗材数据、工具数据的业务服务

统一收费：为主数据-租户数据的业务服务

#### 1.3中控业务涉及的服务

数据字典、数据存储、数据查询：为中控业务数据存储和查询的基础服务，同时支持监测、控制业务，提供物理世界和IOT数据

报警中心：为中控报警业务数据的服务

#### 1.4数据分层

![](./image/image-20200830113229413.png)

#### 1.5数据ER图

![](./image/image-20200901201256396.png)

### 2、功能清单



|           功能分类 | 功能                         | 需求点                                                       | 备注 |
| -----------------: | ---------------------------- | :----------------------------------------------------------- | ---- |
|       统一数据标准 | 字典数据管理                 | 1、定义标准字典类型、定义标准字典数据结构、定义自定义字典数据映射结构<br />2、对字典数据进行增删改查，需提供相关字典数据接口<br />3、进行字典进行映射兼容管理，通过字典数据映射实现 |      |
|                    | 知识库数据管理               | 1、定义标准知识库类型，定义标准知识库数据结构<br />2、对知识库进行增删改查，需提供相关的知识库数据接口 |      |
|                    | 对象数据管理                 | 1、对象属性管理，如a、物理世界对象，有对象的名称、编码、信息点等属性<br />b、业务对象，如报警对象，有报警类型、报警条目属性等<br />2、对象服务管理，添加业务对象数据结构<br />3、可对业务对象进行增删改查，需提供相关的业务对象管理接口 |      |
|                    | 关系数据管理                 | 1、物理世界对象关系管理，描述物理世界对象之间的关系，如空间下的对象、服务空间的系统，主要采用图类型和边类型进行管理，边类型为图类型的补充说明<br />2、业务对象的关系管理，描述业务对象之间的关系，与工单与报警的关系数据，并提供相关接口 |      |
|                    | 图数据管理                   | 无相关存储场景，暂不考虑                                     |      |
|                    | 时序数据管理                 | 1、时序数据属性管理，定义时序数据的数据结构，主要为IOT数据，IOT采集数据分时序存储，如分精度数据的存储<br />2、可对时序数据进行增删改查，需提供相关的时序数据接口 |      |
|                    | 多维数据管理                 | 1、维度管理，如时间维度、空间维度、人的维度、对象的维度、组织的维度等<br />2、指标管理，如工单、能源、环境等数据指标<br />3、多维数据结构管理，定义多维数据的数据结构，主要为报表、统计数据<br />4、对多维数据进行增删改查，需提供相关的多维数据管理接口 |      |
|                    | 数据流向管理                 | 1、数据字典文件excel生成<br />2、数据存储结构生成<br />3、业务配置项生成<br />4、根据业务配置项，输出接口<br />5、数据输出，包含数据文件生成和页面生成 |      |
|           数据质量 | 数据质量管理                 | 1、在做兼容和数据融合的处理时，我们引入数据映射的数据表，<br />2、将历史数据或者第三方数据与数据映射表建立业务定义的对应关系，主要包含数据表、字段、语义和精度等定义。<br />3、数据映射表的数据映射到数据中台标准数据中，完成数据兼容和融合<br />4、还需在进行数据管理时，对数据的版本进行管理，必要时需要对不同版本的数据进行分表存储。 |      |
| 主数据数据结构定义 | 主数据-人员组织结构权限      | 1、定义人员组织管理的数据结构，数据模型包含：<br />1）集团（多租户）<br />2）项目<br />3）组织（集团、中心、区域、项目，用于进行人员、组织结构管理范围设置）<br />4）部门<br />5）岗位<br />6）部门模版<br />7）岗位模版<br />8）人员<br />9）账号<br />10）应用<br />11）功能<br />2、集团与部门，每个集团下有一个顶级部门与集团对应，创建集团时会同时创建一个部门，部门名称默认与集团名称相同<br />3、组织下可以创建部门，组织可以分配项目，只能分配上级组织已分配的项目。人可以管理的人员、组织结构范围为所属组织下的所有组织和部门。<br />4、部门与项目，为部门分配项目，部门继承上级部门或者所属组织（所属组织下的第一级部门）的项目，只能分配上级部门或者所属组织已分配的项目。<br />5、人继承部门的数据权限，但可以编辑，只能分配上级部门已分配的项目，人可以有多个部门分主部门和兼职部门（主和非主）<br />6、顶级部门默认配置了集团下的全部项目，新增项目时也同时将项目分配到顶级部门<br />7、集团应用权限集，集团与应用关系，描述集团是否开通应用，集团的应用权限及应用下功能权限集合<br />8、项目应用权限集，项目与应用关系，项目的应用默认继承集团，但必须小于等于项目所在的集团，描述项目是否开通应用，项目的应用权限及应用下功能权限集合<br />9、集团功能权限集，集团与功能关系，描述集团是否开通应用下的功能，集团开通的应用下功能权限集合<br />10、项目功能权限集，项目与功能关系，项目的功能权限默认继承集团，但必须小于等于项目所在的集团，描述项目是否开通应用下的功能，项目开通的应用下功能权限集合<br />11、岗位配置功能，描述岗位具备的功能权限<br />12、人员组织岗位关系，将人员加到某个组织的某个岗位上，则用户具备组织已配置的项目的数据权限，同时具备岗位已配置的功能权限<br />13、人继承岗位的功能权限，但可以编辑，只能分配上级岗位已分配的功能，人可以有多个岗位，分主岗和兼职岗（主和非主） |      |
|                    | 主数据-租户数据(二期)        | 1、定义租户信息、租户配置、租户账单信息的数据结构，详见《finein_saas_web统一收费管理》<br />2、对租户数据进行管理，需提供相关的数据接口 |      |
|                    | 主数据-供应商数据(二期)      | 1、对供应商数据进行主数据表结构梳理<br />1）供应商类型表<br />2）供应商类型扩展字段表<br />3）供应商表<br />4）供应商扩展表<br />5）供应商与供应商类型关系表<br />2、供应商数据的增删改查接口管理 |      |
|                    | 主数据-库存数据(二期)        | 1、对库存数据进行主数据表结构梳理<br />1）系统类型常量表<br />2）仓库信息表：仓库数据主体表<br />3）仓库管理员表<br />4）工具清单表：工具数据主体表<br />5）工具箱表：工具箱数据主体表<br />6）工具箱清单表：工具箱清单的清单数据主体表<br />7）工具箱领用单：工具箱领用单的数据主体表<br />8）工具箱领用单详情：工具箱领用单内的工具箱详情数据主体表<br />9）公用工具表：公用工具数据主体表<br />10）公用工具借用单：公用工具借用单的数据主体表<br />11）公用工具借用单详情：公用工具借用单内的借用工具详情数据主体表<br />12）工具操作记录表<br />13）耗材出库详情表：耗材出库单内的耗材详情数据主体表<br />14）耗材出库表：耗材出库单的数据主体表<br />15）耗材入库详情表：耗材入库单内的耗材详情数据主体表<br />16）耗材入库表：耗材入库单的数据主体表<br />17）耗材表：耗材数据主体表<br />18）耗材模板、项目关联表<br />19）耗材模板表：记录耗材模版主体数据<br />20）工具转借单：工具转借单的数据主体表<br />2、库存数据的增删改查接口管理 |      |
|                    | 主数据-物理世界数据字典      | 1、物理世界数据字典进行版本升级，对底层存储数据切换为mysql，<br />2、对信息点编码进行调整，使用驼峰命名<br />3、调整存储方式和分库分表方案，数据字典部分调整为平台字典单独一个库，集团数据和项目数据按集团进行分库，物理世界部分按集团进行分库，按项目进行分表<br />4、枚举型信息点修改为引用数据标准化定义的数据<br />5、提供可行的数据迁移方案 |      |
|                    | 主数据-文件数据(二期)        | 1、定义文件的数据结构<br />2、提供文件的上传、下载功能，定义相关接口 |      |
|           中控业务 | IOT数据-数字化交付           | 1、提供物理世界对象与关系数据结构，供设备对接与写入<br />2、提供物理世界对象信息点数据结构，以用于IOT数据的写入和存储<br />3、进行IOT数据质量处理<br />4、提供接口查询服务，可查询IOT数据 |      |
|                    | IOT数据-物联网数据采集与计算 | 1、采集数据的数据结构设计，及接口管理<br />2、填报数据的数据结构设计，及接口管理<br />3、分精度计算<br />1）对仪表采集和填报的原始数据进行分精度临近值处理和枚举量存储，分精度临近值包含原始数据临近值、人工智能程序分精度计算临近值、人工修复分精度计算临近值、专家修复分精度计算临近值<br />2）各类分精度数据表的数据结构设计，及接口管理<br />**<br />**4、仪表能耗数据管理<br />1）仪表能耗数据的计算<br />2）仪表能耗数据的数据结构设计，及接口管理<br />5、支路&计算单元能耗数据管理<br />1）支路&计算单元能耗数据的计算<br />2）支路&计算单元能耗数据的数据结构设计，及接口管理<br />6、分项能耗数据管理<br />1）分项能耗数据的计算<br />2）分项能耗数据的数据结构设计，及接口管理<br />7、租户能耗与费用数据表<br />1）租户能耗与费用数据的计算<br />2）租户能耗与费用数据的数据结构设计，及接口管理<br />3）仪表功能号用于进行仪表尖峰平谷的区分计量，及租户费用尖峰平谷的区分计算 |      |
|                    | 中控支持-报警系统            | 1、定义报警类型、报警条目数据接口，并提供报警类型与条目的增删改查管理接口 <br />2、报警记录，用于描述一个发生的具体的报警，提供报警新建和查询接口<br />3、~~自动点位报警配置数据描述自动触发报警需要满足的类型、分类以及特定条件，以及报警时使用的报警条目<br />4、对象点位报警配置数据根据自动点位报警配置的类型自动生成，可以修改为开或者关<br />5、对象点位报警配置数据产生后，在接收到物联网采集数据后，系统自动根据配置的条件判断是否触发报警，如果触发报警则创建一条与配置条目对应的报警记录~~ |      |
|                    | 中控支持-监控配置            | 1、定义监控配置的数据结构<br />2、定义控制指令的数据结构<br />1）控制指令数据originalset<br />存储所有的控制指令记录，表字段：项目编码、仪表编码、功能号、指令时间、指令值、指令状态、指令结束时间<br />2）控制指令当前值originalsetpresent<br />存储当前控制指令的记录数据，表字段：项目编码、仪表编码、功能号、指令时间、指令值、指令状态、指令结束时间<br />3、对监控配置数据进行增删改查，需提供相关配置数据管理的数据接口<br />4、对控制指令数据进行增删改查，需提供相关控制指令数据管理的数据接口 |      |
|                    | 中控支持-日志                | 1、定义日志类型的数据结构<br />1）日志类型编码<br />2）日志类型名称<br />3）日志类型描述<br />4）日志类型状态（启用、停用）<br />5）日志类型所属应用<br />2、定义日志的基础字段信息，并可对日志类型进行字段配置<br />1）日志名称<br />2）日志类型<br />3）日志操作人/系统<br />4）日志创建时间<br />5）日志内容（字符串，使用json格式Str）<br />6）日志备注<br />3、对日志数据进行新建、查询，需提供相关日志的数据接口<br />4、各业务系统的日志消息写入kafka中，由数据中台进行消息的监听和消费，并写入hbase中。 |      |
|           任务调度 | 任务调度系统                 | 1、任务配置，用于描述一个具体的任务配置信息，将任务存入DB中，且提供任务配置接口，<br />1）集团编码、<br />2）应用编码、<br />3）项目ID、<br />4）任务编码<br />5）任务名称<br />6）任务开始执行时间<br />7）任务执行过期时间<br />8）执行方式（调起方式：http，jms，接口）<br />9）执行方式配置参数<br />10）调起参数（接口参数）<br />11）调起频率<br />12）任务接口的处理时长<br />13）优先级<br />14）备注<br />2、任务的时间参数提供给工作历，由工作历进行任务的轮询和根据NTP时间向 任务调度系统发送任务启动消息<br />3、调度执行管理<br />1）拿到工作历的任务启动消息，读取配置的任务，满足以下条件的任务会被触发：<br />    a）没有该任务执行中的任务记录<br />    b）有该任务执行中的任务记录但达到上次执行任务的过期时间，根据最新一条任务执行记录的开始执行时间和过期时长判断是否达到过期时间<br />2）生成新的任务执行记录<br />3）根据执行方式的配置向相关的服务发送调起消息，放入MQ中，需要对任务队列进行消峰处理，发送调起消息时需将集团编码、应用编码、项目ID、任务ID、任务编码、调起参数、任务执行记录ID等作为参数传给相关的服务。<br />4、执行记录，用于描述一个任务的具体的一次执行过程<br />1）被调度方根据执行结果和任务ID来更新执行记录，更新执行结束时间、状态。 |      |



## 四、总体设计



### 1、技术选型

| **技术**          | **约定** | **备注**                                   |
| ----------------- | -------- | ------------------------------------------ |
| Spark             | xx版本   | 计算引擎                                   |
| Hbase             | xx版本   | 分布式数据库                               |
| MySQL             | xx版本   | 关系型数据库                               |
| Redis             | xx版本   | 缓存服务                                   |
| ElasticSearch     | xx版本   | 搜索引擎ES                                 |
| Zookeeper         | xx版本   | 分布式共享存储，保证数据中台计算调度一致性 |
| HDFS              | xx版本   | 分布式文件系统(Hadoop)                     |
| Flume             | xx版本   | IOT数据采集的服务                          |
| Kfaka             | xx版本   | 分布式发布订阅消息系统 ，消息中间件        |
| ActiveMQ/rabbitmq | xx版本   | 消息中间件                                 |

### 2、技术复用

| **功能**               | **技术复用**                 | **备注** |
| ---------------------- | ---------------------------- | -------- |
| 业务规则配置  技术复用 | 业务流程配置                 |          |
|                        | 权限配置                     |          |
|                        | 业务字段配置                 |          |
| 数据接收  技术复用     | DRS数据修复软件              |          |
|                        | 通用数据上传工具ems-upload   |          |
|                        | 通用数据导入工具mysql2hbase  |          |
|                        | 通用数据分发工具ems-transfer |          |
| 文件服务  技术复用     | Image-service文件图片服务    |          |
| 计算任务  技术复用     | Spark计算引擎                |          |
|                        | DRS数据修复软件              |          |
|                        | 大数据实时存储计算           |          |
| 存储  技术复用         | 分布式数据库：hbase、mysql   |          |
|                        | Redis、Cache系统缓存服务     |          |
|                        | 数据库访问中间件             |          |
|                        | Hbase数据监控-hbaseflow      |          |
| 调度管理  技术复用     | 分布式调度                   |          |
|                        | PFK平台急救箱                |          |
| 数据查询  技术复用     | 分布式搜索引擎ES             |          |
|                        | metadata-web Hbase数据库查询 |          |
|                        | pdfreport PDF工具            |          |

### 3、关键技术

#### 3.1接入层—大数据实时流处理技术

![](./image/image-20200830113324793.png)

跨业务跨系统的实时数据处理**统一管理平台**，毫秒级响应，每秒10000条并发吞吐能力。

#### 3.2数据层—基于数据标准的平台开发技术

![](./image/image-20200830113340784.png)

### 4、数据种类与技术选型

![](./image/image-20200830113501019.png)

### 5、数据表设计

#### 5.1 IOT数据采集与计算数据表设计

##### 5.1.1数据采集与填报

1、IOT数据的导入数据库的方式分为 自动采集（自采表）和人工填报（手抄表）

2、采集数据表设计

1）低频原始数据original_month

存储仪表采集低频原始数据的月维度原始数据，表设计：

| 字段        | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ----------- | -------------- | ------ | ------ | ---- | -------------- |
| building    | 项目10位数编码 | String | 否     | 是   |                |
| meter       | 仪表编号       | String | 否     | 是   |                |
| funcid      | 功能号         | Long   | 否     | 是   |                |
| receivetime | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss |
| data        | 数据值         | Double | 否     |      |                |

2）高频原始数据original_day

存储仪表采集高频原始数据的日维度原始数据，表设计

| 字段        | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ----------- | -------------- | ------ | ------ | ---- | -------------- |
| building    | 项目10位数编码 | String | 否     | 是   |                |
| meter       | 仪表编号       | String | 否     | 是   |                |
| funcid      | 功能号         | Long   | 否     | 是   |                |
| receivetime | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss |
| data        | 数据值         | Double | 否     |      |                |

3）原始数据当前值original_present

存储仪表原始数据的当前值，表设计

| 字段        | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ----------- | -------------- | ------ | ------ | ---- | -------------- |
| building    | 项目10位数编码 | String | 否     | 是   |                |
| meter       | 仪表编号       | String | 否     | 是   |                |
| funcid      | 功能号         | Long   | 否     | 是   |                |
| receivetime | 数据时间       | String | 否     |      | yyyyMMddHHmmss |
| data        | 数据值         | Double | 否     |      |                |

3、填报数据表设计

1）填报原始数据originalreport_data<br />存储仪表原始数据的填报值，不区分低频、高频，表设计

| 字段        | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ----------- | -------------- | ------ | ------ | ---- | -------------- |
| building    | 项目10位数编码 | String | 否     | 是   |                |
| meter       | 仪表编号       | String | 否     | 是   |                |
| funcid      | 功能号         | Long   | 否     | 是   |                |
| receivetime | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss |
| data        | 数据值         | Double | 否     |      |                |



##### 5.1.2分精度计算

对采集数据和人工填报数据进行分精度处理，对IOT数据进行分精度处理，取1min、5min、15min、1h、1d分精度临近值和枚举量。

1、分精度临近值数据存储包含原始数据分精度临近值、人工智能程序计算自动分精度临近值、人工修复分精度临近值和专家修复分精度临近值

2、枚举量分精度数据存储包含 枚举值、此枚举值时间比例和数据标记（0正常、其他正整数为异常）

3、分精度数据表设计

1）分精度临近值fjd_0_near_15min（15min代表15分钟，还有1min、5min、1h、1d）

存储原始的分精度1min、5min、15min、1h、1d的临近值数据，表设计

| 字段       | 字段名称       | 类型   | 可为空 | 主键 | 备注                    |
| ---------- | -------------- | ------ | ------ | ---- | ----------------------- |
| building   | 项目10位数编码 | String | 否     | 是   |                         |
| meter      | 仪表编号       | String | 否     | 是   |                         |
| funcid     | 功能号         | Long   | 否     | 是   |                         |
| data_time  | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss          |
| data_value | 数据值         | Double | 否     |      |                         |
| data_flag  | 数据标记       | Long   | 否     |      | 0正常，其他正整数为异常 |

2）自动修复分精度临近值fjd_1_near_15min（15min代表15分钟，还有1min、5min、1h、1d）

存储人工智能程序进行了分精度计算修复的分精度1min、5min、15min、1h、1d的临近值数据，表设计

| 字段       | 字段名称       | 类型   | 可为空 | 主键 | 备注                    |
| ---------- | -------------- | ------ | ------ | ---- | ----------------------- |
| building   | 项目10位数编码 | String | 否     | 是   |                         |
| meter      | 仪表编号       | String | 否     | 是   |                         |
| funcid     | 功能号         | Long   | 否     | 是   |                         |
| data_time  | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss          |
| data_value | 数据值         | Double | 否     |      |                         |
| data_flag  | 数据标记       | Long   | 否     |      | 0正常，其他正整数为异常 |

3）人工修复分精度临近值fjd_2_near_15min（15min代表15分钟，还有1min、5min、1h、1d）

存储人工进行了分精度修复的分精度1min、5min、15min、1h、1d的临近值数据，表设计

| 字段       | 字段名称       | 类型   | 可为空 | 主键 | 备注                    |
| ---------- | -------------- | ------ | ------ | ---- | ----------------------- |
| building   | 项目10位数编码 | String | 否     | 是   |                         |
| meter      | 仪表编号       | String | 否     | 是   |                         |
| funcid     | 功能号         | Long   | 否     | 是   |                         |
| data_time  | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss          |
| data_value | 数据值         | Double | 否     |      |                         |
| data_flag  | 数据标记       | Long   | 否     |      | 0正常，其他正整数为异常 |

4）专家修复分精度临近值fjd_3_near_15min（15min代表15分钟，还有1min、5min、1h、1d），暂无该数据，是未来分精度计算的一个期望

存储专家进行了分精度修复的分精度1min、5min、15min、1h、1d的临近值数据，表设计

| 字段       | 字段名称       | 类型   | 可为空 | 主键 | 备注                    |
| ---------- | -------------- | ------ | ------ | ---- | ----------------------- |
| building   | 项目10位数编码 | String | 否     | 是   |                         |
| meter      | 仪表编号       | String | 否     | 是   |                         |
| funcid     | 功能号         | Long   | 否     | 是   |                         |
| data_time  | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss          |
| data_value | 数据值         | Double | 否     |      |                         |
| data_flag  | 数据标记       | Long   | 否     |      | 0正常，其他正整数为异常 |

5）枚举量分精度比例值fjd_0_rate_15min（15min代表15分钟，还有1min、5min、1h、1d）

存储枚举值类型的分精度1min、5min、15min、1h、1d的比例值数据，如（阀门开关值），表设计

| 字段         | 字段名称         | 类型   | 可为空 | 主键 | 备注                    |
| ------------ | ---------------- | ------ | ------ | ---- | ----------------------- |
| building     | 项目10位数编码   | String | 否     | 是   |                         |
| meter        | 仪表编号         | String | 否     | 是   |                         |
| funcid       | 功能号           | Long   | 否     | 是   |                         |
| data_time    | 数据时间         | String | 否     | 是   | yyyyMMddHHmmss          |
| status_value | 枚举值           | Double | 否     |      |                         |
| data_flag    | 数据标记         | Long   | 否     |      | 0正常，其他正整数为异常 |
| status_ratio | 此枚举值时间比例 | Double |        |      |                         |



##### 5.1.3仪表能耗计算

1、根据分精度数据计算出的仪表能耗值，并按1min、5min、15min、1h、1d等时间维度对仪表能耗数据进行存储入库。

2、仪表能耗数据表设计 

1）仪表能耗data_servicedata_15min（15min代表15分钟，还有1min、5min、1h、1d）

根据分精度数据计算出的仪表能耗值，存储维度：1min、5min、15min、1h、1d，表设计

| 字段       | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ---------- | -------------- | ------ | ------ | ---- | -------------- |
| building   | 项目10位数编码 | String | 否     | 是   |                |
| meter      | 仪表编号       | String | 否     | 是   |                |
| funcid     | 功能号         | Long   | 否     | 是   |                |
| data_time  | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss |
| data_value | 差分值         | Double | 否     |      |                |

2）仪表能耗最大值data_servicedata_max_1h（1h代表小时，还有1d、1m、1y）

存储1h、1d、1m、1y等时间维度的仪表能耗最大值，1m和1y需要开启servicedata_max计算任务，表设计

| 字段       | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ---------- | -------------- | ------ | ------ | ---- | -------------- |
| building   | 项目10位数编码 | String | 否     | 是   |                |
| meter      | 仪表编号       | String | 否     | 是   |                |
| funcid     | 功能号         | Long   | 否     | 是   |                |
| data_time  | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss |
| data_value | 差分值         | Double | 否     |      |                |



##### 5.1.4支路&计算单元能耗计算

1、根据上述存储在数据库中的仪表能耗以及能耗调研，计算出支路&计算单元的能耗值

2、支路&计算单元能耗数据表设计

1）支路&计算单元能耗data_objectdata_15min（15min代表15分钟，还有1min、5min、1h、1d）

根据上述“5”中的仪表能耗以及能耗调研，计算出支路&计算单元的能耗值，存储维度：1min、5min、15min、1h、1d，表设计

| 字段       | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ---------- | -------------- | ------ | ------ | ---- | -------------- |
| building   | 项目10位数编码 | String | 否     | 是   |                |
| objectSign | 仪表编号       | String | 否     | 是   |                |
| data_time  | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss |
| data_value | 数据值         | Double | 否     |      |                |

2）支路&计算单元能耗最大值data_objectdata_max_1h（1h代表小时，还有1d、1m、1y）

存储1h、1d、1m、1y等时间维度的支路&计算单元能耗最大值，表设计

| 字段       | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ---------- | -------------- | ------ | ------ | ---- | -------------- |
| building   | 项目10位数编码 | String | 否     | 是   |                |
| objectSign | 仪表编号       | String | 否     | 是   |                |
| data_time  | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss |
| data_value | 数据值         | Double | 否     |      |                |



##### 5.1.5分项能耗计算

1、根据上述存储在数据库中分项模型、分项编码、支路&计算单元能耗计算出分项能耗值

2、分项能耗数据表设计

1）分项能耗data_energydata_15min（15min代表15分钟，还有1min、5min、1h、1d）

根据分项模型、分项编码、支路&计算单元能耗计算分项能耗值，存储维度：1min、5min、15min、1h、1d，表设计

| 字段                | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ------------------- | -------------- | ------ | ------ | ---- | -------------- |
| building            | 项目10位数编码 | String | 否     | 是   |                |
| energyModelSign     | 模型编码       | String | 否     | 是   |                |
| energyModelNodeSign | 分项编码       | String | 否     | 是   |                |
| data_time           | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss |
| data_value          | 数据值         | Double | 否     |      |                |

2）分项能耗最大值data_energydata_max_1h（1h代表小时，还有1d、1m、1y）

存储1h、1d、1m、1y等时间维度的分项能耗最大值，表设计

| 字段                | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ------------------- | -------------- | ------ | ------ | ---- | -------------- |
| building            | 项目10位数编码 | String | 否     | 是   |                |
| energyModelSign     | 模型编码       | String | 否     | 是   |                |
| energyModelNodeSign | 分项编码       | String | 否     | 是   |                |
| data_time           | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss |
| data_value          | 数据值         | Double | 否     |      |                |



##### 5.1.6租户能耗与费用计算

1、根据租户编号、能耗类型、仪表能耗计算租户的能耗，及租户的费用

2、仪表功能号用于进行仪表尖峰平谷的区分计量，及租户费用尖峰平谷的区分计算

3、租户能耗与费用数据表设计

1）租户能耗data_tenantdata_15min（15min代表15分钟，还有1min、5min、1h、1d）

存储租户各时间维度的租户能耗值，若仪表编号、功能号有值时为租户仪表能耗，若租户仪表编号、功能号没有值时为租户能耗。表设计

| 字段        | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ----------- | -------------- | ------ | ------ | ---- | -------------- |
| building    | 项目10位数编码 | String | 否     | 是   |                |
| tenant      | 租户编码       | String | 否     | 是   |                |
| energy_type | 能耗类型       | String | 否     | 是   |                |
| meter       | 仪表编号       | String | 是     | 是   |                |
| funcid      | 功能号         | Long   | 是     | 是   |                |
| data_time   | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss |
| data_value  | 数据值         | Double | 否     |      |                |

2）租户能耗最大值data_tenantdata_1h（1h代表小时，还有1d、1m、1y）

取1h、1d、1m、1y租户能耗的最大值存储到表中，若仪表编号、功能号值则为租户仪表的1h、1d、1m、1y能耗最大值。表设计

| 字段        | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ----------- | -------------- | ------ | ------ | ---- | -------------- |
| building    | 项目10位数编码 | String | 否     | 是   |                |
| tenant      | 租户编码       | String | 否     | 是   |                |
| energy_type | 能耗类型       | String | 否     | 是   |                |
| meter       | 仪表编号       | String | 是     | 是   |                |
| funcid      | 功能号         | Long   | 是     | 是   |                |
| data_time   | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss |
| data_value  | 数据值         | Double | 否     |      |                |

3）租户费用data_tenantdata_15min（15min代表15分钟，还有1min、5min、1h、1d）

根据租户能耗/租户仪表能耗的能耗值算出的租户费用/租户仪表费用值。表设计

| 字段        | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ----------- | -------------- | ------ | ------ | ---- | -------------- |
| building    | 项目10位数编码 | String | 否     | 是   |                |
| tenant      | 租户编码       | String | 否     | 是   |                |
| energy_type | 能耗类型       | String | 否     | 是   |                |
| meter       | 仪表编号       | String | 是     | 是   |                |
| funcid      | 功能号         | Long   | 是     | 是   |                |
| data_time   | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss |
| data_value  | 数据值         | Double | 否     |      |                |

4）租户余额data_tenantbalance

存储的历史各个时间各个租户的租户余额。表设计

| 字段        | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ----------- | -------------- | ------ | ------ | ---- | -------------- |
| building    | 项目10位数编码 | String | 否     | 是   |                |
| tenant      | 租户编码       | String | 否     | 是   |                |
| energy_type | 能耗类型       | String | 否     | 是   |                |
| data_time   | 数据时间       | String | 否     | 是   | yyyyMMddHHmmss |
| data_value  | 数据值         | Double | 否     |      |                |

5）租户余额data_tenantbalance_present

存储的最新一条各个租户的租户余额。表设计

| 字段        | 字段名称       | 类型   | 可为空 | 主键 | 备注           |
| ----------- | -------------- | ------ | ------ | ---- | -------------- |
| building    | 项目10位数编码 | String | 否     | 是   |                |
| tenant      | 租户编码       | String | 否     | 是   |                |
| energy_type | 能耗类型       | String | 否     | 是   |                |
| data_time   | 数据时间       | String | 否     |      | yyyyMMddHHmmss |
| data_value  | 数据值         | Double | 否     |      |                |

#### 5.2其他数据表设计

详见：http://git.sagacloud.cn/persagy/persagy-dmp-doc



## 五、系统联调

### 1、内部联调

| **联调功能** | **联调方式**                                                 | **备注** |
| ------------ | ------------------------------------------------------------ | -------- |
| 数据写入     | 联调内部数据结构定义，通过统一数据标准来规范，避免出现差异化数据结构 |          |
| 查询接口     | 联调查询各种数据库，打通和各业务系统的联调                   |          |

### 2、外部联调

| **联调功能**       | **联调方式**                                                 | **备注** |
| ------------------ | ------------------------------------------------------------ | -------- |
| 第三方接入数据联调 | 1、创建数据映射表，将第三方数据与数据映射表建立业务定义的对应关系，主要包含数据表、字段、语义和精度等定义 <br />2、根据定义好的数据映射数据表结构进行第三方接入数据的写入。 |          |
| IOT数据接入  联调  | 联调数字化交付采集的IOT数据包                                |          |
| 数据查询接口联调   | 联调查询语言形式，进行查询语言兼容，正确输出查询结果         |          |

 

## 六、数据质量管理

### 1、数据迁移与兼容设计

数据管理主要是建立数据业务定义、融合、映射和版本管理的 处理模型

![](./image/image-20200830113202100.png)

数据中台创建新的数据标准，在进行旧数据的迁移和第三方数据的接入时，需要考虑数据的兼容和数据的融合。

1）在做兼容和数据融合的处理时，我们引入数据映射的数据表，

2）将历史数据或者第三方数据与数据映射表建立业务定义的对应关系，主要包含数据表、字段、语义和精度等定义。

3）再数据映射表的数据映射到数据中台标准数据中，完成数据兼容和融合

4）还需在进行数据管理时，对数据的版本进行管理，必要时需要对不同版本的数据进行分表存储。





