Files
tech-achievement-management…/TODO_assigned_departments_design.md
2026-04-19 14:05:40 +08:00

160 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TODO: 成果归属部门设计评审
## 1. 文档目的
本文件用于说明当前系统“成果归属部门(`assigned_departments`)”的实现现状、已暴露的业务问题,以及推荐的改造方向,供管理层评审后再确定最终实施方案。
当前阶段仅做方案评审,不进行数据库结构变更。
---
## 2. 现有设计(当前线上逻辑)
### 2.1 数据结构
- `achievements.assigned_departments``TEXT[]`,用于记录成果归属部门数组。
- `achievements.contributors``JSONB`,记录完成人列表(含 `name/phone/isMain/ranking/...`)。
- 统计与权限大量依赖 `assigned_departments`
### 2.2 归属部门计算方式(新增/修改)
当前归属部门是这样算的:
1. 先确定主要完成人(`isMain=true`)。
2. 用主要完成人手机号去 `users` 反查其部门。
3. 将查到的部门去重后写入 `assigned_departments`
这意味着:**成果归属只看“主要完成人”,不看其他参与完成人**。
### 2.3 “主要完成人”来源规则
- 论文:按角色自动推导(第一作者/通讯作者等)。
- 项目/成果转化:由前端勾选 `isMain`
- 其他类型:按最小排名推导主要完成人。
### 2.4 领导部门字典的当前用途
- `dict_leader_departments` 当前主要用于“签批院领导”用户搜索过滤(如技术报告签批)。
- 它不直接参与 `assigned_departments` 的计算。
### 2.5 依赖场景
- 列表与可见范围过滤(如按部门可见)。
- 统计分析(按部门产出、趋势等)。
- 字典删除联动(部门删除时,成果归属中的对应部门会被替换为“待定”)。
---
## 3. 已出现的业务问题
### 问题 A:院领导主完成人导致归属失真
当业务上院领导必须/经常被标记为主要完成人时,归属部门会集中到“院领导部门”,导致:
- 业务承接部门贡献被淹没;
- 统计图偏向领导部门,失去决策价值;
- 跨部门协同成果无法准确反映。
### 问题 B:多部门参与信息丢失
一个成果可能有 3-4 个部门参与,但当前仅按主完成人计算,导致:
- `assigned_departments` 不完整;
- 基于部门的权限与统计存在系统性偏差。
### 问题 C:语义混杂
当前“归属部门”既被当作统计口径,也隐含承载了“牵头责任”含义,但这两个概念在业务上并不等价。
---
## 4. 推荐改造方案(不改库结构,优先)
## 4.1 目标
- 归属部门改为“参与部门口径”,提高统计与查询真实性。
- 保持当前表结构和现有 API 兼容,降低上线风险。
## 4.2 核心规则(推荐)
`assigned_departments` 改为按以下顺序计算:
1.`contributors` 中取所有完成人手机号;
2. 反查这些用户所属部门并去重;
3. 排除无效值(空、null 等);
4. 读取 `dict_leader_departments`
- 默认将领导部门从归属集合剔除(防止“院领导部门吞噬”);
5. 如果剔除后为空:
- 回退到提交人部门;
6. 若提交人部门也不可用:
- 回退为 `['待定']`
> 说明:该方案不需要新增字段,直接替换归属计算逻辑即可。
## 4.3 同步改造点
- 新增成果时:使用新规则计算。
- 编辑成果时:使用同一套新规则重算。
- 封装公共函数 `computeAssignedDepartments(...)`,避免两处逻辑分叉。
## 4.4 历史数据处理(建议)
提供一次性回填脚本,重算历史成果 `assigned_departments`,否则新老口径并存会导致统计长期不一致。
建议执行流程:
1. 开发机全量跑脚本;
2. 抽样对比典型成果(院领导参与、多部门参与、单部门项目);
3. 生产低峰执行;
4. 保留执行前快照,支持快速回滚。
---
## 5. 备选方案(供比较)
### 方案 B:保留“主完成人口径”,仅加领导部门排除
- 优点:改动最小。
- 缺点:多部门参与问题仍未解决,仍会有归属缺失。
- 结论:不推荐作为长期方案。
### 方案 C:双口径(归属部门 + 牵头部门)
- 优点:业务语义最清晰。
- 缺点:通常需要新增字段与更多改造(前后端、统计、权限口径梳理)。
- 结论:作为二期优化可评估;本期若要求“尽量不动数据库”,不优先。
---
## 6. 待管理决策项(请示时建议重点确认)
- 是否同意“归属部门 = 参与部门口径”?
- 是否同意默认剔除领导部门字典中的部门?
- 剔除后为空时,是否同意“提交人部门优先,最后回退待定”?
- 是否同意执行历史数据回填(推荐执行)?
- 统计报表是否继续沿用 `assigned_departments`(本期建议继续沿用)?
---
## 7. TODO 清单(待批准后执行)
- [ ] 确认最终业务口径(本文件第 6 节)
- [ ] 设计并评审 `computeAssignedDepartments` 规则细节
- [ ] 修改新增成果归属计算逻辑
- [ ] 修改编辑成果归属重算逻辑
- [ ] 增加回填脚本(仅更新 `assigned_departments`
- [ ] 生成回填前后抽样对比报告
- [ ] 验证权限与统计页面关键场景
- [ ] 安排生产执行窗口与回滚预案
---
## 8. 风险与控制
- 风险:归属口径改变后,统计口径会发生可见变化。
- 控制:上线公告中明确“统计口径优化”;保留回填前快照用于追溯。
- 风险:部分历史成果完成人手机号与用户表不一致,可能回退到“待定”。
- 控制:先跑演练报告,输出异常清单再决定是否人工修正。