日期:2026-05-31
状态:阶段 E 已完成(步骤 28 代码验收 + 文档更新;联调手测见08-verify.md)
原则:业务逻辑先梳理再开发;Java → Python 逐行翻译;HTTP 语义对齐原 CRM(GET/PUT/DELETE),不强制门户 POST 约定
| 项 | 说明 |
|---|---|
| 删除后端 | contract.py、contract_approval.py、contract_product.py、contract_change.py、contract_template.py、crm_contract_routes.py、crm_contract_sub_routes.py、对应 schemas/crm/contract*.py |
| 删除前端 | views/crm/contract/、api/crm/contract/、useContractPerm.ts、migrate-contract-*.py |
| 拷贝前端 | 自 shanxia/crm/web/src/views/crm/contract/ 与 api/crm/contract/ 原样覆盖 |
| 路由保留 | sqxp.ts 中 contract 相关路由未动 |
| ORM 保留 | backend/app/models/crm_models.py 中 CrmContract* 模型保留(映射已有表) |
| 报价转合同 | quote.to_contract 已恢复,调用 create_from_quote |
| Java 快照 | docs/crm-migration/reference/java/contract/ 保留作翻译权威源 |
@/utils/request、useDict、v-hasPermi — 需按 ref-lessons-learned.md 适配 shanxia2.0CustomerDetailDialog.vue 仍 import @/api/crm/contract/typestypes.ts 并接通跨模块引用GET /contract/list 与 GET /contract/{id}ToContractDialog 转合同后端暂不可用to_contractCrmContractController.java + ICrmContractService.java,导出完整接口矩阵到 04-api-spec.md(含 HTTP 方法) | ✅ 2026-05-31CrmContractServiceImpl.buildQueryWrapper,写 Tab/联合搜索/审批子查询中文说明 → 02-business-logic.md | ✅ 2026-05-3102-business-logic.md §10(2026-05-31)crm_contract_approval 多步、is_current、canApprove | ✅ 02-business-logic.md §4、§10.4(2026-05-31)docs/sql/sx.sql 与 shanxia2.0.sql 的 crm_contract* 字段差异,列 DDL 清单 | ✅ 03-ddl-diff.md + incremental_crm_contract_rewrite.sql(2026-05-31)updateReceivedAmount、updateInvoiceAmount、回款/开票 Service 触发点 | ✅ 05-cross-module-calls.md(2026-05-31)@/utils/http + /web/crm/contract(Java GET/PUT/DELETE 语义);types.ts;useContractPerm;index.vue 按 quote 骨架改造 | ✅ 2026-05-31useDict → dictStore;proxy.$modal → $modal;移除 RuoYi 专有 import(含 OSS → crm-attachment、产品 API 路径、exportContract) | ✅ 2026-05-31types.ts(主合同 + 变更/模板/审批子类型 + CreateFromQuoteForm);CustomerDetailDialog / ToContractDialog 跨模块引用 @/api/crm/contract/types | ✅ 2026-05-31v-hasPermi → useContractPerm(列表/详情/变更/模板/审批子页 + menuCode 对齐 04-api-spec) | ✅ 2026-05-31CustomerDetail、ImagePreview、TinyMceEditor、QuoteSelector 路径核对 | ✅ 2026-05-31pnpm dev 编译通过,合同列表页可打开(API 可报错) | ✅ 2026-05-31docs/sql/incremental_crm_contract_rewrite.sql | ✅ 2026-05-31(见 03-ddl-diff.md;须在测试库手动执行)CrmContractProductPriceTier Model)Java 快照:docs/crm-migration/reference/java/contract/
schemas/crm/contract.py(Bo/Vo 字段与 Java 一致) | ✅ 2026-05-31buildQueryWrapper + queryPageList + canApprove → crud/crm/contract.py | ✅ 2026-05-31queryById + 产品明细 + 供方名称 enrichment | ✅ 2026-05-31insertByBo / updateByBo / deleteWithValidByIds | ✅ 2026-06-01crm_contract_routes.py:注册 GET /crm/contract/list 等(不用门户 POST 包装,或双轨:原路径 + 网关转发) | ✅ 2026-05-31(list + detail);2026-06-01 全量写/审批/统计路由submitApproval / batch / withdraw + contract_approval.py | ✅ 2026-06-01startExecute / finishContract / invalidContract | ✅ 2026-06-01uploadFile / uploadAttachmentsWithCategory | ✅ 2026-06-01statisticsOverview / ByStatus / ByType / Trend / queryExpiring | ✅ 2026-06-01renewContract / createFromQuote / export;signContract / batchAssign / downloadPdf / createFromOpportunity | ✅ 2026-06-01crm_contract_sub_routes.py(含 CRUD、export、transfer) | ✅ 2026-06-01quote.to_contract 调用 create_from_quote | ✅ 2026-06-01index.vue + 4 对话框 Fresh Mint(参照 quote/index.vue) | ✅ 2026-05-31(4 子对话框 + 修复 handlePrintContract 模板损坏)module-status.md | ✅ 2026-05-31(08-verify.md 代码项 ✅;浏览器手测待联调)继续合同管理重写移植。
断点文档:docs/crm-migration/plans/contract/07-restart-checkpoint.md
当前步骤:__ / 28
| 操作 | 前置状态 | 结果状态 |
|---|---|---|
| 提交审批 | draft | approving + approval pending 记录 |
| 撤回 | approving | draft + 删 pending 审批 |
| 开始执行 | approved | executing |
| 完成 | executing | finished |
| 作废 | 非 finished | invalid |
| 删除 | draft | 软删 |
无合同专用定时任务;回款/开票金额回写由其它 Service 调用 updateReceivedAmount / updateInvoiceAmount。