设计思路

  1. 对于数据修改不频繁的业务,无需引入草稿表带来额外的负担。
  2. 虽然无草稿表,但是设计上还是保留了数据的草稿态和正式态。
  3. 草稿态,即编辑的状态,新增/修改时默认成为草稿态。审核通过后成为正式态。审核通过之前的数据不会展示在非编辑页面。通过字段latest_draft 控制。
  4. 正式态,正常使用的状态,编辑更新时不会修改正式态的数据,审核通过后才会更新。通过字段latest_official 控制。
  5. 双指针,即latest_draft和latest_official 查询的时候对于同一个业务id的数据 latest_draft和latest_official 最多只有一条,用来保证查询到唯一的一条数据库记录。
  6. 版本控制,通过版本号字段来控制,只有数据发生改变的时候新增版本号。
  7. 操作记录,单独保存于操作记录表中,通过业务id关联。可以跟其他业务共享操作记录表。

部分详设

状态流转图

单表启停流转图.jpg

设计解释:

  • 每个原因码会有多条记录存在于数据库中,但是任何场合都最多查出一条
  • 是否最新版(草稿):原因码管理页面会展示的数据 (每个原因码唯一) 蓝色表示
  • 是否正式数据:实际上使用的数据。(每个原因码唯一)绿色表示
  • 白色的数据只存在于数据库中,不会显示。只有蓝色或者绿色的数据会被显示出来。

图表详解

1. 新建

code版本状态是否最新版(草稿)是否正式数据
4221V1待启用

2. 如果审核拒绝,则
无数据展示

code版本状态是否最新版(草稿)是否正式数据
4221V1已拒绝

3. 如果审核通过

code版本状态是否最新版(草稿)是否正式数据
4221V1已启用

4. 修改

code版本状态是否最新版(草稿)是否正式数据
4221V1已启用
4221V2待启用

6. 审核拒绝

code版本状态是否最新版(草稿)是否正式数据
4221V1已启用
4221V2已拒绝

7. 停用

code版本状态是否最新版(草稿)是否正式数据
4221V1已启用
4221V2已拒绝
4221V3待停用

8. 审核拒绝

code版本状态是否最新版(草稿)是否正式数据
4221V1已启用
4221V2已拒绝
4221V3已拒绝

9. 停用

code版本状态是否最新版(草稿)是否正式数据
4221V1已启用
4221V2已拒绝
4221V3已拒绝
4221V4待停用

10. 审核通过

code版本状态是否最新版(草稿)是否正式数据
4221V1已启用
4221V2已拒绝
4221V3已拒绝
4221V4已停用

11.
停用之后无法做任何修改

接口设计

1.0 原因码列表(正式数据)

  • 接口地址POST /busCode/official/page
  • 请求参数
{
  "busCode": "string",         // 原因码代码(可选)
  "enableOnly": "bool",     // true则只返回已启用原因码 默认false 查全部 
  "group": "string",     // ad组(可选)
  "pageNum": 1,                // 页码(可选)
  "pageSize": 10               // 每页数量(可选)
}
  • 返回参数
    SysResult(data: BusCodeInfoSysRtnInfo)
  • List resultCodeInfos

1.1 原因码下拉列表(正式数据)

  • 下拉列表用,只返回原因码+原因码名称,不分页
  • 接口地址POST /busCode/official/briefList
  • 请求参数
{
  "busCode": "string",         // 原因码代码(可选)
  "enableOnly": "bool",     // true则只返回已启用原因码 默认false 查全部 
}
  • 返回参数
    SysResult(data: BusCodeInfoSysRtnInfo)
  • List resultCodeInfos

1.2 原因码管理列表(草稿数据)

  • 接口地址POST /busCode/page
  • 请求参数
{
  "busCode": "string",         // 原因码代码(可选)
  "status": "string",     // 状态(可选),参考 BusCodeStatusEnum(可选)
  "pageNum": 1,                // 页码(可选)
  "pageSize": 10               // 每页数量(可选)
}
  • 返回参数
    SysResult(data: BusCodeInfoSysRtnInfo)
  • List resultCodeInfos

1.3 原因码详情

  • 接口地址POST /busCode/detail
  • 请求参数
{
  "id": "int",         // 
}
  • 返回参数
    SysResult(data: BusCodeInfoSysRtnInfo)
  • List resultCodeInfos

1.4 操作记录查询

  • 接口地址POST /busCode/operateRecords?busCode=
  • 请求参数
  "busCode": "string",         // 原因码代码
  • 返回参数
    SysResult(data: BusCodeInfoSysRtnInfo)
  • List records

1.5 复核(通过|失败)原因码

  • 接口地址POST /busCode/review
  • 请求参数
{
  "busCode": "string",         // 原因码代码
  "operateType": "string"      // 操作类型,参考 BusCodeOperateEnum
}
  • 返回参数
    SysResult(data: BusCodeInfoSysRtnInfo)

1.6 停用原因码

  • 接口地址POST /busCode/disable
  • 请求参数
{
  "busCode": "string",         // 原因码代码
}
  • 返回参数
    SysResult(data: BusCodeInfoSysRtnInfo)

1.7 提交(新建|更新)原因码

  • 接口地址POST /busCode/submit
  • 请求参数
{
  "busCode": "string",                  // 原因码代码
  "attachment": "long",              // 附件 id 
  ...
  "status": "string",                   // 状态,参考 BusCodeStatusEnum
}
  • 返回参数
    SysResult(data: BusCodeInfoSysRtnInfo)

扩展思考

本质上,这样设计跟使用草稿表区别不大。只不过是把两张表合二为一了。如果需要双表,只需要把当前表作为草稿表,latest_official的数据作为草稿表最新的数据(跟latest_draft合并),并且复制一份放入正式表即可。