# 报表规范
# 术语与定义
# 报表应用
以汇总分析为目的,以单位为基本单元,通过填报等方式进行数据收集的工具。
# 报表
由报表应用针对某个特定业务需求而设计开发,可在多个兼容的环境中进行迁移的主要配置存储数据。
# 资产云报表
在“云原生应用管理平台”(即资产云2.0)内上架,并利用平台基础数据和组织树完成报表的设计、分发与填报汇总的应用统称。
# 基本要求
# 通用性
报表应用必须具有通用性,即能够完成通用的数据收集需求,由相关的报表设计人员根据需求即可完成对应报表的设计工作,而不需要过多的代码开发。单纯为了完成某些固定业务而单独开发的数据收集工具不能称之为报表应用。
- 报表应用应提供相应的设计工具,或者至少提供设计完成的报表的获取方式,不能将报表功能捆绑在应用中进行发布
# 支持多维组织架构
为了上架资产云平台,应用必须接入平台的多租户体系,且支持平台的多维组织架构。平台每个租户都可以在平台灵活创建若干个组织集团,管理其下的组织树形,并进行应用分发。
报表应用以单位作为最小填报单元,需要进行数据的逐级汇总,是典型的监管应用,因此需要能够支持按树形进行应用分发,且利用集团树形进行相应的权限控制,集团之间的数据应彼此隔离。
- 树形关系由创建租户的集团管理员维护,报表树形数据应同步平台树形,不能与平台树形割裂。
# 满足平台规范
报表应用数据储存应满足平台数据规范和安全规范,且数据所有权应在用户手中,应用开发商不能私自窃取相关数据、阻挠正常用户查看数据以及拒绝合规的第三方接口调用。
# 数据格式
# 报表主数据格式
报表主数据为报表的填报数据储存格式,由基本描述字段和数据存储字段两部分构成。
- 基本字段
报表主数据的id字段仅用于数据库存储,一条报表主数据由以下4个字段确定:
报表任务
报表组织
节点类型
数据时期
其中,依据平台集团树形设计,报表组织可为实体单位或虚拟汇总节点,但虚拟节点也需要实体单位进行填报。为了便于区别,还需管理单位字段进行标识。
对外数据交换时,采用报表组织的主代码作为组织唯一标识。
字段名称 | 字段标识 | 字段类型 | 是否必填 | 说明 |
---|---|---|---|---|
所属集团 | groupId | 主键 | 是 | 进行多集团数据隔离 |
报表任务 | taskCode | 字符串 | 是 | 标识当前报表所属任务 |
树形节点 | nodeCode | 字符串 | 是 | 标识当前数据对应树形节点 |
报表组织 | reportOrgId | 主键 | 是 | 当前数据关联组织ID |
单位主代码 | unitCode | 字符串 | 是 | 存储报表组织的单位主代码(一般为统一社会信用代码) |
管理单位 | manageOrgId | 主键 | 是 | 实际数据填报单位ID |
节点类型 | reportBalance | 字典 | 是 | 标识当前数据节点对应的报表类型,0-汇总,1-单户,2-差额 |
报表周期 | reportPeriod | 字典 | 是 | 0-年,1-半年,2-季度,3-月,4-周,5-日,99-一次 |
数据时期 | reportTime | 日期 | 是 | 标识当前数据对应时期 |
状态 | status | 数字 | 否 | 标识数据的上报状态,审批通过为3 |
报表数据 | reportContent | JSON | 是 | 实际报表数据 |
- 储存字段
由于各个业务需求和填报内容差异较大,传统的二维表格并不能满足复杂的业务需求变化,故报表储存采用的是动态的多层次对象格式,实际开发可使用MongoDB进行储存。
储存字段内容可进行扩展,但必须包含以下基本内容:
字段名称 | 字段标识 | 字段类型 | 说明 |
---|---|---|---|
版本号 | version | string | 标识格式版本号,目前为2 |
表样标识 | reportId | string | 存表样标识 |
表样名称 | reportName | string | 存表样名称(sheet名) |
参数 | parameters | StoreObject[] | 存报表相关参数,例如单位和数据时期 |
固定指标值 | cells | Dictionary<StoreValue> | 存储所有固定单元格指标的值 |
浮动区域值 | blocks | Dictionary<Dictionary<StoreValue>[]> | 存储所有可浮动区域的值 |
其中StoreValue的结构如下:
type StoreValueType = "string" | "number" | "date" | "boolean";
interface StoreObject {
value: any;// 必填,值
name?: string;// 如果存在固定标识,存标识的名称
label?: string;// 显示文字
cell?: string;// 如果来自单元格,存单元格的位置
$type?: StoreValueType// 标记数据类型;
}
type StoreValue = StoreObject | number | string | boolean;
- 必需参数包含以下这些:
名称 | 字段 | 数据类型 | 说明 |
---|---|---|---|
报表时间 | reportTime | 日期 | 基本字段的reportTime |
报表组织 | fillUnit | 主键 | 基本字段的reportOrgId,有label |
填报用户 | currentUser | 主键 | 最后填报报表用户的Id,有label |
- 固定单元格指标的存储方式为一个字典,其中字典键为指标名称,字典值为StoreValue形式的存储结果。
例如当前表样有C1, C2两个数值型单元格,指标名称分别为Index1, Index2,其中Index2显示为百分比,则储存结构可以为(仅供参考,可以有其它符合要求的存储形式):
cells: {
Index1: 15,
Index2: {
value: 0.246666,
label: “24.67%”,
cell: “C2”
}
}
- 浮动区域值的存储方式为一个字典,其中字典键为浮动区域名称,字典值为一个对象(字典)数组,以一行为一个对象,列名作为键名,StoreValue形式的存储结果为值。
例如在表中A1*E3区域内有一个5列的浮动区域,名称为block1,每列的字段名分别为A,B,C,D,E,用户填了3行,则存储结构可以为:
blocks: {
block1: [
{ A: 1, B: 2, C: 3, D: 4, E: “测试1”},
{ A: 2, B: 4, C: 6, D: 8, E: “测试2”},
{
A: 1.11,
B: 6.38,
C: 9.04,
D: {
value: 12.285714,
label: “12.29”
},
E: “测试3”
},
]
}
# 公共组件
# 数据推送
将审批通过后的单条报表数据推送至平台MongoDB,若已存在相关唯一标识的数据则进行覆盖。
# 数据获取
根据唯一标识(报表组织+节点类型+报表任务+数据时期)获取指定节点报表数据
# 批量指标数据获取
获取同一报表任务和数据时期下若干节点的数据,并返回指定指标的值。