From b3fe06c151dc8455649bf0a46e481ceb83e3ea2a Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期六, 07 十一月 2026 13:37:54 +0800
Subject: [PATCH] feat: 完成好水川 MOM 需求1/2/4/5/8(装箱、BOM成本、销售合同、劳动合同、留样)

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderMapper.java |   48 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 47 insertions(+), 1 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderMapper.java
index abeedfd..da53dbf 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderMapper.java
@@ -15,10 +15,15 @@
 /**
  * MES 鐢熶骇宸ュ崟 Mapper
  *
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
  */
 @Mapper
 public interface MesProWorkOrderMapper extends BaseMapperX<MesProWorkOrderDO> {
+
+    default List<MesProWorkOrderDO> lockScheduleOrders(List<Long> ids) {
+        return selectList(new LambdaQueryWrapperX<MesProWorkOrderDO>()
+                .in(MesProWorkOrderDO::getId, ids).orderByAsc(MesProWorkOrderDO::getId).last("FOR UPDATE"));
+    }
 
     default PageResult<MesProWorkOrderDO> selectPage(MesProWorkOrderPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<MesProWorkOrderDO>()
@@ -29,7 +34,10 @@
                 .eqIfPresent(MesProWorkOrderDO::getProductId, reqVO.getProductId())
                 .eqIfPresent(MesProWorkOrderDO::getClientId, reqVO.getClientId())
                 .eqIfPresent(MesProWorkOrderDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(MesProWorkOrderDO::getPackingStatus, reqVO.getPackingStatus())
                 .betweenIfPresent(MesProWorkOrderDO::getRequestDate, reqVO.getRequestDate())
+                .notIn(CollUtil.isNotEmpty(reqVO.getExcludeStatuses()),
+                        MesProWorkOrderDO::getStatus, reqVO.getExcludeStatuses())
                 .orderByDesc(MesProWorkOrderDO::getId));
     }
 
@@ -45,8 +53,12 @@
                 .eqIfPresent(MesProWorkOrderDO::getProductId, reqVO.getProductId())
                 .eqIfPresent(MesProWorkOrderDO::getClientId, reqVO.getClientId())
                 .eqIfPresent(MesProWorkOrderDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(MesProWorkOrderDO::getPackingStatus, reqVO.getPackingStatus())
                 .betweenIfPresent(MesProWorkOrderDO::getRequestDate, reqVO.getRequestDate())
                 .orderByDesc(MesProWorkOrderDO::getId);
+        if (CollUtil.isNotEmpty(reqVO.getExcludeStatuses())) {
+            wrapper.notIn(MesProWorkOrderDO::getStatus, reqVO.getExcludeStatuses());
+        }
         if (permittedClientIds != null) {
             if (CollUtil.isEmpty(permittedClientIds)) {
                 return PageResult.empty();
@@ -57,6 +69,20 @@
         }
         return selectPage(reqVO, wrapper);
     }
+
+    /**
+     * 鍒嗛〉鏌ヨ锛堝甫瀹㈡埛鏉冮檺杩囨护涓旀敮鎸佽皟搴︾姸鎬佹煡璇級
+     */
+    default PageResult<MesProWorkOrderDO> selectSchedulePage(MesProWorkOrderPageReqVO pageReqVO, List<Long> permittedClientIds) {
+        com.baomidou.mybatisplus.core.metadata.IPage<MesProWorkOrderDO> mpPage = cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils.buildPage(pageReqVO);
+        com.baomidou.mybatisplus.core.metadata.IPage<MesProWorkOrderDO> result = selectSchedulePage(mpPage, pageReqVO, permittedClientIds);
+        return new PageResult<>(result.getRecords(), result.getTotal());
+    }
+
+    com.baomidou.mybatisplus.core.metadata.IPage<MesProWorkOrderDO> selectSchedulePage(
+            com.baomidou.mybatisplus.core.metadata.IPage<MesProWorkOrderDO> page,
+            @org.apache.ibatis.annotations.Param("pageReqVO") MesProWorkOrderPageReqVO pageReqVO,
+            @org.apache.ibatis.annotations.Param("permittedClientIds") List<Long> permittedClientIds);
 
     default MesProWorkOrderDO selectByCode(String code) {
         return selectOne(MesProWorkOrderDO::getCode, code);
@@ -84,4 +110,24 @@
         return selectCount(MesProWorkOrderDO::getVendorId, vendorId);
     }
 
+    /**
+     * 绱姞宸ュ崟鐨勫凡瑁呯鏁伴噺涓庡凡瑁呯绠辨暟
+     */
+    default void updatePackedQuantity(Long id, BigDecimal incrQuantity, Integer incrBoxCount) {
+        update(null, new LambdaUpdateWrapper<MesProWorkOrderDO>()
+                .eq(MesProWorkOrderDO::getId, id)
+                .setSql("packed_quantity = IFNULL(packed_quantity, 0) + " + incrQuantity.toPlainString())
+                .setSql("packed_box_count = IFNULL(packed_box_count, 0) + " + incrBoxCount));
+    }
+
+    /**
+     * 鏍规嵁宸茶绠辨暟閲忛噸绠楄绠辩姸鎬侊細宸茶 >= 宸ュ崟鏁伴噺涓哄畬鎴�(2)锛岄儴鍒嗕负 1锛屽惁鍒� 0
+     */
+    default void updatePackingStatus(Long id) {
+        update(null, new LambdaUpdateWrapper<MesProWorkOrderDO>()
+                .eq(MesProWorkOrderDO::getId, id)
+                .setSql("packing_status = CASE WHEN IFNULL(packed_quantity, 0) >= IFNULL(quantity, 0) THEN 2 "
+                        + "WHEN IFNULL(packed_quantity, 0) > 0 THEN 1 ELSE 0 END"));
+    }
+
 }

--
Gitblit v1.9.3