From 1ba0dbfde5634c8bf2ec20891d6b226b996f6b59 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 02 九月 2026 14:24:38 +0800
Subject: [PATCH] refactor(mes): 优化MES生产扫码入库功能支持多类型扫码

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/bagcode/MesProBagCodeMapper.java |   70 ++++++++++++++++++++++++++++++++++-
 1 files changed, 68 insertions(+), 2 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/bagcode/MesProBagCodeMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/bagcode/MesProBagCodeMapper.java
index 4a4906d..c0ae4ce 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/bagcode/MesProBagCodeMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/bagcode/MesProBagCodeMapper.java
@@ -27,6 +27,39 @@
         return selectOne(MesProBagCodeDO::getCode, code);
     }
 
+    default MesProBagCodeDO selectByCodeForUpdate(String code) {
+        return selectOne(new LambdaQueryWrapperX<MesProBagCodeDO>()
+                .eq(MesProBagCodeDO::getCode, code).last("FOR UPDATE"));
+    }
+
+    @org.apache.ibatis.annotations.Update("UPDATE mes_pro_bag_code SET inbound_time = NOW(), inbound_event_id = #{eventId}, inbound_device_code = #{deviceCode}, inbound_line_code = #{lineCode}, update_time = NOW() WHERE id = #{id} AND deleted = 0 AND inbound_event_id IS NULL")
+    int markInbound(@org.apache.ibatis.annotations.Param("id") Long id, @org.apache.ibatis.annotations.Param("eventId") Long eventId,
+                    @org.apache.ibatis.annotations.Param("deviceCode") String deviceCode, @org.apache.ibatis.annotations.Param("lineCode") String lineCode);
+
+    /** 鎵规鏁存壒鍏ュ簱鏃舵壒閲忔爣璁板叾涓嬫湭鍏ュ簱琚嬬爜锛堝箓绛夛級锛屼繚鎸佽鐮佷笌搴撳瓨鐘舵�佷竴鑷� */
+    @Update("UPDATE mes_pro_bag_code SET inbound_time = NOW(), inbound_event_id = #{eventId}, inbound_line_code = #{lineCode}, update_time = NOW() "
+            + "WHERE deleted = 0 AND inbound_event_id IS NULL AND batch_id = #{batchId}")
+    int markInboundByBatchId(@Param("batchId") Long batchId, @Param("eventId") Long eventId,
+                             @Param("lineCode") String lineCode);
+
+    /** 鏁存墭鍏ュ簱鏃舵壒閲忔爣璁版墭鐩樹笅鏈叆搴撹鐮侊紙骞傜瓑锛� */
+    @Update("UPDATE mes_pro_bag_code SET inbound_time = NOW(), inbound_event_id = #{eventId}, inbound_line_code = #{lineCode}, update_time = NOW() "
+            + "WHERE deleted = 0 AND inbound_event_id IS NULL AND pallet_id = #{palletId}")
+    int markInboundByPalletId(@Param("palletId") Long palletId, @Param("eventId") Long eventId,
+                              @Param("lineCode") String lineCode);
+
+    /**
+     * 鏇存柊琚嬬爜璐ㄦ鐘舵�侊紙绉嶅瓙璐ㄦ鍚堟牸/涓嶅悎鏍兼椂璁板綍璇ヨ缁撴灉锛�
+     *
+     * @param id       琚嬬爜缂栧彿
+     * @param qcStatus 璐ㄦ鐘舵�侊紙瑙� MesProBagCodeQcStatusEnum锛�
+     */
+    default void updateQcStatus(Long id, Integer qcStatus) {
+        update(null, new LambdaUpdateWrapper<MesProBagCodeDO>()
+                .eq(MesProBagCodeDO::getId, id)
+                .set(MesProBagCodeDO::getQcStatus, qcStatus));
+    }
+
     default List<MesProBagCodeDO> selectListByUuid(String uuid) {
         return selectList(MesProBagCodeDO::getUuid, uuid);
     }
@@ -95,8 +128,41 @@
      * @param batchId 鎵规缂栧彿
      * @return 鏈�澶ц搴忓彿锛屾棤璁板綍杩斿洖 0
      */
-    @Select("SELECT IFNULL(MAX(bag_no), 0) FROM mes_pro_bag_code WHERE batch_id = #{batchId}")
-    Integer selectMaxBagNo(@Param("batchId") Long batchId);
+    @Select("SELECT IFNULL(MAX(bag_no), 0) FROM mes_pro_bag_code")
+    Integer selectMaxBagNo();
+
+    @Update("<script>UPDATE mes_pro_bag_code SET batch_id = #{batchId}, batch_code = #{batchCode}, update_time = NOW() " +
+            "WHERE deleted = 0 AND batch_id IS NULL AND status = #{status} AND id IN " +
+            "<foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach></script>")
+    int bindBatchByIds(@Param("ids") Collection<Long> ids, @Param("batchId") Long batchId,
+                       @Param("batchCode") String batchCode, @Param("status") Integer status);
+
+    default List<MesProBagCodeDO> selectListByIdsForUpdate(Collection<Long> ids) {
+        return selectList(new LambdaQueryWrapperX<MesProBagCodeDO>()
+                .in(MesProBagCodeDO::getId, ids)
+                .orderByAsc(MesProBagCodeDO::getId)
+                .last("FOR UPDATE"));
+    }
+
+    @Update("<script>UPDATE mes_pro_bag_code SET status = #{toStatus}, cancel_time = #{cancelTime}, " +
+            "cancel_reason = #{cancelReason}, pallet_id = NULL, pallet_code = NULL, update_time = NOW() " +
+            "WHERE deleted = 0 AND id = #{id} AND status = #{fromStatus}</script>")
+    int cancelById(@Param("id") Long id, @Param("fromStatus") Integer fromStatus,
+                   @Param("toStatus") Integer toStatus, @Param("cancelTime") LocalDateTime cancelTime,
+                   @Param("cancelReason") String cancelReason);
+
+    @Update("UPDATE mes_pro_bag_code SET sales_id = #{salesId}, outbound_time = #{outboundTime}, update_time = NOW() "
+            + "WHERE id = #{id} AND deleted = 0")
+    void markOutbound(@Param("id") Long id, @Param("salesId") Long salesId,
+                      @Param("outboundTime") LocalDateTime outboundTime);
+
+    @Update("UPDATE mes_pro_bag_code SET sales_id = NULL, outbound_time = NULL, update_time = NOW() "
+            + "WHERE id = #{id} AND deleted = 0")
+    void clearOutbound(@Param("id") Long id);
+
+    @Select("SELECT COUNT(*) FROM mes_pro_bag_code WHERE batch_id = #{batchId} " +
+            "AND deleted = 0 AND status <> 30")
+    int selectEffectiveCountByBatchId(@Param("batchId") Long batchId);
 
     /**
      * 鎵归噺鏍囪涓哄凡瀵煎嚭鍗板埛锛堜粎鏇存柊澶勪簬鐩爣鍘熺姸鎬佺殑璁板綍锛�

--
Gitblit v1.9.3