# 合同管理模块 — 08 验证清单 > 阶段 E 步骤 28 产出 | 日期:2026-05-31 > **代码审查 + 构建验证**已完成;**浏览器联调手测**项建议在测试环境复验。 --- ## 构建与注册 - [x] `pnpm build` 通过(web-admin) - [x] 路由注册:`crm.py` → `register_contract_routes` + `register_contract_sub_routes` - [x] 前端 API 基路径 `/web/crm/contract`,HTTP 动词对齐 Java(GET/PUT/DELETE/POST) - [x] DDL 已在测试库执行(步骤 14) --- ## 功能验证(代码对齐) ### 列表 Tab - [x] 7 个 Tab:`my` / `all` / `submitted` / `approved` / `executing` / `finished` / `invalid` - [x] `handleViewChange` 设置 `ownerUserId` / `pendingApprovalUserId` / `approvedByUserId` / `status` - [x] 非「已作废」Tab 默认 `excludeStatus=invalid`(`getList`) - [x] 后端 `build_query_wrapper` 支持上述筛选字段 - [x] 统计卡片由当前页列表前端聚合(`loadStatistics`) - [ ] Tab 切换后数据与权限角色一致(手测) ### 筛选 / 分页 / 展开 - [x] 筛选区:合同编号/名称/客户、类型、状态、审批状态、签订日期 - [x] 快捷日期 + 快速搜索 OR 三字段 - [x] 查询/重置触发 `getList`,分页绑定 `pageNum` / `pageSize` - [x] 行展开懒加载产品明细(`getContractDetail`) - [ ] 筛选组合与导出结果一致(手测) ### 审批流 - [x] `ApprovalDialog`:提交 / 批量提交 / 通过 / 驳回 / 撤回 - [x] 前端状态校验:仅 `draft` 可提交;对话框 Fresh Mint - [x] 后端:`submit_contract_approval` / `batch_submit` / `withdraw` + `approve_contract_by_contract_id` - [ ] 多步审批:选下一步审批人、会签/或签(手测;当前对话框为顺序多选审批人) - [ ] 待审批 Tab 仅见 `canApprove=true` 行(手测) ### 执行 / 完成 / 作废 - [x] `ExecuteDialog`:开始执行(`startExecute`)/ 完成(`finishContract`) - [x] `InvalidDialog`:作废原因字典 + 二次确认 + 回款/开票风险提示 - [x] 状态机:approved→executing→finished;非 finished 可 invalid - [ ] 执行汇总金额与详情一致(手测) ### 附件 / 导出 - [x] `UploadDialog`:分类上传、MinIO、保存 `uploadAttachments` - [x] 列表导出 `exportContract` → `POST /export` xlsx - [ ] 导出列与字典翻译正确(手测) - [ ] 附件预览/下载/删除(手测) ### 跨模块 - [x] 报价转合同:`createFromQuote` + `quote.to_contract` 已恢复 - [ ] 商机转合同、续签、签约、批量分配负责人(手测) - [ ] 回款/开票金额回写 `updateReceivedAmount` / `updateInvoiceAmount`(手测,依赖回款/开票模块) --- ## UI 合规(Fresh Mint) - [x] 列表单 `panel-top` 标题「合同管理」 - [x] 工具栏「已选 N 项」在前;仅首个主按钮 `type="primary"` - [x] 4 子对话框 + 列设置/详情弹窗:`align-center`、`dialog-form-layout`、`order-module-dialog-mask` - [x] 子对话框 `label-position="top"`;footer Close/Check 图标 - [x] 状态/审批状态列与详情:`el-tag` + `dictStore.getTagType` - [x] 操作列 `fixed="right"`,`min-width="260"` --- ## 权限 - [x] `useContractPerm` + `hasContractPerm` 替代 `v-hasPermi`(列表/详情/变更/模板/审批子页) - [ ] 测试角色勾选 `crm:contract:*` 后按钮可见性(手测) --- ## 子模块(变更 / 模板 / 审批独立页) - [x] 后端 `crm_contract_sub_routes.py`:change / template / approval CRUD + export + transfer - [x] 前端页面与 API 文件齐全(Fresh Mint 适配在步骤 7–10 完成) - [ ] 变更提交/执行、模板启停、审批转办(手测) --- ## 回归 - [ ] 报价单列表「转合同」链路(手测) - [ ] 客户详情弹窗引用合同 types 未破坏(手测) - [ ] 产品/客户/报价模块未受影响(手测) --- ## 手测建议顺序 1. 登录测试租户 → 合同列表 7 Tab 各点一次 2. 筛选 + 分页 + 行展开产品 3. 草稿 → 提交审批 → 待审批 Tab 通过/驳回 4. 已通过 → 开始执行 → 完成 5. 另选合同 → 作废 6. 上传扫描件 → 导出 xlsx 7. 报价单 → 转合同