From 227eff61120aaca63e068035d745d86452e6499a Mon Sep 17 00:00:00 2001
From: hsy <1029150275@qq.com>
Date: 星期一, 17 八月 2026 09:35:12 +0800
Subject: [PATCH] feat(mes): 优化生产订单与排产任务列表显示,新增启停工及校验逻辑 1. 生产订单列表展示优化 (WorkOrder) - 新增「生产状态」列,全局注册 `ORDER_PRODUCTION_STATUS` 常量并绑定系统动态字典。 - 彻底重构「工序生产进度」单元格显示:弃用臃肿的 Steps 组件,改为极简横向布局(彩色状态圆点 + 进度百分比),解决表格行高被强行撑开及内容截断问题,支持横向滚动。 - 优化「完成进度」列宽及展示样式,将百分比数值外置同行显示,更加直观。 2. 排产任务列表改造 (Task) - 顶部表头重构,由单一标题重构为「全部 / 未完成 / 已完成」的 Tabs 标签页切换结构。 - 重写数据过滤逻辑,剥离写死的 status 查询,改为使用 `scheduleStatus` 字段动态响应 Tabs 切换 (0: 未完成, 1: 已完成)。 3. 工单业务逻辑增强与状态流转 - 落实「工单查询逻辑设计方案」,优化底层的工单条件检索逻辑。 - 实现「添加工单启停功能」与「停工状态」,支持工单在执行过程中的暂停与恢复业务流转。 - 强化容错与防呆设计:操作「完成订单」时增加前置校验 `handleCheckFinish`,若生产状态为未完成,强制弹出二次确认 Modal,避免误操作。 # 相关讨论/参考方案 # - 添加工单启停功能 # - 停工状态功能设计方案 # - 工单查询逻辑设计方案 # - 工单完成进度显示优化
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java | 62 +++++++++++++++++++++----------
1 files changed, 42 insertions(+), 20 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java
index e474e63..aa30333 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java
@@ -26,7 +26,7 @@
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi;
-import cn.iocoder.yudao.module.erp.api.purchase.ErpSupplierApi;
+import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import org.springframework.security.core.Authentication;
@@ -67,7 +67,7 @@
private MesWmArrivalNoticeService arrivalNoticeService;
@Resource
@Lazy
- private ErpSupplierApi supplierApi;
+ private SrmSupplierApi srmSupplierApi;
@Resource
@Lazy
private MesQcIqcService iqcService;
@@ -114,7 +114,7 @@
// 鏍¢獙缂栫爜鍞竴
validateCodeUnique(reqVO.getId(), reqVO.getCode());
// 鏍¢獙渚涘簲鍟嗗瓨鍦紙閲囪喘鍏ュ簱浣跨敤 ERP 渚涘簲鍟嗭級
- supplierApi.validateSupplier(reqVO.getVendorId());
+ srmSupplierApi.getSupplier(reqVO.getVendorId());
// 鏍¢獙鍒拌揣閫氱煡鍗曞瓨鍦�
if (reqVO.getNoticeId() != null) {
MesWmArrivalNoticeDO notice = arrivalNoticeService.validateArrivalNoticeReadyForReceipt(reqVO.getNoticeId());
@@ -247,28 +247,49 @@
* 鍥炲啓 ERP 閲囪喘璁㈠崟鐨勫叆搴撴暟閲�
*/
private void updateErpPurchaseOrderInCount(MesWmItemReceiptDO receipt) {
- // 鑾峰彇鍏ュ簱鍗曡
- List<MesWmItemReceiptLineDO> lines = itemReceiptLineService.getItemReceiptLineListByReceiptId(receipt.getId());
- if (CollUtil.isEmpty(lines)) {
- return;
+ // 1. 纭畾閲囪喘璁㈠崟 ID锛氫紭鍏堜粠鍏ュ簱鍗曞ご鍙栵紙浠庡埌璐ч�氱煡鍗曞甫鍏ワ級锛屽叾娆′粠琛屽弽鏌�
+ Long purchaseOrderId = receipt.getPurchaseOrderId();
+ if (purchaseOrderId == null && receipt.getNoticeId() != null) {
+ // 浠庡叧鑱旂殑鍒拌揣閫氱煡鍗曡幏鍙栭噰璐鍗� ID
+ MesWmArrivalNoticeDO notice = arrivalNoticeService.getArrivalNotice(receipt.getNoticeId());
+ if (notice != null) {
+ purchaseOrderId = notice.getPurchaseOrderId();
+ }
}
- // 鐢ㄤ簬瀛樺偍閲囪喘璁㈠崟 ID锛岄伩鍏嶉噸澶嶆洿鏂�
- Long purchaseOrderId = null;
- // 閬嶅巻琛岋紝鎸� purchaseOrderItemId 鏇存柊鍏ュ簱鏁伴噺
- for (MesWmItemReceiptLineDO line : lines) {
- if (line.getPurchaseOrderItemId() != null && line.getReceivedQuantity() != null) {
- purchaseOrderApi.updateOrderItemInCount(line.getPurchaseOrderItemId(), line.getReceivedQuantity());
- // 鑾峰彇閲囪喘璁㈠崟 ID锛堜粠绗竴涓湁鏁堢殑鏄庣粏椤硅幏鍙栵級
- if (purchaseOrderId == null) {
- cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO itemDTO =
- purchaseOrderApi.getPurchaseOrderItem(line.getPurchaseOrderItemId()).getCheckedData();
- if (itemDTO != null && itemDTO.getOrderId() != null) {
- purchaseOrderId = itemDTO.getOrderId();
+
+ // 2. 鑾峰彇鍏ュ簱鍗曡锛屾寜 purchaseOrderItemId 鏇存柊鍏ュ簱鏁伴噺
+ List<MesWmItemReceiptLineDO> lines = itemReceiptLineService.getItemReceiptLineListByReceiptId(receipt.getId());
+ if (CollUtil.isNotEmpty(lines)) {
+ for (MesWmItemReceiptLineDO line : lines) {
+ if (line.getPurchaseOrderItemId() != null && line.getReceivedQuantity() != null) {
+ purchaseOrderApi.updateOrderItemInCount(line.getPurchaseOrderItemId(), line.getReceivedQuantity());
+ // 濡傛灉杩樻病鎷垮埌 purchaseOrderId锛屼粠鏄庣粏椤瑰弽鏌�
+ if (purchaseOrderId == null) {
+ cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO itemDTO =
+ purchaseOrderApi.getPurchaseOrderItem(line.getPurchaseOrderItemId()).getCheckedData();
+ if (itemDTO != null && itemDTO.getOrderId() != null) {
+ purchaseOrderId = itemDTO.getOrderId();
+ }
+ }
+ }
+ }
+ } else if (receipt.getNoticeId() != null) {
+ // 鍏滃簳锛氬叆搴撹涓虹┖鏃讹紝浠庡埌璐ч�氱煡鍗曡鍥炲啓鍏ュ簱鏁伴噺
+ List<MesWmArrivalNoticeLineDO> noticeLines = arrivalNoticeLineService
+ .getArrivalNoticeLineListByNoticeId(receipt.getNoticeId());
+ for (MesWmArrivalNoticeLineDO noticeLine : noticeLines) {
+ if (noticeLine.getPurchaseOrderItemId() != null) {
+ // 浣跨敤鍚堟牸鏁伴噺锛堟湁 IQC 鏃朵负鍚堟牸鏁伴噺锛屽惁鍒欎负鍒拌揣鏁伴噺锛�
+ BigDecimal qty = noticeLine.getQualifiedQuantity() != null
+ ? noticeLine.getQualifiedQuantity() : noticeLine.getArrivalQuantity();
+ if (qty != null && qty.compareTo(BigDecimal.ZERO) > 0) {
+ purchaseOrderApi.updateOrderItemInCount(noticeLine.getPurchaseOrderItemId(), qty);
}
}
}
}
- // 鏇存柊閲囪喘璁㈠崟鐨勫叆搴撶姸鎬�
+
+ // 3. 鏇存柊閲囪喘璁㈠崟鐨勫叆搴撶姸鎬�
if (purchaseOrderId != null) {
purchaseOrderApi.updateOrderInStatus(purchaseOrderId);
}
@@ -394,6 +415,7 @@
receipt.setCode(code);
receipt.setName(notice.getName() + "鍏ュ簱鍗�");
receipt.setNoticeId(arrivalNoticeId);
+ receipt.setPurchaseOrderId(notice.getPurchaseOrderId());
receipt.setPurchaseOrderCode(notice.getPurchaseOrderCode());
receipt.setVendorId(notice.getVendorId());
receipt.setReceiptDate(java.time.LocalDateTime.now()); // 鍏ュ簱鏃堕棿涓哄綋鍓嶆椂闂�
--
Gitblit v1.9.3