docs(P15A-0,P15B-0,R0): 修正P15合同并建档P15-P18路线图

这个提交包含在:
2026-03-06 23:25:26 +08:00
父节点 d8fff0ba21
当前提交 637fd24d8e
共修改 3 个文件,包含 27 行新增和 0 行删除
@@ -0,0 +1,7 @@
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
P15A-0,P15A执行合同建档,创建并校验P15A(权限全域解耦)执行合同CSV,CSV通过校验且字段完整,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv,manual,DONE,DONE,DONE,issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv,[],"需在P14彻底结束后建档"
P15A-1,常量字典与角色补齐,重构 permissions.js 新增 LEAVE 域权限集并应用给相应角色,字典分离成功并且在测试或路由里可以解析出权限,manual,manual,TODO,TODO,TODO,server/src/constants/permissions.js | server/src/scripts/seed-dev.js,"[""P15A-0""]","应用角色权限"
P15A-2,工作流动态鉴权剥离,将硬编码的 expense.approve 替换为 resolveEntityPermission 以根据 entityType 支持多态鉴权,提交和审批节点鉴权可自动识别 leave 和 expense 的不同所需 Token,cd server && npm run test,manual,TODO,TODO,TODO,server/src/constants/permissions.js | server/src/plugins/auth.js | server/src/routes/workflow.js,"[""P15A-1""]","核心路由侧改动;不新增中间映射文件"
P15A-3,前端路由与菜单显隐域解耦,调整现有待办与审批入口的 anyOf 守卫以支持 leave.approve 避免菜单与路由继续借用 expense 域,具备 leave.approve 的审批人可见现有审批入口且不新增独立请假配置菜单,manual,manual,TODO,TODO,TODO,client/src/components/navigation/NavLinks.tsx | client/src/router/index.tsx,"[""P15A-1""]","仅调整现有入口守卫,不扩独立请假菜单"
P15A-4,OpenAPI Tag分离,更新 leave 相关的 OpenAPI schema 注释将其脱离 Finance 组并收归 HR 分区,导出或查阅 json 中正确呈现独立 tag,curl /api/docs/json,manual,TODO,TODO,TODO,server/src/routes/leave.js,"[""P15A-2""]","不涉及业务逻辑"
P15A-5,P15A全量回归测试,运行回归脚本确保由 P15A 引发的基座层鉴权改动并未破坏原有的报销流转 (Expense),全量基线回归绿柱通过,cd server && ./scripts/regression-all.sh,manual,TODO,TODO,TODO,none,"[""P15A-3"",""P15A-4""]","严查expense业务回归"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 P15A-0 P15A执行合同建档 创建并校验P15A(权限全域解耦)执行合同CSV CSV通过校验且字段完整 python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv manual DONE DONE DONE issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv [] 需在P14彻底结束后建档
3 P15A-1 常量字典与角色补齐 重构 permissions.js 新增 LEAVE 域权限集并应用给相应角色 字典分离成功并且在测试或路由里可以解析出权限 manual manual TODO TODO TODO server/src/constants/permissions.js | server/src/scripts/seed-dev.js ["P15A-0"] 应用角色权限
4 P15A-2 工作流动态鉴权剥离 将硬编码的 expense.approve 替换为 resolveEntityPermission 以根据 entityType 支持多态鉴权 提交和审批节点鉴权可自动识别 leave 和 expense 的不同所需 Token cd server && npm run test manual TODO TODO TODO server/src/constants/permissions.js | server/src/plugins/auth.js | server/src/routes/workflow.js ["P15A-1"] 核心路由侧改动;不新增中间映射文件
5 P15A-3 前端路由与菜单显隐域解耦 调整现有待办与审批入口的 anyOf 守卫以支持 leave.approve 避免菜单与路由继续借用 expense 域 具备 leave.approve 的审批人可见现有审批入口且不新增独立请假配置菜单 manual manual TODO TODO TODO client/src/components/navigation/NavLinks.tsx | client/src/router/index.tsx ["P15A-1"] 仅调整现有入口守卫,不扩独立请假菜单
6 P15A-4 OpenAPI Tag分离 更新 leave 相关的 OpenAPI schema 注释将其脱离 Finance 组并收归 HR 分区 导出或查阅 json 中正确呈现独立 tag curl /api/docs/json manual TODO TODO TODO server/src/routes/leave.js ["P15A-2"] 不涉及业务逻辑
7 P15A-5 P15A全量回归测试 运行回归脚本确保由 P15A 引发的基座层鉴权改动并未破坏原有的报销流转 (Expense) 全量基线回归绿柱通过 cd server && ./scripts/regression-all.sh manual TODO TODO TODO none ["P15A-3","P15A-4"] 严查expense业务回归
@@ -0,0 +1,10 @@
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
P15B-0,P15B执行合同建档,创建并校验P15B(Leave V1)执行合同CSV,CSV通过校验且字段完整,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv,manual,DONE,DONE,DONE,issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv,[],"需在P15A完成后建档"
P15B-1,国际化四层模型扩展,"Prisma 建立 LeaveType/LeavePolicy/LeaveLedger 和增强的 LeaveRequest 字段(am-pm设计与天数计算)",Migration完成且结构符合国际HR内控原则,npx prisma migrate dev --name init_leave_v1_models,manual,TODO,TODO,TODO,server/prisma/schema.prisma,"[""P15B-0""]","日历与配额前置计算不纳入V1"
P15B-2,HR业务基础类型维表API,支持HR增删改查 LeaveType 及绑定策略 (API CRUD),请求返回200并录入数据库,manual,manual,TODO,TODO,TODO,server/src/routes/leave-types.js,"[""P15B-1""]","新建路由"
P15B-2A,Leave申请列表接口,补齐员工端与HR端的 Leave 列表查询接口支持按本人或全量视角查看历史申请,列表接口返回200且权限边界正确,manual,manual,TODO,TODO,TODO,server/src/routes/leave.js,"[""P15B-1""]","员工自助可用性的必要补齐"
P15B-3,天数预检与隔离碰撞强设闸,"提交 Leave 时进行可用配额强设闸,并做同员工同时间段的日期重叠阻断",接口明确返回 HTTP 422 Conflict Range,"测试脚本 POST 日期交叉单拦截",manual,TODO,TODO,TODO,server/src/routes/leave.js,"[""P15B-1""]","核心规则引擎"
P15B-4,状态机与冻结账本流转闭环,在 workflow.js 中的实体业务分支(875/1005处)追加针对 leave实体的账本扣减/释放逻辑,数据库余额按工作流事件准确变更,vitest transaction测试校验冻结数与已用数,manual,TODO,TODO,TODO,server/src/routes/leave.js | server/src/routes/workflow.js,"[""P15B-3""]","避免造不存在的hook"
P15B-4A,Leave撤回与冻结释放接口,补齐 POST /leave-requests/:id/withdraw 以允许申请人在未被审批人处理前撤回并释放冻结账本,撤回后状态回到 draft 且冻结账本被释放,manual,manual,TODO,TODO,TODO,server/src/routes/leave.js | server/src/routes/workflow.js,"[""P15B-4""]","与报销撤回语义保持一致"
P15B-5,Leave申请前端模块集成,实装半天粒度携带附件类型规则校验的跨天请假界面与剩余账本卡片视图并注册列表与发起入口,联调通过并可创建/查看/撤回请假申请,manual,manual,TODO,TODO,TODO,client/src/pages/LeaveRequestPage.tsx | client/src/router/index.tsx | client/src/components/navigation/NavLinks.tsx,"[""P15B-2"",""P15B-2A"",""P15B-4"",""P15B-4A""]","基于UI8设计结构"
P15B-6,P15B验收联调测试,"P15B 全量集成流转,测试休假申请能否走通工作流并闭环实扣配额与撤回释放",回归测试并且手工创建/提交/撤回/审批请假流转完成,cd server && ./scripts/regression-all.sh,manual,TODO,TODO,TODO,none,"[""P15B-5""]","重中之重"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 P15B-0 P15B执行合同建档 创建并校验P15B(Leave V1)执行合同CSV CSV通过校验且字段完整 python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv manual DONE DONE DONE issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv [] 需在P15A完成后建档
3 P15B-1 国际化四层模型扩展 Prisma 建立 LeaveType/LeavePolicy/LeaveLedger 和增强的 LeaveRequest 字段(am-pm设计与天数计算) Migration完成且结构符合国际HR内控原则 npx prisma migrate dev --name init_leave_v1_models manual TODO TODO TODO server/prisma/schema.prisma ["P15B-0"] 日历与配额前置计算不纳入V1
4 P15B-2 HR业务基础类型维表API 支持HR增删改查 LeaveType 及绑定策略 (API CRUD) 请求返回200并录入数据库 manual manual TODO TODO TODO server/src/routes/leave-types.js ["P15B-1"] 新建路由
5 P15B-2A Leave申请列表接口 补齐员工端与HR端的 Leave 列表查询接口支持按本人或全量视角查看历史申请 列表接口返回200且权限边界正确 manual manual TODO TODO TODO server/src/routes/leave.js ["P15B-1"] 员工自助可用性的必要补齐
6 P15B-3 天数预检与隔离碰撞强设闸 提交 Leave 时进行可用配额强设闸,并做同员工同时间段的日期重叠阻断 接口明确返回 HTTP 422 Conflict Range 测试脚本 POST 日期交叉单拦截 manual TODO TODO TODO server/src/routes/leave.js ["P15B-1"] 核心规则引擎
7 P15B-4 状态机与冻结账本流转闭环 在 workflow.js 中的实体业务分支(875/1005处)追加针对 leave实体的账本扣减/释放逻辑 数据库余额按工作流事件准确变更 vitest transaction测试校验冻结数与已用数 manual TODO TODO TODO server/src/routes/leave.js | server/src/routes/workflow.js ["P15B-3"] 避免造不存在的hook
8 P15B-4A Leave撤回与冻结释放接口 补齐 POST /leave-requests/:id/withdraw 以允许申请人在未被审批人处理前撤回并释放冻结账本 撤回后状态回到 draft 且冻结账本被释放 manual manual TODO TODO TODO server/src/routes/leave.js | server/src/routes/workflow.js ["P15B-4"] 与报销撤回语义保持一致
9 P15B-5 Leave申请前端模块集成 实装半天粒度携带附件类型规则校验的跨天请假界面与剩余账本卡片视图并注册列表与发起入口 联调通过并可创建/查看/撤回请假申请 manual manual TODO TODO TODO client/src/pages/LeaveRequestPage.tsx | client/src/router/index.tsx | client/src/components/navigation/NavLinks.tsx ["P15B-2","P15B-2A","P15B-4","P15B-4A"] 基于UI8设计结构
10 P15B-6 P15B验收联调测试 P15B 全量集成流转,测试休假申请能否走通工作流并闭环实扣配额与撤回释放 回归测试并且手工创建/提交/撤回/审批请假流转完成 cd server && ./scripts/regression-all.sh manual TODO TODO TODO none ["P15B-5"] 重中之重
@@ -0,0 +1,10 @@
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
R0,P15-P18路线图合同建档,创建并校验P15-P18 roadmap preflight 执行合同CSV,CSV通过校验且字段完整,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_20-00-00-p15-p18-roadmap-preflight.csv,manual,DONE,DONE,DONE,issues/2026-03-06_20-00-00-p15-p18-roadmap-preflight.csv,[],作为后续六个月总控合同
R1,P14基线冻结与双提交,封板P14运营化产物并按计划完成基线提交收口,两笔chore提交完成且工作区清空,"manual: git status && git log --oneline -n 2",manual,DONE,DONE,DONE,.github/workflows/ci-minimal.yml | .github/workflows/ci-regression.yml | docs/feature-matrix.md | docs/ops/ci-regression-reporting.md | issues/2026-02-13_00-11-56-p14-l5-operationalization.csv | scripts/coverage_gate.js | scripts/openapi_diff_check.py | scripts/validate_regression_report.py | scripts/validate-feature-matrix.py | server/.env.example | server/package.json | server/package-lock.json | server/scripts/export_openapi.js | server/src/app.js | server/src/config.js | server/src/index.js | server/src/observability/tracing.js | server/src/routes/invoicePool/read.js | server/src/routes/reimbursements.js | server/src/routes/workflow.js | server/tests/unit/services/ | server/tests/unit/utils/,"[""R0""]","本次以两笔chore提交完成基线封板"
R2,P15合同锚点校正,修正P15A伪文件锚点并补齐P15B列表/撤回能力合同,不再引用不存在文件且P15B覆盖列表与撤回流程,"python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv && python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv",manual,DONE,DONE,DONE,issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv,"[""R0""]","P15A-2 锚定 constants/auth/workflow;P15B补齐列表与撤回"
R3,Skills与MCP装配计划建档,固定skills安装与MCP启用边界并完成第一波必要skills安装,playwright与security-best-practices可用且MCP策略已固定,"manual: ls -1 /home/shunli/.codex/skills",manual,DONE,DONE,DONE,/home/shunli/.codex/config.toml | /home/shunli/.codex/skills/playwright | /home/shunli/.codex/skills/security-best-practices,"[""R0""]","已安装 playwright 与 security-best-practices;MCP继续按需启用,仅预留postgres/github"
R4,P15A启动就绪审查,冻结P15A权限矩阵与接口落点避免开工后反复改合同,权限矩阵和落点与真实代码锚点一致,manual,manual,TODO,TODO,TODO,issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | server/src/constants/permissions.js | server/src/plugins/auth.js | server/src/routes/workflow.js | server/src/routes/leave.js | client/src/components/navigation/NavLinks.tsx | client/src/router/index.tsx,"[""R2""]","不改表结构;不扩transfer到leave"
R5,P15B启动就绪审查,冻结P15B四层模型与账本语义及列表/撤回边界,四层模型与账本语义和接口范围全部固定,manual,manual,TODO,TODO,TODO,issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv | server/prisma/schema.prisma | server/src/routes/leave.js | server/src/routes/workflow.js,"[""R2""]","默认自然日+半天边界;日历与节假日算法后置"
R6,P16共享主数据蓝图,定义 LegalEntity HolidayCalendar CostCenter DocumentCategory Supplier 的模型与API边界,主数据模型和API范围固定且可被leave purchase asset复用,manual,manual,TODO,TODO,TODO,module:master-data,"[""R5""]","先共享主数据后扩业务,避免再次耦回system.settings"
R7,P17轻采购蓝图,定义轻采购V1范围仅覆盖申请审批预算校验供应商与归档,采购范围固定且明确不含收货三单匹配与ERP过账,manual,manual,TODO,TODO,TODO,module:procurement,"[""R6""]","依赖Supplier与CostCenter等主数据"
R8,P18固资台账蓝图,定义资产卡片领用归还调拨盘点的V1范围,资产台账范围固定且明确不含折旧过账与ERP集成,manual,manual,TODO,TODO,TODO,module:assets,"[""R6""]","建议引用LegalEntity CostCenter DocumentCategory"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 R0 P15-P18路线图合同建档 创建并校验P15-P18 roadmap preflight 执行合同CSV CSV通过校验且字段完整 python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_20-00-00-p15-p18-roadmap-preflight.csv manual DONE DONE DONE issues/2026-03-06_20-00-00-p15-p18-roadmap-preflight.csv [] 作为后续六个月总控合同
3 R1 P14基线冻结与双提交 封板P14运营化产物并按计划完成基线提交收口 两笔chore提交完成且工作区清空 manual: git status && git log --oneline -n 2 manual DONE DONE DONE .github/workflows/ci-minimal.yml | .github/workflows/ci-regression.yml | docs/feature-matrix.md | docs/ops/ci-regression-reporting.md | issues/2026-02-13_00-11-56-p14-l5-operationalization.csv | scripts/coverage_gate.js | scripts/openapi_diff_check.py | scripts/validate_regression_report.py | scripts/validate-feature-matrix.py | server/.env.example | server/package.json | server/package-lock.json | server/scripts/export_openapi.js | server/src/app.js | server/src/config.js | server/src/index.js | server/src/observability/tracing.js | server/src/routes/invoicePool/read.js | server/src/routes/reimbursements.js | server/src/routes/workflow.js | server/tests/unit/services/ | server/tests/unit/utils/ ["R0"] 本次以两笔chore提交完成基线封板
4 R2 P15合同锚点校正 修正P15A伪文件锚点并补齐P15B列表/撤回能力合同 不再引用不存在文件且P15B覆盖列表与撤回流程 python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv && python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv manual DONE DONE DONE issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv ["R0"] P15A-2 锚定 constants/auth/workflow;P15B补齐列表与撤回
5 R3 Skills与MCP装配计划建档 固定skills安装与MCP启用边界并完成第一波必要skills安装 playwright与security-best-practices可用且MCP策略已固定 manual: ls -1 /home/shunli/.codex/skills manual DONE DONE DONE /home/shunli/.codex/config.toml | /home/shunli/.codex/skills/playwright | /home/shunli/.codex/skills/security-best-practices ["R0"] 已安装 playwright 与 security-best-practices;MCP继续按需启用,仅预留postgres/github
6 R4 P15A启动就绪审查 冻结P15A权限矩阵与接口落点避免开工后反复改合同 权限矩阵和落点与真实代码锚点一致 manual manual TODO TODO TODO issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | server/src/constants/permissions.js | server/src/plugins/auth.js | server/src/routes/workflow.js | server/src/routes/leave.js | client/src/components/navigation/NavLinks.tsx | client/src/router/index.tsx ["R2"] 不改表结构;不扩transfer到leave
7 R5 P15B启动就绪审查 冻结P15B四层模型与账本语义及列表/撤回边界 四层模型与账本语义和接口范围全部固定 manual manual TODO TODO TODO issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv | server/prisma/schema.prisma | server/src/routes/leave.js | server/src/routes/workflow.js ["R2"] 默认自然日+半天边界;日历与节假日算法后置
8 R6 P16共享主数据蓝图 定义 LegalEntity HolidayCalendar CostCenter DocumentCategory Supplier 的模型与API边界 主数据模型和API范围固定且可被leave purchase asset复用 manual manual TODO TODO TODO module:master-data ["R5"] 先共享主数据后扩业务,避免再次耦回system.settings
9 R7 P17轻采购蓝图 定义轻采购V1范围仅覆盖申请审批预算校验供应商与归档 采购范围固定且明确不含收货三单匹配与ERP过账 manual manual TODO TODO TODO module:procurement ["R6"] 依赖Supplier与CostCenter等主数据
10 R8 P18固资台账蓝图 定义资产卡片领用归还调拨盘点的V1范围 资产台账范围固定且明确不含折旧过账与ERP集成 manual manual TODO TODO TODO module:assets ["R6"] 建议引用LegalEntity CostCenter DocumentCategory