======= 研发任务管理系统 H5 — 冷启动文件 =======
> 版本: 2.2 | 更新: 2026-09-06 | 用途: 研发任务管理系统(含库房集成)的冷启动/重建/排障手册
> ⚠️ **功能保全铁律(用户定稿):本系统功能只增不减,改版前先读本文件,改完逐项验证,功能不允许丢失。**
> ⚠️ **测试铁律:测试必须用独立数据/独立进程,严禁污染生产数据(rd_tasks.json/accounts.json/store.db)。**
====== 一、系统概述 ======
**研发任务管理 + 研发库房管理 一体化系统**(钉钉生态):
- **任务**:任务看板(跟踪任务/临时任务)、筛选(优先级/项目/状态/更新天数/搜索)、人员筛选、新增任务、更新记录(带时分+附件+可删)、子任务(进度联动)、工时统计、日报生成
- **账户体系**:管理员(武燕青)全权;普通用户(钉钉人员)只看自己任务、可编辑自己任务;管理员可配置用户权限
- **登录**:钉钉统一认证(JSAPI 免登 requestAuthCode / OAuth 授权码 / 工作台 authCode 三通道)
- **库房集成**:底部导航 3 tab(任务/库房/我的);库房 = 研发库房管理(独立子系统,蓝图挂载)
- **线上地址**:https://rd.huiflytech.com(Caddy HTTPS)= https://rd.huiflytech.com/rd/(任务)、/store/(库房)
====== 二、部署架构 ======
用户/钉钉 → https://rd.huiflytech.com (Caddy :443/:80 自动 HTTPS)
→ rd-h5.service (systemd, Flask :13544, 统一进程)
├─ /rd/* → 任务前端 + API(rd_h5.py + rd_h5.html)
├─ /store/* → 库房前端 + API(rd_store.py 蓝图 + rd_store.html)
└─ /api/* → 任务 API
- systemd 服务:`rd-h5.service`(ExecStart=/home/ubuntu/projects/ctwing-2/venv/bin/python /home/ubuntu/.hermes/scripts/rd_h5.py,端口 13544)
- Caddy:`/etc/caddy/Caddyfile`(rd.huiflytech.com → 127.0.0.1:13544;80→443 自动跳转;Let's Encrypt 自动证书)
- 数据目录:`/home/ubuntu/docs/`
====== 三、数据文件 ======
| 文件 | 内容 | 说明 |
|------|------|------|
| `rd_tasks.json` | 任务数据(items/updated_at)| 主数据;normalize 兼容字段 |
| `accounts.json` | 账户体系 | roles.admin(武燕青)/roles.user/perms(用户权限)/pwds |
| `people.json` | 人员库 | 简称→全名(钉钉通讯录);**注意:无 roles 字段**(admin 判定在 accounts.json)|
| `ding_org.json` | 钉钉通讯录全量 | MCP 同步缓存(17 人:姓名/userid/部门);/api/ding/org 优先读此文件 |
| `leave.json` | 钉钉请假记录 | MCP OA 同步(cron 0210e63abf25 工作日 08:30)|
| `tags.json` | 标签库 | 任务标签(默认/周报汇报 + 自定义)|
| `store.db` | 库房 SQLite | samples/requests/history 表(软删除 deleted 标记)|
| `.env` | 凭证 | DINGTALK_CLIENT_ID/SECRET(慧飞任务应用 dingh2ogz...)、DINGTALK_CORP_ID=4901944860、HALO_DB_PASSWORD 等 |
====== 四、核心功能 ======
===== 1. 任务看板 =====
- 任务类型:跟踪任务([优先级](项目)内容)/ 临时小任务(⏱️ 当天)
- 筛选:优先级/项目/状态/未更新天数(工作日)/搜索;人员标签筛选(点击)
- 人员标签:显示所有有任务人(从任务提取);"+ 更多"打开钉钉通讯录全量(17 人)
- 任务详情:状态/进度/负责人/子任务(进度联动)/更新记录(带时分+附件)/总耗时
===== 2. 账户体系(2026-08-31) =====
- 管理员:武燕青(全部权限:查看/编辑/删除所有任务、账号管理、生成日报、新增)
- 普通用户:只见自己任务(负责人=自己或子任务负责人=自己,简称/全名变体匹配 is_mine)、可编辑/删除自己任务(can_edit/can_delete)
- 权限配置:管理员「账号管理」弹窗(view_own_only/edit_own/delete_own/manage_subtask 开关 + 设置口令)
- 后端强制校验:can_edit/can_delete 在 update_task/add_note/del_note/del_task/subtask_note 接口执行(403)
- ⚠️ isAdmin 判定:统一账户体系(USER_ROLE=admin 或 名字=武燕青);**不依赖 people.json roles(空)**
===== 3. 钉钉统一认证(3 通道) =====
- **JSAPI 免登**(主,钉钉内):UA 检测 DingTalk → 加载 dingtalk.open.js → requestAuthCode({corpId: ding3049357e0fcfed24f5bf40eda33b7ba0}) → code → /api/ding/login(gettoken+getuserinfo)→ 自动登录
- **OAuth 授权码**(浏览器):/api/ding/oauth/url 生成授权 URL → 回跳 /rd/ding_cb?code → /api/ding/oauth/cb(userAccessToken+users/me)→ 登录
- **工作台 authCode**:URL 带 authCode → 直接 dingLogin(失败自动降级 JSAPI)
- 登录态:localStorage rd_user(同域任务/库房共享);登录用户自动退出只读模式(exitReadonly)
===== 4. 周报生成(2026-08-31) =====
- 📊 生成周报按钮(btnWeek,管理员):/api/report/week 生成**上一周**研发工作周报
- 三部分:①研发项目推进(各项目在管/更新/新增/完成+主要进展总结式)②研发管理推进(任务系统/库房系统运行状态)③研发任务日报(正常推进)
- 弹窗显示 + 📋 复制按钮;⚠️ 弹窗打开必须 classList.add('open')(style.display 会导致关闭按钮失效)
===== 4.x 统一项目列表:任务 → 测试 / 库房 / 评审会(2026-09-17) =====
**需求**:研发任务系统管理员可**手动添加项目**;项目列表**同步**到测试系统、库房系统、评审会三个子模块。
**① 数据源(唯一)**
- 文件:`/home/ubuntu/docs/projects.json`(数组,首次自动生成默认 13 项)
- 默认:拓远T1 / 普惠P1 / 金穗S1 / LoRa网关 / P3 / P5 / 流量计 / 表压 / 软管泵 / 施肥阀 / 施肥机 / 生产订单 / 其他
**② 后端接口**(`rd_h5.py`)
| 方法 | 路径 | 权限 | 说明 |
|---|---|---|---|
| GET | `/api/projects` | 全员 | 返回 `{ok, projects:[...]}` |
| POST | `/api/projects` | **仅管理员**(`is_admin`)| `{action:"add"/"del"/"rename"/"move", name, old?, dir?}` |
- `add` 重名拦截 400;`del` 不存在 400;`rename` 校验新旧名;`move` 上移/下移排序
- 关键函数:`load_projects()` / `save_projects(lst)` / `api_projects()`
**③ 四处接入**
| 系统 | 文件 | 接入方式 |
|---|---|---|
| 研发任务 | `rd_h5.html` | `loadProjects()` 启动时拉取覆盖 `PROJ_LIST`;管理员见顶部「⚙️ 项目管理」按钮 → `projManage()` 面板(列表 + 添加 + 删除 + 改名 + ▲▼排序);`projRefreshUI()` → 调用 `load()` 刷新 |
| 评审会 | `review.html` | `PROJECTS` 全局 + 启动 `loadProjects()`;`renderEdit()` 的项目下拉改用 `PROJECTS`(当前值不在列表时自动补入)|
| 库房 | `rd_store.html` | `META.projects` 合并统一列表;`hisProj` datalist 与顶部「项目(全部)」筛选下拉同步刷新 |
| 测试 | `test.html` | 物料编码输入框加 `list="projDL"` + `loadProjects()` 填充项目名提示(2 处输入框)|
**④ 项目筛选框支持"直接输入新建"(2026-09-17 追加)**
- UI:`