feat(G1,P16A,P16B): 收口主数据核心与节假日日历增强

这个提交包含在:
2026-03-07 17:29:03 +08:00
父节点 32a3d3724d
当前提交 195f46a2e3
共修改 35 个文件,包含 4556 行新增和 27 行删除
@@ -1,5 +1,5 @@
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
UI7-0,UI翻新阶段7执行合同建档,创建并校验本轮UI翻新Issue CSV执行合同,CSV校验通过且字段完整,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-05_18-53-29-ui-refresh-stage7.csv,manual,TODO,TODO,TODO,issues/2026-03-05_18-53-29-ui-refresh-stage7.csv,[],none
UI7-0,UI翻新阶段7执行合同建档,创建并校验本轮UI翻新Issue CSV执行合同,CSV校验通过且字段完整,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-05_18-53-29-ui-refresh-stage7.csv,manual,DONE,DONE,DONE,issues/2026-03-05_18-53-29-ui-refresh-stage7.csv,[],none
UI7-1,工作区UI翻新分批提交,将当前累计WIP拆分为4到6个可回滚提交并保持每个提交可构建,git status干净且提交按主题拆分并均可通过构建,cd client && npm run typecheck && npm run build; git status --porcelain,manual,DONE,DONE,DONE,client/**,"[""UI7-0""]",提交信息中文并引用Issue ID
UI7-2,Design Tokens对齐(字体与primary色阶),对齐字体来源并修复primary色阶引用不生效问题,字体与按钮hover和focus样式一致且构建通过,cd client && npm run typecheck && npm run build; manual: Tab聚焦按钮与Tabs检查ring与hover,manual,DONE,DONE,DONE,client/index.html|client/src/index.css|client/tailwind.config.js|client/src/components/ui/*.tsx,"[""UI7-0""]",可参考~/shenzhou-business-suite的CSS变量token方式但不强制迁移
UI7-3,7.3 修复403与404页面错位色与异常按钮,403与404页面按新版DS统一并明确返回路径,访问/403与未知路径页面样式统一且按钮可用,cd client && npm run build; manual: 登录后访问/403与/does-not-exist核验布局与按钮,manual,DONE,DONE,DONE,client/src/pages/ForbiddenPage.tsx|client/src/pages/NotFoundPage.tsx|client/src/router/index.tsx,"[""UI7-2""]",确认403/404是否需要放入AppShellLayout内
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 UI7-0 UI翻新阶段7执行合同建档 创建并校验本轮UI翻新Issue CSV执行合同 CSV校验通过且字段完整 python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-05_18-53-29-ui-refresh-stage7.csv manual TODO DONE TODO DONE TODO DONE issues/2026-03-05_18-53-29-ui-refresh-stage7.csv [] none
3 UI7-1 工作区UI翻新分批提交 将当前累计WIP拆分为4到6个可回滚提交并保持每个提交可构建 git status干净且提交按主题拆分并均可通过构建 cd client && npm run typecheck && npm run build; git status --porcelain manual DONE DONE DONE client/** ["UI7-0"] 提交信息中文并引用Issue ID
4 UI7-2 Design Tokens对齐(字体与primary色阶) 对齐字体来源并修复primary色阶引用不生效问题 字体与按钮hover和focus样式一致且构建通过 cd client && npm run typecheck && npm run build; manual: Tab聚焦按钮与Tabs检查ring与hover manual DONE DONE DONE client/index.html|client/src/index.css|client/tailwind.config.js|client/src/components/ui/*.tsx ["UI7-0"] 可参考~/shenzhou-business-suite的CSS变量token方式但不强制迁移
5 UI7-3 7.3 修复403与404页面错位色与异常按钮 403与404页面按新版DS统一并明确返回路径 访问/403与未知路径页面样式统一且按钮可用 cd client && npm run build; manual: 登录后访问/403与/does-not-exist核验布局与按钮 manual DONE DONE DONE client/src/pages/ForbiddenPage.tsx|client/src/pages/NotFoundPage.tsx|client/src/router/index.tsx ["UI7-2"] 确认403/404是否需要放入AppShellLayout内
@@ -1,4 +1,4 @@
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
UI8-0,UI翻新阶段8验收建档,创建并校验本轮遗留Card组件与边缘文案中文化Issue CSV,CSV校验通过,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_10-09-00-ui-refresh-stage8.csv,manual,TODO,TODO,TODO,issues/2026-03-06_10-09-00-ui-refresh-stage8.csv,[],none
UI8-0,UI翻新阶段8验收建档,创建并校验本轮遗留Card组件与边缘文案中文化Issue CSV,CSV校验通过,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_10-09-00-ui-refresh-stage8.csv,manual,DONE,DONE,DONE,issues/2026-03-06_10-09-00-ui-refresh-stage8.csv,[],none
UI8-1,清理残余的Card与混用UI,修复Dashboard及15个遗留页面中的shadcn Card引入混用问题及样式调整,全站所有遗留被替换为 card-std 且Typecheck通过,cd client && npm run typecheck && npm run build,manual,DONE,DONE,DONE,client/src/pages/**,"[""UI8-0""]",确保剥离 p-6 后的样式无异常
UI8-2,下拉框中文化,修复Budgets和Delegations等的选项文案中文化,文案完成对应本地化不影响value传入后端,手动校验下拉框显示,manual,DONE,DONE,DONE,client/src/pages/BudgetsPage.tsx|client/src/pages/DelegationsPage.tsx,"[""UI8-0""]",无
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 UI8-0 UI翻新阶段8验收建档 创建并校验本轮遗留Card组件与边缘文案中文化Issue CSV CSV校验通过 python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_10-09-00-ui-refresh-stage8.csv manual TODO DONE TODO DONE TODO DONE issues/2026-03-06_10-09-00-ui-refresh-stage8.csv [] none
3 UI8-1 清理残余的Card与混用UI 修复Dashboard及15个遗留页面中的shadcn Card引入混用问题及样式调整 全站所有遗留被替换为 card-std 且Typecheck通过 cd client && npm run typecheck && npm run build manual DONE DONE DONE client/src/pages/** ["UI8-0"] 确保剥离 p-6 后的样式无异常
4 UI8-2 下拉框中文化 修复Budgets和Delegations等的选项文案中文化 文案完成对应本地化不影响value传入后端 手动校验下拉框显示 manual DONE DONE DONE client/src/pages/BudgetsPage.tsx|client/src/pages/DelegationsPage.tsx ["UI8-0"] 无
@@ -0,0 +1,5 @@
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
G1-0,G1治理尾项执行合同建档,创建并校验G1治理尾项执行合同CSV,CSV通过校验且字段完整,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-07_13-46-55-g1-governance-tail.csv,manual,DONE,DONE,DONE,issues/2026-03-07_13-46-55-g1-governance-tail.csv,[],收口当前活跃治理残项
G1-1,UI阶段合同建档状态收口,将UI7-0与UI8-0建档行状态收口为DONE并保持原合同其余内容不变,UI7-0与UI8-0三状态均为DONE,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-05_18-53-29-ui-refresh-stage7.csv && python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_10-09-00-ui-refresh-stage8.csv,manual,DONE,DONE,DONE,issues/2026-03-05_18-53-29-ui-refresh-stage7.csv | issues/2026-03-06_10-09-00-ui-refresh-stage8.csv,"[""G1-0""]",仅收口建档行不回填更老历史CSV
G1-2,Feature Matrix治理边界澄清,在状态矩阵中明确UI专项合同属于界面治理线不并入业务主表,feature-matrix说明区明确UI治理合同不纳入主表统计,python3 scripts/validate-feature-matrix.py,manual,DONE,DONE,DONE,docs/feature-matrix.md | scripts/validate-feature-matrix.py,"[""G1-1""]",不新增UI条目到业务矩阵
G1-3,G1一致性复查,复查活跃roadmap与当前主表及CSV状态的一致性,不要求在未提交阶段强制清空工作区,G1与P16A合同校验通过且当前主表与活跃合同事实源一致,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-07_13-46-55-g1-governance-tail.csv && python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv && python3 scripts/validate-feature-matrix.py,manual,DONE,DONE,DONE,issues/2026-03-07_13-46-55-g1-governance-tail.csv | issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv | issues/2026-03-06_20-00-00-p15-p18-roadmap-preflight.csv | docs/feature-matrix.md,"[""G1-2""]",不改业务代码且不要求以提交换取clean working tree
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 G1-0 G1治理尾项执行合同建档 创建并校验G1治理尾项执行合同CSV CSV通过校验且字段完整 python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-07_13-46-55-g1-governance-tail.csv manual DONE DONE DONE issues/2026-03-07_13-46-55-g1-governance-tail.csv [] 收口当前活跃治理残项
3 G1-1 UI阶段合同建档状态收口 将UI7-0与UI8-0建档行状态收口为DONE并保持原合同其余内容不变 UI7-0与UI8-0三状态均为DONE python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-05_18-53-29-ui-refresh-stage7.csv && python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-06_10-09-00-ui-refresh-stage8.csv manual DONE DONE DONE issues/2026-03-05_18-53-29-ui-refresh-stage7.csv | issues/2026-03-06_10-09-00-ui-refresh-stage8.csv ["G1-0"] 仅收口建档行不回填更老历史CSV
4 G1-2 Feature Matrix治理边界澄清 在状态矩阵中明确UI专项合同属于界面治理线不并入业务主表 feature-matrix说明区明确UI治理合同不纳入主表统计 python3 scripts/validate-feature-matrix.py manual DONE DONE DONE docs/feature-matrix.md | scripts/validate-feature-matrix.py ["G1-1"] 不新增UI条目到业务矩阵
5 G1-3 G1一致性复查 复查活跃roadmap与当前主表及CSV状态的一致性,不要求在未提交阶段强制清空工作区 G1与P16A合同校验通过且当前主表与活跃合同事实源一致 python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-07_13-46-55-g1-governance-tail.csv && python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv && python3 scripts/validate-feature-matrix.py manual DONE DONE DONE issues/2026-03-07_13-46-55-g1-governance-tail.csv | issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv | issues/2026-03-06_20-00-00-p15-p18-roadmap-preflight.csv | docs/feature-matrix.md ["G1-2"] 不改业务代码且不要求以提交换取clean working tree
@@ -0,0 +1,8 @@
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
P16A-0,P16A执行合同建档,创建并校验P16A基础主数据核心执行合同CSV,CSV通过校验且字段完整,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv,manual,DONE,DONE,DONE,issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv,[],P16A仅建主数据本体不批量改造既有业务
P16A-1,Prisma主数据模型与迁移,新增LegalEntity CostCenter DocumentCategory模型与必要枚举索引并生成迁移,Prisma schema与迁移可通过校验并成功生成客户端,cd server && npm run prisma:validate && npx prisma migrate dev --name p16a_master_data_core && npm run prisma:generate,manual,DONE,DONE,DONE,server/prisma/schema.prisma | server/prisma/migrations,"[""P16A-0""]",不强制回写既有报销预算表结构
P16A-2,权限与种子补齐,新增masterdata.view/manage权限映射并补齐seed-config与seed-dev所需基础主数据,角色权限与默认单据分类及开发演示数据可用,cd server && npm run test && npm run seed:config && npm run seed:dev-users,manual,DONE,DONE,DONE,server/src/constants/permissions.js | client/src/auth/permissions.ts | server/src/scripts/seed-config.js | server/src/scripts/seed-dev.js,"[""P16A-1""]",finance_mgr主配manage finance与ceo具备view
P16A-3,后端主数据CRUD API,实现master-data命名空间下的法体 成本中心 单据分类列表 新建 更新 归档接口并补审计与OpenAPI标签,三类主数据API可通过权限与唯一性校验且返回一致数据结构,cd server && npm run test,manual,DONE,DONE,DONE,server/src/routes/masterData.js | server/src/app.js,"[""P16A-2""]",列表接口支持includeArchived enabled legalEntityId entityType最小筛选
P16A-4,前端主数据入口与管理页,新增MasterDataPage与API封装并注册/system/master-data菜单与路由,具备masterdata.view/manage的用户可进入并完成基础查看与创建归档操作,cd client && npm run typecheck && npm run build,manual,DONE,DONE,DONE,client/src/api/masterData.ts | client/src/pages/MasterDataPage.tsx | client/src/router/index.tsx | client/src/components/navigation/NavLinks.tsx,"[""P16A-3""]",采用单页多Tab承载法体 成本中心 单据分类
P16A-5,矩阵与文档同步,同步feature-matrix范围与事实源并补P16A条目及治理边界说明,feature-matrix校验通过且P16A条目全部可追溯,python3 scripts/validate-feature-matrix.py,manual,DONE,DONE,DONE,docs/feature-matrix.md | scripts/validate-feature-matrix.py,"[""P16A-4""]",UI专项合同继续排除在业务矩阵主表外
P16A-6,P16A回归与安全收口,完成主数据最小手工流转验证并执行后端前端回归及安全复核,CRUD 权限 归档限制与现有主流程均通过验证,cd server && npm run test && ./scripts/regression-all.sh && cd ../client && npm run typecheck && npm run build,manual,DONE,DONE,DONE,none,"[""P16A-5""]",合并前按security-best-practices检查IDOR与越权更新
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 P16A-0 P16A执行合同建档 创建并校验P16A基础主数据核心执行合同CSV CSV通过校验且字段完整 python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv manual DONE DONE DONE issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv [] P16A仅建主数据本体不批量改造既有业务
3 P16A-1 Prisma主数据模型与迁移 新增LegalEntity CostCenter DocumentCategory模型与必要枚举索引并生成迁移 Prisma schema与迁移可通过校验并成功生成客户端 cd server && npm run prisma:validate && npx prisma migrate dev --name p16a_master_data_core && npm run prisma:generate manual DONE DONE DONE server/prisma/schema.prisma | server/prisma/migrations ["P16A-0"] 不强制回写既有报销预算表结构
4 P16A-2 权限与种子补齐 新增masterdata.view/manage权限映射并补齐seed-config与seed-dev所需基础主数据 角色权限与默认单据分类及开发演示数据可用 cd server && npm run test && npm run seed:config && npm run seed:dev-users manual DONE DONE DONE server/src/constants/permissions.js | client/src/auth/permissions.ts | server/src/scripts/seed-config.js | server/src/scripts/seed-dev.js ["P16A-1"] finance_mgr主配manage finance与ceo具备view
5 P16A-3 后端主数据CRUD API 实现master-data命名空间下的法体 成本中心 单据分类列表 新建 更新 归档接口并补审计与OpenAPI标签 三类主数据API可通过权限与唯一性校验且返回一致数据结构 cd server && npm run test manual DONE DONE DONE server/src/routes/masterData.js | server/src/app.js ["P16A-2"] 列表接口支持includeArchived enabled legalEntityId entityType最小筛选
6 P16A-4 前端主数据入口与管理页 新增MasterDataPage与API封装并注册/system/master-data菜单与路由 具备masterdata.view/manage的用户可进入并完成基础查看与创建归档操作 cd client && npm run typecheck && npm run build manual DONE DONE DONE client/src/api/masterData.ts | client/src/pages/MasterDataPage.tsx | client/src/router/index.tsx | client/src/components/navigation/NavLinks.tsx ["P16A-3"] 采用单页多Tab承载法体 成本中心 单据分类
7 P16A-5 矩阵与文档同步 同步feature-matrix范围与事实源并补P16A条目及治理边界说明 feature-matrix校验通过且P16A条目全部可追溯 python3 scripts/validate-feature-matrix.py manual DONE DONE DONE docs/feature-matrix.md | scripts/validate-feature-matrix.py ["P16A-4"] UI专项合同继续排除在业务矩阵主表外
8 P16A-6 P16A回归与安全收口 完成主数据最小手工流转验证并执行后端前端回归及安全复核 CRUD 权限 归档限制与现有主流程均通过验证 cd server && npm run test && ./scripts/regression-all.sh && cd ../client && npm run typecheck && npm run build manual DONE DONE DONE none ["P16A-5"] 合并前按security-best-practices检查IDOR与越权更新
@@ -0,0 +1,8 @@
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
P16B-0,P16B执行合同建档,创建并校验P16B节假日历主数据执行合同CSV,CSV通过校验且字段完整,python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv,manual,DONE,DONE,DONE,issues/2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv,[],P16B只建设日历主数据与关闭态增强算法
P16B-1,Prisma日历模型与迁移,新增HolidayCalendar与HolidayCalendarDay模型并为LegalEntity补默认日历关联和必要索引,Prisma schema与迁移可通过校验并成功生成客户端,cd server && npm run prisma:validate && npx prisma migrate dev --name p16b_holiday_calendar && npm run prisma:generate,manual,DONE,DONE,DONE,server/prisma/schema.prisma | server/prisma/migrations/20260307084423_p16b_holiday_calendar,"[""P16B-0""]",补充LegalEntity默认日历关联并保持请假算法默认不切换
P16B-2,日历开关与种子补齐,新增leave_holiday_calendar功能开关及默认记录并补齐演示日历种子,功能开关可在系统页展示且seed后可看到演示日历,cd server && npm run test && npm run seed:config && npm run seed:dev-users,manual,DONE,DONE,DONE,server/src/services/featureFlags/index.js | client/src/api/featureFlags.ts | client/src/pages/FeatureFlagsPage.tsx | server/src/scripts/seed-config.js | server/src/scripts/seed-dev.js | server/.env.example,"[""P16B-1""]",默认保持关闭态并通过Env+在线开关双闸控制
P16B-3,后端日历主数据API,实现holiday-calendars列表 新建 更新 批量日期覆盖 归档接口并挂入master-data命名空间,日历与日历日接口支持权限校验 唯一性校验 引用法体校验与批量覆盖,cd server && npm run test,manual,DONE,DONE,DONE,server/src/routes/masterDataHolidayCalendars.js | server/src/app.js | server/src/plugins/auth.js,"[""P16B-2""]",接口范围固定为GET POST PATCH GET days PUT days POST archive
P16B-4,前端主数据日历Tab,在MasterDataPage加入日历Tab并补API封装及功能开关显示名,具备masterdata.view/manage的用户可查看与维护日历及日期明细,cd client && npm run typecheck && npm run build,manual,DONE,DONE,DONE,client/src/api/masterData.ts | client/src/components/master-data/HolidayCalendarTab.tsx | client/src/pages/MasterDataPage.tsx | client/src/router/index.tsx | client/src/components/navigation/NavLinks.tsx | client/src/pages/FeatureFlagsPage.tsx | client/src/api/errorMessages.ts,"[""P16B-3""]",继续复用/system/master-data单页多Tab
P16B-5,请假日历增强计算器,在leave服务中新增可选日历版请假天数计算器并通过feature flag按法体默认日历读取,关闭开关时结果与现有自然日算法一致 打开后可识别holiday adjusted_workday,cd server && npm run test,manual,DONE,DONE,DONE,server/src/services/leave.js | server/src/routes/leave.js | server/src/services/featureFlags/index.js,"[""P16B-3""]",默认关闭且仅增强requestedDays计算不改账本语义
P16B-6,P16B回归与矩阵收口,完成日历主数据手工验证 请假算法双模式验证 并同步feature-matrix事实源,CSV 矩阵 回归与越权负测全部通过,cd server && npm run test && ./scripts/regression-all.sh && cd ../client && npm run typecheck && npm run build && python3 scripts/validate-feature-matrix.py,manual,DONE,DONE,DONE,docs/feature-matrix.md | scripts/validate-feature-matrix.py | issues/2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv,"[""P16B-4"",""P16B-5""]",已完成finance只读 finance_mgr可维护 默认日历禁止归档与开关双模式验证
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 P16B-0 P16B执行合同建档 创建并校验P16B节假日历主数据执行合同CSV CSV通过校验且字段完整 python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv manual DONE DONE DONE issues/2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv [] P16B只建设日历主数据与关闭态增强算法
3 P16B-1 Prisma日历模型与迁移 新增HolidayCalendar与HolidayCalendarDay模型并为LegalEntity补默认日历关联和必要索引 Prisma schema与迁移可通过校验并成功生成客户端 cd server && npm run prisma:validate && npx prisma migrate dev --name p16b_holiday_calendar && npm run prisma:generate manual DONE DONE DONE server/prisma/schema.prisma | server/prisma/migrations/20260307084423_p16b_holiday_calendar ["P16B-0"] 补充LegalEntity默认日历关联并保持请假算法默认不切换
4 P16B-2 日历开关与种子补齐 新增leave_holiday_calendar功能开关及默认记录并补齐演示日历种子 功能开关可在系统页展示且seed后可看到演示日历 cd server && npm run test && npm run seed:config && npm run seed:dev-users manual DONE DONE DONE server/src/services/featureFlags/index.js | client/src/api/featureFlags.ts | client/src/pages/FeatureFlagsPage.tsx | server/src/scripts/seed-config.js | server/src/scripts/seed-dev.js | server/.env.example ["P16B-1"] 默认保持关闭态并通过Env+在线开关双闸控制
5 P16B-3 后端日历主数据API 实现holiday-calendars列表 新建 更新 批量日期覆盖 归档接口并挂入master-data命名空间 日历与日历日接口支持权限校验 唯一性校验 引用法体校验与批量覆盖 cd server && npm run test manual DONE DONE DONE server/src/routes/masterDataHolidayCalendars.js | server/src/app.js | server/src/plugins/auth.js ["P16B-2"] 接口范围固定为GET POST PATCH GET days PUT days POST archive
6 P16B-4 前端主数据日历Tab 在MasterDataPage加入日历Tab并补API封装及功能开关显示名 具备masterdata.view/manage的用户可查看与维护日历及日期明细 cd client && npm run typecheck && npm run build manual DONE DONE DONE client/src/api/masterData.ts | client/src/components/master-data/HolidayCalendarTab.tsx | client/src/pages/MasterDataPage.tsx | client/src/router/index.tsx | client/src/components/navigation/NavLinks.tsx | client/src/pages/FeatureFlagsPage.tsx | client/src/api/errorMessages.ts ["P16B-3"] 继续复用/system/master-data单页多Tab
7 P16B-5 请假日历增强计算器 在leave服务中新增可选日历版请假天数计算器并通过feature flag按法体默认日历读取 关闭开关时结果与现有自然日算法一致 打开后可识别holiday adjusted_workday cd server && npm run test manual DONE DONE DONE server/src/services/leave.js | server/src/routes/leave.js | server/src/services/featureFlags/index.js ["P16B-3"] 默认关闭且仅增强requestedDays计算不改账本语义
8 P16B-6 P16B回归与矩阵收口 完成日历主数据手工验证 请假算法双模式验证 并同步feature-matrix事实源 CSV 矩阵 回归与越权负测全部通过 cd server && npm run test && ./scripts/regression-all.sh && cd ../client && npm run typecheck && npm run build && python3 scripts/validate-feature-matrix.py manual DONE DONE DONE docs/feature-matrix.md | scripts/validate-feature-matrix.py | issues/2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv ["P16B-4","P16B-5"] 已完成finance只读 finance_mgr可维护 默认日历禁止归档与开关双模式验证