xiaoyi
21 小时以前 a57dceb3e6bc02e28a86f4de66f593706452c2b4
分支
用户 xiaoyi <908147524@qq.com>
星期六, 十一月 7, 2026 14:53 +0800
提交者 xiaoyi <908147524@qq.com>
星期六, 十一月 7, 2026 14:53 +0800
提交a57dceb3e6bc02e28a86f4de66f593706452c2b4
目录 6f64ad49f3c3f45fa362500d9295147775e84057 目录 | zip | gz
上一版本 f6003438d54d49abccedbdd5d1c311e637798995 查看 | 对比
refactor: 需求10/23 改为基于 ERP 实现,修正此前 ERP 可用性误判

## 问题(重要更正)
此前判定「ERP 模块已禁用」,据此用 SRM 报价和 aftersales 受理单实现了
需求23 成本分析、需求10 退单管理。实测发现该判定错误:
1. 测试使用了错误路径 /erp/statistics/purchase/**,
真实映射为 /erp/purchase-statistics/**,错误路径落到 DefaultController
兜底返回 501「ERP 模块已禁用」,误判为模块未启用
2. 实际 ERP 已启用:/erp/sale-order、/erp/purchase-order、/erp/purchase-request、
/erp/finance-payment 均返回 code=0
3. /erp/purchase-statistics/price 本地可正常返回数据(15 条物料)
4. 线上仅缺采购统计接口(旧 jar 未包含该 Controller)与部分 ERP 表

## 修复
### 需求23 成本分析 改回 ERP 口径
- 前端改调 /erp/purchase-statistics/price(后端实现早已存在,基于
erp_purchase_order + erp_purchase_order_items 已审核订单聚合)
- 新增页面 erp/purchase/statistics/price-analysis.vue:
采购量、加权均价、最低/最高价、最近价/上次价、价格变动率,以及汇总指标
- 删除重复的 SRM 版成本分析(SrmCostAnalysisService / SrmCostAnalysisRespVO /
控制器端点 / 前端页面与 api),避免同一需求两套口径

### 需求10 退单管理 接 ERP 销售订单
- ErpSaleOrderApi 新增 cancelSaleOrder,复用 Service 的作废逻辑
(含状态校验、出库单校验、未取消 MPS 拦截、发货通知拦截)
- after_sale_cancellation 新增 sale_order_id 列与 SaveReqVO 字段
- 审批通过后按类型联动作废:
退货 → 生成退货单 +(可选)作废销售订单
合同终止 → 作废 CRM 合同 +(可选)作废销售订单
- 修正审批事务语义:原来「下游失败只记录不阻断」会导致
UnexpectedRollbackException(内层事务已标记 rollback-only)。
改为先执行下游、成功后再落审批结论;下游失败整体回滚,
受理单保持待审批并向用户返回可读原因,杜绝「审批通过但业务未执行」

### 菜单(撤销此前的错误调整)
- erp_menus_restore_20261107.sql:
恢复采购管理下 ERP 子菜单启用、恢复仓库大屏可见、
采购成本分析改挂到「采购管理」并指向 ERP 页面

## 验证(本地 mom_local)
需求23:/erp/purchase-statistics/price code=0,15 条物料
样本 电工圆铜杆 采购量60000 加权均价66.1867 最低65.28 最高68 变动率-4%
需求10:
✅ 成功路径:新建订单 1305 → 审批通过 → CRM 合同6 作废 + 销售订单作废(status=30)
✅ 阻断路径1:订单有 MPS 计划 → 拒绝「请先处理并取消生产计划」,单据保持待审批、订单状态不变
✅ 阻断路径2:订单有发货通知 → 拒绝「请先处理相关通知单」
✅ 已作废订单重复作废 → 拒绝
其他回归:主回归 21/21、16/22 通过
已添加2个文件
已删除2个文件
已修改6个文件
433 ■■■■■ 文件已修改
sql/mysql/after_sale_cancellation_order_link_20261107.sql 14 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
sql/mysql/erp_menus_restore_20261107.sql 28 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/cancellation/vo/AfterSaleCancellationSaveReqVO.java 6 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/dal/dataobject/cancellation/AfterSaleCancellationDO.java 2 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/cancellation/AfterSaleCancellationService.java 70 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/api/sale/ErpSaleOrderApi.java 9 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/api/sale/ErpSaleOrderApiImpl.java 10 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/statistics/SrmStatisticsController.java 27 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/statistics/vo/SrmCostAnalysisRespVO.java 84 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/statistics/SrmCostAnalysisService.java 183 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史