Files
tech-achievement-management…/第一次升级.md
T
2026-04-19 14:05:40 +08:00

9.2 KiB
Raw Blame History

第一次升级

1. 升级目标

  • 不改 PostgreSQL 现有数据与表结构。
  • 不改服务器文件存储路径(UPLOAD_DIR / UPLOAD_FALLBACK_DIRS)。
  • 通过“代码 + 前端构建产物”发布完成升级。
  • 修复现有高优先级缺陷并增强安全性与稳定性。

2. 约束与发布原则

  • 不执行任何初始化/造数脚本(如 init-dbseedcreate_dbsetup)。
  • 服务器 .env 保持原值(尤其数据库与上传目录相关配置)。
  • 采用兼容式修改,避免破坏现网接口与数据。

3. 升级计划(逐项完成)

状态说明:

  • [ ] 待处理

  • [-] 处理中

  • [x] 已完成

  • 01. 建立本升级文档与执行清单

  • 02. 修复成果编辑接口运行时错误与权限判断

  • 03. 前端移除 URL token 传递(导出/下载改为 Header 认证)

  • 04. 上传安全加固(文件大小/数量限制、通知附件类型限制)

  • 05. 上传失败时清理已落盘文件,避免孤儿文件

  • 06. 数据库配置兼容修复(DB_DATABASE/DB_NAME

  • 07. 数据库连接池错误策略优化(避免进程直接退出)

  • 08. 整体回归检查与发布说明整理

4. 变更记录

  • 2026-02-25:创建文档与首轮升级清单。
  • 2026-02-25:修复 GET /api/achievements/:id 的运行时错误(移除未定义变量 parsedContributors 的错误逻辑)。
  • 2026-02-25:修复 PUT /api/achievements/:id 事务提前返回未回滚问题(补充 ROLLBACK)。
  • 2026-02-25:修复 DELETE /api/achievements/:id 事务提前返回未回滚问题(补充 ROLLBACK)。
  • 2026-02-25:成果上传接口补充 JSON 解析失败时的落盘文件清理。
  • 2026-02-25:通知发布接口补充附件限制与异常清理,content 改为净化后入库(不改表结构)。
  • 2026-02-25:前端导出/下载去除 URL token,统一改为 Authorization Header + Blob 下载。
  • 2026-02-25:数据库连接配置兼容 DB_DATABASE / DB_NAME,连接池 idle error 不再 process.exit(-1)
  • 2026-02-25:后端语法检查通过;前端 npm run build 编译通过。
  • 2026-02-25:本次新增与更新内容全部按 UTF-8 编码保存。
  • 2026-02-26:统计页新增“统计口径说明”和 AI 安全说明文案;新增“部门独立完成 / 合作项目统计表”。
  • 2026-02-26AI Prompt 优化为结构化管理汇报模板(执行摘要/关键发现/独立合作解读/风险/行动建议/一句话结论)。
  • 2026-02-26:修复统计接口 500text <> varchar[]/text[] 类型兼容问题),统一在 SQL 中显式转换为 text[],并同步修复 AI 分析同口径查询。
  • 2026-02-26AI 分析结果前端改为 Markdown 渲染(支持标题/列表/表格等格式),提升可读性。
  • 2026-02-26:AI 提示词精简;传给模型的数据改为语义化摘要(类型/状态中文化、TopN 与占比、近 24 个月趋势),降低上下文长度并提升分析速度。
  • 2026-02-26:AI 分析新增流式输出(边生成边显示);前端新增“清空输出”按钮(生成中可中止并清空)。
  • 2026-02-26:取消后端 max_tokens 人工上限(输出长度不再由项目侧硬限制,受模型侧能力约束)。
  • 2026-02-26AI 功能权限扩展至 senior_user(高级用户)与 intermediate_user(中级用户),前后端权限口径保持一致。
  • 2026-02-26:成果列表/成果详情/导出接口的 assigned_departments 返回口径统一排除院领导部门(与统计页口径一致)。
  • 2026-02-26:修正部门过滤边界:若某条成果过滤院领导部门后为空,则回退显示原始部门,避免“无归属部门”展示问题。
  • 2026-02-26:成果归属部门计算改为“全体完成人手机号对应部门去重后统计”,并在写库时过滤院领导部门(不再仅按主要完成人计算)。
  • 2026-02-26:归属部门规则再次调整为“单归属部门”:
    • 优先按主要完成人顺序取部门;
    • 若命中院领导部门则按顺序回退到下一个完成人,取第一个非院领导部门;
    • 若全部均为院领导部门,则回退首个部门,保证每条成果只有 1 个归属部门。
  • 2026-02-27:统计页下线“部门独立完成 / 合作项目统计表”(当前每个项目仅归属 1 个部门,该表不再提供有效增量信息)。
  • 2026-02-27:成果相关全入口口径收敛为单归属部门(成果公示/全部成果/我的成果/详情权限/部门筛选/统计/AI 分析统一),并对历史多部门数据按“首个非院领导,否则首个部门”规则读取时归一。
  • 2026-02-27:统计页新增“AI 年份筛选与图表年份联动”:在 AI 卡片选择年份后,下方部门分布/类型分布/部门种类统计三图同步切换;年份来源保持动态,无硬编码年份。

5. 服务器端操作(全部完成后填写)

    1. 先备份服务器现有代码目录和前端静态目录(保留可回滚版本)。
    1. 保持服务器 .env 不变,尤其是 DB_*UPLOAD_DIRUPLOAD_FALLBACK_DIRS
    1. 只上传本次变更的后端代码与前端构建产物(client/build 或你实际部署目录下的 dist)。
    1. 不执行任何数据库初始化、迁移、造数脚本(init-db/seed/create_db/setup)。
    1. 重启 Node 服务进程(pm2 restart ...systemctl restart ...,按你现网方式)。
    1. 发布后烟测:
    • 成果详情页打开(GET /api/achievements/:id)。
    • 成果修改/删除权限验证(普通用户、超管各测一次)。
    • 成果附件下载、CSV 导出、ZIP 导出。
    • 通知发布(带附件与异常附件各测一次)。
    • 统计分析页:部门统计已排除院领导部门;每条成果仅计入一个归属部门。
    • 统计分析页:不再显示“部门独立完成 / 合作项目统计表”。
    • AI 分析:可在 auto / qwen / deepseek 切换,返回提供方与尝试顺序。
    1. 若异常,先回滚代码与前端静态文件,不回滚数据库(本次未做数据库结构变更)。

6. 功能扩展:AI 分析(2026-02-25

6.1 功能目标

  • 在“统计分析”页面增加 AI 分析入口。
  • 使用后端调用大模型 API 生成分析结论,前端仅展示结果。
  • 保持数据库与文件存储路径不变,不做任何表结构变更。

6.2 安全策略(已实现)

  • 不向大模型发送附件内容。
  • 不向大模型发送附件路径与文件名。
  • 不向大模型发送完成人手机号和姓名。
  • 仅发送脱敏后的聚合统计数据(类型分布、状态分布、部门分布、月度趋势、质量计数)。
  • 接口权限限制为管理员/超级管理员可用。

6.3 本次新增文件与改动

  • 新增后端路由:server/routes/aiAnalysis.js
  • 挂载后端路由:server/index.js -> /api/ai-analysis
  • 新增 AI 配置示例:server/.env.example
  • 前端入口与交互:client/src/pages/Statistics.js
  • 新增提供方选择:自动 / 千问 / DeepSeek / custom
  • 新增自动回退:按优先级依次尝试(可配置)

6.4 服务器端新增配置

在服务器 .env 新增(或确认)以下变量:

AI_DEFAULT_PROVIDER=auto
AI_PROVIDER_PRIORITY=qwen,deepseek,custom

QWEN_API_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
QWEN_API_KEY=你的千问Key
QWEN_MODEL=qwen-plus

DEEPSEEK_API_BASE_URL=https://api.deepseek.com/v1
DEEPSEEK_API_KEY=你的DeepSeekKey
DEEPSEEK_MODEL=deepseek-chat

# 可选:自定义网关/代理
AI_API_BASE_URL=
AI_API_KEY=
AI_MODEL=

AI_TIMEOUT_MS=45000
AI_MAX_TOKENS=1600

说明:

  • AI_DEFAULT_PROVIDER=auto 时,按 AI_PROVIDER_PRIORITY 顺序尝试。
  • 前端可手动指定单一提供方,也可选“自动”。
  • 私有网段网关可放在 AI_API_BASE_URLcustom)中使用(http/https 均支持)。

6.5 上线后测试点

    1. 管理员/超管登录,进入“统计分析”页面,确认出现“AI 智能分析(脱敏)”卡片。
    1. 选择筛选条件并输入问题,点击“生成 AI 分析”应返回文本结果。
    1. 普通用户账号不应可用该功能(无入口或接口返回 403)。
    1. 服务器日志确认无附件路径、文件名、手机号、姓名外发日志。

6.6 统计口径调整(院领导部门过滤)

  • 部门相关统计(部门分布、部门类型交叉、部门趋势)统一排除 dict_leader_departments 中配置的院领导部门。
  • 成果归属采用“单归属部门”写库规则(按主要完成人顺序回退到首个非院领导部门;若均为院领导则回退首个部门)。
  • 统计页已下线“部门独立完成 / 合作项目统计表”。
  • AI 分析入参与统计页保持同口径(排除院领导部门,不再传递独立/合作统计字段)。

6.7 文案与 Prompt 优化(2026-02-26

  • 前端统计页新增口径提示文案,明确“排除院领导部门 + 单归属部门计数”。
  • AI 卡片新增安全提示文案,明确仅发送脱敏聚合数据,不发送附件信息和个人敏感信息。
  • AI 系统提示词改为结构化输出,支持直接用于院级管理汇报。
  • 输出要求强调“先结论、后证据、再建议”,并在数据不足时必须显式提示证据不足。