什么是明细

在实际的业务开发场景当中,我们把诸如请假单采购订单销售订单会计凭证之类的业务数据,统一用原子的概念进行管理。同时,这些业务单据还往往会包含一些明细条目,CabloyJS采用明细的概念进行管理

明细的特点

对于明细的管理,并不仅仅是简单的CRUD操作,同时还具备以下特点:

  1. 一个原子类型可以关联多个明细类型
  2. 明细 CRUD等指令的权限与原子的权限协同
  3. 原子一样支持草稿、正式、历史的生命周期
  4. 支持在审批工作流中控制对明细CRUD权限
  5. 支持常规指令:上移下移克隆
  6. 支持Mobile/PC自适应:默认情况下,在Mobile中显示列表,在PC中显示表格

业务模块模版:module-business-details

如果要开发一个带明细功能的业务模块,建议使用业务模块模版module-business-details创建业务模块的文件骨架。此模版会自动创建与业务相关的代码,大量简化工作量

  1. 1$ cd /path/to/project
  2. 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. 1{
  2. 2 "name": "egg-born-module-test-flow",
  3. 3 "title": "test-flow",
  4. 4 "eggBornModule": {
  5. 5 "fileVersion": 2,
  6. 6 "dependencies": {
  7. 7 "a-instance": "4.0.0",
  8. 8 "a-base": "4.0.0",
  9. 9 "a-detail": "4.0.0",
  10. 10 "a-flow": "4.0.0"
  11. 11 }
  12. 12 },
  13. 13 ...
  14. 14}

统一存储

所有明细数据的基本信息都统一存储到数据表aDetail中,与业务相关的字段存储在业务明细表中,如模块test-flow中实现的采购订单明细业务表:testFlowPurchaseOrderDetailaDetail业务表是一对一的关系

这种存储机制体现了共性个性的有机统一,有如下好处:

  1. 可统一配置数据权限
  2. 可统一支持增删改查等操作
  3. 可统一支持草稿\正式\历史数据生命周期
  4. 可统一支持审批工作流

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

  1. 1const meta = {
  2. 2 detail: {
  3. 3 details: {
  4. 4 default: {
  5. 5 info: {
  6. 6 bean: 'purchaseOrder',
  7. 7 title: 'Details',
  8. 8 tableName: 'testFlowPurchaseOrderDetail',
  9. 9 },
  10. 10 actions: {
  11. 11 },
  12. 12 validator: 'purchaseOrderDetail',
  13. 13 },
  14. 14 },
  15. 15 },
  16. 16};
  • info
名称 说明
bean 明细类型对应的Bean组件,用于增删改查等指令操作
title 明细类型的标题
tableName 明细类型对应的业务数据表名称
  • actions:定义自定义指令

  • validator:指定验证器

该验证器有两个用途:

  1. 在前端自动渲染明细表单
  2. 在后端对提交的明细表单进行验证

原子类型与明细类型的关联

接下来,需要在原子类型中关联明细类型,从而建立主数据明细数据的对应关系

src/module/test-flow/backend/src/meta.js

  1. 1const meta = {
  2. 2 base: {
  3. 3 atoms: {
  4. 4 purchaseOrder: {
  5. 5 info: {
  6. 6 bean: 'purchaseOrder',
  7. 7 title: 'Purchase Order',
  8. 8 tableName: 'testFlowPurchaseOrder',
  9. 9 details: [ 'default' ],
  10. 10 },
  11. 11 actions: {
  12. 12 },
  13. 13 validator: 'purchaseOrder',
  14. 14 search: {
  15. 15 validator: 'purchaseOrderSearch',
  16. 16 },
  17. 17 },
  18. 18 },
  19. 19 },
  20. 20};
  • details: [ ‘default’ ]

由于一个原子类型可以关联多个明细类型,因此,这里采用数组格式

明细演示

1. PC场景

details-pc-zhcn

2. Mobile场景

details-mobile-zhcn