feat(project): 添加项目完成前置校验功能

- 新增 PROJECT_COMPLETE_PRECONDITION_NOT_MET 错误码用于项目完成校验失败提示
- 将任务附件错误码段从 1_008_007 调整至 1_008_010 避免编号冲突
- 添加 PROJECT_ACTION_COMPLETE 常量用于项目完成操作标识
- 在执行完成时触发 onExecutionCompleted 钩子方法用于后续推送逻辑
- 新增 countNonTerminalByProjectId 方法统计项目下非终态执行/需求/任务数量
- 实现 collectCompletionGaps 和 validateProjectCompletable 方法进行项目完成前置校验
- 在项目状态变更时增加对 complete 操作的特殊校验逻辑
- 添加 ProjectRequirementConstants 接口暴露需求对象类型常量供跨类使用
- 新建 SQL 脚本为项目完成校验查询创建必要的数据库索引
- 补充 ProjectServiceImplTest 测试用例验证项目完成校验功能
This commit is contained in:
2026-06-08 09:59:22 +08:00
parent 622b30733e
commit ab5b00470c
12 changed files with 236 additions and 9 deletions

View File

@@ -0,0 +1,24 @@
-- TD-015 项目完成校验:按 project_id 数非终态子对象需要的索引
-- MySQL 无 CREATE INDEX IF NOT EXISTS用 information_schema 守卫实现幂等(可重复执行);与演示库补丁 docs/sql/patches/2026-06-05-TD015-完成校验-01.sql 写法一致
-- 需求表:原 idx_rdms_project_requirement_project_status_deleted 实际列为 (status_code, deleted),缺 project_id 前导,补齐
SET @idx := (SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'rdms_project_requirement'
AND INDEX_NAME = 'idx_rdms_project_requirement_proj_status');
SET @sql := IF(@idx = 0,
'CREATE INDEX idx_rdms_project_requirement_proj_status ON rdms_project_requirement (project_id, status_code, deleted)',
'SELECT 1');
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
-- 任务表rdms_task与执行表 idx_rdms_pe_proj_status 对齐,让按项目数非终态任务走覆盖前缀
SET @idx := (SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'rdms_task'
AND INDEX_NAME = 'idx_rdms_task_proj_status');
SET @sql := IF(@idx = 0,
'CREATE INDEX idx_rdms_task_proj_status ON rdms_task (project_id, status_code, deleted)',
'SELECT 1');
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
-- 执行表 rdms_project_execution 已有 idx_rdms_pe_proj_status(project_id, status_code, deleted),无需新增