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

5.5 KiB
Raw Permalink Blame History

TODO: 成果归属部门设计评审

1. 文档目的

本文件用于说明当前系统“成果归属部门(assigned_departments)”的实现现状、已暴露的业务问题,以及推荐的改造方向,供管理层评审后再确定最终实施方案。

当前阶段仅做方案评审,不进行数据库结构变更。


2. 现有设计(当前线上逻辑)

2.1 数据结构

  • achievements.assigned_departmentsTEXT[],用于记录成果归属部门数组。
  • achievements.contributorsJSONB,记录完成人列表(含 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. 风险与控制

  • 风险:归属口径改变后,统计口径会发生可见变化。

  • 控制:上线公告中明确“统计口径优化”;保留回填前快照用于追溯。

  • 风险:部分历史成果完成人手机号与用户表不一致,可能回退到“待定”。

  • 控制:先跑演练报告,输出异常清单再决定是否人工修正。