阶段 E 步骤 28 产出 | 日期:2026-05-31
代码审查 + 构建验证已完成;浏览器联调手测项建议在测试环境复验。
pnpm build 通过(web-admin)crm.py → register_contract_routes + register_contract_sub_routes/web/crm/contract,HTTP 动词对齐 Java(GET/PUT/DELETE/POST)my / all / submitted / approved / executing / finished / invalidhandleViewChange 设置 ownerUserId / pendingApprovalUserId / approvedByUserId / statusexcludeStatus=invalid(getList)build_query_wrapper 支持上述筛选字段loadStatistics)getList,分页绑定 pageNum / pageSizegetContractDetail)ApprovalDialog:提交 / 批量提交 / 通过 / 驳回 / 撤回draft 可提交;对话框 Fresh Mintsubmit_contract_approval / batch_submit / withdraw + approve_contract_by_contract_idcanApprove=true 行(手测)ExecuteDialog:开始执行(startExecute)/ 完成(finishContract)InvalidDialog:作废原因字典 + 二次确认 + 回款/开票风险提示UploadDialog:分类上传、MinIO、保存 uploadAttachmentsexportContract → POST /export xlsxcreateFromQuote + quote.to_contract 已恢复updateReceivedAmount / updateInvoiceAmount(手测,依赖回款/开票模块)panel-top 标题「合同管理」type="primary"align-center、dialog-form-layout、order-module-dialog-masklabel-position="top";footer Close/Check 图标el-tag + dictStore.getTagTypefixed="right",min-width="260"useContractPerm + hasContractPerm 替代 v-hasPermi(列表/详情/变更/模板/审批子页)crm:contract:* 后按钮可见性(手测)crm_contract_sub_routes.py:change / template / approval CRUD + export + transfer