什么是明细
在实际的业务开发场景当中,我们把诸如请假单
、采购订单
、销售订单
、会计凭证
之类的业务数据,统一用原子
的概念进行管理。同时,这些业务单据还往往会包含一些明细
条目,CabloyJS采用明细
的概念进行管理
明细的特点
对于明细
的管理,并不仅仅是简单的CRUD
操作,同时还具备以下特点:
- 一个
原子类型
可以关联多个明细类型
明细
CRUD
等指令的权限与原子
的权限协同- 与
原子
一样支持草稿、正式、历史
的生命周期 - 支持在审批工作流中控制对
明细
的CRUD
权限 - 支持常规指令:
上移
、下移
、克隆
- 支持
Mobile/PC自适应
:默认情况下,在Mobile中显示列表
,在PC中显示表格
业务模块模版:module-business-details
如果要开发一个带明细功能的业务模块,建议使用业务模块模版module-business-details
创建业务模块的文件骨架。此模版会自动创建与业务相关的代码,大量简化工作量
- 1$ cd /path/to/project
- 2$ npm run cli :create:module moduleName -- [--template=] [--suite=] [--force]
目前提供了三个模块文件模版
:
名称 | 说明 |
---|---|
module-business | 此模版会创建与业务相关的代码,大量简化工作量 |
module-business-details | 在module-business 的基础上增加了与明细 业务相关的代码文件 |
module | 此模版仅包含基本的骨架代码文件 |
模块依赖
由于明细特性是由模块a-detail
提供的。因此,需要在业务模块中指定模块的依赖项
src/module/test-flow/package.json
- 1{
- 2 "name": "egg-born-module-test-flow",
- 3 "title": "test-flow",
- 4 "eggBornModule": {
- 5 "fileVersion": 2,
- 6 "dependencies": {
- 7 "a-instance": "4.0.0",
- 8 "a-base": "4.0.0",
- 9 "a-detail": "4.0.0",
- 10 "a-flow": "4.0.0"
- 11 }
- 12 },
- 13 ...
- 14}
统一存储
所有明细数据的基本信息都统一存储到数据表aDetail
中,与业务相关的字段存储在业务明细表
中,如模块test-flow
中实现的采购订单明细业务表:testFlowPurchaseOrderDetail
。aDetail
与业务表
是一对一的关系
这种存储机制体现了共性
与个性
的有机统一,有如下好处:
- 可统一配置
数据权限
- 可统一支持
增删改查
等操作 - 可统一支持
草稿\正式\历史
数据生命周期 - 可统一支持
审批工作流
aDetail
核心字段清单
名称 | 类型 | 缺省值 | 说明 |
---|---|---|---|
id | int | 自动增量 | 关键字段,其他表中引用此字段,名字一般为detailId |
createdAt | timestamp | CURRENT_TIMESTAMP | 原子创建时间 |
updatedAt | timestamp | CURRENT_TIMESTAMP | 原子修改时间 |
deleted | int | 0 | 软删除标记 |
iid | int | 0 | 实例id |
atomId | int | 0 | 对应的主表条目Id |
atomStage | int | 0 | 原子阶段,0:草稿 1:正式 2:历史 |
detailItemId | int | 0 | 对应的明细业务表Id |
detailClassId | int | 0 | 对应的明细类型 |
detailCodeId | int | 0 | 对应的明细代码Id |
detailCode | int | 0 | 对应的明细代码 |
detailName | varchar | NULL | 明细标题 |
detailLineNo | int | 0 | 行号 |
detailStatic | int | 0 | 是否为静态数据 |
detailStaticKey | varchar | NULL | 明细Key |
userIdCreated | int | 0 | 创建原子的用户 |
userIdUpdated | int | 0 | 修改原子的用户 |
明细类型
明细类型
是明细对应的元数据信息,在模块的meta
中设置,如模块test-flow
中明细类型default
的元数据信息如下:
src/module/test-flow/backend/src/meta.js
- 1const meta = {
- 2 detail: {
- 3 details: {
- 4 default: {
- 5 info: {
- 6 bean: 'purchaseOrder',
- 7 title: 'Details',
- 8 tableName: 'testFlowPurchaseOrderDetail',
- 9 },
- 10 actions: {
- 11 },
- 12 validator: 'purchaseOrderDetail',
- 13 },
- 14 },
- 15 },
- 16};
- info
名称 | 说明 |
---|---|
bean | 明细类型对应的Bean组件,用于增删改查 等指令操作 |
title | 明细类型的标题 |
tableName | 明细类型对应的业务数据表名称 |
-
actions:定义自定义指令
-
validator:指定验证器
该验证器有两个用途:
- 在前端自动渲染明细表单
- 在后端对提交的明细表单进行验证
原子类型与明细类型的关联
接下来,需要在原子类型
中关联明细类型
,从而建立主数据
与明细数据
的对应关系
src/module/test-flow/backend/src/meta.js
- 1const meta = {
- 2 base: {
- 3 atoms: {
- 4 purchaseOrder: {
- 5 info: {
- 6 bean: 'purchaseOrder',
- 7 title: 'Purchase Order',
- 8 tableName: 'testFlowPurchaseOrder',
- 9 details: [ 'default' ],
- 10 },
- 11 actions: {
- 12 },
- 13 validator: 'purchaseOrder',
- 14 search: {
- 15 validator: 'purchaseOrderSearch',
- 16 },
- 17 },
- 18 },
- 19 },
- 20};
- details: [ ‘default’ ]
由于一个原子类型
可以关联多个明细类型
,因此,这里采用数组格式
评论: