diff --git a/_self/manager_projects.md b/_self/manager_projects.md index 047fee4..1c523ed 100644 --- a/_self/manager_projects.md +++ b/_self/manager_projects.md @@ -12,6 +12,12 @@ |---|---|---| | 2026-08-18 | §6.3 / §9.1 | **BizProject.projectId** String → Long (9 文件: domain / IBizProjectService / BizProjectServiceImpl / BizProjectMapper.java+xml / BizProjectController / BizExecutionIntentController / BizPublicityIntentController / BizPublicController)。SnowflakeId.injectIfEmpty 反射依赖 setter(String), Long 后会抛 NoSuchMethodException 被吞掉 (SnowflakeId.java:30-31), 安全 — 但显式删掉更干净 (biz_project 用 AUTO_INCREMENT)。 | | 2026-08-18 | §6.3 / §9.1 | **BizProject.startTime / endTime** String → Date, 加 `@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")` (跟 BizMeeting 一致)。Mapper XML 8 处 `` 改为 `` (Date 无 isEmpty, OGNL 会报错)。前端 el-date-picker value-format "YYYY-MM-DD HH:mm:ss" 双向兼容, 零前端改动。 | +| 2026-08-18 | §10 #7 | **`batchScoreRows` 死代码删除** (Projects.vue:501)。注释说"保留兼容旧引用", 但 grep 全文 0 个引用, 纯死变量。 | +| 2026-08-18 | §10 #5 | **生产代码残留 console.info/error 4 处删除** (Projects.vue:299, 302, 306, 874)。`load()` 进/出/失败各一处 + 路由 watch reload 一处, 共 4 行, 全部删除。 | +| 2026-08-18 | §10 #9 | **日期选择器 value-format 对齐 type** (Projects.vue:17, 19)。原 `type="date"` + `value-format="YYYY-MM-DD HH:mm:ss"` 矛盾 (date picker 给不出 HH:mm:ss), 改 value-format 为 `YYYY-MM-DD`, MySQL 对 datetime 列隐式转换。 | +| 2026-08-18 | §7.1 / §10 #12 | **DB: biz_project 加索引 `idx_sponsor_admin_user_id`**。ALTER TABLE biz_project ADD INDEX idx_sponsor_admin_user_id (sponsor_admin_user_id)。EXPLAIN 验证: type=ref, Extra=Using index。 | +| 2026-08-18 | §7.1 / §10 #13 | **DB: biz_project 加复合索引 `idx_start_end_time (start_time, end_time)`**。比 2 个单列索引更适合 `WHERE start_time >= ? AND end_time <= ?` 的范围查询。EXPLAIN 验证: type=range, Extra=Using where; Using index。 | +| 2026-08-18 | §7.2 / §10 #14 | **DB: biz_project_assign 加 UNIQUE `uk_project_unit (project_id, execution_unit_id)`**。先查 11 行 0 重复, 安全。防重复分配。注意: `biz_project_assign` 是 **项目→executor (执行方)** 分配表, 不是 sponsor; sponsor 走独立的 `biz_project_sponsor_assign`。 | --- @@ -284,9 +290,9 @@ CREATE TABLE `biz_project` ( | idx_project_form | project_form | ✅ 项目形式过滤 | | idx_is_finished | is_finished | ✅ 是否结题过滤 | | idx_is_settled | is_settled | ✅ 是否结算过滤 | -| ❌ **缺** | sponsor_admin_user_id | ⚠️ `selectSponsorList` WHERE `sponsor_admin_user_id = ?` | -| ❌ **缺** | lead_user_id | ⚠️ 主表没用,但 JOIN sys_user 用 | -| ❌ **缺** | start_time / end_time | ⚠️ 范围查询 `>= ? AND <= ?` | +| idx_sponsor_admin_user_id | sponsor_admin_user_id | ✅ `selectSponsorList` WHERE `sponsor_admin_user_id = ?` | +| idx_start_end_time | (start_time, end_time) | ✅ 范围查询 `start_time >= ? AND end_time <= ?`,EXPLAIN 验证 type=range | +| ❌ **缺** | lead_user_id | ⚠️ 主表没用,但 JOIN sys_user 用 — 可接受,小数据量 | ### 7.2 biz_project_assign 索引 @@ -296,7 +302,7 @@ CREATE TABLE `biz_project` ( | idx_assign_project | project_id | ✅ `SELECT WHERE project_id = ?` | | idx_assign_unit | execution_unit_id | ✅ | | idx_assign_exec_user | exec_user_id | ✅ | -| ❌ **缺** | UNIQUE (project_id, execution_unit_id) | ⚠️ **业务上** "一个项目 + 一个执行方" 应唯一,否则可能重复分配 | +| **uk_project_unit** | (project_id, execution_unit_id) UNIQUE | ✅ 防重复分配 (实测 11 行 0 重复, 安全) | ### 7.3 biz_project_rating 索引 @@ -308,7 +314,7 @@ CREATE TABLE `biz_project` ( | idx_pr_rater | rater_id | ✅ | | idx_pr_rating_time | rating_time | ✅ 按时间排序 | -> **结论**:rating 表索引设计优秀(uk_rating 三元组唯一约束)。project 表索引够用但**不够优化**(4 个 WHERE 列无索引),assign 表缺唯一约束 +> **结论**:rating 表索引设计优秀(uk_rating 三元组唯一约束)。project 表索引已补齐 (7 个, 涵盖所有 WHERE 列)。assign 表唯一约束到位 (uk_project_unit 防重复分配)。 --- @@ -384,16 +390,16 @@ CREATE TABLE `biz_project` ( | 2 | `confirmDeleteAnn` 引用了不存在的字段 `noticeUrl/scheduleUrl/isPublished` | `Projects.vue:411-419` + `BizProject.java:113-122` | 要么补 DDL,要么删实体字段;mapper 不更新这些字段导致功能部分失效 | **P0** | | 3 | `managerScore` 筛选前端有,后端 selectList 不读 | `BizProjectMapper.xml:141-183` (selectList) | 加 `` 过滤 | **P0** | | 4 | 下拉菜单 `divided` 冗余 (activate/delAnn 双分隔线) | `Projects.vue:100-101` | 删 `activate` 的 `divided` | **P1** | -| 5 | 生产代码残留 console.info/error (4 处) | `Projects.vue:299, 302, 306, 875` | 全删 | **P1** | -| 6 | 评分默认值不一致 | `Projects.vue:502 vs 514` | 统一为 0 或 5 | **P2** | -| 7 | `batchScoreRows` 死代码 | `Projects.vue:501` | 删 | **P2** | +| 5 | ~~生产代码残留 console.info/error (4 处)~~ | ~~`Projects.vue:299, 302, 306, 875`~~ | ✅ 已修 (见 §修复记录) | — | +| 6 | 评分默认值不一致 | `Projects.vue:501 vs 513` | 统一为 0 或 5 | **P2** | +| 7 | ~~`batchScoreRows` 死代码~~ | ~~`Projects.vue:501`~~ | ✅ 已修 (见 §修复记录) | — | | 8 | `isSettled` 筛选但表格无列显示 | `Projects.vue:26-30` vs §4.2 表 | 加列 或 删筛选 | **P2** | -| 9 | 日期选择器 `value-format="YYYY-MM-DD HH:mm:ss"` 跟 `type="date"` 不匹配 | `Projects.vue:17, 19` | 改 `type="datetime"` 或 value-format 用 `YYYY-MM-DD` | **P1** | +| 9 | ~~日期选择器 `value-format="YYYY-MM-DD HH:mm:ss"` 跟 `type="date"` 不匹配~~ | ~~`Projects.vue:17, 19`~~ | ✅ 已修 (见 §修复记录) | — | | 10 | 重复 score table HTML (批量评分 + 单条评分) | `Projects.vue:201-213, 257-269` | 抽公共组件 | **P2** | | 11 | 2 个导出按钮是 stub (`exportProjects` / `exportEval`) | `Projects.vue:347-348` | 实装 或 删按钮 | **P2** | -| 12 | biz_project 缺索引 `sponsor_admin_user_id` | `DB` | 加 `idx_sponsor_admin_user_id` | **P1** | -| 13 | biz_project 缺索引 `start_time`, `end_time` (范围查询) | `DB` | 加 `idx_start_time`, `idx_end_time` 或组合索引 | **P2** | -| 14 | biz_project_assign 缺 UNIQUE (project_id, execution_unit_id) | `DB` | 加唯一约束防重复分配 | **P1** | +| 12 | ~~biz_project 缺索引 `sponsor_admin_user_id`~~ | ~~`DB`~~ | ✅ 已修 (见 §修复记录) | — | +| 13 | ~~biz_project 缺索引 `start_time`, `end_time` (范围查询)~~ | ~~`DB`~~ | ✅ 已修 (见 §修复记录) | — | +| 14 | ~~biz_project_assign 缺 UNIQUE (project_id, execution_unit_id)~~ | ~~`DB`~~ | ✅ 已修 (见 §修复记录) | — | | 15 | `is_finished` 和 `is_settled` 状态值约定不一致 (0/1 vs Y/N) | `BizProject.java:65-68` + mapper | 统一约定 (要么全 0/1 要么全 Y/N) | **P3** | | 16 | selectList / selectExecutorList 有 4 个相关子查询 | `BizProjectMapper.xml:46-50, 110-124` | 数据小可接受,但应记录为 P3 待优化 | **P3** | | 17 | `.score-row` CSS 死样式 | `Projects.vue:926-928` | 删 | **P3** |