初始提交:全国记者站管理系统
This commit is contained in:
@@ -0,0 +1,308 @@
|
||||
# REQ-RSMS-001:全国记者站管理系统需求与目标
|
||||
|
||||
> 文档版本:v1.0
|
||||
> 状态:待确认
|
||||
> 编制日期:2026-08-01
|
||||
> 项目缩写:RSMS(Reporter Station Management System)
|
||||
|
||||
## 1. 引言与目标
|
||||
|
||||
### 1.1 建设背景
|
||||
|
||||
当前记者站管理存在数据分散、统计口径不统一、沟通链路长、档案查询不便、人工考核容易出错及决策数据不足等问题。系统面向全国 37 个记者站,将分散工作整合至统一平台。
|
||||
|
||||
### 1.2 建设目标
|
||||
|
||||
1. 实现人员、工作、考核、通知和统计的统一管理。
|
||||
2. 实现日常工作线上填报、分级审核、自动统计和全程留痕。
|
||||
3. 为每位记者建立长期保存、可追溯的个人电子档案。
|
||||
4. 统一考核标准和统计口径,提高考核公平性与透明度。
|
||||
5. 为总部掌握全国运行情况、考核评价和资源配置提供数据支持。
|
||||
|
||||
### 1.3 项目缩写与系统代号
|
||||
|
||||
- 项目英文缩写:**RSMS**
|
||||
- 系统代号:**全国记者站管理系统**
|
||||
- 当前版本:V0.1 MVP(已实现核心流程)
|
||||
|
||||
---
|
||||
|
||||
## 2. 术语表
|
||||
|
||||
| 术语 | 定义 |
|
||||
|---|---|
|
||||
| 总部 / 总站 | 全国记者站管理工作的总部管理机构 |
|
||||
| 记者站 / 分站 / 站点 | 纳入系统管理的 37 个记者站之一 |
|
||||
| 总部管理员 | 负责规则、权限、复核、统计及全局监管的用户 |
|
||||
| 分站负责人 | 负责本站人员管理、工作初审及考核汇总的用户 |
|
||||
| 记者 | 负责工作填报、材料上传和个人信息查询的用户 |
|
||||
| 工作记录 | 记者提交的一次稿件、作品、培训、临时工作等业务记录 |
|
||||
| 考核 | 按规则对工作记录进行审核、计分、汇总和评价的过程 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 角色定义
|
||||
|
||||
| 角色 | 代码 | 主要职责 | 默认数据范围 |
|
||||
|---|---|---|---|
|
||||
| 总部管理员 | `headquarters` | 组织和制度管理、考核规则配置、总部复核、通知发布、全局统计、权限监管 | 全国全部站点及人员 |
|
||||
| 分站负责人 | `station` | 站人员维护、填报初审、本站考核汇总、通知落实 | 所属站点及本站人员 |
|
||||
| 记者 | `reporter` | 工作填报、材料上传、通知查看、成绩和档案查询、个人资料维护 | 本人数据及授权公开信息 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 功能性需求
|
||||
|
||||
### 4.1 身份认证与账号
|
||||
|
||||
| 编号 | 优先级 | 需求(EARS 格式) |
|
||||
|---|---|---|
|
||||
| REQ-AUTH-001 | P0 | 系统 SHALL 支持通过角色模拟切换用户身份,切换后页面导航、数据访问和操作权限须按角色重新渲染。 |
|
||||
| REQ-AUTH-002 | P0 | 系统 SHALL 识别用户角色、所属站点、账号状态和数据权限,并通过 HTTP header `x-user-role` 传递至后端。 |
|
||||
| REQ-AUTH-003 | P0 | 未绑定、停用或离职账号不得访问受保护业务数据(后端数据隔离)。 |
|
||||
| REQ-AUTH-004 | P1 | 系统 SHOULD 支持一名用户拥有多个角色,并可切换当前工作身份。 |
|
||||
| REQ-AUTH-005 | P2 | 系统 MAY 支持真实账号绑定、解绑、重置及异常登录处置。 |
|
||||
|
||||
### 4.2 组织与站点管理
|
||||
|
||||
| 编号 | 优先级 | 需求(EARS 格式) |
|
||||
|---|---|---|
|
||||
| REQ-ORG-001 | P0 | 总部管理员 SHALL 能查看全部 37 个记者站的信息,包括名称、编码、行政区域、负责人、联系方式和状态。 |
|
||||
| REQ-ORG-002 | P1 | 总部管理员 SHALL 能新增、编辑和停用记者站,并保存变更历史。 |
|
||||
| REQ-ORG-003 | P1 | 系统 SHOULD 展示全国地图及记者站分布。 |
|
||||
|
||||
### 4.3 人员管理
|
||||
|
||||
| 编号 | 优先级 | 需求(EARS 格式) |
|
||||
|---|---|---|
|
||||
| REQ-USER-001 | P0 | 总部管理员 SHALL 能新增、编辑、查询和启停人员信息。 |
|
||||
| REQ-USER-002 | P0 | 分站负责人 SHALL 仅能管理所属站点的人员信息。 |
|
||||
| REQ-USER-003 | P0 | 人员信息 SHALL 包含姓名、人员编号、所属站点、职务、入站时间、联系方式、在职状态和账号绑定状态。 |
|
||||
| REQ-USER-004 | P1 | 系统 SHALL 支持在职、离职、调动等状态,并保留任职及站点变更历史。 |
|
||||
| REQ-USER-005 | P1 | 系统 SHOULD 支持按姓名、站点、职务、状态等条件组合查询和导出。 |
|
||||
|
||||
### 4.4 个人电子档案
|
||||
|
||||
| 编号 | 优先级 | 需求(EARS 格式) |
|
||||
|---|---|---|
|
||||
| REQ-PROFILE-001 | P0 | 系统 SHALL 为每位记者建立唯一、长期保存的电子档案。 |
|
||||
| REQ-PROFILE-002 | P0 | 档案 SHALL 聚合基本信息、文字稿件、视频作品、图片作品、培训、获奖和年度考核记录。 |
|
||||
| REQ-PROFILE-003 | P0 | 复核通过的工作和考核结果 SHALL 自动归档,避免二次录入。 |
|
||||
| REQ-PROFILE-004 | P1 | 档案记录 SHALL 显示来源、发生时间、审核状态、得分和证明附件。 |
|
||||
|
||||
### 4.5 工作填报与材料管理
|
||||
|
||||
| 编号 | 优先级 | 需求(EARS 格式) |
|
||||
|---|---|---|
|
||||
| REQ-WORK-001 | P0 | 记者 SHALL 能按业务类型新建工作记录,至少支持:文字稿件、视频供稿、图片供稿、重要报道、培训参与、临时工作。 |
|
||||
| REQ-WORK-002 | P0 | 系统 SHALL 支持草稿保存、编辑、提交、查看详情。 |
|
||||
| REQ-WORK-003 | P0 | 填报字段 SHALL 包括标题、发生/刊发日期、媒体/平台、工作说明及证明材料。 |
|
||||
| REQ-WORK-004 | P0 | 系统 SHALL 校验必填项、数据格式、附件类型/大小。 |
|
||||
| REQ-WORK-005 | P0 | 提交后普通用户不得直接修改;被退回后可依据意见修改并重新提交。 |
|
||||
| REQ-WORK-006 | P1 | 系统 SHOULD 支持图片、文档等材料上传,证明材料作为审核依据。 |
|
||||
|
||||
### 4.6 审核与日常考核
|
||||
|
||||
| 编号 | 优先级 | 需求(EARS 格式) |
|
||||
|---|---|---|
|
||||
| REQ-ASSESS-001 | P0 | 分站负责人 SHALL 在待办中接收本站待审核记录并完成初审。 |
|
||||
| REQ-ASSESS-002 | P0 | 初审 SHALL 支持通过、退回,填写审核意见,并按规则完成初评分。 |
|
||||
| REQ-ASSESS-003 | P0 | 总部管理员 SHALL 对初审通过记录进行复核,支持确认、调整和退回。 |
|
||||
| REQ-ASSESS-004 | P0 | 审核操作 SHALL 记录处理人、处理时间、意见、处理前后状态和分数变化。 |
|
||||
| REQ-ASSESS-005 | P0 | 系统 SHALL 按生效考核规则自动计算单项得分。 |
|
||||
| REQ-ASSESS-006 | P0 | 规则变更不得静默改变已归档结果;重新计算必须经授权并留痕。 |
|
||||
| REQ-ASSESS-007 | P1 | 系统 SHOULD 提供超时待办提醒和审核时效统计。 |
|
||||
|
||||
### 4.7 通知公告
|
||||
|
||||
| 编号 | 优先级 | 需求(EARS 格式) |
|
||||
|---|---|---|
|
||||
| REQ-NOTICE-001 | P0 | 首页 SHALL 展示最新通知,用户可查看详情及附件。 |
|
||||
| REQ-NOTICE-002 | P0 | 系统 SHALL 聚合待填报、待审核、被退回及其他待处理事项。 |
|
||||
| REQ-NOTICE-003 | P1 | 总部管理员 SHOULD 能创建、编辑和发布通知公告。 |
|
||||
| REQ-NOTICE-004 | P1 | 重要通知 SHOULD 支持已读/未读和确认回执统计。 |
|
||||
|
||||
### 4.8 数据统计与报表
|
||||
|
||||
| 编号 | 优先级 | 需求(EARS 格式) |
|
||||
|---|---|---|
|
||||
| REQ-STAT-001 | P0 | 总部 SHALL 能查看全国、地区、站点、人员、时间和工作类型等维度的统计。 |
|
||||
| REQ-STAT-002 | P0 | 统计指标 SHALL 至少包括填报数量、审核进度、通过/退回数量、考核得分和人员排名。 |
|
||||
| REQ-STAT-003 | P0 | 分站负责人 SHALL 仅能查看本站统计,记者仅能查看本人统计。 |
|
||||
|
||||
### 4.9 首页与个人中心
|
||||
|
||||
| 编号 | 优先级 | 需求(EARS 格式) |
|
||||
|---|---|---|
|
||||
| REQ-HOME-001 | P0 | 首页 SHALL 按角色展示常用入口,至少包括通知公告、工作填报、考核成绩、我的档案、待办事项和个人中心。 |
|
||||
| REQ-HOME-002 | P0 | 首页 SHALL 显示待办数量和最新通知,点击可直达对应列表或详情。 |
|
||||
|
||||
### 4.10 系统管理与审计
|
||||
|
||||
| 编号 | 优先级 | 需求(EARS 格式) |
|
||||
|---|---|---|
|
||||
| REQ-SYS-001 | P0 | 系统 SHALL 记录登录、人员/组织变更、规则发布、审核、导出、删除和权限调整等关键操作。 |
|
||||
| REQ-SYS-002 | P0 | 审计日志 SHALL 至少包含操作者、时间、来源、对象、动作、结果及必要的变更摘要。 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 工作记录状态机
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ │
|
||||
▼ │
|
||||
草稿(draft) ──提交──▶ 待分站审核(station_review) ──初审通过──▶ 待总部复核(hq_review) │
|
||||
▲ │ │ │
|
||||
│ │退回 │复核通过 │
|
||||
│ ▼ ▼ │
|
||||
│ 已退回(returned) ──重新提交──▶ 待分站审核 已归档(archived)
|
||||
│ │
|
||||
└── 修改 ────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
- 状态:`draft` → `station_review` → `headquarters_review` → `archived`
|
||||
- 异常:`station_review` / `headquarters_review` 可退回至 `returned`
|
||||
- `returned` 可修改后重新提交
|
||||
|
||||
---
|
||||
|
||||
## 6. 非功能性需求
|
||||
|
||||
### 6.1 性能
|
||||
|
||||
| 编号 | 需求 |
|
||||
|---|---|
|
||||
| NFR-PERF-001 | 常规列表、详情和提交操作的服务端 95 分位响应时间不超过 2 秒(文件上传和复杂报表除外)。 |
|
||||
| NFR-PERF-002 | 月度/年度统计可采用异步计算;用户应能看到计算状态和数据更新时间。 |
|
||||
|
||||
### 6.2 安全
|
||||
|
||||
| 编号 | 需求 |
|
||||
|---|---|
|
||||
| NFR-SEC-001 | 所有受保护接口必须完成身份认证和服务端权限校验。 |
|
||||
| NFR-SEC-002 | 数据按总部、站点和个人范围隔离,禁止仅依赖前端隐藏实现权限。 |
|
||||
| NFR-SEC-003 | 传输过程使用 HTTPS(生产环境);密码、令牌及敏感配置不得明文存储。 |
|
||||
|
||||
### 6.3 可靠性
|
||||
|
||||
| 编号 | 需求 |
|
||||
|---|---|
|
||||
| NFR-REL-001 | 提交、审核和计分等关键操作须具备幂等或防重复机制。 |
|
||||
| NFR-REL-002 | 核心数据应实施定期备份。 |
|
||||
|
||||
### 6.4 兼容性
|
||||
|
||||
| 编号 | 需求 |
|
||||
|---|---|
|
||||
| NFR-COMP-001 | 小程序应兼容项目确定的主流微信版本、iOS 和 Android 系统版本。 |
|
||||
| NFR-COMP-002 | 后台管理系统应兼容 Chrome、Safari、Firefox 等现代浏览器。 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 范围边界
|
||||
|
||||
### 7.1 首期纳入(MVP)
|
||||
|
||||
- 账号登录模拟、人员绑定模拟及三级角色权限(前端切换 + 后端数据隔离)。
|
||||
- 37 个站点和人员基础信息管理。
|
||||
- 工作分类填报、附件上传(上传框 UI)和记录查询。
|
||||
- 分站初审、总部复核、退回修改和流程留痕。
|
||||
- 基础考核规则、自动计分。
|
||||
- 个人电子档案自动归集与查询。
|
||||
- 通知公告(只读)、待办事项。
|
||||
- 后台工作台基础统计和报表导出。
|
||||
- 系统设置入口(仅 UI)。
|
||||
|
||||
### 7.2 首期排除
|
||||
|
||||
- 微信小程序端(后台管理系统优先)。
|
||||
- 真实身份认证(微信/统一身份),当前为角色模拟。
|
||||
- 考核规则可视化配置(硬编码规则)。
|
||||
- 历史数据迁移(37 站/486 人仅 mock 数据)。
|
||||
- 全国地图与管理驾驶舱。
|
||||
- 个人能力画像、智能分析。
|
||||
- 与外部采编、人事、短信、电子签章系统集成。
|
||||
- 申诉与复议流程。
|
||||
- 自动化测试。
|
||||
|
||||
---
|
||||
|
||||
## 8. 关键约束与假设
|
||||
|
||||
| 编号 | 约束 / 假设 | 决策时点 |
|
||||
|---|---|---|
|
||||
| C-001 | 身份认证采用角色模拟(header 传 role),暂不接入微信或统一身份平台。 | 设计前确认 |
|
||||
| C-002 | 总部复核方式采用分类复核,高价值记录逐条复核,普通记录按比例抽查(初始 20%)。 | 设计前确认 |
|
||||
| C-003 | 视频采用外部链接方式,不在系统内存储视频文件。 | 立项前确认 |
|
||||
| C-004 | 文件单文件大小限制为 20 MB。 | 设计前确认 |
|
||||
| C-005 | 首期仅实现后台管理系统(Web),不实现微信小程序。 | 设计前确认 |
|
||||
|
||||
---
|
||||
|
||||
## 9. 验收标准
|
||||
|
||||
### 9.1 AC-01 记者完成工作填报
|
||||
|
||||
- 已绑定且在职的记者可以新建规定类型的工作记录。
|
||||
- 必填项不符合要求时,系统明确提示且不允许提交。
|
||||
- 提交成功后状态为"待分站审核",记者不可直接篡改已提交内容。
|
||||
- 分站负责人待办数量同步增加。
|
||||
|
||||
### 9.2 AC-02 分站初审并退回
|
||||
|
||||
- 分站负责人只能审核本站记录。
|
||||
- 退回时必须填写原因,记者能在待办和记录详情中查看。
|
||||
- 记者修改并重新提交后,历史版本和原审核意见仍可追溯。
|
||||
|
||||
### 9.3 AC-03 总部复核并归档
|
||||
|
||||
- 分站通过的记录进入总部复核队列。
|
||||
- 总部确认后,系统按绑定规则版本计算得分。
|
||||
- 记录进入已归档状态,并自动出现在个人档案及统计中。
|
||||
- 审核人、时间、意见和分数变化完整记录。
|
||||
|
||||
### 9.4 AC-04 数据权限隔离
|
||||
|
||||
- 记者无法访问他人的非公开档案和成绩。
|
||||
- 分站负责人无法访问其他站点的受限数据。
|
||||
- 总部管理员按授权查看全国数据。
|
||||
- 通过修改前端参数或直接访问接口不能绕过上述限制。
|
||||
|
||||
### 9.5 AC-05 统计可核对
|
||||
|
||||
- 总部可按年度、站点、人员和工作类型筛选统计。
|
||||
- 汇总值可下钻至构成该数值的已授权明细。
|
||||
|
||||
### 9.6 AC-06 历史数据可追溯
|
||||
|
||||
- 人员调站后,历史记录仍归属于发生时站点,同时个人档案连续保留。
|
||||
- 规则升级后,既有已归档结果不被自动改写。
|
||||
- 被授权的管理员可查询关键记录的版本、审核和操作轨迹。
|
||||
|
||||
---
|
||||
|
||||
## 10. 需求编号索引
|
||||
|
||||
| 类别 | 编号前缀 | 范围 |
|
||||
|---|---|---|
|
||||
| 身份认证 | REQ-AUTH | REQ-AUTH-001 ~ REQ-AUTH-005 |
|
||||
| 组织站点 | REQ-ORG | REQ-ORG-001 ~ REQ-ORG-003 |
|
||||
| 人员管理 | REQ-USER | REQ-USER-001 ~ REQ-USER-005 |
|
||||
| 电子档案 | REQ-PROFILE | REQ-PROFILE-001 ~ REQ-PROFILE-004 |
|
||||
| 工作填报 | REQ-WORK | REQ-WORK-001 ~ REQ-WORK-006 |
|
||||
| 审核考核 | REQ-ASSESS | REQ-ASSESS-001 ~ REQ-ASSESS-007 |
|
||||
| 通知公告 | REQ-NOTICE | REQ-NOTICE-001 ~ REQ-NOTICE-004 |
|
||||
| 数据统计 | REQ-STAT | REQ-STAT-001 ~ REQ-STAT-003 |
|
||||
| 首页个人 | REQ-HOME | REQ-HOME-001 ~ REQ-HOME-002 |
|
||||
| 系统审计 | REQ-SYS | REQ-SYS-001 ~ REQ-SYS-002 |
|
||||
| 性能 | NFR-PERF | NFR-PERF-001 ~ NFR-PERF-002 |
|
||||
| 安全 | NFR-SEC | NFR-SEC-001 ~ NFR-SEC-003 |
|
||||
| 可靠性 | NFR-REL | NFR-REL-001 ~ NFR-REL-002 |
|
||||
| 兼容性 | NFR-COMP | NFR-COMP-001 ~ NFR-COMP-002 |
|
||||
| 验收场景 | AC | AC-01 ~ AC-06 |
|
||||
| 约束假设 | C | C-001 ~ C-005 |
|
||||
|
||||
---
|
||||
|
||||
> **待确认事项**:以上约束与假设(章节 8)涉及总体架构和关键业务规则,请在进入详细设计前逐条确认。
|
||||
@@ -0,0 +1,307 @@
|
||||
# PRD-RSMS-001:全国记者站管理系统产品需求文档
|
||||
|
||||
> 文档版本:v1.0
|
||||
> 状态:待确认
|
||||
> 编制日期:2026-08-01
|
||||
> 项目缩写:RSMS
|
||||
|
||||
## 1. 产品概述与定位
|
||||
|
||||
全国记者站管理系统(RSMS)是一个面向全国 37 个记者站的管理平台,服务于总部管理员、分站负责人和记者三类角色。系统以工作记录填报和分级审核为业务核心,构建统一的人员、考核、档案和通知管理体系。
|
||||
|
||||
### 1.1 产品定位
|
||||
|
||||
- **目标**:替代线下/Excel 管理方式,实现业务线上化、考核标准化、数据可追溯。
|
||||
- **用户**:总部约 5-10 名管理员;37 个分站各 1-2 名负责人;约 500 名记者。
|
||||
- **核心价值**:减少重复填报、统一审核标准、提升考核透明度、积累可分析数据。
|
||||
|
||||
### 1.2 成功指标
|
||||
|
||||
| 指标 | 目标值 |
|
||||
|---|---|
|
||||
| 工作记录线上填报率 | >= 95% |
|
||||
| 审核平均处理时长 | <= 24 小时 |
|
||||
| 考核数据可追溯覆盖率 | 100% |
|
||||
| 系统可用性 | >= 99.5% |
|
||||
|
||||
---
|
||||
|
||||
## 2. 用户画像与核心场景
|
||||
|
||||
### 场景 1:记者填报工作记录(SCENE-001)
|
||||
|
||||
**人物**:林晓,北京记者站记者,2021 年入站。
|
||||
**痛点**:此前通过微信群或邮件提交,格式不统一,审核进度靠追问,档案整理靠人工。
|
||||
**解法**:移动/PC 端随时填报,自动进入审核流,实时看到审核状态,归档记录自动进入个人档案。
|
||||
|
||||
### 场景 2:分站负责人初审(SCENE-002)
|
||||
|
||||
**人物**:苏明远,北京记者站负责人。
|
||||
**痛点**:接收材料格式混乱,退回修改反复沟通,统计靠人工汇总。
|
||||
**解法**:统一格式接收,核验后一键通过或退回,退回时填写意见,作者修改后自动推送,全站数据自动汇总。
|
||||
|
||||
### 场景 3:总部管理员复核与监管(SCENE-003)
|
||||
|
||||
**人物**:林致远,总部考核管理员。
|
||||
**痛点**:37 个站数据分散,统计口径不一致,复核工作量大,考核结果解释成本高。
|
||||
**解法**:分类复核(高价值逐条 + 普通抽查),自动计分和排名,审核轨迹可查,报表一键导出。
|
||||
|
||||
### 场景 4:记者查询个人档案(SCENE-004)
|
||||
|
||||
**人物**:林晓,想查看自己本季度的考核得分和全年排名。
|
||||
**痛点**:历史记录分散在各个群聊和文件中,不知道自己排名。
|
||||
**解法**:个人档案聚合全部归档记录,支持按类型/时间筛选,显示年度汇总和趋势。
|
||||
|
||||
---
|
||||
|
||||
## 3. 功能清单与优先级
|
||||
|
||||
使用 MoSCoW 标注:`Must` = P0,`Should` = P1,`Could` = P2。
|
||||
|
||||
| 编号 | 功能 | 优先级 | 映射需求 |
|
||||
|---|---|---|---|
|
||||
| PRD-FUNC-001 | 三角色模拟登录与权限隔离 | Must | REQ-AUTH-001~003 |
|
||||
| PRD-FUNC-002 | 工作记录新建(7 种类型) | Must | REQ-WORK-001~005 |
|
||||
| PRD-FUNC-003 | 工作记录列表(搜索/筛选/分页) | Must | REQ-WORK-002 |
|
||||
| PRD-FUNC-004 | 分站初审(通过/退回/评分) | Must | REQ-ASSESS-001~002 |
|
||||
| PRD-FUNC-005 | 总部复核(确认/调整/退回) | Must | REQ-ASSESS-003~005 |
|
||||
| PRD-FUNC-006 | 审核流程留痕(audit_log) | Must | REQ-ASSESS-004 |
|
||||
| PRD-FUNC-007 | 个人电子档案 | Must | REQ-PROFILE-001~003 |
|
||||
| PRD-FUNC-008 | 工作台仪表盘(指标卡+趋势图+排名) | Must | REQ-STAT-001~003 |
|
||||
| PRD-FUNC-009 | 通知公告(只读) | Must | REQ-NOTICE-001~002 |
|
||||
| PRD-FUNC-010 | 审核中心(待办聚合) | Must | REQ-NOTICE-002 |
|
||||
| PRD-FUNC-011 | 人员管理(增删改查) | Must | REQ-USER-001~003 |
|
||||
| PRD-FUNC-012 | 记者站管理(增删改查) | Must | REQ-ORG-001 |
|
||||
| PRD-FUNC-013 | 通知公告发布(富文本/附件/回执) | Should | REQ-NOTICE-003~004 |
|
||||
| PRD-FUNC-014 | 考核规则可视化配置 | Should | REQ-ASSESS-006 |
|
||||
| PRD-FUNC-015 | 数据统计报表(导出) | Should | REQ-STAT-001~003 |
|
||||
| PRD-FUNC-016 | 申诉与复议 | Could | — |
|
||||
| PRD-FUNC-017 | 全国地图分布 | Could | REQ-ORG-003 |
|
||||
| PRD-FUNC-018 | 个人能力画像 | Could | — |
|
||||
|
||||
---
|
||||
|
||||
## 4. 关键流程
|
||||
|
||||
### 4.1 工作记录全生命周期
|
||||
|
||||
```
|
||||
记者新建 → 保存草稿 / 直接提交
|
||||
↓提交
|
||||
待分站审核 ← 分站负责人处理
|
||||
│通过 │退回
|
||||
↓ ↓
|
||||
待总部复核 已退回 → 记者修改 → 重新提交
|
||||
│通过
|
||||
↓
|
||||
已归档 → 自动进入个人档案 + 统计汇总
|
||||
```
|
||||
|
||||
### 4.2 数据权限控制流
|
||||
|
||||
```
|
||||
请求进入 → 后端读取 x-user-role header
|
||||
↓
|
||||
headquarters: 返回全国全部数据
|
||||
station: WHERE station = '所属站'
|
||||
reporter: WHERE reporter = '本人姓名'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 角色权限矩阵
|
||||
|
||||
| 功能 | 总部管理员 | 分站负责人 | 记者 |
|
||||
|---|---|---|---|
|
||||
| 站点管理(查) | 全部 | 本站 | 本站 |
|
||||
| 站点管理(增删改) | 是 | 否 | 否 |
|
||||
| 人员管理(查) | 全部 | 本站 | 本人 |
|
||||
| 人员管理(增删改) | 全部 | 本站 | 否 |
|
||||
| 工作记录(填报) | 否 | 否(可代填) | 是 |
|
||||
| 工作记录(查看) | 全部 | 本站 | 本人 |
|
||||
| 分站初审 | 否 | 是(本站) | 否 |
|
||||
| 总部复核 | 是 | 否 | 否 |
|
||||
| 电子档案(查看) | 全部 | 本站 | 本人 |
|
||||
| 通知公告(发布) | 是 | 否 | 否 |
|
||||
| 通知公告(查看) | 全部 | 本站 | 本人 |
|
||||
| 统计报表(全局) | 是 | 否 | 否 |
|
||||
| 统计报表(本站) | 是 | 是 | 否 |
|
||||
| 统计成绩(本人) | 是 | 是 | 是 |
|
||||
| 系统设置 | 是 | 否 | 否 |
|
||||
|
||||
---
|
||||
|
||||
## 6. UI/UX 设计原则
|
||||
|
||||
### 6.1 整体风格
|
||||
|
||||
- **配色**:主色 #b42318(红),强调色 #4ba66a(绿/成功),背景 #f5f4f1(米白)
|
||||
- **字体**:Noto Sans SC,Songti SC(标题)
|
||||
- **图标**:Lucide Icons
|
||||
- **布局**:侧边栏固定 238px + 顶部栏 + 内容区
|
||||
- **交互**:Toast 反馈、Drawer 侧滑详情、Modal 弹窗表单
|
||||
|
||||
### 6.2 页面导航结构
|
||||
|
||||
```
|
||||
工作台(dashboard)
|
||||
├─ 指标卡(本月记录 / 待处理 / 归档 / 得分)
|
||||
├─ 趋势图(近6月工作量 AreaChart)
|
||||
├─ 排名(站点/类型)
|
||||
└─ 待办(待审核 / 被退回 / 截止提醒)
|
||||
|
||||
工作记录(work)
|
||||
├─ 搜索 + 状态筛选 + 类型筛选
|
||||
└─ 记录列表(点击打开详情抽屉)
|
||||
|
||||
审核中心(review)[总部/分站]
|
||||
├─ 审核摘要(待办数 / 已处理 / 平均时长)
|
||||
└─ 待审列表(通过 / 退回)
|
||||
|
||||
人员管理(people)[总部/分站]
|
||||
└─ 人员列表 + 筛选 + 新增
|
||||
|
||||
记者站管理(stations)[总部]
|
||||
└─ 站点卡片网格
|
||||
|
||||
电子档案(archive)
|
||||
└─ 个人档案聚合页 + 历史归档列表
|
||||
|
||||
通知公告(notices)
|
||||
└─ 公告列表 + 详情侧边
|
||||
```
|
||||
|
||||
### 6.3 统一交互模式
|
||||
|
||||
| 场景 | 组件 | 说明 |
|
||||
|---|---|---|
|
||||
| 列表加载中 | 顶部进度条动画 | 红色 2px 细条 |
|
||||
| 列表为空 | EmptyState + 对应图标 | 居中文字提示 |
|
||||
| 操作失败 | Toast 弹窗 | 2.4s 自动消失 |
|
||||
| 操作成功 | Toast 弹窗 + 图标 | 绿色勾选图标 |
|
||||
| 表单校验错误 | 输入框红框 + 错误提示 | 实时校验 |
|
||||
| 危险操作(删除/退回) | ConfirmDialog 或二次确认 | 明确后果 |
|
||||
| 分页 | 无(当前为全量加载) | 列表数据量小 |
|
||||
| 搜索防抖 | 300ms debounce | 工作记录搜索 |
|
||||
|
||||
### 6.4 响应式断点
|
||||
|
||||
| 断点 | 布局变化 |
|
||||
|---|---|
|
||||
| > 1100px | 标准布局(指标4列、站点3列) |
|
||||
| 761-1100px | 指标2列、站点2列、侧栏不变 |
|
||||
| <= 760px | 侧栏变为抽屉,汉堡菜单触发,指标2列,站点1列,表单全宽 |
|
||||
| <= 430px | 指标2列,保持最小可读性 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 公共组件抽取规划
|
||||
|
||||
| 组件 | 类型 | 适用场景 | 输入状态 | 输出事件 | 使用页面 | 优先级 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `StatusBadge` | 基础组件 | 工作记录状态展示 | `status: WorkStatus` | — | 全局 | Must(已存在于代码) |
|
||||
| `MetricCard` | 基础组件 | 指标数据展示 | `icon / label / value / delta / color` | — | 工作台 | Must(已存在) |
|
||||
| `PanelHeader` | 组合组件 | 面板标题栏 | `title / subtitle / action / onAction` | `onAction` | 工作台/审核/档案 | Must(已存在) |
|
||||
| `RecordTable` | 领域组件 | 工作记录列表 | `records / onSelect / compact / review` | `onSelect` | 工作/审核/档案 | Must(已存在) |
|
||||
| `RecordDrawer` | 领域组件 | 记录详情+审核 | `record / role / onUpdate` | `onUpdate` | 工作/审核 | Must(已存在) |
|
||||
| `CreateModal` | 领域组件 | 新建工作记录 | `onClose / onSubmit` | `onSubmit` | 工作台/工作记录 | Must(已存在) |
|
||||
| `FilterBar` | 组合组件 | 列表筛选栏 | `searchPlaceholder / filters / onFilter` | `onFilter / onReset` | 工作记录/人员 | Should |
|
||||
| `Pagination` | 基础组件 | 列表分页 | `page / pageSize / total` | `onChange` | 列表页面 | Could(当前 MVP 未分页) |
|
||||
| `NotificationBadge` | 基础组件 | 导航待办角标 | `count` | — | 侧边栏导航 | Must(已存在) |
|
||||
| `EmptyState` | 基础组件 | 空状态展示 | `icon / text` | — | 列表空时 | Must(已存在) |
|
||||
| `Toast` | 基础组件 | 操作反馈 | `message`(自动消失) | — | 全局 | Must(已存在) |
|
||||
| `PageHeading` | 组合组件 | 页面标题区 | `title / description / action / onAction` | `onAction` | 所有内容页 | Should(已存在但未抽取) |
|
||||
| `RoleSwitcher` | 领域组件 | 角色模拟切换 | `role / onChange` | `onChange` | 顶部栏 | Must(已存在) |
|
||||
|
||||
---
|
||||
|
||||
## 8. 版本规划
|
||||
|
||||
### 8.1 MVP(当前版本 V0.1)
|
||||
|
||||
已实现(代码层面):
|
||||
- 角色模拟登录(header 传参)
|
||||
- 工作记录 CRUD(前端 + 后端 API)
|
||||
- 分站初审 / 总部复核流程
|
||||
- 审核留痕(audit_log)
|
||||
- 7 个页面/组件
|
||||
- SQLite 数据库
|
||||
- Express API 服务
|
||||
|
||||
待补齐(文档层面):
|
||||
- [ ] `pmdocs/0-req-RSMS.md`(本文档)
|
||||
- [ ] `pmdocs/1-prd-RSMS.md`(本文档)
|
||||
- [ ] `pmdocs/2-task-RSMS.md`
|
||||
- [ ] `run.md`
|
||||
- [ ] 前端模块化重构
|
||||
|
||||
### 8.2 二期
|
||||
|
||||
- 通知公告发布(富文本 + 附件 + 回执)
|
||||
- 人员管理增删改(当前仅展示)
|
||||
- 记者站管理增删改(当前仅展示)
|
||||
- 考核规则配置界面
|
||||
- 数据统计专项页面
|
||||
- 个人中心功能完善
|
||||
|
||||
### 8.3 三期
|
||||
|
||||
- 申诉与复议流程
|
||||
- 全国地图记者站分布
|
||||
- 个人能力画像
|
||||
- 外部系统集成
|
||||
- 自动化测试
|
||||
|
||||
---
|
||||
|
||||
## 9. 技术架构概览
|
||||
|
||||
### 9.1 前端
|
||||
|
||||
- **框架**:React 18 + TypeScript
|
||||
- **构建**:Vite
|
||||
- **图表**:Recharts(AreaChart)
|
||||
- **图标**:Lucide React
|
||||
- **样式**:纯 CSS(含响应式)
|
||||
- **状态**:React useState / useEffect(当前),Redux Toolkit(预留)
|
||||
- **路由**:条件渲染(当前),React Router(后续)
|
||||
|
||||
### 9.2 后端
|
||||
|
||||
- **运行时**:Node.js
|
||||
- **框架**:Express.js
|
||||
- **数据库**:SQLite(WAL 模式)
|
||||
- **进程**:`node --watch` 开发热重载
|
||||
|
||||
### 9.3 API 概览
|
||||
|
||||
| 方法 | 路径 | 权限 | 说明 |
|
||||
|---|---|---|---|
|
||||
| GET | `/api/health` | 公开 | 健康检查 |
|
||||
| GET | `/api/records` | 角色隔离 | 查询工作记录 |
|
||||
| POST | `/api/records` | reporter/station | 新建记录 |
|
||||
| PATCH | `/api/records/:id/review` | station/hq | 审核操作 |
|
||||
| GET | `/api/records/:id/audit` | 角色隔离 | 流转记录 |
|
||||
|
||||
---
|
||||
|
||||
## 10. 风险与依赖
|
||||
|
||||
| 风险 | 影响 | 缓解措施 |
|
||||
|---|---|---|
|
||||
| SQLite 并发写入冲突 | 高 | WAL 模式已启用;高并发时考虑迁移 PostgreSQL |
|
||||
| 前端单文件维护性差 | 中 | 二期重构为模块化结构 |
|
||||
| 无自动化测试 | 中 | 二期引入 Vitest + Playwright |
|
||||
| 角色模拟安全性不足 | 高 | 二期接入真实认证体系 |
|
||||
| 考核规则硬编码 | 中 | 二期实现规则可视化配置 |
|
||||
|
||||
---
|
||||
|
||||
## 11. 关键决策记录索引
|
||||
|
||||
| 决策 | ADR 编号 | 状态 |
|
||||
|---|---|---|
|
||||
| 前端技术栈(React+Vite) | ADR-001 | 已决策 |
|
||||
| 后端技术栈(Express+SQLite) | ADR-001 | 已决策 |
|
||||
| 认证方案(角色模拟) | ADR-002 | 待确认 |
|
||||
| 数据库选型(SQLite) | ADR-001 | 已决策 |
|
||||
@@ -0,0 +1,505 @@
|
||||
# 2-task-RSMS-001:全国记者站管理系统开发任务文档
|
||||
|
||||
> 文档版本:v1.0
|
||||
> 状态:待确认
|
||||
> 编制日期:2026-08-01
|
||||
> 项目缩写:RSMS
|
||||
> 适用范围:V0.1 MVP 收尾 + V0.2 阶段
|
||||
|
||||
---
|
||||
|
||||
## 阶段 0:规范文档(前置,必须先完成)
|
||||
|
||||
- [x] TASK-DOC-001:创建 `pmdocs/` 目录结构(changes/、adr/)
|
||||
- **目标**:建立 PM 文档存放规范
|
||||
- **验收**:目录存在,CHANGELOG.md 已初始化
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-DOC-002:生成 `pmdocs/0-req-RSMS.md`(需求文档)
|
||||
- **目标**:固化需求范围、角色定义、状态机、NFR、验收标准
|
||||
- **映射**:REQ-AUTH~REQ-SYS, NFR-*, AC-*
|
||||
- **验收**:文档已创建,内容覆盖全部 REQ 编号
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-DOC-003:生成 `pmdocs/1-prd-RSMS.md`(产品需求文档)
|
||||
- **目标**:固化功能清单、UI/UX 规范、公共组件规划、版本规划
|
||||
- **映射**:PRD-FUNC-001~018,SCENE-001~004
|
||||
- **验收**:文档已创建,公共组件规划表已填充
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-DOC-004:生成本文档 `pmdocs/2-task-RSMS.md`
|
||||
- **目标**:任务拆分、编号、依赖、验收标准
|
||||
- **映射**:所有 REQ、PRD-FUNC
|
||||
- **验收**:本文档已创建,所有任务有验收标准
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-DOC-005:创建 `run.md`(运行手册)
|
||||
- **目标**:固化安装、启动、构建、迁移命令
|
||||
- **依赖**:TASK-DOC-004
|
||||
- **验收**:`run.md` 存在且所有命令可执行
|
||||
- **状态**:已完成
|
||||
|
||||
---
|
||||
|
||||
## 阶段 1:前端模块化重构
|
||||
|
||||
### 1.1 架构重构
|
||||
|
||||
- [x] TASK-FE-001:创建前端目录结构
|
||||
- **目标**:将单文件 `App.tsx` 拆分为模块化目录
|
||||
- **依赖**:TASK-DOC-005(run.md 中的构建命令验证)
|
||||
- **验收**:目录结构创建完成,import 路径调整后应用能正常启动
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-FE-002:抽取 Layout 组件
|
||||
- **目标**:`PageLayout`、`Sidebar`、`TopBar` 独立
|
||||
- **验收**:`App.tsx` 中 Layout 部分替换为 `<PageLayout>`,功能行为不变
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-FE-003:抽取 UI 基础组件
|
||||
- **目标**:`StatusBadge`、`EmptyState`、`LoadingBar` 独立为文件
|
||||
- **验收**:各组件独立导出,App.tsx 中的内联版本替换为 import
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-FE-004:抽取 PageHeading / PanelHeader / MetricCard
|
||||
- **目标**:复用组件独立文件
|
||||
- **验收**:复用点替换为 import,Props 接口独立导出
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-FE-005:抽取数据展示组件
|
||||
- **目标**:`RecordTable`(含 `review` / `compact` 模式)独立
|
||||
- **验收**:工作记录页、审核中心、档案页均使用同一组件
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-FE-006:抽取领域组件
|
||||
- **目标**:`CreateRecordModal`、`RecordDrawer` 独立为 `modals/` 文件
|
||||
- **验收**:新建和详情交互行为与重构前一致
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-FE-007:抽取页面组件
|
||||
- **目标**:每个页面(Dashboard / WorkList / ReviewCenter / People / Stations / Archive / Notices)独立文件
|
||||
- **验收**:`App.tsx` 变为路由级条件渲染,所有页面功能可用
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-FE-009:创建 Context(角色与 Toast)
|
||||
- **目标**:`RoleContext` 管理当前角色,`ToastContext` 管理全局提示
|
||||
- **验收**:全局 Toast 正常工作,角色切换后所有页面响应正确
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-FE-010:抽取 FilterBar 组件
|
||||
- **目标**:`FilterBar`(搜索 + 筛选下拉 + 重置)抽象为可复用组合组件
|
||||
- **验收**:工作记录页和人员管理页使用同一 FilterBar
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-FE-011:抽取 Pagination 组件
|
||||
- **目标**:分页组件(当前 MVP 暂不使用,但预留)
|
||||
- **验收**:组件存在,数据量大时分页可用
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-FE-012:样式模块化
|
||||
- **目标**:将 `styles.css` 按组件/页面拆分,引入 CSS 变量文件
|
||||
- **验收**:构建后样式与重构前一致,无布局错位
|
||||
- **状态**:已完成
|
||||
|
||||
- [x] TASK-FE-013:构建验证
|
||||
- **目标**:`npm run build` 通过,`npm run lint` 无错误
|
||||
- **依赖**:TASK-FE-001 ~ TASK-FE-012 全部完成
|
||||
- **验收**:构建产物正常,dist/ 输出正确
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
### 1.2 功能增强
|
||||
|
||||
- [x] TASK-FE-014:人员管理增删改
|
||||
- **目标**:总部可新增/编辑/停用人员;分站可编辑本站人员
|
||||
- **映射**:REQ-USER-001, REQ-USER-002
|
||||
- **依赖**:TASK-BE-006
|
||||
- **验收**:
|
||||
- 总部管理员可新增人员,填写姓名/站点/职务/入站时间后保存成功
|
||||
- 编辑后数据持久化,再次查询反映最新值
|
||||
- 停用后该人员不可登录(后端权限拦截)
|
||||
- **优先级**:P0
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-FE-015:记者站管理增删改
|
||||
- **目标**:总部可新增/编辑/停用记者站
|
||||
- **映射**:REQ-ORG-001, REQ-ORG-002
|
||||
- **依赖**:TASK-BE-007
|
||||
- **验收**:
|
||||
- 总部管理员可新增站点,填写名称/编码/地区/负责人后保存成功
|
||||
- 站点列表反映最新数据
|
||||
- **优先级**:P1
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-FE-016:通知公告发布
|
||||
- **目标**:总部可发布带附件的通知;用户可查看已读状态
|
||||
- **映射**:REQ-NOTICE-003, REQ-NOTICE-004
|
||||
- **依赖**:TASK-BE-008
|
||||
- **验收**:
|
||||
- 总部可创建通知,选择接收范围(全部/站点/角色)
|
||||
- 通知列表显示已读/未读统计
|
||||
- 重要通知需确认回执
|
||||
- **优先级**:P1
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-FE-017:个人中心
|
||||
- **目标**:用户查看/编辑个人资料、修改密码(模拟)
|
||||
- **映射**:REQ-HOME-004
|
||||
- **验收**:个人资料页正常展示和编辑
|
||||
- **优先级**:P2
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
---
|
||||
|
||||
## 阶段 2:后端扩展
|
||||
|
||||
### 2.1 API 扩展
|
||||
|
||||
- [x] TASK-BE-001:人员 CRUD API
|
||||
- **目标**:新增 `GET/POST /api/people`、`PATCH /api/people/:id`、`DELETE /api/people/:id`
|
||||
- **映射**:REQ-USER-001~003
|
||||
- **依赖**:TASK-BE-005(数据库迁移)
|
||||
- **接口契约**:
|
||||
- `GET /api/people?station=&status=` → 按站点和状态筛选
|
||||
- `POST /api/people` → body: `{ name, station, title, phone, joinedAt }`
|
||||
- `PATCH /api/people/:id` → body: `{ title?, status?, phone? }`
|
||||
- **验收**:curl 测试全部接口返回正确状态码和数据
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-BE-002:记者站 CRUD API
|
||||
- **目标**:新增 `GET/POST /api/stations`、`PATCH /api/stations/:id`
|
||||
- **映射**:REQ-ORG-001, REQ-ORG-002
|
||||
- **依赖**:TASK-BE-005
|
||||
- **验收**:同上
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-BE-003:通知公告 API
|
||||
- **目标**:新增 `GET/POST /api/notices`、`PATCH /api/notices/:id`、`GET /api/notices/:id/receipts`
|
||||
- **映射**:REQ-NOTICE-001~004
|
||||
- **验收**:
|
||||
- 总部发布通知后,其他角色可见
|
||||
- 已读回执记录正确
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-BE-004:数据统计 API
|
||||
- **目标**:新增 `GET /api/stats/overview`、`GET /api/stats/records`、`GET /api/stats/scores`
|
||||
- **映射**:REQ-STAT-001~003
|
||||
- **验收**:
|
||||
- 总部返回全国维度统计
|
||||
- 分站返回本站维度统计
|
||||
- 记者返回本人维度统计
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-BE-005:数据库迁移脚本
|
||||
- **目标**:将 inline schema 改为独立 migration 文件 + runner
|
||||
- **依赖**:无
|
||||
- **验收**:
|
||||
- `npm run db:migrate` 执行成功
|
||||
- `npm run db:seed` 可重新初始化数据
|
||||
- `npm run db:reset` 清空后重新迁移
|
||||
- **优先级**:P0
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
### 2.2 数据库迁移
|
||||
|
||||
- [x] TASK-BE-006:`people` 表迁移
|
||||
- **文件**:`migrations/003_create_people.sql`
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-BE-007:`stations` 表迁移
|
||||
- **文件**:`migrations/004_create_stations.sql`
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-BE-008:`notices` 和 `notice_receipts` 表迁移
|
||||
- **文件**:`migrations/005_create_notices.sql`
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-BE-009:`audit_logs` 表索引优化
|
||||
- **文件**:`migrations/006_optimize_indexes.sql`
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
### 2.3 后端测试
|
||||
|
||||
- [x] TASK-BE-010:API 接口集成测试
|
||||
- **目标**:使用 Node.js + Jest/Supertest 对核心接口写集成测试
|
||||
- **覆盖**:
|
||||
- 角色隔离(headquarters / station / reporter 查询结果不同)
|
||||
- 审核状态流转(draft→station_review→headquarters_review→archived)
|
||||
- 退回重提交
|
||||
- **验收**:测试全部通过,CI 环境可运行
|
||||
- **优先级**:P1(不影响 MVP 上线)
|
||||
- **状态**:已完成(2026-08-01)—— 34 项测试全部通过
|
||||
|
||||
---
|
||||
|
||||
## 阶段 3:考核规则配置(V0.2)
|
||||
|
||||
- [x] TASK-RULE-001:考核规则数据模型
|
||||
- **目标**:新增 `rules`、`rule_items`、`scores` 表
|
||||
- **字段**:规则 ID、版本、指标、计分公式、上限/下限、生效时间
|
||||
- **验收**:规则可 CRUD,变更历史可查
|
||||
- **状态**:已完成(2026-08-01)—— 迁移 007/008 已执行
|
||||
|
||||
- [x] TASK-RULE-002:规则可视化配置界面
|
||||
- **目标**:总部可在后台配置考核规则
|
||||
- **验收**:配置发布后,新提交记录使用新规则计分
|
||||
- **状态**:已完成(2026-08-01)—— RulesPage、CreateRuleModal 已完成
|
||||
|
||||
- [x] TASK-RULE-003:规则试算
|
||||
- **目标**:规则变更前用历史数据试算,输出预估得分变化
|
||||
- **验收**:试算结果可展示,不影响实际数据
|
||||
- **状态**:已完成(2026-08-01)—— scores/compute API 已实现试算逻辑
|
||||
|
||||
- [x] TASK-RULE-004:后端 rules/scores API
|
||||
- **目标**:rules CRUD、activate;scores 查询、计算触发
|
||||
- **验收**:54 项集成测试全部通过
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-RULE-005:前端考核配置页面
|
||||
- **目标**:RulesPage(列表+创建+编辑+激活);ScoresPage(评分结果+明细弹窗)
|
||||
- **验收**:tsc + vite build 通过,V0.2 新增 API 已接入
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-RULE-008:集成测试(rules/scores API)
|
||||
- **验收**:54 项测试全部通过
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-RULE-010:前端构建验证
|
||||
- **验收**:`npm run build` 通过(tsc + vite build)
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-RULE-011:考核配置前端优化
|
||||
- **目标**:规则预览 Drawer、指标试算交互、评分排行页面
|
||||
- **验收**:RulesPage 含规则预览 Drawer + 试算评分;LeaderboardPage 完整
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-RULE-006:个人中心接入考核数据
|
||||
- **目标**:当前登录记者/站点查看个人考核得分与排名
|
||||
- **验收**:个人中心展示考核卡片,接入 stats/scores API
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-RULE-007:积分排行榜
|
||||
- **目标**:全站记者/站点考核得分排名
|
||||
- **验收**:LeaderboardPage 按记者/站点分组排行,切换周期
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
---
|
||||
|
||||
## 阶段 4:ADR 架构决策
|
||||
|
||||
- [x] TASK-ADR-001:生成 ADR-001(技术栈选型)
|
||||
- **目标**:记录 React+Vite+Express+SQLite 选型理由
|
||||
- **内容**:备选方案、最终决策、权衡分析
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
- [x] TASK-ADR-002:生成 ADR-002(认证方案)
|
||||
- **目标**:记录角色模拟方案及升级路径
|
||||
- **内容**:当前方案(header 传参)、二期目标(JWT+真实认证)
|
||||
- **风险**:header 可被伪造,仅适合内部演示
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
---
|
||||
|
||||
## 阶段 5:`run.md` 创建
|
||||
|
||||
- [x] TASK-DOC-005:创建 `run.md`
|
||||
- **目标**:固化所有运行、构建、迁移、测试命令
|
||||
- **依赖**:TASK-BE-005(数据库迁移脚本完成)
|
||||
- **内容**:
|
||||
- 技术栈清单(Node.js >=18, npm, SQLite)
|
||||
- 安装命令:`npm install`
|
||||
- 开发命令:`npm run dev`(全栈)、`npm run web`(仅前端)、`npm run server`(仅后端)
|
||||
- 构建命令:`npm run build`
|
||||
- Lint:`npm run lint`
|
||||
- 数据库:`npm run db:migrate` / `db:seed` / `db:reset`
|
||||
- 环境变量:`API_PORT`(默认 8787)
|
||||
- 端口清单:Vite:5173, API:8787
|
||||
- 常见问题:
|
||||
- 端口占用处理
|
||||
- SQLite WAL 文件说明
|
||||
- 前端热重载说明
|
||||
- **验收**:`run.md` 存在,新人按文档可启动完整项目
|
||||
- **状态**:已完成(2026-08-01)
|
||||
|
||||
---
|
||||
|
||||
## 任务依赖关系图
|
||||
|
||||
```
|
||||
TASK-DOC-004 ──▶ TASK-DOC-005
|
||||
│
|
||||
TASK-BE-005 ──┬──▶ TASK-FE-001 ──▶ TASK-FE-002 ──▶ TASK-FE-003 ──▶ TASK-FE-004
|
||||
│ │
|
||||
│ ▼
|
||||
│ TASK-FE-005 ──▶ TASK-FE-006 ──▶ TASK-FE-007
|
||||
│ │
|
||||
│ ▼
|
||||
│ TASK-FE-008 ──▶ TASK-FE-009 ──▶ TASK-FE-010
|
||||
│ │ │
|
||||
│ ▼ ▼
|
||||
│ TASK-FE-011 ──▶ TASK-FE-012 ──▶ TASK-FE-013
|
||||
│
|
||||
├──▶ TASK-BE-001 ──▶ TASK-FE-014
|
||||
├──▶ TASK-BE-002 ──▶ TASK-FE-015
|
||||
├──▶ TASK-BE-003 ──▶ TASK-FE-016
|
||||
├──▶ TASK-BE-004
|
||||
├──▶ TASK-BE-006
|
||||
├──▶ TASK-BE-007
|
||||
├──▶ TASK-BE-008
|
||||
└──▶ TASK-BE-009
|
||||
|
||||
TASK-BE-010 ──(并行,不阻塞主要流程)
|
||||
|
||||
TASK-ADR-001, TASK-ADR-002 ──(随时可做)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 优先级排序(建议执行顺序)
|
||||
|
||||
### 第一梯队(P0,必须完成)
|
||||
|
||||
1. `TASK-DOC-004` — 确认任务文档(本任务)
|
||||
2. `TASK-DOC-005` — 创建 `run.md`
|
||||
3. `TASK-FE-001` — 前端目录结构
|
||||
4. `TASK-FE-002` — Layout 组件
|
||||
5. `TASK-FE-005` — RecordTable 抽取
|
||||
6. `TASK-FE-006` — CreateRecordModal / RecordDrawer 抽取
|
||||
7. `TASK-FE-007` — 页面组件拆分
|
||||
8. `TASK-FE-013` — 构建验证
|
||||
|
||||
### 第二梯队(P1,MVP 完善)
|
||||
|
||||
9. `TASK-FE-014` — 人员管理增删改
|
||||
10. `TASK-BE-005` — 数据库迁移脚本
|
||||
11. `TASK-BE-006` — people 表迁移
|
||||
12. `TASK-BE-001` — 人员 CRUD API
|
||||
13. `TASK-BE-007` — stations 表迁移
|
||||
14. `TASK-BE-002` — 记者站 CRUD API
|
||||
15. `TASK-FE-015` — 记者站管理页面
|
||||
16. `TASK-BE-008` — notices 表迁移
|
||||
17. `TASK-BE-003` — 通知公告 API
|
||||
18. `TASK-FE-016` — 通知发布页面
|
||||
19. `TASK-BE-009` — 索引优化
|
||||
|
||||
### 第三梯队(P1/P2,增强功能)
|
||||
|
||||
20. `TASK-BE-004` — 数据统计 API
|
||||
21. `TASK-FE-010` — FilterBar 抽取
|
||||
22. `TASK-FE-011` — Pagination 抽取
|
||||
23. `TASK-FE-017` — 个人中心
|
||||
24. `TASK-BE-010` — 后端集成测试
|
||||
25. `TASK-ADR-001` — ADR-001 补录
|
||||
26. `TASK-ADR-002` — ADR-002 创建
|
||||
|
||||
### 第四梯队(V0.2 考核规则)
|
||||
|
||||
> 关联变更文档:`pmdocs/changes/2026-08-01-001-V0.2考核规则配置.md`
|
||||
> 依赖:V0.1 MVP 全部完成(TASK-BE-010 集成测试通过)
|
||||
|
||||
**阶段 A:数据模型与迁移**
|
||||
|
||||
27. `TASK-RULE-001` — 创建 rules / rule_items 表(migration 007)
|
||||
- 目标:新增 `rules`(考核规则)和 `rule_items`(指标项)两张表
|
||||
- 需求:CHG-20260801-001 四维度指标数据模型
|
||||
- 验收标准:migration 可执行,rollback 可逆,字段符合设计文档
|
||||
- 依赖:TASK-BE-005(迁移框架)
|
||||
- 阶段:A
|
||||
|
||||
28. `TASK-RULE-002` — 创建 scores 表(migration 008)
|
||||
- 目标:新增 `scores`(评分结果)表,关联 rules / work_records
|
||||
- 需求:CHG-20260801-001 评分结果存储
|
||||
- 验收标准:migration 可执行,rollback 可逆,索引正确
|
||||
- 依赖:TASK-RULE-001
|
||||
- 阶段:A
|
||||
|
||||
29. `TASK-RULE-003` — 插入默认考核指标模板(migration 009 / seed)
|
||||
- 目标:seed 默认考核指标模板(6 个指标覆盖数量/质量/时效/合规四维度)
|
||||
- 需求:CHG-20260801-001 默认指标映射
|
||||
- 验收标准:seed 数据可查询,`rules` 表有 1 条草稿状态记录
|
||||
- 依赖:TASK-RULE-001
|
||||
- 阶段:A
|
||||
|
||||
**阶段 B:后端 API**
|
||||
|
||||
30. `TASK-RULE-004` — 规则 CRUD API
|
||||
- 目标:实现 `/api/rules`(列表)、`/api/rules/:id`(详情)、`POST`(创建)、`PATCH`(更新)、`POST /api/rules/:id/activate`(激活)
|
||||
- 需求:CHG-20260801-001 API 接口规划
|
||||
- 验收标准:headquarters 角色可操作,激活后旧版本自动归档
|
||||
- 依赖:TASK-RULE-001
|
||||
- 阶段:B
|
||||
|
||||
31. `TASK-RULE-005` — 评分 API + 自动计算引擎
|
||||
- 目标:实现 `/api/scores`(列表/详情)、`POST /api/scores/compute`(触发计算)
|
||||
- 需求:CHG-20260801-001 评分计算流程(指标聚合 → 加权求和 → 结果记录)
|
||||
- 验收标准:手动触发可对指定记者/站点/周期计算总分及维度分
|
||||
- 依赖:TASK-RULE-002, TASK-RULE-003
|
||||
- 阶段:B
|
||||
|
||||
**阶段 C:前端**
|
||||
|
||||
32. `TASK-RULE-006` — 考核规则管理页面
|
||||
- 目标:总部角色可查看规则列表、创建规则(含指标项编辑)、激活规则
|
||||
- 需求:CHG-20260801-001 前端配置界面
|
||||
- 验收标准:规则列表/编辑器/激活流程完整,加载+空态+错误状态覆盖
|
||||
- 依赖:TASK-RULE-004
|
||||
- 阶段:C
|
||||
|
||||
33. `TASK-RULE-007` — 评分结果查看页面
|
||||
- 目标:总部可按记者/站点/周期查看评分结果,含各维度得分明细
|
||||
- 需求:CHG-20260801-001 评分结果展示
|
||||
- 验收标准:表格+筛选+分页完整,评分明细可展开
|
||||
- 依赖:TASK-RULE-005
|
||||
- 阶段:C
|
||||
|
||||
**阶段 D:集成与文档**
|
||||
|
||||
34. `TASK-RULE-008` — 考核规则 API 集成测试
|
||||
- 目标:Jest + Supertest 覆盖 rules/scores 全部 API 端点
|
||||
- 验收标准:覆盖率 > 90%,角色权限隔离验证
|
||||
- 依赖:TASK-RULE-004, TASK-RULE-005
|
||||
- 阶段:D
|
||||
|
||||
35. `TASK-RULE-009` — `run.md` 更新(V0.2 数据库结构 + API)
|
||||
- 目标:补充 V0.2 新增表结构、API 接口到 `run.md`
|
||||
- 依赖:TASK-RULE-001, TASK-RULE-002, TASK-RULE-004, TASK-RULE-005
|
||||
- 阶段:D
|
||||
|
||||
36. `TASK-RULE-010` — 前端构建验证
|
||||
- 目标:`npm run build` 通过,无新增 lint 错误
|
||||
- 依赖:TASK-RULE-006, TASK-RULE-007
|
||||
- 阶段:D
|
||||
|
||||
---
|
||||
|
||||
## 测试策略
|
||||
|
||||
| 任务 | 测试类型 | 工具 | 覆盖目标 |
|
||||
|---|---|---|---|
|
||||
| TASK-FE-013 | 构建验证 | `npm run build` | 编译通过,类型正确 |
|
||||
| TASK-FE-001~012 | 回归测试 | 手工 | 重构后所有交互行为不变 |
|
||||
| TASK-BE-001~004 | 集成测试 | Jest + Supertest | 接口状态码、权限隔离、数据正确性 |
|
||||
| TASK-BE-005~009 | 数据库测试 | 手工 + SQL | migration 可执行、seed 正确 |
|
||||
| TASK-RULE-008 | 集成测试 | Jest + Supertest | rules/scores API,覆盖率 > 90% |
|
||||
| TASK-RULE-010 | 构建验证 | `npm run build` | V0.2 前端编译通过 |
|
||||
|
||||
---
|
||||
|
||||
## 进度记录
|
||||
|
||||
| 日期 | 完成任务 | 备注 |
|
||||
|---|---|---|
|
||||
| 2026-08-01 | TASK-DOC-001~003 | 规范文档目录和 CHANGELOG 已创建 |
|
||||
| 2026-08-01 | TASK-DOC-002 | `pmdocs/0-req-RSMS.md` 已创建 |
|
||||
| 2026-08-01 | TASK-DOC-003 | `pmdocs/1-prd-RSMS.md` 已创建 |
|
||||
| 2026-08-01 | TASK-DOC-004 | `pmdocs/2-task-RSMS.md` 已创建 |
|
||||
| 2026-08-01 | TASK-FE-001~007, TASK-FE-009~012 | 前端模块化重构完成,构建验证通过(2026-08-01) |
|
||||
| 2026-08-01 | TASK-DOC-005 | `run.md` 已创建 |
|
||||
| 2026-08-01 | TASK-BE-005~009 | 数据库迁移框架 + 6 个迁移文件 + `db:seed` 命令已验证通过 |
|
||||
| 2026-08-01 | TASK-BE-001~004 | 人员 CRUD、记者站 CRUD、通知公告、数据统计 API 已完成 |
|
||||
| 2026-08-01 | TASK-FE-014~017 | 人员管理、记者站管理、通知公告、个人中心页面 API 接入完成 |
|
||||
| 2026-08-01 | TASK-ADR-001~002 | 技术栈选型 ADR、认证方案 ADR 已补录完成 |
|
||||
| 2026-08-01 | TASK-BE-010 | 后端集成测试 34 项全部通过(Jest + Supertest,覆盖角色隔离、审核流转、CRUD) |
|
||||
| 2026-08-01 | TASK-RULE-001~010 | V0.2 考核规则任务文档已细化,关联 CHG-20260801-001 |
|
||||
| 2026-08-01 | TASK-RULE-001~003, RULE-004~005 | V0.2 考核规则后端 API + 前端页面已完成,集成测试 54 项全部通过,构建验证通过 |
|
||||
| 2026-08-01 | TASK-RULE-009 | `run.md` 已更新(测试命令、迁移管理、V0.2 表结构与 API 文档) |
|
||||
| 2026-08-01 | TASK-RULE-006/011 | 个人中心接入考核数据 + 考核配置前端优化(含规则预览 Drawer + 试算评分 + LeaderboardPage) |
|
||||
@@ -0,0 +1,31 @@
|
||||
# Changelog
|
||||
|
||||
需求与 PM 文档变更索引。
|
||||
|
||||
## 2026-08-01 V0.2 考核规则完成
|
||||
|
||||
| 类型 | 编号 | 主题 | 状态 |
|
||||
|---|---|---|---|
|
||||
| 变更文档 | `pmdocs/changes/2026-08-01-001-V0.2考核规则配置.md` | V0.2 考核规则配置设计 | ✅ 完成 |
|
||||
| 迁移 | `007_create_rules.sql` | rules + rule_items 表 | ✅ 完成 |
|
||||
| 迁移 | `008_create_scores.sql` | scores 表 | ✅ 完成 |
|
||||
| 迁移 | `009_seed_default_rules.sql` | 默认考核指标模板 | ✅ 完成 |
|
||||
| 任务 | `TASK-RULE-001~003` | 考核规则数据模型 + 配置界面 + 试算逻辑 | ✅ 完成 |
|
||||
| 任务 | `TASK-RULE-004` | 后端 rules/scores API(14 个端点) | ✅ 完成 |
|
||||
| 任务 | `TASK-RULE-005` | 前端考核规则管理 + 评分结果页面 | ✅ 完成 |
|
||||
| 任务 | `TASK-RULE-007` | 积分排行榜(reporter/station 双视图) | ✅ 完成 |
|
||||
| 任务 | `TASK-RULE-008` | 集成测试 54 项全部通过 | ✅ 完成 |
|
||||
| 任务 | `TASK-RULE-010` | 前端构建验证(tsc + vite build) | ✅ 完成 |
|
||||
| 任务 | `TASK-RULE-009` | `run.md` 更新(测试/迁移/V0.2 API 文档) | ✅ 完成 |
|
||||
| 任务 | `TASK-RULE-006` | 个人中心接入考核数据(考核卡片 + 排名信息) | ✅ 完成 |
|
||||
| 任务 | `TASK-RULE-011` | 考核配置前端优化(规则预览 Drawer + 试算评分) | ✅ 完成 |
|
||||
|
||||
## 2026-08-01 V0.1 MVP 完成
|
||||
|
||||
| 类型 | 编号 | 主题 | 状态 |
|
||||
|---|---|---|---|
|
||||
| 任务 | `TASK-BE-010` | 后端 API 集成测试(34 项全部通过) | ✅ 完成 |
|
||||
| 任务 | `TASK-BE-001~004` | 后端 API(人员 CRUD、记者站 CRUD、通知公告、数据统计) | ✅ 完成 |
|
||||
| 任务 | `TASK-FE-014~017` | 前端页面(人员管理、记者站管理、通知公告、个人中心) | ✅ 完成 |
|
||||
| 任务 | `TASK-ADR-001~002` | 架构决策记录(技术栈选型、认证方案) | ✅ 完成 |
|
||||
| 任务 | `TASK-DOC-005` | `run.md` 运行手册 | ✅ 完成 |
|
||||
@@ -0,0 +1,61 @@
|
||||
# ADR-RSMS-001:技术栈选型
|
||||
|
||||
> ADR 编号:ADR-001
|
||||
> 状态:已决策(代码已先行,补录)
|
||||
> 日期:2026-07-31
|
||||
> 项目:RSMS
|
||||
|
||||
## 背景
|
||||
|
||||
项目启动时需要确定前端框架、后端框架和数据库选型。项目为内部管理后台,初期规模可控,但需考虑 37 个站点、约 500 名记者的数据增长。
|
||||
|
||||
## 选项
|
||||
|
||||
### 前端
|
||||
|
||||
| 选项 | 优点 | 缺点 |
|
||||
|---|---|---|
|
||||
| A. React + Vite + TypeScript | 生态成熟、类型安全、Vite 热重载快、团队熟悉度高 | 学习曲线存在(对新手) |
|
||||
| B. Vue + Vite + TypeScript | 上手快、单文件组件直观 | 团队 React 经验更丰富 |
|
||||
| C. 原生 HTML + JS | 无依赖 | 不可维护 |
|
||||
|
||||
### 后端
|
||||
|
||||
| 选项 | 优点 | 缺点 |
|
||||
|---|---|---|
|
||||
| A. Express.js + Node.js | 轻量、路由灵活、JSON 原生、团队熟悉 | 需自行处理结构化代码 |
|
||||
| B. Spring Boot (Java) | 生态完善、企业级 | 需要 JDK 环境、启动慢 |
|
||||
| C. Django (Python) | 快速开发、内置 ORM | GIL 限制并发、对团队熟悉度低 |
|
||||
|
||||
### 数据库
|
||||
|
||||
| 选项 | 优点 | 缺点 |
|
||||
|---|---|---|
|
||||
| A. SQLite(WAL 模式) | 零配置、文件级、无服务进程、适合本地开发 | 并发写入受限(当前规模可接受) |
|
||||
| B. PostgreSQL | 关系型权威、功能强大、并发好 | 需要安装运行、增加运维成本 |
|
||||
| C. JSON 文件 | 零配置 | 无查询能力、无法处理关联 |
|
||||
|
||||
## 决策
|
||||
|
||||
- **前端**:React + Vite + TypeScript(选项 A)
|
||||
- **后端**:Express.js + Node.js(选项 A)
|
||||
- **数据库**:SQLite(WAL 模式)(选项 A)
|
||||
|
||||
## 理由
|
||||
|
||||
1. **React + Vite**:团队已有 React 经验;Vite 提供极快的热重载体验;TypeScript 提供编译期类型检查,减少运行时错误;Recharts 作为数据可视化方案与 React 生态无缝集成。
|
||||
2. **Express.js**:轻量、路由直观;JSON 作为 API 响应格式零序列化成本;`node --watch` 支持开发热重载;无额外配置。
|
||||
3. **SQLite**:零运维成本,文件即数据库;WAL 模式支持读写并发(读不阻塞写);数据文件可随 Git 管理(需注意 .gitignore);当前规模(37 站 x 500 人)完全在 SQLite 处理能力内。
|
||||
|
||||
## 升级路径
|
||||
|
||||
| 组件 | 升级触发条件 | 目标方案 |
|
||||
|---|---|---|
|
||||
| 数据库 | 并发写入成为瓶颈(预估 > 100 并发写入/秒) | 迁移至 PostgreSQL |
|
||||
| 后端 | 业务逻辑复杂度增加 | 考虑 NestJS 或 DDD 架构重构 |
|
||||
| 前端 | 页面数量 > 30 或团队 > 5 人 | 引入 React Router、状态管理(Redux Toolkit) |
|
||||
|
||||
## 风险
|
||||
|
||||
- SQLite 在极高并发写入场景下可能成为瓶颈(当前评估:低风险)
|
||||
- 前后端均使用 JS/TS,技术栈统一,全栈可复用类型定义(未来引入 tRPC 可进一步增强类型安全)
|
||||
@@ -0,0 +1,56 @@
|
||||
# ADR-RSMS-002:认证方案
|
||||
|
||||
> ADR 编号:ADR-002
|
||||
> 状态:已决策(角色模拟)
|
||||
> 日期:2026-08-01
|
||||
> 项目:RSMS
|
||||
|
||||
## 背景
|
||||
|
||||
系统需要识别用户身份并实施数据权限隔离。在 MVP 阶段无需接入真实身份认证体系,但需设计一个可升级的认证架构。
|
||||
|
||||
## 选项
|
||||
|
||||
| 选项 | 描述 | 适用阶段 |
|
||||
|---|---|---|
|
||||
| A. 角色模拟(header 传参) | 前端切换角色,HTTP header `x-user-role` 传递值,后端按值查询数据 | MVP / 演示 |
|
||||
| B. Session + Cookie | 后端维护 session,基于用户名密码登录 | 首版上线 |
|
||||
| C. JWT Token | 无状态令牌,携带用户 ID 和角色,可扩展 | 生产环境 |
|
||||
| D. 微信 OAuth2 | 微信账号登录,与人员档案绑定 | 移动端小程序 |
|
||||
|
||||
## 决策
|
||||
|
||||
**MVP(当前)**:选项 A — 角色模拟(header 传参)
|
||||
|
||||
**二期目标**:选项 C — JWT Token + 真实登录
|
||||
|
||||
**三期目标**:选项 D — 微信 OAuth2(若实现小程序端)
|
||||
|
||||
## 选项 A 的实施
|
||||
|
||||
```
|
||||
前端 role-switcher(<select>)
|
||||
↓
|
||||
x-user-role: headquarters | station | reporter
|
||||
↓
|
||||
后端中间件读取 header → 注入 req.user 对象
|
||||
↓
|
||||
数据访问层按 req.user.role + req.user.station + req.user.name 过滤
|
||||
```
|
||||
|
||||
- **优点**:零门槛,无需注册账号;方便演示和开发测试
|
||||
- **缺点**:安全性极低,header 可被任意伪造;仅适合内部演示环境
|
||||
|
||||
## 升级至 JWT 的迁移路径
|
||||
|
||||
1. 新增 `/api/auth/login` 接口,接收用户名密码,返回 JWT
|
||||
2. 新增 JWT 中间件,验证令牌并注入 `req.user`
|
||||
3. 保留 header `x-user-role` 作为兼容层(降级方案)
|
||||
4. 前端将 token 存储于 `localStorage` 或 `httpOnly` Cookie
|
||||
5. 移除前端 role-switcher,替换为登录页
|
||||
|
||||
## 风险
|
||||
|
||||
- **选项 A 当前风险**:任何人可以通过修改 header 访问任意角色数据
|
||||
- **缓解**:当前环境为本地开发/内网,不暴露于公网;上线前必须完成 JWT 改造
|
||||
- **硬编码人员**:`server/index.js` 中的 `identities` 对象需改为从数据库读取真实用户表
|
||||
@@ -0,0 +1,111 @@
|
||||
// 考核规则数据模型设计
|
||||
// 基于当前已有表结构(work_records, audit_logs, people, stations)和业务逻辑推导
|
||||
|
||||
## 一、设计背景
|
||||
|
||||
V0.1 工作记录审核流程中,每条记录由分站初审(station_review)、总部终审(headquarters_review)后归档(archived),分数由审核人手动给定。
|
||||
V0.2 需要将分数评定从"手动输入"改为"规则驱动":总部配置考核规则(指标项、权重、上限下限),系统根据规则自动计算得分。
|
||||
|
||||
## 二、核心实体
|
||||
|
||||
### 2.1 考核规则(rules)
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| id | INTEGER PK | 自增 ID |
|
||||
| code | TEXT UNIQUE | 规则编码,如 `RULE_2026_01` |
|
||||
| name | TEXT NOT NULL | 规则名称,如"2026年第三季度考核规则" |
|
||||
| description | TEXT | 规则说明 |
|
||||
| period_type | TEXT NOT NULL | 考核周期类型:`monthly` / `quarterly` / `annual` |
|
||||
| period_start | TEXT | 规则生效开始日期(YYYY-MM-DD) |
|
||||
| period_end | TEXT | 规则生效结束日期(YYYY-MM-DD) |
|
||||
| status | TEXT NOT NULL | 规则状态:`draft` / `active` / `archived` |
|
||||
| created_by | TEXT | 创建人姓名 |
|
||||
| created_at | TEXT | 创建时间 |
|
||||
| updated_at | TEXT | 更新时间 |
|
||||
|
||||
### 2.2 考核指标项(rule_items)
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| id | INTEGER PK | 自增 ID |
|
||||
| rule_id | INTEGER FK | 所属规则 ID |
|
||||
| category | TEXT NOT NULL | 指标类别:`quality`(质量)/ `quantity`(数量)/ `efficiency`(时效)/ `compliance`(合规) |
|
||||
| name | TEXT NOT NULL | 指标名称,如"原创报道数量" |
|
||||
| metric_key | TEXT NOT NULL | 指标计算字段(映射到 work_records 的字段或聚合方式) |
|
||||
| weight | REAL NOT NULL | 权重(0~1,所有 rule_item 权重之和应为 1) |
|
||||
| min_score | REAL DEFAULT 0 | 最低分 |
|
||||
| max_score | REAL DEFAULT 100 | 最高分 |
|
||||
| formula_type | TEXT NOT NULL | 计算方式:`count`(计数)/ `rate`(比率)/ `avg_score`(均分)/ `custom`(自定义公式) |
|
||||
| formula_params | TEXT | JSON,公式参数,如 `{"threshold": 10, "above_bonus": 5}` |
|
||||
| display_order | INTEGER DEFAULT 0 | 显示顺序 |
|
||||
| created_at | TEXT | 创建时间 |
|
||||
|
||||
### 2.3 评分结果(scores)
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| id | INTEGER PK | 自增 ID |
|
||||
| code | TEXT UNIQUE | 评分编码,如 `SCORE_2026Q1_BJ_001` |
|
||||
| rule_id | INTEGER FK | 使用的规则 ID |
|
||||
| record_id | TEXT FK | 工作记录 ID |
|
||||
| reporter | TEXT NOT NULL | 记者姓名 |
|
||||
| station | TEXT NOT NULL | 站点名称 |
|
||||
| period | TEXT NOT NULL | 考核周期标识,如 `2026-Q1` |
|
||||
| total_score | REAL | 总分 |
|
||||
| quality_score | REAL | 质量维度得分 |
|
||||
| quantity_score | REAL | 数量维度得分 |
|
||||
| efficiency_score | REAL | 时效维度得分 |
|
||||
| compliance_score | REAL | 合规维度得分 |
|
||||
| item_details | TEXT | JSON,每项指标的详细得分 |
|
||||
| computed_at | TEXT | 计算时间 |
|
||||
| created_at | TEXT | 创建时间 |
|
||||
|
||||
## 三、评分计算流程
|
||||
|
||||
1. **规则激活**:总部在后台发布规则,`rules.status = 'active'`,设置 `period_start` / `period_end`。
|
||||
2. **触发评分**:工作记录从 `returned` 重新提交后,或在考核周期结束时批量计算。
|
||||
3. **指标聚合**:对指定记者、站点、周期内的所有 `archived` 状态记录,按 `rule_items.metric_key` 聚合。
|
||||
4. **加权求和**:\(\text{total} = \sum_i \text{weight}_i \times \text{score}_i\)
|
||||
5. **结果记录**:写入 `scores` 表,同时更新 `work_records.score` 字段。
|
||||
|
||||
## 四、API 接口规划
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
|---|---|---|
|
||||
| GET | /api/rules | 查询规则列表 |
|
||||
| GET | /api/rules/:id | 查询规则详情(含指标项) |
|
||||
| POST | /api/rules | 创建规则(含指标项) |
|
||||
| PATCH | /api/rules/:id | 更新规则 |
|
||||
| POST | /api/rules/:id/activate | 激活规则 |
|
||||
| GET | /api/scores | 查询评分结果(按记者/站点/周期筛选) |
|
||||
| GET | /api/scores/:id | 评分详情 |
|
||||
| POST | /api/scores/compute | 触发评分计算 |
|
||||
|
||||
## 五、Migration 规划
|
||||
|
||||
- `migrations/007_create_rules.sql` — `rules` 和 `rule_items` 表
|
||||
- `migrations/008_create_scores.sql` — `scores` 表
|
||||
- `migrations/009_seed_default_rules.sql` — 插入默认考核指标模板
|
||||
|
||||
## 六、前端配置界面
|
||||
|
||||
总部角色可访问"考核规则管理"页面:
|
||||
- 规则列表:显示规则名称、周期类型、状态、发布时间
|
||||
- 规则编辑器:拖拽排序指标项,设置权重滑块,预览计算结果
|
||||
- 规则试算:用历史数据模拟评分,预估变化幅度
|
||||
|
||||
## 七、待确认事项
|
||||
|
||||
- [x] 考核周期如何定义:按日历季度,还是自定义起止日期?
|
||||
→ **日历季度 + 自定义起止日期两种都支持**。`period_type` 字段:`monthly` / `quarterly` / `annual` / `custom`
|
||||
- [x] 指标计算字段(`metric_key`)具体映射到哪些 `work_records` 字段?
|
||||
→ 见下表:
|
||||
- 数量:`COUNT(*)` 按 reporter+station+period 聚合
|
||||
- 质量:`AVG(score)` 从 `work_records` 或 `audit_logs` 聚合
|
||||
- 时效:`occurred_date` 与 `created_at` 差值判断
|
||||
- 合规:`status = 'archived'` 占比
|
||||
- [x] 规则激活后,历史已评分记录是否重新计算?
|
||||
→ **不自动重算**。已归档记录保留原分;新增记录使用激活规则;提供手动重算入口
|
||||
- [x] 是否支持规则版本管理(每次修改生成新版本)?
|
||||
→ **编辑生成新版本**。旧版本状态变为 `archived`,新版本为 `draft`;已有 `scores` 记录绑定旧规则版本,不受影响
|
||||
Reference in New Issue
Block a user