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-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/sale/ErpSaleOrderMapper.java |   71 ++++++++++++++++++++---------------
 1 files changed, 41 insertions(+), 30 deletions(-)

diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/sale/ErpSaleOrderMapper.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/sale/ErpSaleOrderMapper.java
index 8ed3b6f..ac6dc97 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/sale/ErpSaleOrderMapper.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/sale/ErpSaleOrderMapper.java
@@ -1,22 +1,22 @@
 package cn.iocoder.yudao.module.erp.dal.mysql.sale;
 
 
+import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
 import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO;
 import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO;
 import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO;
-import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.apache.ibatis.annotations.Mapper;
 
-import java.util.Objects;
+import java.util.List;
 
 /**
  * ERP 閿�鍞鍗� Mapper
  *
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
  */
 @Mapper
 public interface ErpSaleOrderMapper extends BaseMapperX<ErpSaleOrderDO> {
@@ -27,38 +27,45 @@
                 .eqIfPresent(ErpSaleOrderDO::getCustomerId, reqVO.getCustomerId())
                 .betweenIfPresent(ErpSaleOrderDO::getOrderTime, reqVO.getOrderTime())
                 .eqIfPresent(ErpSaleOrderDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(ErpSaleOrderDO::getOutStatus, reqVO.getOutStatus())
+                .eqIfPresent(ErpSaleOrderDO::getProductionStatus, reqVO.getProductionStatus())
                 .likeIfPresent(ErpSaleOrderDO::getRemark, reqVO.getRemark())
                 .eqIfPresent(ErpSaleOrderDO::getCreator, reqVO.getCreator())
                 .orderByDesc(ErpSaleOrderDO::getId);
-        // 鍏ュ簱鐘舵�併�備负浠�涔堥渶瑕� t. 鐨勫師鍥狅紝鏄洜涓鸿仈琛ㄦ煡璇㈡椂锛岄渶瑕佹寚瀹氳〃鍚嶏紝涓嶇劧浼氭姤 out_count 閿欒
-        if (Objects.equals(reqVO.getOutStatus(), ErpSaleOrderPageReqVO.OUT_STATUS_NONE)) {
-            query.eq(ErpSaleOrderDO::getOutCount, 0);
-        } else if (Objects.equals(reqVO.getOutStatus(), ErpSaleOrderPageReqVO.OUT_STATUS_PART)) {
-            query.gt(ErpSaleOrderDO::getOutCount, 0).apply("t.out_count < t.total_count");
-        } else if (Objects.equals(reqVO.getOutStatus(), ErpSaleOrderPageReqVO.OUT_STATUS_ALL)) {
-            query.apply("t.out_count = t.total_count");
-        }
-        // 閫�璐х姸鎬�
-        if (Objects.equals(reqVO.getReturnStatus(), ErpSaleOrderPageReqVO.RETURN_STATUS_NONE)) {
-            query.eq(ErpSaleOrderDO::getReturnCount, 0);
-        } else if (Objects.equals(reqVO.getReturnStatus(), ErpSaleOrderPageReqVO.RETURN_STATUS_PART)) {
-            query.gt(ErpSaleOrderDO::getReturnCount, 0).apply("t.return_count < t.total_count");
-        } else if (Objects.equals(reqVO.getReturnStatus(), ErpSaleOrderPageReqVO.RETURN_STATUS_ALL)) {
-            query.apply("t.return_count = t.total_count");
-        }
-        // 鍙攢鍞嚭搴�
-        if (Boolean.TRUE.equals(reqVO.getOutEnable())) {
-            query.eq(ErpSaleOrderDO::getStatus, ErpAuditStatus.APPROVE.getStatus())
-                    .apply("t.out_count < t.total_count");
-        }
-        // 鍙攢鍞��璐�
-        if (Boolean.TRUE.equals(reqVO.getReturnEnable())) {
-            query.eq(ErpSaleOrderDO::getStatus, ErpAuditStatus.APPROVE.getStatus())
-                    .apply("t.return_count < t.out_count");
-        }
-        if (reqVO.getProductId() != null) {
+        if (reqVO.getProductId() != null || reqVO.getNeedProduction() != null) {
             query.leftJoin(ErpSaleOrderItemDO.class, ErpSaleOrderItemDO::getOrderId, ErpSaleOrderDO::getId)
                     .eq(reqVO.getProductId() != null, ErpSaleOrderItemDO::getProductId, reqVO.getProductId())
+                    .eq(reqVO.getNeedProduction() != null, ErpSaleOrderItemDO::getNeedProduction, reqVO.getNeedProduction())
+                    .groupBy(ErpSaleOrderDO::getId); // 閬垮厤 1 瀵瑰鏌ヨ锛屼骇鐢熺浉鍚岀殑 1
+        }
+        return selectJoinPage(reqVO, ErpSaleOrderDO.class, query);
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ锛堝甫瀹㈡埛鏉冮檺杩囨护锛�
+     */
+    default PageResult<ErpSaleOrderDO> selectPage(ErpSaleOrderPageReqVO reqVO, List<Long> permittedCustomerIds) {
+        MPJLambdaWrapperX<ErpSaleOrderDO> query = new MPJLambdaWrapperX<ErpSaleOrderDO>()
+                .likeIfPresent(ErpSaleOrderDO::getNo, reqVO.getNo())
+                .eqIfPresent(ErpSaleOrderDO::getCustomerId, reqVO.getCustomerId())
+                .betweenIfPresent(ErpSaleOrderDO::getOrderTime, reqVO.getOrderTime())
+                .eqIfPresent(ErpSaleOrderDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(ErpSaleOrderDO::getOutStatus, reqVO.getOutStatus())
+                .eqIfPresent(ErpSaleOrderDO::getProductionStatus, reqVO.getProductionStatus())
+                .likeIfPresent(ErpSaleOrderDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(ErpSaleOrderDO::getCreator, reqVO.getCreator())
+                .orderByDesc(ErpSaleOrderDO::getId);
+        // 瀹㈡埛鏉冮檺杩囨护
+        if (permittedCustomerIds != null) {
+            if (CollUtil.isEmpty(permittedCustomerIds)) {
+                return PageResult.empty();
+            }
+            query.in(ErpSaleOrderDO::getCustomerId, permittedCustomerIds);
+        }
+        if (reqVO.getProductId() != null || reqVO.getNeedProduction() != null) {
+            query.leftJoin(ErpSaleOrderItemDO.class, ErpSaleOrderItemDO::getOrderId, ErpSaleOrderDO::getId)
+                    .eq(reqVO.getProductId() != null, ErpSaleOrderItemDO::getProductId, reqVO.getProductId())
+                    .eq(reqVO.getNeedProduction() != null, ErpSaleOrderItemDO::getNeedProduction, reqVO.getNeedProduction())
                     .groupBy(ErpSaleOrderDO::getId); // 閬垮厤 1 瀵瑰鏌ヨ锛屼骇鐢熺浉鍚岀殑 1
         }
         return selectJoinPage(reqVO, ErpSaleOrderDO.class, query);
@@ -73,4 +80,8 @@
         return selectOne(ErpSaleOrderDO::getNo, no);
     }
 
+    default ErpSaleOrderDO selectByContractId(Long contractId) {
+        return selectOne(ErpSaleOrderDO::getContractId, contractId);
+    }
+
 }
\ No newline at end of file

--
Gitblit v1.9.3