6.1 KiB
项目管理模块全栈重建 Spec
Why
项目管理模块(勘察派单/方案/合同/安装/验收/回访)后端代码已存在但前端页面未按系统设计稿实现,安装派单(install_order)全栈缺失;同时需要系统性补齐接口鉴权、SQL 注入防护、前端 XSS 防护与操作日志,并保证同一套 API 可被 APP 直接复用。
What Changes
- 前端重建:按设计稿重建勘察台账页(参考
系统设计/UI/项目勘察台帐/code.html)与勘察派单页(参考系统设计/UI/项目勘察派单/code.html);方案/合同/验收/安装/回访页按客户拜访管理台账(client/src/views/customer/visit/index.vue)的交互与样式体系重建。 - 安装派单全栈新增:install_order 的 entity / dto / service / controller / 前端台账页 / API / 路由,功能深度为台账式完整 CRUD + 状态流转(0已派发 → 1已完成)。
- 安全加固:
- 接口鉴权补全:项目管理所有接口统一走 JWT 认证 + RBAC 权限点(复用现有
RbacMiddleware,按 path 匹配 permission code)。 - SQL 注入防护审查:全部查询走 Sequelize 参数化,禁止字符串拼接 SQL;DTO 层用 class-validator 全量校验入参。
- 前端 XSS 防护:用户输入的备注/说明/意见等文本字段渲染时禁止
v-html,统一文本插值;富文本场景如需 HTML 必须经白名单消毒。 - 操作日志埋点:创建/更新/删除/指派/状态流转/取消/复核等关键动作写入
sys_operation_log。
- 接口鉴权补全:项目管理所有接口统一走 JWT 认证 + RBAC 权限点(复用现有
- APP 兼容:不新增命名空间,Web 与 APP 共用现有
/api/project-*系列接口;统一响应结构{ code, message, data },分页结构统一为{ list, total, page, pageSize };字段命名与时间格式(ISO 8601)保持稳定。
Impact
- Affected specs: 项目管理(新建)、系统安全(加固)
- Affected code:
- server:
src/entity/install_order.entity.ts(新增)、src/dto/install_order.dto.ts(新增)、src/service/install_order.service.ts(新增)、src/controller/install_order.controller.ts(新增)、既有 project_plan / contract / survey_order / acceptance / visit_record 的 controller/service(安全审查与日志埋点) - client:
src/views/project/**(全部重建)、src/api/installOrder.ts(新增)、src/router/index.ts(补安装派单路由)、src/layouts/index.vue(菜单补项)
- server:
ADDED Requirements
Requirement: 安装派单管理(install_order 全栈)
系统 SHALL 提供安装派单的台账式完整 CRUD 与状态流转:列表分页筛选(关键字/客户/状态/派单日期范围)、新建、编辑、详情、删除、标记完成。单号自动生成(格式与勘察单号规则一致,如 WH-INST-YYYY-NNNN)。
Scenario: 创建安装派单
- WHEN 授权用户提交合法派单表单(customerId、planId、installer、dispatchDate 必填)
- THEN 系统生成唯一 install_no,状态为 0(已派发),写入操作日志,返回统一成功响应
Scenario: 状态流转
- WHEN 授权用户对已派发工单执行「标记完成」
- THEN 状态从 0 流转为 1,记录完成时间,写入操作日志;已完成工单禁止再次流转
Requirement: 勘察台账页按设计稿重建
系统 SHALL 按 系统设计/UI/项目勘察台帐/code.html 重建勘察台账页:统计卡片(待指派/勘察中等待复核/已归档)、状态筛选 Tab、高级筛选(优先级/业务员/电工/时间窗口)、列表列(工单编号+优先级、关联客户与项目、空间位置、测绘回路规格、责任业务员、指派电工、期望时效/SLA、预估劳务费、状态、操作)、批量指派、催办、智能派单入口。
Scenario: 台账筛选
- WHEN 用户组合使用状态 Tab 与高级筛选条件
- THEN 列表与统计卡片按筛选结果刷新,分页保持统一响应结构
Requirement: 勘察派单页按设计稿重建
系统 SHALL 按 系统设计/UI/项目勘察派单/code.html 重建派单表单页:关联客户选择、任务标题、空间位置、回路规格/数量、优先级(特急P1/加急P2/常规P3)、计划到场窗口、SLA、预估劳务费自动报价(复用 /api/survey-orders/quote)、指派电工、草稿保存与正式派发。
Requirement: 方案/合同/验收/回访页重建
系统 SHALL 按客户拜访台账的交互体系(筛选区 + 表格 + 分页 + 新建/编辑弹窗或表单页 + 状态标签)重建项目方案(含设备明细)、合同(含金额/支付周期/合同文件)、项目验收(含验收意见/文件)、回访记录四个台账页。
Requirement: 接口鉴权补全
系统 SHALL 保证 /api/survey-orders、/api/project-plans、/api/contracts、/api/install-orders、/api/acceptances、/api/visit-records 全部端点强制 JWT 认证并校验对应 RBAC 权限点(project:survey、project:plan、project:contract、project:install、project:acceptance、project:visit)。
Scenario: 未认证访问被拒
- WHEN 请求未携带有效 JWT
- THEN 返回 401 统一错误结构;无权限点返回 403
Requirement: SQL 注入防护审查
系统 SHALL 保证项目管理模块所有数据库访问经由 Sequelize 参数化;关键字模糊搜索使用绑定参数的 Op.like,排序字段白名单校验,禁止任何字符串拼接 SQL。
Requirement: 前端 XSS 防护
系统 SHALL 禁止对后端返回的用户输入文本使用 v-html;表格/详情中的备注、说明、意见字段使用文本插值渲染。
Requirement: 操作日志埋点
系统 SHALL 在创建/更新/删除/指派/批量指派/状态流转/取消/复核/催办动作中写入 sys_operation_log(操作人、动作、目标单号、摘要)。
MODIFIED Requirements
Requirement: 统一响应结构(APP 兼容)
项目管理全部接口 SHALL 返回 { code, message, data };列表 data 统一为 { list, total, page, pageSize };时间字段序列化为 ISO 8601 字符串;错误码语义稳定(401 未认证 / 403 无权限 / 422 参数校验失败 / 500 服务器错误),供 APP 端直接消费。