feat: 补齐需求10/15/16/17/18/21/23,改用现有模块替代 ERP 依赖
## 问题
按验收计划逐项复测时确认以下缺口:
1. 需求10 退单管理、需求23 成本分析依赖 ERP 模块,而该模块在构建中被排除
(yudao-server DefaultController 对 ERP 路径返回 501),导致无法验收
2. 需求15 执行反馈只有报工与任务列表,缺设备运行数据、物料消耗、交期偏差
3. 需求16 质量追溯缺原材料合规证书与售后故障关联
4. 需求17 故障报修缺远程诊断能力
5. 需求18 OEE 缺停机明细报表
6. 需求21 风险监测只有人工录入当前值,未接设备采集
## 修复
### 需求10 退单管理(去 ERP)
- 新增 after_sale_cancellation 表与完整受理流程:
退货 / 合同变更 / 合同终止统一受理,统一审批
- 审批通过后按类型执行下游动作:
退货 → 生成售后退货单;合同终止 → 作废 CRM 合同(status=50)
- 关键设计:状态流转用乐观锁;下游动作结果写入 executed/executeRemark,
失败不静默吞掉,便于人工补做;驳回强制填意见
### 需求23 成本分析(去 ERP)
- 新增 SrmCostAnalysisService,改用 SRM 招标需求量 + 供应商报价
- 加权均价 = Σ(报价单价 × 需求数量) / Σ(需求数量)
- 输出采购量、加权均价、最低/最高价、报价次数、供应商数、预估价偏差率、价格变动
- 另提供按月价格趋势接口
### 需求15 执行反馈
- 新增 MesProTaskExecutionService:汇总计划/报工/设备采集/物料消耗/交期偏差
- 延期原因只列可观测信号(告警、缺料、报工滞后、耗时超计划),不推断管理原因
### 需求16 质量追溯
- srm-api 新增 SrmSupplierCertificateApi:按供应商查询合规证书(含过期标记)
- 批次追溯新增 /certificates(原材料合规证书)与 /aftersales(售后故障记录)
- aftersales-api 新增 getTicketsBySaleOrderNo,供 MES 反查售后
### 需求17 故障报修
- 新增 MesDvRepairDiagnosisService:基于实时采集 + 状态历史 + 告警做远程诊断
- 输出风险等级、诊断结论、逐条诊断依据;不引入新外部接口
### 需求18 OEE
- 新增停机明细报表:按采集间隔推算停机区间与合计,复用 CollectOfflinePolicy
### 需求21 风险监测
- 危险源新增 machineryId + metricKey,从 mes_collect_realtime 取值
- 新增 /safety/risk-source/refresh:批量刷新并按阈值判定,返回报警清单
- 取不到采集值时置 UNKNOWN,不覆盖历史观测时间
## 数据库
- after_sale_cancellation_20261107.sql:退单受理表 + 菜单权限
- safety_risk_source_20261107.sql:危险源台账表 + 菜单
- safety_risk_source_collect_20261107.sql:危险源加设备绑定列
- safety_hazard_employee_link_20261107.sql:补隐患表缺失的
reporter_id/assignee_id/rechecker_id(修复创建隐患 500)
- mes_work_order_schedule_priority/market_type、mdm_item_outsource_lead_time:
排产约束字段
- purchase_order_srm_menu、bpm_invoice_legacy_derived_from:菜单与数据迁移
## 验证
mvn compile EXIT=0;mvn test-compile EXIT=0。
本地复测(mom_local):
- 需求10 11/11 通过(含退货生成、合同作废、驳回路径)
- 需求23 6/6 通过(样本:钢木电缆盘 加权均价659.6)
- 需求13/15/17/18/21 21/21 通过
- 需求16/22 通过;需求20 未绑定账号场景 6/6 通过