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

设计解释:
- 每个原因码会有多条记录存在于数据库中,但是任何场合都最多查出一条
- 是否最新版(草稿):原因码管理页面会展示的数据 (每个原因码唯一) 蓝色表示
- 是否正式数据:实际上使用的数据。(每个原因码唯一)绿色表示
- 白色的数据只存在于数据库中,不会显示。只有蓝色或者绿色的数据会被显示出来。
图表详解
1. 新建
| code | 版本 | 状态 | 是否最新版(草稿) | 是否正式数据 |
| 4221 | V1 | 待启用 | 是 | 否 |
2. 如果审核拒绝,则
无数据展示
| code | 版本 | 状态 | 是否最新版(草稿) | 是否正式数据 |
| 4221 | V1 | 已拒绝 | 否 | 否 |
3. 如果审核通过
| code | 版本 | 状态 | 是否最新版(草稿) | 是否正式数据 |
| 4221 | V1 | 已启用 | 是 | 是 |
4. 修改
| code | 版本 | 状态 | 是否最新版(草稿) | 是否正式数据 |
| 4221 | V1 | 已启用 | 否 | 是 |
| 4221 | V2 | 待启用 | 是 | 否 |
6. 审核拒绝
| code | 版本 | 状态 | 是否最新版(草稿) | 是否正式数据 |
| 4221 | V1 | 已启用 | 是 | 是 |
| 4221 | V2 | 已拒绝 | 否 | 否 |
7. 停用
| code | 版本 | 状态 | 是否最新版(草稿) | 是否正式数据 |
| 4221 | V1 | 已启用 | 否 | 是 |
| 4221 | V2 | 已拒绝 | 否 | 否 |
| 4221 | V3 | 待停用 | 是 | 否 |
8. 审核拒绝
| code | 版本 | 状态 | 是否最新版(草稿) | 是否正式数据 |
| 4221 | V1 | 已启用 | 是 | 是 |
| 4221 | V2 | 已拒绝 | 否 | 否 |
| 4221 | V3 | 已拒绝 | 否 | 否 |
9. 停用
| code | 版本 | 状态 | 是否最新版(草稿) | 是否正式数据 |
| 4221 | V1 | 已启用 | 否 | 是 |
| 4221 | V2 | 已拒绝 | 否 | 否 |
| 4221 | V3 | 已拒绝 | 否 | 否 |
| 4221 | V4 | 待停用 | 是 | 否 |
10. 审核通过
| code | 版本 | 状态 | 是否最新版(草稿) | 是否正式数据 |
| 4221 | V1 | 已启用 | 否 | 否 |
| 4221 | V2 | 已拒绝 | 否 | 否 |
| 4221 | V3 | 已拒绝 | 否 | 否 |
| 4221 | V4 | 已停用 | 是 | 是 |
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合并),并且复制一份放入正式表即可。
评论