From 0aacd330fca570ab3350aef5bda901f23aee23b3 Mon Sep 17 00:00:00 2001
From: wangfei <3597712270@qq.com>
Date: 星期三, 20 十一月 2024 13:51:00 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlass.java                                                     |   82 +
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageTask.java                         |   33 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java                           |    9 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java                                                       |    4 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskHistoryService.java                                        |    0 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskMapper.xml                                                |   12 
 hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/ywChangelog.sql                                                        |  179 +++
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageTask.java                                            |  645 ++++++++---
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java                                                        |  537 +++++++++-
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/impl/BigStorageBaseServiceImpl.java                         |  663 ++++++++++++
 hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml                                                                   |    3 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java                                                          |   15 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageHistoryTask.java                  |   55 +
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/EdgStorageDeviceTask.java                                          |   22 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageDetailsMapper.xml                                               |    3 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageHistoryTaskService.java          |   16 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageMapper.xml                                                      |    2 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/mapper/LoadGlassDeviceTaskMapper.xml                                                  |    1 
 hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-dev.yml                                                                |    5 
 hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageDetailsMapper.xml                                                          |   10 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/BigStorageBaseService.java                                  |   17 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/mapper/EdgStorageCageDetailsMapper.java                            |    2 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageTaskService.java                 |   25 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java                                      |    2 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageHistoryTaskMapper.java            |   16 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageTaskMapper.java                   |   24 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application.yml                                                                       |   11 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java                          |   10 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java                                    |    2 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java                           |   20 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTaskHistory.java                                                |    0 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassServiceImpl.java                                    |   19 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskHistoryDao.java                                             |    0 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java                 |    4 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageInTaskMapper.xml                                        |   38 
 hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java                                                           |  369 ++++--
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/opccallback/CacheGlassStartCallback.java                                      |   78 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/SlotSequenceDTO.java                                |    4 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageTaskServiceImpl.java        |   43 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml                                       |    2 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageHistoryTaskServiceImpl.java |   20 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskMapper.java                                                 |    0 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java             |    8 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceTaskHistoryServiceImpl.java                               |    0 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceOneTaskServiceImpl.java                                   |    0 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/mapper/TemperingGlassMapper.java                                               |   15 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassService.java                                             |   15 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java                                                                      |   37 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml                                                                   |    2 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskService.java                                               |    0 
 50 files changed, 2,562 insertions(+), 517 deletions(-)

diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java
index 29c8e17..a05dfe6 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java
@@ -30,8 +30,18 @@
      * A09鍑虹墖鐩爣浣嶇疆  d02鍗ц浆绔� 閽㈠寲鍑虹墖    3001
      * A10鍑虹墖鐩爣浣嶇疆  d05鍗ц浆绔� 浜哄伐鍑虹墖    3002
      */
-    public static final Integer TEMPERING_OUT_TARGET_POSITION = 3001;
-    public static final Integer ARTIFICIAL_OUT_TARGET_POSITION = 3002;
+//    public static final Integer TEMPERING_OUT_TARGET_POSITION = 3001;
+//    public static final Integer ARTIFICIAL_OUT_TARGET_POSITION = 3002;
+//    public static final List<Integer> OUT_TARGET_POSITION_ALL = Arrays.asList(3001, 3002);
+
+    /**
+     * 涔変箤纾ㄨ竟绾�
+     * A09鍑虹墖鐩爣浣嶇疆  d02鍗ц浆绔� 閽㈠寲鍑虹墖    930
+     * A10鍑虹墖鐩爣浣嶇疆  d05鍗ц浆绔� 浜哄伐鍑虹墖    931
+     */
+    public static final Integer TEMPERING_OUT_TARGET_POSITION = 930;
+    public static final Integer ARTIFICIAL_OUT_TARGET_POSITION = 931;
+    public static final List<Integer> OUT_TARGET_POSITION_ALL = Arrays.asList(930, 931);
 
     /**
      * 鍗у紡鐞嗙墖绗艰鎯呰〃鐜荤拑鐘舵��
@@ -85,7 +95,7 @@
     public static final Integer EDG_GLASS_SUCCESS = 2;
 
     /**
-     * 纾ㄨ竟浠诲姟鐜荤拑鐘舵��
+     * 澶х悊鐗囩鐘舵��
      * 1鍗曟満鑷姩鐘舵��
      * 2鑱旀満鑷姩鐘舵��
      * 3鎵嬪姩鐘舵��
@@ -93,6 +103,20 @@
     public static final Integer BIG_STORAGE_STAND_ALONE = 1;
     public static final Integer BIG_STORAGE_ONLINE = 2;
     public static final Integer BIG_STORAGE_MT = 3;
+
+    /**
+     * 澶х悊鐗囩浠诲姟绫诲瀷
+     * 1銆侀挗鍖栧墠杩涚墖
+     * 2銆侀挗鍖栧墠鍑虹墖
+     * 3銆侀挗鍖栧悗杩涚墖
+     * 4銆侀挗鍖栧悗鍑虹墖
+     */
+    public static final Integer BIG_STORAGE_BEFORE_IN = 1;
+    public static final Integer BIG_STORAGE_BEFORE_OUT = 2;
+    public static final Integer BIG_STORAGE_BEFORE_DISPATCH = 3;
+    public static final Integer BIG_STORAGE_AFTER_IN = 4;
+    public static final Integer BIG_STORAGE_AFTER_OUT = 5;
+    public static final Integer BIG_STORAGE_AFTER_DISPATCH = 6;
 
     /**
      * 澶х悊鐗囩璇锋眰
@@ -244,5 +268,12 @@
     public static final Integer LOAD_RAW_GLASS_NEW = 0;
     public static final Integer LOAD_RAW_GLASS_SUCCESS = 100;
 
+    /**
+     * 澶х悊鐗囩浠诲姟鍚姩淇″彿
+     * 0 绌轰换鍔�
+     * 1 鍚姩
+     */
+    public static final Integer BIG_STORAGE_TASK_EMPTY = 0;
+    public static final Integer BIG_STORAGE_TASK_RUNNING = 1;
 
 }
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java
similarity index 89%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java
index c4bef17..70d14bf 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java
@@ -31,6 +31,10 @@
     /**
      * 浠诲姟鐘舵�� 0榛樿绌轰换鍔� 1鎵ц涓� 2缁撴潫浠诲姟
      */
+    private Integer inkageState;
+    /**
+     * 浠诲姟鐘舵�� 0榛樿绌轰换鍔� 1鎵ц涓� 2缁撴潫浠诲姟
+     */
     private Integer taskState;
     /**
      * 鍒涘缓鏃堕棿
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTaskHistory.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTaskHistory.java
similarity index 100%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTaskHistory.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTaskHistory.java
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskHistoryDao.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskHistoryDao.java
similarity index 100%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskHistoryDao.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskHistoryDao.java
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskMapper.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskMapper.java
similarity index 100%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskMapper.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskMapper.java
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskHistoryService.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskHistoryService.java
similarity index 100%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskHistoryService.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskHistoryService.java
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskService.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskService.java
similarity index 100%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskService.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskService.java
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceOneTaskServiceImpl.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceOneTaskServiceImpl.java
similarity index 100%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceOneTaskServiceImpl.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceOneTaskServiceImpl.java
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceTaskHistoryServiceImpl.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceTaskHistoryServiceImpl.java
similarity index 100%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceTaskHistoryServiceImpl.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceTaskHistoryServiceImpl.java
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java
index f61e2c5..a646ab1 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java
@@ -23,5 +23,5 @@
      * @param state
      * @return
      */
-    List<Integer> listBySlotState(@Param("leftingStation") List<Integer> liftingStation, @Param("state") List<Integer> state);
+    List<RawGlassStorageDetails> listBySlotState(@Param("leftingStation") List<Integer> liftingStation, @Param("state") List<Integer> state);
 }
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java
index e5955cf..c5fc68a 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java
@@ -35,7 +35,7 @@
 
     String outWarehousing(Long slotId);
 
-    List<Integer> listBySlotState(List<Integer> liftingStation, List<Integer> state);
+    List<RawGlassStorageDetails> listBySlotState(List<Integer> liftingStation, List<Integer> state);
 
     String warehousingRequest(int leftingStation);
 
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java
index 746269b..d370c64 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java
@@ -57,17 +57,19 @@
     @Override
     public String warehousingRequest(int leftingStation) {
         RawGlassStorageDetails storageDetails = getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
-                .in(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN_ALL));
+                .in(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN_ALL)
+                .eq(RawGlassStorageDetails::getSlot, leftingStation));
         if (null != storageDetails) {
             log.info("褰撳墠鍚婅浣嶆湁鏋跺瓙锛岀粨鏉熸湰鍦板叆搴撹姹�");
             return "fail";
         }
-        List<Integer> shelfList = listBySlotState(Const.RAW_GLASS_DEVICE, Const.RAW_GLASS_STATE_IN_ALL);
+        List<RawGlassStorageDetails> shelfList = listBySlotState(Const.RAW_GLASS_DEVICE, Const.RAW_GLASS_STATE_IN_ALL);
         if (CollectionUtils.isEmpty(shelfList)) {
             log.info("褰撳墠宸ヤ綅涓嶅瓨鍦ㄥ彲鐢ㄧ殑绌烘灦瀛�");
             return "fail";
         }
-        Integer shelf = shelfList.get(0);
+        Integer shelf = shelfList.get(0).getSlot();
+        Integer deviceId = shelfList.get(0).getDeviceId();
         log.info("鐢熸垚浠诲姟");
         try {
             generateTask(shelf, leftingStation, shelf, 0, Const.RAW_GLASS_TASK_TYPE_IN_REQUEST);
@@ -78,6 +80,7 @@
         RawGlassStorageDetails details = new RawGlassStorageDetails();
         details.setSlot(shelf);
         details.setShelf(shelf);
+        details.setDeviceId(deviceId);
         details.setState(Const.RAW_GLASS_STATE_RUNNING);
         save(details);
         return "success";
@@ -126,7 +129,7 @@
     }
 
     @Override
-    public List<Integer> listBySlotState(List<Integer> liftingStation, List<Integer> state) {
+    public List<RawGlassStorageDetails> listBySlotState(List<Integer> liftingStation, List<Integer> state) {
         return baseMapper.listBySlotState(liftingStation, state);
     }
 
@@ -173,13 +176,10 @@
                 .shelf(shelf)
                 .createTime(new Date()).build();
         rawGlassStorageTaskService.save(task);
-
-
         List<ReadWriteEntity> list = new ArrayList<>();
-        list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
-//        list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
-        list.add(generateReadWriteEntity("A01-CC.dev.startSlot", startSlot));
-        list.add(generateReadWriteEntity("A01-CC.dev.endSlot", endSlot));
+        list.add(generateReadWriteEntity("PLC.CC.taskWord", 1));
+        list.add(generateReadWriteEntity("PLC.CC.startSlot", startSlot));
+        list.add(generateReadWriteEntity("PLC.CC.endSlot", endSlot));
         miloService.writeToOpcWord(list);
         return Boolean.TRUE;
     }
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlass.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlass.java
new file mode 100644
index 0000000..f5f52fa
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlass.java
@@ -0,0 +1,82 @@
+package com.mes.temperingglass.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mes.base.entity.BigStorageCageBaseInfo;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * (TemperingGlassInfo)琛ㄥ疄浣撶被
+ *
+ * @author makejava
+ * @since 2024-11-18 08:36:18
+ */
+@Data
+@TableName("tempering_glass_info")
+public class TemperingGlass extends BigStorageCageBaseInfo implements Serializable {
+    /**
+     * 閽㈠寲灏忕墖淇℃伅琛╥d
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 娴佺▼鍗�
+     */
+    private String flowCardId;
+    /**
+     * 娴佺▼鍗$幓鐠冪被鍨�
+     */
+    private Integer glassType;
+    /**
+     * 鍘氬害
+     */
+    private Double thickness;
+    /**
+     * 鑶滅郴
+     */
+    private String filmsid;
+    /**
+     * 鎬诲眰鏁�
+     */
+    private Integer totalLayer;
+    /**
+     * 灞傛暟
+     */
+    private Integer layer;
+    /**
+     * 閽㈠寲鏄惁鎺ュ彈妯斁
+     */
+    private Integer ishorizontal;
+    /**
+     * 閽㈠寲鐗堝浘id
+     */
+    private Integer temperingLayoutId;
+    /**
+     * 閽㈠寲鐗堝浘鐗囧簭
+     */
+    private Integer temperingFeedSequence;
+    /**
+     * 鏃嬭浆瑙掑害锛堥�嗘椂閽堬級
+     */
+    private Integer angle;
+    /**
+     * 宸ョ▼鍙�
+     */
+    private String engineerId;
+    /**
+     * 鐘舵��
+     */
+    private Integer state;
+    /**
+     * 閽㈠寲绫诲瀷
+     */
+    private Integer temperingType;
+
+    private String deleted;
+
+
+}
+
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/mapper/TemperingGlassMapper.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/mapper/TemperingGlassMapper.java
new file mode 100644
index 0000000..45d4f01
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/mapper/TemperingGlassMapper.java
@@ -0,0 +1,15 @@
+package com.mes.temperingglass.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.mes.temperingglass.entity.TemperingGlass;
+
+/**
+ * (TemperingGlassInfo)琛ㄦ暟鎹簱璁块棶灞�
+ *
+ * @author makejava
+ * @since 2024-11-18 08:36:17
+ */
+public interface TemperingGlassMapper extends MPJBaseMapper<TemperingGlass> {
+
+}
+
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassService.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassService.java
new file mode 100644
index 0000000..c66138b
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassService.java
@@ -0,0 +1,15 @@
+package com.mes.temperingglass.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.mes.temperingglass.entity.TemperingGlass;
+
+/**
+ * (TemperingGlassInfo)琛ㄦ湇鍔℃帴鍙�
+ *
+ * @author makejava
+ * @since 2024-11-18 08:36:18
+ */
+public interface TemperingGlassService extends MPJBaseService<TemperingGlass> {
+
+}
+
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassServiceImpl.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassServiceImpl.java
new file mode 100644
index 0000000..2a9d8f3
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassServiceImpl.java
@@ -0,0 +1,19 @@
+package com.mes.temperingglass.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.mes.temperingglass.entity.TemperingGlass;
+import com.mes.temperingglass.mapper.TemperingGlassMapper;
+import com.mes.temperingglass.service.TemperingGlassService;
+import org.springframework.stereotype.Service;
+
+/**
+ * (TemperingGlass)琛ㄦ湇鍔″疄鐜扮被
+ *
+ * @author makejava
+ * @since 2024-11-18 08:36:18
+ */
+@Service
+public class TemperingGlassServiceImpl extends MPJBaseServiceImpl<TemperingGlassMapper, TemperingGlass> implements TemperingGlassService {
+
+}
+
diff --git a/hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageDetailsMapper.xml b/hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageDetailsMapper.xml
index e9fc32e..53d09c7 100644
--- a/hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageDetailsMapper.xml
+++ b/hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageDetailsMapper.xml
@@ -2,9 +2,15 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.mes.rawglassdetails.mapper.RawGlassStorageDetailsMapper">
 
-    <select id="listBySlotState" resultType="java.lang.Integer">
+    <resultMap id="baseMap" type="com.mes.rawglassdetails.entity.RawGlassStorageDetails">
+        <result column="DEVICE_ID" property="deviceId"/>
+        <result column="SLOT" property="slot"/>
+    </resultMap>
+
+    <select id="listBySlotState" resultMap="baseMap">
         SELECT
-        T.SLOT
+        T.SLOT,
+        T.DEVICE_ID
         FROM
         RAW_GLASS_STORAGE_STATION T
         LEFT JOIN RAW_GLASS_STORAGE_DETAILS AS T1 ON T.DEVICE_ID = T1.DEVICE_ID
diff --git a/hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml b/hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml
index e859f86..e19a528 100644
--- a/hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml
+++ b/hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml
@@ -13,11 +13,10 @@
         <result column="state" property="state"/>
         <result column="group_number" property="groupNumber"/>
     </resultMap>
-    <select id="queryRawGlassByEngineeringId" resultType="com.mes.uppattenusage.entity.vo.UpPattenUsageVO">
+    <select id="queryRawGlassByEngineeringId" resultMap="baseMap">
         SET @prev_width := NULL;
         SET @prev_height := NULL;
         SET @counter := 0;
-
         SELECT t.*,
                @counter := IF(@prev_width = width and @prev_height = height, @counter, @counter + 1) AS group_number,
                @prev_width := width,
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/mapper/EdgStorageCageDetailsMapper.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/mapper/EdgStorageCageDetailsMapper.java
index c7ddd26..8dd8e31 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/mapper/EdgStorageCageDetailsMapper.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/mapper/EdgStorageCageDetailsMapper.java
@@ -13,5 +13,5 @@
  */
 public interface EdgStorageCageDetailsMapper extends MPJBaseMapper<EdgStorageCageDetails> {
 
-    EdgStorageCageDetails queryEdgStorageDetailsBySize(double width, double height);
+    EdgStorageCageDetails queryEdgStorageDetailsBySize(int deviceId, int currentSlot, double width, double height);
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java
index d8be128..43d2024 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java
@@ -9,7 +9,7 @@
 
 /**
  * <p>
- *  鏈嶅姟绫�
+ * 鏈嶅姟绫�
  * </p>
  *
  * @author zhoush
@@ -21,18 +21,22 @@
 
     /**
      * 鑾峰彇 鍒囧壊褰撳墠鐗堝浘
+     *
      * @return
      */
     List<Map<String, Object>> selectCutTerritory();
 
     /**
      * 鑾峰彇 宸ョ▼涓嬬殑褰撳墠鐗堝浘
+     *
      * @param current
      * @return
      */
     List<List<Map<String, Object>>> selectCurrentCutTerritory(String current);
+
     /**
      * 鑾峰彇 宸ョ▼涓嬬殑閽㈠寲鐗堝浘
+     *
      * @param current
      * @return
      */
@@ -40,6 +44,7 @@
 
     /**
      * 鏌ヨ绗煎唴鐗堝浘宸�艰寖鍥村唴鐨�  姝ゅ昂瀵哥幓鐠�  濡傛棤鍒欐寜鐓� 閽㈠寲鐗堝浘搴忓彿 浠ュ強鐜荤拑搴忓彿
+     *
      * @param glassId
      * @param threshold
      * @return
@@ -82,9 +87,10 @@
     /**
      * 鎸夌収灏哄
      *
+     * @param deviceId
      * @param width
      * @param height
      * @return
      */
-    EdgStorageCageDetails queryEdgStorageDetailsBySize(double width, double height);
+    EdgStorageCageDetails queryEdgStorageDetailsBySize(int deviceId, int currentSlot, double width, double height);
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java
index 08b79ea..a401280 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java
@@ -525,7 +525,7 @@
     }
 
     @Override
-    public EdgStorageCageDetails queryEdgStorageDetailsBySize(double width, double height) {
-        return baseMapper.queryEdgStorageDetailsBySize(width, height);
+    public EdgStorageCageDetails queryEdgStorageDetailsBySize(int deviceId, int currentSlot, double width, double height) {
+        return baseMapper.queryEdgStorageDetailsBySize(deviceId, currentSlot, width, height);
     }
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java
index 5d92126..68cc6a7 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java
@@ -1,22 +1,36 @@
 package com.mes.job;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.kangaroohy.milo.model.ReadWriteEntity;
-import com.kangaroohy.milo.runner.subscription.SubscriptionCallback;
 import com.kangaroohy.milo.service.MiloService;
 import com.mes.common.config.Const;
 import com.mes.edgglasstaskqueueinfo.entity.EdgGlassTaskQueueInfo;
 import com.mes.edgglasstaskqueueinfo.service.EdgGlassTaskQueueInfoService;
+import com.mes.edgstoragecage.entity.EdgStorageCage;
+import com.mes.edgstoragecage.entity.EdgStorageCageDetails;
+import com.mes.edgstoragecage.service.EdgStorageCageDetailsService;
+import com.mes.edgstoragecage.service.EdgStorageCageService;
+import com.mes.glassinfo.entity.GlassInfo;
+import com.mes.glassinfo.service.GlassInfoService;
 import com.mes.opctask.entity.EdgStorageDeviceTask;
+import com.mes.opctask.entity.EdgStorageDeviceTaskHistory;
+import com.mes.opctask.service.EdgStorageDeviceTaskHistoryService;
 import com.mes.opctask.service.EdgStorageDeviceTaskService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -36,90 +50,497 @@
     MiloService miloService;
 
 
-    @Resource(name = "cacheGlassStartCallback")
-    SubscriptionCallback cacheGlassStartCallback;
-
-    @Resource(name = "cacheGlassTestCallback")
-    SubscriptionCallback cacheGlassTestCallback;
+//    @Resource(name = "cacheGlassStartCallback")
+//    SubscriptionCallback cacheGlassStartCallback;
+//
+//    @Resource(name = "cacheGlassTestCallback")
+//    SubscriptionCallback cacheGlassTestCallback;
 
     @Resource
     EdgStorageDeviceTaskService edgStorageDeviceTaskService;
     @Resource
     EdgGlassTaskQueueInfoService edgGlassTaskQueueInfoService;
-    private int sum = 0;
+    @Resource
+    GlassInfoService glassInfoService;
+    @Resource
+    EdgStorageCageDetailsService edgStorageCageDetailsService;
+    @Resource
+    EdgStorageCageService edgStorageCageService;
+    @Resource
+    EdgStorageDeviceTaskHistoryService edgStorageDeviceTaskHistoryService;
 
-    @Scheduled(fixedDelay = 10)
-    public void startOpcTask() throws Exception {
-//        miloService.subscriptionFromOpcUa(Arrays.asList("C101-WL.S7-1200.plc_task_state", "D101-WL.S7-1200.plc_task_state"), cacheGlassStartCallback);
-//        miloService.subscriptionFromOpcUa(Arrays.asList("mes.dec.edg_storage_device_one_task[1].task_state", "D101-WL.S7-1200.plc_task_state"), cacheGlassTestCallback);
-//        log.info("--------------------s---------------------------");
-        EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage("edg_storage_device_one_task");
+    @Value("${mes.glassGap}")
+    private int glassGap;
+    @Value("${mes.threshold}")
+    private int threshold;
+    @Value("${mes.cellLength}")
+    private int cellLength;
+
+    private String glassIdOne = "";
+    private String glassIdTwo = "";
+
+//    @Scheduled(fixedDelay = Long.MAX_VALUE)
+//    public void startOneOpcTask() throws Exception {
+//        miloService.subscriptionFromOpcUa(Arrays.asList("mes.WL1.edg_storage_device_one_task[1].task_state"), cacheGlassStartCallback);
+//    }
+//
+//    @Scheduled(fixedDelay = Long.MAX_VALUE)
+//    public void startTwoOpcTask() throws Exception {
+//        miloService.subscriptionFromOpcUa(Arrays.asList("mes.WL2.edg_storage_device_two_task[1].task_state"), cacheGlassStartCallback);
+//    }
+
+    @Scheduled(fixedDelay = 1000)
+    public void startOneOpcTask() {
+        startOneOpcTaskChild(EDG_STORAGE_DEVICE_ONE_TASK, 1);
+    }
+
+    @Scheduled(fixedDelay = 1000)
+    public void startTwoOpcTask() {
+        startOneOpcTaskChild(EDG_STORAGE_DEVICE_TWO_TASK, 2);
+    }
+
+    private void startOneOpcTaskChild(String tableName, int device) {
+        EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage(tableName);
         try {
             if (task == null) {
                 log.info("浠诲姟琛ㄥ熀纭�鏁版嵁褰曞叆澶辫触锛岃妫�鏌ユ暟鎹槸鍚﹀綍鍏ユ垚鍔�");
                 return;
             }
-            if (task.getTaskState() == sum) {
-                return;
+            if (task.getTaskState() == 2) {
+                //闃叉鍑虹墖浠诲姟涓旂鍓嶆湁鐜荤拑鐨勬儏鍐碉紝灏嗚繘鐗噄d缃┖锛屽嵆鍑虹墖浠呰�冭檻绗煎唴鐨勭幓鐠�
+                task.setGlassIdIn("");
             }
-            sum = task.getTaskState();
-            task.setTaskRunning(sum);
-            log.info("褰撳墠绗瑊}娆℃墽琛�", task.getTaskRunning());
-//            task.setTaskState(task.getTaskRunning());
-            edgStorageDeviceTaskService.updateTaskMessage("edg_storage_device_one_task", task);
+            int request = task.getTaskState();
+            log.info("寮�濮嬫墽琛屼换鍔★紝浠诲姟璇蜂俊鎭负{}", task);
+            if (request == 0) {
+                log.info("鏈敹鍒颁换鍔¤姹傦紝缁撴潫鏈浠诲姟");
+            } else if (request == 1) {
+                //杩涚墖浠诲姟
+                log.info("杩涚墖浠诲姟锛氳繘鐗囩幓鐠僫d涓猴細{}", task.getGlassIdIn());
+                intoTask(task, tableName, device);
+            } else if (request == 2) {
+                //鍑虹墖浠诲姟
+                outTask(task, tableName, device);
+            } else if (request == 3) {
+                //鐩撮�氫换鍔�
+                if (!outTask(task, tableName, device)) {
+                    intoTask(task, tableName, device);
+                }
+            } else if (request == 4) {
+                log.info("灏嗗惎鍔ㄥ瓙鏀逛负0");
+                task.setTaskRunning(Const.GLASS_CACHE_TYPE_RUNNING);
+                edgStorageDeviceTaskService.updateTaskMessage(tableName, task);
+            } else {
+                finishTask(task, tableName);
+            }
         } catch (Exception e) {
-            log.info("{}", e.getMessage());
+            log.info("鎵ц浠诲姟杩囩▼涓彂鐢熷紓甯革紝浠诲姟瀛梴}锛寋}", task.getTaskState(), e.getMessage());
+            log.info("灏嗗惎鍔ㄥ瓙鏀逛负0");
+            task.setTaskState(Const.GLASS_CACHE_TYPE_EMPTY);
+            edgStorageDeviceTaskService.updateTaskMessage(tableName, task);
         }
     }
 
-//    mesControlWord glassId
-//    width height
-//    thickness             filmRemove
-//    deviceControlWord             deviceWarnState
 
-    //    @Scheduled(fixedDelay = 1000)
-    public void edgOpcTask() throws Exception {
-        ReadWriteEntity controlEntity = miloService.readFromOpcUa("A001-MB1.dev.deviceControlWord");
-        String deviceControlWord = (String) controlEntity.getValue();
-        if ("0".equals(deviceControlWord)) {
-            ReadWriteEntity messageEntity = miloService.readFromOpcUa("A001-MB1.dev.mesControlWord");
-            String messageValue = (String) messageEntity.getValue();
-            if ("1".equals(messageValue)) {
-                List<ReadWriteEntity> list = new ArrayList<>();
-                list.add(generateReadWriteEntity("A001-MB1.dev.mesControlWord", 0));
-                miloService.writeToOpcWord(list);
-            }
-            log.info("褰撳墠鏈敹鍒扮(杈规満鐨勮姹備换鍔�");
-            return;
-        }
+    @Scheduled(fixedDelay = 1000)
+    public void edgOneOpcTask() throws Exception {
         EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage(EDG_STORAGE_DEVICE_ONE_TASK);
         String glassId = task.getGlassId();
-        if (StringUtils.isBlank(glassId)) {
-            log.info("纾ㄨ竟鍓嶇殑鏋跺瓙娌℃湁鐜荤拑淇℃伅");
+        if (StringUtils.isBlank(glassId) || glassId.equals(glassIdOne)) {
+            log.info("{}鍙风嚎纾ㄨ竟鍓嶇幓鐠冩湭灏变綅锛岀粨鏉熸湰娆′换鍔�", 1);
             return;
         }
-        //鑾峰彇纾ㄨ竟瀵瑰垪
-        EdgGlassTaskQueueInfo edgInfo = edgGlassTaskQueueInfoService.getOne(new LambdaQueryWrapper<EdgGlassTaskQueueInfo>()
-                .eq(EdgGlassTaskQueueInfo::getGlassId, glassId)
-                .eq(EdgGlassTaskQueueInfo::getState, Const.GLASS_STATE_NEW));
-        if (edgInfo == null) {
+        edgTaskChild(glassId, 1);
+    }
+
+    @Scheduled(fixedDelay = 1000)
+    public void edgTwoOpcTask() throws Exception {
+        EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage(EDG_STORAGE_DEVICE_TWO_TASK);
+        String glassId = task.getGlassId();
+        if (StringUtils.isBlank(glassId) || glassId.equals(glassIdTwo)) {
+            log.info("{}鍙风嚎纾ㄨ竟鍓嶇幓鐠冩湭灏变綅锛岀粨鏉熸湰娆′换鍔�", 2);
+            return;
+        }
+        edgTaskChild(glassId, 2);
+    }
+
+    private void edgTaskChild(String glassId, int cell) throws Exception {
+        GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId).last("limit 1"));
+        if (glassInfo == null) {
             log.info("瀵瑰垪琛ㄤ腑鐨勭幓鐠僫d閿欒锛岃妫�鏌ユ暟鎹紝鐜荤拑id锛歿}", glassId);
             return;
         }
+        String toEndingId = glassInfo.getTemperingLayoutId() + "" + glassInfo.getTemperingFeedSequence();
         List<ReadWriteEntity> list = new ArrayList<>();
-        list.add(generateReadWriteEntity("A001-MB1.dev.mesControlWord", 1));
-        list.add(generateReadWriteEntity("A001-MB1.dev.glassId", glassId));
-        list.add(generateReadWriteEntity("A001-MB1.dev.width", edgInfo.getWidth()));
-        list.add(generateReadWriteEntity("A001-MB1.dev.height", edgInfo.getHeight()));
-        list.add(generateReadWriteEntity("A001-MB1.dev.thickness", edgInfo.getThickness()));
-        list.add(generateReadWriteEntity("A001-MB1.dev.filmRemove", 0));
-        miloService.writeToOpcWord(list);
+//        list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".mesControl", true));
+        list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".glassId", Integer.parseInt(toEndingId)));
+        list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".toEdingId", Integer.parseInt(toEndingId)));
+        list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".width", (int) Math.max(glassInfo.getWidth() * 10, glassInfo.getHeight() * 10)));
+        list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".height", (int) Math.min(glassInfo.getWidth() * 10, glassInfo.getHeight() * 10)));
+
+        miloService.writeToOpcUa(list);
+        miloService.writeToOpcWord(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".thickness", (int) glassInfo.getThickness() * 10));
+        //淇敼纾ㄨ竟瀵瑰垪涓殑纾ㄨ竟绾胯矾鍙婄姸鎬�
+        edgGlassTaskQueueInfoService.update(new LambdaUpdateWrapper<EdgGlassTaskQueueInfo>()
+                .set(EdgGlassTaskQueueInfo::getLine, cell)
+                .set(EdgGlassTaskQueueInfo::getState, Const.EDG_GLASS_START)
+                .eq(EdgGlassTaskQueueInfo::getGlassId, glassId)
+                .eq(EdgGlassTaskQueueInfo::getState, Const.EDG_GLASS_BEFORE));
+        if (cell == 1) {
+            glassIdOne = glassId;
+        } else {
+            glassIdTwo = glassId;
+        }
+
+    }
+
+    private boolean intoTask(EdgStorageDeviceTask task, String tableName, int deviceId) {
+        //鑾峰彇鐜荤拑鐨勫熀鏈俊鎭�
+        GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, task.getGlassIdIn()));
+        if (null == glassInfo) {
+            log.info("杩涚墖鐜荤拑淇℃伅涓嶅瓨鍦紝鐜荤拑id:{}", task.getGlassIdIn());
+            return Boolean.FALSE;
+        }
+        //鑾峰彇褰撳墠杩涚墖鐜荤拑id鍜岃繘鐗囨牸瀛�  鐩稿悓灏哄鍙互鏀句笅鐨勬牸瀛�
+        EdgStorageCage edgStorageCage = edgStorageCageService.getEdgStorageCageBySize(deviceId, glassInfo.getWidth(), glassInfo.getHeight(), task.getCurrentCell());
+        if (edgStorageCage == null) {
+            log.info("鐩稿悓灏哄鍙互鏀句笅鐨勬牸瀛愭湭鎵惧埌锛屾牸瀛恑d:{}", task.getCurrentCell());
+//            SELECT * from edg_storage_cage where device_id = 1 and remain_width > 1000 order by abs(slot - 10)
+            List<EdgStorageCage> storageCageList = edgStorageCageService.list(new LambdaQueryWrapper<EdgStorageCage>()
+                    .eq(EdgStorageCage::getDeviceId, deviceId)
+                    .eq(EdgStorageCage::getEnableState, Const.SLOT_ON)
+                    .ge(EdgStorageCage::getRemainWidth, Math.max(glassInfo.getWidth(), glassInfo.getHeight())).last("order by abs(slot - " + task.getCurrentCell() + ")"));
+//            //鐩撮�氫换鍔�
+//            if (flag && CollectionUtil.isNotEmpty(emptyList)) {
+//                return emptyList.get(0);
+//            }
+            if (CollectionUtil.isEmpty(storageCageList) || storageCageList.size() == 1) {
+                log.info("娌℃湁澶氫綑鐨勭┖鏍煎瓙");
+                return Boolean.FALSE;
+            }
+            edgStorageCage = storageCageList.get(0);
+        }
+        log.info("4銆佸皢鐜荤拑淇℃伅鎻掑叆鍗у紡鐞嗙墖绗�,褰撳墠鐜荤拑淇℃伅:{}", glassInfo);
+        EdgStorageCageDetails details = new EdgStorageCageDetails();
+        BeanUtils.copyProperties(glassInfo, details);
+        details.setState(Const.GLASS_STATE_IN);
+        details.setSlot(edgStorageCage.getSlot());
+        details.setDeviceId(edgStorageCage.getDeviceId());
+        edgStorageCageDetailsService.save(details);
+
+        //鏇存柊浠诲姟淇℃伅
+        task.setStartCell(edgStorageCage.getSlot());
+        task.setTaskRunning(Const.GLASS_CACHE_TYPE_IN);
+        edgStorageDeviceTaskService.updateTaskMessage(tableName, task);
+        saveHistoryTask(task);
+        return Boolean.TRUE;
+    }
+
+    private boolean outTask(EdgStorageDeviceTask task, String tableName, int deviceId) {
+        EdgStorageCageDetails edgStorageCageDetails = null;
+        //绗煎唴鏄増鍥剧浉宸槸鍚﹁秴杩囬槇鍊�
+        boolean flag = queryMaxMinDiff(threshold);
+        if (flag) {
+            EdgStorageCageDetails minEdgDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                    .inSql(EdgStorageCageDetails::getSlot, "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON)
+                    .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                    .eq(EdgStorageCageDetails::getDeviceId, deviceId)
+                    .orderByAsc(EdgStorageCageDetails::getTemperingLayoutId)
+                    .orderBy(Boolean.TRUE, Boolean.TRUE, EdgStorageCageDetails::getTemperingFeedSequence)
+                    .last("limit 1"));
+//            select * from edg_storage_cage_details where width = 551 and height = 1151 and id in (select min(id ) from edg_storage_cage_details where state = 100 group by slot )
+            edgStorageCageDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                    .eq(EdgStorageCageDetails::getWidth, minEdgDetails.getWidth())
+                    .eq(EdgStorageCageDetails::getHeight, minEdgDetails.getHeight())
+                    .eq(EdgStorageCageDetails::getDeviceId, deviceId)
+                    .inSql(EdgStorageCageDetails::getId, "select min(id) from edg_storage_cage_details where state = 100 group by slot ")
+                    .last("order by abs(slot - " + task.getCurrentCell() + ")  asc limit 1")
+            );
+            //缁欑洿閫氫换鍔�
+            if (null == edgStorageCageDetails && StringUtils.isNotBlank(task.getGlassIdIn())) {
+                GlassInfo glassInInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>()
+                        .eq(GlassInfo::getGlassId, task.getGlassIdIn())
+                        .eq(GlassInfo::getWidth, minEdgDetails.getWidth())
+                        .eq(GlassInfo::getHeight, minEdgDetails.getHeight()));
+                if (null != glassInInfo) {
+                    edgStorageCageDetails = new EdgStorageCageDetails();
+                    BeanUtils.copyProperties(glassInInfo, edgStorageCageDetails);
+                }
+            }
+            if (null == edgStorageCageDetails) {
+                edgStorageCageDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                        .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                        .eq(EdgStorageCageDetails::getDeviceId, deviceId)
+                        .eq(EdgStorageCageDetails::getSlot, minEdgDetails.getSlot())
+                        .orderByAsc(EdgStorageCageDetails::getId)
+                        .last("limit 1")
+                );
+            }
+        }
+        if (null == edgStorageCageDetails) {
+            //        鑾峰彇涓婃浠诲姟
+//        鑾峰彇鍘嗗彶琛ㄤ腑涓婃浠诲姟鏈�鍚庝竴鐗囧昂瀵�
+            EdgStorageDeviceTaskHistory edgeData = edgStorageDeviceTaskHistoryService.getOne(new LambdaQueryWrapper<EdgStorageDeviceTaskHistory>()
+                    .eq(EdgStorageDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_SUCCESS)
+                    .in(EdgStorageDeviceTaskHistory::getTaskType, Const.GLASS_CACHE_TYPE_OUT, Const.GLASS_CACHE_TYPE_THROUGH)
+                    .orderByDesc(EdgStorageDeviceTaskHistory::getId).last("limit 1"));
+            if (null != edgeData) {
+                GlassInfo glassOutInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, edgeData.getGlassIdOut()));
+                //绗煎唴鐨勭幓鐠冪殑灏哄鏄惁鍜屼笂涓�娆′换鍔′竴鑷�
+                edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(deviceId, task.getCurrentCell(), glassOutInfo.getWidth(), glassOutInfo.getHeight());
+                if (null == edgStorageCageDetails && StringUtils.isNotBlank(task.getGlassIdIn())) {
+                    GlassInfo glassInInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>()
+                            .eq(GlassInfo::getGlassId, task.getGlassIdIn())
+                            .eq(GlassInfo::getWidth, glassOutInfo.getWidth())
+                            .eq(GlassInfo::getHeight, glassOutInfo.getHeight()));
+                    if (null != glassInInfo) {
+                        edgStorageCageDetails = new EdgStorageCageDetails();
+                        BeanUtils.copyProperties(glassInInfo, edgStorageCageDetails);
+                    }
+                }
+            }
+        }
+        if (null == edgStorageCageDetails) {
+            edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(deviceId, task.getCurrentCell(), 0, 0);
+        }
+        if (edgStorageCageDetails == null && StringUtils.isNotBlank(task.getGlassIdIn())) {
+            //鍜屼笂娆′换鍔′笉瀛樺湪鐩稿悓灏哄
+            GlassInfo glassInInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, task.getGlassIdIn()));
+            edgStorageCageDetails = new EdgStorageCageDetails();
+            BeanUtils.copyProperties(glassInInfo, edgStorageCageDetails);
+        }
+        if (edgStorageCageDetails == null) {
+            //鍜屼笂娆′换鍔′笉瀛樺湪鐩稿悓灏哄
+            log.info("绗煎唴娌℃湁鐜荤拑浜�");
+            return Boolean.FALSE;
+        }
+        int taskType = Const.GLASS_CACHE_TYPE_OUT;
+        String glassId = edgStorageCageDetails.getGlassId();
+        if (glassId.equals(task.getGlassIdIn())) {
+            if (3 != task.getTaskState()) {
+                return Boolean.FALSE;
+            }
+            log.info("5銆佺洿閫氫换鍔�,灏嗙幓鐠冧俊鎭彃鍏ュ崸寮忕悊鐗囩,褰撳墠鐜荤拑淇℃伅:{}", edgStorageCageDetails);
+            //鐜荤拑淇℃伅鏇挎崲
+            String glassIdChange = queryAndChangeGlass(glassId);
+            //澶勭悊鍦ㄥ崸鐞嗗唴鐨勭幓鐠冧俊鎭細绗煎唴鐨勬暟鎹鐞�
+            queryEdgAndChangeGlass(edgStorageCageDetails.getGlassId(), glassIdChange);
+            if (StringUtils.isNotBlank(glassIdChange)) {
+                edgStorageCageDetails = new EdgStorageCageDetails();
+                GlassInfo one = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId));
+                BeanUtils.copyProperties(one, edgStorageCageDetails);
+            }
+            EdgStorageCage storageCage = edgStorageCageService.getOne(new LambdaQueryWrapper<EdgStorageCage>()
+                    .eq(EdgStorageCage::getDeviceId, deviceId)
+                    .eq(EdgStorageCage::getEnableState, Const.SLOT_ON)
+                    .ge(EdgStorageCage::getRemainWidth, cellLength)
+                    .last("order by abs(slot - " + task.getCurrentCell() + ") limit 1"));
+            Assert.isTrue(null != storageCage, "鏍煎瓙宸叉弧,鏃犳硶鎵ц鐩撮�氫换鍔�");
+            log.info("3銆佹煡璇㈠崸寮忕悊鐗囩閲岄潰鐨勭┖鏍�:{}", storageCage);
+            edgStorageCageDetails.setSlot(storageCage.getSlot());
+            edgStorageCageDetails.setDeviceId(storageCage.getDeviceId());
+            edgStorageCageDetails.setState(Const.GLASS_STATE_OUT);
+            edgStorageCageDetailsService.save(edgStorageCageDetails);
+            taskType = Const.GLASS_CACHE_TYPE_THROUGH;
+        } else {
+            log.info("5銆侀潪鐩撮�氫换鍔�,灏嗙幓鐠冧俊鎭彃鍏ュ崸寮忕悊鐗囩,褰撳墠鐜荤拑淇℃伅:{}", edgStorageCageDetails);
+            if (!edgStorageCageDetails.getSlot().equals(task.getCurrentCell())) {
+                EdgStorageCageDetails currentGlass = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                        .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                        .eq(EdgStorageCageDetails::getDeviceId, deviceId)
+                        .eq(EdgStorageCageDetails::getSlot, task.getCurrentCell()).eq(EdgStorageCageDetails::getWidth, edgStorageCageDetails.getWidth())
+                        .eq(EdgStorageCageDetails::getHeight, edgStorageCageDetails.getHeight()).eq(EdgStorageCageDetails::getThickness, edgStorageCageDetails.getThickness())
+                        .orderByAsc(EdgStorageCageDetails::getId).last("limit 1")
+                );
+                if (null != currentGlass) {
+                    edgStorageCageDetails = currentGlass;
+                }
+            }
+            //鐜荤拑淇℃伅鏇挎崲
+            String glassIdChange = queryAndChangeGlass(edgStorageCageDetails.getGlassId());
+            //澶勭悊鍦ㄥ崸鐞嗗唴鐨勭幓鐠冧俊鎭細绗煎唴鐨勬暟鎹鐞�
+            queryEdgAndChangeGlass(edgStorageCageDetails.getGlassId(), glassIdChange);
+            LambdaUpdateWrapper<EdgStorageCageDetails> wrapper = new LambdaUpdateWrapper<>();
+            wrapper.eq(EdgStorageCageDetails::getGlassId, edgStorageCageDetails.getGlassId()).set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT);
+            edgStorageCageDetailsService.update(wrapper);
+            log.info("5銆佹洿鏂板嚭鐗囩幓鐠冪殑鐘舵�佷负{}", Const.GLASS_STATE_OUT);
+        }
+        //鐢熸垚鍑虹墖浠诲姟
+        task.setGlassIdOut(edgStorageCageDetails.getGlassId());
+        task.setStartCell(edgStorageCageDetails.getSlot());
+        task.setTaskRunning(taskType);
+
+        edgStorageDeviceTaskService.updateTaskMessage(tableName, task);
+        saveHistoryTask(task);
+        //鏇存柊璇︽儏琛ㄤ换鍔″嚭鐗囦腑
+        edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>()
+                .set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT)
+                .eq(EdgStorageCageDetails::getGlassId, edgStorageCageDetails.getGlassId()));
+        //纾ㄨ竟瀵瑰垪琛ㄦ柊澧炰竴鏉℃暟鎹�
+        EdgGlassTaskQueueInfo edgInfo = new EdgGlassTaskQueueInfo();
+        BeanUtils.copyProperties(task, edgInfo);
+        edgInfo.setGlassId(edgStorageCageDetails.getGlassId());
+        edgInfo.setCreateTime(new Date());
+        edgInfo.setWidth((int) edgStorageCageDetails.getWidth());
+        edgInfo.setHeight((int) edgStorageCageDetails.getHeight());
+        edgInfo.setThickness((int) edgStorageCageDetails.getThickness());
+        edgInfo.setState(Const.EDG_GLASS_BEFORE);
+        edgGlassTaskQueueInfoService.save(edgInfo);
+        return Boolean.TRUE;
+    }
+
+    private boolean finishTask(EdgStorageDeviceTask task, String tableName) {
+        log.info("褰撳墠浠诲姟淇℃伅涓猴細{}", task);
+        if (task.getTaskState() <= 4 && task.getTaskRunning() == 0) {
+            log.info("鏈夋鍦ㄦ墽琛岀殑浠诲姟鎴栬繖浠诲姟宸叉墽琛屼换鍔$姸鎬亄}锛屼换鍔″惎鍔ㄦ儏鍐祘}锛岀粨鏉�", task.getTaskState(), task.getTaskRunning());
+            return Boolean.FALSE;
+        }
+        Integer cell = task.getStartCell();
+        Integer state = task.getTaskState();
+        task.setTaskRunning(Const.GLASS_CACHE_TYPE_EMPTY);
+        task.setGlassIdOut("");
+        task.setStartCell(0);
+        edgStorageDeviceTaskService.updateTaskMessage(tableName, task);
+        edgStorageDeviceTaskHistoryService.update(new LambdaUpdateWrapper<EdgStorageDeviceTaskHistory>()
+                .eq(EdgStorageDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_NEW)
+                .set(EdgStorageDeviceTaskHistory::getTaskState,
+                        Const.GLASS_CACHE_TYPE_FINISH.equals(state) ? Const.RAW_GLASS_TASK_SUCCESS : Const.RAW_GLASS_TASK_FAILURE)
+        );
+        int device = tableName.equals("edg_storage_device_one_task") ? 1 : 2;
+        updateCellRemainWidth(cell, device);
+        return Boolean.TRUE;
+    }
+
+    /**
+     * 鏌ヨ鐜荤拑骞惰繘琛屼氦鎹�
+     *
+     * @param glassId
+     * @return
+     */
+    public String queryAndChangeGlass(String glassId) {
+        GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId));
+//                .inSql(GlassInfo::getEngineerId, "select engineer_id from engineering where state = 1"));
+        Assert.isFalse(null == glassInfo, "鐜荤拑淇℃伅涓嶅瓨鍦�");        //鎸夌収鐜荤拑灏哄
+        LambdaQueryWrapper<GlassInfo> queryWrapper = new LambdaQueryWrapper<GlassInfo>()
+                .eq(GlassInfo::getWidth, glassInfo.getWidth())
+                .eq(GlassInfo::getHeight, glassInfo.getHeight())
+                .eq(GlassInfo::getThickness, glassInfo.getThickness())
+                .eq(GlassInfo::getFilmsid, glassInfo.getFilmsid())
+                .eq(GlassInfo::getFlowCardId, glassInfo.getFlowCardId())
+                .eq(GlassInfo::getTotalLayer, glassInfo.getTotalLayer())
+                .eq(GlassInfo::getLayer, glassInfo.getLayer())
+                .eq(GlassInfo::getEngineerId, glassInfo.getEngineerId())
+                .notInSql(GlassInfo::getGlassId, "select distinct glass_id from edg_storage_cage_details " +
+                        "where engineer_id = '" + glassInfo.getEngineerId() + "' and width = " + glassInfo.getWidth() + " and height = " + glassInfo.getHeight()
+                        + " and state != 100")
+                .orderByAsc(GlassInfo::getTemperingLayoutId)
+                .orderBy(Boolean.TRUE, Boolean.TRUE, GlassInfo::getTemperingFeedSequence)
+                .last("Limit 1");
+        GlassInfo swapGlassInfo = glassInfoService.getOne(queryWrapper);
+        if (swapGlassInfo != null && !glassInfo.getGlassId().equals(swapGlassInfo.getGlassId())) {
+            String swapGlassId = swapGlassInfo.getGlassId();
+            log.info("灏嗙幓鐠儃}鍜岀幓鐠儃}锛屼俊鎭簰鎹�,杩涚幓鐠� {}", glassInfo, swapGlassInfo, swapGlassInfo);
+            swapGlassInfo.setGlassId(glassId);
+            glassInfo.setGlassId(swapGlassId);
+            glassInfoService.updateById(swapGlassInfo);
+            glassInfoService.updateById(glassInfo);
+            return swapGlassId;
+        }
+        return "";
+    }
+
+
+    /**
+     * 鏌ヨ鍗у紡鐞嗙墖鐜荤拑骞惰繘琛屼氦鎹�
+     *
+     * @param glassId
+     * @return
+     */
+    public void queryEdgAndChangeGlass(String glassId, String swapGlassId) {
+        if (StringUtils.isBlank(swapGlassId)) {
+            log.info("褰撳墠鍑虹鐜荤拑涓嶅瓨鍦ㄩ渶瑕佹浛鎹㈢殑鐜荤拑");
+            return;
+        }
+        //鑾峰彇寰呭嚭绗肩殑鐜荤拑
+        EdgStorageCageDetails glassInfo = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                .eq(EdgStorageCageDetails::getGlassId, glassId).eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN));
+//        鑾峰彇寰呭嚭绗肩殑鐜荤拑闇�瑕佹浛鎹㈢殑鐜荤拑淇℃伅
+        EdgStorageCageDetails swapGlassDetailInfo = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                .eq(EdgStorageCageDetails::getGlassId, swapGlassId).eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN));
+
+//      鐜荤拑灏忕墖琛ㄤ腑鐜荤拑宸茬粡鏇挎崲锛屾洿鏂板崸鐞嗙鍐呯幇鏈夌殑鍑嗗鍑虹鐨勭幓鐠冧俊鎭紝
+        if (null == swapGlassDetailInfo) {
+            GlassInfo glassInfoBase = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>()
+                    .eq(GlassInfo::getGlassId, glassId));
+            //闇�瑕佹浛鎹㈢殑鐜荤拑涓哄瓨杩涘崸鐞嗭紝浠呴渶鏇存柊褰撳墠闇�瑕佸嚭绗肩殑鐜荤拑淇℃伅鍗冲彲
+            edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>()
+                    .eq(EdgStorageCageDetails::getGlassId, glassId)
+                    .set(EdgStorageCageDetails::getTemperingLayoutId, glassInfoBase.getTemperingLayoutId())
+                    .set(EdgStorageCageDetails::getTemperingFeedSequence, glassInfoBase.getTemperingFeedSequence()));
+        } else {
+            //闇�瑕佹浛鎹㈢殑鐜荤拑閮藉湪鍗х悊鍐咃紝鎸夌収鐜荤拑id瀵硅皟鐜荤拑淇℃伅锛氬璋冪幓鐠僫d鍗冲彲
+            edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>()
+                    .eq(EdgStorageCageDetails::getId, glassInfo.getId())
+                    .set(EdgStorageCageDetails::getTemperingLayoutId, swapGlassDetailInfo.getTemperingLayoutId())
+                    .set(EdgStorageCageDetails::getTemperingFeedSequence, swapGlassDetailInfo.getTemperingFeedSequence())
+            );
+            edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>()
+                    .eq(EdgStorageCageDetails::getId, swapGlassDetailInfo.getId())
+                    .set(EdgStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId())
+                    .set(EdgStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence())
+            );
+        }
+    }
+
+    /**
+     * 鑾峰彇璇︽儏琛ㄥ唴鏈�澶ф渶灏忕増鍥緄d鐨勫樊鍊硷紝鍒ゆ柇鏄惁鍑烘渶灏忕増鍥剧幓鐠�
+     *
+     * @return
+     */
+    public boolean queryMaxMinDiff(int threshold) {
+        //鑾峰彇绗煎瓙鍐呮渶澶х増鍥緄d鍜屾渶灏忕増鍥緄d鎻掑�硷紝鍒ゆ柇鏄惁澶т簬闃堝�硷紝澶т簬闃堝�肩洿鎺ュ嚭鏈�灏忕増鍥剧幓鐠�
+        QueryWrapper<EdgStorageCageDetails> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("max(tempering_layout_id)-min(tempering_layout_id) as diff")
+                .eq("state", Const.GLASS_STATE_IN)
+                .inSql("slot", "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON);
+        List<Object> list = edgStorageCageDetailsService.listObjs(queryWrapper);
+        //鑾峰彇绗煎唴鐜荤拑鐗堝浘宸�兼槸鍚﹀ぇ浜庨槇鍊�
+        if (CollectionUtil.isNotEmpty(list)) {
+            Long diff = (Long) list.get(0);
+            return diff > threshold;
+        } else {
+            return Boolean.FALSE;
+        }
+    }
+
+    public boolean saveHistoryTask(EdgStorageDeviceTask task) {
+        EdgStorageDeviceTaskHistory taskHistory = new EdgStorageDeviceTaskHistory();
+        BeanUtils.copyProperties(task, taskHistory);
+        taskHistory.setTaskType(task.getTaskRunning());
+        taskHistory.setCreateTime(new Date());
+        taskHistory.setTaskState(Const.RAW_GLASS_TASK_NEW);
+        edgStorageDeviceTaskHistoryService.save(taskHistory);
+        return Boolean.TRUE;
+    }
+
+    private boolean updateCellRemainWidth(int slot, int device) {
+        List<EdgStorageCageDetails> list = edgStorageCageDetailsService.list(new LambdaQueryWrapper<EdgStorageCageDetails>().eq(EdgStorageCageDetails::getSlot, slot)
+                .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN));
+        int remainWidth = cellLength;
+        if (CollectionUtil.isNotEmpty(list)) {
+            int widthTotal = (int) list.stream().map(e -> Math.max(e.getWidth(), e.getHeight()) + glassGap).mapToDouble(Double::intValue).sum();
+            remainWidth = cellLength - widthTotal >= 0 ? cellLength - widthTotal : 0;
+        }
+        edgStorageCageService.update(new LambdaUpdateWrapper<EdgStorageCage>().
+                set(EdgStorageCage::getRemainWidth, remainWidth).eq(EdgStorageCage::getSlot, slot).eq(EdgStorageCage::getDeviceId, device));
+        return Boolean.TRUE;
     }
 
     private ReadWriteEntity generateReadWriteEntity(String identifier, Object value) {
-        ReadWriteEntity readWriteEntity = new ReadWriteEntity();
-        readWriteEntity.setIdentifier(identifier);
-        readWriteEntity.setValue(value);
-        return readWriteEntity;
+        return ReadWriteEntity.builder()
+                .identifier(identifier)
+                //Kep涓槸Long绫诲瀷锛屽嵆锛欼nt32锛孞ava涓殑int绫诲瀷
+                .value(value)
+                .build();
     }
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/opccallback/CacheGlassStartCallback.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/opccallback/CacheGlassStartCallback.java
index 68e550d..8941f5c 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/opccallback/CacheGlassStartCallback.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/opccallback/CacheGlassStartCallback.java
@@ -63,30 +63,39 @@
     @Value("${mes.cellLength}")
     private int cellLength;
 
+    private Date startDate;
+
     @Override
     public void onSubscribe(String identifier, Object value) {
+
         log.info("褰撳墠姝e湪鎵ц鐨勪换鍔′负{}", value);
         String tableName = identifier.contains("edg_storage_device_one_task") ? EDG_STORAGE_DEVICE_ONE_TASK : EDG_STORAGE_DEVICE_TWO_TASK;
+        int device = tableName.equals("edg_storage_device_one_task") ? 1 : 2;
         EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage(tableName);
         try {
             if (task == null) {
                 log.info("浠诲姟琛ㄥ熀纭�鏁版嵁褰曞叆澶辫触锛岃妫�鏌ユ暟鎹槸鍚﹀綍鍏ユ垚鍔�");
                 return;
             }
-            int request = task.getTaskState();
+            if (task.getTaskState() == 2) {
+                //闃叉鍑虹墖浠诲姟涓旂鍓嶆湁鐜荤拑鐨勬儏鍐碉紝灏嗚繘鐗噄d缃┖锛屽嵆鍑虹墖浠呰�冭檻绗煎唴鐨勭幓鐠�
+                task.setGlassIdIn("");
+            }
+            int request = Integer.parseInt("" + value);
             log.info("寮�濮嬫墽琛屼换鍔★紝浠诲姟璇蜂俊鎭负{}", task);
             if (request == 0) {
                 log.info("鏈敹鍒颁换鍔¤姹傦紝缁撴潫鏈浠诲姟");
             } else if (request == 1) {
                 //杩涚墖浠诲姟
-                intoTask(task, tableName);
+                log.info("杩涚墖浠诲姟锛氳繘鐗囩幓鐠僫d涓猴細{}", task.getGlassIdIn());
+                intoTask(task, tableName, device);
             } else if (request == 2) {
                 //鍑虹墖浠诲姟
-                outTask(task, tableName);
+                outTask(task, tableName, device);
             } else if (request == 3) {
                 //鐩撮�氫换鍔�
-                if (!outTask(task, tableName)) {
-                    intoTask(task, tableName);
+                if (!outTask(task, tableName, device)) {
+                    intoTask(task, tableName, device);
                 }
             } else if (request == 4) {
                 log.info("灏嗗惎鍔ㄥ瓙鏀逛负0");
@@ -103,7 +112,7 @@
         }
     }
 
-    private boolean intoTask(EdgStorageDeviceTask task, String tableName) {
+    private boolean intoTask(EdgStorageDeviceTask task, String tableName, int deviceId) {
         //鑾峰彇鐜荤拑鐨勫熀鏈俊鎭�
         GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, task.getGlassIdIn()));
         if (null == glassInfo) {
@@ -111,11 +120,12 @@
             return Boolean.FALSE;
         }
         //鑾峰彇褰撳墠杩涚墖鐜荤拑id鍜岃繘鐗囨牸瀛�  鐩稿悓灏哄鍙互鏀句笅鐨勬牸瀛�
-        EdgStorageCage edgStorageCage = edgStorageCageService.getEdgStorageCageBySize(1, glassInfo.getWidth(), glassInfo.getHeight(), task.getCurrentCell());
+        EdgStorageCage edgStorageCage = edgStorageCageService.getEdgStorageCageBySize(deviceId, glassInfo.getWidth(), glassInfo.getHeight(), task.getCurrentCell());
         if (edgStorageCage == null) {
             log.info("鐩稿悓灏哄鍙互鏀句笅鐨勬牸瀛愭湭鎵惧埌锛屾牸瀛恑d:{}", task.getCurrentCell());
 //            SELECT * from edg_storage_cage where device_id = 1 and remain_width > 1000 order by abs(slot - 10)
-            List<EdgStorageCage> storageCageList = edgStorageCageService.list(new LambdaQueryWrapper<EdgStorageCage>().eq(EdgStorageCage::getDeviceId, 1)
+            List<EdgStorageCage> storageCageList = edgStorageCageService.list(new LambdaQueryWrapper<EdgStorageCage>()
+                    .eq(EdgStorageCage::getDeviceId, deviceId)
                     .eq(EdgStorageCage::getEnableState, Const.SLOT_ON)
                     .ge(EdgStorageCage::getRemainWidth, Math.max(glassInfo.getWidth(), glassInfo.getHeight())).last("order by abs(slot - " + task.getCurrentCell() + ")"));
 //            //鐩撮�氫换鍔�
@@ -144,7 +154,7 @@
         return Boolean.TRUE;
     }
 
-    private boolean outTask(EdgStorageDeviceTask task, String tableName) {
+    private boolean outTask(EdgStorageDeviceTask task, String tableName, int deviceId) {
         EdgStorageCageDetails edgStorageCageDetails = null;
         //绗煎唴鏄増鍥剧浉宸槸鍚﹁秴杩囬槇鍊�
         boolean flag = queryMaxMinDiff(threshold);
@@ -152,6 +162,7 @@
             EdgStorageCageDetails minEdgDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
                     .inSql(EdgStorageCageDetails::getSlot, "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON)
                     .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                    .eq(EdgStorageCageDetails::getDeviceId, deviceId)
                     .orderByAsc(EdgStorageCageDetails::getTemperingLayoutId)
                     .orderBy(Boolean.TRUE, Boolean.TRUE, EdgStorageCageDetails::getTemperingFeedSequence)
                     .last("limit 1"));
@@ -159,6 +170,7 @@
             edgStorageCageDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
                     .eq(EdgStorageCageDetails::getWidth, minEdgDetails.getWidth())
                     .eq(EdgStorageCageDetails::getHeight, minEdgDetails.getHeight())
+                    .eq(EdgStorageCageDetails::getDeviceId, deviceId)
                     .inSql(EdgStorageCageDetails::getId, "select min(id) from edg_storage_cage_details where state = 100 group by slot ")
                     .last("order by abs(slot - " + task.getCurrentCell() + ")  asc limit 1")
             );
@@ -176,6 +188,7 @@
             if (null == edgStorageCageDetails) {
                 edgStorageCageDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
                         .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                        .eq(EdgStorageCageDetails::getDeviceId, deviceId)
                         .eq(EdgStorageCageDetails::getSlot, minEdgDetails.getSlot())
                         .orderByAsc(EdgStorageCageDetails::getId)
                         .last("limit 1")
@@ -192,7 +205,7 @@
             if (null != edgeData) {
                 GlassInfo glassOutInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, edgeData.getGlassIdOut()));
                 //绗煎唴鐨勭幓鐠冪殑灏哄鏄惁鍜屼笂涓�娆′换鍔′竴鑷�
-                edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(glassOutInfo.getWidth(), glassOutInfo.getHeight());
+                edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(deviceId, task.getCurrentCell(), glassOutInfo.getWidth(), glassOutInfo.getHeight());
                 if (null == edgStorageCageDetails && StringUtils.isNotBlank(task.getGlassIdIn())) {
                     GlassInfo glassInInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>()
                             .eq(GlassInfo::getGlassId, task.getGlassIdIn())
@@ -206,7 +219,7 @@
             }
         }
         if (null == edgStorageCageDetails) {
-            edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(0, 0);
+            edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(deviceId, task.getCurrentCell(), 0, 0);
         }
         if (edgStorageCageDetails == null && StringUtils.isNotBlank(task.getGlassIdIn())) {
             //鍜屼笂娆′换鍔′笉瀛樺湪鐩稿悓灏哄
@@ -222,21 +235,28 @@
         int taskType = Const.GLASS_CACHE_TYPE_OUT;
         String glassId = edgStorageCageDetails.getGlassId();
         if (glassId.equals(task.getGlassIdIn())) {
+            if (3 != task.getTaskState()) {
+                return Boolean.FALSE;
+            }
             log.info("5銆佺洿閫氫换鍔�,灏嗙幓鐠冧俊鎭彃鍏ュ崸寮忕悊鐗囩,褰撳墠鐜荤拑淇℃伅:{}", edgStorageCageDetails);
             //鐜荤拑淇℃伅鏇挎崲
             String glassIdChange = queryAndChangeGlass(glassId);
+            //澶勭悊鍦ㄥ崸鐞嗗唴鐨勭幓鐠冧俊鎭細绗煎唴鐨勬暟鎹鐞�
+            queryEdgAndChangeGlass(edgStorageCageDetails.getGlassId(), glassIdChange);
             if (StringUtils.isNotBlank(glassIdChange)) {
                 edgStorageCageDetails = new EdgStorageCageDetails();
                 GlassInfo one = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId));
                 BeanUtils.copyProperties(one, edgStorageCageDetails);
             }
-            EdgStorageCage storageCage = edgStorageCageService.getOne(new LambdaQueryWrapper<EdgStorageCage>().eq(EdgStorageCage::getDeviceId, 1)
+            EdgStorageCage storageCage = edgStorageCageService.getOne(new LambdaQueryWrapper<EdgStorageCage>()
+                    .eq(EdgStorageCage::getDeviceId, deviceId)
                     .eq(EdgStorageCage::getEnableState, Const.SLOT_ON)
-                    .ge(EdgStorageCage::getRemainWidth, cellLength).last("order by abs(slot - " + task.getCurrentCell() + ")")
-                    .last("limit 1"));
+                    .ge(EdgStorageCage::getRemainWidth, cellLength)
+                    .last("order by abs(slot - " + task.getCurrentCell() + ") limit 1"));
             Assert.isTrue(null != storageCage, "鏍煎瓙宸叉弧,鏃犳硶鎵ц鐩撮�氫换鍔�");
             log.info("3銆佹煡璇㈠崸寮忕悊鐗囩閲岄潰鐨勭┖鏍�:{}", storageCage);
             edgStorageCageDetails.setSlot(storageCage.getSlot());
+            edgStorageCageDetails.setDeviceId(storageCage.getDeviceId());
             edgStorageCageDetails.setState(Const.GLASS_STATE_OUT);
             edgStorageCageDetailsService.save(edgStorageCageDetails);
             taskType = Const.GLASS_CACHE_TYPE_THROUGH;
@@ -245,8 +265,10 @@
             if (!edgStorageCageDetails.getSlot().equals(task.getCurrentCell())) {
                 EdgStorageCageDetails currentGlass = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
                         .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                        .eq(EdgStorageCageDetails::getDeviceId, deviceId)
                         .eq(EdgStorageCageDetails::getSlot, task.getCurrentCell()).eq(EdgStorageCageDetails::getWidth, edgStorageCageDetails.getWidth())
                         .eq(EdgStorageCageDetails::getHeight, edgStorageCageDetails.getHeight()).eq(EdgStorageCageDetails::getThickness, edgStorageCageDetails.getThickness())
+                        .orderByAsc(EdgStorageCageDetails::getId).last("limit 1")
                 );
                 if (null != currentGlass) {
                     edgStorageCageDetails = currentGlass;
@@ -261,28 +283,24 @@
             edgStorageCageDetailsService.update(wrapper);
             log.info("5銆佹洿鏂板嚭鐗囩幓鐠冪殑鐘舵�佷负{}", Const.GLASS_STATE_OUT);
         }
-
-        //鐜荤拑淇℃伅鏇挎崲
-//        String glassIdChange = queryAndChangeGlass(edgStorageCageDetails.getGlassId());
-        //澶勭悊鍦ㄥ崸鐞嗗唴鐨勭幓鐠冧俊鎭細绗煎唴鐨勬暟鎹鐞�
-//        queryEdgAndChangeGlass(edgStorageCageDetails.getGlassId(), glassIdChange);
         //鐢熸垚鍑虹墖浠诲姟
         task.setGlassIdOut(edgStorageCageDetails.getGlassId());
         task.setStartCell(edgStorageCageDetails.getSlot());
         task.setTaskRunning(taskType);
-        task.setWidth((int) edgStorageCageDetails.getWidth() * 10);
-        task.setHeight((int) edgStorageCageDetails.getHeight() * 10);
-        task.setThickness((int) edgStorageCageDetails.getThickness() * 10);
-        task.setFilmRemove(0);
+
         edgStorageDeviceTaskService.updateTaskMessage(tableName, task);
         saveHistoryTask(task);
         //鏇存柊璇︽儏琛ㄤ换鍔″嚭鐗囦腑
         edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>()
                 .set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT)
                 .eq(EdgStorageCageDetails::getGlassId, edgStorageCageDetails.getGlassId()));
-        //todo:纾ㄨ竟瀵瑰垪琛ㄦ柊澧炰竴鏉℃暟鎹�
+        //纾ㄨ竟瀵瑰垪琛ㄦ柊澧炰竴鏉℃暟鎹�
         EdgGlassTaskQueueInfo edgInfo = new EdgGlassTaskQueueInfo();
         BeanUtils.copyProperties(task, edgInfo);
+        edgInfo.setCreateTime(new Date());
+        edgInfo.setWidth((int) edgStorageCageDetails.getWidth());
+        edgInfo.setHeight((int) edgStorageCageDetails.getWidth());
+        edgInfo.setThickness((int) edgStorageCageDetails.getWidth());
         edgInfo.setState(Const.GLASS_STATE_NEW);
         edgGlassTaskQueueInfoService.save(edgInfo);
         return Boolean.TRUE;
@@ -297,20 +315,16 @@
         Integer cell = task.getStartCell();
         Integer state = task.getTaskState();
         task.setTaskRunning(Const.GLASS_CACHE_TYPE_EMPTY);
-//        task.setTaskState(Const.GLASS_CACHE_TYPE_EMPTY);
         task.setGlassIdOut("");
         task.setStartCell(0);
-        task.setWidth(0);
-        task.setHeight(0);
-        task.setThickness(0);
-        task.setFilmRemove(0);
         edgStorageDeviceTaskService.updateTaskMessage(tableName, task);
         edgStorageDeviceTaskHistoryService.update(new LambdaUpdateWrapper<EdgStorageDeviceTaskHistory>()
                 .eq(EdgStorageDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_NEW)
                 .set(EdgStorageDeviceTaskHistory::getTaskState,
                         Const.GLASS_CACHE_TYPE_FINISH.equals(state) ? Const.RAW_GLASS_TASK_SUCCESS : Const.RAW_GLASS_TASK_FAILURE)
         );
-        updateCellRemainWidth(cell);
+        int device = tableName.equals("edg_storage_device_one_task") ? 1 : 2;
+        updateCellRemainWidth(cell, device);
         return Boolean.TRUE;
     }
 
@@ -426,7 +440,7 @@
         return Boolean.TRUE;
     }
 
-    private boolean updateCellRemainWidth(int slot) {
+    private boolean updateCellRemainWidth(int slot, int device) {
         List<EdgStorageCageDetails> list = edgStorageCageDetailsService.list(new LambdaQueryWrapper<EdgStorageCageDetails>().eq(EdgStorageCageDetails::getSlot, slot)
                 .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN));
         int remainWidth = cellLength;
@@ -435,7 +449,7 @@
             remainWidth = cellLength - widthTotal >= 0 ? cellLength - widthTotal : 0;
         }
         edgStorageCageService.update(new LambdaUpdateWrapper<EdgStorageCage>().
-                set(EdgStorageCage::getRemainWidth, remainWidth).eq(EdgStorageCage::getSlot, slot));
+                set(EdgStorageCage::getRemainWidth, remainWidth).eq(EdgStorageCage::getSlot, slot).eq(EdgStorageCage::getDeviceId, device));
         return Boolean.TRUE;
     }
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/EdgStorageDeviceTask.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/EdgStorageDeviceTask.java
index dccd5ed..f0ff158 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/EdgStorageDeviceTask.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/EdgStorageDeviceTask.java
@@ -21,6 +21,10 @@
      */
     private String glassId;
     /**
+     * 鏄惁灏变綅
+     */
+    private Integer inPlace;
+    /**
      * 杩涚墖鐜荤拑id
      */
     private String glassIdIn;
@@ -48,22 +52,7 @@
      * 浠诲姟绫诲瀷
      */
     private Integer taskType;
-    /**
-     * 瀹�
-     */
-    private Integer width;
-    /**
-     * 楂�
-     */
-    private Integer height;
-    /**
-     * 鍘�
-     */
-    private Integer thickness;
-    /**
-     * 鏄惁闄よ啘
-     */
-    private Integer filmRemove;
+
     /**
      * 鍒涘缓鏃堕棿
      */
@@ -73,4 +62,5 @@
      */
     private Date updateTime;
 
+
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageDetailsMapper.xml b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageDetailsMapper.xml
index 3ef3805..aae437f 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageDetailsMapper.xml
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageDetailsMapper.xml
@@ -29,6 +29,7 @@
         select slot, min(id) as id, count(*) as glass_count
         from edg_storage_cage_details
         where state = 100
+        and device_id = #{deviceId}
         group by slot
         ),
         size_max_temp as (
@@ -50,7 +51,7 @@
                 and t.height = #{height}
             </if>
         </where>
-        order by total_count desc, glass_count, abs(t.slot - 10)
+        order by total_count desc, glass_count, abs(t.slot - #{currentSlot})
         )
         select *
         from slot_temp limit 1
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageMapper.xml b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageMapper.xml
index f2cbc0a..4b0946d 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageMapper.xml
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageMapper.xml
@@ -16,7 +16,7 @@
                  left join edg_storage_cage_details t1 on t.slot = t1.slot
         where t.device_id = #{deviceId}
           and t1.state = 100
-          and t.remain_width >= #{width}
+          and t.remain_width >= GREATEST(#{width}, #{height})
           and t1.width = #{width}
           and t1.height = #{height}
           and t.enable_state = 1
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskMapper.xml b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskMapper.xml
index b532cfa..8c76445 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskMapper.xml
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskMapper.xml
@@ -4,6 +4,8 @@
 
     <resultMap id="baseMap" type="com.mes.opctask.entity.EdgStorageDeviceTask">
         <id column="task_running" property="taskRunning"/>
+        <id column="glass_id" property="glassId"/>
+        <id column="in_place" property="inPlace"/>
         <id column="glass_id_in" property="glassIdIn"/>
         <id column="glass_id_out" property="glassIdOut"/>
         <id column="current_cell" property="currentCell"/>
@@ -12,10 +14,6 @@
         <id column="task_state" property="taskState"/>
         <id column="create_time" property="createTime"/>
         <id column="update_time" property="updateTime"/>
-        <id column="width" property="width"/>
-        <id column="height" property="height"/>
-        <id column="thickness" property="thickness"/>
-        <id column="film_remove" property="filmRemove"/>
     </resultMap>
 
     <select id="queryTaskMessage" resultMap="baseMap">
@@ -30,11 +28,7 @@
         glass_id_out = #{task.glassIdOut},
         current_cell = #{task.currentCell},
         start_cell = #{task.startCell},
-        end_cell = #{task.endCell},
-        width = #{task.width},
-        height = #{task.height},
-        thickness = #{task.thickness},
-        film_remove = #{task.filmRemove}
+        end_cell = #{task.endCell}
         <if test="task.taskState == 0">
             ,task_state = #{task.taskState}
         </if>
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/SlotSequenceDTO.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/SlotSequenceDTO.java
index f22b64b..1d12320 100644
--- a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/SlotSequenceDTO.java
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/SlotSequenceDTO.java
@@ -19,6 +19,10 @@
      */
     private Integer temperingLayoutId;
     /**
+     * 鐜荤拑鏁伴噺
+     */
+    private Integer glassCount;
+    /**
      * 澶х悊鐗囪鎯呬腑鏍煎瓙鍙�
      */
     private Integer slot;
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
index e142d14..ee80460 100644
--- a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
@@ -283,7 +283,7 @@
                     .eq(BigStorageCageDetails::getLayer, glassInfo.getLayer());
 //            wrapper.eq(BigStorageCageDetails::getWidth, glassInfo.getWidth()).eq(BigStorageCageDetails::getHeight, glassInfo.getHeight());
         } else {
-            wrapper.eq(BigStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence() + 1);
+            wrapper.eq(BigStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence() - 1);
         }
         BigStorageCage bigStorageCage = bigStorageCageService.selectJoinOne(BigStorageCage.class, wrapper);
         if (null != bigStorageCage) {
@@ -312,17 +312,17 @@
 
         //鑾峰彇鐜荤拑鐨勫帤搴︼細閲嶆柊閫夌瀛愰渶瑕佹寜鐓х瀛愬彲鏀剧幓鐠冨帤搴﹁繘琛岄�夋嫨 鍥犱负瀛愭煡璇㈡帓搴忓涓籹ql鏃犲奖鍝嶏紝鎵�浠ュ厛鎵ц瀛愭煡璇㈣幏鍙栭『搴忥紝鐒跺悗涓�娆″幓鏌ヨ
         List<Integer> deviceUsedList = bigStorageCageService.queryFreeDeviceByUsed(glassInfo.getThickness());
-        List<Integer> deviceUseds =  bigStorageCageService.queryFreeDeviceByUsed(glassInfo.getThickness());
+        List<Integer> deviceUseds = bigStorageCageService.queryFreeDeviceByUsed(glassInfo.getThickness());
         List<BigStorageCageDetails> engineerCount1 = baseMapper.selectList(
                 new LambdaQueryWrapper<BigStorageCageDetails>()
-                        .notIn(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT,Const.GLASS_STATE_DAMAGE,Const.GLASS_STATE_TAKE)
+                        .notIn(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE)
                         .select(BigStorageCageDetails::getEngineerId)
                         .groupBy(BigStorageCageDetails::getEngineerId)
                         .between(BigStorageCageDetails::getDeviceId, 1, 5)
         );
         List<BigStorageCageDetails> engineerCount2 = baseMapper.selectList(
                 new LambdaQueryWrapper<BigStorageCageDetails>()
-                        .notIn(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT,Const.GLASS_STATE_DAMAGE,Const.GLASS_STATE_TAKE)
+                        .notIn(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE)
                         .select(BigStorageCageDetails::getEngineerId)
                         .groupBy(BigStorageCageDetails::getEngineerId)
                         .between(BigStorageCageDetails::getDeviceId, 6, 8)
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageHistoryTask.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageHistoryTask.java
new file mode 100644
index 0000000..00d36cd
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageHistoryTask.java
@@ -0,0 +1,55 @@
+package com.mes.bigstoragecagetask.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * (BigStorageCageHistoryTask)琛ㄥ疄浣撶被
+ *
+ * @author makejava
+ * @since 2024-11-13 22:46:49
+ */
+@Data
+public class BigStorageCageHistoryTask {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 鐜荤拑id
+     */
+    private String glassId;
+    /**
+     * 璧峰鏍煎瓙
+     */
+    private Integer startSlot;
+    /**
+     * 鐩爣鏍煎瓙
+     */
+    private Integer targetSlot;
+    /**
+     * 浠诲姟鐘舵��
+     */
+    private Integer taskState;
+    /**
+     * 鐜荤拑鏁伴噺
+     */
+    private Integer glassCount;
+    /**
+     * 浠诲姟绫诲瀷
+     */
+    private Integer taskType;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    private Date updateTime;
+
+
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageTask.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageTask.java
new file mode 100644
index 0000000..9af4e18
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageTask.java
@@ -0,0 +1,33 @@
+package com.mes.bigstoragecagetask.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * (BigStorageCageInOneTask)琛ㄥ疄浣撶被
+ *
+ * @author makejava
+ * @since 2024-11-08 21:40:17
+ */
+@Data
+@AllArgsConstructor
+public class BigStorageCageTask {
+    /**
+     * 鐜荤拑id
+     */
+    private String glassId;
+    /**
+     * 璧峰鏍煎瓙
+     */
+    private Integer startSlot;
+    /**
+     * 鐩爣鏍煎瓙
+     */
+    private Integer targetSlot;
+    /**
+     * 浠诲姟鐘舵��
+     */
+    private Integer taskState;
+
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageHistoryTaskMapper.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageHistoryTaskMapper.java
new file mode 100644
index 0000000..72c7848
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageHistoryTaskMapper.java
@@ -0,0 +1,16 @@
+package com.mes.bigstoragecagetask.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mes.bigstoragecagetask.entity.BigStorageCageHistoryTask;
+
+/**
+ * (BigStorageCageHistoryTask)琛ㄦ暟鎹簱璁块棶灞�
+ *
+ * @author makejava
+ * @since 2024-11-13 22:46:47
+ */
+public interface BigStorageCageHistoryTaskMapper extends BaseMapper<BigStorageCageHistoryTask> {
+
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageTaskMapper.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageTaskMapper.java
new file mode 100644
index 0000000..6681b66
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageTaskMapper.java
@@ -0,0 +1,24 @@
+package com.mes.bigstoragecagetask.mapper;
+
+import com.mes.bigstoragecagetask.entity.BigStorageCageTask;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * (BigStorageCageInOneTask)琛ㄦ暟鎹簱璁块棶灞�
+ *
+ * @author makejava
+ * @since 2024-11-08 21:40:15
+ */
+public interface BigStorageCageTaskMapper {
+
+    List<BigStorageCageTask> queryTaskMessage(String tableName);
+
+    boolean updateTaskMessage(@Param("tableName") String tableName, @Param("task") BigStorageCageTask bigStorageCageInTask);
+
+    int saveTaskMessage(@Param("tableName") String tableName, @Param("list") List<BigStorageCageTask> taskList);
+
+    int removeAll(String tableName);
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageHistoryTaskService.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageHistoryTaskService.java
new file mode 100644
index 0000000..10d25f1
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageHistoryTaskService.java
@@ -0,0 +1,16 @@
+package com.mes.bigstoragecagetask.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mes.bigstoragecagetask.entity.BigStorageCageHistoryTask;
+
+/**
+ * (BigStorageCageHistoryTask)琛ㄦ湇鍔℃帴鍙�
+ *
+ * @author makejava
+ * @since 2024-11-13 22:46:53
+ */
+public interface BigStorageCageHistoryTaskService extends IService<BigStorageCageHistoryTask> {
+
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageTaskService.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageTaskService.java
new file mode 100644
index 0000000..0a5b186
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageTaskService.java
@@ -0,0 +1,25 @@
+package com.mes.bigstoragecagetask.service;
+
+import com.mes.bigstoragecagetask.entity.BigStorageCageTask;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * (BigStorageCageInOneTask)琛ㄦ湇鍔℃帴鍙�
+ *
+ * @author makejava
+ * @since 2024-11-08 21:40:20
+ */
+public interface BigStorageCageTaskService {
+
+
+    List<BigStorageCageTask> queryTaskMessage(String tableName);
+
+    boolean updateTaskMessage(@Param("tableName") String tableName, @Param("task") BigStorageCageTask bigStorageCageInTask);
+
+    int saveTaskMessage(@Param("tableName") String tableName, List<BigStorageCageTask> taskList);
+
+    int removeAll(@Param("tableName") String tableName);
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageHistoryTaskServiceImpl.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageHistoryTaskServiceImpl.java
new file mode 100644
index 0000000..b050fe9
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageHistoryTaskServiceImpl.java
@@ -0,0 +1,20 @@
+package com.mes.bigstoragecagetask.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mes.bigstoragecagetask.entity.BigStorageCageHistoryTask;
+import com.mes.bigstoragecagetask.mapper.BigStorageCageHistoryTaskMapper;
+import com.mes.bigstoragecagetask.service.BigStorageCageHistoryTaskService;
+import org.springframework.stereotype.Service;
+
+/**
+ * (BigStorageCageHistoryTask)琛ㄦ湇鍔″疄鐜扮被
+ *
+ * @author makejava
+ * @since 2024-11-13 22:46:56
+ */
+@Service
+public class BigStorageCageHistoryTaskServiceImpl extends ServiceImpl<BigStorageCageHistoryTaskMapper, BigStorageCageHistoryTask> implements BigStorageCageHistoryTaskService {
+
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageTaskServiceImpl.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageTaskServiceImpl.java
new file mode 100644
index 0000000..af12d05
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageTaskServiceImpl.java
@@ -0,0 +1,43 @@
+package com.mes.bigstoragecagetask.service.impl;
+
+import com.mes.bigstoragecagetask.entity.BigStorageCageTask;
+import com.mes.bigstoragecagetask.mapper.BigStorageCageTaskMapper;
+import com.mes.bigstoragecagetask.service.BigStorageCageTaskService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * (BigStorageCageInOneTask)琛ㄦ湇鍔″疄鐜扮被
+ *
+ * @author makejava
+ * @since 2024-11-08 21:40:23
+ */
+@Service
+public class BigStorageCageTaskServiceImpl implements BigStorageCageTaskService {
+
+    @Resource
+    BigStorageCageTaskMapper bigStorageCageInTaskMapper;
+
+    @Override
+    public List<BigStorageCageTask> queryTaskMessage(String tableName) {
+        return bigStorageCageInTaskMapper.queryTaskMessage(tableName);
+    }
+
+    @Override
+    public boolean updateTaskMessage(String tableName, BigStorageCageTask bigStorageCageTask) {
+        return bigStorageCageInTaskMapper.updateTaskMessage(tableName, bigStorageCageTask);
+    }
+
+    @Override
+    public int saveTaskMessage(String tableName, List<BigStorageCageTask> taskList) {
+        return bigStorageCageInTaskMapper.saveTaskMessage(tableName, taskList);
+    }
+
+    @Override
+    public int removeAll(String tableName) {
+        return bigStorageCageInTaskMapper.removeAll(tableName);
+    }
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageTask.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageTask.java
index b51000b..000af98 100644
--- a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageTask.java
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageTask.java
@@ -1,27 +1,37 @@
 package com.mes.job;
 
+import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.kangaroohy.milo.runner.subscription.SubscriptionCallback;
+import com.github.yulichang.toolkit.JoinWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.kangaroohy.milo.model.ReadWriteEntity;
 import com.kangaroohy.milo.service.MiloService;
+import com.mes.base.entity.BigStorageCageBaseInfo;
 import com.mes.bigstorage.entity.BigStorageCage;
 import com.mes.bigstorage.entity.BigStorageCageDetails;
+import com.mes.bigstorage.entity.BigStorageDTO;
+import com.mes.bigstorage.entity.dto.SlotSequenceDTO;
+import com.mes.bigstorage.entity.dto.TemperingLayoutDTO;
 import com.mes.bigstorage.service.BigStorageCageDetailsService;
 import com.mes.bigstorage.service.BigStorageCageService;
-import com.mes.bigstoragetask.entity.BigStorageCageFeedTask;
-import com.mes.bigstoragetask.entity.BigStorageCageOutTask;
+import com.mes.bigstoragecagetask.entity.BigStorageCageHistoryTask;
+import com.mes.bigstoragecagetask.entity.BigStorageCageTask;
+import com.mes.bigstoragecagetask.service.BigStorageCageHistoryTaskService;
+import com.mes.bigstoragecagetask.service.BigStorageCageTaskService;
 import com.mes.bigstoragetask.entity.UpdateBigStorageCageDTO;
-import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService;
-import com.mes.bigstoragetask.service.BigStorageCageOutTaskService;
 import com.mes.common.config.Const;
 import com.mes.damage.entity.Damage;
 import com.mes.damage.service.DamageService;
-import com.mes.edgglasstask.service.EdgGlassTaskInfoService;
+import com.mes.glassinfo.entity.GlassInfo;
 import com.mes.glassinfo.service.GlassInfoService;
+import com.mes.temperingglass.entity.TemperingGlass;
 import com.mes.temperingglass.entity.TemperingGlassInfo;
-import com.mes.temperingglass.service.TemperingGlassInfoService;
+import com.mes.temperingglass.service.TemperingGlassService;
+import com.mes.utils.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -38,32 +48,26 @@
 @Component
 @Slf4j
 public class OpcPlcStorageCageTask {
-
-    @Resource
-    private BigStorageCageService bigStorageCageService;
     @Resource
     private BigStorageCageDetailsService bigStorageCageDetailsService;
     @Resource
-    private GlassInfoService glassInfoService;
-    @Resource
-    private BigStorageCageFeedTaskService bigStorageCageFeedTaskService;
-    @Resource
-    private BigStorageCageOutTaskService bigStorageCageOutTaskService;
-    @Resource
-    private EdgGlassTaskInfoService edgGlassTaskInfoService;
-    @Resource
-    private TemperingGlassInfoService temperingGlassInfoService;
+    private TemperingGlassService temperingGlassService;
     @Resource
     private DamageService damageService;
+    @Resource
+    private GlassInfoService glassInfoService;
+    @Resource
+    private BigStorageCageService bigStorageCageService;
+    @Resource
+    private BigStorageCageHistoryTaskService bigStorageCageHistoryTaskService;
+    @Resource
+    private BigStorageCageTaskService bigStorageCageTaskService;
 
     @Autowired(required = false)
     MiloService miloService;
 
-    @Resource(name = "bigStorageStartCallback")
-    SubscriptionCallback bigStorageStartCallback;
-
-    @Value("${mes.carWidth}")
-    private Integer carWidth;
+    @Resource
+    private RedisUtil redisUtil;
 
     @Value("${mes.slotWidth}")
     private Integer slotWidth;
@@ -71,200 +75,461 @@
     @Value("${mes.glassGap}")
     private Integer glassGap;
 
-    @Scheduled(fixedDelay = Long.MAX_VALUE)
-    public void startOpcTask() throws Exception {
-        //璁惧涓�浜岀殑杩涚墖璇锋眰
-        miloService.subscriptionFromOpcUa(Arrays.asList("my.device01.x1", "my.device02.x1"), bigStorageStartCallback);
+    @Value("${mes.carWidth}")
+    private Integer carWidth;
+
+    @Value("${mes.outCarMaxSize}")
+    private Integer outCarMaxSize;
+
+    @Value("${mes.sequence.order}")
+    private boolean sequenceOrder;
+
+
+    @Scheduled(fixedDelay = 1000)
+    public void inBigStorageTask() throws Exception {
+        ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1A.DLP1A.mesControl");
+        if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) {
+            log.info("褰撳墠涓洪潪鑱旀満鐘舵�侊紝缁撴潫杩涚墖浠诲姟");
+            return;
+        }
+        ReadWriteEntity requestEntity = miloService.readFromOpcUa("DLP1A.DLP1A.RequestMes");
+        if (!"1".equals(requestEntity.getValue() + "")) {
+            log.info("褰撳墠鏈敹鍒拌繘鐗囪姹傦紝缁撴潫杩涚墖浠诲姟");
+            return;
+        }
+        ReadWriteEntity mesReplyEntity = miloService.readFromOpcUa("DLP1A.DLP1A.MesReply");
+        if ("1".equals(mesReplyEntity.getValue() + "")) {
+            log.info("鏈夋鍦ㄦ墽琛岀殑浠诲姟锛岀粨鏉熻繘鐗囦换鍔�");
+            return;
+        }
+        //鑾峰彇杩涚墖浠诲姟琛�
+        List<BigStorageCageTask> inTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_in_one_task");
+        if (CollectionUtils.isEmpty(inTaskList)) {
+            log.info("褰撳墠澶ц溅鏃犺繘鐗囩幓鐠冿紝缁撴潫杩涚墖浠诲姟");
+        }
+        List<String> glassIdList = inTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList());
+        log.info("鑾峰彇浠诲姟鐨勭幓鐠僫d锛歿}", glassIdList);
+        List<GlassInfo> glassInfoList = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().in(GlassInfo::getGlassId, glassIdList));
+        Map<String, List<GlassInfo>> glassListMap = glassInfoList.stream().collect(Collectors.groupingBy(GlassInfo::getGlassId));
+
+        //璁$畻鐩爣鏍煎瓙
+        List<BigStorageCageHistoryTask> historyTasks = new ArrayList<>();
+        for (BigStorageCageTask task : inTaskList) {
+            GlassInfo info = glassListMap.get(task.getGlassId()).get(0);
+            //鑾峰彇鐩爣鏍煎瓙淇℃伅
+            BigStorageDTO bigStorageDTO = bigStorageCageDetailsService.queryTargetSlotByTempering(info);
+//            涓存椂鏇存柊鏍煎瓙鐨勫墿浣欏昂瀵革細闃叉鐩搁偦鐜荤拑杩涘悓涓�鏍煎瓙閫犳垚鍓╀綑灏哄涓嶈冻锛岀幓鐠冭秺鐣岀殑鎯呭喌锛屼换鍔″畬鎴愬悗鍐嶆鏇存柊澶х悊鐗囩琛ㄥ墿浣欏搴︼紙鎸夌収绗煎唴鐜荤拑鏁伴噺鏇存柊澶х悊鐗囩鍓╀綑灏哄锛�
+            bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>()
+                    .set(BigStorageCage::getRemainWidth, bigStorageDTO.getWidth() - Math.max(info.getWidth(), info.getHeight()) - glassGap)
+                    .eq(BigStorageCage::getSlot, bigStorageDTO.getSlot()));
+            task.setTargetSlot(bigStorageDTO.getSlot());
+            task.setGlassId(info.getGlassId());
+            bigStorageCageTaskService.updateTaskMessage("big_storage_cage_in_one_task", task);
+            //瀛樻斁鍘嗗彶浠诲姟
+            BigStorageCageHistoryTask historyTask = new BigStorageCageHistoryTask();
+            BeanUtils.copyProperties(task, historyTask);
+            historyTask.setTaskType(Const.BIG_STORAGE_BEFORE_IN);
+            historyTask.setGlassCount(glassInfoList.size());
+            historyTask.setTaskState(Const.ENGINEERING_NEW);
+            historyTasks.add(historyTask);
+            BigStorageCageDetails cageDetails = new BigStorageCageDetails();
+            BeanUtils.copyProperties(info, cageDetails);
+            cageDetails.setSlot(bigStorageDTO.getSlot());
+            cageDetails.setState(Const.GLASS_STATE_NEW);
+            cageDetails.setDeviceId(bigStorageDTO.getDeviceId());
+            cageDetails.setGap(glassGap);
+            cageDetails.setId(null);
+            bigStorageCageDetailsService.save(cageDetails);
+        }
+        //鍘嗗彶鏁版嵁鍏ュ簱
+        bigStorageCageHistoryTaskService.saveBatch(historyTasks);
+        //鍚憃pc鍙戦�佸惎鍔ㄤ俊鍙�
+        miloService.writeToOpcWord(generateReadWriteEntity("DLP1A.DLP1A.MesReply", 1));
     }
 
-    @Scheduled(fixedDelay = Long.MAX_VALUE)
-    public void outOpcTask() throws Exception {
-        //璁惧1鐨勫嚭鐗囪姹�
-        miloService.subscriptionFromOpcUa(Arrays.asList("my.device03.x1"), bigStorageStartCallback);
-    }
-
-
-    @Scheduled(fixedDelay = 300)
-    public void updateInGlassStateTask() {
+    @Scheduled(fixedDelay = 1000)
+    public void outBigStorageTask() throws Exception {
         Date startDate = new Date();
-        log.info("1銆佸ぇ鐞嗙墖绗艰繘鐗囧畬鎴愬悗鏇存柊澶х悊鐗囩鏁版嵁浠诲姟寮�濮嬫墽琛屾椂闂达細{}", startDate);
-        //鍥犱负澶х悊鐗囩鍜屽嚭鐗囦换鍔℃槸涓や釜搴撶殑鏁版嵁锛屾墍浠ヨ鍒嗗紑鏌ユ壘
-        List<Object> list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper<BigStorageCageDetails>()
-                .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW));
-        if (CollectionUtils.isNotEmpty(list)) {
-            log.info("2銆佽幏鍙栨墍鏈夋鍦ㄨ繘鐗囩殑鐜荤拑淇℃伅id:{}", list);
-            List<String> glassIds = list.stream().map(String::valueOf).collect(Collectors.toList());
-            List<BigStorageCageFeedTask> inSuccessGlass = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>()
-                    .in(BigStorageCageFeedTask::getGlassId, glassIds)
-                    .in(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT));
-            if (CollectionUtils.isNotEmpty(inSuccessGlass)) {
-                log.info("3銆佽幏鍙栬繘鐗囧凡瀹屾垚鐨勭幓鐠冧俊鎭痠d:{}", inSuccessGlass);
-                List<Integer> inSuccessGlassSlot = inSuccessGlass.stream().map(BigStorageCageFeedTask::getTargetSlot).collect(Collectors.toList());
-                List<UpdateBigStorageCageDTO> storageCageDTOList = inSuccessGlass.stream().map(e -> {
+        ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1B.DLP1B.mesControl");
+        if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) {
+            log.info("褰撳墠涓洪潪鑱旀満鐘舵�侊紝缁撴潫杩涚墖浠诲姟");
+            return;
+        }
+        ReadWriteEntity requestEntity = miloService.readFromOpcUa("DLP1B.DLP1B.RequestMes");
+        if (!"1".equals(requestEntity.getValue() + "")) {
+            log.info("褰撳墠鏈敹鍒板嚭鐗囪姹傦紝缁撴潫鍑虹墖浠诲姟");
+            return;
+        }
+        //鑾峰彇鍑虹墖浠诲姟琛�
+        List<BigStorageCageTask> outTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_out_one_task");
+        if (CollectionUtils.isNotEmpty(outTaskList)) {
+            log.info("鏈夋鍦ㄦ墽琛岀殑鍑虹墖浠诲姟锛岀粨鏉熸湰娆″嚭鐗囦换鍔�");
+            return;
+        }
+        //todo:鏄惁鍏佽閽㈠寲
+        if (redisUtil.getCacheObject("temperingSwitch")) {
+            //鏄惁鏈夋鍦ㄩ挗鍖栫殑鐜荤拑:閽㈠寲灏忕墖琛ㄥ叧鑱斿巻鍙蹭换鍔¤〃锛岀瓫閫夋湭鍑虹鐨勭幓鐠冧俊鎭�
+            List<TemperingGlass> temperingGlassList = temperingGlassService.selectJoinList(TemperingGlass.class, new MPJLambdaWrapper<TemperingGlass>()
+                    .selectAll(TemperingGlass.class)
+                    .leftJoin(BigStorageCageHistoryTask.class, BigStorageCageHistoryTask::getGlassId, TemperingGlass::getGlassId)
+                    .eq(TemperingGlass::getState, Const.TEMPERING_NEW)
+                    .eq(BigStorageCageHistoryTask::getTaskType, Const.BIG_STORAGE_BEFORE_OUT)
+                    .isNull(BigStorageCageHistoryTask::getGlassId)
+                    .orderBy(Boolean.TRUE, sequenceOrder, TemperingGlass::getTemperingFeedSequence));
+            //todo:鍘嗗彶浠诲姟琛�
+            if (CollectionUtils.isNotEmpty(temperingGlassList)) {
+                log.info("鏈夋鍦ㄥ嚭鐗囩殑閽㈠寲浠诲姟");
+                computeOutGlassInfo(temperingGlassList, "big_storage_cage_out_one_task", Const.TEMPERING_OUT_TARGET_POSITION, Const.GLASS_STATE_OUT_ING, Const.BIG_STORAGE_BEFORE_OUT);
+                Date endDate = new Date();
+                log.info("澶х悊鐗囩鍑虹墖浠诲姟缁撴潫鏃堕棿锛歿}锛屽叡鑰楁椂锛歿}ms,缁撴潫鎵爜浠诲姟", endDate, endDate.getTime() - startDate.getTime());
+                return;
+            }
+            //閽㈠寲浼樺厛锛氳幏鍙栫悊鐗囩  鐜荤拑灏忕墖  鐮存崯琛� 鏁伴噺   鍒ゆ柇绗煎唴鐗堝浘鏄惁鍒伴綈
+            List<TemperingLayoutDTO> temperingLayoutDTOList = bigStorageCageDetailsService.temperingIsAll();
+            if (CollectionUtils.isNotEmpty(temperingLayoutDTOList)) {
+                //鐜荤拑鍒伴綈鍖呮嫭宸插嚭鐗囩殑
+                //鍒伴綈锛屽皢鐜荤拑灏忕墖鏁版嵁瀛樺叆閽㈠寲灏忕墖琛紝閫昏緫鐢熸垚鍑虹墖浠诲姟  缁撴潫
+                for (TemperingLayoutDTO item : temperingLayoutDTOList) {
+//                    if (item.getEngineerId().equals(redisUtil.getCacheObject("temperingengineerId"))) {
+                    List<TemperingGlass> temperingGlassInfos = glassInfoService.selectJoinList(TemperingGlass.class, JoinWrappers.lambda(GlassInfo.class)
+                            .selectAll(GlassInfo.class)
+                            .select("-1 as state")
+                            .selectAs(BigStorageCageDetails::getSlot, TemperingGlassInfo::getSlot)
+                            .innerJoin(BigStorageCageDetails.class, BigStorageCageDetails::getGlassId, GlassInfo::getGlassId)
+                            .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                            .eq(GlassInfo::getTemperingLayoutId, item.getTemperingLayoutId())
+                            .eq(GlassInfo::getEngineerId, item.getEngineerId())
+                            .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence));
+                    if (CollectionUtils.isNotEmpty(temperingGlassInfos)) {
+                        temperingGlassService.saveBatch(temperingGlassInfos);
+                        computeOutGlassInfo(temperingGlassInfos, "big_storage_cage_out_one_task", Const.TEMPERING_OUT_TARGET_POSITION, Const.GLASS_STATE_OUT_ING, Const.BIG_STORAGE_BEFORE_OUT);
+                        Date endDate = new Date();
+                        log.info("澶х悊鐗囩鍑虹墖浠诲姟缁撴潫鏃堕棿锛歿}锛屽叡鑰楁椂锛歿}ms,缁撴潫鎵爜浠诲姟", endDate, endDate.getTime() - startDate.getTime());
+                        return;
+                    }
+//                    }
+                }
+            }
+        }
+        //鏄惁鏈変汉宸ヤ笅鐗囦换鍔�   鏈夌洿鎺ュ嚭
+        List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
+                .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL)
+                .orderByAsc(BigStorageCageDetails::getSlot)
+                .orderByDesc(BigStorageCageDetails::getId));
+        if (CollectionUtils.isNotEmpty(artificialList)) {
+            computeOutGlassInfo(artificialList, "big_storage_cage_out_one_task", Const.ARTIFICIAL_OUT_TARGET_POSITION, Const.GLASS_STATE_OUT_ING, Const.BIG_STORAGE_BEFORE_OUT);
+            Date endDate = new Date();
+            log.info("澶х悊鐗囩鍑虹墖浠诲姟缁撴潫鏃堕棿锛歿}锛屽叡鑰楁椂锛歿}ms,缁撴潫鎵爜浠诲姟", endDate, endDate.getTime() - startDate.getTime());
+            return;
+        }
+        //鏄惁瀛樺湪闇�瑕佸唴閮ㄨ皟搴︾殑鏍煎瓙:鎵ц鍐呴儴璋冨害浠诲姟
+        List<TemperingLayoutDTO> temperingOccupySlotList = bigStorageCageDetailsService.queryTemperingOccupySlot();
+        if (CollectionUtils.isNotEmpty(temperingOccupySlotList)) {
+            loop:
+            for (TemperingLayoutDTO temperingOccupySlot : temperingOccupySlotList) {
+                List<SlotSequenceDTO> slotSequenceList = bigStorageCageDetailsService.queryGlassMaxAndMin(temperingOccupySlot.getEngineerId(), temperingOccupySlot.getTemperingLayoutId());
+                for (int i = 0; i < slotSequenceList.size() - 1; i++) {
+                    SlotSequenceDTO first = slotSequenceList.get(i);
+                    SlotSequenceDTO second = slotSequenceList.get(i + 1);
+                    int slotWidth = carWidth - first.getRemainWidth() - glassGap;
+                    int totalCount = first.getGlassCount() + second.getGlassCount();
+                    if (totalCount <= 6 && first.getMinSequence() == second.getMaxSequence() + 1
+                            && second.getRemainWidth() > slotWidth && slotWidth >= 0) {
+
+                        List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
+                                .eq(BigStorageCageDetails::getSlot, first.getSlot()).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                                .orderBy(Boolean.TRUE, sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence));
+                        if (CollectionUtils.isNotEmpty(list)) {
+                            computeOutGlassInfo(list, "big_storage_cage_out_one_task", second.getSlot(), Const.GLASS_STATE_SCHEDULE_ING, Const.BIG_STORAGE_BEFORE_DISPATCH);
+                        }
+                        updateSlotRemainBySlots(Arrays.asList(second.getSlot()));
+                        break loop;
+                    }
+                }
+            }
+        }
+        Date endDate = new Date();
+        log.info("澶х悊鐗囩鍑虹墖浠诲姟缁撴潫鏃堕棿锛歿}锛屽叡鑰楁椂锛歿}ms,缁撴潫鎵爜浠诲姟", endDate, endDate.getTime() - startDate.getTime());
+        return;
+    }
+
+    @Scheduled(fixedDelay = 1000)
+    public void finishInBigStorageTask() throws Exception {
+        ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1A.DLP1A.mesControl");
+        if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) {
+            log.info("褰撳墠涓洪潪鑱旀満鐘舵�侊紝缁撴潫瀹屾垚杩涚墖浠诲姟");
+            return;
+        }
+        //鑾峰彇杩涚墖浠诲姟琛�
+        List<BigStorageCageTask> inTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_in_one_task");
+        if (CollectionUtils.isEmpty(inTaskList)) {
+            log.info("褰撳墠澶ц溅鏃犺繘鐗囩幓鐠冿紝缁撴潫瀹屾垚杩涚墖浠诲姟");
+            return;
+        }
+        List<BigStorageCageTask> unFinishTaskList = inTaskList.stream().filter(e -> e.getTaskState() <= 1 || e.getStartSlot() == 0).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(unFinishTaskList)) {
+            log.info("瀛樺湪鏈畬鎴愮殑鐜荤拑淇℃伅,鐜荤拑锛歿}", unFinishTaskList);
+            return;
+        }
+        Map<Integer, List<BigStorageCageTask>> taskMap = inTaskList.stream().collect(Collectors.groupingBy(BigStorageCageTask::getTaskState));
+        //鎸夌収浠诲姟鐘舵�佷慨鏀瑰ぇ鐞嗙墖绗煎唴鐨勭幓鐠冩暟鎹�
+//        閲嶆柊璁$畻澶х悊鐗囩鍐呯殑鍓╀綑灏哄
+        taskMap.forEach((e1, v) -> {
+            if (e1 == 2) {
+                //杩涚墖瀹屾垚
+                log.info("3銆佽幏鍙栬繘鐗囧凡瀹屾垚鐨勭幓鐠冧俊鎭痠d:{}", v);
+                List<Integer> inSuccessGlassSlot = v.stream().map(BigStorageCageTask::getTargetSlot).collect(Collectors.toList());
+                List<UpdateBigStorageCageDTO> storageCageDTOList = v.stream().map(e -> {
                     UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO();
                     BeanUtils.copyProperties(e, storageCageDTO);
                     return storageCageDTO;
                 }).collect(Collectors.toList());
                 bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN);
-                log.info("4銆佸ぇ鐞嗙墖绗艰繘鐗囩姸鎬佸凡瀹屾垚宸插畬鎴愮殑鐜荤拑淇℃伅id:{}", inSuccessGlass);
-                //鏇存柊鐞嗙墖绗肩幓鐠冨昂瀵�
+                log.info("4銆佸ぇ鐞嗙墖绗艰繘鐗囩姸鎬佸凡瀹屾垚宸插畬鎴愮殑鐜荤拑淇℃伅id:{}", v);
                 updateSlotRemainBySlots(inSuccessGlassSlot);
-                log.info("5銆佸ぇ鐞嗙墖绗艰繘鐗囩洰鏍囨牸瀛愬昂瀵告洿鏂板畬鎴�");
+            } else if (e1 == 3) {
+                //鐮存崯澶勭悊
+                dealDamageInTask(v);
+            } else {
+                //娓呯┖鐞嗙墖绗肩┖鏁版嵁
+                noDealInTask(v);
             }
-
+        });
+        for (BigStorageCageTask item : inTaskList) {
+            //鏇存柊鍘嗗彶浠诲姟琛ㄤ腑鐨勪换鍔$姸鎬�
+            bigStorageCageHistoryTaskService.update(new LambdaUpdateWrapper<BigStorageCageHistoryTask>()
+                    .set(BigStorageCageHistoryTask::getTaskState, item.getTaskState())
+                    .eq(BigStorageCageHistoryTask::getTaskType, Const.BIG_STORAGE_BEFORE_IN)
+                    .eq(BigStorageCageHistoryTask::getTargetSlot, item.getTargetSlot())
+                    .eq(BigStorageCageHistoryTask::getGlassId, item.getGlassId()));
+            item.setTargetSlot(0);
+            //娓呯┖浠诲姟琛ㄦ暟鎹�
+            bigStorageCageTaskService.updateTaskMessage("big_storage_cage_in_one_task", item);
         }
-        Date endDate = new Date();
-        log.info("end:澶х悊鐗囩杩涚墖瀹屾垚鍚庢洿鏂板ぇ鐞嗙墖绗兼暟鎹换鍔$粨鏉熸椂闂达細{}锛屽叡鑰楁椂锛歿}ms,缁撴潫浠诲姟", endDate, endDate.getTime() - startDate.getTime());
-        return;
-
+        //娓呯┖鍚姩鐘舵��
+        //鍚憃pc鍙戦�佸惎鍔ㄤ俊鍙�
+        miloService.writeToOpcWord(generateReadWriteEntity("DLP1A.DLP1A.MesReply", 0));
     }
 
-    @Scheduled(fixedDelay = 300)
-    public void updateOutGlassStateTask() {
-        Date startDate = new Date();
-        log.info("1銆佸ぇ鐞嗙墖绗煎嚭鐗囧畬鎴愬悗鏇存柊澶х悊鐗囩鏁版嵁浠诲姟寮�濮嬫墽琛屾椂闂达細{}", startDate);
-        //鍥犱负澶х悊鐗囩鍜屽嚭鐗囦换鍔℃槸涓や釜搴撶殑鏁版嵁锛屾墍浠ヨ鍒嗗紑鏌ユ壘
-        List<Object> list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper<BigStorageCageDetails>()
-                .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING));
-        if (CollectionUtils.isNotEmpty(list)) {
-            log.info("2銆佽幏鍙栨墍鏈夋鍦ㄥ嚭鐗囩殑鐜荤拑淇℃伅id:{}", list);
-            List<String> glassIds = list.stream().map(String::valueOf).collect(Collectors.toList());
-            List<BigStorageCageOutTask> outSuccessGlass = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>()
-                    .in(BigStorageCageOutTask::getGlassId, glassIds).in(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_ALL));
-            if (CollectionUtils.isNotEmpty(outSuccessGlass)) {
-                for (BigStorageCageOutTask bigStorageCageOutTask : outSuccessGlass
-                ) {
-                    if (bigStorageCageOutTask.getEndSlot().equals(Const.ARTIFICIAL_OUT_TARGET_POSITION)) {
-                        temperingGlassInfoService.update(
-                                new LambdaUpdateWrapper<TemperingGlassInfo>()
-                                        .set(TemperingGlassInfo::getState, Const.TEMPERING_END)
-                                        .eq(TemperingGlassInfo::getGlassId, bigStorageCageOutTask.getGlassId())
-                        );
-                    }
+    @Scheduled(fixedDelay = 1000)
+    public void finishOutBigStorageTask() throws Exception {
+//        ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1B.DLP1B.mesControl");
+//        if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) {
+//            log.info("褰撳墠涓洪潪鑱旀満鐘舵�侊紝缁撴潫瀹屾垚鍑虹墖浠诲姟");
+//            return;
+//        }
+        //鑾峰彇杩涚墖浠诲姟琛�
+        List<BigStorageCageTask> outTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_out_one_task");
+        if (CollectionUtils.isEmpty(outTaskList)) {
+            log.info("褰撳墠澶ц溅鏃犺繘鐗囩幓鐠冿紝缁撴潫瀹屾垚杩涚墖浠诲姟");
+            return;
+        }
+        List<BigStorageCageTask> unFinishTaskList = outTaskList.stream().filter(e -> e.getTaskState() <= 1 || e.getStartSlot() == 0).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(unFinishTaskList)) {
+            log.info("瀛樺湪鏈畬鎴愮殑鐜荤拑淇℃伅,鐜荤拑锛歿}", unFinishTaskList);
+            return;
+        }
+        Map<Integer, List<BigStorageCageTask>> taskMap = outTaskList.stream().collect(Collectors.groupingBy(BigStorageCageTask::getTaskState));
+        int taskType = 0;
+        if (Const.OUT_TARGET_POSITION_ALL.contains(outTaskList.get(0).getTargetSlot())) {
+            taskType = Const.BIG_STORAGE_BEFORE_OUT;
+        } else {
+            taskType = Const.BIG_STORAGE_BEFORE_DISPATCH;
+        }
+        //鎸夌収浠诲姟鐘舵�佷慨鏀瑰ぇ鐞嗙墖绗煎唴鐨勭幓鐠冩暟鎹�
+//        閲嶆柊璁$畻澶х悊鐗囩鍐呯殑鍓╀綑灏哄
+        Integer finalTaskType = taskType;
+        taskMap.forEach((e1, v) -> {
+            if (e1 == 2) {
+                //杩涚墖瀹屾垚
+                log.info("3銆佽幏鍙栬繘鐗囧凡瀹屾垚鐨勭幓鐠冧俊鎭痠d:{}", v);
+                List<Integer> outSuccessGlassSlot = new ArrayList<>();
+                if (finalTaskType.equals(Const.BIG_STORAGE_BEFORE_OUT)) {
+                    outSuccessGlassSlot = v.stream().map(BigStorageCageTask::getStartSlot).collect(Collectors.toList());
+                } else {
+                    outSuccessGlassSlot = v.stream().map(BigStorageCageTask::getTargetSlot).collect(Collectors.toList());
                 }
-                log.info("3銆佽幏鍙栧嚭鐗囧凡瀹屾垚鐨勭幓鐠冧俊鎭痠d:{}", outSuccessGlass);
-                List<UpdateBigStorageCageDTO> storageCageDTOList = outSuccessGlass.stream().map(e -> {
+                List<UpdateBigStorageCageDTO> storageCageDTOList = v.stream().map(e -> {
                     UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO();
                     storageCageDTO.setGlassId(e.getGlassId());
-                    storageCageDTO.setTargetSlot(e.getStartSlot());
+                    if (finalTaskType.equals(Const.BIG_STORAGE_BEFORE_OUT)) {
+                        storageCageDTO.setTargetSlot(e.getStartSlot());
+                    } else {
+                        storageCageDTO.setTargetSlot(e.getTargetSlot());
+                    }
                     return storageCageDTO;
                 }).collect(Collectors.toList());
-                bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_OUT);
-                List<Integer> outSuccessSlotList = outSuccessGlass.stream().map(BigStorageCageOutTask::getStartSlot).collect(Collectors.toList());
-                log.info("4銆佸ぇ鐞嗙墖绗煎嚭鐗囩姸鎬佸凡瀹屾垚宸插畬鎴愮殑鐜荤拑淇℃伅id:{}", outSuccessGlass);
-                //鏇存柊鐞嗙墖绗肩幓鐠冨昂瀵�
-                updateSlotRemainBySlots(outSuccessSlotList);
-                log.info("5銆佸ぇ鐞嗙墖绗艰繘鐗囩洰鏍囨牸瀛愬昂瀵告洿鏂板畬鎴�");
+                bigStorageCageDetailsService.updateBySlot(storageCageDTOList, finalTaskType);
+                log.info("4銆佸ぇ鐞嗙墖绗艰繘鐗囩姸鎬佸凡瀹屾垚宸插畬鎴愮殑鐜荤拑淇℃伅id:{}", v);
+                updateSlotRemainBySlots(outSuccessGlassSlot);
+            } else if (e1 == 3) {
+                //鐮存崯澶勭悊
+                dealDamageOutTask(v);
+            } else {
+                //娓呯┖鐞嗙墖绗肩┖鏁版嵁
+                noDealOutTask(v);
             }
+        });
+        for (BigStorageCageTask item : outTaskList) {
+            //鏇存柊鍘嗗彶浠诲姟琛ㄤ腑鐨勪换鍔$姸鎬�
+            bigStorageCageHistoryTaskService.update(new LambdaUpdateWrapper<BigStorageCageHistoryTask>()
+                    .set(BigStorageCageHistoryTask::getTaskState, item.getTaskState())
+                    .eq(BigStorageCageHistoryTask::getTaskType, taskType)
+                    .eq(BigStorageCageHistoryTask::getGlassId, item.getGlassId()));
         }
-        Date endDate = new Date();
-        log.info("end:澶х悊鐗囩鍑虹墖瀹屾垚鍚庢洿鏂板ぇ鐞嗙墖绗兼暟鎹换鍔$粨鏉熸椂闂达細{}锛屽叡鑰楁椂锛歿}ms,缁撴潫浠诲姟", endDate, endDate.getTime() - startDate.getTime());
-        return;
-
+        //娓呯┖浠诲姟琛ㄦ暟鎹�
+        bigStorageCageTaskService.removeAll("big_storage_cage_out_one_task");
+        //娓呯┖鍚姩鐘舵��
+        //鍚憃pc鍙戦�佸惎鍔ㄤ俊鍙�
+        miloService.writeToOpcWord(generateReadWriteEntity("DLP1B.DLP1B.MesReply", 0));
     }
 
-    @Scheduled(fixedDelay = 300)
-    public void updateScheduleGlassStateTask() {
-        Date startDate = new Date();
-        log.info("1銆佸ぇ鐞嗙墖绗艰皟搴﹀畬鎴愬悗鏇存柊澶х悊鐗囩鏁版嵁浠诲姟寮�濮嬫墽琛屾椂闂达細{}", startDate);
-        //鍥犱负澶х悊鐗囩鍜岃皟搴︿换鍔℃槸涓や釜搴撶殑鏁版嵁锛屾墍浠ヨ鍒嗗紑鏌ユ壘
-        List<Object> list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper<BigStorageCageDetails>()
-                .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_SCHEDULE_ING));
-        if (CollectionUtils.isNotEmpty(list)) {
-            log.info("2銆佽幏鍙栨墍鏈夋鍦ㄥ嚭鐗囩殑鐜荤拑淇℃伅id:{}", list);
-            List<String> glassIds = list.stream().map(String::valueOf).collect(Collectors.toList());
-            List<BigStorageCageOutTask> scheduleSuccessGlass = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>()
-                    .in(BigStorageCageOutTask::getGlassId, glassIds).eq(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_SUCCESS)
-                    .notIn(BigStorageCageOutTask::getEndSlot, Const.TEMPERING_OUT_TARGET_POSITION, Const.ARTIFICIAL_OUT_TARGET_POSITION));
-            if (CollectionUtils.isNotEmpty(scheduleSuccessGlass)) {
-                log.info("3銆佽幏鍙栬皟搴﹀凡瀹屾垚鐨勭幓鐠冧俊鎭痠d:{}", scheduleSuccessGlass);
-                List<UpdateBigStorageCageDTO> storageCageDTOList = scheduleSuccessGlass.stream().map(e -> {
-                    UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO();
-                    storageCageDTO.setGlassId(e.getGlassId());
-                    storageCageDTO.setTargetSlot(e.getEndSlot());
-                    return storageCageDTO;
-                }).collect(Collectors.toList());
-                bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN);
-                List<String> scheduleSuccessGlassIds = scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList());
-                log.info("4銆佸ぇ鐞嗙墖绗煎嚭鐗囩姸鎬佸凡瀹屾垚宸插畬鎴愮殑鐜荤拑淇℃伅id:{}", scheduleSuccessGlassIds);
-                //鏇存柊鐞嗙墖绗肩幓鐠冨昂瀵�
-                List<Integer> slotList = scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getStartSlot).distinct().collect(Collectors.toList());
-                slotList.addAll(scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getEndSlot).distinct().collect(Collectors.toList()));
-                updateSlotRemainBySlots(slotList);
-                log.info("5銆佸ぇ鐞嗙墖绗艰繘鐗囩洰鏍囨牸瀛愬昂瀵告洿鏂板畬鎴�");
+    private void dealDamageInTask(List<BigStorageCageTask> damageTaskList) {
+//        鑾峰彇杩涚墖浠诲姟琛ㄤ腑鐘舵�佷负鐮存崯鐨勬暟鎹�
+        log.info("鐮存崯鐨勭幓鐠冧俊鎭湁锛歿}", damageTaskList);
+        //绉婚櫎鐞嗙墖绗艰鎯呰〃浠诲姟鎵ц杩囩▼涓牬鎹熺殑鐜荤拑
+        bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>()
+                .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW)
+                .in(BigStorageCageDetails::getGlassId, damageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList())));
+        //灏嗙牬鎹熶俊鎭柊澧炲叆鐮存崯琛�
+        List<Integer> slotList = new ArrayList<>();
+        for (BigStorageCageTask item : damageTaskList) {
+            Damage damage = new Damage();
+            damage.setGlassId(item.getGlassId());
+            damage.setLine(item.getStartSlot());
+            damage.setWorkingProcedure("纾ㄨ竟");
+            damage.setRemark("杩涚鍓嶅崸杞珛");
+            damage.setStatus(1);
+            damage.setType(item.getTaskState());
+            damageService.insertDamage(damage);
+            slotList.add(item.getTargetSlot());
+        }
+        //鏇存柊鏍煎瓙鍓╀綑瀹藉害
+        updateSlotRemainBySlots(slotList);
+        log.info("杩涚墖浠诲姟-鐮存崯浠诲姟鎵ц瀹屾垚");
+    }
+
+    private void dealDamageOutTask(List<BigStorageCageTask> damageTaskList) {
+//        鑾峰彇杩涚墖浠诲姟琛ㄤ腑鐘舵�佷负鐮存崯鐨勬暟鎹�
+        log.info("鐮存崯鐨勭幓鐠冧俊鎭湁锛歿}", damageTaskList);
+        //绉婚櫎鐞嗙墖绗艰鎯呰〃浠诲姟鎵ц杩囩▼涓牬鎹熺殑鐜荤拑
+        bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>()
+                .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL_ZERO)
+                .in(BigStorageCageDetails::getGlassId, damageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList())));
+        //灏嗙牬鎹熶俊鎭柊澧炲叆鐮存崯琛�
+        List<Integer> slotList = new ArrayList<>();
+        for (BigStorageCageTask item : damageTaskList) {
+            Damage damage = new Damage();
+            damage.setGlassId(item.getGlassId());
+            damage.setLine(item.getStartSlot());
+            damage.setWorkingProcedure("閽㈠寲鍓�");
+            damage.setRemark("杩涚鍚庡崸杞珛");
+            damage.setStatus(1);
+            damage.setType(item.getTaskState());
+            damageService.insertDamage(damage);
+            slotList.add(item.getTargetSlot());
+            slotList.add(item.getStartSlot());
+        }
+        //鏇存柊鏍煎瓙鍓╀綑瀹藉害
+        updateSlotRemainBySlots(slotList);
+        log.info("鍑虹墖浠诲姟-鐮存崯浠诲姟鎵ц瀹屾垚");
+    }
+
+    private void noDealInTask(List<BigStorageCageTask> noDealTaskList) {
+//        鑾峰彇杩涚墖浠诲姟琛ㄤ腑鐘舵�佷负鐮存崯鐨勬暟鎹�
+        log.info("鐮存崯鐨勭幓鐠冧俊鎭湁锛歿}", noDealTaskList);
+        //绉婚櫎鐞嗙墖绗艰鎯呰〃鏈墽琛屼换鍔$殑绌鸿褰曚俊鎭�
+        bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>()
+                .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW)
+                .in(BigStorageCageDetails::getGlassId, noDealTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList())));
+        //璁板綍鏍煎瓙鍙凤紝鎸夋牸瀛愬彿鏇存柊鍓╀綑灏哄
+        List<Integer> slotList = new ArrayList<>();
+        for (BigStorageCageTask item : noDealTaskList) {
+            slotList.add(item.getTargetSlot());
+            slotList.add(item.getStartSlot());
+        }
+        //鏇存柊鏍煎瓙鍓╀綑瀹藉害
+        updateSlotRemainBySlots(slotList);
+        log.info("杩涚墖浠诲姟-鏃犲姩浣滄墽琛屽畬鎴�");
+    }
+
+    private void noDealOutTask(List<BigStorageCageTask> noDealTaskList) {
+//        鑾峰彇杩涚墖浠诲姟琛ㄤ腑鐘舵�佷负鐮存崯鐨勬暟鎹�
+        log.info("鐮存崯鐨勭幓鐠冧俊鎭湁锛歿}", noDealTaskList);
+        if (Const.OUT_TARGET_POSITION_ALL.contains(noDealTaskList.get(0).getTargetSlot())) {
+            //鍑虹墖浠诲姟:灏嗗嚭鐗囦腑鐘舵�佹仮澶嶄负鍦ㄧ鍐�
+            List<String> glassList = noDealTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList());
+            bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
+                    .set(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                    .in(BigStorageCageDetails::getGlassId, glassList));
+
+        } else {
+            //璋冨害浠诲姟锛氬皢璋冨害涓姸鎬佹敼涓哄湪绗煎唴锛屾牸瀛愬彿鎭㈠涓鸿皟搴﹀墠鐨勬牸瀛�
+            for (BigStorageCageTask item : noDealTaskList) {
+                bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
+                        .set(BigStorageCageDetails::getSlot, item.getStartSlot())
+                        .set(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                        .eq(BigStorageCageDetails::getGlassId, item.getGlassId()));
             }
         }
-        Date endDate = new Date();
-        log.info("end:澶х悊鐗囩鍑虹墖瀹屾垚鍚庢洿鏂板ぇ鐞嗙墖绗兼暟鎹换鍔$粨鏉熸椂闂达細{}锛屽叡鑰楁椂锛歿}ms,缁撴潫浠诲姟", endDate, endDate.getTime() - startDate.getTime());
-        return;
-
+        //灏嗙牬鎹熶俊鎭柊澧炲叆鐮存崯琛�
+        List<Integer> slotList = new ArrayList<>();
+        for (BigStorageCageTask item : noDealTaskList) {
+            slotList.add(item.getTargetSlot());
+            slotList.add(item.getStartSlot());
+        }
+        //鏇存柊鏍煎瓙鍓╀綑瀹藉害
+        updateSlotRemainBySlots(slotList);
+        log.info("鍑虹墖浠诲姟-鏃犲姩浣滄墽琛屽畬鎴�");
     }
 
     /**
-     * 澶勭悊鐮存崯琛ㄤ换鍔�
+     * 鍑虹墖涓�娆′粎鐢熸垚涓�杞︾幓鐠�
+     *
+     * @param list
+     * @param <T>
+     * @return
      */
-    @Scheduled(fixedDelay = 300)
-    public void dealDamageTask() {
-        Date startDate = new Date();
-        log.info("澶х悊鐗囩鐮存崯鐜荤拑娓呴櫎浠诲姟寮�濮嬫墽琛屾椂闂达細{}", startDate);
-        //鑾峰彇杩涚墖浠诲姟琛ㄤ腑鐘舵�佷负鐮存崯鐨勬暟鎹�
-        List<BigStorageCageFeedTask> inDamageTaskInfoList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>()
-                .in(BigStorageCageFeedTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE));
-        if (CollectionUtils.isNotEmpty(inDamageTaskInfoList)) {
-            log.info("鑾峰彇杩涚墖浠诲姟琛ㄤ腑鐮存崯鐨勭幓鐠冧俊鎭瘂}", inDamageTaskInfoList);
-            bigStorageCageFeedTaskService.remove(new LambdaQueryWrapper<BigStorageCageFeedTask>().in(BigStorageCageFeedTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE));
-            //鐞嗙墖绗艰鎯呰〃鏁版嵁鐘舵�佹洿鏂�
-            bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>()
-                    .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW).in(BigStorageCageDetails::getGlassId, inDamageTaskInfoList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList())));
-            //灏嗙牬鎹熶俊鎭柊澧炲叆鐮存崯琛�
-            List<Integer> slotList = new ArrayList<>();
-            for (BigStorageCageFeedTask bigStorageCageFeedTask : inDamageTaskInfoList) {
-                Damage damage = new Damage();
-                damage.setGlassId(bigStorageCageFeedTask.getGlassId());
-                damage.setLine(bigStorageCageFeedTask.getLine());
-                damage.setWorkingProcedure("纾ㄨ竟");
-                damage.setRemark("杩涚鍓嶅崸杞珛");
-                damage.setStatus(1);
-                damage.setType(bigStorageCageFeedTask.getTaskState());
-                damageService.insertDamage(damage);
-                slotList.add(bigStorageCageFeedTask.getTargetSlot());
+    private <T extends BigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, String tableName, int targetSlot, int state, int taskType) {
+        //浠诲姟鏁版嵁:鑾峰彇杞﹀瓙瀛樻斁鐜荤拑鏈�澶ф暟閲�,鐜荤拑闂撮殧
+        List<BigStorageCageTask> bigStorageCageTaskList = new ArrayList<>();
+        //鎵撹溅鍓╀綑灏哄
+        Integer remainWidth = carWidth;
+        for (T e : list) {
+            if (bigStorageCageTaskList.size() >= outCarMaxSize || Math.max((int) e.getWidth(), (int) e.getHeight()) > remainWidth) {
+                break;
             }
-            //鏇存柊鏍煎瓙鍓╀綑瀹藉害
-            updateSlotRemainBySlots(slotList);
-            log.info("杩涚墖浠诲姟鎵ц瀹屾垚");
+            //璁$畻褰撳墠鍑虹墖杞﹀墿灏哄
+            remainWidth = remainWidth - Math.max((int) e.getWidth(), (int) e.getHeight()) - glassGap;
+            bigStorageCageTaskList.add(new BigStorageCageTask(e.getGlassId(), e.getSlot(), targetSlot,
+                    0));
         }
-        //鑾峰彇鍑虹墖浠诲姟琛ㄤ腑鐘舵�佷负鐮存崯鐨勬暟鎹�
-        List<BigStorageCageOutTask> outDamageTaskInfoList = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>()
-                .in(BigStorageCageOutTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE));
-        if (CollectionUtils.isNotEmpty(outDamageTaskInfoList)) {
-            log.info("鑾峰彇鍑虹墖浠诲姟琛ㄤ腑鐮存崯鐨勭幓鐠冧俊鎭瘂}", outDamageTaskInfoList);
-            bigStorageCageOutTaskService.remove(new LambdaQueryWrapper<BigStorageCageOutTask>().in(BigStorageCageOutTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE));
-            List<String> glassIdList = outDamageTaskInfoList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList());
-            //绉婚櫎閽㈠寲涓嬬墖琛ㄦ暟鎹�
-            temperingGlassInfoService.remove(new LambdaQueryWrapper<TemperingGlassInfo>().in(TemperingGlassInfo::getGlassId, glassIdList));
-            //鐞嗙墖绗艰鎯呰〃鏁版嵁鐘舵�佸垹闄�
-            bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>().in(BigStorageCageDetails::getGlassId, glassIdList));
-            //灏嗙牬鎹熶俊鎭柊澧炲叆鐮存崯琛�
-            List<Integer> slotList = new ArrayList<>();
-            for (BigStorageCageOutTask bigStorageCageOutTask : outDamageTaskInfoList) {
-                Damage damage = new Damage();
-                damage.setGlassId(bigStorageCageOutTask.getGlassId());
-                damage.setLine(bigStorageCageOutTask.getEndSlot());
-                damage.setWorkingProcedure("閽㈠寲");
-                damage.setRemark("鍑虹墖鍚庡崸杞珛");
-                damage.setStatus(1);
-                damage.setType(bigStorageCageOutTask.getTaskState());
-                damageService.insertDamage(damage);
-                slotList.add(bigStorageCageOutTask.getStartSlot());
-            }
-            //鏇存柊鏍煎瓙鍓╀綑瀹藉害
-            updateSlotRemainBySlots(slotList);
-            log.info("鍑虹墖浠诲姟鎵ц瀹屾垚");
+        Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageTaskList), "鏈幏鍙栧嚭鐗囨暟鎹紝缁撴潫鍑虹墖浠诲姟");
+        log.info("鑾峰彇鍑虹墖浠诲姟鏁版嵁{}鏉★紝鎵ц淇濆瓨", bigStorageCageTaskList.size());
+        List<String> glassIds = bigStorageCageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList());
+        int glassCount = bigStorageCageTaskList.size();
+        //鐢熸垚鍑虹墖浠诲姟鏉℃暟涓嶈冻6琛ュ叏
+        while (bigStorageCageTaskList.size() < 6) {
+            bigStorageCageTaskList.add(new BigStorageCageTask("", 0, 0, 0));
         }
-        Date endDate = new Date();
-        log.info("澶х悊鐗囩鐮存崯鐜荤拑娓呴櫎浠诲姟缁撴潫鏃堕棿锛歿}锛屽叡鑰楁椂锛歿}ms,缁撴潫鎵爜浠诲姟", endDate, endDate.getTime() - startDate.getTime());
-        return;
+        bigStorageCageTaskService.saveTaskMessage(tableName, bigStorageCageTaskList);
+        List<BigStorageCageHistoryTask> historyList = bigStorageCageTaskList.stream().filter(e -> StringUtils.isNotBlank(e.getGlassId())).map(e -> {
+            BigStorageCageHistoryTask history = new BigStorageCageHistoryTask();
+            BeanUtils.copyProperties(e, history);
+            history.setGlassCount(glassCount);
+            history.setTaskType(taskType);
+            return history;
+        }).collect(Collectors.toList());
+        bigStorageCageHistoryTaskService.saveBatch(historyList);
+
+        log.info("灏嗗嚭鐗囩幓鐠儃}鐜荤拑鐘舵�佹敼涓哄嚭鐗囦腑", glassIds);
+        bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
+                .set(BigStorageCageDetails::getState, state)
+                .set(Const.GLASS_STATE_SCHEDULE_ING.equals(state), BigStorageCageBaseInfo::getSlot, targetSlot)
+                .in(BigStorageCageDetails::getGlassId, glassIds));
+        return Boolean.TRUE;
     }
+
 
     public void updateSlotRemainBySlots(List<Integer> slotList) {
         //鑾峰彇鏍煎瓙鍐呮墍鏈夌殑鐜荤拑淇℃伅
@@ -291,5 +556,11 @@
         }
     }
 
-
+    private ReadWriteEntity generateReadWriteEntity(String identifier, Object value) {
+        return ReadWriteEntity.builder()
+                .identifier(identifier)
+                //Kep涓槸Long绫诲瀷锛屽嵆锛欼nt32锛孞ava涓殑int绫诲瀷
+                .value(value)
+                .build();
+    }
 }
\ No newline at end of file
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/BigStorageBaseService.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/BigStorageBaseService.java
new file mode 100644
index 0000000..0402283
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/BigStorageBaseService.java
@@ -0,0 +1,17 @@
+package com.mes.tools.service;
+
+import com.mes.bigstorage.entity.BigStorageDTO;
+import com.mes.glassinfo.entity.GlassInfo;
+
+import java.util.List;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/11/8 22:02
+ * @Description:
+ */
+public interface BigStorageBaseService {
+    void updateSlotRemainBySlots(List<Integer> slotList);
+
+    BigStorageDTO queryTargetSlotByTempering(GlassInfo glassInfo);
+}
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/impl/BigStorageBaseServiceImpl.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/impl/BigStorageBaseServiceImpl.java
new file mode 100644
index 0000000..b7e267c
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/impl/BigStorageBaseServiceImpl.java
@@ -0,0 +1,663 @@
+package com.mes.tools.service.impl;
+
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.mes.bigstorage.entity.BigStorageCage;
+import com.mes.bigstorage.entity.BigStorageCageDetails;
+import com.mes.bigstorage.entity.BigStorageDTO;
+import com.mes.bigstorage.service.BigStorageCageDetailsService;
+import com.mes.bigstorage.service.BigStorageCageService;
+import com.mes.bigstoragetask.entity.BigStorageCageFeedTask;
+import com.mes.common.S7object;
+import com.mes.common.config.Const;
+import com.mes.device.PlcParameterObject;
+import com.mes.glassinfo.entity.GlassInfo;
+import com.mes.glassinfo.service.GlassInfoService;
+import com.mes.tools.S7control;
+import com.mes.tools.service.BigStorageBaseService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/11/8 22:03
+ * @Description:
+ */
+@Service
+@Slf4j
+public class BigStorageBaseServiceImpl implements BigStorageBaseService {
+
+    @Resource
+    BigStorageCageDetailsService bigStorageCageDetailsService;
+
+    @Resource
+    BigStorageCageService bigStorageCageService;
+
+    @Resource
+    GlassInfoService glassInfoService;
+
+    @Value("${mes.slotWidth}")
+    private Integer slotWidth;
+
+    @Value("${mes.carWidth}")
+    private Integer carWidth;
+
+    @Value("${mes.outCarMaxSize}")
+    private Integer outCarMaxSize;
+
+    @Value("${mes.glassGap}")
+    private Integer glassGap;
+
+
+    @Override
+    public void updateSlotRemainBySlots(List<Integer> slotList) {
+        //鑾峰彇鏍煎瓙鍐呮墍鏈夌殑鐜荤拑淇℃伅
+        List<BigStorageCageDetails> inSlotGlassList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
+                .in(BigStorageCageDetails::getSlot, slotList).in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL));
+        Map<Integer, Double> slotRemainMap = new HashMap<>();
+        //鏄惁瀛樺湪鏈夋牸瀛愰潪绌虹殑鐜荤拑
+        if (CollectionUtils.isNotEmpty(inSlotGlassList)) {
+            //瀛樺湪  灏嗘牸瀛愬唴鐨勭幓鐠冨垎鍒繘琛屾洿鏂�
+            slotRemainMap = inSlotGlassList.stream()
+                    .collect(Collectors.groupingBy(BigStorageCageDetails::getSlot, Collectors.summingDouble(item -> Math.max(item.getWidth(), item.getHeight()) + glassGap)));
+            slotRemainMap.forEach((e, v) -> {
+                double remainWidth = slotWidth - v >= 0 ? slotWidth - v : 0;
+                bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, remainWidth)
+                        .eq(BigStorageCage::getSlot, e));
+            });
+        }
+        //杩囨护涓嶅瓨鍦ㄧ幓鐠冪殑鏍煎瓙 灏嗗搴﹂噸缃负鍘熷瀹藉害5000
+        Set<Integer> remainSlotList = slotRemainMap.keySet();
+        slotList.removeAll(remainSlotList);
+        if (CollectionUtils.isNotEmpty(slotList)) {
+            bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, slotWidth)
+                    .in(BigStorageCage::getSlot, slotList));
+        }
+    }
+
+    /**
+     * 鎸夌収鐜荤拑id鍒ゆ柇鐜荤拑鐘舵�佸強鍗ц浆绔嬫槸鍚﹀彲鐩存帴鍚姩
+     */
+//    public Boolean judgeGlassTypeStatus(String glassId, Integer line, String mesAddress) {
+//        //鍒ゆ柇姝ょ幓鐠冩槸鍦ㄧ鍐呮垨宸茬敓鎴愯繘鐗囦换鍔�
+//        BigStorageCageFeedTask bigStorageCageFeedTask = bigStorageCageFeedTaskService.getOne(
+//                new LambdaQueryWrapper<BigStorageCageFeedTask>()
+//                        .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT)
+//                        .eq(BigStorageCageFeedTask::getGlassId, glassId)
+//        );
+//        BigStorageCageDetails bigStorageCageDetails = bigStorageCageDetailsService.getOne(
+//                new LambdaQueryWrapper<BigStorageCageDetails>()
+//                        .eq(BigStorageCageDetails::getGlassId, glassId)
+//                        .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
+//        );
+//        if (bigStorageCageFeedTask != null || bigStorageCageDetails != null) {
+//            log.info("姝ょ幓鐠冨瓨浠诲姟鎴栧凡鍦ㄧ鍐�");
+//            return Boolean.TRUE;
+//        }
+//        //1銆佽幏鍙栦换鍔¤〃涓浉閭荤幓鐠�
+//        List<EdgGlassTaskInfo> edgGlassTaskInfoList;
+//        edgGlassTaskInfoList = edgGlassTaskInfoService.list(new LambdaQueryWrapper<EdgGlassTaskInfo>()
+//                .eq(EdgGlassTaskInfo::getLine, line)
+//                .apply("time >= (select time from edg_glass_task_info where line='" + line + "' and glass_id = '" + glassId + "' and deleted = 0)")
+//                .orderByAsc(EdgGlassTaskInfo::getTime));
+//        if (edgGlassTaskInfoList.size() == 0) {
+//            edgGlassTaskInfoList = edgGlassTaskInfoService.list(new QueryWrapper<EdgGlassTaskInfo>()
+//                    .select("Top 1 *")
+//                    .eq("glass_id", glassId)
+//            );
+//            log.info("鍦ㄥ昂瀵歌〃涓幏鍙栫幓鐠冧俊鎭瘂}", edgGlassTaskInfoList);
+//            if (edgGlassTaskInfoList.size() == 0) {
+//                GlassInfo glassInfo = glassInfoService.getOne(
+//                        new LambdaQueryWrapper<GlassInfo>()
+//                                .eq(GlassInfo::getGlassId, glassId)
+//                );
+//                EdgGlassTaskInfo edgGlassTaskInfo = new EdgGlassTaskInfo();
+//                BeanUtils.copyProperties(glassInfo, edgGlassTaskInfo);
+//                edgGlassTaskInfo.setWidth((int) glassInfo.getWidth());
+//                edgGlassTaskInfo.setHeight((int) glassInfo.getHeight());
+//                edgGlassTaskInfoList.add(edgGlassTaskInfo);
+//                log.info("鍦ㄧ幓鐠冧俊鎭〃涓幏鍙栫幓鐠冧俊鎭瘂}", edgGlassTaskInfoList);
+//            }
+//        }
+//        Assert.isFalse(CollectionUtils.isEmpty(edgGlassTaskInfoList), "璇嗗埆鐜荤拑淇℃伅鏈嚭鐜板湪灏哄琛ㄤ腑,鑾峰彇鐩搁偦涓ゅ潡鐜荤拑澶辫触");
+//        //2銆佽幏鍙栧崸杞珛鍓╀綑瀹藉害
+//        BigStorageDTO sitToUpRemainWidth = bigStorageCageFeedTaskService.querySitToUpRemainWidth(line);
+//        Integer remainWidth;
+//        Integer glassCount;
+//        if (0 == sitToUpRemainWidth.getGlassCount()) {
+//            remainWidth = carWidth;
+//            glassCount = 0;
+//        } else {
+//            remainWidth = sitToUpRemainWidth.getWidth();
+//            glassCount = sitToUpRemainWidth.getGlassCount();
+//        }
+//
+//        Boolean flag = Boolean.TRUE;
+//        //2銆佽幏鍙栧崸杞珛
+//        Integer widthFirst = Math.max(edgGlassTaskInfoList.get(0).getWidth() / 10, edgGlassTaskInfoList.get(0).getHeight() / 10);
+//        Integer heightFirst = Math.min(edgGlassTaskInfoList.get(0).getWidth() / 10, edgGlassTaskInfoList.get(0).getHeight() / 10);
+//        if (edgGlassTaskInfoList.size() == 1) {
+//            if (remainWidth >= widthFirst) {
+//                if (glassCount < inCarMaxSize) {
+//                    addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst, heightFirst);
+//                } else {
+//                    if (glassCount < inCarMaxSize + 1) {
+//                        addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst);
+//                    } else {
+//                        return Boolean.FALSE;
+//                    }
+//                }
+//            } else {
+//                flag = Boolean.FALSE;
+//            }
+//        } else {
+//            Integer widthSecond = Math.max(edgGlassTaskInfoList.get(1).getWidth() / 10, edgGlassTaskInfoList.get(1).getHeight() / 10);
+//            Integer heightSecond = Math.min(edgGlassTaskInfoList.get(1).getWidth() / 10, edgGlassTaskInfoList.get(1).getHeight() / 10);
+//            if (remainWidth >= widthFirst) {
+//                if (remainWidth - widthFirst - glassGap >= widthSecond) {
+//                    if (glassCount < inCarMaxSize) {
+//                        addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst, heightFirst);
+//                    } else {
+//                        if (glassCount < inCarMaxSize + 1) {
+//                            addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst);
+//                        } else {
+//                            return Boolean.FALSE;
+//                        }
+//                    }
+//                } else {
+//                    if (glassCount < inCarMaxSize + 1) {
+//                        addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst);
+//                    } else {
+//                        return Boolean.FALSE;
+//                    }
+//                }
+//            } else {
+//                flag = Boolean.FALSE;
+//            }
+//        }
+//        //鍚憄lc鍙戦�佽繘鐗囩‘璁�
+//        if (flag) {
+//            //鍚憄lc鍐欏叆纭瀛�
+//            PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
+//            int returnData = 1;
+//            int count = 1;
+//            while (returnData != 0) {
+//                S7object.getinstance().plccontrol.writeWord(mesAddress, 1);
+//
+//                if (Const.A10_OUT_TARGET_POSITION.equals(line)) {
+//                    returnData = Integer.parseInt(plcParameterObject.getPlcParameter("D04ToMES").getValue());
+//                } else {
+//                    returnData = Integer.parseInt(plcParameterObject.getPlcParameter("D01ToMES").getValue());
+//                }
+////                returnData = S7object.getinstance().plccontrol.readWord(mesAddress, 1).get(0);
+//                log.info("杩涘崸杞珛绗瑊}娆″彂閫佺‘璁ゅ瓧瀹屾垚锛屽湴鍧�涓猴細{},鍐欏叆鐨勫唴瀹逛负{}", count++, mesAddress, 1);
+//            }
+//        }
+//        //璁板綍鏃犳硶鏀句笅鐜荤拑锛屽悗缁垽鏂惎鍔�
+//        return flag;
+//    }
+
+    /**
+     * 娣诲姞浠诲姟淇℃伅
+     */
+//    private Boolean addFeedTask(String glassId, Integer line, Integer taskType, Integer width, Integer height) {
+//        BigStorageCageFeedTask bigStorageCageFeedTask = new BigStorageCageFeedTask();
+//        bigStorageCageFeedTask.setGlassId(glassId);
+//        bigStorageCageFeedTask.setTaskState(Const.BIG_STORAGE_IN_NEW);
+//        bigStorageCageFeedTask.setLine(line);
+//        bigStorageCageFeedTask.setTaskType(taskType);
+//        bigStorageCageFeedTask.setWidth(width);
+//        bigStorageCageFeedTask.setHeight(height);
+//        bigStorageCageFeedTask.setCreateTime(new Date());
+//        //鍒犻櫎鐞嗙墖绗艰〃鎷胯蛋/鐮存崯鏁版嵁鏁版嵁
+//        damageService.deleteByGlassId(glassId);
+//        Damage damage = new Damage();
+//        damage.setGlassId(glassId);
+//        damage.setWorkingProcedure("纾ㄨ竟");
+//        damage.setLine(line);
+//        damage.setType(1);
+//        damage.setRemark("杩涘ぇ鐞嗙墖");
+//        damageService.insertDamage(damage);
+//        return bigStorageCageFeedTaskService.save(bigStorageCageFeedTask);
+//    }
+
+    /**
+     * 鑾峰彇闇�瑕佸惎鍔ㄧ殑绾胯矾锛氫袱鏉$嚎閮藉彲鍚姩 鑾峰彇绗竴鐗囩幓鐠冪増鍥緄d鏈�灏� 鐗堝簭鏈�澶х殑绾胯矾
+     *
+     * @return 闇�瑕佸惎鍔ㄧ殑绾胯矾
+     */
+//    public Integer getStartLine() {
+//        List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>()
+//                .inSql(BigStorageCageFeedTask::getId, "select min(id) from big_storage_cage_feed_task where task_state = 2" +
+//                        "and (target_slot = 0 or target_slot is null) group by line"));
+//        Assert.isFalse(CollectionUtils.isEmpty(taskList), "鍗ц浆绔嬩袱鏉$嚎閮芥病鏈夌幓鐠冭繘鐗囦换鍔�");
+//        Map<String, Integer> taskMap = taskList.stream().collect(Collectors.toMap(BigStorageCageFeedTask::getGlassId,
+//                BigStorageCageFeedTask::getLine));
+//        GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>()
+//                .in(GlassInfo::getGlassId, taskMap.keySet())
+//                .orderByAsc(GlassInfo::getTemperingLayoutId)
+//                .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence)
+//                .last("limit 1"));
+//        return taskMap.get(glassInfo.getGlassId());
+//    }
+
+    /**
+     * 璁$畻浠诲姟琛ㄨ繘鐗囩嚎璺殑鐩爣鏍煎瓙锛屽苟鍚姩浠诲姟
+     */
+//    public boolean computeTargetByLine(Integer line) {
+//        //1銆佽幏鍙栦换鍔¤〃涓殑鎵�鏈夌幓鐠冿紙鎸囧畾绾胯矾涓斿凡缁忚繘鍗ц浆绔嬪畬鎴愶級
+//        List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>()
+//                .eq(BigStorageCageFeedTask::getLine, line)
+//                .and(e -> e.isNull(BigStorageCageFeedTask::getTargetSlot).or().eq(BigStorageCageFeedTask::getTargetSlot, Const.OUT_TARGET_POSITION_ZERO))
+//                .in(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP_ALL)
+//                .orderByAsc(BigStorageCageFeedTask::getId));
+//        //2銆佸幓绗煎瓙鍐呮煡鎵炬槸鍚﹀彲浠ョ户缁瓨鏀剧殑绗煎瓙
+//        List<String> glassIds = taskList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList());
+//        List<GlassInfo> glassInfos = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().in(GlassInfo::getGlassId, glassIds));
+//        return computeIsTemperingTargetByLine(glassInfos, taskList);
+//    }
+
+//    /**
+//     * 鏄惁閽㈠寲鐜荤拑杩涚鐩爣浣嶇疆
+//     *
+//     * @param glassInfos 褰撴潯绾垮崸杞珛鎵�鏈夌幓鐠�
+//     * @param taskList   褰撴潯绾垮崸杞珛鎵�鏈変换鍔�
+//     */
+//    private boolean computeIsTemperingTargetByLine(List<GlassInfo> glassInfos, List<BigStorageCageFeedTask> taskList) {
+//        //1銆佸皢鐜荤拑淇℃伅闆嗗悎杞负glassid涓簁ey鐨刴ap
+//        Map<String, GlassInfo> glassInfoMap = glassInfos.stream()
+//                .collect(Collectors.toMap(GlassInfo::getGlassId, p -> p));
+//        for (BigStorageCageFeedTask e : taskList) {
+//            GlassInfo info = glassInfoMap.get(e.getGlassId());
+//            if (info == null) {
+//                continue;
+//            }
+//            BigStorageCageDetails cageDetails = new BigStorageCageDetails();
+//            BeanUtils.copyProperties(info, cageDetails);
+//            //todo:2銆佽幏鍙栫洰鏍囨牸瀛愪俊鎭�
+//            BigStorageDTO bigStorageDTO = bigStorageCageDetailsService.queryTargetSlotByTempering(info);
+//            //3銆佷复鏃舵洿鏂版牸瀛愮殑鍓╀綑灏哄锛氶槻姝㈢浉閭荤幓鐠冭繘鍚屼竴鏍煎瓙閫犳垚鍓╀綑灏哄涓嶈冻锛岀幓鐠冭秺鐣岀殑鎯呭喌锛屼换鍔″畬鎴愬悗鍐嶆鏇存柊澶х悊鐗囩琛ㄥ墿浣欏搴︼紙鎸夌収绗煎唴鐜荤拑鏁伴噺鏇存柊澶х悊鐗囩鍓╀綑灏哄锛�
+//            bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, bigStorageDTO.getWidth() - Math.max(info.getWidth(), info.getHeight()) - glassGap)
+//                    .eq(BigStorageCage::getSlot, bigStorageDTO.getSlot()));
+//            //4銆佹洿鏂拌繘鐗囦换鍔¤〃锛岀洰鏍囨牸瀛愬強鐘舵�侊紙鐘舵�佹敼涓�2 鐢垫皵鎵埌鑷澶勭悊锛�  閬囧埌闂锛氭棤娉曟壒閲忔洿鏂帮紝鎵归噺鏇存柊鏃犳硶璧版寚瀹氫粠搴�
+//            e.setTargetSlot(bigStorageDTO.getSlot());
+//            bigStorageCageFeedTaskService.updateById(e);
+//
+//            //5銆佸皢杩涚墖淇℃伅瀛樺叆澶х悊鐗囩璇︽儏琛�
+//            cageDetails.setSlot(bigStorageDTO.getSlot());
+//            cageDetails.setState(Const.GLASS_STATE_NEW);
+//            cageDetails.setDeviceId(bigStorageDTO.getDeviceId());
+//            cageDetails.setGap(glassGap);
+//            bigStorageCageDetailsService.save(cageDetails);
+//
+//        }
+//        return Boolean.TRUE;
+//    }
+    private void sendTaskListToPLC(List<BigStorageCageFeedTask> taskList, Integer line) {
+        log.info("閫佺墖浠诲姟鍙戦�佽繘鐗囩幓鐠冧俊鎭�");
+        S7control s7control = S7object.getinstance().plccontrol;
+        PlcParameterObject plcMesObject = S7object.getinstance().PlcMesObject;
+        String mesD03Address = plcMesObject.getPlcParameter("MESToD03").getAddress();
+        String mesD05Address = plcMesObject.getPlcParameter("MESToD05").getAddress();
+        String outLine = line.equals(Const.A09_OUT_TARGET_POSITION) ? mesD03Address : mesD05Address;
+        for (int i = 1; i <= taskList.size(); i++) {
+            s7control.writeWord(plcMesObject.getPlcParameter("StartAddToImport" + i).getAddress(), taskList.get(i - 1).getLine());
+            s7control.writeWord(plcMesObject.getPlcParameter("TargetAddToImport" + i).getAddress(), taskList.get(i - 1).getTargetSlot());
+            log.info("鍚憄lc鍙戦�佺{}鐗囩幓鐠冨凡瀹屾垚,璧峰浣嶇疆鏄瘂}锛岀洰鏍囦綅缃槸", i, taskList.get(i - 1).getLine(), taskList.get(i - 1).getTargetSlot());
+        }
+        int returnData = 1;
+        int count = 1;
+        while (returnData != 0) {
+            s7control.writeWord(outLine, 2);
+            if (line.equals(Const.A09_OUT_TARGET_POSITION)) {
+                returnData = Integer.parseInt(plcMesObject.getPlcParameter("D03ToMES").getValue());
+            } else {
+                returnData = Integer.parseInt(plcMesObject.getPlcParameter("D05ToMES").getValue());
+            }
+//            returnData = s7control.readWord(outLine, 1).get(0);
+            log.info("宸插悜plc绗瑊}娆″彂閫佽繘鐗囦换鍔$‘璁わ紝鍦板潃涓猴細{},鍐欏叆鐨勫唴瀹逛负{}", count++, outLine, 2);
+        }
+    }
+
+//    /**
+//     * 鍑虹墖涓�娆′粎鐢熸垚涓�杞︾幓鐠�
+//     *
+//     * @param list
+//     * @param isTempering
+//     * @param mesToPLCAddress
+//     * @param <T>
+//     * @return
+//     */
+//    private <T extends BigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, Boolean isTempering, String mesToPLCAddress) {
+//        //浠诲姟鏁版嵁  鑾峰彇杞﹀瓙瀛樻斁鐜荤拑鏈�澶ф暟閲�  鐜荤拑闂撮殧
+//        List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>();
+//        //鎵撹溅鍓╀綑灏哄
+//        Integer remainWidth = carWidth;
+//        int maxX = 0;
+//        for (T e : list) {
+//            if (bigStorageCageOutTaskList.size() >= outCarMaxSize || Math.max((int) e.getWidth(), (int) e.getHeight()) > remainWidth) {
+//                break;
+//            }
+//            remainWidth = remainWidth - Math.max((int) e.getWidth(), (int) e.getHeight()) - glassGap;
+//            if (isTempering) {
+//                int minLength = Math.min((int) e.getWidth(), (int) e.getHeight());
+//                if (maxX + minLength <= xMaxSize) {
+//                    bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION,
+//                            e.getWidth() * 10, e.getHeight() * 10, 0, 0, 1, new Date()));
+//                    maxX = Math.max(maxX, e.getXCoordinate());
+//                } else {
+//                    break;
+//                }
+//
+//            } else {
+//                bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.ARTIFICIAL_OUT_TARGET_POSITION,
+//                        e.getWidth() * 10, e.getHeight(), 0, 0, 1, new Date()));
+//            }
+//        }
+//        Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageOutTaskList), "鏈幏鍙栧嚭鐗囨暟鎹紝缁撴潫鍑虹墖浠诲姟");
+//        log.info("鑾峰彇鍑虹墖浠诲姟鏁版嵁{}鏉★紝鎵ц淇濆瓨", bigStorageCageOutTaskList.size());
+//        bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList);
+//        List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList());
+//        log.info("灏嗗嚭鐗囩幓鐠儃}鐜荤拑鐘舵�佹敼涓哄凡鍑虹墖", glassIds);
+//        bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
+//                .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING)
+//                .in(BigStorageCageDetails::getGlassId, glassIds));
+//        int returnData = 0;
+//        int count = 1;
+//        while (returnData == 0) {
+//            S7object.getinstance().plccontrol.writeWord(mesToPLCAddress, 1);
+//            returnData = S7object.getinstance().plccontrol.readWord(mesToPLCAddress, 1).get(0);
+//            log.info("宸插悜plc绗瑊}娆″彂閫佸嚭鐗囦换鍔$‘璁わ紝鍦板潃涓猴細{},鍐欏叆鐨勫唴瀹逛负{}", count++, mesToPLCAddress, returnData);
+//        }
+//        return Boolean.TRUE;
+//    }
+
+//    /**
+//     * 鍑虹墖涓�娆$敓鎴愪竴鐐夌幓鐠�
+//     *
+//     * @param list
+//     * @param isTempering
+//     * @param mesToPLCAddress
+//     * @param <T>
+//     * @return
+//     */
+//    public <T extends BigStorageCageBaseInfo> Boolean computeOutMoreGlassInfo(List<T> list, Boolean isTempering, String mesToPLCAddress) {
+//        //浠诲姟鏁版嵁  鑾峰彇杞﹀瓙瀛樻斁鐜荤拑鏈�澶ф暟閲�  鐜荤拑闂撮殧
+//        List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>();
+//        //鎵撹溅鍓╀綑灏哄
+//        Integer remainWidth = carWidth;
+//        int trainNumber = 1;
+//        int serialNumber = 1;
+//        int maxX = 0;
+//        for (T e : list) {
+//            int maxLength = Math.max((int) e.getWidth(), (int) e.getHeight());
+//            if (serialNumber > outCarMaxSize || maxLength > remainWidth) {
+//                remainWidth = carWidth;
+//                trainNumber = trainNumber + 1;
+//                serialNumber = 1;
+//                maxX = 0;
+//            }
+//            remainWidth = remainWidth - maxLength - glassGap;
+//            if (isTempering) {
+//                int minLength = Math.min((int) e.getWidth(), (int) e.getHeight());
+//                if (maxX + minLength <= xMaxSize) {
+//                    bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION,
+//                            e.getWidth() * 10, e.getHeight() * 10, trainNumber, serialNumber++, 1, new Date()));
+//                    maxX = Math.max(maxX, e.getXCoordinate());
+//                } else {
+//                    remainWidth = carWidth - maxLength - glassGap;
+//                    trainNumber = trainNumber + 1;
+//                    serialNumber = 1;
+//                    maxX = e.getXCoordinate();
+//                    bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION,
+//                            e.getWidth() * 10, e.getHeight(), trainNumber, serialNumber++, 1, new Date()));
+//                }
+//            } else {
+//                bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.ARTIFICIAL_OUT_TARGET_POSITION,
+//                        e.getWidth() * 10, e.getHeight(), trainNumber, serialNumber++, 1, new Date()));
+//            }
+//        }
+//        Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageOutTaskList), "鏈幏鍙栧嚭鐗囨暟鎹紝缁撴潫鍑虹墖浠诲姟");
+//        log.info("鑾峰彇鍑虹墖浠诲姟鏁版嵁{}鏉★紝鎵ц淇濆瓨", bigStorageCageOutTaskList.size());
+//        for (BigStorageCageOutTask bigStorageCageOutTask : bigStorageCageOutTaskList
+//        ) {
+//            bigStorageCageOutTaskService.save(bigStorageCageOutTask);
+//        }
+////        bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList);
+//        List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList());
+//        log.info("灏嗗嚭鐗囩幓鐠儃}鐜荤拑鐘舵�佹敼涓哄凡鍑虹墖", glassIds);
+//        bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
+//                .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING)
+//                .in(BigStorageCageDetails::getGlassId, glassIds)
+//                .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT));
+//
+//        return Boolean.TRUE;
+//    }
+
+    @Override
+    public BigStorageDTO queryTargetSlotByTempering(GlassInfo glassInfo) {
+//        BigStorageDTO bigStorageDTO = null;
+//        MPJLambdaWrapper<BigStorageCage> wrapper = new MPJLambdaWrapper<>(BigStorageCage.class)
+//                .selectAll(BigStorageCage.class)
+//                .leftJoin(BigStorageCageDetails.class, BigStorageCageDetails::getSlot, BigStorageCage::getSlot)
+//                .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
+//                .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL_ZERO)
+//                .eq(BigStorageCageDetails::getEngineerId, glassInfo.getEngineerId())
+//                .eq(BigStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId())
+//                .gt(BigStorageCage::getRemainWidth, Math.max(glassInfo.getWidth(), glassInfo.getHeight()))
+//                .last("limit 1");
+//        if (glassInfo.getTemperingLayoutId() == 0) {
+//            wrapper.eq(BigStorageCageDetails::getFlowCardId, glassInfo.getFlowCardId())
+//                    .eq(BigStorageCageDetails::getLayer, glassInfo.getLayer());
+////            wrapper.eq(BigStorageCageDetails::getWidth, glassInfo.getWidth()).eq(BigStorageCageDetails::getHeight, glassInfo.getHeight());
+//        } else {
+//            wrapper.eq(BigStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence() + 1);
+//        }
+//        BigStorageCage bigStorageCage = bigStorageCageService.selectJoinOne(BigStorageCage.class, wrapper);
+//        if (null != bigStorageCage) {
+//            log.info("鏃犻挗鍖栫増鍥緄d鎴栨牴鎹綋鍓嶇幓鐠冪墖搴�+1鎵惧埌鐩爣鏍煎瓙锛歿},鐜荤拑id锛歿}", bigStorageCage.getSlot(), glassInfo.getGlassId());
+//            bigStorageDTO = new BigStorageDTO();
+//            bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
+//            bigStorageDTO.setSlot(bigStorageCage.getSlot());
+//            bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
+//            return bigStorageDTO;
+//        }
+//        bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
+//                .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
+//                .eq(BigStorageCage::getRemainWidth, slotWidth)
+////                .notInSql(BigStorageCage::getSlot, "select distinct slot from big_storage_cage_details where state = 0")
+//                .inSql(BigStorageCage::getDeviceId,
+//                        "select distinct device_id from big_storage_cage_details where engineer_id = '" + glassInfo.getEngineerId() + "' and tempering_layout_id = " + glassInfo.getTemperingLayoutId())
+//                .last("limit 1"));
+//        if (null != bigStorageCage) {
+//            log.info("鏍规嵁鐗堝浘id鎵惧埌绗煎瓙鍐呯殑鐩爣鏍煎瓙锛歿},鐜荤拑id锛歿}", bigStorageCage.getSlot(), glassInfo.getGlassId());
+//            bigStorageDTO = new BigStorageDTO();
+//            bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
+//            bigStorageDTO.setSlot(bigStorageCage.getSlot());
+//            bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
+//            return bigStorageDTO;
+//        }
+//
+//        //鑾峰彇鐜荤拑鐨勫帤搴︼細閲嶆柊閫夌瀛愰渶瑕佹寜鐓х瀛愬彲鏀剧幓鐠冨帤搴﹁繘琛岄�夋嫨 鍥犱负瀛愭煡璇㈡帓搴忓涓籹ql鏃犲奖鍝嶏紝鎵�浠ュ厛鎵ц瀛愭煡璇㈣幏鍙栭『搴忥紝鐒跺悗涓�娆″幓鏌ヨ
+//        List<Integer> deviceUsedList = bigStorageCageService.queryFreeDeviceByUsed(glassInfo.getThickness());
+//        List<Integer> deviceUseds = bigStorageCageService.queryFreeDeviceByUsed(glassInfo.getThickness());
+//        List<BigStorageCageDetails> engineerCount1 = baseMapper.selectList(
+//                new LambdaQueryWrapper<BigStorageCageDetails>()
+//                        .notIn(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE)
+//                        .select(BigStorageCageDetails::getEngineerId)
+//                        .groupBy(BigStorageCageDetails::getEngineerId)
+//                        .between(BigStorageCageDetails::getDeviceId, 1, 5)
+//        );
+//        List<BigStorageCageDetails> engineerCount2 = baseMapper.selectList(
+//                new LambdaQueryWrapper<BigStorageCageDetails>()
+//                        .notIn(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE)
+//                        .select(BigStorageCageDetails::getEngineerId)
+//                        .groupBy(BigStorageCageDetails::getEngineerId)
+//                        .between(BigStorageCageDetails::getDeviceId, 6, 8)
+//        );
+//        if (engineerCount1.size() > engineerCount2.size()) {
+//            deviceUsedList.removeIf(device -> device < 6);
+//        } else {
+//            deviceUsedList.removeIf(device -> device > 5);
+//        }
+//        if (CollectionUtils.isEmpty(deviceUsedList)) {
+//            deviceUsedList = deviceUseds;
+//        }
+//        for (Integer item : deviceUsedList) {
+//            bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
+//                    .eq(BigStorageCage::getRemainWidth, slotWidth)
+//                    .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
+//                    .eq(BigStorageCage::getDeviceId, item)
+//                    .last("limit 1"));
+//            if (null != bigStorageCage) {
+//                log.info("鎸夌収瀛樼鐜荤拑鏍煎瓙鏁板崰鐢ㄦ渶灏戞柟寮忚幏鍙栦俊鎭牸瀛愪负锛歿},鐜荤拑id锛歿}", bigStorageCage.getSlot(), glassInfo.getGlassId());
+//                bigStorageDTO = new BigStorageDTO();
+//                bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
+//                bigStorageDTO.setSlot(bigStorageCage.getSlot());
+//                bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
+//                return bigStorageDTO;
+//            }
+//        }
+
+        //鑾峰彇鐜荤拑鐨勫帤搴︼細閲嶆柊閫夌瀛愰渶瑕佹寜鐓х瀛愬彲鏀剧幓鐠冨帤搴﹁繘琛岄�夋嫨
+//        List<Integer> deviceNotUsedList = bigStorageCageService.queryFreeDeviceByNotUsed(glassInfo.getThickness());
+//        for (Integer item : deviceNotUsedList) {
+//            bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
+//                    .eq(BigStorageCage::getRemainWidth, slotWidth)
+//                    .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
+//                    .eq(BigStorageCage::getDeviceId, item)
+//                    .last("limit 1"));
+//            if (null != bigStorageCage) {
+//                log.info("鎸夌収瀛樼鐜荤拑鏍煎瓙鏁板墿浣欐渶澶氬緱鏂瑰紡鑾峰彇淇℃伅鐗堝浘id:{},鏍煎瓙锛歿},鐜荤拑id锛歿}", glassInfo.getTemperingLayoutId(), bigStorageCage.getSlot(), glassInfo.getGlassId());
+//                bigStorageDTO = new BigStorageDTO();
+//                bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
+//                bigStorageDTO.setSlot(bigStorageCage.getSlot());
+//                bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
+//                return bigStorageDTO;
+//            }
+//        }
+//        Assert.isTrue(null != bigStorageCage, "娌℃湁绌轰綑鐨勭瀛愬瓨鏀剧幓鐠�");
+//        return bigStorageDTO;
+        return null;
+    }
+
+
+    @Scheduled(fixedDelay = 300)
+    public void querySizeByEngineerTask() {
+        log.info("鏌ヨ缁撴灉锛歿}", querySizeByEngineer("P24072402", 1, 10, 8));
+        log.info("鏌ヨ缁撴灉锛歿}", querySizeByEngineer("P24072402", 1, 5, 8));
+
+    }
+
+    public BigStorageDTO querySizeByEngineer(String engineerId, int temperingLayoutId, int temperingFeedSequence, double thickness) {
+        BigStorageDTO bigStorageDTO = null;
+        BigStorageCage bigStorageCage = null;
+        //鑾峰彇绗煎唴褰撳墠鐗堝浘姣忎釜鏍煎瓙宸叉湁鐜荤拑鐨勬渶灏忕増搴� 鑾峰彇绗煎唴褰撳墠鐗堝浘鐨勬墍鏈夌幓鐠冧俊鎭�
+        List<BigStorageCageDetails> cageDetailsList = bigStorageCageDetailsService.list(new QueryWrapper<BigStorageCageDetails>()
+                .select("slot", "min(tempering_feed_sequence) as tempering_feed_sequence")
+                .eq("engineer_id", engineerId).eq("tempering_layout_id", temperingLayoutId)
+                .in("state", Const.GLASS_STATE_IN_ALL_ZERO).groupBy("slot").orderByAsc("min(tempering_feed_sequence)"));
+        if (CollectionUtils.isNotEmpty(cageDetailsList)) {
+            Integer minLength = cageDetailsList.stream().filter(e -> e.getTemperingFeedSequence() > temperingFeedSequence)
+                    .mapToInt(BigStorageCageDetails::getTemperingFeedSequence).min().orElse(1000);
+            List<GlassInfo> infoList = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>()
+                    .notInSql(GlassInfo::getGlassId, "select glass_id from damage where tempering_layout_id = " + temperingLayoutId + " and engineer_id = '" + engineerId + "'")
+                    .eq(GlassInfo::getTemperingLayoutId, temperingLayoutId).eq(GlassInfo::getEngineerId, engineerId).orderByAsc(GlassInfo::getTemperingFeedSequence));
+            int remainWidth = carWidth;
+            int trainNumber = 1;
+            int serialNumber = 0;
+            int min = 0;
+            int temp = infoList.get(0).getTemperingFeedSequence();
+            int slot = 0;
+            int resultTrainNumber = 0;
+            for (GlassInfo e : infoList) {
+                int maxLength = Math.max((int) e.getWidth(), (int) e.getHeight());
+                if (serialNumber >= outCarMaxSize || maxLength > remainWidth || e.getTemperingFeedSequence() >= minLength) {
+                    if (resultTrainNumber != 0) {
+                        min = temp;
+                        break;
+                    }
+                    temp = e.getTemperingFeedSequence();
+                    remainWidth = carWidth;
+                    trainNumber = trainNumber + 1;
+                    serialNumber = 0;
+                }
+                if (temperingFeedSequence == e.getTemperingFeedSequence()) {
+                    resultTrainNumber = trainNumber;
+                }
+                remainWidth = remainWidth - maxLength - glassGap > 0 ? remainWidth - maxLength - glassGap : 0;
+                serialNumber += 1;
+                log.info("{},{},{}", trainNumber, remainWidth, serialNumber);
+                if (e.getTemperingFeedSequence().equals(infoList.get(infoList.size() - 1).getTemperingFeedSequence())) {
+                    min = temp;
+                }
+            }
+            for (BigStorageCageDetails item : cageDetailsList) {
+                if (min <= item.getTemperingFeedSequence() && item.getTemperingFeedSequence() < minLength) {
+                    slot = item.getSlot();
+                    bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
+                            .eq(BigStorageCage::getSlot, slot).eq(BigStorageCage::getEnableState, Const.SLOT_ON));
+                    break;
+                }
+            }
+        }
+
+        if (bigStorageCage != null) {
+            bigStorageDTO = new BigStorageDTO();
+            bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
+            bigStorageDTO.setSlot(bigStorageCage.getSlot());
+            bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
+            return bigStorageDTO;
+        }
+
+        bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
+                .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
+                .eq(BigStorageCage::getRemainWidth, slotWidth)
+                .inSql(BigStorageCage::getDeviceId,
+                        "select distinct device_id from big_storage_cage_details where engineer_id = '" + engineerId + "' and tempering_layout_id = " + temperingLayoutId)
+                .last("limit 1"));
+        if (null != bigStorageCage) {
+            log.info("鏍规嵁鐗堝浘id鎵惧埌绗煎瓙鍐呯殑鐩爣鏍煎瓙锛歿}", bigStorageCage.getSlot());
+            bigStorageDTO = new BigStorageDTO();
+            bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
+            bigStorageDTO.setSlot(bigStorageCage.getSlot());
+            bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
+            return bigStorageDTO;
+
+        }
+
+        //鑾峰彇鐜荤拑鐨勫帤搴︼細閲嶆柊閫夌瀛愰渶瑕佹寜鐓х瀛愬彲鏀剧幓鐠冨帤搴﹁繘琛岄�夋嫨 鍥犱负瀛愭煡璇㈡帓搴忓涓籹ql鏃犲奖鍝嶏紝鎵�浠ュ厛鎵ц瀛愭煡璇㈣幏鍙栭『搴忥紝鐒跺悗涓�娆″幓鏌ヨ
+        List<Integer> deviceUsedList = bigStorageCageService.queryFreeDeviceByUsed(thickness);
+        for (Integer item : deviceUsedList) {
+            bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
+                    .eq(BigStorageCage::getRemainWidth, slotWidth)
+                    .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
+                    .eq(BigStorageCage::getDeviceId, item)
+                    .last("limit 1"));
+            if (null != bigStorageCage) {
+                log.info("鎸夌収瀛樼鐜荤拑鏍煎瓙鏁板崰鐢ㄦ渶灏戞柟寮忚幏鍙栦俊鎭牸瀛愪负锛歿}", bigStorageCage.getSlot());
+                bigStorageDTO = new BigStorageDTO();
+                bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
+                bigStorageDTO.setSlot(bigStorageCage.getSlot());
+                bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
+                return bigStorageDTO;
+            }
+        }
+        Assert.isTrue(null != bigStorageCage, "娌℃湁绌轰綑鐨勭瀛愬瓨鏀剧幓鐠�");
+        return bigStorageDTO;
+    }
+
+
+}
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
index 4028900..5ef3b71 100644
--- a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
@@ -13,6 +13,7 @@
         <result column="engineer_id" property="engineerId"/>
         <result column="tempering_layout_id" property="temperingLayoutId"/>
         <result column="slot" property="slot"/>
+        <result column="glass_count" property="glassCount"/>
         <result column="max_sequence" property="maxSequence"/>
         <result column="min_sequence" property="minSequence"/>
         <result column="remain_width" property="remainWidth"/>
@@ -65,6 +66,7 @@
                  SELECT ENGINEER_ID,
                         TEMPERING_LAYOUT_ID,
                         SLOT,
+                        count(*)                     as glass_count,
                         MAX(TEMPERING_FEED_SEQUENCE) AS MAX_SEQUENCE,
                         MIN(TEMPERING_FEED_SEQUENCE) AS MIN_SEQUENCE
                  FROM BIG_STORAGE_CAGE_DETAILS
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageInTaskMapper.xml b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageInTaskMapper.xml
new file mode 100644
index 0000000..84a0817
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageInTaskMapper.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.mes.bigstoragecagetask.mapper.BigStorageCageTaskMapper">
+
+    <resultMap id="baseMap" type="com.mes.bigstoragecagetask.entity.BigStorageCageTask">
+        <result column="glass_id" property="glassId"/>
+        <result column="start_slot" property="startSlot"/>
+        <result column="target_slot" property="targetSlot"/>
+        <result column="task_state" property="taskState"/>
+    </resultMap>
+    <insert id="saveTaskMessage">
+        INSERT INTO ${tableName} (glass_id, start_slot, target_slot,task_state)
+        VALUES
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.glassId}, #{item.startSlot},#{item.targetSlot},#{item.taskState})
+        </foreach>
+    </insert>
+    <delete id="removeAll">
+        delete
+        from ${tableName}
+    </delete>
+
+    <select id="queryTaskMessage" resultMap="baseMap">
+        select *
+        from ${tableName}
+        where glass_id is not null
+          and glass_id != ''
+    </select>
+
+
+    <update id="updateTaskMessage">
+        UPDATE ${tableName}
+        SET target_slot = #{task.targetSlot}
+        where glass_id = #{task.glassId}
+    </update>
+
+
+</mapper>
\ No newline at end of file
diff --git a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java
index 18032eb..f2d1129 100644
--- a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java
+++ b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java
@@ -8,10 +8,15 @@
 import com.mes.common.config.Const;
 import com.mes.engineering.entity.Engineering;
 import com.mes.engineering.mapper.EngineeringMapper;
+import com.mes.opctask.entity.LoadGlassDeviceTask;
+import com.mes.opctask.service.LoadGlassDeviceTaskService;
 import com.mes.rawglassdetails.entity.RawGlassStorageDetails;
 import com.mes.rawglassdetails.service.RawGlassStorageDetailsService;
+import com.mes.rawglassstation.entity.RawGlassStorageStation;
+import com.mes.rawglassstation.service.RawGlassStorageStationService;
 import com.mes.rawglasstask.entity.RawGlassStorageTask;
 import com.mes.rawglasstask.service.RawGlassStorageTaskService;
+import com.mes.uppattenusage.entity.UpPattenUsage;
 import com.mes.uppattenusage.entity.vo.UpPattenUsageVO;
 import com.mes.uppattenusage.mapper.UpPattenUsageMapper;
 import lombok.extern.slf4j.Slf4j;
@@ -38,45 +43,50 @@
 
     @Autowired
     private RawGlassStorageTaskService rawGlassStorageTaskService;
+    @Autowired
+    private RawGlassStorageStationService rawGlassStorageStationService;
 
     @Resource
     private EngineeringMapper engineeringMapper;
     @Resource
     private UpPattenUsageMapper upPattenUsageMapper;
 
+    @Resource
+    private LoadGlassDeviceTaskService loadGlassDeviceTaskService;
+
     @Autowired(required = false)
     private MiloService miloService;
 
-    private static final List<Integer> LIFTING_STATION = Arrays.asList(4);
-    private static final List<String> LOAD_STATION_01 = Arrays.asList("101", "102");
-    private static final List<String> LOAD_STATION_02 = Arrays.asList("103", "104");
-    private static final List<Integer> LOAD_STATION_MAX = Arrays.asList(102, 104);
+
+    private static final String LOAD_GLASS_DEVICE_ONE_TASK = "load_glass_device_one_task";
+
+    private static final String LOAD_GLASS_DEVICE_TWO_TASK = "load_glass_device_two_task";
+
+    private static final List<Integer> LOAD_STATION_01 = Arrays.asList(101, 102);
+    private static final List<Integer> LOAD_STATION_02 = Arrays.asList(103, 104);
     private static final Integer LEFTING_01 = 98;
     private static final Integer LEFTING_02 = 99;
-    private static final Integer LOAD_GLASS_01_01 = 101;
-    private static final Integer LOAD_GLASS_01_02 = 102;
-    private static final Integer LOAD_GLASS_02_01 = 103;
-    private static final Integer LOAD_GLASS_02_02 = 104;
+    private static final Integer LOAD_GLASS_ONE_DEVICE = 5;
+    private static final Integer LOAD_GLASS_TWO_DEVICE = 6;
 
     @Scheduled(fixedDelay = 1000)
     public void rawStorageTask() throws Exception {
-        ReadWriteEntity requestWord = miloService.readFromOpcUa("A01-CC.dev.request");
-        ReadWriteEntity confireWord = miloService.readFromOpcUa("A01-CC.dev.confirmationWord");
-        ReadWriteEntity reportWord = miloService.readFromOpcUa("A01-CC.dev.reportWord");
-        ReadWriteEntity taskWord = miloService.readFromOpcUa("A01-CC.dev.taskWord");
+        ReadWriteEntity requestWord = miloService.readFromOpcUa("PLC.CC.request");
+        ReadWriteEntity confireWord = miloService.readFromOpcUa("PLC.CC.confirmation");
+        ReadWriteEntity reportWord = miloService.readFromOpcUa("PLC.CC.reportWord");
+        ReadWriteEntity taskWord = miloService.readFromOpcUa("PLC.CC.taskWord");
         String requestValue = requestWord.getValue() + "";
         if ("0".equals(requestValue)) {
             if ("1".equals(confireWord.getValue() + "") && "0".equals(reportWord.getValue() + "")) {
                 List<ReadWriteEntity> list = new ArrayList<>();
-                list.add(generateReadWriteEntity("A01-CC.dev.confirmationWord", 0));
+                list.add(generateReadWriteEntity("PLC.CC.confirmation", 0));
                 miloService.writeToOpcWord(list);
             }
             if ("1".equals(taskWord.getValue() + "")) {
                 List<ReadWriteEntity> list = new ArrayList<>();
-                list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 0));
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 0));
-                list.add(generateReadWriteEntity("A01-CC.dev.startSlot", 0));
-                list.add(generateReadWriteEntity("A01-CC.dev.endSlot", 0));
+                list.add(generateReadWriteEntity("PLC.CC.taskWord", 0));
+                list.add(generateReadWriteEntity("PLC.CC.startSlot", 0));
+                list.add(generateReadWriteEntity("PLC.CC.endSlot", 0));
                 miloService.writeToOpcWord(list);
             }
             return;
@@ -112,7 +122,7 @@
 
     @Scheduled(fixedDelay = 1000)
     public void rawStorageInCar() throws Exception {
-        ReadWriteEntity entity = miloService.readFromOpcUa("A01-CC.dev.inCar");
+        ReadWriteEntity entity = miloService.readFromOpcUa("PLC.CC.inCar");
         String value = entity.getValue() + "";
         if (!"1".equals(value)) {
             log.info("澶ц溅涓婃病鏈夋灦瀛�");
@@ -132,7 +142,7 @@
 
     @Scheduled(fixedDelay = 1000)
     public void rawStorageFinish() throws Exception {
-        ReadWriteEntity entity = miloService.readFromOpcUa("A01-CC.dev.reportWord");
+        ReadWriteEntity entity = miloService.readFromOpcUa("PLC.CC.reportWord");
         String value = entity.getValue() + "";
         if ("0".equals(value)) {
             log.info("褰撳墠浠诲姟鏈眹鎶ワ紝缁撴潫鏈浠诲姟");
@@ -147,6 +157,7 @@
         RawGlassStorageTask task = rawGlassStorageTaskService.getOne(new LambdaQueryWrapper<RawGlassStorageTask>()
                 .in(RawGlassStorageTask::getTaskState, Const.RAW_GLASS_TASK_NEW));
         RawGlassStorageDetails targetDetails = generateDetails(details, task.getEndSlot());
+        int deviceId = details.getDeviceId();
         Integer taskType = task.getTaskType();
         if ("1".equals(value)) {
             log.info("灏嗚鎯呰〃鐨勭姸鎬佹敼涓哄凡鍑哄簱");
@@ -159,6 +170,7 @@
                     .set(RawGlassStorageTask::getTaskState, Const.RAW_GLASS_TASK_SUCCESS));
             switch (taskType) {
                 case 1:
+                case 3:
                     log.info("1銆佸叆搴擄紝3銆佽皟搴︿换鍔°�倇}", taskType);
                     if (targetDetails.getRemainQuantity() > 0) {
                         rawGlassStorageDetailsService.save(targetDetails);
@@ -169,6 +181,7 @@
                     log.info("2銆佸嚭鐗�,4銆佸叆搴撹姹傘�倇}", taskType);
                     targetDetails = new RawGlassStorageDetails();
                     targetDetails.setSlot(task.getEndSlot());
+                    targetDetails.setDeviceId(deviceId);
                     targetDetails.setShelf(task.getStartSlot());
                     targetDetails.setState(Const.RAW_GLASS_STATE_IN);
                     rawGlassStorageDetailsService.save(targetDetails);
@@ -194,7 +207,7 @@
 
         }
         List<ReadWriteEntity> list = new ArrayList<>();
-        list.add(generateReadWriteEntity("A01-CC.dev.confirmationWord", 1));
+        list.add(generateReadWriteEntity("PLC.CC.confirmation", 1));
         miloService.writeToOpcWord(list);
     }
 
@@ -253,10 +266,10 @@
         rawGlassStorageDetailsService.generateTask(startSlot, lefting, startSlot, rawGlassList.get(0).getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_OUT);
 
 //        List<ReadWriteEntity> list = new ArrayList<>();
-//        list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
-//        list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
-//        list.add(generateReadWriteEntity("A01-CC.dev.startSlot", startSlot));
-//        list.add(generateReadWriteEntity("A01-CC.dev.endSlot", lefting));
+//        list.add(generateReadWriteEntity("PLC.CC.taskWord", 1));
+//        list.add(generateReadWriteEntity("PLC.CC.taskSending", 1));
+//        list.add(generateReadWriteEntity("PLC.CC.startSlot", startSlot));
+//        list.add(generateReadWriteEntity("PLC.CC.endSlot", lefting));
 //        miloService.writeToOpcWord(list);
 
         //淇敼鍑虹墖浠诲姟鐘舵��
@@ -287,10 +300,10 @@
         rawGlassStorageDetailsService.generateTask(details.getSlot(), details.getShelf(), details.getShelf(),
                 details.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_IN);
 //        List<ReadWriteEntity> list = new ArrayList<>();
-//        list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
-//        list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
-//        list.add(generateReadWriteEntity("A01-CC.dev.startSlot", details.getSlot()));
-//        list.add(generateReadWriteEntity("A01-CC.dev.endSlot", details.getShelf()));
+//        list.add(generateReadWriteEntity("PLC.CC.taskWord", 1));
+//        list.add(generateReadWriteEntity("PLC.CC.taskSending", 1));
+//        list.add(generateReadWriteEntity("PLC.CC.startSlot", details.getSlot()));
+//        list.add(generateReadWriteEntity("PLC.CC.endSlot", details.getShelf()));
 //        miloService.writeToOpcWord(list);
         //鐢熸垚宸ヤ綅浠诲姟锛屽皢鍚婅浣嶇殑鐜荤拑鐘舵�佹敼浣嶈繘绗间腑
         //淇敼鍚婅浣嶇殑鍘熺墖鐘舵�佷负103 鍑虹墖涓�
@@ -315,149 +328,178 @@
             log.info("姝e湪鎵ц鐨勫伐绋嬪師鐗囨棤鍙笂鐗囩殑鍘熺墖淇℃伅");
             return Boolean.FALSE;
         }
-        //鑾峰彇褰撳墠涓婄墖浣�1鍙锋灦瀛愪俊鎭�
-        int endSlot = stationCell == LOAD_GLASS_01_01 ? LOAD_GLASS_01_01 : LOAD_GLASS_02_01;
-        int endSlot02 = stationCell == LOAD_GLASS_01_02 ? LOAD_GLASS_01_01 : LOAD_GLASS_02_02;
+        //鑾峰彇褰撳墠闇�瑕佷笂鐗囩殑鍘熺墖鏁版嵁
         Map<String, List<UpPattenUsageVO>> upListMap = pattenUsageList.stream()
                 .collect(Collectors.groupingBy(UpPattenUsageVO::getGroupNumber));
-        //1銆佹煡璇�2涓笂鐗囩殑鍘熺墖璇︽儏
-        List<RawGlassStorageDetails> rawGlassDetailsList = rawGlassStorageDetailsService.list(new LambdaQueryWrapper<RawGlassStorageDetails>()
-                .eq(RawGlassStorageDetails::getState, Const.GLASS_STATE_IN).in(RawGlassStorageDetails::getDeviceId, stationCell)
-                .orderByAsc(RawGlassStorageDetails::getSlot));
-        List<UpPattenUsageVO> upPattenUsage01VOS = upListMap.get("1");
-        UpPattenUsageVO usageVO = upPattenUsage01VOS.get(0);
-        if (CollectionUtils.isEmpty(rawGlassDetailsList)) {
-            //琛ㄧず1涓婄墖浣嶆病鏈夋灦瀛愶紝鐩存帴鎵惧師鐗囨斁鍏ュ搴旇矾绾跨殑1鍙蜂笂鐗囦綅
-            RawGlassStorageDetails details = rawGlassStorageDetailsService.getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
-                            .eq(RawGlassStorageDetails::getFilmsId, usageVO.getFilmsId())
-                            .eq(RawGlassStorageDetails::getPatternWidth, usageVO.getWidth())
-                            .eq(RawGlassStorageDetails::getPatternHeight, usageVO.getHeight())
-                            .eq(RawGlassStorageDetails::getPatternThickness, usageVO.getThickness())
-                            .inSql(RawGlassStorageDetails::getSlot, "select slot from raw_glass_storage_station where enable_state = 1")
-                            .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
-//                    .gt(RawGlassStorageDetails::getRemainQuantity, upPattenUsage01VOS.size())
-                            .orderByAsc(RawGlassStorageDetails::getRemainQuantity)
-                            .last("limit 1")
-            );
-            rawGlassStorageDetailsService.generateTask(details.getSlot(), endSlot, details.getSlot(), details.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+        List<UpPattenUsageVO> usageVOS = upListMap.get("1");
+        //鑾峰彇褰撳墠涓婄墖浣�1鍙锋灦瀛愪俊鎭�
+        List<Integer> loadStation = LOAD_GLASS_ONE_DEVICE.equals(stationCell) ? LOAD_STATION_01 : LOAD_STATION_02;
+        List<RawGlassStorageStation> stations = rawGlassStorageStationService.list(new LambdaQueryWrapper<RawGlassStorageStation>()
+                .in(RawGlassStorageStation::getSlot, loadStation)
+                .eq(RawGlassStorageStation::getEnableState, Const.SLOT_ON).orderByAsc(RawGlassStorageStation::getSlot));
+        if (CollectionUtils.isEmpty(stations)) {
+            log.info("娌℃湁鍙敤鐨勪笂鐗囦綅");
+            return Boolean.FALSE;
+        }
 
+
+        List<RawGlassStorageDetails> loadStationList = rawGlassStorageDetailsService.list(new LambdaQueryWrapper<RawGlassStorageDetails>()
+                .inSql(RawGlassStorageDetails::getSlot, "select slot from raw_glass_storage_station where enable_state = 1")
+                .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                .eq(RawGlassStorageDetails::getDeviceId, stationCell));
+        if (stations.size() == 1) {
+            if (CollectionUtils.isEmpty(loadStationList)) {
+                RawGlassStorageDetails rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size());
+                rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), stations.get(0).getSlot(), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                //缁撴潫璋冨害浠诲姟 淇敼宸ヤ綅鐘舵��(璧峰浣嶏級鐘舵�佷负103 RAW_GLASS_STATE_RUNNING 浠诲姟瀹屾垚鍚庡皢鐘舵�佹敼涓�101  鐩爣浣嶆柊澧炰竴鏉℃暟鎹紝鏋跺瓙鍙蜂负锛堣捣濮嬩綅锛�
+                rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                        .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                        .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
+                return Boolean.TRUE;
+            }
+            RawGlassStorageDetails oneLoadStation = loadStationList.get(0);
+            if (oneLoadStation.getRemainQuantity() <= 0 || !compareRawSize(usageVOS.get(0), oneLoadStation)) {
+                rawGlassStorageDetailsService.generateTask(stations.get(0).getSlot(), oneLoadStation.getShelf(), oneLoadStation.getShelf(), oneLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                        .eq(RawGlassStorageDetails::getSlot, oneLoadStation.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                        .set(RawGlassStorageDetails::getDeviceId, Const.RAW_GLASS_STATE_RUNNING));
+                return Boolean.FALSE;
+            }
+        }
+
+        log.info("鑾峰彇{}涓婄墖绾跨殑宸ヤ綅淇℃伅{}", stationCell, loadStationList);
+        if (CollectionUtils.isEmpty(loadStationList)) {
+            log.info("1鍙蜂笂鐗囦綅鐢熸垚璋冨害浠诲姟");
+            RawGlassStorageDetails rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size());
+            rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), loadStation.get(0), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
             //缁撴潫璋冨害浠诲姟 淇敼宸ヤ綅鐘舵��(璧峰浣嶏級鐘舵�佷负103 RAW_GLASS_STATE_RUNNING 浠诲姟瀹屾垚鍚庡皢鐘舵�佹敼涓�101  鐩爣浣嶆柊澧炰竴鏉℃暟鎹紝鏋跺瓙鍙蜂负锛堣捣濮嬩綅锛�
             rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
-                    .eq(RawGlassStorageDetails::getSlot, details.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
-                    .set(RawGlassStorageDetails::getDeviceId, Const.RAW_GLASS_STATE_RUNNING));
+                    .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                    .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
             return Boolean.TRUE;
         }
-        RawGlassStorageDetails glassStorageDetails = rawGlassDetailsList.get(0);
-        if (rawGlassDetailsList.size() == 2) {
-            if (!((usageVO.getWidth() == glassStorageDetails.getPatternWidth() && usageVO.getHeight() == glassStorageDetails.getPatternHeight() &&
-                    usageVO.getThickness() == glassStorageDetails.getPatternThickness() && usageVO.getFilmsId().equals(glassStorageDetails.getFilmsId())))
-                    || ((usageVO.getWidth() == glassStorageDetails.getPatternWidth() && usageVO.getHeight() == glassStorageDetails.getPatternHeight() &&
-                    usageVO.getThickness() == glassStorageDetails.getPatternThickness() && usageVO.getFilmsId().equals(glassStorageDetails.getFilmsId()))
-                    && glassStorageDetails.getRemainQuantity() == 0)) {
-                //灏嗘灦瀛愭斁鍥炲師宸ヤ綅涓�
-                rawGlassStorageDetailsService.generateTask(endSlot, glassStorageDetails.getShelf(), glassStorageDetails.getShelf(), 0, Const.RAW_GLASS_TASK_TYPE_DISPATCH);
-//                List<ReadWriteEntity> list = new ArrayList<>();
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.startSlot", endSlot));
-//                list.add(generateReadWriteEntity("A01-CC.dev.endSlot", glassStorageDetails.getShelf()));
-//                miloService.writeToOpcWord(list);
-                rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
-                        .eq(RawGlassStorageDetails::getSlot, glassStorageDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
-                        .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
-                return Boolean.TRUE;
-            }
-            return Boolean.FALSE;
-        }
-        //todo:1鏉$嚎涓斿綋鏉$嚎涓�2鍙蜂笂鐗囦负
-        if (LOAD_STATION_MAX.contains(glassStorageDetails.getSlot())) {
-            log.info("涓婄墖浣�2鍙锋湁鏋跺瓙锛岀粨鏉熸湰鏉$嚎{}鐨勮皟搴︿换鍔�", stationCell);
-            if (!((usageVO.getWidth() == glassStorageDetails.getPatternWidth() && usageVO.getHeight() == glassStorageDetails.getPatternHeight() &&
-                    usageVO.getThickness() == glassStorageDetails.getPatternThickness() && usageVO.getFilmsId().equals(glassStorageDetails.getFilmsId())))
-                    || ((usageVO.getWidth() == glassStorageDetails.getPatternWidth() && usageVO.getHeight() == glassStorageDetails.getPatternHeight() &&
-                    usageVO.getThickness() == glassStorageDetails.getPatternThickness() && usageVO.getFilmsId().equals(glassStorageDetails.getFilmsId()))
-                    && glassStorageDetails.getRemainQuantity() == 0)) {
-                //灏嗘灦瀛愭斁鍥炲師宸ヤ綅涓�
-                rawGlassStorageDetailsService.generateTask(endSlot02, glassStorageDetails.getShelf(), glassStorageDetails.getShelf(), 0, Const.RAW_GLASS_TASK_TYPE_DISPATCH);
-//                List<ReadWriteEntity> list = new ArrayList<>();
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.startSlot", endSlot02));
-//                list.add(generateReadWriteEntity("A01-CC.dev.endSlot", glassStorageDetails.getShelf()));
-//                miloService.writeToOpcWord(list);
-                rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
-                        .eq(RawGlassStorageDetails::getSlot, glassStorageDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
-                        .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
-                return Boolean.TRUE;
-            }
-            return Boolean.FALSE;
-        } else {
-            //姣旇緝褰撳墠1鍙锋灦瀛愪笂鐨勭幓鐠冨墿浣欐暟閲忔槸鍚︿负0鎴栬�呭凡鐢ㄥ畬
-            if (usageVO.getWidth() == glassStorageDetails.getPatternWidth() && usageVO.getHeight() == glassStorageDetails.getPatternHeight() &&
-                    usageVO.getThickness() == glassStorageDetails.getPatternThickness() && usageVO.getFilmsId().equals(glassStorageDetails.getFilmsId())) {
-                RawGlassStorageDetails details = null;
-                if (upPattenUsage01VOS.size() > glassStorageDetails.getRemainQuantity()) {
-                    //2鍙蜂綅涓婄墖锛氱户缁綋鍓嶅昂瀵哥殑鍘熺墖
-                    details = rawGlassStorageDetailsService.getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
-                            .eq(RawGlassStorageDetails::getFilmsId, usageVO.getFilmsId())
-                            .eq(RawGlassStorageDetails::getPatternWidth, usageVO.getWidth())
-                            .eq(RawGlassStorageDetails::getPatternHeight, usageVO.getHeight())
-                            .eq(RawGlassStorageDetails::getPatternThickness, usageVO.getThickness())
-                            .gt(RawGlassStorageDetails::getRemainQuantity, upPattenUsage01VOS.size())
-                            .orderByAsc(RawGlassStorageDetails::getRemainQuantity)
-                            .last("limit 1"));
+        RawGlassStorageDetails oneLoadStation = loadStationList.stream().filter(e -> e.getSlot().equals(loadStation.get(0))).findFirst().orElse(null);
+        if (null == oneLoadStation) {
+            RawGlassStorageDetails twoLoadStation = loadStationList.stream().filter(e -> e.getSlot().equals(loadStation.get(1))).findFirst().orElse(null);
+            if (twoLoadStation.getRemainQuantity() > 0) {
+                if (compareRawSize(usageVOS.get(0), twoLoadStation)) {
+//                    2鍙蜂笂鐗囦綅鐨勫師鐗囦俊鎭簮宸ョ▼淇℃伅涓�鑷达紝鍙笂鐗囨搷浣滐紝缁撴潫鏈浠诲姟
+                    return Boolean.FALSE;
                 } else {
-                    //2鍙蜂綅涓婄墖锛氳幏鍙栫浜岀灏哄鐨勫師鐗�
-                    List<UpPattenUsageVO> upPattenUsage02VOS = upListMap.get("2");
-                    if (CollectionUtils.isEmpty(upPattenUsage01VOS)) {
-                        return Boolean.FALSE;
-                    }
-                    usageVO = upPattenUsage02VOS.get(0);
-                    details = rawGlassStorageDetailsService.getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
-                            .eq(RawGlassStorageDetails::getFilmsId, usageVO.getFilmsId())
-                            .eq(RawGlassStorageDetails::getPatternWidth, usageVO.getWidth())
-                            .eq(RawGlassStorageDetails::getPatternHeight, usageVO.getHeight())
-                            .eq(RawGlassStorageDetails::getPatternThickness, usageVO.getThickness())
-                            .gt(RawGlassStorageDetails::getRemainQuantity, upPattenUsage01VOS.size())
-                            .orderByAsc(RawGlassStorageDetails::getRemainQuantity)
-                            .last("limit 1"));
+//                    鐢熸垚1鍙蜂綅鍏ュ簱浠诲姟
+                    log.info("2鍙蜂笂鐗囦綅鐜荤拑灏哄涓嶄竴鑷达紝1鍙蜂笂鐗囦綅鐢熸垚璋冨害浠诲姟");
+                    //鎸夌収灏哄鍙婃暟閲忚幏鍙栨暟閲忔渶鎺ヨ繎鐨勬牸瀛愪俊鎭�
+                    RawGlassStorageDetails rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size());
+                    rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), loadStation.get(0), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                    //缁撴潫璋冨害浠诲姟 淇敼宸ヤ綅鐘舵��(璧峰浣嶏級鐘舵�佷负103 RAW_GLASS_STATE_RUNNING 浠诲姟瀹屾垚鍚庡皢鐘舵�佹敼涓�101  鐩爣浣嶆柊澧炰竴鏉℃暟鎹紝鏋跺瓙鍙蜂负锛堣捣濮嬩綅锛�
+                    rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                            .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                            .set(RawGlassStorageDetails::getDeviceId, Const.RAW_GLASS_STATE_RUNNING));
+                    return Boolean.TRUE;
                 }
-                //灏嗗伐浣嶇殑鏋跺瓙浼犻�佸埌涓婄墖浣�
-                rawGlassStorageDetailsService.generateTask(details.getSlot(), endSlot02, details.getShelf(), details.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
-                rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
-                        .eq(RawGlassStorageDetails::getSlot, details.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
-                        .set(RawGlassStorageDetails::getDeviceId, Const.RAW_GLASS_STATE_RUNNING));
-
-//                List<ReadWriteEntity> list = new ArrayList<>();
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.startSlot", glassStorageDetails.getShelf()));
-//                list.add(generateReadWriteEntity("A01-CC.dev.endSlot", endSlot02));
-//                miloService.writeToOpcWord(list);
-
-                return Boolean.TRUE;
             } else {
-                //灏嗘灦瀛愭斁鍥炲師宸ヤ綅涓�
-                rawGlassStorageDetailsService.generateTask(endSlot, glassStorageDetails.getShelf(), glassStorageDetails.getShelf(), glassStorageDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+//                鐢熸垚1鍙蜂綅鍏ュ簱浠诲姟
+                log.info("2鍙蜂笂鐗囦綅浠呭墿绌烘灦瀛愶紝1鍙蜂笂鐗囦綅鐢熸垚璋冨害浠诲姟");
+                RawGlassStorageDetails rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size());
+                rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), loadStation.get(0), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
                 rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
-                        .eq(RawGlassStorageDetails::getSlot, endSlot).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                        .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
                         .set(RawGlassStorageDetails::getDeviceId, Const.RAW_GLASS_STATE_RUNNING));
+                return Boolean.TRUE;
+            }
+        } else {
+            String tableName = stationCell == 5 ? LOAD_GLASS_DEVICE_ONE_TASK : LOAD_GLASS_DEVICE_TWO_TASK;
+            if (oneLoadStation.getRemainQuantity() > 0) {
+                if (compareRawSize(usageVOS.get(0), oneLoadStation)) {
+                    //缁撴潫浠撳偍璋冨害锛岀瓑寰呬笂鐗囦换鍔�
+                    //鍦ㄤ笂鐗囦换鍔℃墽琛岀┖闂茶繃绋嬩腑,鍙墽琛屼簩鍙蜂綅鍑哄叆搴撲换鍔�  浜屽彿鏋跺瓙鐨勪俊鎭槸鍚﹂渶瑕佽皟搴�,涓嶉渶瑕佽皟搴︾洿鎺ユ斁鍥瀎alse
+                    log.info("鑾峰彇浜屽彿浣嶅師鐗囦俊鎭�");
+                    RawGlassStorageDetails twoLoadStation = loadStationList.stream().filter(e -> e.getSlot().equals(loadStation.get(1))).findFirst().orElse(null);
+                    if (null == twoLoadStation) {
+                        //鎸夌収灏哄鐢熸垚浜屽彿浣嶄笂鐗囦换鍔′俊鎭�
+                        LoadGlassDeviceTask loadTask = loadGlassDeviceTaskService.queryTaskMessage(tableName);
+                        RawGlassStorageDetails rawDetails = null;
+                        if (oneLoadStation.getRemainQuantity() > (loadTask.getTotalCount() + loadTask.getDamageCount())) {
+                            usageVOS = upListMap.get("2");
+                            if (CollectionUtils.isEmpty(usageVOS)) {
+                                log.info("褰撳墠宸ョ▼鐨勫師鐗囧嵆灏嗙敤瀹岋紝缁撴潫鏈璋冨害");
+                                return Boolean.FALSE;
+                            }
+                            rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size());
+                        } else {
+                            rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size());
 
-//                List<ReadWriteEntity> list = new ArrayList<>();
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.startSlot", endSlot));
-//                list.add(generateReadWriteEntity("A01-CC.dev.endSlot", glassStorageDetails.getShelf()));
-//                miloService.writeToOpcWord(list);
+                        }
+                        if (null == rawDetails) {
+                            log.info("鍘熺墖浠撳偍娌℃湁鐩稿悓灏哄鐨勭幓鐠�");
+                            return Boolean.FALSE;
+                        }
+                        rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), loadStation.get(1), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                        //缁撴潫璋冨害浠诲姟 淇敼宸ヤ綅鐘舵��(璧峰浣嶏級鐘舵�佷负103 RAW_GLASS_STATE_RUNNING 浠诲姟瀹屾垚鍚庡皢鐘舵�佹敼涓�101  鐩爣浣嶆柊澧炰竴鏉℃暟鎹紝鏋跺瓙鍙蜂负锛堣捣濮嬩綅锛�
+                        rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                                .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                                .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
+                        return Boolean.TRUE;
+                    } else {
+                        //todo:褰撲簩鍙蜂负鐨勫昂瀵稿ぇ浜�0鏃讹紝鏄惁鎵ц璋冨害浠诲姟锛屾洿鎹㈠綋鍓嶅師鐗囩殑灏哄锛岀瓑寰呬笅涓�娆′换鍔$殑鐩存帴鎵ц锛涜繕鏄户缁瓑寰咃紝褰撳昂瀵镐笉涓�鏍凤紝绛夊緟涓�鍙峰伐浣嶇殑杩涘嚭搴撹皟搴︿换鍔°��
+                        if (twoLoadStation.getRemainQuantity() > 0) {
+                            LoadGlassDeviceTask loadTask = loadGlassDeviceTaskService.queryTaskMessage(tableName);
+                            if (oneLoadStation.getRemainQuantity() > (loadTask.getTotalCount() + loadTask.getDamageCount())) {
+                                usageVOS = upListMap.get("2");
+                                if (CollectionUtils.isEmpty(usageVOS)) {
+                                    log.info("褰撳墠宸ョ▼鐨勫師鐗囧嵆灏嗙敤瀹岋紝缁撴潫鏈璋冨害");
+                                    return Boolean.FALSE;
+                                }
+                            }
+                            if (compareRawSize(usageVOS.get(0), twoLoadStation)) {
+//                              //2鍙蜂笂鐗囦綅鐨勫師鐗囦俊鎭簮宸ョ▼淇℃伅涓�鑷达紝鍙笂鐗囨搷浣滐紝缁撴潫鏈浠诲姟
+                                return Boolean.FALSE;
+                            } else {
+//                    鐢熸垚1鍙蜂綅鍏ュ簱浠诲姟
+                                log.info("2鍙蜂笂鐗囦綅鐜荤拑灏哄涓嶄竴鑷达紝2鍙蜂笂鐗囦綅鐢熸垚鍑虹墖璋冨害浠诲姟");
+                                //鎸夌収灏哄鍙婃暟閲忚幏鍙栨暟閲忔渶鎺ヨ繎鐨勬牸瀛愪俊鎭�
+                                rawGlassStorageDetailsService.generateTask(loadStation.get(1), twoLoadStation.getShelf(), twoLoadStation.getShelf(), twoLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                                //缁撴潫璋冨害浠诲姟 淇敼宸ヤ綅鐘舵��(璧峰浣嶏級鐘舵�佷负103 RAW_GLASS_STATE_RUNNING 浠诲姟瀹屾垚鍚庡皢鐘舵�佹敼涓�101  鐩爣浣嶆柊澧炰竴鏉℃暟鎹紝鏋跺瓙鍙蜂负锛堣捣濮嬩綅锛�
+                                rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                                        .eq(RawGlassStorageDetails::getSlot, loadStation.get(1)).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                                        .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
+                                return Boolean.TRUE;
+                            }
+                        } else {
+                            //todo:鐢熸垚鍑哄簱浠诲姟
+                            rawGlassStorageDetailsService.generateTask(loadStation.get(1), twoLoadStation.getShelf(), twoLoadStation.getShelf(), twoLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                            //缁撴潫璋冨害浠诲姟 淇敼宸ヤ綅鐘舵��(璧峰浣嶏級鐘舵�佷负103 RAW_GLASS_STATE_RUNNING 浠诲姟瀹屾垚鍚庡皢鐘舵�佹敼涓�101  鐩爣浣嶆柊澧炰竴鏉℃暟鎹紝鏋跺瓙鍙蜂负锛堣捣濮嬩綅锛�
+                            rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                                    .eq(RawGlassStorageDetails::getSlot, loadStation.get(1)).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                                    .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
+                            return Boolean.TRUE;
+                        }
+                    }
+//                    return Boolean.FALSE;
+                } else {
+                    log.info("2鍙蜂笂鐗囦綅浠呭墿绌烘灦瀛愶紝1鍙蜂笂鐗囦綅鐢熸垚鍑哄簱璋冨害浠诲姟");
+                    rawGlassStorageDetailsService.generateTask(loadStation.get(0), oneLoadStation.getShelf(), oneLoadStation.getShelf(), oneLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                    rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                            .eq(RawGlassStorageDetails::getSlot, loadStation.get(0)).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                            .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
+                    return Boolean.TRUE;
+                }
+            } else {
+                log.info("1鍙蜂笂鐗囦綅鐜荤拑灏哄涓嶄竴鑷达紝1鍙蜂笂鐗囦綅鐢熸垚鍑哄簱璋冨害浠诲姟");
+                rawGlassStorageDetailsService.generateTask(loadStation.get(0), oneLoadStation.getSlot(), oneLoadStation.getShelf(), oneLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                        .eq(RawGlassStorageDetails::getSlot, loadStation.get(0)).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                        .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
                 return Boolean.TRUE;
             }
         }
     }
 
     private RawGlassStorageDetails generateDetails(RawGlassStorageDetails details, Integer targetSlot) {
-
         RawGlassStorageDetails targetDetails = new RawGlassStorageDetails();
-//        details.setDeviceId();
+        RawGlassStorageStation station = rawGlassStorageStationService.getOne(new LambdaQueryWrapper<RawGlassStorageStation>()
+                .eq(RawGlassStorageStation::getSlot, targetSlot));
+        targetDetails.setDeviceId(station.getDeviceId());
         targetDetails.setSlot(targetSlot);
         targetDetails.setShelf(details.getShelf());
         targetDetails.setPatternWidth(details.getPatternWidth());
@@ -478,5 +520,30 @@
         return readWriteEntity;
     }
 
+    private RawGlassStorageDetails getRawGlassStorageDetailsBySize(UpPattenUsageVO usageVO, int remainQuantity) {
+        return rawGlassStorageDetailsService.getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
+                .eq(RawGlassStorageDetails::getFilmsId, usageVO.getFilmsId())
+                .eq(RawGlassStorageDetails::getPatternWidth, usageVO.getWidth())
+                .eq(RawGlassStorageDetails::getPatternHeight, usageVO.getHeight())
+                .eq(RawGlassStorageDetails::getPatternThickness, usageVO.getThickness())
+                .eq(RawGlassStorageDetails::getState, Const.GLASS_STATE_IN)
+                .orderByAsc(RawGlassStorageDetails::getRemainQuantity)
+                .last("order by abs(t.remain_quantity - " + remainQuantity + ")  asc")
+                .last("limit 1"));
+    }
+
+    /**
+     * 灏哄涓�鏍峰苟涓斿師鐗囨暟閲忓ぇ浜�0
+     *
+     * @param upPattenUsage
+     * @param details
+     * @return
+     */
+    private boolean compareRawSize(UpPattenUsage upPattenUsage, RawGlassStorageDetails details) {
+        boolean flag = upPattenUsage.getWidth() == details.getPatternWidth() && upPattenUsage.getHeight() == details.getPatternHeight() &&
+                upPattenUsage.getThickness() == details.getPatternThickness() && upPattenUsage.getFilmsId().equals(details.getFilmsId());
+        return flag;
+    }
+
 }
 
diff --git a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-dev.yml b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-dev.yml
index 3097382..3aa2164 100644
--- a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-dev.yml
+++ b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-dev.yml
@@ -5,7 +5,7 @@
       strict: false #璁剧疆涓ユ牸妯″紡,榛樿false涓嶅惎鍔�. 鍚姩鍚庡湪鏈尮閰嶅埌鎸囧畾鏁版嵁婧愭椂鍊欏洖鎶涘嚭寮傚父,涓嶅惎鍔ㄤ細浣跨敤榛樿鏁版嵁婧�.
       datasource:
         hangzhoumes:
-          url: jdbc:mysql://127.0.0.1:3306/hangzhoumes?serverTimezone=GMT%2b8
+          url: jdbc:mysql://127.0.0.1:3306/hangzhoumes?serverTimezone=GMT%2b8&allowMultiQueries=true
           username: root
           password: beibo.123/
           driver-class-name: com.mysql.cj.jdbc.Driver
@@ -14,6 +14,9 @@
           username: sa
           password: beibo.123/
           driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+      druid:
+        wall:
+          multi-statement-allow: true
   cloud:
     nacos:
       discovery:
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java
index 8229684..6782761 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java
@@ -95,6 +95,10 @@
         }
         //浠诲姟鏆傚仠
         LoadGlassDeviceTask task = loadGlassDeviceTaskService.queryTaskMessage(tableName);
+        if (0 == task.getInkageState()) {
+            log.info("{}涓婄墖绾匡紝澶勪簬绂荤嚎鐘舵�侊細{}锛岀粨鏉熸湰鍦颁笂鐗囪姹�", deviceId, task.getInkageState());
+            return;
+        }
         if (task.getTaskRunning().equals(Const.ENGINEERING_RUNNING)) {
             log.info("{}涓婄墖绾匡紝鏈夋鍦ㄦ墽琛岀殑浠诲姟锛岀粨鏉熸湰鍦颁笂鐗囪姹�", deviceId);
             return;
@@ -177,11 +181,12 @@
                 .setSql("remain_quantity = remain_quantity - " + (finishCount + damageCount)));
         //鏇存柊宸ョ▼涓嬬殑鍘熺墖鏁伴噺 todo:sql寰呬紭鍖�
 
-        List<Integer> ids = upPattenUsageMapper.queryFinishByEngineering(deviceId, finishCount);
-        upPattenUsageMapper.update(null, new LambdaUpdateWrapper<UpPattenUsage>()
-                .in(UpPattenUsage::getId, ids)
-                .set(UpPattenUsage::getState, Const.LOAD_RAW_GLASS_SUCCESS));
-
+        if (finishCount > 0) {
+            List<Integer> ids = upPattenUsageMapper.queryFinishByEngineering(deviceId, finishCount);
+            upPattenUsageMapper.update(null, new LambdaUpdateWrapper<UpPattenUsage>()
+                    .in(UpPattenUsage::getId, ids)
+                    .set(UpPattenUsage::getState, Const.LOAD_RAW_GLASS_SUCCESS));
+        }
         //todo:浠诲姟琛ㄦ暟鎹儏鍐�
         task.setTaskRunning(0);
         task.setTotalCount(0);
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java
index 59e226d..5f31161 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java
@@ -139,10 +139,15 @@
     @Override
     public Boolean updateGlassState(UpPattenUsage upPattenUsage) {
         UpdateWrapper<UpPattenUsage> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.eq("id",upPattenUsage.getId())
-                .set("state",upPattenUsage.getState());
+        updateWrapper.eq("id", upPattenUsage.getId())
+                .set("state", upPattenUsage.getState());
         return this.update(updateWrapper);
     }
 
+    @Override
+    public Object Engineering(Engineering request) {
+        return null;
+    }
+
 
 }
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml
index 214b3b3..571c726 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml
@@ -5,7 +5,7 @@
       strict: false #璁剧疆涓ユ牸妯″紡,榛樿false涓嶅惎鍔�. 鍚姩鍚庡湪鏈尮閰嶅埌鎸囧畾鏁版嵁婧愭椂鍊欏洖鎶涘嚭寮傚父,涓嶅惎鍔ㄤ細浣跨敤榛樿鏁版嵁婧�.
       datasource:
         hangzhoumes:
-          url: jdbc:mysql://10.153.19.150:3306/hangzhoumes?serverTimezone=GMT%2b8
+          url: jdbc:mysql://127.0.0.1:3306/hangzhoumes?serverTimezone=GMT%2b8&allowMultiQueries=true
           username: root
           password: beibo.123/
           driver-class-name: com.mysql.cj.jdbc.Driver
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application.yml b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application.yml
index abbddf5..1c8c8b3 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application.yml
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application.yml
@@ -2,7 +2,7 @@
   port: 8083
 spring:
   profiles:
-    active: dev
+    active: yw
   application:
     name: loadGlass
   liquibase:
@@ -13,4 +13,11 @@
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 kangaroohy:
   milo:
-    enabled: false
\ No newline at end of file
+    enabled: false
+    primary: default
+    config:
+      default:
+        endpoint: opc.tcp://192.168.0.39:49320
+        security-policy: basic256sha256
+        username: admin
+        password: 1qaz2wsx3edc4rfv
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/mapper/LoadGlassDeviceTaskMapper.xml b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/mapper/LoadGlassDeviceTaskMapper.xml
index 4f11622..2cdaece 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/mapper/LoadGlassDeviceTaskMapper.xml
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/mapper/LoadGlassDeviceTaskMapper.xml
@@ -8,6 +8,7 @@
         <result column="raw_glass_height" property="rawGlassHeight"/>
         <result column="slot" property="slot"/>
         <result column="task_state" property="taskState"/>
+        <result column="inkage_state" property="inkageState"/>
         <result column="create_time" property="createTime"/>
         <result column="update_time" property="updateTime"/>
         <result column="total_count" property="totalCount"/>
diff --git a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/ywChangelog.sql b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/ywChangelog.sql
index 5892857..9832dd6 100644
--- a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/ywChangelog.sql
+++ b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/ywChangelog.sql
@@ -9,17 +9,14 @@
     glass_id_in  varchar(20)        DEFAULT NULL COMMENT '杩涚墖鐜荤拑id',
     glass_id_out varchar(20)        DEFAULT NULL COMMENT '鍑虹墖鐜荤拑id',
     glass_id     varchar(20)        DEFAULT NULL COMMENT '纾ㄨ竟鍓嶇幓鐠僫d',
+    in_place     int                DEFAULT 0 COMMENT '灏变綅淇″彿',
     current_cell int                DEFAULT '0' COMMENT '褰撳墠灞傚彿',
     start_cell   int                DEFAULT '0' COMMENT '灞傚彿',
     end_cell     int                DEFAULT NULL COMMENT '棰勭暀灞傚彿',
     task_state   int                DEFAULT NULL COMMENT '浠诲姟鐘舵�� 0榛樿绌轰换鍔� 1鎵ц涓� 2缁撴潫浠诲姟',
     task_type    int                DEFAULT NULL COMMENT '浠诲姟绫诲瀷',
     create_time  timestamp NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
-    update_time  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
-    width        int                DEFAULT NULL COMMENT '瀹�',
-    height       int                DEFAULT NULL COMMENT '楂�',
-    thickness    int                DEFAULT NULL COMMENT '鍘�',
-    film_remove  int                DEFAULT NULL COMMENT '鏄惁闄よ啘'
+    update_time  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿'
 );
 -- rollback DROP TABLE edg_storage_device_one_task;
 
@@ -27,9 +24,10 @@
 -- changeset zsh:20241107002
 -- preconditions onFail:CONTINUE onError:CONTINUE
 -- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM edg_storage_device_one_task;
-INSERT INTO edg_storage_device_one_task (task_running, glass_id, glass_id_in, glass_id_out, current_cell, start_cell,
-                                         end_cell, task_state, task_type, width, height, thickness, film_remove)
-VALUES (0, NULL, NULL, NULL, 1, 0, NULL, 0, NULL, 0, 0, 0, 0);
+INSERT INTO edg_storage_device_one_task (task_running, glass_id, in_place, glass_id_in, glass_id_out, current_cell,
+                                         start_cell,
+                                         end_cell, task_state, task_type)
+VALUES (0, NULL, 0, NULL, NULL, 1, 0, NULL, 0, NULL, 0, 0, 0, 0);
 
 
 -- changeset zsh:20241107003
@@ -41,26 +39,24 @@
     glass_id_in  varchar(20)        DEFAULT NULL COMMENT '杩涚墖鐜荤拑id',
     glass_id_out varchar(20)        DEFAULT NULL COMMENT '鍑虹墖鐜荤拑id',
     glass_id     varchar(20)        DEFAULT NULL COMMENT '纾ㄨ竟鍓嶇幓鐠僫d',
+    in_place     int                DEFAULT 0 COMMENT '灏变綅淇″彿',
     current_cell int                DEFAULT '0' COMMENT '褰撳墠灞傚彿',
     start_cell   int                DEFAULT '0' COMMENT '灞傚彿',
     end_cell     int                DEFAULT NULL COMMENT '棰勭暀灞傚彿',
     task_state   int                DEFAULT NULL COMMENT '浠诲姟鐘舵�� 0榛樿绌轰换鍔� 1鎵ц涓� 2缁撴潫浠诲姟',
     task_type    int                DEFAULT NULL COMMENT '浠诲姟绫诲瀷',
     create_time  timestamp NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
-    update_time  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
-    width        int                DEFAULT NULL COMMENT '瀹�',
-    height       int                DEFAULT NULL COMMENT '楂�',
-    thickness    int                DEFAULT NULL COMMENT '鍘�',
-    film_remove  int                DEFAULT NULL COMMENT '鏄惁闄よ啘'
+    update_time  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿'
 );
 -- rollback DROP TABLE edg_storage_device_two_task;
 
 -- changeset zsh:20241107004
 -- preconditions onFail:CONTINUE onError:CONTINUE
 -- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM edg_storage_device_two_task;
-INSERT INTO edg_storage_device_two_task (task_running, glass_id, glass_id_in, glass_id_out, current_cell, start_cell,
-                                         end_cell, task_state, task_type, width, height, thickness, film_remove)
-VALUES (0, NULL, NULL, NULL, 1, 0, NULL, 0, NULL, 0, 0, 0, 0);
+INSERT INTO edg_storage_device_two_task (task_running, glass_id, in_place, glass_id_in, glass_id_out, current_cell,
+                                         start_cell,
+                                         end_cell, task_state, task_type)
+VALUES (0, NULL, 0, NULL, NULL, 1, 0, NULL, 0, NULL, 0, 0, 0, 0);
 
 
 
@@ -72,6 +68,8 @@
     id           bigint    NOT NULL AUTO_INCREMENT COMMENT '宸ョ▼琛╥d',
     glass_id_in  varchar(20)        DEFAULT NULL COMMENT '杩涚墖鐜荤拑id',
     glass_id_out varchar(20)        DEFAULT NULL COMMENT '鍑虹墖鐜荤拑id',
+    glass_id     varchar(20)        DEFAULT NULL COMMENT '纾ㄨ竟鍓嶇幓鐠僫d',
+    in_place     int                DEFAULT 0 COMMENT '灏变綅淇″彿',
     current_cell int                DEFAULT '0' COMMENT '褰撳墠灞傚彿',
     start_cell   int                DEFAULT '0' COMMENT '灞傚彿',
     end_cell     int                DEFAULT NULL COMMENT '棰勭暀灞傚彿',
@@ -108,6 +106,7 @@
     raw_glass_width  int                DEFAULT '0' COMMENT '鍘熺墖瀹�',
     raw_glass_height int                DEFAULT '0' COMMENT '鍘熺墖楂�',
     slot             int                DEFAULT '0' COMMENT '涓婄墖浣嶇紪鍙�',
+    inkage_state     int                DEFAULT '0' COMMENT '鑱旀満鐘舵��',
     task_state       int                DEFAULT NULL COMMENT '浠诲姟鐘舵�� 0榛樿绌轰换鍔� 1鎵ц涓� 2缁撴潫浠诲姟',
     create_time      timestamp NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
     update_time      timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
@@ -120,9 +119,9 @@
 -- changeset zsh:20241107008
 -- preconditions onFail:CONTINUE onError:CONTINUE
 -- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM load_glass_device_one_task;
-INSERT INTO load_glass_device_one_task (task_running, raw_glass_width, raw_glass_height, slot, task_state, total_count,
-                                        finish_count, damage_count)
-VALUES (0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO load_glass_device_one_task (task_running, raw_glass_width, raw_glass_height, slot, inkage_state, task_state,
+                                        total_count, finish_count, damage_count)
+VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0);
 
 -- changeset zsh:20241107009
 -- preconditions onFail:CONTINUE onError:CONTINUE
@@ -133,6 +132,7 @@
     raw_glass_width  int                DEFAULT '0' COMMENT '鍘熺墖瀹�',
     raw_glass_height int                DEFAULT '0' COMMENT '鍘熺墖楂�',
     slot             int                DEFAULT '0' COMMENT '涓婄墖浣嶇紪鍙�',
+    inkage_state     int                DEFAULT '0' COMMENT '鑱旀満鐘舵��',
     task_state       int                DEFAULT NULL COMMENT '浠诲姟鐘舵�� 0榛樿绌轰换鍔� 1鎵ц涓� 2缁撴潫浠诲姟',
     create_time      timestamp NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
     update_time      timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
@@ -145,9 +145,9 @@
 -- changeset zsh:20241107010
 -- preconditions onFail:CONTINUE onError:CONTINUE
 -- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM load_glass_device_two_task;
-INSERT INTO load_glass_device_two_task (task_running, raw_glass_width, raw_glass_height, slot, task_state, total_count,
-                                        finish_count, damage_count)
-VALUES (0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO load_glass_device_two_task (task_running, raw_glass_width, raw_glass_height, slot, inkage_state, task_state,
+                                        total_count, finish_count, damage_count)
+VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0);
 
 
 -- changeset zsh:20241107011
@@ -161,6 +161,7 @@
     raw_glass_height int                DEFAULT '0' COMMENT '鍘熺墖楂�',
     station          int                DEFAULT '0' COMMENT '涓婄墖璁惧缂栧彿',
     slot             int                DEFAULT '0' COMMENT '涓婄墖浣嶇紪鍙�',
+    inkage_state     int                DEFAULT '0' COMMENT '鑱旀満鐘舵��',
     task_state       int                DEFAULT NULL COMMENT '浠诲姟鐘舵�� 0榛樿绌轰换鍔� 1鎵ц涓� 2缁撴潫浠诲姟',
     create_time      timestamp NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
     update_time      timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
@@ -169,4 +170,136 @@
     damage_count     int                DEFAULT '0' COMMENT '鐮存崯鏁伴噺',
     PRIMARY KEY (id) USING BTREE
 );
--- rollback DROP TABLE load_glass_device_task_history;
\ No newline at end of file
+-- rollback DROP TABLE load_glass_device_task_history;
+
+-- changeset zsh:20241112001
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'big_storage_cage_history_task' and table_schema = 'hangzhoumes';
+CREATE TABLE big_storage_cage_history_task
+(
+    id          int       NOT NULL AUTO_INCREMENT,
+    glass_id    varchar(32)        DEFAULT NULL COMMENT '鐜荤拑id',
+    start_slot  int                DEFAULT '0' COMMENT '璧峰鏍煎瓙',
+    target_slot int                DEFAULT '0' COMMENT '鐩爣鏍煎瓙',
+    task_state  int                DEFAULT NULL COMMENT '浠诲姟鐘舵�� ',
+    glass_count int                DEFAULT NULL COMMENT '鐜荤拑鏁伴噺',
+    task_type   int                DEFAULT NULL COMMENT '浠诲姟绫诲瀷',
+    create_time timestamp NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+    update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+    PRIMARY KEY (id)
+);
+-- rollback DROP TABLE big_storage_cage_history_task;
+
+-- changeset zsh:20241112002
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'big_storage_cage_in_one_task' and table_schema = 'hangzhoumes';
+CREATE TABLE big_storage_cage_in_one_task
+(
+    glass_id    varchar(32) DEFAULT NULL COMMENT '鐜荤拑id',
+    start_slot  int         DEFAULT '0' COMMENT '璧峰鏍煎瓙',
+    target_slot int         DEFAULT '0' COMMENT '鐩爣鏍煎瓙',
+    task_state  int         DEFAULT NULL COMMENT '浠诲姟鐘舵�� '
+)
+-- rollback DROP TABLE big_storage_cage_in_one_task;
+
+-- changeset zsh:20241112003
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM big_storage_cage_in_one_task;
+INSERT INTO big_storage_cage_in_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+
+
+-- changeset zsh:20241112004
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'big_storage_cage_in_two_task' and table_schema = 'hangzhoumes';
+CREATE TABLE big_storage_cage_in_two_task
+(
+    glass_id    VARCHAR(32) COMMENT '鐜荤拑id',
+    start_slot  INT DEFAULT '0' COMMENT '璧峰鏍煎瓙',
+    target_slot INT DEFAULT '0' COMMENT '鐩爣鏍煎瓙',
+    task_state  INT DEFAULT NULL COMMENT '浠诲姟鐘舵�� '
+);
+-- rollback DROP TABLE big_storage_cage_in_two_task;
+
+-- changeset zsh:20241112005
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM big_storage_cage_in_two_task;
+INSERT INTO big_storage_cage_in_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+
+-- changeset zsh:20241113001
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'big_storage_cage_out_one_task' and table_schema = 'hangzhoumes';
+CREATE TABLE big_storage_cage_out_one_task
+(
+    glass_id    varchar(32) DEFAULT NULL COMMENT '鐜荤拑id',
+    start_slot  int         DEFAULT '0' COMMENT '璧峰鏍煎瓙',
+    target_slot int         DEFAULT '0' COMMENT '鐩爣鏍煎瓙',
+    task_state  int         DEFAULT NULL COMMENT '浠诲姟鐘舵�� '
+)
+-- rollback DROP TABLE big_storage_cage_out_one_task;
+
+-- changeset zsh:20241113002
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM big_storage_cage_out_one_task;
+INSERT INTO big_storage_cage_out_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+
+
+-- changeset zsh:20241113003
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'big_storage_cage_out_two_task' and table_schema = 'hangzhoumes';
+CREATE TABLE big_storage_cage_out_two_task
+(
+    glass_id    VARCHAR(32) COMMENT '鐜荤拑id',
+    start_slot  INT DEFAULT '0' COMMENT '璧峰鏍煎瓙',
+    target_slot INT DEFAULT '0' COMMENT '鐩爣鏍煎瓙',
+    task_state  INT DEFAULT NULL COMMENT '浠诲姟鐘舵�� '
+);
+-- rollback DROP TABLE big_storage_cage_out_two_task;
+-- changeset zsh:20241113004
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM big_storage_cage_out_two_task;
+INSERT INTO big_storage_cage_out_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+

--
Gitblit v1.8.0