feat:update 3 4

This commit is contained in:
smart
2026-07-02 10:04:32 +08:00
parent 604e7e68d7
commit 2fd8fc1f66
224 changed files with 12369 additions and 9 deletions
@@ -0,0 +1,77 @@
# 模块 1:RBAC 权限模型设计
<div class="mt-6 text-sm">
工单模块不是普通 CRUD。不同角色看到的数据不同、能做的动作不同、承担的责任也不同。
</div>
<div class="grid grid-cols-5 gap-3 mt-8 text-sm">
<div class="p-3 rounded-xl bg-blue-500/10 border border-blue-500/30 text-center">管理员</div>
<div class="p-3 rounded-xl bg-emerald-500/10 border border-emerald-500/30 text-center">负责人</div>
<div class="p-3 rounded-xl bg-amber-500/10 border border-amber-500/30 text-center">研发</div>
<div class="p-3 rounded-xl bg-purple-500/10 border border-purple-500/30 text-center">测试</div>
<div class="p-3 rounded-xl bg-gray-500/10 border border-gray-500/30 text-center">只读用户</div>
</div>
<!--
第四天从权限矩阵开始。
工单模块看起来像 CRUD,但真实业务里管理员、负责人、研发、测试、只读用户的权限边界完全不同。
如果不先设计矩阵,AI 很容易按默认 CRUD 生成所有按钮。
-->
---
# RBAC 权限矩阵
<div class="mt-5 text-xs">
| 功能 | 管理员 | 负责人 | 研发 | 测试 | 只读 |
|---|---|---|---|---|---|
| 查看列表 | Y | Y | Y | Y | Y |
| 新增工单 | Y | Y | N | Y | N |
| 编辑工单 | Y | Y | 条件允许 | 条件允许 | N |
| 删除工单 | Y | N | N | N | N |
| 指派工单 | Y | Y | N | N | N |
| 提交验证 | Y | Y | Y | N | N |
| 关闭工单 | Y | Y | N | Y | N |
| 驳回工单 | Y | Y | N | Y | N |
| 查看审计 | Y | Y | 条件允许 | 条件允许 | N |
| 查看看板 | Y | Y | N | N | N |
</div>
<!--
这张矩阵是课堂产出,不是讲师单方面给答案。
AI 可以生成初稿,但最终必须由业务和团队确认。
条件允许要写清条件,比如只能编辑自己负责的工单。
-->
---
# 权限矩阵 Prompt
<div class="mt-5 text-sm">
```md
请基于 JeecgBoot 工单模块设计 RBAC 权限矩阵。
角色:
管理员、负责人、研发、测试、只读用户。
功能点:
查看列表、查看详情、新增、编辑、删除、指派、提交验证、关闭、驳回、查看审计记录、查看看板。
要求:
1. 区分允许、禁止、条件允许。
2. 条件允许必须说明条件。
3. 每个敏感操作给出验收方式。
4. 不要直接生成代码。
```
</div>
<!--
这里训练学员不要直接让 AI 改代码。
先生成矩阵,再确认业务边界,最后才进入权限控制方案。
-->
+104
View File
@@ -0,0 +1,104 @@
# 模块 2:权限控制方案生成
<div class="mt-6 text-sm">
权限不是按钮隐藏。工单模块必须同时覆盖菜单权限、按钮权限、接口权限和数据权限。
</div>
<div class="grid grid-cols-4 gap-4 mt-8 text-sm">
<div class="p-4 rounded-xl bg-blue-500/10 border border-blue-500/30 text-center">
<div class="font-bold">菜单</div>
能否进入页面
</div>
<div class="p-4 rounded-xl bg-emerald-500/10 border border-emerald-500/30 text-center">
<div class="font-bold">按钮</div>
能否看到操作
</div>
<div class="p-4 rounded-xl bg-amber-500/10 border border-amber-500/30 text-center">
<div class="font-bold">接口</div>
能否直接调用
</div>
<div class="p-4 rounded-xl bg-purple-500/10 border border-purple-500/30 text-center">
<div class="font-bold">数据</div>
能看到哪些工单
</div>
</div>
<!--
前端按钮不是安全边界。
如果只隐藏删除按钮,但后端删除接口没有权限校验,就是典型漏洞。
第四天要把权限闭环做完整。
-->
---
# 工单权限字符建议
<div class="mt-5 text-sm">
```md
work:order:list
work:order:query
work:order:add
work:order:edit
work:order:delete
work:order:assign
work:order:transition
work:order:audit
work:order:dashboard
```
</div>
<div class="mt-5 p-3 rounded-xl bg-amber-500/10 border border-amber-500/30 text-sm">
权限字符必须统一命名,否则前端、后端、菜单配置和 Review 清单会对不上。
</div>
<!--
权限字符是工程资产。
同一个动作不要一会叫 delete,一会叫 remove,一会叫 ticket:delete。
统一命名后,AI 和人才能沿着权限字符追踪前后端实现。
-->
---
# 权限控制方案表
<div class="mt-5 text-xs">
| 操作 | 前端入口 | 权限字符 | 后端接口 | 数据权限 | 验收 |
|---|---|---|---|---|---|
| 新增工单 | 新增按钮 | work:order:add | /workOrder/add | 无 | 无权限账号返回 403 |
| 删除工单 | 删除按钮 | work:order:delete | /workOrder/delete | 管理员范围 | 非管理员返回 403 |
| 指派工单 | 指派按钮 | work:order:assign | /workOrder/assign | 团队范围 | 研发账号不可指派 |
| 状态流转 | 状态按钮 | work:order:transition | /workOrder/transition | 工单可见范围 | 非法角色不能流转 |
| 查看看板 | 看板菜单 | work:order:dashboard | /workOrder/dashboard/* | 管理范围 | 只读用户不可访问 |
</div>
<!--
权限方案必须写清前端入口、权限字符、后端接口、数据权限和验收方式。
这样后续 Review 才有依据。
-->
---
# 权限落地检查
<div class="mt-5 text-sm">
| 检查项 | 通过标准 |
|---|---|
| 菜单权限 | 菜单配置有对应权限字符 |
| 按钮权限 | 无权限用户看不到敏感按钮 |
| 接口权限 | 直接请求敏感接口被拒绝 |
| 数据权限 | 不同角色只看到授权范围 |
| 验收记录 | 有账号、操作、结果和证据 |
</div>
<!--
课堂实操时,不要求只看代码。
要用不同账号或模拟请求验证:前端不可见只是第一步,后端拒绝才是强制边界。
-->
+91
View File
@@ -0,0 +1,91 @@
# 模块 3:工单状态流转规则实现
<div class="mt-6 text-sm">
工单状态不能靠临时 if else。必须先设计状态机,再实现接口和校验。
</div>
<div class="flex items-center justify-between mt-12 px-4 text-sm">
<div class="text-center flex-1">created<br/><span class="text-xs text-gray-400">已创建</span></div>
<div class="text-blue-400">→</div>
<div class="text-center flex-1">processing<br/><span class="text-xs text-gray-400">处理中</span></div>
<div class="text-blue-400">→</div>
<div class="text-center flex-1">pending_verify<br/><span class="text-xs text-gray-400">待验证</span></div>
<div class="text-blue-400">→</div>
<div class="text-center flex-1">closed<br/><span class="text-xs text-gray-400">已关闭</span></div>
</div>
<div class="mt-8 text-center text-sm text-red-400">pending_verify → rejected → processing</div>
<!--
状态流转是第四天的核心复杂业务。
状态值要稳定,中文名可以展示,但代码里要使用明确枚举或字典。
-->
---
# 状态流转表
<div class="mt-5 text-xs">
| 当前状态 | 动作 | 目标状态 | 允许角色 | 前置条件 | 失败提示 |
|---|---|---|---|---|---|
| created | 指派 | processing | 管理员/负责人 | 必须选择指派人 | 请选择指派人 |
| processing | 提交验证 | pending_verify | 研发/负责人 | 必须填写处理说明 | 请填写处理说明 |
| pending_verify | 关闭 | closed | 测试/负责人 | 验证通过 | 当前工单不可关闭 |
| pending_verify | 驳回 | rejected | 测试/负责人 | 必须填写驳回原因 | 请填写驳回原因 |
| rejected | 重新处理 | processing | 研发/负责人 | 必须填写处理说明 | 请填写重新处理说明 |
</div>
<!--
状态流转表要回答当前状态、动作、目标状态、角色、前置条件和失败提示。
这张表后续会转成 Service 校验逻辑和测试点。
-->
---
# 非法流转清单
<div class="mt-5 text-sm">
| 当前状态 | 尝试动作 | 系统响应 | 验收 |
|---|---|---|---|
| closed | 重新处理 | 返回非法状态流转 | 状态不变 |
| created | 关闭 | 返回非法状态流转 | 页面提示原因 |
| processing | 驳回 | 返回非法状态流转 | 状态不变 |
| pending_verify | 驳回但无原因 | 返回参数错误 | 提示填写原因 |
| 任意状态 | 无权限流转 | 返回权限拒绝 | 不完成操作 |
</div>
<!--
很多团队只测正常流,不测非法流。
第四天必须把非法流转当成设计产物,而不是测试时临时发现。
-->
---
# 状态流转接口契约
<div class="mt-5 text-sm">
```md
POST /workOrder/assign
字段:id、assignee、remark
POST /workOrder/transition
字段:id、action、targetStatus、remark、version
验收:
合法流转成功;非法流转失败;状态不被错误修改;审计日志可查。
```
</div>
<!--
状态流转不要散落在普通编辑接口里。
指派和状态流转建议有明确接口。
Service 层负责读取工单、校验权限、校验状态、更新状态、记录日志。
-->
+95
View File
@@ -0,0 +1,95 @@
# 模块 4:审计日志设计
<div class="mt-6 text-sm">
工单是多人协作过程。关键动作必须能回答:谁、什么时候、对哪个工单、改了什么、结果如何。
</div>
<div class="grid grid-cols-3 gap-4 mt-8 text-sm">
<div class="p-3 rounded-xl bg-blue-500/10 border border-blue-500/30 text-center">指派</div>
<div class="p-3 rounded-xl bg-emerald-500/10 border border-emerald-500/30 text-center">状态变更</div>
<div class="p-3 rounded-xl bg-amber-500/10 border border-amber-500/30 text-center">优先级变更</div>
<div class="p-3 rounded-xl bg-purple-500/10 border border-purple-500/30 text-center">驳回</div>
<div class="p-3 rounded-xl bg-red-500/10 border border-red-500/30 text-center">关闭</div>
<div class="p-3 rounded-xl bg-gray-500/10 border border-gray-500/30 text-center">删除</div>
</div>
<!--
审计日志不是一句“修改了工单”。
指派、状态变更、优先级变更、驳回、关闭、删除都应该能追溯。
-->
---
# 审计日志字段表
<div class="mt-5 text-xs">
| 字段 | 含义 | 示例 |
|---|---|---|
| ticket_id | 工单 ID | WO-001 |
| operator | 操作人 | zhangsan |
| action | 操作动作 | assign / transition / edit |
| field_name | 字段名 | status / assignee |
| before_value | 修改前 | processing |
| after_value | 修改后 | pending_verify |
| result | 操作结果 | success / fail |
| operate_time | 操作时间 | 2026-06-29 10:00 |
| remark | 备注 | 提交验证说明 |
</div>
<!--
字段前后值是审计日志的关键。
如果只记录“用户修改了工单”,后续追责和排查都很困难。
-->
---
# 详情页操作记录
<div class="mt-5 text-sm">
| 展示字段 | 说明 |
|---|---|
| 操作时间 | 按时间倒序 |
| 操作人 | 当前登录用户 |
| 动作 | 指派、提交验证、驳回、关闭 |
| 变更内容 | status: processing -> pending_verify |
| 备注 | 处理说明、驳回原因 |
| 结果 | success / fail |
</div>
<!--
审计日志不只是后端写入,还要能在工单详情页被查看。
课堂验收时至少完成一次指派、一次提交验证、一次驳回,并能看到三条记录。
-->
---
# 审计日志 SOP
<div class="mt-5 text-sm">
```md
必须记录:
新增、编辑、删除、指派、状态变更、优先级变更、驳回、关闭。
展示位置:
工单详情页操作记录区域。
事务要求:
状态更新和日志写入在同一业务事务内完成。
验收:
执行状态变更、指派、驳回、关闭后,详情页能看到对应审计记录。
```
</div>
<!--
状态更新成功但日志失败,或者日志成功但状态失败,都会造成追溯问题。
所以 Service 层要明确事务边界。
-->
@@ -0,0 +1,90 @@
# 模块 5:异常态与防御性逻辑
<div class="mt-6 text-sm">
复杂业务不能只测正常流。权限不足、接口失败、重复提交、非法状态流转都必须有明确处理。
</div>
<div class="grid grid-cols-3 gap-4 mt-8 text-sm">
<div class="p-3 rounded-xl bg-blue-500/10 border border-blue-500/30 text-center">空数据</div>
<div class="p-3 rounded-xl bg-red-500/10 border border-red-500/30 text-center">接口失败</div>
<div class="p-3 rounded-xl bg-amber-500/10 border border-amber-500/30 text-center">权限不足</div>
<div class="p-3 rounded-xl bg-purple-500/10 border border-purple-500/30 text-center">重复提交</div>
<div class="p-3 rounded-xl bg-emerald-500/10 border border-emerald-500/30 text-center">非法流转</div>
<div class="p-3 rounded-xl bg-gray-500/10 border border-gray-500/30 text-center">工单不存在</div>
</div>
<!--
第三天已经验证基础页面能打开。
第四天要进一步补异常态和防御性逻辑。
真实问题往往发生在异常流,不在正常流。
-->
---
# 异常态清单
<div class="mt-5 text-xs">
| 场景 | 触发条件 | 前端表现 | 后端响应 | 验收 |
|---|---|---|---|---|
| 空列表 | 查询无结果 | 显示空状态 | 返回空数组 | 不显示报错 |
| 接口失败 | 服务异常 | 提示重试 | 5xx 或业务错误 | 页面不崩溃 |
| 权限不足 | 无权限操作 | 按钮不可见或提示无权限 | 403 | 不完成操作 |
| 重复提交 | 连续点击提交 | 按钮禁用或 loading | 拒绝重复请求 | 只生成一条记录 |
| 非法流转 | closed -> processing | 提示非法状态 | 业务错误码 | 状态不变 |
| 工单不存在 | 错误 ID | 显示不存在 | 404 或业务错误 | 页面不崩溃 |
</div>
<!--
异常态要写成表。
每个场景都要区分前端表现、后端响应和验收方式。
-->
---
# 最小测试集
<div class="mt-5 text-sm">
| 编号 | 场景 | 操作 | 预期 |
|---|---|---|---|
| E01 | 无权限删除 | 研发账号请求删除接口 | 返回拒绝 |
| E02 | 非法状态流转 | closed -> processing | 状态不变 |
| E03 | 重复提交验证 | 连续点击提交验证 | 只成功一次 |
| E04 | 工单不存在 | 查询错误 ID | 页面不崩 |
| E05 | 驳回缺少原因 | remark 为空 | 返回参数错误 |
| E06 | 看板无数据 | 无数据范围 | 显示空态 |
</div>
<!--
课堂时间有限,所以至少覆盖这个最小测试集。
它覆盖权限、状态、参数、重复提交、页面异常和看板空态。
-->
---
# 防御性修改边界
<div class="mt-6 text-sm">
| 层级 | 修改重点 |
|---|---|
| 前端 | loading、禁用按钮、空态、错误提示 |
| 后端 Controller | 参数校验、权限校验 |
| Service | 状态校验、幂等、防重复、事务 |
| 审计日志 | 避免重复有效记录 |
</div>
<div class="mt-4 p-3 rounded-xl bg-amber-500/10 border border-amber-500/30 text-sm">
不要为了一个工单异常态,重写全局请求库或无关业务模块。
</div>
<!--
异常态修复很容易扩散。
课堂里要控制边界:只补工单模块相关前端状态、后端校验、Service 状态保护和审计日志。
-->
+95
View File
@@ -0,0 +1,95 @@
# 模块 6:研发效能看板指标开发
<div class="mt-6 text-sm">
看板不是图表堆叠。核心是指标口径、数据来源和权限范围。
</div>
<div class="grid grid-cols-3 gap-4 mt-8 text-sm">
<div class="p-3 rounded-xl bg-blue-500/10 border border-blue-500/30 text-center">工单总数</div>
<div class="p-3 rounded-xl bg-emerald-500/10 border border-emerald-500/30 text-center">待处理数量</div>
<div class="p-3 rounded-xl bg-amber-500/10 border border-amber-500/30 text-center">已关闭数量</div>
<div class="p-3 rounded-xl bg-purple-500/10 border border-purple-500/30 text-center">平均关闭周期</div>
<div class="p-3 rounded-xl bg-red-500/10 border border-red-500/30 text-center">优先级分布</div>
<div class="p-3 rounded-xl bg-gray-500/10 border border-gray-500/30 text-center">状态趋势</div>
</div>
<!--
看板的重点不是图表好看。
工单总数怎么算,待处理包含哪些状态,关闭周期从哪里到哪里,都要先讲清楚。
-->
---
# 看板指标字典
<div class="mt-5 text-xs">
| 指标 | 含义 | 计算口径 | 数据来源 | 展示 |
|---|---|---|---|---|
| 工单总数 | 当前工单总量 | count(*) | work_order | 数字卡片 |
| 待处理数量 | created + processing | 按状态统计 | work_order.status | 数字卡片 |
| 已关闭数量 | closed 数量 | 按状态统计 | work_order.status | 数字卡片 |
| 平均关闭周期 | 创建到关闭平均耗时 | avg(close_time - create_time) | work_order | 数字卡片 |
| 优先级分布 | 各优先级数量 | group by priority | work_order.priority | 饼图 |
| 状态趋势 | 每日新增/关闭 | 按日期聚合 | work_order | 折线图 |
</div>
<!--
指标字典是看板开发的第一产物。
如果指标口径不清,看板数字就不能用于管理判断。
-->
---
# 看板统计接口契约
<div class="mt-5 text-sm">
```md
GET /workOrder/dashboard/summary
返回:totalCount、pendingCount、closedCount、avgCloseHours
GET /workOrder/dashboard/status
返回:状态分布
GET /workOrder/dashboard/priority
返回:优先级分布
GET /workOrder/dashboard/trend
返回:每日新增、每日关闭
```
</div>
<div class="mt-4 p-3 rounded-xl bg-blue-500/10 border border-blue-500/30 text-sm">
每个接口必须说明筛选条件、数据范围、统计口径和看板权限。
</div>
<!--
看板不要只做前端假数据。
至少要设计后端统计接口契约,并说明管理员、负责人、普通用户的数据范围。
-->
---
# 看板页面验收
<div class="mt-5 text-sm">
| 验收项 | 预期 |
|---|---|
| 看板权限 | 无 `work:order:dashboard` 权限不可访问 |
| Summary 指标 | 口径符合指标字典 |
| 状态分布 | 与列表筛选统计一致 |
| 趋势图 | 新增/关闭按日期展示 |
| 空数据 | 显示空态,不报 NaN 或 undefined |
</div>
<!--
看板页面不是能打开就算完成。
验收要看权限、口径、空态和数字是否能解释。
-->
+129
View File
@@ -0,0 +1,129 @@
# 模块 7:阶段代码审查与修复
<div class="mt-6 text-sm">
第四天改动涉及权限、状态、审计、异常和看板,必须做阶段 Review。
</div>
<div class="grid grid-cols-2 gap-4 mt-8 text-sm">
<div class="p-3 rounded-xl bg-blue-500/10 border border-blue-500/30">权限是否闭环</div>
<div class="p-3 rounded-xl bg-blue-500/10 border border-blue-500/30">状态流转是否完整</div>
<div class="p-3 rounded-xl bg-emerald-500/10 border border-emerald-500/30">审计日志是否可查</div>
<div class="p-3 rounded-xl bg-emerald-500/10 border border-emerald-500/30">异常态是否覆盖</div>
<div class="p-3 rounded-xl bg-amber-500/10 border border-amber-500/30">看板口径是否清楚</div>
<div class="p-3 rounded-xl bg-amber-500/10 border border-amber-500/30">测试是否覆盖关键路径</div>
</div>
<!--
Review 的重点不是格式,也不是变量名。
第四天 Review 要检查业务闭环:权限、状态、审计、异常、看板和测试。
-->
---
# AI Review 输入
<div class="mt-5 text-sm">
| 输入材料 | 用途 |
|---|---|
| 当天 diff | 看实际修改 |
| RBAC 权限矩阵 | 判断权限是否正确 |
| 状态流转表 | 判断合法和非法路径 |
| 审计日志 SOP | 判断是否可追溯 |
| 异常态清单 | 判断防御性逻辑 |
| 看板指标字典 | 判断统计口径 |
| 测试结果 | 判断是否可验收 |
</div>
<!--
AI Review 不能只给 diff。
如果不给业务产物,AI 很难判断代码是否符合业务规则。
-->
---
# 阶段 Review 报告
<div class="mt-5 text-xs">
| 等级 | 模块 | 问题 | 风险 | 修复建议 | 验收 |
|---|---|---|---|---|---|
| P1 | 权限 | 删除接口只隐藏按钮,后端缺少校验 | 可绕过前端删除工单 | 补后端权限校验 | 无权限请求返回 403 |
| P1 | 状态 | closed 工单仍可重新处理 | 关闭状态失效 | 禁止 closed -> processing | 接口返回非法状态 |
| P2 | 审计 | 指派未记录前后值 | 难以追踪责任 | 记录 old/new assignee | 详情页日志可查 |
| P2 | 看板 | 平均关闭周期口径不清 | 管理判断失真 | 明确 create_time 到 close_time | 指标字典更新 |
</div>
<!--
Review 输出必须结构化。
每个问题要有等级、模块、风险、修复建议和验收方式。
-->
---
# 修复记录
<div class="mt-5 text-xs">
| Review 编号 | 问题 | 是否成立 | 修改说明 | 验证结果 | 资产沉淀 |
|---|---|---|---|---|---|
| R01 | 删除接口缺少权限校验 | 是 | 增加后端权限校验 | 无权限请求被拒绝 | 权限检查清单 |
| R02 | closed 可重新处理 | 是 | 补非法流转校验 | 状态不变 | 状态流转检查清单 |
| R03 | 看板关闭周期口径不清 | 是 | 明确指标口径 | 指标说明已更新 | 看板口径清单 |
</div>
<!--
Review 不是结束。
每个问题都要判断是否成立、记录修改说明、验证结果和是否沉淀资产。
-->
---
# 第 4 天交付物
<div class="grid grid-cols-2 gap-3 mt-6 text-sm">
<div class="p-3 rounded-xl bg-blue-500/10 border border-blue-500/30">01 工单 RBAC 权限矩阵</div>
<div class="p-3 rounded-xl bg-blue-500/10 border border-blue-500/30">02 工单权限控制方案</div>
<div class="p-3 rounded-xl bg-emerald-500/10 border border-emerald-500/30">03 工单状态流转表</div>
<div class="p-3 rounded-xl bg-emerald-500/10 border border-emerald-500/30">04 非法流转清单</div>
<div class="p-3 rounded-xl bg-amber-500/10 border border-amber-500/30">05 工单审计日志 SOP</div>
<div class="p-3 rounded-xl bg-amber-500/10 border border-amber-500/30">06 异常态与防御性逻辑清单</div>
<div class="p-3 rounded-xl bg-purple-500/10 border border-purple-500/30">07 研发效能看板指标字典</div>
<div class="p-3 rounded-xl bg-purple-500/10 border border-purple-500/30">08 看板接口验收记录</div>
<div class="p-3 rounded-xl bg-red-500/10 border border-red-500/30">09 阶段 Review 报告</div>
<div class="p-3 rounded-xl bg-red-500/10 border border-red-500/30">10 修复记录</div>
</div>
<!--
第四天最终交付十个产物。
这些产物共同说明:工单模块不只是能运行,还具备权限、状态、审计、异常和指标的工程闭环。
-->
---
layout: center
class: text-center
---
# 第 4 天总结
<div class="mt-8 text-lg">
让工单模块从“能跑通”升级到“可控制、可审计、可验证、可 Review”。
</div>
<div class="grid grid-cols-5 gap-3 mt-8 text-sm">
<div class="p-3 rounded-xl bg-blue-500/10 border border-blue-500/30">权限矩阵</div>
<div class="p-3 rounded-xl bg-emerald-500/10 border border-emerald-500/30">状态机</div>
<div class="p-3 rounded-xl bg-amber-500/10 border border-amber-500/30">审计 SOP</div>
<div class="p-3 rounded-xl bg-purple-500/10 border border-purple-500/30">异常清单</div>
<div class="p-3 rounded-xl bg-red-500/10 border border-red-500/30">Review 闭环</div>
</div>
<!--
第四天的核心不是让 AI 多写代码。
核心是让 AI 按规则、证据和验收标准协作,把复杂业务的风险变成可检查、可修复、可沉淀的工程资产。
-->