docs(manager_projects): 更新修复记录 + 索引表 + §10 标已修 (P1/P2 5 项)

修复记录章节加 6 条 (2026-08-18):
- #7 batchScoreRows 死代码删除
- #5 4 处 console 调试删除
- #9 日期选择器 value-format 对齐 type
- #12 biz_project 加 idx_sponsor_admin_user_id
- #13 biz_project 加 idx_start_end_time 复合索引
- #14 biz_project_assign 加 uk_project_unit UNIQUE (executor 分配防重复)

§7 索引表更新:
- biz_project 7 个 (新增 idx_sponsor_admin_user_id + idx_start_end_time)
- biz_project_assign 5 个 (新增 uk_project_unit)

§10 待修复列表 5 项标 ~~删除线~~ (5/7/9/12/13/14)
This commit is contained in:
郭庆泰
2026-08-18 22:12:28 +08:00
parent 8e43960481
commit c3b6212478
+18 -12
View File
@@ -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 处 `<if test="... != null and ... != ''">` 改为 `<if test="... != null">` (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) | 加 `<if test="managerScore != null">` 过滤 | **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** |