From 52b21b24130c75197c039ae0fd761e2ef5b43cb3 Mon Sep 17 00:00:00 2001
From: pang.jiabao <pang_jiabao@163.com>
Date: 星期三, 03 十二月 2025 17:35:34 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/entity/mes/TransInOutStationAllow.java    |   13 
 src/main/java/com/zy/asrs/entity/BlockStation.java                  |   81 
 src/main/java/com/zy/asrs/entity/mes/TransTask.java                 |   71 
 src/main/java/com/zy/common/config/ControllerResAdvice.java         |   16 
 src/main/java/com/zy/common/config/WebConfig.java                   |   17 
 src/main/resources/libs/framework-3.2.0.jar                         |    0 
 src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java          |  624 ++++++
 src/main/resources/application-dev.yml                              |   41 
 src/main/resources/mapper/BlockTaskMapper.xml                       |   24 
 src/main/java/com/zy/asrs/service/RcsService.java                   |   66 
 src/main/java/com/zy/common/service/CommonService.java              |   31 
 src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java         |   15 
 src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java      |    5 
 src/main/java/com/zy/asrs/mapper/MatItemBarcodeMapper.java          |   11 
 src/main/java/com/zy/asrs/entity/rcs/RcsReturn.java                 |   20 
 src/main/java/com/zy/asrs/task/OrderSyncScheduler.java              |  162 +
 src/main/java/com/zy/asrs/entity/mes/TransArrivalStation.java       |   58 
 src/main/java/com/zy/common/model/LocTypeDto.java                   |    8 
 src/main/java/com/zy/asrs/entity/mes/MesInApply.java                |   95 
 src/main/java/com/zy/asrs/entity/rcs/RcsReporterTask.java           |   18 
 src/main/java/com/zy/asrs/mapper/BlockStationMapper.java            |   14 
 src/main/java/com/zy/asrs/entity/mes/MesReturn.java                 |   20 
 src/main/java/com/zy/asrs/entity/LocDetl.java                       |    6 
 src/main/java/com/zy/asrs/entity/digitaltwin/DtOrderVo.java         |   15 
 src/main/java/com/zy/asrs/entity/mes/TransParent.java               |   31 
 src/main/java/com/zy/asrs/entity/rcs/RcsTaskTargetRoute.java        |   22 
 src/main/java/com/zy/asrs/entity/mes/TransTaskFeedback.java         |   17 
 src/main/webapp/static/js/mat/mat.js                                |   95 
 src/main/java/com/zy/asrs/entity/BlockTask.java                     |   74 
 src/main/java/com/zy/asrs/entity/mes/MesOutApply.java               |   48 
 pom.xml                                                             |   43 
 src/main/java/com/zy/asrs/entity/mes/MesCallOutApply.java           |   61 
 src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java          |    3 
 src/main/java/com/zy/asrs/entity/mes/MesMatInfo.java                |  117 +
 src/main/java/com/zy/asrs/entity/digitaltwin/DtEquipmentVo.java     |    2 
 src/main/java/com/zy/asrs/service/DigitalTwinService.java           |   70 
 src/main/java/com/zy/asrs/task/BlockScheduler.java                  |   26 
 src/main/java/com/zy/asrs/entity/rcs/RcsReporterEqpt.java           |   20 
 src/main/java/com/zy/asrs/mapper/DigitalTwinMapper.java             |   26 
 src/main/java/com/zy/asrs/service/MobileService.java                |    8 
 src/main/java/com/zy/asrs/entity/MatItemBarcode.java                |   75 
 src/main/java/com/zy/asrs/entity/mes/MesRecvFeedback.java           |   42 
 src/main/webapp/static/js/locDetl/locDetl.js                        |    4 
 src/main/java/com/zy/asrs/entity/WaitPakin.java                     |   11 
 src/main/java/com/zy/asrs/enums/RcsRetMethodEnum.java               |   38 
 src/main/java/com/zy/asrs/entity/rcs/RcsTaskContinue.java           |   20 
 src/main/webapp/views/basWhs/basWhs.html                            |    5 
 src/main/webapp/views/pda/login.html                                |    3 
 src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java        |   14 
 src/main/java/com/zy/asrs/entity/Task.java                          |    9 
 src/main/java/com/zy/asrs/entity/digitaltwin/DtLocVo.java           |    2 
 src/main/java/com/zy/asrs/entity/mes/MesMatRecvForm.java            |   29 
 src/main/resources/mapper/LocDetlMapper.xml                         |    1 
 src/main/java/com/zy/asrs/entity/LocCount.java                      |   41 
 src/main/java/com/zy/asrs/service/MesService.java                   |  150 +
 src/main/java/com/zy/asrs/controller/WaitPakinController.java       |   12 
 src/main/java/com/zy/asrs/entity/digitaltwin/DtDetainMatVo.java     |   28 
 src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java          | 1325 +++++++++++++
 src/main/java/com/zy/asrs/service/impl/TaskServiceImpl.java         |   42 
 src/main/java/com/zy/asrs/service/impl/TaskLogServiceImpl.java      |    6 
 src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java         |   15 
 src/main/webapp/static/js/task/task.js                              |   25 
 src/main/java/com/zy/asrs/entity/WrkDetl.java                       |    3 
 src/main/java/com/zy/asrs/controller/MesController.java             |  123 +
 src/main/webapp/static/js/common.js                                 |   23 
 src/main/resources/mapper/ViewDigitalTwinMapper.xml                 |   79 
 src/main/java/com/zy/asrs/entity/TaskDetlLog.java                   |    6 
 src/main/resources/logback-spring.xml                               |    3 
 src/main/java/com/zy/asrs/mapper/AgvInfoMapper.java                 |   11 
 src/main/java/com/zy/asrs/task/WorkMastScheduler.java               |    5 
 src/main/java/com/zy/asrs/mapper/BlockTaskMapper.java               |   16 
 src/main/webapp/views/pda/matQuery.html                             |   13 
 src/main/webapp/static/js/waitPakin/waitPakin.js                    |    4 
 src/main/java/com/zy/common/route/RouteFilter.java                  |  159 +
 src/main/java/com/zy/asrs/entity/digitaltwin/DtLocDetailVo.java     |   30 
 src/main/java/com/zy/asrs/entity/mes/MesOutFeedback.java            |   47 
 src/main/java/com/zy/asrs/utils/VersionUtils.java                   |    2 
 src/main/java/com/zy/asrs/entity/AgvInfo.java                       |   53 
 src/main/java/com/zy/asrs/service/impl/TaskDetlLogServiceImpl.java  |   24 
 src/main/webapp/views/mat/mat.html                                  |   12 
 src/main/webapp/views/pda/comb.html                                 |    6 
 src/main/java/com/zy/asrs/controller/DigitalTwinController.java     |  306 +++
 src/main/java/com/zy/common/web/WcsController.java                  |    9 
 src/main/java/com/zy/common/config/LogAspect.java                   |  112 +
 src/main/java/com/zy/asrs/mapper/LocCountMapper.java                |   24 
 src/main/java/com/zy/asrs/entity/mes/MesParent.java                 |   39 
 src/main/resources/mapper/BlockStationMapper.xml                    |   24 
 src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java       |  103 
 src/main/webapp/static/js/orderPakin/order.js                       |   13 
 src/main/webapp/views/task/task.html                                |    2 
 src/main/java/com/zy/asrs/task/OrderMoveHistoryScheduler.java       |    6 
 src/main/java/com/zy/asrs/entity/WrkMast.java                       |    7 
 src/main/java/com/zy/asrs/controller/MobileController.java          |   10 
 src/main/resources/mapper/OrderDetlPakinMapper.xml                  |  128 
 src/main/java/com/zy/asrs/entity/rcs/RcsTaskCancel.java             |   17 
 src/main/java/com/zy/asrs/entity/rcs/RcsTaskSubmit.java             |   29 
 src/main/java/com/zy/asrs/entity/digitaltwin/DtInAndOutBoundVo.java |   17 
 src/main/java/com/zy/asrs/controller/RcsController.java             |   44 
 src/main/java/com/zy/asrs/entity/rcs/RcsEqptNotify.java             |   16 
 src/main/resources/mapper/LocCountMapper.xml                        |   42 
 src/main/java/com/zy/asrs/entity/digitaltwin/DtOverviewVo.java      |   24 
 src/main/java/com/zy/asrs/service/impl/DigitalTwinServiceImpl.java  |  272 ++
 102 files changed, 5,575 insertions(+), 279 deletions(-)

diff --git a/pom.xml b/pom.xml
index 4e61b50..cecba08 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,13 +9,13 @@
         <relativePath/>
     </parent>
     <groupId>com.zy</groupId>
-    <artifactId>asrs</artifactId>t
+    <artifactId>asrs</artifactId>
     <version>1.1.1</version>
     <packaging>war</packaging>
 
     <properties>
         <java.version>1.8</java.version>
-        <cool.version>3.4.0</cool.version>
+        <cool.version>3.2.0</cool.version>
         <mysql-driver.version>5.1.47</mysql-driver.version>
         <mybatis-plus.version>2.3.2</mybatis-plus.version>
         <fastjson.version>1.2.58</fastjson.version>
@@ -44,6 +44,8 @@
             <groupId>cn.cool</groupId>
             <artifactId>framework</artifactId>
             <version>${cool.version}</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/src/main/resources/libs/framework-3.2.0.jar</systemPath>
         </dependency>
         <dependency>
             <groupId>org.apache.tika</groupId>
@@ -103,8 +105,10 @@
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
-            <version>1.16.22</version>
-            <scope>provided</scope>
+            <version>1.18.30</version>
+            <optional>true</optional>
+<!--            <version>1.16.22</version>-->
+<!--            <scope>provided</scope>-->
         </dependency>
         <!-- okHttp3 -->
         <dependency>
@@ -120,13 +124,42 @@
     </dependencies>
 
     <build>
-        <finalName>wms</finalName>
+        <finalName>jgwms</finalName>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
+<!--            <plugin>-->
+<!--                <groupId>org.apache.maven.plugins</groupId>-->
+<!--                <artifactId>maven-compiler-plugin</artifactId>-->
+<!--                <version>3.10.1</version>-->
+<!--                <configuration>-->
+<!--                    <source>1.8</source>-->
+<!--                    <target>1.8</target>-->
+<!--                    <encoding>UTF-8</encoding>-->
+<!--                    <compilerArgs>-->
+<!--                        <arg>-parameters</arg>-->
+<!--                    </compilerArgs>-->
+<!--                    <compilerArguments>-->
+<!--                        <extdirs>${project.basedir}/src/main/resources/libs</extdirs>-->
+<!--                    </compilerArguments>-->
+<!--                </configuration>-->
+<!--            </plugin>-->
         </plugins>
+
+<!--        <resources>-->
+<!--            <resource>-->
+<!--                <directory>src/main/resources</directory>-->
+<!--                <includes>-->
+<!--&lt;!&ndash;                    <include>**/log/**</include>&ndash;&gt;-->
+<!--                    <include>**/libs/**</include>-->
+<!--&lt;!&ndash;                    <include>**/*.properties</include>&ndash;&gt;-->
+<!--&lt;!&ndash;                    <include>**/*.xml</include>&ndash;&gt;-->
+<!--                </includes>-->
+<!--                <filtering>false</filtering>-->
+<!--            </resource>-->
+<!--        </resources>-->
     </build>
 
 </project>
diff --git a/src/main/java/com/zy/asrs/controller/DigitalTwinController.java b/src/main/java/com/zy/asrs/controller/DigitalTwinController.java
new file mode 100644
index 0000000..db5a98b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/DigitalTwinController.java
@@ -0,0 +1,306 @@
+package com.zy.asrs.controller;
+
+import com.core.common.R;
+import com.zy.asrs.entity.LocDetl;
+import com.zy.asrs.entity.LocMast;
+import com.zy.asrs.entity.digitaltwin.*;
+import com.zy.asrs.service.DigitalTwinService;
+import com.zy.common.web.BaseController;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+@RequestMapping("/digitalTwin")
+@RestController
+public class DigitalTwinController extends BaseController {
+
+    @Resource
+    private DigitalTwinService digitalTwinService;
+
+    /**
+     * 鏁版嵁鎬昏
+     *
+     * @param areaId    搴撳尯缂栫爜
+     * @return
+     */
+    @RequestMapping(value = "/overview")
+//    @ManagerAuth
+    public R overview(@RequestParam(required = false) String areaId){
+
+        //digitalTwinService.overview(areaId);
+
+        DtOverviewVo dtOverviewVo = DtOverviewVo.builder()
+                .totalLoc(999)
+                .useLoc(900)
+                .idleLoc(99)
+                .todayOutbound(160)
+                .todayWarehousing(170)
+                .remainingStock(180)
+                .build();
+
+        return R.ok().add(dtOverviewVo);
+    }
+
+    /**
+     * 杩戞湡璁㈠崟锛堥粯璁�7澶╋級
+     *
+     * @param startDate 鏍煎紡锛歽yyyMMdd锛�20251022
+     * @param endDate   鏍煎紡锛歽yyyMMdd锛�20251027
+     * @return
+     */
+    @RequestMapping(value = "/recentOrder")
+//    @ManagerAuth
+    public R recentOrder(@RequestParam(required = false) String startDate,
+                         @RequestParam(required = false) String endDate){
+
+//        digitalTwinService.order(startDate, endDate);
+
+        DtOrderVo dtOrderVo = DtOrderVo.builder()
+                .orderDate("2025-10-22")
+                .orderNum(156)
+                .build();
+        DtOrderVo dtOrderVo2 = DtOrderVo.builder()
+                .orderDate("2025-10-23")
+                .orderNum(166)
+                .build();
+        List<DtOrderVo> orderVoList = new ArrayList<>();
+        orderVoList.add(dtOrderVo);
+        orderVoList.add(dtOrderVo2);
+
+        return R.ok().add(orderVoList);
+    }
+
+    /**
+     * 杩戞湡鍓╀綑搴撲綅锛堥粯璁�7澶╋級
+     *
+     * @param areaId    搴撳尯缂栫爜
+     * @param startDate 鏍煎紡锛歽yyyMMdd锛�20251022
+     * @param endDate   鏍煎紡锛歽yyyMMdd锛�20251027
+     * @return
+     */
+    @RequestMapping(value = "/recentIdleLoc")
+//    @ManagerAuth
+    public R recentIdleLoc(@RequestParam(required = false) String areaId,
+                           @RequestParam(required = false) String startDate,
+                         @RequestParam(required = false) String endDate){
+
+//        digitalTwinService.recentLoc(areaId, startDate, endDate);
+
+        DtLocVo dtLocVo = DtLocVo.builder()
+                .locDate("2025-10-22")
+                .idleNum(208)
+                .build();
+        DtLocVo dtLocVo2 = DtLocVo.builder()
+                .locDate("2025-10-23")
+                .idleNum(177)
+                .build();
+        List<DtLocVo> locVoList = new ArrayList<>();
+        locVoList.add(dtLocVo);
+        locVoList.add(dtLocVo2);
+
+        return R.ok().add(locVoList);
+    }
+
+    /**
+     * 杩戞湡鍑哄叆搴擄紙榛樿7澶╋級
+     *
+     * @param areaId    搴撳尯缂栫爜
+     * @param startDate 鏍煎紡锛歽yyyMMdd锛�20251022
+     * @param endDate   鏍煎紡锛歽yyyMMdd锛�20251027
+     * @return
+     */
+    @RequestMapping(value = "/recentInAndOutBound")
+//    @ManagerAuth
+    public R recentInAndOutBound(@RequestParam(required = false) String areaId,
+                           @RequestParam(required = false) String startDate,
+                           @RequestParam(required = false) String endDate){
+
+//        digitalTwinService.inAndOutBound(areaId, startDate, endDate);
+
+        DtInAndOutBoundVo dtInAndOutBoundVo = DtInAndOutBoundVo.builder()
+                .boundDate("2025-10-22")
+                .inBoundNum(237)
+                .outBoundNum(487)
+                .build();
+        DtInAndOutBoundVo dtInAndOutBoundVo2 = DtInAndOutBoundVo.builder()
+                .boundDate("2025-10-23")
+                .inBoundNum(187)
+                .outBoundNum(287)
+                .build();
+        List<DtInAndOutBoundVo> inAndOutBoundVoList = new ArrayList<>();
+        inAndOutBoundVoList.add(dtInAndOutBoundVo);
+        inAndOutBoundVoList.add(dtInAndOutBoundVo2);
+
+        return R.ok().add(inAndOutBoundVoList);
+    }
+
+    /**
+     * 杩戞湡鍛嗘粸鍝侊紙榛樿瓒�30澶╋級
+     *
+     * @param areaId    搴撳尯缂栫爜
+     * @param overDayNum 鍛嗘粸鍝佸ぉ鏁帮紝榛樿30澶�
+     * @return
+     */
+    @RequestMapping(value = "/recentDetainMat")
+//    @ManagerAuth
+    public R recentDetainMat(@RequestParam(required = false) String areaId,
+                             @RequestParam(required = false) Integer overDayNum,
+                             @RequestParam(required = false) Integer pageIndex,
+                             @RequestParam(required = false) Integer pageSize){
+
+//        digitalTwinService.recentDetainMat(areaId, overDayNum, pageIndex, pageSize);
+
+        DtDetainMatVo dtDetainMatVo = DtDetainMatVo.builder()
+                .belongAreaId("A1")
+                .belongAreaName("鍒�鍏峰簱")
+                .matId("mat10001")
+                .matName("閬撳叿鎶�")
+                .lokId("loc1001")
+                .lokName("搴撲綅10001")
+                .detainTime(765)
+                .inBoundTime("2025-10-11T11:15:16")
+                .build();
+        DtDetainMatVo dtDetainMatVo2 = DtDetainMatVo.builder()
+                .belongAreaId("A1")
+                .belongAreaName("鍒�鍏峰簱")
+                .matId("mat10002")
+                .matName("閬撳叿鎶�")
+                .lokId("loc1002")
+                .lokName("搴撲綅10002")
+                .detainTime(665)
+                .inBoundTime("2025-10-10T11:15:16")
+                .build();
+        List<DtDetainMatVo> detainMatVoList = new ArrayList<>();
+        detainMatVoList.add(dtDetainMatVo);
+        detainMatVoList.add(dtDetainMatVo2);
+
+        return R.ok().add(detainMatVoList);
+    }
+
+    /**
+     * 璁惧杩愯淇℃伅
+     *
+     * @param areaId
+     * @return
+     */
+    @RequestMapping(value = "/equipment")
+//    @ManagerAuth
+    public R equipment(@RequestParam(required = false) String areaId){
+
+        DtEquipmentVo dtDetainMatVo = DtEquipmentVo.builder()
+                .equipmentId("eq1001")
+                .equipmentName("鍫嗗灈鏈�1")
+                .equipmentType(1)
+                .belongAreaId("A1")
+                .belongAreaName("鍒�鍏峰簱")
+                .verticalSpeed(288)
+                .horizontalSpeed(203)
+                .voltage(48)
+                .status(1)
+                .operateMethod(1)
+                .build();
+        DtEquipmentVo dtDetainMatVo2 = DtEquipmentVo.builder()
+                .equipmentId("eq1002")
+                .equipmentName("鍫嗗灈鏈�2")
+                .equipmentType(1)
+                .belongAreaId("A1")
+                .belongAreaName("鍒�鍏峰簱")
+                .verticalSpeed(208)
+                .horizontalSpeed(253)
+                .voltage(48)
+                .status(1)
+                .operateMethod(1)
+                .build();
+        List<DtEquipmentVo> dtEquipmentVoList = new ArrayList<>();
+        dtEquipmentVoList.add(dtDetainMatVo);
+        dtEquipmentVoList.add(dtDetainMatVo2);
+
+        return R.ok().add(dtEquipmentVoList);
+    }
+
+    /**
+     * 搴撲綅鍜屽簱瀛樿鎯�
+     *
+     * @param areaId
+     * @return
+     */
+    @RequestMapping(value = "/warehouseDetail")
+//    @ManagerAuth
+    public R warehouseDetail(@RequestParam(required = false) String areaId){
+
+//        digitalTwinService.warehouseDetail(areaId);
+
+        List<DtLocDetailVo> dtLocDetailVoList = new ArrayList<>();
+        DtLocDetailVo dtLocDetailVo = new DtLocDetailVo();
+        dtLocDetailVo.setLocNo("CA0100202");
+        dtLocDetailVo.setLocSts("O");
+        dtLocDetailVo.setAreaId(10010L);
+        dtLocDetailVo.setAreaName("鍒�鍏峰簱");
+        dtLocDetailVo.setRow1(1);
+        dtLocDetailVo.setBay1(2);
+        dtLocDetailVo.setLev1(2);
+
+        LocMast locMast = new LocMast();
+        locMast.setLocNo("CA0100202");
+        locMast.setLocSts("O");
+        locMast.setRow1(1);
+        locMast.setBay1(2);
+        locMast.setLev1(2);
+        dtLocDetailVo.setLocMast(locMast);
+
+        LocDetl locDetl = new LocDetl();
+        locDetl.setLocNo("CA0100202");
+        locDetl.setAreaId(10010L);
+        locDetl.setAreaName("鍒�鍏峰簱");
+        locDetl.setMatnr("mat10001");
+        locDetl.setMaktx("鍒�鎶�");
+        dtLocDetailVo.setLocDetl(locDetl);
+        dtLocDetailVoList.add(dtLocDetailVo);
+
+
+        DtLocDetailVo dtLocDetailVo2 = new DtLocDetailVo();
+        dtLocDetailVo2.setLocNo("CA0100202");
+        dtLocDetailVo2.setLocSts("O");
+        dtLocDetailVo2.setAreaId(10010L);
+        dtLocDetailVo2.setAreaName("鍒�鍏峰簱");
+        dtLocDetailVo2.setRow1(1);
+        dtLocDetailVo2.setBay1(2);
+        dtLocDetailVo2.setLev1(2);
+
+        LocMast locMast2 = new LocMast();
+        locMast2.setLocNo("CA0100203");
+        locMast2.setLocSts("O");
+        locMast2.setRow1(1);
+        locMast2.setBay1(2);
+        locMast2.setLev1(3);
+        dtLocDetailVo2.setLocMast(locMast2);
+
+        LocDetl locDetl2 = new LocDetl();
+        locDetl2.setLocNo("CA0100203");
+        locDetl2.setAreaId(10010L);
+        locDetl2.setAreaName("鍒�鍏峰簱");
+        locDetl2.setMatnr("mat10001");
+        locDetl2.setMaktx("鍒�鎶�");
+        dtLocDetailVo2.setLocDetl(locDetl2);
+        dtLocDetailVoList.add(dtLocDetailVo2);
+
+
+//        LocDetl locDetl2 = new LocDetl();
+//        locDetl2.setLocNo("1001");
+//        locDetl2.setAreaId(10010L);
+//        locDetl2.setAreaName("鍒�鍏峰簱");
+//        locDetl2.setMatnr("mat10001");
+//        locDetl2.setMaktx("鍒�鎶�");
+//
+////        List<LocDetl> locDetlList = new ArrayList<>();
+////        locDetlList.add(locDetl);
+////        locDetlList.add(locDetl2);
+
+        return R.ok().add(dtLocDetailVoList);
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/controller/MesController.java b/src/main/java/com/zy/asrs/controller/MesController.java
new file mode 100644
index 0000000..92c13b4
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/MesController.java
@@ -0,0 +1,123 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.core.annotations.AppAuth;
+import com.core.common.Cools;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.mes.*;
+import com.zy.asrs.service.MesService;
+import com.zy.common.web.BaseController;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+@RestController
+@Slf4j
+public class MesController extends BaseController {
+
+    @Resource
+    private MesService mesService;
+
+    private void auth(String appkey, Object obj, HttpServletRequest request) {
+        log.info("{}鎺ュ彛琚闂紱appkey:{}锛涜姹傛暟鎹細{}", request.getRequestURI(), appkey, JSON.toJSONString(obj));
+        request.setAttribute("cache", obj);
+    }
+
+    // 鐗╂枡淇℃伅鍚屾
+    @PostMapping("/api/mes/synMatInfo")
+    @AppAuth(memo = "鐗╂枡淇℃伅鍚屾")
+    public MesReturn synMatInfo(@RequestHeader(required = false) String appkey,@RequestBody MesMatRecvForm param, HttpServletRequest request){
+        auth(appkey, param, request);
+        MesReturn mesReturn = new MesReturn();
+        try {
+            mesReturn = mesService.matInfoAndInBound(param);
+        } catch (Exception e) {
+            mesReturn.setSuccess("2");
+            mesReturn.setMessage("鐗╂枡淇℃伅鍚屾澶辫触");
+        }
+        return mesReturn;
+    }
+
+    // 鍑哄簱鐢宠
+    @PostMapping("/api/mes/outBoundOrder")
+    public MesReturn outBoundOrder(@RequestBody MesOutApply param){
+
+        MesReturn mesReturn = new MesReturn();
+        mesReturn.setSuccess(mesService.outBoundOrder(param) == 1 ? "1" : "2");
+        return mesReturn;
+    }
+
+    // 鍑哄簱鐢宠锛堝彨鏂欙級锛岃閰嶅簱銆佹粦鍧楀簱
+    @PostMapping("/api/mes/callOutBoundOrder")
+    public MesReturn callOutBoundOrder(@RequestBody MesCallOutApply param){
+
+        MesReturn mesReturn = new MesReturn();
+        mesReturn.setSuccess(mesService.callOutBoundOrder(param) == 1 ? "1" : "2");
+        return mesReturn;
+    }
+
+    // 鍏ュ簱鐢宠
+    @PostMapping("/api/mes/inBoundOrder")
+    public MesReturn inBoundOrder(@RequestBody MesInApply param){
+
+        MesReturn mesReturn = new MesReturn();
+        mesReturn.setSuccess(mesService.inBoundOrder(param) == 1 ? "1" : "2");
+        return mesReturn;
+    }
+
+    // 鍏ョ珯鍏佽
+    @PostMapping("/api/mes/allowInStation")
+    public MesReturn allowInStation(@RequestBody TransInOutStationAllow param){
+
+        return mesService.allowInStation(param);
+    }
+
+    // 绂荤珯鍏佽锛岃閰嶅簱銆佹粦鍧楀簱
+    @PostMapping("/api/mes/allowOutStation")
+    public MesReturn allowOutStation(@RequestBody TransInOutStationAllow param){
+
+        return mesService.allowOutStation(param);
+    }
+
+    // 涓嬪彂杩愯緭浠诲姟
+    @PostMapping("/api/mes/submitTask")
+    public JSONObject submitTask(@RequestBody TransTask param){
+
+        return mesService.submitTask(param);
+    }
+
+    // region 涓存椂娴嬭瘯
+
+    @GetMapping("/api/mes/testInFeedback")
+    public int test(@RequestParam String orderNo){
+
+        return mesService.inFeedback(orderNo);
+    }
+
+    @GetMapping("/api/mes/testInFeedback2")
+    public int test(@RequestParam String orderNo, @RequestParam String zapplet){
+
+        return mesService.recvFeedback(orderNo, zapplet);
+    }
+    // endregion
+
+    // 搴撳瓨鏌ヨ鎺ュ彛
+    // 鎸� 鐗╂枡缂栫爜+oderNo
+    @PostMapping("/api/mes/queryInventory")
+    public MesReturn queryInventory(@RequestBody JSONObject param){
+        MesReturn mesReturn = new MesReturn();
+        String itemno = param.getString("itemno");
+        String orderNo = param.getString("orderNo");
+        if(Cools.isEmpty(itemno,orderNo)) {
+            mesReturn.setSuccess("2");
+            mesReturn.setMessage("鍙傛暟涓嶈兘涓虹┖");
+            return mesReturn;
+        }
+
+        return mesService.queryInventory(itemno,orderNo);
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/controller/MobileController.java b/src/main/java/com/zy/asrs/controller/MobileController.java
index 95e7cda..7e048b2 100644
--- a/src/main/java/com/zy/asrs/controller/MobileController.java
+++ b/src/main/java/com/zy/asrs/controller/MobileController.java
@@ -525,4 +525,14 @@
         return R.ok("鍑哄簱鎴愬姛");
     }
 
+    // pda鍛煎彨绌烘枡妗嗗嚭搴�
+    @PostMapping("/callEmptyBinOutBound")
+    @ManagerAuth(memo = "pda鍛煎彨绌烘枡妗嗗嚭搴�")
+    public synchronized R callEmptyBinOutBound(@RequestBody JSONObject param) {
+        if(!param.containsKey("staNo") || !param.containsKey("locType")){ // 1.绐勶紝2.瀹�
+            return R.parse(BaseRes.PARAM);
+        }
+        return mobileService.callEmptyBinOutBound(param.getString("staNo"),param.getString("locType"),getUserId());
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/controller/RcsController.java b/src/main/java/com/zy/asrs/controller/RcsController.java
new file mode 100644
index 0000000..0f0d58e
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/RcsController.java
@@ -0,0 +1,44 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zy.asrs.entity.mes.TransParent;
+import com.zy.asrs.entity.rcs.RcsReporterEqpt;
+import com.zy.asrs.entity.rcs.RcsReporterTask;
+import com.zy.asrs.entity.rcs.RcsReturn;
+import com.zy.asrs.service.RcsService;
+import com.zy.common.web.BaseController;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+public class RcsController extends BaseController {
+
+    @Resource
+    private RcsService rcsService;
+
+
+    // 鍙嶉浠诲姟鎵ц缁撴灉
+    @PostMapping("/api/robot/reporter/task")
+    public RcsReturn reporterTask(@RequestBody RcsReporterTask param){
+
+        return rcsService.reporterTask(param);
+    }
+
+    // 鍙嶉灏侀攣鍖猴紙鑷姩闂級鐢宠
+    @PostMapping("/api/robot/reporter/eqpt")
+    public RcsReturn reporterEqpt(@RequestBody RcsReporterEqpt param){
+
+        return rcsService.reporterEqpt(param);
+    }
+
+    // 鍗庢檽AGV鐢宠杩涘叆浜х嚎锛堝厜骞曪級
+    @PostMapping("/api/robot/apply/inLine")
+    public JSONObject hxApplyInLine(@RequestBody TransParent param){
+
+        return rcsService.hxApplyInLine(param);
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/controller/WaitPakinController.java b/src/main/java/com/zy/asrs/controller/WaitPakinController.java
index 7f13959..e30ee73 100644
--- a/src/main/java/com/zy/asrs/controller/WaitPakinController.java
+++ b/src/main/java/com/zy/asrs/controller/WaitPakinController.java
@@ -10,9 +10,11 @@
 import com.core.common.Cools;
 import com.core.common.DateUtils;
 import com.core.common.R;
+import com.zy.asrs.entity.OrderDetlPakin;
 import com.zy.asrs.entity.WaitPakin;
 import com.zy.asrs.entity.WrkDetl;
 import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.service.OrderDetlPakinService;
 import com.zy.asrs.service.OrderDetlService;
 import com.zy.asrs.service.WaitPakinService;
 import com.zy.asrs.service.WrkMastService;
@@ -22,6 +24,7 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -36,6 +39,9 @@
     private OrderDetlService orderDetlService;
     @Autowired
     private WrkMastService wrkMastService;
+
+    @Resource
+    private OrderDetlPakinService orderDetlPakinService;
 
     @RequestMapping(value = "/waitPakin/{id}/auth")
     @ManagerAuth
@@ -113,6 +119,12 @@
                         ,entity.getStandby1(),entity.getStandby2(),entity.getStandby3()
                         ,entity.getBoxType1(),entity.getBoxType2(),entity.getBoxType3()
                         , entity.getAnfme());
+                // 鎭㈠鍒板緟澶勭悊鐘舵��
+                List<OrderDetlPakin> orderDetlPakins = orderDetlPakinService.selectByOrderId(entity.getOrderId());
+                long count = orderDetlPakins.stream().filter(orderDetlPakin -> orderDetlPakin.getWorkQty() != 0).count();
+                if (count == 0) {
+                    OrderInAndOutUtil.updateOrder(Boolean.TRUE, entity.getOrderId(), 1L, getUserId());
+                }
             }
         }
         return R.ok();
diff --git a/src/main/java/com/zy/asrs/entity/AgvInfo.java b/src/main/java/com/zy/asrs/entity/AgvInfo.java
new file mode 100644
index 0000000..cc55161
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/AgvInfo.java
@@ -0,0 +1,53 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName("agv_info")
+public class AgvInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭锛岃澶囩紪鍙�
+     */
+    @ApiModelProperty(value= "涓婚敭")
+    @TableId(value = "agvNo", type = IdType.AUTO)
+    private String agvNo;
+
+    /**
+     * 璁惧鍚嶇О
+     */
+    @ApiModelProperty(value= "璁惧鍚嶇О")
+    @TableField("agv_name")
+    private String agvName;
+
+    /**
+     * 璁惧绫诲瀷锛�1 agv锛�2 ctu锛�
+     */
+    @ApiModelProperty(value= "璁惧绫诲瀷")
+    @TableField("agv_type")
+    private String agvType;
+
+    /**
+     * 璁惧鍘傚锛�1 娴峰悍锛�2 鍗庢檽锛�
+     */
+    @ApiModelProperty(value= "璁惧绫诲瀷")
+    @TableField("agv_factory")
+    private Integer agvFactory;
+
+    /**
+     * 鎵�灞炲簱鍖�
+     */
+    @ApiModelProperty(value= "鎵�灞炲簱鍖�")
+    @TableField("belong_area")
+    private String belongArea;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BlockStation.java b/src/main/java/com/zy/asrs/entity/BlockStation.java
new file mode 100644
index 0000000..eacfac8
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BlockStation.java
@@ -0,0 +1,81 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName("agv_block_station")
+public class BlockStation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @ApiModelProperty(value= "涓婚敭")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 绔欑偣缂栧彿
+     */
+    @ApiModelProperty(value= "绔欑偣id")
+    @TableField("dev_no")
+    private String devNo;
+
+    /**
+     * 绔欑偣鍚嶇О
+     */
+    @ApiModelProperty(value= "绔欑偣鍚嶇О")
+    @TableField("dec_name")
+    private String decName;
+
+    /**
+     * 灏侀攣鍖篿d
+     */
+    @ApiModelProperty(value= "灏侀攣鍖篿d")
+    @TableField("block_no")
+    private String blockNo;
+
+    /**
+     * 灏侀攣鍖哄悕绉�
+     */
+    @ApiModelProperty(value= "灏侀攣鍖哄悕绉�")
+    @TableField("block_name")
+    private String blockName;
+
+    /**
+     * 鎵�灞炲簱鍖篿d
+     */
+    @ApiModelProperty(value= "鎵�灞炲簱鍖篿d")
+    @TableField("area_id")
+    private String areaId;
+
+    /**
+     * 鎵�灞炲簱鍖哄悕绉�
+     */
+    @ApiModelProperty(value= "鎵�灞炲簱鍖哄悕绉�")
+    @TableField("area_name")
+    private String areaName;
+
+    /**
+     * 鐘舵�侊紝0 绌洪棽锛�1 娴峰悍灏侀攣涓紱2 鍗庢檽灏侀攣涓紱-1 寮傚父锛�
+     */
+    @ApiModelProperty(value= "鐘舵��")
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 灏侀攣鍖哄唴agv鏁伴噺
+     */
+    @ApiModelProperty(value= "鐘舵��")
+    @TableField("agv_num")
+    private Integer agvNum;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BlockTask.java b/src/main/java/com/zy/asrs/entity/BlockTask.java
new file mode 100644
index 0000000..c88a819
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/BlockTask.java
@@ -0,0 +1,74 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("agv_block_task")
+public class BlockTask implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭锛岃姹傚彿
+     */
+    @ApiModelProperty(value= "涓婚敭")
+    @TableId(value = "task_code")
+    private String taskCode;
+
+    /**
+     * 璇锋眰鏃堕棿
+     */
+    @ApiModelProperty(value= "璇锋眰鏃堕棿")
+    @TableField("apply_time")
+    private Date applyTime;
+
+    /**
+     * 灏侀攣鍖篿d
+     */
+    @ApiModelProperty(value= "灏侀攣鍖篿d")
+    @TableField("block_no")
+    private String blockNo;
+
+    /**
+     * 灏侀攣鍖哄悕绉�
+     */
+    @ApiModelProperty(value= "灏侀攣鍖哄悕绉�")
+    @TableField("block_name")
+    private String blockName;
+
+    /**
+     * 杩涘叆鏂规硶锛孉PPLY_LOCK 鐢宠灏侀攣鍖猴紱RELEASE_EQPT 閲婃斁灏侀攣鍖猴紱
+     */
+    @ApiModelProperty(value= "杩涘叆鏂规硶")
+    @TableField("method")
+    private String method;
+
+    /**
+     * 鏄惁瀹屾垚锛�1 瀹屾垚锛�0 鏈畬鎴愶紱
+     */
+    @ApiModelProperty(value= "鏄惁瀹屾垚")
+    @TableField("completed")
+    private Integer completed;
+
+    /**
+     * 瀹屾垚鏃堕棿
+     */
+    @ApiModelProperty(value= "瀹屾垚鏃堕棿")
+    @TableField("completed_time")
+    private Date completedTime;
+
+    /**
+     * agv鍘傚锛�1 娴峰悍锛�2 鍗庢檽锛�
+     */
+    @ApiModelProperty(value= "agv鍘傚")
+    @TableField("agv_factory")
+    private Integer agvFactory;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/LocCount.java b/src/main/java/com/zy/asrs/entity/LocCount.java
new file mode 100644
index 0000000..905c944
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/LocCount.java
@@ -0,0 +1,41 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@TableName("asr_loc_count")
+public class LocCount {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鏃ユ湡
+     */
+    @ApiModelProperty(value= "鏃ユ湡锛屾牸寮忥細20250101")
+    @TableField("date")
+    private Integer date;
+
+    /**
+     * 搴撳尯鍙�
+     */
+    @ApiModelProperty(value= "搴撳尯鍙�")
+    @TableField("area_id")
+    private String areaId;
+
+    /**
+     * 搴撲綅鏁伴噺
+     */
+    @ApiModelProperty(value= "搴撲綅鏁伴噺")
+    @TableField("loc_num")
+    private Integer locNum;
+
+    /**
+     * 鍓╀綑搴撲綅鏁伴噺
+     */
+    @ApiModelProperty(value= "鍓╀綑搴撲綅鏁伴噺")
+    @TableField("remain_num")
+    private Integer remainNum;
+}
diff --git a/src/main/java/com/zy/asrs/entity/LocDetl.java b/src/main/java/com/zy/asrs/entity/LocDetl.java
index c95626c..34181dc 100644
--- a/src/main/java/com/zy/asrs/entity/LocDetl.java
+++ b/src/main/java/com/zy/asrs/entity/LocDetl.java
@@ -18,6 +18,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
+import org.springframework.beans.BeanUtils;
 
 import java.io.Serializable;
 import java.text.SimpleDateFormat;
@@ -121,7 +122,8 @@
     private Double weight;
 
     @ApiModelProperty(value= "闀垮害")
-    private Double man_length;
+    @TableField("man_length")
+    private Double manLength;
 
     @ApiModelProperty(value= "浣撶Н")
     private Double volume;
@@ -337,7 +339,7 @@
     }
 
     public void sync(Object source) {
-        Synchro.Copy(source, this);
+        BeanUtils.copyProperties(source,this);
     }
 
     public String getFrozen$() {
diff --git a/src/main/java/com/zy/asrs/entity/MatItemBarcode.java b/src/main/java/com/zy/asrs/entity/MatItemBarcode.java
new file mode 100644
index 0000000..afc0b3d
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/MatItemBarcode.java
@@ -0,0 +1,75 @@
+package com.zy.asrs.entity;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("man_mat_item_barcode")
+public class MatItemBarcode implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 闆朵欢浜岀淮鐮�
+     */
+    @ApiModelProperty(value= "闆朵欢浜岀淮鐮�")
+    @TableId(value = "item_barcode")
+    private String itemBarcode;
+
+    /**
+     * 闆朵欢璐ㄩ噺鐘舵��
+     */
+    @ApiModelProperty(value= "闆朵欢璐ㄩ噺鐘舵��")
+    @TableId(value = "quality_status")
+    private Integer qualityStatus;
+
+    /**
+     * 鐢熶骇璁㈠崟鍙�
+     */
+    @ApiModelProperty(value= "鐢熶骇璁㈠崟鍙�")
+    @TableField("order_no")
+    private String orderNo;
+
+    /**
+     * 鎵樼洏鍙�
+     */
+    @ApiModelProperty(value= "鎵樼洏鍙�")
+    @TableField("zapplet")
+    private String zapplet;
+
+    /**
+     * 搴撲綅缂栧彿
+     */
+    @ApiModelProperty(value= "搴撲綅缂栧彿")
+    @ExcelProperty(value = "loc_no")
+    private String loc_no;
+
+    /**
+     * 杩愯緭浠诲姟鍙�
+     */
+    @ApiModelProperty(value= "杩愯緭浠诲姟鍙�")
+    @ExcelProperty(value = "task_no")
+    private String taskNo;
+
+    /**
+     * 鐘舵�侊紝-1 搴熷純锛�0 鍦ㄥ簱锛�1 杩愯緭涓紱
+     */
+    @ApiModelProperty(value= "鐘舵��")
+    @ExcelProperty(value = "status")
+    private String status;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @ApiModelProperty(value= "鏇存柊鏃堕棿")
+    @ExcelProperty(value = "update_time")
+    private Date updateTime;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/Task.java b/src/main/java/com/zy/asrs/entity/Task.java
index 79496f2..17b831f 100644
--- a/src/main/java/com/zy/asrs/entity/Task.java
+++ b/src/main/java/com/zy/asrs/entity/Task.java
@@ -334,6 +334,13 @@
     @TableField("take_none")
     private String takeNone;
 
+    /**
+     * 澶栭儴浠诲姟缂栧彿
+     */
+    @ApiModelProperty(value= "澶栭儴浠诲姟缂栧彿")
+    @TableField("task_no")
+    private String taskNo;
+
     public Task() {}
 
     public String getYmd$(){
@@ -388,7 +395,7 @@
 
     public String getTaskType$(){
         if (Cools.isEmpty(this.taskType)){return  null;}
-        if (taskType.equals("agv")) {
+        if (taskType.equals("AGV")) {
             return "AGV浠诲姟";
         } else {
             return "鍫嗗灈鏈轰换鍔�";
diff --git a/src/main/java/com/zy/asrs/entity/TaskDetlLog.java b/src/main/java/com/zy/asrs/entity/TaskDetlLog.java
index 52bb660..c1006a8 100644
--- a/src/main/java/com/zy/asrs/entity/TaskDetlLog.java
+++ b/src/main/java/com/zy/asrs/entity/TaskDetlLog.java
@@ -1,8 +1,12 @@
 package com.zy.asrs.entity;
 
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
 import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableField;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+
+import org.springframework.data.annotation.Id;
 import org.springframework.format.annotation.DateTimeFormat;
 import com.core.common.SpringUtils;
 import com.zy.system.service.UserService;
@@ -26,6 +30,8 @@
 
     private static final long serialVersionUID = 1L;
 
+    @TableField("id")
+    @TableId(type = IdType.AUTO)
     private Long id;
 
     @TableField("log_id")
diff --git a/src/main/java/com/zy/asrs/entity/WaitPakin.java b/src/main/java/com/zy/asrs/entity/WaitPakin.java
index 51002e4..a99da3b 100644
--- a/src/main/java/com/zy/asrs/entity/WaitPakin.java
+++ b/src/main/java/com/zy/asrs/entity/WaitPakin.java
@@ -8,6 +8,8 @@
 import com.zy.asrs.service.BasProcessProceduresService;
 import com.zy.asrs.service.BasQualityTestingService;
 import com.zy.common.utils.Synchro;
+import com.zy.system.entity.User;
+import com.zy.system.service.UserService;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -272,6 +274,15 @@
         return this.boxType1;
     }
 
+    public String getAppeUser$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.appeUser);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getUsername());
+        }
+        return null;
+    }
+
     public String getBoxType2$(){
         BasQualityTestingService service = SpringUtils.getBean(BasQualityTestingService.class);
         BasQualityTesting basQualityTesting = service.selectOne(new EntityWrapper<BasQualityTesting>().eq("box_type", this.boxType1));
diff --git a/src/main/java/com/zy/asrs/entity/WrkDetl.java b/src/main/java/com/zy/asrs/entity/WrkDetl.java
index 4d10ea7..f6876a1 100644
--- a/src/main/java/com/zy/asrs/entity/WrkDetl.java
+++ b/src/main/java/com/zy/asrs/entity/WrkDetl.java
@@ -10,6 +10,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
+import org.springframework.beans.BeanUtils;
 
 import java.io.Serializable;
 import java.text.SimpleDateFormat;
@@ -401,7 +402,7 @@
     }
 
     public void sync(Object source) {
-        Synchro.Copy(source, this);
+        BeanUtils.copyProperties(source,this);
     }
 
 }
diff --git a/src/main/java/com/zy/asrs/entity/WrkMast.java b/src/main/java/com/zy/asrs/entity/WrkMast.java
index 1bf9d7a..daf4250 100644
--- a/src/main/java/com/zy/asrs/entity/WrkMast.java
+++ b/src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -325,6 +325,13 @@
     @TableField("take_none")
     private String takeNone;
 
+    /**
+     * 澶栭儴浠诲姟缂栧彿
+     */
+    @ApiModelProperty(value= "澶栭儴浠诲姟缂栧彿")
+    @TableField("task_no")
+    private String taskNo;
+
     public WrkMast() {}
 
     public String getYmd$(){
diff --git a/src/main/java/com/zy/asrs/entity/digitaltwin/DtDetainMatVo.java b/src/main/java/com/zy/asrs/entity/digitaltwin/DtDetainMatVo.java
new file mode 100644
index 0000000..29129c9
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/digitaltwin/DtDetainMatVo.java
@@ -0,0 +1,28 @@
+package com.zy.asrs.entity.digitaltwin;
+
+import lombok.Builder;
+import lombok.Data;
+
+// 鏁板瓧瀛敓锛氬憜婊炲搧淇℃伅
+@Data
+@Builder
+public class DtDetainMatVo {
+
+    // 褰掑睘搴撳尯ID
+    private String belongAreaId;
+    // 褰掑睘搴撳尯鍚嶇О
+    private String belongAreaName;
+    // 鐗╂枡ID
+    private String matId;
+    // 鐗╂枡鍚嶇О
+    private String matName;
+    // 鎵�灞炲簱浣岻D
+    private String lokId;
+    // 鎵�灞炲簱浣嶅悕绉�
+    private String lokName;
+    // 鍛嗘粸鏃堕棿锛岃绠楀崟浣嶏細鍒嗛挓
+    private Integer detainTime;
+    // 鍏ュ簱鏃堕棿锛屾牸寮忥細2025-10-11T11:15:16锛岄鐣�
+    private String inBoundTime;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/result/DtEquipmentVo.java b/src/main/java/com/zy/asrs/entity/digitaltwin/DtEquipmentVo.java
similarity index 94%
rename from src/main/java/com/zy/asrs/entity/result/DtEquipmentVo.java
rename to src/main/java/com/zy/asrs/entity/digitaltwin/DtEquipmentVo.java
index c14e2ad..67d9fe7 100644
--- a/src/main/java/com/zy/asrs/entity/result/DtEquipmentVo.java
+++ b/src/main/java/com/zy/asrs/entity/digitaltwin/DtEquipmentVo.java
@@ -1,4 +1,4 @@
-package com.zy.asrs.entity.result;
+package com.zy.asrs.entity.digitaltwin;
 
 import lombok.Builder;
 import lombok.Data;
diff --git a/src/main/java/com/zy/asrs/entity/digitaltwin/DtInAndOutBoundVo.java b/src/main/java/com/zy/asrs/entity/digitaltwin/DtInAndOutBoundVo.java
new file mode 100644
index 0000000..e983dbe
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/digitaltwin/DtInAndOutBoundVo.java
@@ -0,0 +1,17 @@
+package com.zy.asrs.entity.digitaltwin;
+
+import lombok.Builder;
+import lombok.Data;
+
+// 鏁板瓧瀛敓锛氭寜澶╁嚭鍏ュ簱鏁伴噺
+@Data
+@Builder
+public class DtInAndOutBoundVo {
+
+    // 鏃ユ湡
+    private String boundDate;
+    // 鍏ュ簱鏁伴噺
+    private Integer inBoundNum;
+    // 鍑哄簱鏁伴噺
+    private Integer outBoundNum;
+}
diff --git a/src/main/java/com/zy/asrs/entity/digitaltwin/DtLocDetailVo.java b/src/main/java/com/zy/asrs/entity/digitaltwin/DtLocDetailVo.java
new file mode 100644
index 0000000..1c64747
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/digitaltwin/DtLocDetailVo.java
@@ -0,0 +1,30 @@
+package com.zy.asrs.entity.digitaltwin;
+
+import com.zy.asrs.entity.LocDetl;
+import com.zy.asrs.entity.LocMast;
+import lombok.Data;
+
+@Data
+public class DtLocDetailVo  {
+
+    // 搴撲綅鍙�
+    private String locNo;
+    // 搴撲綅鐘舵�侊紝O绌哄簱浣嶏紙鑻辨枃涓嶆槸鏁板瓧锛夛紱F 鍦ㄥ簱锛汥 绌烘澘锛汸 鍑哄簱涓紱R 鍑哄簱棰勭害锛汼 鍏ュ簱棰勭害锛涘叾浠� 鍏朵粬锛�
+    private String locSts;
+    // 搴撳尯id
+    private Long areaId;
+    // 搴撳尯鍚嶇О
+    private String areaName;
+    // 鎺�
+    private Integer row1;
+    // 鍒�
+    private Integer bay1;
+    // 灞�
+    private Integer lev1;
+
+    // 搴撲綅淇℃伅
+    private LocMast locMast;
+    // 搴撳瓨淇℃伅
+    private LocDetl locDetl;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/result/DtLocVo.java b/src/main/java/com/zy/asrs/entity/digitaltwin/DtLocVo.java
similarity index 84%
rename from src/main/java/com/zy/asrs/entity/result/DtLocVo.java
rename to src/main/java/com/zy/asrs/entity/digitaltwin/DtLocVo.java
index d46ce47..cf48386 100644
--- a/src/main/java/com/zy/asrs/entity/result/DtLocVo.java
+++ b/src/main/java/com/zy/asrs/entity/digitaltwin/DtLocVo.java
@@ -1,4 +1,4 @@
-package com.zy.asrs.entity.result;
+package com.zy.asrs.entity.digitaltwin;
 
 import lombok.Builder;
 import lombok.Data;
diff --git a/src/main/java/com/zy/asrs/entity/digitaltwin/DtOrderVo.java b/src/main/java/com/zy/asrs/entity/digitaltwin/DtOrderVo.java
new file mode 100644
index 0000000..b2f206a
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/digitaltwin/DtOrderVo.java
@@ -0,0 +1,15 @@
+package com.zy.asrs.entity.digitaltwin;
+
+import lombok.Builder;
+import lombok.Data;
+
+// 鏁板瓧瀛敓锛氭寜澶╄鍗曟暟閲�
+@Data
+@Builder
+public class DtOrderVo {
+
+    // 鏃ユ湡
+    private String orderDate;
+    // 璁㈠崟鏁伴噺
+    private Integer orderNum;
+}
diff --git a/src/main/java/com/zy/asrs/entity/digitaltwin/DtOverviewVo.java b/src/main/java/com/zy/asrs/entity/digitaltwin/DtOverviewVo.java
new file mode 100644
index 0000000..aba1e9b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/digitaltwin/DtOverviewVo.java
@@ -0,0 +1,24 @@
+package com.zy.asrs.entity.digitaltwin;
+
+import lombok.Builder;
+import lombok.Data;
+
+// 鏁板瓧瀛敓锛氭寜澶╁嚭搴撱�佸叆搴撴暟閲�
+@Data
+@Builder
+public class DtOverviewVo {
+
+    // 鎬诲簱浣�
+    private Integer totalLoc;
+    // 宸茬敤搴撲綅
+    private Integer useLoc;
+    // 鍓╀綑搴撲綅
+    private Integer idleLoc;
+    // 浠婃棩鍑哄簱
+    private Integer todayOutbound;
+    // 浠婃棩鍏ュ簱
+    private Integer todayWarehousing;
+    // 鍓╀綑搴撳瓨
+    private Integer remainingStock;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/mes/MesCallOutApply.java b/src/main/java/com/zy/asrs/entity/mes/MesCallOutApply.java
new file mode 100644
index 0000000..1d141cf
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/mes/MesCallOutApply.java
@@ -0,0 +1,61 @@
+package com.zy.asrs.entity.mes;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+// 鍑哄簱鐢宠锛堝彨鏂欙級
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class MesCallOutApply extends MesParent {
+
+//    // 浠诲姟缂栧彿
+//    private String taskno;
+//    // 浠诲姟鍚嶇О
+//    private String taskname;
+//    // 鐢熶骇璁㈠崟鍙�
+//    @JsonProperty("OrderNo")
+//    private String OrderNo;
+    // 杩愯緭绫诲瀷锛屽瓧鍏稿��(wms_tranfs_type) 06 瑁呴厤棰嗘枡锛�01锛氱┖鎵�
+    @JsonProperty("TransType")
+    @JSONField(name = "TransType")
+    private String TransType;
+//    // 鐢熶骇绾跨紪鐮�
+//    @JsonProperty("ProductLineId")
+//    private String ProductLineId;
+//    // 宸ヤ綅缂栫爜
+//    @JsonProperty("StationId")
+//    private String StationId;
+    // 褰撳墠宸ュ簭
+    @JsonProperty("CurProcess")
+    @JSONField(name = "CurProcess")
+    private String CurProcess;
+    // 閰嶇洏淇℃伅
+    @JsonProperty("Itemdata")
+    @JSONField(name = "Itemdata")
+    private List<MesOutApplyItem> Itemdata;
+
+    // 锛坰fc_shop_route_consume锛塵es涓厤鐩樿〃鍚�
+    @Data
+    public static class MesOutApplyItem {
+
+        // 閰嶇洏鍙�
+        private String trayid;
+        // 闆朵欢缂栫爜
+        @JsonProperty("Itemno")
+        @JSONField(name = "Itemno")
+        private String Itemno;
+        // 鏁伴噺
+        @JsonProperty("Qty")
+        @JSONField(name = "Qty")
+        private Integer Qty;
+        // 鐗╂枡浜岀淮鐮�
+        @JsonProperty("ItemBarcode")
+        @JSONField(name = "ItemBarcode")
+        private String ItemBarcode;
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/mes/MesInApply.java b/src/main/java/com/zy/asrs/entity/mes/MesInApply.java
new file mode 100644
index 0000000..8ccf87e
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/mes/MesInApply.java
@@ -0,0 +1,95 @@
+package com.zy.asrs.entity.mes;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+// MES鍏ュ簱鐢宠\鍏ュ簱瀹屾垚
+//@EqualsAndHashCode(callSuper = true)
+@Data
+public class MesInApply  {  //extends MesParent
+
+    public MesInApply() {
+        ProductInfo = new ArrayList<>();
+    }
+
+//    // 浠诲姟缂栧彿
+//    private String taskno;
+//    // 浠诲姟鍚嶇О
+//    private String taskname;
+//    // 鐢熶骇绾跨紪鐮�
+//    @JsonProperty("ProductLineId")
+//    private String ProductLineId;
+//    // 宸ヤ綅缂栫爜
+//    @JsonProperty("StationId")
+//    private String StationId;
+// 浠诲姟缂栧彿
+    @JsonProperty("taskno")
+    @JSONField(name = "taskno")
+    private String taskno;
+    // 浠诲姟鍚嶇О
+    @JsonProperty("taskname")
+    @JSONField(name = "taskname")
+    private String taskname;
+    // 鐢熶骇璁㈠崟鍙�
+    @JsonProperty("OrderNo")
+    @JSONField(name = "OrderNo")
+    private String OrderNo;
+    // 鐢熶骇绾跨紪鐮�
+    @JsonProperty("ProductLineId")
+    @JSONField(name = "ProductLineId")
+    private String ProductLineId;
+    // 宸ヤ綅缂栫爜
+    @JsonProperty("StationID")
+    @JSONField(name = "StationID")
+    private String StationID;
+
+    // 闆朵欢缂栫爜
+    @JsonProperty("Itemno")
+    @JSONField(name = "Itemno")
+    private String Itemno;
+    // 鎵樼洏鏉$爜
+    @JsonProperty("TuoPanId")
+    @JSONField(name = "TuoPanId")
+    private String TuoPanId;
+    // 鏁伴噺锛屾墭鐩橀浂浠舵暟閲�
+    @JsonProperty("Qty")
+    @JSONField(name = "Qty")
+    private Integer Qty;
+    // 鐗堟湰鍙�
+    @JsonProperty("VersionNo")
+    @JSONField(name = "VersionNo")
+    private String VersionNo;
+    // 杩愯緭绫诲瀷
+    @JsonProperty("TransType")
+    @JSONField(name = "TransType")
+    private String TransType;
+
+//    // 鐢熶骇璁㈠崟鍙�
+//    @JsonProperty("OrderNo")
+//    private String OrderNo;
+    // 閰嶇洏淇℃伅
+    @JsonProperty("ProductInfo")
+    @JSONField(name = "ProductInfo")
+    private List<ProductInfo> ProductInfo;
+
+    @Data
+    @NoArgsConstructor
+    public static class ProductInfo {
+
+        // 鐗╂枡浜岀淮鐮�
+        @JsonProperty("ItemBarcode")
+        @JSONField(name = "ItemBarcode")
+        private String ItemBarcode;
+        // 璐ㄩ噺鐘舵�侊紝0 OK锛�1 NG锛�
+        @JsonProperty("QualityStatus")
+        @JSONField(name = "QualityStatus")
+        private Integer QualityStatus;
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/mes/MesMatInfo.java b/src/main/java/com/zy/asrs/entity/mes/MesMatInfo.java
new file mode 100644
index 0000000..669d754
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/mes/MesMatInfo.java
@@ -0,0 +1,117 @@
+package com.zy.asrs.entity.mes;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+// MES鐗╂枡淇℃伅
+@Data
+public class MesMatInfo {
+
+    // 鐗╂枡缂栫爜锛屽敮涓�鏍囪瘑
+//    @NotNull
+    @JsonProperty("itemNo")
+    @JSONField(name = "itemNo")
+    private String itemNo;
+    // 鐗╂枡鍚嶇О
+//    @NotNull
+    @JsonProperty("description")
+    @JSONField(name = "description")
+    private String description;
+    // 鍗曚綅
+    @JsonProperty("unitOfMeasure")
+    @JSONField(name = "unitOfMeasure")
+    private String unitOfMeasure;
+    // 鐗╂枡绫诲瀷
+//    @NotNull
+    @JsonProperty("itemType")
+    @JSONField(name = "itemType")
+    private String itemType;
+    // 鏉愯川
+    @JsonProperty("cz")
+    @JSONField(name = "cz")
+    private String cz;
+    // 閲嶉噺
+    @JsonProperty("weight")
+    @JSONField(name = "weight")
+    private float weight;
+    // 鐗╂枡灞炴��
+//    @NotNull
+    @JsonProperty("classificationCode")
+    @JSONField(name = "classificationCode")
+    private String classificationCode;
+    // 鍥惧彿
+    @JsonProperty("drawingNo")
+    @JSONField(name = "drawingNo")
+    private String drawingNo;
+    // 璁捐澶囨敞
+    @JsonProperty("itemComments")
+    @JSONField(name = "itemComments")
+    private String itemComments;
+    // 鍒涘缓鏃堕棿锛宼imestamp
+    @JsonProperty("createDate")
+    @JSONField(name = "createDate")
+    private String createDate;
+    // 鏈�杩戜竴娆′慨鏀规椂闂达紝timestamp
+    @JsonProperty("modifiedDate1")
+    @JSONField(name = "modifiedDate1")
+    private String modifiedDate1;
+    // 鏈�杩戜慨鏀逛汉
+    @JsonProperty("modifiedOperator1")
+    @JSONField(name = "modifiedOperator1")
+    private String modifiedOperator1;
+    // 鐢熶骇鍗曚綅
+    @JsonProperty("dept")
+    @JSONField(name = "dept")
+    private String dept;
+    // 鏄惁鍏抽敭浠�
+    @JsonProperty("gtCode")
+    @JSONField(name = "gtCode")
+    private String gtCode;
+    // 瑙勬牸鍨嬪彿
+    @JsonProperty("specification")
+    @JSONField(name = "specification")
+    private String specification;
+    // 宸ヨ壓澶囨敞
+    @JsonProperty("procComments")
+    @JSONField(name = "procComments")
+    private String procComments;
+    // 宸ヨ壓淇敼浜�
+    @JsonProperty("procOperator")
+    @JSONField(name = "procOperator")
+    private String procOperator;
+    // 宸ヨ壓淇敼鏃堕棿锛宼imestamp
+    @JsonProperty("procModifiedDate")
+    @JSONField(name = "procModifiedDate")
+    private String procModifiedDate;
+    // ABC鐮�
+    @JsonProperty("abcCode")
+    @JSONField(name = "abcCode")
+    private String abcCode;
+    // 渚涘簲鍟嗙紪鐮�
+    @JsonProperty("vendorNo")
+    @JSONField(name = "vendorNo")
+    private String vendorNo;
+    // 鐗堟湰鍙�
+    @JsonProperty("drawingVersion")
+    @JSONField(name = "drawingVersion")
+    private String drawingVersion;
+    // 鐢熶骇璁㈠崟鍙�
+//    @NotNull
+    @JsonProperty("OrderNo")
+    @JSONField(name = "OrderNo")
+    private String OrderNo;
+    // 鏈崟鍏ュ簱鏁伴噺
+//    @NotNull
+    @JsonProperty("qty")
+    @JSONField(name = "qty")
+    private Integer qty;
+
+    // 闆朵欢浜岀淮鐮�
+    @JsonProperty("ItemBarcode")
+    @JSONField(name = "ItemBarcode")
+    private List<String> ItemBarcode;
+}
diff --git a/src/main/java/com/zy/asrs/entity/mes/MesMatRecvForm.java b/src/main/java/com/zy/asrs/entity/mes/MesMatRecvForm.java
new file mode 100644
index 0000000..5936e62
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/mes/MesMatRecvForm.java
@@ -0,0 +1,29 @@
+package com.zy.asrs.entity.mes;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+// MES鍙戝嚭鐨勯鏂欏叆搴撳崟
+@Data
+public class MesMatRecvForm {
+
+    // 鏉ユ簮鍗曞彿
+    @JsonProperty("sourceNo")
+    @JSONField(name = "sourceNo")
+    private String sourceNo;
+    // 鏉ユ簮鍗曞悕绉�
+    @JsonProperty("sourceName")
+    @JSONField(name = "sourceName")
+    private String sourceName;
+    // 鎿嶄綔浜�
+    @JsonProperty("operuser")
+    @JSONField(name = "operuser")
+    private String operuser;
+    // 鐗╂枡淇℃伅
+    @JsonProperty("itemdata")
+    @JSONField(name = "itemdata")
+    private List<MesMatInfo> itemdata;
+}
diff --git a/src/main/java/com/zy/asrs/entity/mes/MesOutApply.java b/src/main/java/com/zy/asrs/entity/mes/MesOutApply.java
new file mode 100644
index 0000000..2c79729
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/mes/MesOutApply.java
@@ -0,0 +1,48 @@
+package com.zy.asrs.entity.mes;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+// 鍑哄簱鐢宠
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class MesOutApply extends MesParent {
+
+//    // 浠诲姟缂栧彿
+//    private String taskno;
+//    // 浠诲姟鍚嶇О
+//    private String taskname;
+//    // 鐢熶骇璁㈠崟鍙�
+//    @JsonProperty("OrderNo")
+//    @JSONField(name = "OrderNo")
+//    private String OrderNo;
+    // 杩愯緭绫诲瀷锛屽瓧鍏稿��(wms_tranfs_type) 01锛氱珛搴撳嚭绌烘墭锛�02 绔嬪簱鍏ョ┖鎵橈紱03 绔嬪簱鍑烘瘺鍧紱 04 绔嬪簱鍥炴瘺鍧紱 05 绔嬪簱鍑烘垚鍝侊紱06 绔嬪簱鍏ユ垚鍝侊紱
+    @JsonProperty("TransType")
+    @JSONField(name = "TransType")
+    private String TransType;
+    // 闆朵欢缂栫爜
+    @JsonProperty("Itemno")
+    @JSONField(name = "Itemno")
+    private String Itemno;
+    // 鏁伴噺
+    @JsonProperty("Qty")
+    @JSONField(name = "Qty")
+    private Integer Qty;
+//    // 鐢熶骇绾跨紪鐮�
+//    @JsonProperty("ProductLineId")
+//    @JSONField(name = "ProductLineId")
+//    private String ProductLineId;
+//    // 宸ヤ綅缂栫爜
+//    @JsonProperty("StationId")
+//    @JSONField(name = "StationId")
+//    private String StationId;
+    // 鐗╂枡浜岀淮鐮�
+    @JsonProperty("ItemBarcode")
+    @JSONField(name = "ItemBarcode")
+    private List<String> ItemBarcode;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/mes/MesOutFeedback.java b/src/main/java/com/zy/asrs/entity/mes/MesOutFeedback.java
new file mode 100644
index 0000000..cfc3979
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/mes/MesOutFeedback.java
@@ -0,0 +1,47 @@
+package com.zy.asrs.entity.mes;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+// 杩斿洖MES鍑哄簱瀹屾垚
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class MesOutFeedback extends MesParent {
+
+//    // 浠诲姟缂栧彿
+//    private String taskno;
+//    // 浠诲姟鍚嶇О
+//    private String taskname;
+//    // 鐢熶骇绾跨紪鐮�
+//    @JsonProperty("ProductLineId")
+//    @JSONField(name = "ProductLineId")
+//    private String ProductLineId;
+//    // 宸ヤ綅缂栫爜
+//    @JsonProperty("StationId")
+//    @JSONField(name = "StationId")
+//    private String StationId;
+    // 闆朵欢缂栫爜
+    @JsonProperty("Itemno")
+    @JSONField(name = "Itemno")
+    private String Itemno;
+    // 鎵樼洏鏉$爜
+    @JsonProperty("TuoPanId")
+    @JSONField(name = "TuoPanId")
+    private String TuoPanId;
+    // 鏁伴噺锛屾墭鐩橀浂浠舵暟閲�
+    @JsonProperty("Qty")
+    @JSONField(name = "Qty")
+    private Integer Qty;
+    // 鐗╂枡浜岀淮鐮�
+    @JsonProperty("ItemBarcode")
+    @JSONField(name = "ItemBarcode")
+    private List<String> ItemBarcode;
+//    // 鐢熶骇璁㈠崟鍙�
+//    @JsonProperty("OrderNo")
+//    @JSONField(name = "OrderNo")
+//    private String OrderNo;
+}
diff --git a/src/main/java/com/zy/asrs/entity/mes/MesParent.java b/src/main/java/com/zy/asrs/entity/mes/MesParent.java
new file mode 100644
index 0000000..4433877
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/mes/MesParent.java
@@ -0,0 +1,39 @@
+package com.zy.asrs.entity.mes;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class MesParent {
+
+    // 浠诲姟缂栧彿
+    @JsonProperty("taskno")
+    @JSONField(name = "taskno")
+    private String taskno;
+    // 浠诲姟鍚嶇О
+    @JsonProperty("taskname")
+    @JSONField(name = "taskname")
+    private String taskname;
+    // 鐢熶骇璁㈠崟鍙�
+    @JsonProperty("OrderNo")
+    @JSONField(name = "OrderNo")
+    private String OrderNo;
+    // 鐢熶骇绾跨紪鐮�
+    @JsonProperty("ProductLineId")
+    @JSONField(name = "ProductLineId")
+    private String ProductLineId;
+    // 宸ヤ綅缂栫爜
+    @JsonProperty("StationId")
+    @JSONField(name = "StationId")
+    private String StationId;
+//    // 闆朵欢缂栫爜
+//    @JsonProperty("Itemno")
+//    @JSONField(name = "Itemno")
+//    private String Itemno;
+//    // 鏁伴噺锛屾墭鐩橀浂浠舵暟閲�
+//    @JsonProperty("Qty")
+//    @JSONField(name = "Qty")
+//    private Float Qty;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/mes/MesRecvFeedback.java b/src/main/java/com/zy/asrs/entity/mes/MesRecvFeedback.java
new file mode 100644
index 0000000..177e471
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/mes/MesRecvFeedback.java
@@ -0,0 +1,42 @@
+package com.zy.asrs.entity.mes;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+// 鍏ュ簱鍙嶉
+@Data
+public class MesRecvFeedback {
+
+    // 鏉ユ簮鍗曞彿
+    private String sourceNo;
+    // 鎿嶄綔浜�
+    @JsonProperty("operuser")
+    @JSONField(name = "operuser")
+    private String operuser;
+    // 鍙嶉淇℃伅
+    @JsonProperty("itemdata")
+    @JSONField(name = "itemdata")
+    private List<MesRecvFeedbackItem> itemdata;
+
+    @Data
+    public static class MesRecvFeedbackItem {
+
+        // 鐗╂枡缂栫爜
+        private String itemNo;
+        // 鐢熶骇璁㈠崟鍙�
+        @JsonProperty("OrderNo")
+        @JSONField(name = "OrderNo")
+        private String OrderNo;
+        // 鏈崟鍏ュ簱鏁伴噺
+        private Integer qty;
+        // 鏈崟瀹為檯鏁伴噺
+        private Integer realQty;
+        // 闆朵欢缂栫爜
+        @JsonProperty("ItemBarcode")
+        @JSONField(name = "ItemBarcode")
+        private List<String> ItemBarcode;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/entity/mes/MesReturn.java b/src/main/java/com/zy/asrs/entity/mes/MesReturn.java
new file mode 100644
index 0000000..bbecda1
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/mes/MesReturn.java
@@ -0,0 +1,20 @@
+package com.zy.asrs.entity.mes;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+// MES鎺ュ彛杩斿洖缁撴灉
+@Data
+public class MesReturn {
+
+    // 1锛氭垚鍔燂紱2锛氬け璐�
+    @JsonProperty("Success")
+    @JSONField(name = "Success")
+    private String Success;
+    // 澶辫触娑堟伅
+    @JsonProperty("Message")
+    @JSONField(name = "Message")
+    private String Message;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/mes/TransArrivalStation.java b/src/main/java/com/zy/asrs/entity/mes/TransArrivalStation.java
new file mode 100644
index 0000000..6d0a263
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/mes/TransArrivalStation.java
@@ -0,0 +1,58 @@
+package com.zy.asrs.entity.mes;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+// 鍒扮珯瀹屾垚
+//@EqualsAndHashCode(callSuper = true)
+@Data
+public class TransArrivalStation {
+
+    // 浠诲姟缂栧彿
+    @JsonProperty("taskno")
+    @JSONField(name = "taskno")
+    private String taskno;
+    // 浠诲姟鍚嶇О
+    @JsonProperty("taskname")
+    @JSONField(name = "taskname")
+    private String taskname;
+    // 鐢熶骇璁㈠崟鍙�
+    @JsonProperty("OrderNo")
+    @JSONField(name = "OrderNo")
+    private String OrderNo;
+    // 鐢熶骇绾跨紪鐮�
+    @JsonProperty("ProductLineId")
+    @JSONField(name = "ProductLineId")
+    private String ProductLineId;
+    // 宸ヤ綅缂栫爜
+    @JsonProperty("StationID")
+    @JSONField(name = "StationID")
+    private String StationID;
+
+    // 鍒扮珯绫诲瀷锛�06锛氳閰嶉鏂欙紝07锛氳閰嶅叆搴擄紝08锛氳閰嶈浆搴�
+    @JsonProperty("Daotype")
+    @JSONField(name = "Daotype")
+    private String Daotype;
+    // 鎵樼洏鏉$爜
+    @JsonProperty("TuoPanId")
+    @JSONField(name = "TuoPanId")
+    private String TuoPanId;
+
+    // AGV缂栫爜
+    @JsonProperty("AgvCode")
+    @JSONField(name = "AgvCode")
+    private String AgvCode;
+    // 鐗╂枡缂栫爜
+    @JsonProperty("Itemno")
+    @JSONField(name = "Itemno")
+    private String Itemno;
+    // 闆朵欢鐮�
+    @JsonProperty("ItemBarcode")
+    @JSONField(name = "ItemBarcode")
+    private List<String> ItemBarcode;
+}
+
diff --git a/src/main/java/com/zy/asrs/entity/mes/TransInOutStationAllow.java b/src/main/java/com/zy/asrs/entity/mes/TransInOutStationAllow.java
new file mode 100644
index 0000000..73565ca
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/mes/TransInOutStationAllow.java
@@ -0,0 +1,13 @@
+package com.zy.asrs.entity.mes;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+// 鍏ョ珯鍏佽銆佺绔欏厑璁�
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TransInOutStationAllow extends TransParent {
+
+    // 鏄惁鍏佽锛孻 鍏佽锛汵锛屼笉鍏佽
+    private String status;
+}
diff --git a/src/main/java/com/zy/asrs/entity/mes/TransParent.java b/src/main/java/com/zy/asrs/entity/mes/TransParent.java
new file mode 100644
index 0000000..fc44cf7
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/mes/TransParent.java
@@ -0,0 +1,31 @@
+package com.zy.asrs.entity.mes;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+// 鍑哄叆绔欒姹傜户鎵跨埗绫伙細鍏ョ珯璇锋眰銆佸叆绔欏厑璁搞�佺绔欒姹傘�佺绔欏厑璁搞�佺绔欏畬鎴�
+@Data
+public class TransParent {
+
+    // 浠诲姟缂栧彿锛寃cs_task_header琛ㄤ腑鐨則ask_no
+    private String taskno;
+    // 浠诲姟鍚嶇О锛寃cs_task_header琛ㄤ腑鐨則ask_name
+    private String taskname;
+    // AGV缂栫爜
+    @JsonProperty("AgvCode")
+    @JSONField(name = "AgvCode")
+    private String AgvCode;
+    // 杩愯緭绫诲瀷
+    @JsonProperty("TransType")
+    @JSONField(name = "TransType")
+    private String TransType;
+    // 鐢熶骇绾跨紪鐮�
+    @JsonProperty("ProductLineId")
+    @JSONField(name = "ProductLineId")
+    private String ProductLineId;
+    // 宸ヤ綅缂栫爜
+    @JsonProperty("StationId")
+    @JSONField(name = "StationId")
+    private String StationId;
+}
diff --git a/src/main/java/com/zy/asrs/entity/mes/TransTask.java b/src/main/java/com/zy/asrs/entity/mes/TransTask.java
new file mode 100644
index 0000000..02204e0
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/mes/TransTask.java
@@ -0,0 +1,71 @@
+package com.zy.asrs.entity.mes;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+// MES杩愯緭浠诲姟
+@Data
+public class TransTask {
+
+    // 浠诲姟缂栧彿锛寃cs_task_header琛ㄤ腑鐨則ask_no
+    private String taskno;
+    // 浠诲姟鍚嶇О锛寃cs_task_header琛ㄤ腑鐨則ask_name
+    private String taskname;
+    // 鐢熶骇璁㈠崟鍙�
+    @JsonProperty("OrderNo")
+    @JSONField(name = "OrderNo")
+    private String OrderNo;
+    // 杩愯緭绫诲瀷锛�01锛氱┖鎵橈紝02锛氭瘺鍧紝03锛氭垚鍝侊紝04锛氳浆搴忥紝鏈帴鍙d负杞簭
+    @JsonProperty("TransType")
+    @JSONField(name = "TransType")
+    private String TransType;
+    // 褰撳墠宸ュ簭锛岄�氳繃褰撳墠浠诲姟
+    @JsonProperty("CurProcess")
+    @JSONField(name = "CurProcess")
+    private String CurProcess;
+    // 璧风偣缂栫爜
+    @JsonProperty("CurStationId")
+    @JSONField(name = "CurStationId")
+    private String CurStationId;
+    // 涓嬩竴宸ヤ綅锛岄粯璁よ鍒掍笅涓�宸ュ簭锛屽彲鎵嬪伐璋冩暣
+    @JsonProperty("NextProcess")
+    @JSONField(name = "NextProcess")
+    private String NextProcess;
+    // 缁堢偣缂栫爜
+    @JsonProperty("NextStationId")
+    @JSONField(name = "NextStationId")
+    private String NextStationId;
+    // 闆朵欢缂栫爜
+    @JsonProperty("Itemno")
+    @JSONField(name = "Itemno")
+    private String Itemno;
+    // 鏁伴噺
+    @JsonProperty("Qty")
+    @JSONField(name = "Qty")
+    private Integer Qty;
+    // 鐢熶骇绾跨紪鐮�
+    @JsonProperty("ProductLineId")
+    @JSONField(name = "ProductLineId")
+    private String ProductLineId;
+    // 鐗╂枡浜岀淮鐮�
+    @JsonProperty("ItemBarcode")
+    @JSONField(name = "ItemBarcode")
+    private List<String> ItemBarcode;
+    // 鎿嶄綔绫诲瀷锛�1 鏂板浠诲姟锛�2 淇敼浠诲姟锛�3 鍙栨秷浠诲姟锛涳紙RCS鎵ц鍚庢棤娉曞彇娑堬級
+    @JsonProperty("OperateType")
+    @JSONField(name = "OperateType")
+    private Integer OperateType;
+    // 鎸囧畾AGV鍘傚锛�1 娴峰悍锛�2 鍗庢檽锛涘崕鏅撲笌娴峰悍AGV杩愯浇鑳藉姏涓嶅悓锛孧ES鍙寜闇�姹傛寚瀹�
+    @JsonProperty("AgvFactory")
+    @JSONField(name = "AgvFactory")
+    private Integer AgvFactory;
+
+    // 鎵樼洏ID
+    @JsonProperty("TuoPanId")
+    @JSONField(name = "TuoPanId")
+    private String TuoPanId;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/mes/TransTaskFeedback.java b/src/main/java/com/zy/asrs/entity/mes/TransTaskFeedback.java
new file mode 100644
index 0000000..41451a8
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/mes/TransTaskFeedback.java
@@ -0,0 +1,17 @@
+package com.zy.asrs.entity.mes;
+
+import lombok.Data;
+
+// MES杩愯緭浠诲姟鍙嶉
+@Data
+public class TransTaskFeedback {
+
+    // 浠诲姟缂栧彿锛寃cs_task_header琛ㄤ腑鐨則ask_no
+    private String taskno;
+    // 浠诲姟鍚嶇О锛寃cs_task_header琛ㄤ腑鐨則ask_name
+    private String taskname;
+    // 浠诲姟鎵ц缁撴灉锛�1 瀹屾垚锛�2 澶辫触锛�
+    private Integer result;
+    // 澶辫触鍘熷洜
+    private String failMsg;
+}
diff --git a/src/main/java/com/zy/asrs/entity/rcs/RcsEqptNotify.java b/src/main/java/com/zy/asrs/entity/rcs/RcsEqptNotify.java
new file mode 100644
index 0000000..ee980cc
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/rcs/RcsEqptNotify.java
@@ -0,0 +1,16 @@
+package com.zy.asrs.entity.rcs;
+
+import lombok.Data;
+
+// 閫氱煡杩涘叆
+@Data
+public class RcsEqptNotify {
+
+    // 灏侀攣鍖虹紪鍙�
+    private String eqptCode;
+    // 鐢宠缂栧彿锛屽彲浣跨敤 UUID
+    private String taskCode;
+    // 浠诲姟鎵ц鐘舵�侊細鍙墿灞曟灇涓惧�笺�傞鍒舵灇涓惧�硷細1 鍙互杩涘叆灏侀攣鍖猴紱
+    private String actionStatus;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/rcs/RcsReporterEqpt.java b/src/main/java/com/zy/asrs/entity/rcs/RcsReporterEqpt.java
new file mode 100644
index 0000000..7f8a3ce
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/rcs/RcsReporterEqpt.java
@@ -0,0 +1,20 @@
+package com.zy.asrs.entity.rcs;
+
+import lombok.Data;
+
+// 璇锋眰杩涘叆灏侀攣鍖恒�佸叆绔欍�佺绔欑瓑
+@Data
+public class RcsReporterEqpt {
+
+    // 灏侀攣鍖虹紪鍙�
+    private String eqptCode;
+    // 灏侀攣鍖哄悕绉�
+    private String eqptName;
+    // 鐢宠缂栧彿锛屽彲浣跨敤 UUID
+    private String taskCode;
+    // 浠诲姟鎵ц鏂规硶锛屼笌璁惧鐩稿叧锛屽彲鎵╁睍鏋氫妇鍊笺�� 棰勫埗鏋氫妇鍊硷細APPLY_LOCK 鐢宠灏侀攣鍖猴紱RELEASE_EQPT 閲婃斁灏侀攣鍖猴紱
+    private String method;
+    // agv鍘傚锛�1 娴峰悍锛�2 鍗庢檽
+    private Integer agvFactory;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/rcs/RcsReporterTask.java b/src/main/java/com/zy/asrs/entity/rcs/RcsReporterTask.java
new file mode 100644
index 0000000..3fc7170
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/rcs/RcsReporterTask.java
@@ -0,0 +1,18 @@
+package com.zy.asrs.entity.rcs;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+
+// 浠诲姟鎵ц鍙嶉
+@Data
+public class RcsReporterTask {
+
+    // 浠诲姟鍙�
+    private String robotTaskCode;
+    // 褰撳墠鎵ц浠诲姟鐨勬満鍣ㄤ汉鍞竴鏍囪瘑銆�
+    private String singleRobotCode;
+    // 鐩爣璺緞搴忓垪锛�0 璧风偣搴忓彿锛�1 缁堢偣搴忓彿銆�
+    private Integer currentSeq;
+    // 璇︾粏淇℃伅
+    private JSONObject extra;
+}
diff --git a/src/main/java/com/zy/asrs/entity/rcs/RcsReturn.java b/src/main/java/com/zy/asrs/entity/rcs/RcsReturn.java
new file mode 100644
index 0000000..7f32fe5
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/rcs/RcsReturn.java
@@ -0,0 +1,20 @@
+package com.zy.asrs.entity.rcs;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+
+// 娴峰悍杩斿洖
+@Data
+public class RcsReturn {
+
+    // SUCCESS 鎴愬姛
+//    Err_TaskTypeNotSupport 浠诲姟绫诲瀷涓嶆敮鎸�
+//    Err_RobotGroupsNotMatch 鏈哄櫒浜鸿祫婧愮粍缂栧彿涓庝换鍔′笉鍖归厤锛屾棤娉曡皟搴�
+//    Err_RobotCodeNotMatch 鏈哄櫒浜虹紪鍙蜂笌浠诲姟涓嶅尮閰嶏紝鏃犳硶璋冨害
+//    Err_TargetRouteError 浠诲姟璺緞鍙傛暟鏈夎
+    private String code;
+
+    private String message;
+
+    private JSONObject data;
+}
diff --git a/src/main/java/com/zy/asrs/entity/rcs/RcsTaskCancel.java b/src/main/java/com/zy/asrs/entity/rcs/RcsTaskCancel.java
new file mode 100644
index 0000000..2c925b3
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/rcs/RcsTaskCancel.java
@@ -0,0 +1,17 @@
+package com.zy.asrs.entity.rcs;
+
+import lombok.Data;
+
+// 鍙栨秷浠诲姟
+@Data
+public class RcsTaskCancel {
+
+    // 浠诲姟鍙凤紝鍏ㄥ眬鍞竴
+    private String robotTaskCode;
+    // 浠诲姟鍙栨秷绫诲瀷
+    //鍙栨秷(鍘熻蒋鍙栨秷)
+    //CANCEL
+    //浜哄伐浠嬪叆(鍘熺‖鍙栨秷)
+    //DROP
+    private String cancelType;
+}
diff --git a/src/main/java/com/zy/asrs/entity/rcs/RcsTaskContinue.java b/src/main/java/com/zy/asrs/entity/rcs/RcsTaskContinue.java
new file mode 100644
index 0000000..87d8d7b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/rcs/RcsTaskContinue.java
@@ -0,0 +1,20 @@
+package com.zy.asrs.entity.rcs;
+
+import lombok.Data;
+
+// 缁х画鎵ц浠诲姟
+@Data
+public class RcsTaskContinue {
+
+    // 浠诲姟閾剧紪鍙�
+    private String robotTaskCode;
+    // 瑙﹀彂绫诲瀷锛�
+    //SITE 绔欑偣缂栧彿瑙﹀彂
+    //CARRIER 杞藉叿缂栧彿瑙﹀彂
+    //ROBOT 杞﹀彿瑙﹀彂
+    //TASK 浠诲姟閾剧紪鍙疯Е鍙�
+    private String triggerType;
+    // 涓� triggerType 瀵瑰簲鐨勮Е鍙戠紪鍙�
+    private String triggerCode;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/rcs/RcsTaskSubmit.java b/src/main/java/com/zy/asrs/entity/rcs/RcsTaskSubmit.java
new file mode 100644
index 0000000..eed3e7f
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/rcs/RcsTaskSubmit.java
@@ -0,0 +1,29 @@
+package com.zy.asrs.entity.rcs;
+
+import lombok.Data;
+
+import java.util.List;
+
+// RCS浠诲姟涓嬪彂
+@Data
+public class RcsTaskSubmit {
+
+    // 浠诲姟绫诲瀷锛屾灇涓惧�硷細TRANSPORT鎼繍銆�
+    private String taskType = "TRANSPORT";
+    // 鎵ц姝ラ闆嗗悎銆傛湰娆′换鍔℃満鍣ㄤ汉闇�瑕佹墽琛岀殑鍏抽敭璺緞锛屽簭鍙�0浠h〃璧风偣锛屽簭鍙�1浠h〃缁堢偣銆�
+    private List<RcsTaskTargetRoute> targetRoute;
+    // 浠诲姟鍞竴缂栧彿,濡傛灉涓虹┖锛岀郴缁熺敓鎴愪换鍔″彿骞惰繑鍥炪��
+    private String robotTaskCode;
+    // 浠诲姟鎵ц鐨勫垵濮嬩紭鍏堥『搴忥紝鏁板�艰秺澶э紝浼樺厛绾ц秺楂樸��
+    private Integer initPriority;
+    // 瑕佹眰璋冨害绯荤粺浠呭湪褰撳墠鎸囧畾鐨勮寖鍥村唴閫夋嫨鏈哄櫒浜烘墽琛岃浠诲姟銆傚彲鑳藉嚭鐜颁换鍔′笌鏈哄櫒浜虹被鍨嬩笉鍖归厤鐨勫紓甯革紝闇�瑕佷笟鍔$郴缁熺‘淇濅换鍔′笌鏈哄櫒浜虹被鍨嬬殑鍖归厤銆傚鏋滀笉鎸囧畾锛屽垯璋冨害绯荤粺浼氬湪鎵�鏈夊彲鐢ㄦ満鍣ㄤ汉鐨勮寖鍥村唴瀵绘壘鏈�浼樻柟妗堛��
+    // 鍥哄畾鏋氫妇鍊硷細 GROUPS 鏈哄櫒浜鸿祫婧愮粍缂栧彿锛汻OBOTS 鏈哄櫒浜虹紪鍙凤紱
+    private String robotType;
+    // 涓� robotType 鍖归厤鐨勮祫婧愮被鍨嬪敮涓�鏍囪瘑銆傛敮鎸佸崟涓拰澶氫釜缂栧彿銆傝嫢鍐欏叆澶氫釜缂栧彿鏃讹紝涔嬮棿鐢ㄩ�楀彿闅斿紑銆�
+    private String robotCode;
+    // 鑳藉惁鎵撴柇锛�1:鍙墦鏂紝璇ヨ揣鏋朵腑閫旀湁鍏朵粬浠诲姟鏃讹紝鎵撴柇褰撳墠浠诲姟銆�0:涓嶅彲鎵撴柇锛岃璐ф灦涓�旀湁鍏朵粬浠诲姟鏃讹紝涓嶈兘鎵撴柇褰撳墠浠诲姟銆傞粯璁や笉鍙墦鏂��
+    private String interrupt;
+    // 浠诲姟缁勭紪鍙凤紝鍏ㄥ眬鍞竴銆�
+    private String groupCode;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/rcs/RcsTaskTargetRoute.java b/src/main/java/com/zy/asrs/entity/rcs/RcsTaskTargetRoute.java
new file mode 100644
index 0000000..4083d9f
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/rcs/RcsTaskTargetRoute.java
@@ -0,0 +1,22 @@
+package com.zy.asrs.entity.rcs;
+
+import lombok.Data;
+
+// 浠诲姟璺嚎
+@Data
+public class RcsTaskTargetRoute {
+
+    // 鐩爣璺緞搴忓垪銆�0 璧风偣搴忓彿锛� 1 缁堢偣搴忓彿銆�
+    private Integer seq;
+    // 鐩爣绫诲瀷銆傚彲鎵╁睍鏋氫妇鍊笺�傞鍒舵灇涓惧�硷細SITE 绔欑偣鍒悕锛�
+    private String type = "SITE";
+    // 绔欑偣缂栧彿
+    private String code;
+    // 鏈哄櫒浜哄埌杈剧洰鏍囦綅缃悗鐨勬搷浣溿�傞鍒舵灇涓惧�硷細COLLECT鍙栬揣锛汥ELIVERY閫佽揣锛�
+    private String operation;
+    // 瑕佹眰璋冨害绯荤粺浠呭湪褰撳墠鎸囧畾鐨勮寖鍥村唴閫夋嫨鏈哄櫒浜烘墽琛岃姝ラ銆傚浐瀹氭灇涓惧�硷細GROUPS鏈哄櫒浜鸿祫婧愮粍缂栧彿锛汻OBOTS鏈哄櫒浜虹紪鍙凤紱
+    private String robotType;
+    // 涓� robotType 鍖归厤鐨勮祫婧愮被鍨嬪敮涓�鏍囪瘑銆�
+    private String robotCode;
+
+}
diff --git a/src/main/java/com/zy/asrs/enums/RcsRetMethodEnum.java b/src/main/java/com/zy/asrs/enums/RcsRetMethodEnum.java
new file mode 100644
index 0000000..6c4fdf9
--- /dev/null
+++ b/src/main/java/com/zy/asrs/enums/RcsRetMethodEnum.java
@@ -0,0 +1,38 @@
+package com.zy.asrs.enums;
+
+public enum RcsRetMethodEnum {
+
+    TASK_START("start", "浠诲姟寮�濮�"),
+    TASK_END("end", "浠诲姟瀹屾垚"),
+    TASK_OUT_BIN("outbin", "璧板嚭鍌ㄤ綅"),
+
+    APPLY_IN_STATION("applyInStation", "鍏ョ珯璇锋眰"),
+    APPLY_OFF_STATION("applyOutStation", "绂荤珯璇锋眰"),
+    ARRIVE_ON_STATION("arriveOnStation", "鍒扮珯瀹屾垚"),
+    ARRIVE_OFF_STATION("arriveOffStation", "绂荤珯瀹屾垚");
+
+    private String code;
+    private String message;
+
+    RcsRetMethodEnum(String code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public static RcsRetMethodEnum getEnum(String code) {
+        for (RcsRetMethodEnum method : RcsRetMethodEnum.values()) {
+            if (method.getCode().equals(code)) {
+                return method;
+            }
+        }
+        return null;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/mapper/AgvInfoMapper.java b/src/main/java/com/zy/asrs/mapper/AgvInfoMapper.java
new file mode 100644
index 0000000..b267eb2
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/AgvInfoMapper.java
@@ -0,0 +1,11 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.AgvInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface AgvInfoMapper extends BaseMapper<AgvInfo> {
+}
diff --git a/src/main/java/com/zy/asrs/mapper/BlockStationMapper.java b/src/main/java/com/zy/asrs/mapper/BlockStationMapper.java
new file mode 100644
index 0000000..504c4d8
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BlockStationMapper.java
@@ -0,0 +1,14 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.BlockStation;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BlockStationMapper extends BaseMapper<BlockStation> {
+
+    Integer addByBlockNo(@Param("blockNo")String blockNo, @Param("status")int status);
+}
diff --git a/src/main/java/com/zy/asrs/mapper/BlockTaskMapper.java b/src/main/java/com/zy/asrs/mapper/BlockTaskMapper.java
new file mode 100644
index 0000000..83c4135
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/BlockTaskMapper.java
@@ -0,0 +1,16 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.BlockTask;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BlockTaskMapper extends BaseMapper<BlockTask> {
+
+    BlockTask findTop();
+
+    BlockTask findByTaskCode(@Param("taskCode")String taskCode);
+}
diff --git a/src/main/java/com/zy/asrs/mapper/DigitalTwinMapper.java b/src/main/java/com/zy/asrs/mapper/DigitalTwinMapper.java
new file mode 100644
index 0000000..33f1999
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/DigitalTwinMapper.java
@@ -0,0 +1,26 @@
+package com.zy.asrs.mapper;
+
+import com.zy.asrs.entity.digitaltwin.DtDetainMatVo;
+import com.zy.asrs.entity.digitaltwin.DtInAndOutBoundVo;
+import com.zy.asrs.entity.digitaltwin.DtOrderVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface DigitalTwinMapper {
+
+    List<Double> overview(@Param("areaId")String areaId);
+
+    List<DtOrderVo> recentOrder(@Param("startTime")String startTime, @Param("endTime")String endTime);
+
+    List<DtInAndOutBoundVo> recentInBound(@Param("areaId")String areaId, @Param("startTime")String startTime, @Param("endTime")String endTime);
+
+    List<DtInAndOutBoundVo> recentOutBound(@Param("areaId")String areaId, @Param("startTime")String startTime, @Param("endTime")String endTime);
+
+    List<DtDetainMatVo> recentDetainMat(@Param("areaId")String areaId, @Param("startTime")String startTime,
+                                        @Param("pageIndex")Integer pageIndex, @Param("pageSize")Integer pageSize);
+}
diff --git a/src/main/java/com/zy/asrs/mapper/LocCountMapper.java b/src/main/java/com/zy/asrs/mapper/LocCountMapper.java
new file mode 100644
index 0000000..5456834
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/LocCountMapper.java
@@ -0,0 +1,24 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.LocCount;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface LocCountMapper extends BaseMapper<LocCount> {
+
+    List<LocCount> getByAreaAndDate(@Param("areaId")String areaId, @Param("startDate")int startDate, @Param("endDate")int endDate);
+
+    List<LocCount> getByDate(@Param("startDate")int startDate, @Param("endDate")int endDate);
+
+    Integer insertOrUpdate(@Param("model")LocCount model);
+
+    List<LocCount> totalLoc();
+
+    List<LocCount> useLoc();
+}
diff --git a/src/main/java/com/zy/asrs/mapper/MatItemBarcodeMapper.java b/src/main/java/com/zy/asrs/mapper/MatItemBarcodeMapper.java
new file mode 100644
index 0000000..9a92c11
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/MatItemBarcodeMapper.java
@@ -0,0 +1,11 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.MatItemBarcode;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface MatItemBarcodeMapper extends BaseMapper<MatItemBarcode> {
+}
diff --git a/src/main/java/com/zy/asrs/service/DigitalTwinService.java b/src/main/java/com/zy/asrs/service/DigitalTwinService.java
new file mode 100644
index 0000000..d56961f
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/DigitalTwinService.java
@@ -0,0 +1,70 @@
+package com.zy.asrs.service;
+
+import com.zy.asrs.entity.digitaltwin.*;
+
+import java.util.List;
+
+public interface DigitalTwinService {
+
+    /**
+     * 鎬昏锛氭�诲簱浣嶃�佸凡鐢ㄥ簱浣嶃�佸墿浣欏簱浣嶃�佷粖鏃ュ嚭搴撱�佷粖鏃ュ叆搴撱�佸墿浣欏簱浣�
+     *
+     * @param areaId
+     * @return
+     */
+    DtOverviewVo overview(String areaId);
+
+    /**
+     * 杩戞湡璁㈠崟锛岄粯璁�7澶�
+     *
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    List<DtOrderVo> order(String startDate, String endDate);
+
+    /**
+     * 杩戞湡鍑哄簱銆佸叆搴撴暟閲忥紝榛樿7澶�
+     *
+     * @param areaId
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    List<DtInAndOutBoundVo> inAndOutBound(String areaId, String startDate, String endDate);
+
+    /**
+     * 杩戞湡杩戞湡鍛嗘粸鍝佷俊鎭紝榛樿瓒呰繃30澶╀负鍛嗘粸鍝�
+     *
+     * @param areaId
+     * @param overDayNum
+     * @param pageIndex
+     * @param pageSize
+     * @return
+     */
+    List<DtDetainMatVo> recentDetainMat(String areaId, Integer overDayNum, Integer pageIndex, Integer pageSize);
+
+    /**
+     * 鏌ヨ搴撳瓨鍜屽簱浣嶈缁嗕俊鎭�
+     *
+     * @param areaId
+     * @return
+     */
+    List<DtLocDetailVo> warehouseDetail(String areaId);
+
+    /**
+     * 杩戞湡鍓╀綑搴撲綅鏁伴噺锛岄粯璁�7澶�
+     *
+     * @param areaId
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    List<DtLocVo> recentLoc(String areaId, String startDate, String endDate);
+
+    /**
+     * 瀹氭湡缁熻鍓╀綑搴撳瓨
+     *
+     */
+    void locNumCount();
+}
diff --git a/src/main/java/com/zy/asrs/service/MesService.java b/src/main/java/com/zy/asrs/service/MesService.java
new file mode 100644
index 0000000..f88f88b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/MesService.java
@@ -0,0 +1,150 @@
+package com.zy.asrs.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zy.asrs.entity.Task;
+import com.zy.asrs.entity.mes.*;
+import com.zy.asrs.entity.rcs.RcsReporterTask;
+
+public interface MesService {
+
+    /**
+     * 鐗╂枡淇℃伅鍚屾
+     *
+     * @param matRecvForm
+     * @return
+     */
+    MesReturn matInfoAndInBound(MesMatRecvForm matRecvForm);
+
+    /**
+     * 棰嗘枡鍏ュ簱鍙嶉
+     * 瑙﹀彂鏉′欢锛氱墿鏂欏悓姝ユ帴鍙e叆搴撳崟锛屽叆搴撳悗
+     * 鎺ㄩ�佹椂鏈猴細褰撹鍗曚腑鏈夌墿鏂欏叆搴撳悗锛堝簲璇ュ湪姣忔墭鍏ュ簱瀹屾垚鍚庯級鍒欐帹閫侊紝涓嶅繀绛夊叏閮ㄨ鍗曞畬鎴�
+     *
+     * @param orderNo
+     * @param zpallet
+     * @return
+     */
+    int recvFeedback(String orderNo, String zpallet);
+
+    /**
+     * 鍑哄簱鐢宠
+     *
+     * @param mesOutApply
+     * @return
+     */
+    int outBoundOrder(MesOutApply mesOutApply);
+
+    /**
+     * 鍑哄簱鐢宠锛堝彨鏂欙級锛岄綈濂楁�ч厤鐩�
+     *
+     * @param mesCallOutApply
+     * @return
+     */
+    int callOutBoundOrder(MesCallOutApply mesCallOutApply);
+
+    /**
+     * 鍑哄簱瀹屾垚
+     *
+     * @param orderNo
+     * @return
+     */
+    int outFeedbackByTuo(String orderNo, Task agvTask);
+
+//    /**
+//     * 鍑哄簱瀹屾垚
+//     *
+//     * @param orderNo
+//     * @return
+//     */
+//    int outFeedback(String orderNo);
+
+    /**
+     * 鍏ュ簱瀹屾垚
+     *
+     * @param orderNo
+     * @return
+     */
+    int inFeedback(String orderNo);
+
+    /**
+     * 鍏ュ簱鐢宠
+     *
+     * @param mesInApply
+     * @return
+     */
+    int inBoundOrder(MesInApply mesInApply);
+
+    /**
+     * 9.1涓嬪彂杩愯緭浠诲姟
+     *
+     * @param transTask
+     * @return
+     */
+    JSONObject submitTask(TransTask transTask);
+
+    /**
+     * 9.2杩斿洖浠诲姟鎵ц缁撴灉
+     *
+     * @param rcsReporterTask
+     * @return
+     */
+    int reporterTask(RcsReporterTask rcsReporterTask);
+
+    /**
+     * 9.8鐢宠鍗庢檽AGV杩涘叆鐢熶骇绾�
+     *
+     * @param apply
+     * @return
+     */
+    String applyInLine(TransParent apply);
+
+    /**
+     * 鍏ョ珯璇锋眰锛氳浆鍙慉GV->鍏ョ珯璇锋眰->缁橫ES
+     *
+     * @param apply
+     * @return
+     */
+    int applyInStation(TransParent apply);
+
+    /**
+     * 鍏ョ珯鍏佽锛氳浆鍙慚ES->鍏佽鍏ョ珯->缁橝GV
+     *
+     * @param allow
+     * @return
+     */
+    MesReturn allowInStation(TransInOutStationAllow allow);
+
+    /**
+     * 鍒扮珯瀹屾垚锛氳浆鍙慉GV->鍒扮珯瀹屾垚->缁橫ES
+     *
+     * @param arrivalStation
+     * @return
+     */
+    int arriveOnStation(TransArrivalStation arrivalStation);
+
+    /**
+     * 绂荤珯璇锋眰锛氳浆鍙慉GV->绂荤珯璇锋眰->缁橫ES
+     *
+     * @param apply
+     * @return
+     */
+    int applyOutStation(TransParent apply);
+
+    /**
+     * 绂荤珯鍏佽锛氳浆鍙慚ES->鍏佽绂荤珯->缁橝GV
+     *
+     * @param allow
+     * @return
+     */
+    MesReturn allowOutStation(TransInOutStationAllow allow);
+
+    /**
+     * 绂荤珯瀹屾垚锛氳浆鍙慉GV->绂荤珯瀹屾垚->缁橫ES
+     *
+     * @param apply
+     * @return
+     */
+    int outStation(TransParent apply);
+
+    MesReturn queryInventory(String itemno,String orderNo);
+}
diff --git a/src/main/java/com/zy/asrs/service/MobileService.java b/src/main/java/com/zy/asrs/service/MobileService.java
index 2455c90..389b487 100644
--- a/src/main/java/com/zy/asrs/service/MobileService.java
+++ b/src/main/java/com/zy/asrs/service/MobileService.java
@@ -99,4 +99,12 @@
      * @version 1.0
      */
     R OutCallAgv(AgvCallParams params, Long userId);
+
+    /**
+     * pda鍛煎彨绌烘枡妗嗗嚭搴�
+     * @param staNo 鍑哄簱绔欑偣
+     * @param locType 鎵樼洏绫诲瀷 1.绐勶紝2.瀹�
+     * @param userId 鐢ㄦ埛id
+     */
+    R callEmptyBinOutBound(String staNo, String locType, Long userId);
 }
diff --git a/src/main/java/com/zy/asrs/service/RcsService.java b/src/main/java/com/zy/asrs/service/RcsService.java
new file mode 100644
index 0000000..8fddd1c
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/RcsService.java
@@ -0,0 +1,66 @@
+package com.zy.asrs.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zy.asrs.entity.mes.TransInOutStationAllow;
+import com.zy.asrs.entity.mes.TransParent;
+import com.zy.asrs.entity.rcs.*;
+
+public interface RcsService {
+
+    /**
+     * 绠$悊灏侀攣鍖鸿繘鍏�
+     *
+     */
+    void managerBlock();
+
+    /**
+     * 2.1.2浠诲姟涓嬪彂鎺ュ彛
+     *
+     * @param rcsTaskSubmit
+     * @param rcsFactory 1 娴峰悍锛�2 鍗庢檽锛�
+     * @return
+     */
+    int submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory);
+
+    /**
+     * 2.1.3浠诲姟缁х画鎵ц鎺ュ彛
+     *
+     * @param rcsTaskContinue
+     * @param rcsFactory
+     * @return
+     */
+    int continueTask(RcsTaskContinue rcsTaskContinue, int rcsFactory);
+
+    /**
+     * 2.1.4浠诲姟鍙栨秷鎺ュ彛
+     *
+     * @param rcsTaskCancel
+     * @param rcsFactory
+     * @return
+     */
+    int cancelTask(RcsTaskCancel rcsTaskCancel, int rcsFactory);
+
+    /**
+     * 2.2.1浠诲姟鎵ц鍥為
+     *
+     * @param rcsReporterTask
+     * @return
+     */
+    RcsReturn reporterTask(RcsReporterTask rcsReporterTask);
+
+    /**
+     * 2.2.4璇锋眰澶栬鎺ュ彛锛岃姹傚皝閿佸尯
+     *
+     * @param rcsReporterEqpt
+     * @return
+     */
+    RcsReturn reporterEqpt(RcsReporterEqpt rcsReporterEqpt);
+
+    /**
+     * 9.7鐢宠杩涘叆鐢熶骇绾�
+     *
+     * @param apply
+     * @return
+     */
+    JSONObject hxApplyInLine(TransParent apply);
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/DigitalTwinServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/DigitalTwinServiceImpl.java
new file mode 100644
index 0000000..ede00fc
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/DigitalTwinServiceImpl.java
@@ -0,0 +1,272 @@
+package com.zy.asrs.service.impl;
+
+import com.zy.asrs.entity.LocCount;
+import com.zy.asrs.entity.LocDetl;
+import com.zy.asrs.entity.LocMast;
+import com.zy.asrs.entity.digitaltwin.*;
+import com.zy.asrs.mapper.DigitalTwinMapper;
+import com.zy.asrs.mapper.LocCountMapper;
+import com.zy.asrs.service.DigitalTwinService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class DigitalTwinServiceImpl implements DigitalTwinService {
+
+    @Resource
+    private DigitalTwinMapper digitalTwinMapper;
+    @Resource
+    private LocCountMapper locCountMapper;
+
+    /**
+     * 鎬昏锛氭�诲簱浣嶃�佸凡鐢ㄥ簱浣嶃�佸墿浣欏簱浣嶃�佷粖鏃ュ嚭搴撱�佷粖鏃ュ叆搴撱�佸墿浣欏簱浣�
+     *
+     * @param areaId
+     * @return
+     */
+    public DtOverviewVo overview(String areaId) {
+
+        List<Double> dbOverview = digitalTwinMapper.overview(areaId);
+        if (dbOverview != null && !dbOverview.isEmpty()){
+            DtOverviewVo dtOverviewVo = DtOverviewVo.builder()
+                .totalLoc((int)Math.round(dbOverview.get(0)))
+                    .useLoc((int)Math.round(dbOverview.get(1)))
+                    .remainingStock((int)Math.round(dbOverview.get(2)))
+                    .todayWarehousing((int)Math.round(dbOverview.get(3)))
+                    .todayOutbound((int)Math.round(dbOverview.get(4)))
+                    .build();
+            dtOverviewVo.setIdleLoc(dtOverviewVo.getTotalLoc() - dtOverviewVo.getUseLoc());
+            return dtOverviewVo;
+        }
+        return DtOverviewVo.builder().build();
+    }
+
+    /**
+     * 杩戞湡璁㈠崟锛岄粯璁�7澶�
+     *
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public List<DtOrderVo> order(String startDate, String endDate) {
+
+        String startTime;
+        String endTime;
+        if (startDate == null || endDate == null || startDate.isEmpty() || endDate.isEmpty()){
+            Date now = new Date();
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(now);
+            calendar.add(Calendar.DAY_OF_MONTH, -7);
+            Date start = calendar.getTime();
+
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+            endDate = sdf.format(now);
+            startDate = sdf.format(start);
+        }
+        startTime = startDate.substring(0, 4) + "-" + startDate.substring(4, 6) + "-" + startDate.substring(6, 8) + "00:00:00";
+        endTime = endDate.substring(0, 4) + "-" + endDate.substring(4, 6) + "-" + endDate.substring(6, 8) + "00:00:00";
+        List<DtOrderVo> dbOrder = digitalTwinMapper.recentOrder(startTime, endTime);
+        // 绌烘棩鏈熻ˉ鍏�
+
+
+        return dbOrder;
+    }
+
+    /**
+     * 杩戞湡鍑哄簱銆佸叆搴撴暟閲忥紝榛樿7澶�
+     *
+     * @param areaId
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public List<DtInAndOutBoundVo> inAndOutBound(String areaId, String startDate, String endDate) {
+
+        List<DtInAndOutBoundVo> dtInAndOutBoundVos = new ArrayList<>();
+
+        String startTime;
+        String endTime;
+        if (startDate == null || endDate == null || startDate.isEmpty() || endDate.isEmpty()){
+            Date now = new Date();
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(now);
+            calendar.add(Calendar.DAY_OF_MONTH, -7);
+            Date start = calendar.getTime();
+
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+            endDate = sdf.format(now);
+            startDate = sdf.format(start);
+        }
+        startTime = startDate.substring(0, 4) + "-" + startDate.substring(4, 6) + "-" + startDate.substring(6, 8) + "00:00:00";
+        endTime = endDate.substring(0, 4) + "-" + endDate.substring(4, 6) + "-" + endDate.substring(6, 8) + "00:00:00";
+        List<DtInAndOutBoundVo> dtInBoundVos = digitalTwinMapper.recentInBound(areaId, startTime, endTime);
+        List<DtInAndOutBoundVo> dtOutBoundVos = digitalTwinMapper.recentOutBound(areaId, startTime, endTime);
+
+        // 鏍煎紡鏁寸悊
+
+        return dtInAndOutBoundVos;
+    }
+
+    /**
+     * 杩戞湡杩戞湡鍛嗘粸鍝佷俊鎭紝榛樿瓒呰繃30澶╀负鍛嗘粸鍝�
+     *
+     * @param areaId
+     * @param overDayNum
+     * @param pageIndex
+     * @param pageSize
+     * @return
+     */
+    public List<DtDetainMatVo> recentDetainMat(String areaId, Integer overDayNum, Integer pageIndex, Integer pageSize) {
+
+        overDayNum = overDayNum == null ? 30 : overDayNum;
+        pageIndex = pageIndex == null ? 1 : pageIndex;
+        pageSize = pageSize == null ? 1000000 : pageSize;
+
+        Date now = new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(now);
+        calendar.add(Calendar.DAY_OF_MONTH, -overDayNum);
+        Date start = calendar.getTime();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String startTime = sdf.format(start);
+
+        List<DtDetainMatVo> dbDetainMats = digitalTwinMapper.recentDetainMat(areaId, startTime, pageIndex, pageSize);
+
+        return dbDetainMats;
+    }
+
+    /**
+     * 鏌ヨ搴撳瓨鍜屽簱浣嶈缁嗕俊鎭�
+     *
+     * @param areaId
+     * @return
+     */
+    public List<DtLocDetailVo> warehouseDetail(String areaId) {
+        List<DtLocDetailVo> locDetailVos = new ArrayList<>();
+
+        List<LocMast> locMasts = new ArrayList<>();
+        List<LocDetl> locDetls = new ArrayList<>();
+
+        for (LocMast locMast : locMasts) {
+            DtLocDetailVo dtLocDetailVo = new DtLocDetailVo();
+            dtLocDetailVo.setLocMast(locMast);
+            dtLocDetailVo.setLocNo(locMast.getLocNo());
+            dtLocDetailVo.setLocSts(locMast.getLocSts());
+            dtLocDetailVo.setRow1(locMast.getRow1());
+            dtLocDetailVo.setBay1(locMast.getBay1());
+            dtLocDetailVo.setLev1(locMast.getLev1());
+            for (LocDetl locDetl : locDetls) {
+                List<LocDetl> locDetl1 = locDetls.parallelStream().filter(a -> a.getLocNo().equals(locDetl.getLocNo())).collect(Collectors.toList());
+                if (locDetl1 != null && locDetl1.size() == 1) {
+                    dtLocDetailVo.setLocDetl(locDetl1.get(0));
+                    dtLocDetailVo.setAreaId(locDetl.getAreaId());
+                    dtLocDetailVo.setAreaName(locDetl.getAreaName());
+                }
+            }
+            locDetailVos.add(dtLocDetailVo);
+        }
+
+        return locDetailVos;
+    }
+
+    /**
+     * 杩戞湡鍓╀綑搴撲綅鏁伴噺锛岄粯璁�7澶�
+     *
+     * @param areaId
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public List<DtLocVo> recentLoc(String areaId, String startDate, String endDate) {
+
+        List<DtLocVo> locVos = new ArrayList<>();
+
+        if (startDate == null || endDate == null || startDate.isEmpty() || endDate.isEmpty()){
+            Date now = new Date();
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(now);
+            calendar.add(Calendar.DAY_OF_MONTH, -7);
+            Date start = calendar.getTime();
+
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+            endDate = sdf.format(now);
+            startDate = sdf.format(start);
+        }
+
+        List<LocCount> locCounts;
+        if(areaId.isEmpty()){
+            locCounts = locCountMapper.getByDate(Integer.parseInt(startDate), Integer.parseInt(endDate));
+        } else {
+            locCounts = locCountMapper.getByAreaAndDate(areaId, Integer.parseInt(startDate), Integer.parseInt(endDate));
+        }
+
+        for (LocCount locCount : locCounts) {
+            String date = locCount.getDate().toString();
+            String locDate = date.substring(0, 4) + "-" + date.substring(4, 6) + "-" + date.substring(6, 8);
+            DtLocVo dtLocVo = DtLocVo.builder()
+                    .locDate(locDate)
+                    .idleNum(locCount.getRemainNum())
+                    .build();
+            locVos.add(dtLocVo);
+        }
+
+        return locVos;
+    }
+
+    /**
+     * 瀹氭湡缁熻鍓╀綑搴撳瓨
+     *
+     */
+    public void locNumCount() {
+
+        List<LocCount> result = new ArrayList<>();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        String date = sdf.format(new Date());
+
+        List<LocCount> totalLoc = locCountMapper.totalLoc();
+        List<LocCount> useLoc = locCountMapper.useLoc();
+        for (LocCount locCount : totalLoc) {
+            LocCount locCount1 = new LocCount();
+            locCount1.setDate(Integer.valueOf(date));
+            locCount1.setAreaId(locCount.getAreaId());
+            locCount1.setLocNum(locCount1.getLocNum());
+            for (LocCount locCount2 : useLoc) {
+                if(locCount1.getAreaId().equals(locCount2.getAreaId())){
+                    locCount1.setRemainNum(locCount1.getLocNum() - locCount2.getLocNum());
+                }
+            }
+            result.add(locCount1);
+        }
+
+        for (LocCount locCount  : result) {
+            locCountMapper.insertOrUpdate(locCount);
+        }
+    }
+
+
+    // region 鏁板瓧瀛敓
+
+    // 鏁板瓧瀛敓鏁村悎
+
+    // 鏈哄櫒鐘舵�佹暣鍚�
+
+    // endregion
+
+
+
+    // region 绔嬪簱璋冨害
+
+    // 鍫嗗灈鏈哄瓨鍙�
+
+    // 杈撻�佺嚎鎷嶇収銆佺О閲�
+
+    // endregion
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java
index f2fddbd..14f9d42 100644
--- a/src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java
@@ -23,7 +23,8 @@
     }
     @Override
     public Page<Mat> getPage2(Page page, String tagId, Object matnr, Object maktx, Object specs) {
-        return page.setRecords(baseMapper.listByPage2(page, tagId, matnr, maktx, specs));
+
+        return page.setRecords(baseMapper.listByPage2(page, "1".equals(tagId) ? "2" : tagId, matnr, maktx, specs));
     }
 
 
diff --git a/src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java
new file mode 100644
index 0000000..de80492
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java
@@ -0,0 +1,1325 @@
+package com.zy.asrs.service.impl;
+
+import com.alibaba.excel.util.DateUtils;
+import com.alibaba.excel.util.StringUtils;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.common.Cools;
+import com.core.common.SnowflakeIdWorker;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.*;
+import com.zy.asrs.entity.mes.*;
+import com.zy.asrs.entity.param.CombParam;
+import com.zy.asrs.entity.param.EmptyPlateOutParam;
+import com.zy.asrs.entity.rcs.*;
+import com.zy.asrs.mapper.AgvInfoMapper;
+import com.zy.asrs.mapper.MatItemBarcodeMapper;
+import com.zy.asrs.service.*;
+import com.zy.asrs.utils.OrderInAndOutUtil;
+import com.zy.common.model.DetlDto;
+import com.zy.common.model.enums.WorkNoType;
+import com.zy.common.service.CommonService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.text.ParseException;
+import java.util.*;
+import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Slf4j
+@Service
+public class MesServiceImpl implements MesService {
+
+    @Value("${mes.url}")
+    public String MES_URL;
+    @Value("${wms.currentName}")
+    public String WMS_CURRENT_NAME;
+    @Value("${wms.wmsTransStartStation1}")
+    public String WMS_TRANS_START_STATION_1;
+    @Value("${wms.wmsTransStartStation2}")
+    public String WMS_TRANS_START_STATION_2;
+    @Value("${wms.wmsTransStartStation3}")
+    public String WMS_TRANS_START_STATION_3;
+    @Value("${mes.defaultUserId}")
+    public long defaultUserId;
+    @Value("${wms.zpalletId}")
+    public String WMS_ZPALLET_ID;
+
+    @Resource
+    private RcsService rcsService;
+    @Resource
+    private MatService matService;
+    @Resource
+    private TagService tagService;
+    @Resource
+    private OrderPakinService orderPakinService;
+    @Resource
+    private OrderDetlPakinService orderDetlPakinService;
+    @Resource
+    private OrderPakoutService orderPakoutService;
+    @Resource
+    private OrderDetlPakoutService orderDetlPakoutService;
+    @Resource
+    private WaitPakinService waitPakinService;
+    @Resource
+    private TaskService taskService;
+    @Resource
+    private TaskDetlService taskDetlService;
+    @Resource
+    private SnowflakeIdWorker snowflakeIdWorker;
+    @Resource
+    private CommonService commonService;
+    @Resource
+    private AgvInfoMapper agvInfoMapper;
+    @Resource
+    private WorkService workService;
+    @Resource
+    private MatItemBarcodeMapper matItemBarcodeMapper;
+    @Resource
+    private LocMastService locMastService;
+
+    @Resource
+    private LocDetlService locDetlService;
+
+    @Resource
+    private MobileService mobileService;
+
+
+    // region MES鎺ュ彛
+
+    /**
+     * 鐗╂枡淇℃伅鍚屾锛孧ES->WMS
+     * 鍔熻兘锛氬悓姝ョ墿鏂欎俊鎭�->鐢熸垚鍏ュ簱鍗�
+     * 鍚庣画娴佺▼锛氬叆搴撴椂锛岄渶瑕佸疄鏃惰皟鐢╮ecvFeedback杩斿洖鍏ュ簱鏁伴噺
+     *
+     * @param matRecvForm
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public MesReturn matInfoAndInBound(MesMatRecvForm matRecvForm) throws CoolException {
+
+        MesReturn mesReturn = new MesReturn();
+
+        // 1銆佺墿鏂欎俊鎭悓姝�
+        int matSuccess = 0;
+        for (MesMatInfo mesMatInfo : matRecvForm.getItemdata()) {
+            if (synMatInfo(mesMatInfo) == 1) {
+                matSuccess++;
+            } else {
+                throw new CoolException("鍚屾鐗╂枡淇℃伅澶辫触");
+            }
+        }
+
+        // 2銆佺敓鎴愬叆搴撳崟
+        if (inBoundOrder_List(matRecvForm) == 1) {
+            mesReturn.setSuccess("1");
+            mesReturn.setMessage("");
+        } else {
+            throw new CoolException("鍚屾鐗╂枡淇℃伅锛岀敓鎴愬叆搴撳崟澶辫触");
+        }
+
+        return mesReturn;
+    }
+
+    /**
+     * 鏂板銆佷慨鏀圭墿鏂欎俊鎭�
+     *
+     * @param mesMatInfo
+     * @return 1 鎴愬姛锛�-1 淇濆瓨鐗╂枡绫诲瀷澶辫触锛�-2 淇濆瓨鐗╂枡澶辫触锛�
+     * @throws ParseException
+     */
+    public int synMatInfo(MesMatInfo mesMatInfo) {
+
+        // 瑙勫垯瀹氫箟锛氶粯璁ょ2灞備负搴撳悕锛堝锛氬姞宸ュ簱锛夛紝绗�3灞備负鍚屾鐨勭墿鏂欑被鍨�
+        long secondPath = 2;
+        String secondParentName = WMS_CURRENT_NAME;
+        Date now = new Date();
+
+        // 鐗╂枡绫诲瀷鏇存柊
+        long tagId = 0;
+        EntityWrapper<Tag> wrapper = new EntityWrapper<>();
+        wrapper.eq("name", mesMatInfo.getItemType());
+        Tag tag = tagService.selectByName(mesMatInfo.getItemType(), 3);
+        if (tag == null || StringUtils.isEmpty(tag.getName())) {
+            Tag newTag = new Tag();
+            newTag.setName(mesMatInfo.getItemType());
+            newTag.setParentId(secondPath);
+            newTag.setParentName(secondParentName);
+            newTag.setPath("2");
+            newTag.setPathName(secondParentName);
+            newTag.setLevel(3);
+            newTag.setStatus(1);
+            newTag.setCreateBy(defaultUserId);
+            newTag.setCreateTime(now);
+            newTag.setUpdateBy(defaultUserId);
+            newTag.setUpdateTime(now);
+
+            if (!tagService.insert(newTag))
+                return -1;
+            tagId = newTag.getId();
+        } else {
+            tagId = tag.getId();
+        }
+
+        // 鐗╂枡鏇存柊
+        if (tagId > 0) {
+            //        tagId = tagService.selectByName(mesMatInfo.getItem_type(), 3).getId();
+            Mat mat = matService.selectByMatnr(mesMatInfo.getItemNo());
+            Mat newMat = new Mat();
+            newMat.setMatnr(mesMatInfo.getItemNo());
+            newMat.setMaktx(mesMatInfo.getDescription());
+            newMat.setTagId(tagId);
+            newMat.setLocType(tagId);   //locType
+            newMat.setSpecs(mesMatInfo.getSpecification());
+            newMat.setUnit(mesMatInfo.getUnitOfMeasure());
+            newMat.setModel(mesMatInfo.getClassificationCode());
+            newMat.setMemo(JSONObject.toJSONString(mesMatInfo));
+            newMat.setCreateBy(defaultUserId);
+            newMat.setCreateTime(now);
+            newMat.setUpdateBy(defaultUserId);
+            newMat.setUpdateTime(now);
+            newMat.setStatus(1);
+            if (mat == null) {
+                if (!matService.insert(newMat))
+                    return -2;
+            } else {
+                JSONObject dbMemo = JSONObject.parseObject(mat.getMemo());
+                dbMemo.remove("OrderNo");
+                dbMemo.remove("qty");
+                dbMemo.remove("ItemBarcode");
+                JSONObject newMemo = JSONObject.parseObject(newMat.getMemo());
+                newMemo.remove("OrderNo");
+                newMemo.remove("qty");
+                dbMemo.remove("ItemBarcode");
+                if (!dbMemo.equals(newMemo)) {
+                    newMat.setId(mat.getId());
+                    if (!matService.updateById(newMat))
+                        return -2;
+                }
+            }
+        } else {
+            return -1;
+        }
+
+        return 1;
+    }
+
+    /**
+     * 鐗╂枡鍚屾鍏ュ簱鍗曪紝鎸塐rderNo鐢熸垚澶氫釜璁㈠崟
+     *
+     *
+     * @param matRecvForm
+     * @return
+     */
+    public int inBoundOrder_List(MesMatRecvForm matRecvForm){
+
+        long docType = 4;   // docType鏍规嵁搴撶被鍨嬬‘瀹�
+        long settle = 1;
+        Date now = new Date();
+
+        // 鎸塐rderNo鍒嗙粍锛岀劧鍚庡啀鐢熸垚鍏ュ簱鍗�
+        List<MesMatInfo> mesInApply = matRecvForm.getItemdata();
+        Map<String, List<MesMatInfo>> map = mesInApply.stream().collect(Collectors.groupingBy(MesMatInfo::getOrderNo));
+        for (Map.Entry<String, List<MesMatInfo>> entry : map.entrySet()) {
+            List<MesMatInfo> list = entry.getValue();
+
+            // 鏍¢獙璁㈠崟鏄惁閲嶅
+            OrderPakin order = orderPakinService.selectByNo(entry.getKey());
+            if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
+                return -1;
+            }
+
+            // 鐢熸垚璁㈠崟
+            JSONObject newMemo = new JSONObject();
+            newMemo.put("sourceNo", matRecvForm.getSourceNo());
+            newMemo.put("sourceName", matRecvForm.getSourceName());
+            newMemo.put("operuser", matRecvForm.getOperuser());
+            newMemo.put("itemdata", list);
+
+            OrderPakin orderPakin = new OrderPakin();
+            orderPakin.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
+            orderPakin.setOrderNo(entry.getKey());
+            orderPakin.setOrderTime(com.core.common.DateUtils.convert(now));
+            orderPakin.setDocType(docType);
+            orderPakin.setSettle(settle);
+            orderPakin.setStatus(1);
+            orderPakin.setCreateBy(defaultUserId);
+            orderPakin.setCreateTime(now);
+            orderPakin.setUpdateBy(defaultUserId);
+            orderPakin.setUpdateTime(now);
+            orderPakin.setMemo(newMemo.toJSONString());  //涓洪鏂欏叆搴撳畬鎴愬弽棣堜繚瀛�   JSONObject.toJSONString(matRecvForm)
+            orderPakin.setPakinPakoutStatus(1);
+            if (!orderPakinService.insert(orderPakin)) {
+                log.error("MES淇濆瓨鍏ュ簱璁㈠崟涓绘。澶辫触");
+                throw new CoolException("淇濆瓨鍏ュ簱璁㈠崟涓绘。澶辫触");
+            }
+
+            // 鐢熸垚鏄庣粏
+            for (MesMatInfo mesMat : list) {
+                Mat mat = matService.selectByMatnr(mesMat.getItemNo());
+                OrderDetlPakin orderDetlPakin = new OrderDetlPakin();
+                orderDetlPakin.setOrderId(orderPakin.getId());
+                orderDetlPakin.setOrderNo(orderPakin.getOrderNo());
+                orderDetlPakin.setAnfme(Double.valueOf(mesMat.getQty()));
+                orderDetlPakin.setQty(0.0);
+                orderDetlPakin.setMatnr(mat.getMatnr());
+                orderDetlPakin.setMaktx(mat.getMaktx());
+                orderDetlPakin.setSpecs(mat.getSpecs());
+                orderDetlPakin.setModel(mat.getModel());
+                orderDetlPakin.setStandby1(JSONObject.toJSONString(mesMat.getItemBarcode()));   // 闆朵欢浜岀淮鐮�
+                orderDetlPakin.setStandby2("1");  //淇濆瓨榻愬鎬ф鏌ユ爣璇嗭紝1 妫�鏌ワ紱0 涓嶆鏌ワ紱
+                orderDetlPakin.setCreateBy(defaultUserId);
+                orderDetlPakin.setCreateTime(now);
+                orderDetlPakin.setUpdateBy(defaultUserId);
+                orderDetlPakin.setUpdateTime(now);
+                orderDetlPakin.setStatus(1);
+                orderDetlPakin.setPakinPakoutStatus(1);
+                if (!orderDetlPakinService.insert(orderDetlPakin)) {
+                    log.error("MES淇濆瓨鍏ュ簱璁㈠崟鏄庣粏妗eけ璐�1");
+                    throw new CoolException("淇濆瓨鍏ュ簱璁㈠崟鏄庣粏妗eけ璐�1");
+                }
+            }
+        }
+
+        return 1;
+    }
+
+    /**
+     * 棰嗘枡鍏ュ簱鍙嶉
+     * 瑙﹀彂鏉′欢锛氱墿鏂欏悓姝ユ帴鍙e叆搴撳崟锛屽叆搴撳悗
+     * 鎺ㄩ�佹椂鏈猴細褰撹鍗曚腑鏈夌墿鏂欏叆搴撳悗锛堝簲璇ュ湪姣忔墭鍏ュ簱瀹屾垚鍚庯紝鍙互鍦ㄦ洿鏂癘rderDetlPakin涔嬪悗锛夊垯鎺ㄩ�侊紝涓嶇瓑鍏ㄩ儴璁㈠崟瀹屾垚
+     *
+     * @param orderNo
+     * @param zapplet
+     * @return
+     */
+    public int recvFeedback(String orderNo, String zapplet) {
+
+        OrderPakin order = orderPakinService.selectByNo(orderNo);
+        if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
+            List<MesRecvFeedback.MesRecvFeedbackItem> list = new ArrayList<>();
+            JSONObject dbMemo = JSONObject.parseObject(order.getMemo());
+
+            // 浠庣粍鎵樹俊鎭腑鏌ヨ鍏ュ簱鐨勪俊鎭�
+            EntityWrapper<WaitPakin> waitPakinEntityWrapper = new EntityWrapper<>();
+            waitPakinEntityWrapper.eq("zpallet", zapplet);
+            List<WaitPakin> zpalletMat = waitPakinService.selectList(waitPakinEntityWrapper);
+
+            EntityWrapper<OrderDetlPakin> wrapper = new EntityWrapper<>();
+            wrapper.eq("order_no", orderNo);
+            List<OrderDetlPakin> orderDetlPakins = orderDetlPakinService.selectList(wrapper);
+            if (orderDetlPakins != null && !orderDetlPakins.isEmpty()) {
+                for (OrderDetlPakin orderDetl : orderDetlPakins) {
+                    for (WaitPakin zMat : zpalletMat) {
+                        if (orderDetl.getMatnr().equals(zMat.getMatnr())) {
+                            MesRecvFeedback.MesRecvFeedbackItem item = new MesRecvFeedback.MesRecvFeedbackItem();
+                            item.setItemNo(orderDetl.getMatnr());
+                            item.setOrderNo(orderNo);
+                            item.setQty(orderDetl.getAnfme().intValue());
+                            item.setRealQty(zMat.getAnfme().intValue());
+                            // 鍥炰紶鎵樼洏缁戝畾鐨勯浂浠朵簩缁寸爜
+                            EntityWrapper<MatItemBarcode> matItemBarcodeEntityWrapper = new EntityWrapper<>();
+                            matItemBarcodeEntityWrapper.eq("zapplet", zapplet).eq("status", 1);
+                            List<MatItemBarcode> barcodes = matItemBarcodeMapper.selectList(matItemBarcodeEntityWrapper);
+                            if (barcodes != null) {
+                                List<String> itemBarcode = new ArrayList<>();
+                                for (MatItemBarcode barcode : barcodes) {
+                                    itemBarcode.add(barcode.getItemBarcode());
+                                }
+                                item.setItemBarcode(itemBarcode);
+                                list.add(item);
+                            }
+                        }
+                    }
+                }
+            }
+
+            MesRecvFeedback mesRecvFeedback = new MesRecvFeedback();
+            mesRecvFeedback.setSourceNo(dbMemo.getString("sourceNo"));
+            mesRecvFeedback.setOperuser(dbMemo.getString("operuser"));
+            mesRecvFeedback.setItemdata(list);
+
+            String url = MES_URL + "MaterialReceiptAndReturn";
+            String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(mesRecvFeedback));
+            if (!StringUtils.isEmpty(response) && response.contains("Success")){
+                MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+                if("1".equals(mesReturn.getSuccess())) {
+                    return 1;
+                }
+            }
+        }
+
+        return 0;
+    }
+
+    /**
+     * 鍑哄簱鐢宠锛屽姞宸ュ簱銆佸垁鍏峰簱
+     * 鍑哄簱鍚庨渶瑕佽嚜鍔ㄥ懠鍙獳GV閫佽揣
+     * 鍑哄簱瑙勫垯锛氶渶瑕佹寜闆朵欢浜岀淮鐮侊紙涓�浠朵竴鐮侊級鍑哄簱锛屾暣鎵樺嚭搴擄紝璇ユ墭涓婃湁鍏朵粬鐗╂枡涔熶竴璧峰嚭搴擄紝浠栦滑鍚庢湡浼氬啀鍏ュ簱
+     *
+     * @param mesOutApply
+     * @return 1 鎴愬姛锛�-1 璁㈠崟閲嶅锛�
+     */
+    public int outBoundOrder(MesOutApply mesOutApply){
+
+        // 绌烘墭鍑哄簱
+        if (StringUtils.isEmpty(mesOutApply.getOrderNo()) && "01".equals(mesOutApply.getTransType())) {
+            // 鐢熸垚绌烘墭鍑哄簱浠诲姟
+            mobileService.callEmptyBinOutBound(WMS_TRANS_START_STATION_1,"1",defaultUserId);
+
+            try {
+                if (!StringUtils.isEmpty(mesOutApply.getTaskno()) && !StringUtils.isEmpty(mesOutApply.getStationId())) {
+                    TransTask transTask = new TransTask();
+                    transTask.setTaskno(mesOutApply.getTaskno());
+                    transTask.setTaskname(mesOutApply.getTaskname());
+                    transTask.setOrderNo(mesOutApply.getOrderNo());
+                    transTask.setTransType(mesOutApply.getTransType());
+                    transTask.setCurStationId(WMS_TRANS_START_STATION_1);
+                    transTask.setNextProcess(mesOutApply.getProductLineId());
+                    transTask.setNextStationId(mesOutApply.getStationId());
+                    transTask.setItemno(WMS_ZPALLET_ID);  // 鍥哄畾涓虹┖鎵樼殑缂栫爜
+                    transTask.setQty(1);    // 绌烘墭鍙嚭1涓�
+                    transTask.setProductLineId(mesOutApply.getProductLineId());
+                    transTask.setOperateType(1);
+                    transTask.setAgvFactory(1);
+                    JSONObject sendAgvTask = submitTask(transTask);
+                    if (!"1".equals(sendAgvTask.getString("Success"))) {
+                        log.error("鍑哄簱涓嬪彂agv杩愯緭浠诲姟澶辫触锛歿}", JSONObject.toJSONString(transTask));
+                    }
+                }
+            } catch (Exception e) {
+                log.error("涓嬪彂AGV杩愯緭浠诲姟澶辫触", e);
+            }
+
+            return 1;
+        } else {    // 姣涘澂锛堢墿鏂欙級鍑哄簱
+            // docType鏍规嵁搴撶被鍨嬬‘瀹�
+            long docType = 7;
+            long settle = 1;
+
+            // 鏍¢獙璁㈠崟鏄惁閲嶅
+            OrderPakout order = orderPakoutService.selectByNo(mesOutApply.getOrderNo());
+            if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
+                log.error("鍑哄簱璁㈠崟鍙烽噸澶嶏細{}",mesOutApply.getOrderNo());
+                return -1;
+            }
+
+            // 鐢熸垚璁㈠崟
+            Date now = new Date();
+            OrderPakout orderPakout = new OrderPakout();
+            orderPakout.setUuid( String.valueOf(snowflakeIdWorker.nextId()));
+            orderPakout.setOrderNo(mesOutApply.getOrderNo());
+            orderPakout.setOrderTime(com.core.common.DateUtils.convert(now));
+            orderPakout.setDocType(docType);
+            orderPakout.setSettle(settle);
+            orderPakout.setStatus(1);
+            orderPakout.setCreateBy(defaultUserId);
+            orderPakout.setCreateTime(now);
+            orderPakout.setUpdateBy(defaultUserId);
+            orderPakout.setUpdateTime(now);
+            orderPakout.setMemo(JSONObject.toJSONString(mesOutApply));
+            orderPakout.setPakinPakoutStatus(2);
+            if (!orderPakoutService.insert(orderPakout)) {
+                log.error("MES淇濆瓨鍑哄簱璁㈠崟涓绘。澶辫触");
+                throw new CoolException("淇濆瓨鍑哄簱璁㈠崟涓绘。澶辫触");
+            }
+
+            // 鐢熸垚鏄庣粏
+            Mat mat = matService.selectByMatnr(mesOutApply.getItemno());
+            OrderDetlPakout orderDetlPakout = new OrderDetlPakout();
+            orderDetlPakout.setOrderId(orderPakout.getId());
+            orderDetlPakout.setOrderNo(orderPakout.getOrderNo());
+            orderDetlPakout.setAnfme(Double.valueOf(mesOutApply.getQty()));
+            orderDetlPakout.setQty(0.0);
+            orderDetlPakout.setMatnr(mat.getMatnr());
+            orderDetlPakout.setMaktx(mat.getMaktx());
+            orderDetlPakout.setSpecs(mat.getSpecs());
+            orderDetlPakout.setModel(mat.getModel());
+            orderDetlPakout.setStandby1(barCodeListToStr(mesOutApply.getItemBarcode()));
+            orderDetlPakout.setCreateBy(defaultUserId);
+            orderDetlPakout.setCreateTime(now);
+            orderDetlPakout.setUpdateBy(defaultUserId);
+            orderDetlPakout.setUpdateTime(now);
+            orderDetlPakout.setStatus(1);
+            orderDetlPakout.setPakinPakoutStatus(2);
+            if (!orderDetlPakoutService.insert(orderDetlPakout)) {
+                log.error("MES淇濆瓨鍑哄簱璁㈠崟鏄庣粏妗eけ璐�");
+                throw new CoolException("淇濆瓨鍑哄簱璁㈠崟鏄庣粏妗eけ璐�");
+            }
+
+            // TODO锛氳嫢AGV鍜岃緭閫佺嚎娌℃湁瀹夊叏浜や簰锛屽垯瑕佷繚璇佺珛搴撳嚭璐у畬鎴愬悗鍐嶅懠鍙獳GV銆�
+            // 绔嬪簱鐢熸垚璁㈠崟鍚庯紝鑷姩璋冨害AGV杩愰�佸埌绔欑偣锛岀洰鍓嶅鎵樼敓鎴愬涓��
+            try {
+                if (!StringUtils.isEmpty(mesOutApply.getTaskno()) && !StringUtils.isEmpty(mesOutApply.getStationId())) {
+                    // 鎸夐浂浠朵簩缁寸爜鏌ヨ鏈夊嚑涓墭锛屽鎵樼敓鎴愬涓换鍔★紝姣忔墭瀵瑰簲闆朵欢浜岀淮鐮�
+                    String barCode = barCodeListToStr(mesOutApply.getItemBarcode());
+                    EntityWrapper<MatItemBarcode> matItemBarcodeEntityWrapper = new EntityWrapper<>();
+                    matItemBarcodeEntityWrapper.in("item_barcode", barCode);
+                    List<MatItemBarcode> barcodes = matItemBarcodeMapper.selectList(matItemBarcodeEntityWrapper);
+                     if (barcodes != null) {
+                        Map<String, List<MatItemBarcode>> map = barcodes.stream().collect(Collectors.groupingBy(MatItemBarcode::getZapplet));
+                        for (Map.Entry<String, List<MatItemBarcode>> entry : map.entrySet()) {
+                            List<MatItemBarcode> list = entry.getValue();
+                            List<String> codes = new ArrayList<>();
+                            for (MatItemBarcode zapllet : list) {
+                                codes.add(zapllet.getItemBarcode());
+                            }
+
+                            TransTask transTask = new TransTask();
+                            transTask.setTaskno(mesOutApply.getTaskno());
+                            transTask.setTaskname(mesOutApply.getTaskname());
+                            transTask.setOrderNo(mesOutApply.getOrderNo());
+                            transTask.setTransType(mesOutApply.getTransType());
+                            transTask.setCurStationId(WMS_TRANS_START_STATION_3);
+                            transTask.setNextProcess(mesOutApply.getProductLineId());
+                            transTask.setNextStationId(mesOutApply.getStationId());
+                            transTask.setItemno(mesOutApply.getItemno());
+                            transTask.setQty(list.size());
+                            transTask.setProductLineId(mesOutApply.getProductLineId());
+                            transTask.setItemBarcode(codes);
+                            transTask.setTuoPanId(entry.getKey());
+                            transTask.setOperateType(1);
+                            transTask.setAgvFactory(1);
+                            JSONObject sendAgvTask = submitTask(transTask);
+                            if (!"1".equals(sendAgvTask.getString("Success"))) {
+                                log.error("鍑哄簱涓嬪彂agv杩愯緭浠诲姟澶辫触", JSONObject.toJSONString(transTask));
+                            }
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                log.error("涓嬪彂AGV杩愯緭浠诲姟澶辫触", e);
+            }
+        }
+
+        return 1;
+    }
+
+    /**
+     * 鍏ュ簱鐢宠
+     * 鏀跺埌鍏ュ簱鐢宠鍚庤嚜鍔ㄥ懠鍙獳GV鍙栬揣
+     *
+     * @param mesInApply
+     */
+    @Transactional
+    public int inBoundOrder(MesInApply mesInApply){
+
+        // 绌烘墭鍥炲簱
+        if (StringUtils.isEmpty(mesInApply.getOrderNo()) && StringUtils.isEmpty(mesInApply.getItemno())) {
+                if (!StringUtils.isEmpty(mesInApply.getTaskno()) && !StringUtils.isEmpty(mesInApply.getStationID())) {
+                    TransTask transTask = new TransTask();
+                    transTask.setTaskno(mesInApply.getTaskno());
+                    transTask.setTaskname(mesInApply.getTaskname());
+                    transTask.setOrderNo(mesInApply.getOrderNo());
+                    transTask.setTransType(mesInApply.getTransType());
+                    transTask.setCurProcess(mesInApply.getProductLineId());
+                    transTask.setCurStationId(mesInApply.getStationID());
+                    transTask.setNextStationId(WMS_TRANS_START_STATION_2);
+                    transTask.setItemno(WMS_ZPALLET_ID);  // 鍥哄畾涓虹┖鎵樼殑缂栫爜
+                    transTask.setQty(1);    // 绌烘墭鍙洖1涓�
+                    transTask.setProductLineId(mesInApply.getProductLineId());
+                    transTask.setOperateType(1);
+                    transTask.setAgvFactory(1);
+                    JSONObject sendAgvTask = submitTask(transTask);
+                    if (!"1".equals(sendAgvTask.getString("Success"))) {
+                        log.error("鍑哄簱涓嬪彂agv杩愯緭浠诲姟澶辫触,{}", JSONObject.toJSONString(transTask));
+                        return 2;
+                    }
+                } else {
+                    log.error("鏃犱换鍔″彿锛歿}锛屾垨鏃犵墿鏂欑紪鐮�:{}",mesInApply.getTaskno(),mesInApply.getItemno() );
+                    return 2;
+                }
+
+            return 1;
+        } else {    // 姣涘澂銆佹垚鍝佸洖搴�
+            // docType鏍规嵁搴撶被鍨嬬‘瀹�
+            long docType = 3;
+            long settle = 1;
+
+            // 鏍¢獙璁㈠崟鏄惁閲嶅
+            OrderPakin order = orderPakinService.selectByNo(mesInApply.getOrderNo());
+            if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
+                log.error("璁㈠崟閲嶅锛歿}", mesInApply.getOrderNo());
+                return 2;
+            }
+
+            // 鐢熸垚璁㈠崟
+            Date now = new Date();
+            OrderPakin orderPakin = new OrderPakin();
+            orderPakin.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
+            orderPakin.setOrderNo(mesInApply.getOrderNo());
+            orderPakin.setOrderTime(com.core.common.DateUtils.convert(now));
+            orderPakin.setDocType(docType);
+            orderPakin.setSettle(settle);
+            orderPakin.setStatus(1);
+            orderPakin.setCreateBy(defaultUserId);
+            orderPakin.setCreateTime(now);
+            orderPakin.setUpdateBy(defaultUserId);
+            orderPakin.setUpdateTime(now);
+            orderPakin.setMemo(JSONObject.toJSONString(mesInApply));  //涓哄嚭搴撳畬鎴愬弽棣堜繚瀛�
+            orderPakin.setPakinPakoutStatus(1);
+            orderPakinService.insert(orderPakin);
+
+            // 鐢熸垚鏄庣粏
+            Mat mat = matService.selectByMatnr(mesInApply.getItemno());
+            OrderDetlPakin orderDetlPakin = new OrderDetlPakin();
+            orderDetlPakin.setOrderId(orderPakin.getId());
+            orderDetlPakin.setOrderNo(orderPakin.getOrderNo());
+            orderDetlPakin.setAnfme(Double.valueOf(mesInApply.getQty()));
+            orderDetlPakin.setQty(0.0);
+            orderDetlPakin.setMatnr(mat.getMatnr());
+            orderDetlPakin.setMaktx(mat.getMaktx());
+            orderDetlPakin.setSpecs(mat.getSpecs());
+            orderDetlPakin.setModel(mat.getModel());
+            if (mesInApply.getProductInfo() != null) {
+                orderDetlPakin.setStandby1(JSONObject.toJSONString(mesInApply.getProductInfo())); //闆朵欢璇︽儏瀛樺湪1
+            }
+            orderDetlPakin.setStandby2("0");  //淇濆瓨榻愬鎬ф鏌ユ爣璇嗭紝1 妫�鏌ワ紱0 涓嶆鏌ワ紱
+            orderDetlPakin.setCreateBy(defaultUserId);
+            orderDetlPakin.setCreateTime(now);
+            orderDetlPakin.setUpdateBy(defaultUserId);
+            orderDetlPakin.setUpdateTime(now);
+            orderDetlPakin.setStatus(1);
+            orderDetlPakin.setPakinPakoutStatus(1);
+            orderDetlPakinService.insert(orderDetlPakin);
+
+            // 鐢熸垚鍏ュ簱閫氱煡妗�
+            WaitPakin waitPakin = new WaitPakin();
+            BeanUtils.copyProperties(mat, waitPakin);
+//                waitPakin.sync(mat);
+            waitPakin.setOrderNo(orderPakin.getOrderNo());   // 鍗曟嵁缂栧彿
+            waitPakin.setOrderId(orderPakin.getId());
+            waitPakin.setZpallet(mesInApply.getTuoPanId());   // 鎵樼洏鐮�
+            waitPakin.setIoStatus("N");     // 鍏ュ嚭鐘舵��
+            waitPakin.setAnfme(orderDetlPakin.getAnfme());  // 鏁伴噺
+            waitPakin.setStatus("Y");    // 鐘舵��
+            waitPakin.setAppeUser(defaultUserId);
+            waitPakin.setAppeTime(now);
+            waitPakin.setModiUser(defaultUserId);
+            waitPakin.setModiTime(now);
+            List<String> itemBarcode = mesInApply.getProductInfo().stream().map(MesInApply.ProductInfo::getItemBarcode).collect(Collectors.toList());
+            waitPakin.setStandby1(barCodeListToStr(itemBarcode));
+            waitPakinService.insert(waitPakin);
+            OrderInAndOutUtil.increaseWorkQty(Boolean.TRUE, orderPakin.getId(), orderDetlPakin.getMatnr(), orderDetlPakin.getBatch(),
+                    orderDetlPakin.getBrand(), orderDetlPakin.getStandby1(), orderDetlPakin.getStandby2(), orderDetlPakin.getStandby3(),
+                    orderDetlPakin.getBoxType1(), orderDetlPakin.getBoxType2(), orderDetlPakin.getBoxType3(), orderDetlPakin.getAnfme());
+            OrderInAndOutUtil.updateOrder(Boolean.TRUE, orderPakin.getId(), 2L, defaultUserId);
+
+            // 鍛煎彨AGV浠庝骇绾胯繍鍥炵珛搴�
+            try {
+                if (!StringUtils.isEmpty(mesInApply.getTaskno())) {
+                    TransTask transTask = new TransTask();
+                    transTask.setTaskno(mesInApply.getTaskno());
+                    transTask.setTaskname(mesInApply.getTaskname());
+                    transTask.setOrderNo(mesInApply.getOrderNo());
+                    transTask.setTransType(mesInApply.getTransType());
+                    transTask.setCurProcess(mesInApply.getProductLineId());
+                    transTask.setCurStationId(mesInApply.getStationID());
+                    transTask.setNextStationId(WMS_TRANS_START_STATION_2);
+                    transTask.setItemno(mesInApply.getItemno());
+                    transTask.setQty(mesInApply.getQty());
+                    transTask.setProductLineId(mesInApply.getProductLineId());
+                    transTask.setItemBarcode(itemBarcode);
+                    transTask.setTuoPanId(mesInApply.getTuoPanId());
+                    transTask.setOperateType(1);
+                    transTask.setAgvFactory(1);
+                    JSONObject sendAgvTask = submitTask(transTask);
+                    if (!"1".equals(sendAgvTask.getString("Success"))) {
+                        log.error("鍑哄簱涓嬪彂agv杩愯緭浠诲姟澶辫触:{}", JSONObject.toJSONString(transTask));
+                    }
+                }
+            } catch (Exception e) {
+                log.error("涓嬪彂AGV杩愯緭浠诲姟澶辫触", e);
+            }
+        }
+
+        return 1;
+    }
+
+    /**
+     * 鍑哄簱瀹屾垚
+     * 鍑哄簱鍚庯紝鎸夋墭鎺ㄩ�侊紝闈炴暣涓鍗�
+     *
+     * @param orderNo
+     * @return
+     */
+    public int outFeedbackByTuo(String orderNo, Task agvTask) {
+
+        int success = 0;
+
+        OrderPakout order = orderPakoutService.selectByNo(orderNo);
+        if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
+            JSONObject dbMemo = JSONObject.parseObject(order.getMemo());
+
+            // TODO锛氬嚭搴撳畬鎴愬悗锛岃嫢鏈В缁戞墭鐩樺拰鐗╂枡锛屽垯鎵ц鎵樼洏瑙g粦
+            // TODO锛氬嚭搴撳畬鎴愬悗锛岃嫢鏈竻闄ら浂浠朵簩缁寸爜锛屽垯鎵ц娓呴櫎锛屼篃鍙互鍦ˋGV閫佽揣瀹屾垚鍚庢竻闄�
+//            EntityWrapper<OrderDetlPakout> wrapper = new EntityWrapper<>();
+//            wrapper.eq("order_no", orderNo);
+//            List<OrderDetlPakout> orderDetlPakouts = orderDetlPakoutService.selectList(wrapper);
+//            if (orderDetlPakouts != null && !orderDetlPakouts.isEmpty()) {
+//                for (OrderDetlPakout orderDetl : orderDetlPakouts) {
+//                    StringBuilder palletId = new StringBuilder();
+//                    EntityWrapper<WaitPakin> wrapper2 = new EntityWrapper<>();
+//                    wrapper2.eq("order_no", orderDetl.getOrderNo());
+//                    List<WaitPakin> waitPakins = waitPakinService.selectList(wrapper2);
+//                    if (waitPakins != null && waitPakins.size() > 0) {
+//                        for (WaitPakin waitPakin : waitPakins) {
+//                            palletId.append(waitPakin.getZpallet()).append(",");
+//                        }
+//                    }
+//
+//                    MesOutFeedback mesOutFeedback = new MesOutFeedback();
+//                    mesOutFeedback.setTaskno(dbMemo.getString("taskno"));
+//                    mesOutFeedback.setTaskname(dbMemo.getString("taskname"));
+//                    mesOutFeedback.setProductLineId(dbMemo.getString("ProductLineId"));
+//                    mesOutFeedback.setStationId(dbMemo.getString("StationID"));
+//                    mesOutFeedback.setItemno(orderDetl.getMatnr());
+//                    mesOutFeedback.setTuoPanId(zpalletId);
+//                    mesOutFeedback.setQty(orderDetl.getQty().intValue());
+//                    if (!StringUtils.isEmpty(dbMemo.getString("ItemBarcode"))) {
+//                        mesOutFeedback.setItemBarcode(barCodeStrToList(dbMemo.getString("ItemBarcode")));
+//                    }
+//                    mesOutFeedback.setOrderNo(orderNo);
+//                }
+//            }
+
+            EntityWrapper<TaskDetl> entityWrapper = new EntityWrapper<>();
+            entityWrapper.eq("wrk_no", agvTask.getWrkNo());
+            TaskDetl taskDetl = taskDetlService.selectOne(entityWrapper);
+            String zpalletId = taskDetl.getZpallet();
+            List<String> itemBarCode = new ArrayList<>();
+            JSONArray array = JSONArray.parseArray(taskDetl.getMemo());
+            for (Object one : array) {
+                itemBarCode.add(one.toString());
+                // TODO锛氬叆搴撴椂瀛樺偍闆朵欢鐮�(ItemBarCode锛夛紝骞剁粦瀹氭墭鐩橈紝鍑哄簱鍚庤繖閲岃�冭檻瑙g粦
+            }
+
+            MesOutFeedback mesOutFeedback = new MesOutFeedback();
+            mesOutFeedback.setTaskno(agvTask.getTaskNo());
+            mesOutFeedback.setTaskname(dbMemo.getString("taskname"));
+            mesOutFeedback.setProductLineId(dbMemo.getString("ProductLineId"));
+            mesOutFeedback.setStationId(dbMemo.getString("StationId"));
+            mesOutFeedback.setItemno(dbMemo.getString("Itemno"));
+            mesOutFeedback.setTuoPanId(zpalletId);
+            if (itemBarCode != null && itemBarCode.size() > 0) {
+                mesOutFeedback.setQty(itemBarCode.size());
+                mesOutFeedback.setItemBarcode(itemBarCode);
+            }
+            mesOutFeedback.setOrderNo(orderNo);
+
+            String url = MES_URL + "issueComplete";
+            String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(mesOutFeedback));
+            if (!StringUtils.isEmpty(response) && response.contains("Success")){
+                MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+                if("1".equals(mesReturn.getSuccess())) {
+                    success = 1;
+                }
+            }
+        }
+
+        return success;
+    }
+
+    /**
+     * 鍏ュ簱瀹屾垚
+     * 鍏ュ簱鍚庯紝鎸夋墭鎺ㄩ�侊紝闈炴暣涓鍗�
+     *
+     * @param orderNo
+     * @param zapplet
+     * @return
+     */
+    public int inFeedbackByTuo(String orderNo, String zapplet) {
+
+        int success = 0;
+
+        OrderPakin order = orderPakinService.selectByNo(orderNo);
+        if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
+            List<MesInApply.ProductInfo> list = new ArrayList<>();
+            // 浠庢墭鐩樼粦瀹氱殑闆朵欢浜岀淮鐮佷腑鏌ヨ淇℃伅
+            EntityWrapper<MatItemBarcode> matItemBarcodeEntityWrapper = new EntityWrapper<>();
+            matItemBarcodeEntityWrapper.eq("zapplet", zapplet).eq("status", 1);
+            List<MatItemBarcode> barcodes = matItemBarcodeMapper.selectList(matItemBarcodeEntityWrapper);
+            for (MatItemBarcode barcode : barcodes) {
+                MesInApply.ProductInfo productInfo = new MesInApply.ProductInfo();
+                productInfo.setItemBarcode(barcode.getItemBarcode());
+                productInfo.setQualityStatus(barcode.getQualityStatus());
+                list.add(productInfo);
+            }
+
+            MesInApply result = JSONObject.parseObject(order.getMemo(), MesInApply.class);
+            result.setProductInfo(list);
+            result.setQty(list.size());
+
+            String url = MES_URL + "loadComplete";
+            String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(result));
+            if (!StringUtils.isEmpty(response) && response.contains("Success")){
+                MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+                if("1".equals(mesReturn.getSuccess())) {
+                    success = 1;
+                }
+            }
+        }
+
+        return success;
+    }
+
+    /**
+     * 闆朵欢浜岀淮鐮侊紝鏁扮粍杞瑂tring
+     *
+     * @param list
+     * @return
+     */
+    public static String barCodeListToStr(List<String> list) {
+        StringBuilder stringBuilder = new StringBuilder();
+        for (String str : list) {
+            stringBuilder.append(str).append(",");
+        }
+        String result = stringBuilder.toString();
+        return result.endsWith(",") ? result.substring(0, result.length() - 1) : result;
+    }
+
+    /**
+     * 闆朵欢浜岀淮鐮侊紝string杞暟缁�
+     *
+     * @param str
+     * @return
+     */
+    public static List<String> barCodeStrToList(String str) {
+        String[] array = str.split(",");
+        return Arrays.asList(array);
+    }
+
+    /**
+     * 鍏ュ簱瀹屾垚
+     * 鍏ュ簱鍗曞畬鎴愬悗锛屾暣鍗曟帹閫�
+     *
+     * @param orderNo
+     * @return
+     */
+    public int inFeedback(String orderNo) {
+
+        int success = 0;
+
+        OrderPakin order = orderPakinService.selectByNo(orderNo);
+        if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
+            EntityWrapper<OrderDetlPakin> wrapper = new EntityWrapper<>();
+            wrapper.eq("order_no", orderNo);
+            List<OrderDetlPakin> orderDetlPakins = orderDetlPakinService.selectList(wrapper);
+            if (orderDetlPakins != null && !orderDetlPakins.isEmpty()) {
+                for (OrderDetlPakin orderDetl : orderDetlPakins) {
+                    MesInApply result = JSONObject.parseObject(order.getMemo(), MesInApply.class);
+                    result.setQty(orderDetl.getQty().intValue());
+
+                    String url = MES_URL + "loadComplete";
+                    String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(result));
+                    if (!StringUtils.isEmpty(response) && response.contains("Success")){
+                        MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+                        if("1".equals(mesReturn.getSuccess())) {
+                            success++;
+                        }
+                    }
+                }
+
+                if (success == orderDetlPakins.size()) {
+                    success = 1;
+                } else {
+                    success = 0;
+                }
+            }
+        }
+
+        return success;
+    }
+
+    /**
+     * 锛堝浠斤級鍑哄簱璁㈠崟瀹屾垚
+     *
+     * @param orderNo
+     * @return
+     */
+    public int outFeedback(String orderNo) {
+
+        int success = 0;
+
+        OrderPakout order = orderPakoutService.selectByNo(orderNo);
+        if (order != null && order.getSettle() == 4) {   // 鏍¢獙鏄惁瀹屾垚
+            JSONObject dbMemo = JSONObject.parseObject(order.getMemo());
+            EntityWrapper<OrderDetlPakout> wrapper = new EntityWrapper<>();
+            wrapper.eq("order_no", orderNo);
+            List<OrderDetlPakout> orderDetlPakouts = orderDetlPakoutService.selectList(wrapper);
+            if (orderDetlPakouts != null && !orderDetlPakouts.isEmpty()) {
+                for (OrderDetlPakout orderDetl : orderDetlPakouts) {
+                    StringBuilder palletId = new StringBuilder();
+                    EntityWrapper<WaitPakin> wrapper2 = new EntityWrapper<>();
+                    wrapper2.eq("order_no", orderDetl.getOrderNo());
+                    List<WaitPakin> waitPakins = waitPakinService.selectList(wrapper2);
+                    if (waitPakins != null && waitPakins.size() > 0) {
+                        for (WaitPakin waitPakin : waitPakins) {
+                            palletId.append(waitPakin.getZpallet()).append(",");
+                        }
+                    }
+
+                    MesOutFeedback mesOutFeedback = new MesOutFeedback();
+                    mesOutFeedback.setTaskno(dbMemo.getString("taskno"));
+                    mesOutFeedback.setTaskname(dbMemo.getString("taskname"));
+                    mesOutFeedback.setProductLineId(dbMemo.getString("ProductLineId"));
+                    mesOutFeedback.setStationId(dbMemo.getString("StationID"));
+                    mesOutFeedback.setItemno(orderDetl.getMatnr());
+                    if (!StringUtils.isEmpty(palletId.toString())) {
+                        mesOutFeedback.setTuoPanId(palletId.substring(0, palletId.length() - 1));
+                    }
+                    mesOutFeedback.setQty(orderDetl.getQty().intValue());
+                    if (!StringUtils.isEmpty(dbMemo.getString("ItemBarcode"))) {
+                        mesOutFeedback.setItemBarcode(barCodeStrToList(dbMemo.getString("ItemBarcode")));
+                    }
+                    mesOutFeedback.setOrderNo(orderNo);
+
+                    // TODO:澶囨敞锛氬嚭搴撳畬鎴愬悗瑙g粦鎵樼洏鍜岀墿鏂欙紝鑻ュ墠闈㈡湭瑙g粦锛屾澶勯渶瑕佽В缁�
+
+                    String url = MES_URL + "issueComplete";
+                    String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(mesOutFeedback));
+                    if (!StringUtils.isEmpty(response) && response.contains("Success")){
+                        MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+                        if("1".equals(mesReturn.getSuccess())) {
+                            success++;
+                        }
+                    }
+                }
+
+                if (success == orderDetlPakouts.size()) {
+                    success = 1;
+
+                    // TODO锛氱珛搴撳嚭搴撳悗鑷姩璋冨害AGV杩愰�佸埌绔欑偣
+                    String taskNo = dbMemo.getString("taskno");
+                    if (!StringUtils.isEmpty(taskNo)) {
+                        TransTask transTask = new TransTask();
+                        transTask.setTaskno(dbMemo.getString("taskno"));
+                        transTask.setTaskname(dbMemo.getString("taskname"));
+                        transTask.setOrderNo(dbMemo.getString("OrderNo"));
+                        transTask.setTransType(dbMemo.getString("TransType"));
+//                    transTask.setCurProcess();
+                        transTask.setCurStationId(WMS_TRANS_START_STATION_1);
+                        transTask.setNextProcess(dbMemo.getString("ProductLineId"));
+                        transTask.setNextStationId(dbMemo.getString("StationId"));
+                        transTask.setItemno(dbMemo.getString("Itemno"));
+                        transTask.setQty(dbMemo.getInteger("Qty"));
+                        transTask.setProductLineId(dbMemo.getString("ProductLineId"));
+                        transTask.setItemBarcode(barCodeStrToList(dbMemo.getString("ItemBarcode")));
+                        transTask.setOperateType(1);
+                        transTask.setAgvFactory(1);
+                        JSONObject sendAgvTask = submitTask(transTask);
+                        if (!"1".equals(sendAgvTask.getString("Success"))) {
+                            log.error("鍑哄簱涓嬪彂agv杩愯緭浠诲姟澶辫触", JSONObject.toJSONString(transTask));
+                        }
+                    }
+                } else {
+                    success = 0;
+                }
+            }
+        }
+
+        return success;
+    }
+
+    /**
+     * 鍑哄簱鐢宠锛堝彨鏂欙級,瑁呴厤搴撱�佹粦鍧楀簱
+     *
+     * @param mesCallOutApply
+     * @return
+     */
+    public int callOutBoundOrder(MesCallOutApply mesCallOutApply){
+
+        // docType鏍规嵁搴撶被鍨嬬‘瀹�
+        long docType = 7;
+        long settle = 1;
+
+        // 鏍¢獙璁㈠崟鏄惁閲嶅
+        OrderPakout order = orderPakoutService.selectByNo(mesCallOutApply.getOrderNo());
+        if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
+            return -1;
+        }
+
+        // 鐢熸垚璁㈠崟
+        Date now = new Date();
+        OrderPakout orderPakout = new OrderPakout();
+        orderPakout.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
+        orderPakout.setOrderNo(mesCallOutApply.getOrderNo());
+        orderPakout.setOrderTime(com.core.common.DateUtils.convert(now));
+        orderPakout.setDocType(docType);
+        orderPakout.setSettle(settle);
+        orderPakout.setStatus(1);
+        orderPakout.setCreateBy(defaultUserId);
+        orderPakout.setCreateTime(now);
+        orderPakout.setUpdateBy(defaultUserId);
+        orderPakout.setUpdateTime(now);
+        orderPakout.setMemo(JSONObject.toJSONString(mesCallOutApply));
+        orderPakout.setPakinPakoutStatus(2);
+        if (!orderPakoutService.insert(orderPakout)) {
+            log.error("MES淇濆瓨鍑哄簱璁㈠崟锛堝彨鏂欙級涓绘。澶辫触");
+            throw new CoolException("淇濆瓨鍑哄簱璁㈠崟锛堝彨鏂欙級涓绘。澶辫触");
+        }
+
+        // 鐢熸垚鏄庣粏
+        if (mesCallOutApply.getItemdata() != null && !mesCallOutApply.getItemdata().isEmpty()) {
+            for (MesCallOutApply.MesOutApplyItem mesOutApplyItem : mesCallOutApply.getItemdata()) {
+                Mat mat = matService.selectByMatnr(mesOutApplyItem.getItemno());
+                OrderDetlPakout orderDetlPakout = new OrderDetlPakout();
+                orderDetlPakout.setOrderId(orderPakout.getId());
+                orderDetlPakout.setOrderNo(orderPakout.getOrderNo());
+                orderDetlPakout.setAnfme(Double.valueOf(mesOutApplyItem.getQty()));
+                orderDetlPakout.setQty(0.0);
+                orderDetlPakout.setMatnr(mat.getMatnr());
+                orderDetlPakout.setMaktx(mat.getMaktx());
+                orderDetlPakout.setSpecs(mat.getSpecs());
+                orderDetlPakout.setModel(mat.getModel());
+                orderDetlPakout.setThreeCode(mesOutApplyItem.getItemBarcode());
+                orderDetlPakout.setStandby1(mesOutApplyItem.getTrayid());   //淇濆瓨閰嶇洏鍙凤紝闈炴墭鐩樺彿
+                orderDetlPakout.setCreateBy(defaultUserId);
+                orderDetlPakout.setCreateTime(now);
+                orderDetlPakout.setUpdateBy(defaultUserId);
+                orderDetlPakout.setUpdateTime(now);
+                orderDetlPakout.setStatus(1);
+                orderDetlPakout.setPakinPakoutStatus(2);
+                if (!orderDetlPakoutService.insert(orderDetlPakout)) {
+                    log.error("MES淇濆瓨鍑哄簱璁㈠崟锛堝彨鏂欙級鏄庣粏妗eけ璐�");
+                    throw new CoolException("淇濆瓨鍑哄簱璁㈠崟锛堝彨鏂欙級鏄庣粏妗eけ璐�");
+                }
+            }
+        }
+
+        return 1;
+    }
+
+    // endregion
+
+
+    // region 鎼繍浠诲姟璋冨害
+
+    // route杞彂3涓猈CS浠诲姟
+
+    /**
+     * 9.1涓嬪彂杩愯緭浠诲姟
+     * TODO:鍏朵粬搴撶殑浠诲姟鍏ㄩ儴杞埌婊戝潡搴撶粺涓�璋冨害
+     *
+     * @param transTask
+     * @return
+     */
+    @Transactional
+    public JSONObject submitTask(TransTask transTask) {
+
+        JSONObject result = new JSONObject();
+        result.put("taskno", transTask.getTaskno());
+
+        // 閲嶅鎬ф牎楠�
+        EntityWrapper<Task> wrapper = new EntityWrapper<>();
+        wrapper.eq("task_no", transTask.getTaskno());
+        List<Task> tasks = taskService.selectList(wrapper);
+        if (tasks != null && !tasks.isEmpty()) {
+            log.error("agv浠诲姟鍙烽噸澶�:{}", transTask.getTaskno());
+            result.put("Success", "2");
+            result.put("Message", "agv浠诲姟鍙烽噸澶�:" + transTask.getTaskno());
+            return result;
+        }
+
+        // 涓嬪彂缁橰CS
+        RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
+        rcsTaskSubmit.setRobotTaskCode(transTask.getTaskno());
+        rcsTaskSubmit.setInitPriority(10);  //榛樿10
+        List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();
+        RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute();
+        startRoute.setSeq(0);
+        startRoute.setCode(transTask.getCurStationId());
+        startRoute.setOperation("COLLECT");
+        targetRouteList.add(startRoute);
+        RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute();
+        endRoute.setSeq(1);
+        endRoute.setCode(transTask.getNextStationId());
+        endRoute.setOperation("DELIVERY");
+        targetRouteList.add(endRoute);
+        rcsTaskSubmit.setTargetRoute(targetRouteList);
+
+        // 杞彂缁欐捣搴锋垨鍗庢檽RCS
+//        int success = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
+        int success = 1;
+        if (success == 1) {
+            int workNo = commonService.getWorkNo(WorkNoType.OTHER.type);
+            Date now = new Date();
+            Task task = new Task();
+            task.setWrkNo(workNo);
+            task.setTaskType("AGV");
+            task.setWrkSts(301L);
+            task.setIoType(3);
+            task.setIoPri(10.00);
+            task.setWrkDate(now);
+            task.setSourceStaNo(transTask.getCurStationId());
+            task.setStaNo(transTask.getNextStationId());
+            task.setBarcode(transTask.getTuoPanId());
+            task.setModiUser(defaultUserId);
+            task.setModiTime(now);
+            task.setAppeUser(defaultUserId);
+            task.setAppeTime(now);
+            task.setTaskNo(transTask.getTaskno());
+            task.setMemo(JSONObject.toJSONString(transTask));
+
+            taskService.insert(task);
+            Mat mat = matService.selectByMatnr(transTask.getItemno());
+            TaskDetl taskDetl = new TaskDetl();
+            taskDetl.setWrkNo(task.getWrkNo());
+            taskDetl.setIoTime(task.getIoTime());
+            taskDetl.setMatnr(transTask.getItemno());
+            taskDetl.setAnfme(0.0);
+            taskDetl.setStandby1(String.valueOf(transTask.getQty()));
+            taskDetl.setMaktx(mat.getMaktx());
+            taskDetl.setSpecs(mat.getSpecs());
+            taskDetl.setOrderNo(transTask.getOrderNo());
+            taskDetl.setZpallet(transTask.getTuoPanId());
+            taskDetl.setMemo(JSONObject.toJSONString(transTask.getItemBarcode()));
+            taskDetl.setModiUser(defaultUserId);
+            taskDetl.setModiTime(now);
+            taskDetl.setAppeUser(defaultUserId);
+            taskDetl.setAppeTime(now);
+            taskDetlService.insert(taskDetl);
+            result.put("Success", "1");
+            result.put("Message", "浠诲姟鎺ユ敹鎴愬姛");
+        } else {
+            result.put("Success", "2");
+            result.put("Message", "浠诲姟涓嬪彂缁橰CS澶辫触");
+        }
+
+        return result;
+    }
+
+    /**
+     * 9.2杩斿洖浠诲姟鎵ц缁撴灉
+     *
+     * @param rcsReporterTask
+     * @return
+     */
+    public int reporterTask(RcsReporterTask rcsReporterTask) {
+
+        // 缁撴灉姹囨��
+        boolean completed = true;
+        EntityWrapper<Task> wrapper = new EntityWrapper<>();
+        wrapper.eq("task_no", rcsReporterTask.getRobotTaskCode());
+        List<Task> tasks = taskService.selectList(wrapper);
+        if (tasks != null && !tasks.isEmpty()) {
+            for (Task task : tasks) {
+                if (task.getWrkSts() != 304) {   // TODO锛氱‘璁ゅ畬鎴愶紝鍙兘瀛樺湪澶氱洏浠诲姟
+                    completed = false;
+                }
+            }
+        }
+
+        if (completed) {
+            TransTaskFeedback transTaskFeedback = new TransTaskFeedback();
+            transTaskFeedback.setTaskno(rcsReporterTask.getRobotTaskCode());
+//            transTaskFeedback.setTaskname();
+            transTaskFeedback.setResult(1);
+
+            String url = MES_URL + "api/task/reporter";
+            String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(transTaskFeedback));
+            if (!StringUtils.isEmpty(response) && response.contains("Success")){
+                MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+                if("1".equals(mesReturn.getSuccess())) {
+                    return 1;
+                }
+            }
+        }
+
+        return 0;
+    }
+
+    /**
+     * 9.8鐢宠鍗庢檽AGV杩涘叆鐢熶骇绾�
+     *
+     * @param apply
+     * @return
+     */
+    public String applyInLine(TransParent apply) {
+
+        String url = MES_URL + "api/apply/inLine";
+        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
+        if (!StringUtils.isEmpty(response) && response.contains("Success")){
+            JSONObject jsonObject = JSONObject.parseObject(response);
+            if("1".equals(jsonObject.getString("Success"))) {
+                return jsonObject.getJSONObject("Data").getString("status");
+            }
+        }
+
+        return "N";
+    }
+
+    /**
+     * 鍏ョ珯璇锋眰锛氳浆鍙慉GV->鍏ョ珯璇锋眰->缁橫ES
+     *
+     * @param apply
+     * @return
+     */
+    public int applyInStation(TransParent apply) {
+        String path = ("LL").equals(apply.getProductLineId()) ? "AGVTransportPalletNotice" : "AprsAGVTransportPalletNotice";
+        String url = MES_URL + path;
+        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
+        if (!StringUtils.isEmpty(response) && response.contains("Success")){
+            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+            if("1".equals(mesReturn.getSuccess())) {
+                return 1;
+            }
+        }
+
+        return 0;
+    }
+
+    /**
+     * 鍏ョ珯鍏佽锛氳浆鍙慚ES->鍏佽鍏ョ珯->缁橝GV
+     *
+     * @param allow
+     * @return
+     */
+    public MesReturn allowInStation(TransInOutStationAllow allow) {
+
+        MesReturn mesReturn = new MesReturn();
+        mesReturn.setSuccess("1");
+
+        if ("Y".equals(allow.getStatus())) {
+            RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
+            rcsTaskContinue.setRobotTaskCode(allow.getTaskno());
+            rcsTaskContinue.setTriggerType("TASK");
+            rcsTaskContinue.setTriggerCode(allow.getTaskno());
+//            rcsTaskContinue.setTriggerType("ROBOT");
+//            rcsTaskContinue.setTriggerCode(allow.getAgvCode());
+
+            int success = rcsService.continueTask(rcsTaskContinue, checkRcsFactory(allow.getAgvCode()));
+            mesReturn.setSuccess(success == 1 ? "1" : "2");
+            mesReturn.setMessage(success == 1 ? "" : "杞彂缁橰CS澶辫触");
+        }
+
+        return mesReturn;
+    }
+
+    /**
+     * 鍒扮珯瀹屾垚锛氳浆鍙慉GV->鍒扮珯瀹屾垚->缁橫ES
+     *
+     * @param arrivalStation
+     * @return
+     */
+    public int arriveOnStation(TransArrivalStation arrivalStation) {
+
+        if ("01".equals(arrivalStation.getDaotype())) {
+            arrivalStation.setItemno(null);
+            arrivalStation.setItemBarcode(new ArrayList<>());
+            arrivalStation.setOrderNo(null);
+        }
+
+        String url = MES_URL + "AGVArrivalCompleted";
+        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(arrivalStation));
+        if (!StringUtils.isEmpty(response) && response.contains("Success")){
+            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+            if("1".equals(mesReturn.getSuccess())) {
+                return 1;
+            }
+        }
+
+        return 0;
+    }
+
+    /**
+     * 绂荤珯璇锋眰锛氳浆鍙慉GV->绂荤珯璇锋眰->缁橫ES
+     *
+     * @param apply
+     * @return
+     */
+    public int applyOutStation(TransParent apply) {
+
+        String url = MES_URL + "api/apply/outStation";
+        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
+        if (!StringUtils.isEmpty(response) && response.contains("Success")){
+            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+            if("1".equals(mesReturn.getSuccess())) {
+                return 1;
+            }
+        }
+
+        return 0;
+    }
+
+    /**
+     * 绂荤珯鍏佽锛氳浆鍙慚ES->鍏佽绂荤珯->缁橝GV
+     *
+     * @param allow
+     * @return
+     */
+    public MesReturn allowOutStation(TransInOutStationAllow allow) {
+
+        MesReturn mesReturn = new MesReturn();
+        mesReturn.setSuccess("1");
+
+        if ("Y".equals(allow.getStatus())) {
+            RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
+            rcsTaskContinue.setRobotTaskCode(allow.getTaskno());
+            rcsTaskContinue.setTriggerType("TASK");
+            rcsTaskContinue.setTriggerCode(allow.getTaskno());
+
+            int success = rcsService.continueTask(rcsTaskContinue, checkRcsFactory(allow.getAgvCode()));
+            mesReturn.setSuccess(success == 1 ? "1" : "2");
+            mesReturn.setMessage(success == 1 ? "" : "杞彂缁橰CS澶辫触");
+        }
+
+        return mesReturn;
+    }
+
+    /**
+     * 绂荤珯瀹屾垚锛氳浆鍙慉GV->绂荤珯瀹屾垚->缁橫ES
+     *
+     * @param apply
+     * @return
+     */
+    public int outStation(TransParent apply) {
+
+        String url = MES_URL + "AGVDepartureCompleted";
+        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
+        if (!StringUtils.isEmpty(response) && response.contains("Success")){
+            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+            if("1".equals(mesReturn.getSuccess())) {
+                return 1;
+            }
+        }
+
+        return 0;
+    }
+
+    @Override
+    public MesReturn queryInventory(String itemno,String orderNo) {
+        MesReturn mesReturn = new MesReturn();
+        mesReturn.setSuccess("1");
+        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("matnr", itemno).eq("order_no",orderNo));
+
+        int count = 0;
+        for(LocDetl locDetl:locDetls) {
+            count += locDetl.getAnfme();
+        }
+        mesReturn.setMessage(String.valueOf(count));
+        return mesReturn;
+    }
+
+    // endregion
+
+    /**
+     * 鏌ヨRcs鍦板潃
+     *
+     * @param agvNo
+     * @return 1 娴峰悍锛�2 鍗庢檽
+     */
+    private int checkRcsFactory(String agvNo) {
+
+        AgvInfo agvInfo = agvInfoMapper.selectById(agvNo);
+        return agvInfo.getAgvFactory();
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
index 2c9a489..c3021b9 100644
--- a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -632,7 +632,7 @@
             param.getCombMats().forEach(elem -> {
                 Order order = OrderInAndOutUtil.selectByNo(Boolean.TRUE, elem.getOrderNo());
                 if (Cools.isEmpty(order) || order.getSettle() > 2) {
-                    throw new CoolException("鍗曟嵁缂栧彿宸茶繃鏈�");
+                    throw new CoolException("璁㈠崟鍙蜂笉瀛樺湪鎴栬�呭凡鎵ц瀹屾垚");
                 }
                 // 璁㈠崟鏄庣粏鏁伴噺鏍¢獙
 //                OrderDetl orderDetl = OrderInAndOutUtil.selectItem(Boolean.TRUE, order.getId(), elem.getMatnr(), elem.getBatch(), elem.getBrand(), elem.getStandby1(), elem.getStandby2(), elem.getStandby3(),
@@ -663,38 +663,38 @@
                 }
             });
 
-            BasContainer container = basContainerService.selectOne(new EntityWrapper<BasContainer>().eq("barcode", param.getBarcode()));
-            if (Objects.isNull(container)) {
-                throw new CoolException("鏁版嵁閿欒锛氬鍣ㄧ爜涓嶅瓨鍦紒锛�");
-            }
-            if (container.getMixMax() < detlDtos.size()) {
-                throw new CoolException("瓒呭嚭瀹瑰櫒鏈�澶ф贩瑁呮暟閲忥紝褰撳墠瀹瑰櫒鏈�澶ф暟閲忎负锛�" + container.getMixMax() + "!!");
-            }
-            Set<String> matnrs = detlDtos.stream().map(DetlDto::getMatnr).collect(Collectors.toSet());
-            List<Mat> mats = matService.selectList(new EntityWrapper<Mat>().in("matnr", matnrs));
-            Set<Long> tagIds = mats.stream().map(Mat::getTagId).collect(Collectors.toSet());
-            if (tagIds.size() > 1) {
-                throw new CoolException("缁勬墭鐗╂枡绫诲瀷涓嶄竴鑷达紝鍙湁鐩稿悓鐨勭墿鏂欏垎绫绘墠鍙互缁勬墭锛侊紒");
-            }
+//            BasContainer container = basContainerService.selectOne(new EntityWrapper<BasContainer>().eq("barcode", param.getBarcode()));
+//            if (Objects.isNull(container)) {
+//                throw new CoolException("鏁版嵁閿欒锛氬鍣ㄧ爜涓嶅瓨鍦紒锛�");
+//            }
+//            if (container.getMixMax() < detlDtos.size()) {
+//                throw new CoolException("瓒呭嚭瀹瑰櫒鏈�澶ф贩瑁呮暟閲忥紝褰撳墠瀹瑰櫒鏈�澶ф暟閲忎负锛�" + container.getMixMax() + "!!");
+//            }
+//            Set<String> matnrs = detlDtos.stream().map(DetlDto::getMatnr).collect(Collectors.toSet());
+//            List<Mat> mats = matService.selectList(new EntityWrapper<Mat>().in("matnr", matnrs));
+//            Set<Long> tagIds = mats.stream().map(Mat::getTagId).collect(Collectors.toSet());
+//            if (tagIds.size() > 1) {
+//                throw new CoolException("缁勬墭鐗╂枡绫诲瀷涓嶄竴鑷达紝鍙湁鐩稿悓鐨勭墿鏂欏垎绫绘墠鍙互缁勬墭锛侊紒");
+//            }
             //杩樺彲浠ユ斁鍏ュ灏戠鐗╂枡
-            Integer suplus = container.getMixMax();
+//            Integer suplus = container.getMixMax();
             for (DetlDto detlDto : detlDtos) {
                 Mat mat = matService.selectByMatnr(detlDto.getMatnr());
                 if (Cools.isEmpty(mat)) {
                     throw new CoolException(detlDto.getMatnr() + "鍟嗗搧妗f涓嶅瓨鍦�");
                 }
                 //鏈�澶氬彲鏀炬暟閲�
-                Double singleMax = mat.getUpQty() * suplus;
-                if (singleMax.compareTo(detlDto.getAnfme()) < 0) {
-                    throw new CoolException("鐗╂枡锛�" + detlDto.getMatnr() + "鍗曟缁勬墭涓婇檺涓猴細" + mat.getUpQty() + ",褰撳墠鎬婚噺瓒呭嚭鎵樼洏瑁呰浇涓婇檺!!");
-                }
-                BigDecimal decimal = new BigDecimal(detlDto.getAnfme() / mat.getUpQty());
-                //褰撳墠鐗╂枡闇�瑕佸崰鐢ㄦ枡绠辨牸鏁�
-                Integer curr = decimal.setScale(0, RoundingMode.CEILING).intValue();
-                suplus = suplus - curr;
-                if (suplus < 0) {
-                    throw new CoolException("鐗╂枡锛�" + detlDto.getMatnr() + ", 瓒呭嚭褰撳墠鎵樼洏瑁呰浇涓婇檺锛侊紒");
-                }
+//                Double singleMax = mat.getUpQty() * suplus;
+//                if (singleMax.compareTo(detlDto.getAnfme()) < 0) {
+//                    throw new CoolException("鐗╂枡锛�" + detlDto.getMatnr() + "鍗曟缁勬墭涓婇檺涓猴細" + mat.getUpQty() + ",褰撳墠鎬婚噺瓒呭嚭鎵樼洏瑁呰浇涓婇檺!!");
+//                }
+//                BigDecimal decimal = new BigDecimal(detlDto.getAnfme() / mat.getUpQty());
+//                //褰撳墠鐗╂枡闇�瑕佸崰鐢ㄦ枡绠辨牸鏁�
+//                Integer curr = decimal.setScale(0, RoundingMode.CEILING).intValue();
+//                suplus = suplus - curr;
+//                if (suplus < 0) {
+//                    throw new CoolException("鐗╂枡锛�" + detlDto.getMatnr() + ", 瓒呭嚭褰撳墠鎵樼洏瑁呰浇涓婇檺锛侊紒");
+//                }
 
                 WaitPakin waitPakin = new WaitPakin();
                 BeanUtils.copyProperties(mat, waitPakin);
@@ -1272,6 +1272,57 @@
         return R.ok();
     }
 
+    @Override
+    @Transactional
+    public R callEmptyBinOutBound(String staNo, String locType, Long userId) {
+        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", 'D').eq("loc_type2", locType));
+        if(locMast == null) {
+            return R.parse("璇ョ被鍨嬶細" + locType +"绌烘墭鐩樹笉瀛樺湪");
+        }
+        // 鑾峰彇璺緞
+        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
+                .eq("type_no", 110)
+                .eq("stn_no", staNo)
+                .eq("crn_no", locMast.getCrnNo());
+        StaDesc staDesc = staDescService.selectOne(wrapper);
+        if (staDesc == null) {
+            R.parse("鍑哄簱璺緞涓嶅瓨鍦�,绔欑偣锛�" + staNo);
+        }
+        Date now = new Date();
+        // 鐢熸垚宸ヤ綔妗�
+        int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type);
+        WrkMast wrkMast = new WrkMast();
+        wrkMast.setWrkNo(workNo);
+        wrkMast.setIoTime(now);
+        wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
+        wrkMast.setIoType(110); // 鍏ュ嚭搴撶姸鎬侊細 110.绌烘澘鍑哄簱
+        wrkMast.setIoPri(10D);
+        wrkMast.setSourceStaNo(staDesc.getCrnStn$()); // 婧愮珯
+        wrkMast.setStaNo(staDesc.getStnNo$()); // 鐩爣绔�
+        wrkMast.setCrnNo(staDesc.getCrnNo());
+        wrkMast.setSourceLocNo(locMast.getLocNo()); // 婧愬簱浣�
+        wrkMast.setFullPlt("N"); // 婊℃澘锛歒
+        wrkMast.setPicking("N"); // 鎷f枡
+        wrkMast.setExitMk("N"); // 閫�鍑�
+        wrkMast.setEmptyMk("Y"); // 绌烘澘
+        wrkMast.setLinkMis("N");
+        wrkMast.setAppeUser(userId);
+        wrkMast.setAppeTime(now);
+        wrkMast.setModiUser(userId);
+        wrkMast.setModiTime(now);
+        wrkMastService.insert(wrkMast);
+
+        // 鏇存柊搴撲綅鐘舵��
+        if (locMast.getLocSts().equals("D")) {
+            locMast.setLocSts("R");
+            locMast.setModiUser(userId);
+            locMast.setModiTime(now);
+            locMastService.updateById(locMast);
+        }
+
+        return R.ok("鍑哄簱鎴愬姛");
+    }
+
     /**
      * @author Ryan
      * @date 2025/9/25
diff --git a/src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java
new file mode 100644
index 0000000..b7d7be5
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java
@@ -0,0 +1,624 @@
+package com.zy.asrs.service.impl;
+
+import com.alibaba.excel.util.StringUtils;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.zy.asrs.entity.*;
+import com.zy.asrs.entity.mes.TransArrivalStation;
+import com.zy.asrs.entity.mes.TransParent;
+import com.zy.asrs.entity.rcs.*;
+import com.zy.asrs.enums.RcsRetMethodEnum;
+import com.zy.asrs.mapper.BlockStationMapper;
+import com.zy.asrs.mapper.BlockTaskMapper;
+import com.zy.asrs.service.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.*;
+import java.net.ConnectException;
+import java.net.SocketTimeoutException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Slf4j
+@Service
+public class RcsServiceImpl implements RcsService {
+
+    // 娴峰悍RCS鍦板潃
+    @Value("${hik.url}")
+    private String HIK_URL;
+    // 鍗庢檽RCS鍦板潃
+    @Value("${hx.url}")
+    private String HX_URL;
+    @Value("${mes.defaultUserId}")
+    public long defaultUserId;
+
+
+    @Resource
+    private MesService mesService;
+    @Resource
+    private TaskService taskService;
+    @Resource
+    private BlockStationMapper blockStationMapper;
+    @Resource
+    private BlockTaskMapper blockTaskMapper;
+    @Resource
+    private TaskDetlServiceImpl taskDetlService;
+    @Resource
+    private WrkMastService wrkMastService;
+
+
+    // region 灏侀攣鍖洪�昏緫锛岀洰鍓嶅彧鏈変竴涓ぇ灏侀攣鍖猴紝浠诲姟鍏ㄩ儴杞埌婊戝潡搴撳鐞嗭紝鎴栫洿鎺ュ啓鍒版粦鍧楀簱
+
+    /**
+     * 鐢宠灏侀攣鍖鸿姹�
+     *
+     * @param apply
+     * @return
+     */
+    private int applyBlock(RcsReporterEqpt apply) {
+
+        BlockTask blockTask = new BlockTask();
+        blockTask.setTaskCode(apply.getTaskCode());
+        blockTask.setApplyTime(new Date());
+        blockTask.setBlockNo(apply.getEqptCode());
+        blockTask.setBlockName(apply.getEqptName());
+        blockTask.setMethod(apply.getMethod());
+        blockTask.setCompleted(0);
+
+        return blockTaskMapper.insert(blockTask);
+    }
+
+    /**
+     * 绠$悊灏侀攣鍖鸿繘鍏�
+     * TODO:澧炲姞閿侀槻鍐茬獊锛屽彲鑳戒负鍒嗗竷寮忛攣锛屽畾鏈�5绉掑惊鐜皟鐢�
+     *
+     */
+    public void managerBlock() {
+
+       try {
+           BlockTask firstTask = blockTaskMapper.findTop();
+           if (firstTask == null) {
+               return;
+           }
+           EntityWrapper<BlockStation> wrapper = new EntityWrapper<>();
+           wrapper.eq("block_no", firstTask.getBlockNo());
+           List<BlockStation> stations = blockStationMapper.selectList(wrapper);
+           if (!stations.isEmpty()) {
+               boolean locked = false;
+               for (BlockStation station : stations) {
+                   // 鍙厑璁�1涓巶瀹惰澶囪繘鍏ュ皝閿佸尯锛宻tatus鐘舵�侊細0 绌洪棽锛�1 娴峰悍灏侀攣涓紱2 鍗庢檽灏侀攣涓紱-1 寮傚父锛�
+                   if (station.getStatus() > 0 && !station.getStatus().equals(firstTask.getAgvFactory())) {
+                       locked = true;
+                       break;
+                   }
+               }
+
+               if (!locked) {
+                   // 灏侀攣鐘舵��
+                   int success = blockStationMapper.addByBlockNo(firstTask.getBlockNo(), firstTask.getAgvFactory());
+                   if (success > 0) {
+                       // 閫氱煡RCS
+                       RcsEqptNotify notify = new RcsEqptNotify();
+                       notify.setEqptCode(firstTask.getBlockNo());
+                       notify.setTaskCode(firstTask.getTaskCode());
+                       notify.setActionStatus("1");
+                       notifyEqpt(notify, firstTask.getAgvFactory());
+                   }
+               }
+           }
+       } catch (Exception e) {
+           log.error("绠$悊灏侀攣鍖哄紓甯�", e);
+       }
+    }
+
+    /**
+     * 绂诲紑閲婃斁灏侀攣鍖鸿姹�
+     * TODO:澧炲姞閿侀槻鍐茬獊锛屽彲鑳戒负鍒嗗竷寮忛攣
+     *
+     * @param apply
+     * @return
+     */
+    private int releaseBlock(RcsReporterEqpt apply) {
+
+        BlockTask task = blockTaskMapper.findByTaskCode(apply.getTaskCode());
+
+        EntityWrapper<BlockStation> wrapper = new EntityWrapper<>();
+        wrapper.eq("block_no", task.getBlockNo());
+        List<BlockStation> stations = blockStationMapper.selectList(wrapper);
+        if (!stations.isEmpty()) {
+            // 鍏堝畬鎴愪换鍔�
+            task.setCompleted(1);
+            task.setCompletedTime(new Date());
+            int updateTask = blockTaskMapper.updateById(task);
+            // 鍐嶆洿鏂板皝閿佸尯鏁伴噺
+            for (BlockStation station : stations) {
+                if (station.getAgvNum() - 1 == 0) {
+                    station.setStatus(0);
+                }
+                station.setAgvNum(station.getAgvNum() - 1);
+                int updateBlock = blockStationMapper.updateById(station);
+            }
+        }
+
+        return 1;
+    }
+
+    // endregion
+
+
+    // region 娴峰悍RCS锛孉GV
+
+    /**
+     * 2.1.2浠诲姟涓嬪彂鎺ュ彛
+     * 鍘傚锛氭捣閲忋�佸崕鏅�
+     *
+     * @param rcsTaskSubmit
+     * @param rcsFactory 1 娴峰悍锛�2 鍗庢檽锛�
+     * @return
+     */
+    public int submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory){
+
+        String url = rcsFactory == 2 ? HIK_URL : HX_URL + "api/robot/controller/task/submit";
+        String response = sendPost(url, rcsTaskSubmit.toString());
+        if (!StringUtils.isEmpty(response) && response.contains("code")){
+            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
+            if("SUCCESS".equals(rcsReturn.getCode())) {
+                JSONObject data = rcsReturn.getData();
+                String robotTaskCode = data.getString("robotTaskCode");
+                if (robotTaskCode.equals(rcsTaskSubmit.getRobotTaskCode())){
+                    return 1;
+                }
+            }
+        }
+
+        return 0;
+    }
+
+    /**
+     * 2.1.3浠诲姟缁х画鎵ц鎺ュ彛
+     *
+     * @param rcsTaskContinue
+     * @param rcsFactory
+     * @return
+     */
+    public int continueTask(RcsTaskContinue rcsTaskContinue, int rcsFactory){
+
+        String url = rcsFactory == 2 ? HIK_URL : HX_URL + "api/robot/controller/task/extend/continue";
+        String response = sendPost(url, rcsTaskContinue.toString());
+        if (!StringUtils.isEmpty(response) && response.contains("code")){
+            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
+            if("SUCCESS".equals(rcsReturn.getCode())) {
+                JSONObject data = rcsReturn.getData();
+                String robotTaskCode = data.getString("robotTaskCode");
+                if (robotTaskCode.equals(rcsTaskContinue.getRobotTaskCode())) {
+                    return 1;
+                }
+            }
+        }
+
+        return 0;
+    }
+
+    /**
+     * 2.1.4浠诲姟鍙栨秷鎺ュ彛
+     *
+     * @param rcsTaskCancel
+     * @param rcsFactory
+     * @return
+     */
+    public int cancelTask(RcsTaskCancel rcsTaskCancel, int rcsFactory){
+
+        String url = rcsFactory == 2 ? HIK_URL : HX_URL + "api/robot/controller/task/cancel";
+        String response = sendPost(url, rcsTaskCancel.toString());
+        if (!StringUtils.isEmpty(response) && response.contains("code")){
+            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
+            if("SUCCESS".equals(rcsReturn.getCode())) {
+                JSONObject data = rcsReturn.getData();
+                String robotTaskCode = data.getString("robotTaskCode");
+                if (robotTaskCode.equals(rcsTaskCancel.getRobotTaskCode())) {
+                    return 1;
+                }
+            }
+        }
+
+        return 0;
+    }
+
+    /**
+     * 2.1.15澶栬鎵ц閫氱煡鎺ュ彛锛岄�氱煡杩涘叆灏侀攣鍖�
+     *
+     * @param rcsEqptNotify
+     * @param rcsFactory
+     * @return
+     */
+    private int notifyEqpt(RcsEqptNotify rcsEqptNotify, int rcsFactory){
+
+        String url = rcsFactory == 2 ? HIK_URL : HX_URL + "api/wcs/robot/eqpt/notify";
+        String response = sendPost(url, rcsEqptNotify.toString());
+        if (!StringUtils.isEmpty(response) && response.contains("code")){
+            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
+            if("SUCCESS".equals(rcsReturn.getCode())) {
+                JSONObject data = rcsReturn.getData();
+                String applyCode = data.getString("taskCode");  //鐢宠璇锋眰缂栧彿锛岄潪浠诲姟缂栧彿
+                if (applyCode.equals(rcsEqptNotify.getTaskCode())) {
+                    return 1;
+                }
+            }
+        }
+
+        return 0;
+    }
+
+    /**
+     * 2.2.1浠诲姟鎵ц鍥為
+     * 鍘傚锛氭捣閲忋�佸崕鏅�
+     *
+     * @param rcsReporterTask
+     * @return
+     */
+    public RcsReturn reporterTask(RcsReporterTask rcsReporterTask) {
+
+        RcsReturn rcsReturn = new RcsReturn();
+
+        String robotTaskCode = rcsReporterTask.getRobotTaskCode();
+        String singleRobotCode = rcsReporterTask.getSingleRobotCode();
+        JSONObject values = rcsReporterTask.getExtra().getJSONObject("values");
+        // start : 浠诲姟寮�濮嬶紱outbin : 璧板嚭鍌ㄤ綅锛沞nd : 浠诲姟瀹屾垚
+        String method = values.getString("method");
+        String carrierType = values.getString("carrierType");
+        String slotCategory = values.getString("slotCategory");
+        String slotCode = values.getString("slotCode");
+
+        try {
+            if ("Q3".equals(carrierType) || "Q8".equals(carrierType)) {    //AGV
+                EntityWrapper<Task> wrapper = new EntityWrapper<>();
+                wrapper.eq("task_no", robotTaskCode);
+                Task task = taskService.selectOne(wrapper);
+                if (task == null || !task.getTaskNo().equals(robotTaskCode)) {
+                    rcsReturn.setCode("Err_RobotCodeNotMatch");
+                    rcsReturn.setMessage("");
+                    JSONObject data = new JSONObject();
+                    data.put("robotTaskCode", robotTaskCode);
+                    rcsReturn.setData(data);
+                    return rcsReturn;
+                }
+                JSONObject memo = JSONObject.parseObject(task.getMemo());
+
+                switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
+                    case TASK_START: {
+                        task.setWrkSts(302L);   // 301 浠诲姟涓嬪彂銆�302 浠诲姟鎵ц銆�303 浠诲姟涓柇銆�304 浠诲姟缁撴潫
+                        task.setModiTime(new Date());
+                        task.setModiUser(defaultUserId);
+                        taskService.updateById(task);
+                    } break;
+                    case TASK_OUT_BIN: {
+                        // TODO锛氱珛搴撳嚭搴撲竴鎵橈紝AGV寮�濮嬭繍杈撳悗锛岀粰MES鍙戦�佸嚭搴撳畬鎴愶紙涓�鎵樺彂涓�娆★級
+                        JSONObject taskMemo = JSONObject.parseObject(task.getMemo());
+                        mesService.outFeedbackByTuo(taskMemo.getString("OrderNo"), task);
+                    } break;
+                    case TASK_END: {
+                        // 鏇存柊浠诲姟鐘舵�佺瓑鍐呴儴閫昏緫
+                        task.setWrkSts(304L);   // 301 浠诲姟涓嬪彂銆�302 浠诲姟鎵ц銆�303 浠诲姟涓柇銆�304 浠诲姟缁撴潫
+                        task.setModiTime(new Date());
+                        task.setModiUser(defaultUserId);
+                        taskService.updateById(task);
+                        // 浠诲姟瀹屾垚
+//                        mesService.reporterTask(rcsReporterTask);
+
+//                    EntityWrapper<TaskDetl> wapper2 = new EntityWrapper<>();
+//                    wapper2.eq("wrk_no", task.getWrkNo())
+//                            .eq("matnr", memo.getString("ItemNo"))
+//                            .eq("order_no", memo.getString("OrderNo"));
+//                    TaskDetl taskDetl = taskDetlService.selectOne(wapper2);
+//                    taskDetl.setAnfme()
+//                    taskDetlService.updateById();
+
+//                    // 301 浠诲姟涓嬪彂銆�302 浠诲姟鎵ц銆�303 浠诲姟涓柇銆�304 浠诲姟缁撴潫
+//                    taskService.completeWrkMast();
+//                    taskDetlService.
+
+                    } break;
+                    case APPLY_IN_STATION:
+                    case APPLY_OFF_STATION:
+                    case ARRIVE_OFF_STATION: {
+                        TransParent apply = new TransParent();
+                        apply.setTaskno(robotTaskCode);
+                        apply.setTaskname(memo.getString("taskName"));
+                        apply.setAgvCode(singleRobotCode);
+                        String transType = memo.getString("TransType");
+                        apply.setTransType(transType);
+                        apply.setProductLineId(memo.getString("ProductLineId"));
+                        if(transType.equals("02") || transType.equals("04") || transType.equals("06")) {
+                            apply.setStationId(task.getSourceStaNo());
+                        } else {
+                            apply.setStationId(task.getStaNo());
+                        }
+
+                        if (RcsRetMethodEnum.APPLY_IN_STATION.getCode().equals(method)) {
+                            mesService.applyInStation(apply);
+                        } else if (RcsRetMethodEnum.APPLY_OFF_STATION.getCode().equals(method)) {
+                            mesService.applyOutStation(apply);
+                        } else if (RcsRetMethodEnum.ARRIVE_OFF_STATION.getCode().equals(method)) {
+                            mesService.outStation(apply);
+                        }
+                    } break;
+                    case ARRIVE_ON_STATION: {
+                        // TODO: 濡傛灉浜х嚎鏄繍杈撹捣鐐癸紝鍒欎笉鍙戦�佸埌绔欏畬鎴愶紝鏆傛椂璋冭瘯浣跨敤lG锛屾湭瀹炵幇鍒ゆ柇
+                        if (rcsReporterTask.getCurrentSeq() == 0 && task.getSourceStaNo().startsWith("LG")) {
+                            break;
+                        }
+
+                        EntityWrapper<TaskDetl> wapper2 = new EntityWrapper<>();
+                        wapper2.eq("wrk_no", task.getWrkNo())
+                                .eq("matnr", memo.getString("Itemno"))
+                                .eq("order_no", memo.getString("OrderNo"));
+                        TaskDetl taskDetl = taskDetlService.selectOne(wapper2);
+                        TransArrivalStation arrivalStation = new TransArrivalStation();
+                        arrivalStation.setTaskno(robotTaskCode);
+                        arrivalStation.setTaskname(memo.getString("taskName"));
+                        arrivalStation.setTuoPanId(taskDetl.getZpallet());  // memo.getString("TuoPanId")
+                        arrivalStation.setProductLineId(memo.getString("ProductLineId"));
+                        String transType = memo.getString("TransType");
+                        arrivalStation.setDaotype(transType);
+                        if(transType.equals("02") || transType.equals("04") || transType.equals("06")) {
+                            arrivalStation.setStationID(task.getSourceStaNo());
+                        } else {
+                            arrivalStation.setStationID(task.getStaNo());
+                        }
+                        arrivalStation.setOrderNo(memo.getString("OrderNo"));
+                        arrivalStation.setAgvCode(singleRobotCode);
+                        arrivalStation.setItemno(memo.getString("Itemno"));
+                        String memo2 = taskDetl.getMemo();
+                        List<String> itemBarCode = new ArrayList<>();
+                        Matcher matcher = Pattern.compile("\"([^\"]*)\"").matcher(memo2);
+                        while (matcher.find()) {
+                            itemBarCode.add(matcher.group(1));
+                        }
+                        arrivalStation.setItemBarcode(itemBarCode);
+                        mesService.arriveOnStation(arrivalStation);
+                    } break;
+                    default: {} break;
+                }
+            } else if ("CTU".equals(carrierType)) { //CTU
+                EntityWrapper<WrkMast> wrapper = new EntityWrapper<>();
+                wrapper.eq("task_no", robotTaskCode);
+                WrkMast task = wrkMastService.selectOne(wrapper);
+                if (task == null || !task.getTaskNo().equals(robotTaskCode)) {
+                    rcsReturn.setCode("Err_RobotCodeNotMatch");
+                    rcsReturn.setMessage("");
+                    JSONObject data = new JSONObject();
+                    data.put("robotTaskCode", robotTaskCode);
+                    rcsReturn.setData(data);
+                    return rcsReturn;
+                }
+//                JSONObject memo = JSONObject.parseObject(task.getMemo());
+
+                switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
+                    case TASK_START: {
+//                        task.setWrkSts(302L);   // 301 浠诲姟涓嬪彂銆�302 浠诲姟鎵ц銆�303 浠诲姟涓柇銆�304 浠诲姟缁撴潫
+//                        task.setModiTime(new Date());
+//                        task.setModiUser(defaultUserId);
+//                        taskService.updateById(task);
+                    } break;
+//                    case TASK_OUT_BIN: {} break;
+                    case TASK_END: {
+                        // 鏇存柊浠诲姟鐘舵�佺瓑鍐呴儴閫昏緫
+                        long wrkSts = task.getWrkSts(); // 1.鍏ュ簱锛�101.鍑哄簱锛�
+                        if (task.getIoType() == 1) {
+                            wrkSts = 4L;
+                        } else if (task.getIoType() == 101) {
+                            wrkSts = 14L;
+                        }
+
+                        task.setWrkSts(wrkSts); // 4.鍏ュ簱瀹屾垚锛�14.宸插嚭搴撴湭纭锛�
+                        task.setModiTime(new Date());
+                        task.setModiUser(defaultUserId);
+                        wrkMastService.updateById(task);
+
+                        // TODO锛氫换鍔″畬鎴愯Е鍙戝嚭鍏ュ簱鍙樻洿鎿嶄綔
+
+
+//                        // 鍏ュ簱瀹屾垚
+//                        mesService.inFeedback(memo.getString("OrderNo"));
+//                        // 鍑哄簱瀹屾垚
+//                        mesService.outFeedback(memo.getString("OrderNo"));
+                    } break;
+                    default: {} break;
+                }
+            }
+
+            // 杩斿洖RCS
+            rcsReturn.setCode("SUCCESS");
+            rcsReturn.setMessage("");
+            JSONObject data = new JSONObject();
+            data.put("robotTaskCode", robotTaskCode);
+            rcsReturn.setData(data);
+        } catch (Exception e) {
+            log.error("RCS鍙嶉浠诲姟杩涘害澶勭悊寮傚父 - {}", rcsReporterTask, e);
+            rcsReturn.setCode("Err_Internal");
+            rcsReturn.setMessage("鍐呴儴澶勭悊寮傚父");
+            JSONObject data = new JSONObject();
+            data.put("robotTaskCode", robotTaskCode);
+            rcsReturn.setData(data);
+        }
+
+        return rcsReturn;
+    }
+
+    /**
+     * 2.2.4璇锋眰澶栬鎺ュ彛锛堣姹傚皝閿佸尯锛�
+     * 鍘傚锛氭捣閲忋�佸崕鏅�
+     *
+     * @param rcsReporterEqpt
+     * @return
+     */
+    public RcsReturn reporterEqpt(RcsReporterEqpt rcsReporterEqpt){
+
+        int success = 0;
+        if ("APPLY_LOCK".equals(rcsReporterEqpt.getMethod())) { //鐢宠
+            success = applyBlock(rcsReporterEqpt);
+        } else if ("RELEASE_EQPT".equals(rcsReporterEqpt.getMethod())) { //閲婃斁
+            success = releaseBlock(rcsReporterEqpt);
+        }
+
+        // 杩斿洖RCS
+        RcsReturn rcsReturn = new RcsReturn();
+        rcsReturn.setCode(success > 0 ? "SUCCESS" : "Err_Internal");
+        rcsReturn.setMessage(success > 0 ? "" : "鍐呴儴閿欒");
+        JSONObject data = new JSONObject();
+        data.put("extra", null);
+        rcsReturn.setData(data);
+
+        return rcsReturn;
+    }
+
+    // endregion
+
+
+    // region 娴峰悍CTU 鍒�鍏峰簱
+
+    // TODO: CTU涓婂眰缁勫弬寮曠敤锛�
+
+    // 2.1.2浠诲姟涓嬪彂鎺ュ彛
+
+    // 2.1.3浠诲姟缁х画鎵ц鎺ュ彛
+
+    // 2.1.4浠诲姟鍙栨秷鎺ュ彛
+
+    // 2.2.1浠诲姟鎵ц鍥為
+
+////    @Transactional(rollbackFor = Exception.class)
+//    public void receiveTaskStatus(RcsReporterTask callbackParam, String method, String stockType, Long hostId) {
+//
+//        JSONObject values = callbackParam.getExtra().getJSONObject("values");
+//        EntityWrapper<Task> wapper = new EntityWrapper<>();
+//        wapper.eq("task_no", callbackParam.getRobotTaskCode());
+//        Task task = taskService.selectOne(wapper);
+//        if (task == null && !StringUtils.isEmpty(task.getWrkNo())) {
+//            if (1 == task.getIoType()) {   // 鍏ュ簱
+//                // 鏇存柊搴撳瓨
+//
+//                // 鏇存柊浠诲姟鐘舵��
+//            } else if (101 == task.getIoType()) {    // 鍑哄簱
+//                // 鏇存柊搴撳瓨
+//
+//                // 鏇存柊浠诲姟鐘舵��
+//
+//                // 璐х墿鍜屾墭鐩樿В缁�
+//            }
+//        }
+//    }
+
+    // endregion
+
+
+    // region 鍗庢檽RCS
+
+    /**
+     * 9.7鐢宠杩涘叆鐢熶骇绾�
+     *
+     * @param apply
+     * @return
+     */
+    public JSONObject hxApplyInLine(TransParent apply) {
+
+        String status = mesService.applyInLine(apply);
+        JSONObject result = new JSONObject();
+        result.put("Success", 1);
+        result.put("Message", status);
+        JSONObject data = new JSONObject();
+        data.put("status", status);
+        result.put("Data", data);
+
+        return result;
+    }
+
+    // endregion
+
+    // region httpUtil
+
+    /**
+     * 鍚戞寚瀹� URL 鍙戦�丳OST鏂规硶鐨勮姹�
+     *
+     * @param url 鍙戦�佽姹傜殑 URL
+     * @param param 璇锋眰鍙傛暟锛岃姹傚弬鏁板簲璇ユ槸 name1=value1&name2=value2 鐨勫舰寮忋��
+     * @return 鎵�浠h〃杩滅▼璧勬簮鐨勫搷搴旂粨鏋�
+     */
+    public static String sendPost(String url, String param) {
+        PrintWriter out = null;
+        BufferedReader in = null;
+        StringBuilder result = new StringBuilder();
+        try
+        {
+            log.info("sendPost - {} - {}", url, param);
+            URL realUrl = new URL(url);
+            URLConnection conn = realUrl.openConnection();
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            conn.setRequestProperty("Accept-Charset", "utf-8");
+            conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
+            conn.setConnectTimeout(5000);
+            conn.setReadTimeout(5000);
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            out = new PrintWriter(conn.getOutputStream());
+            out.print(param);
+            out.flush();
+            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
+            String line;
+            while ((line = in.readLine()) != null)
+            {
+                result.append(line);
+            }
+            log.info("recv - {}", result);
+        }
+        catch (ConnectException e)
+        {
+            log.error("璋冪敤HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
+        }
+        catch (SocketTimeoutException e)
+        {
+            log.error("璋冪敤HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+        }
+        catch (IOException e)
+        {
+            log.error("璋冪敤HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
+        }
+        catch (Exception e)
+        {
+            log.error("璋冪敤HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
+        }
+        finally
+        {
+            try
+            {
+                if (out != null)
+                {
+                    out.close();
+                }
+                if (in != null)
+                {
+                    in.close();
+                }
+            }
+            catch (IOException ex)
+            {
+                log.error("璋冪敤in.close Exception, url=" + url + ",param=" + param, ex);
+            }
+        }
+        return result.toString();
+    }
+
+    // endregion
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/TaskDetlLogServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/TaskDetlLogServiceImpl.java
index 5c2334e..5e37433 100644
--- a/src/main/java/com/zy/asrs/service/impl/TaskDetlLogServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/TaskDetlLogServiceImpl.java
@@ -30,18 +30,18 @@
     @Transactional(rollbackFor = Exception.class)
     public boolean save(Integer wrkNo) {
         List<TaskDetl> detls = taskDetlService.selectList(new EntityWrapper<TaskDetl>().eq("wrk_no", wrkNo));
-        if (Objects.isNull(detls) || detls.isEmpty()) {
-            throw new CoolException("鏁版嵁閿欒锛氫换鍔′笉瀛樺湪锛侊紒");
+        if (!detls.isEmpty()) {
+            detls.forEach(detl -> {
+                TaskDetlLog detlLog = new TaskDetlLog();
+                BeanUtils.copyProperties(detl, detlLog);
+                detlLog.setId(null);
+                detlLog.setLogId(detl.getId());
+                if (!this.insert(detlLog)) {
+                    throw new CoolException("宸ヤ綔妗f槑缁嗗巻鍙蹭繚瀛樺け璐ワ紒锛�");
+                }
+            });
         }
-        detls.forEach(detl -> {
-            TaskDetlLog detlLog = new TaskDetlLog();
-            BeanUtils.copyProperties(detl, detlLog);
-            detlLog.setId(null);
-            detlLog.setLogId(detl.getId());
-            if (!this.insert(detlLog)) {
-                throw new CoolException("宸ヤ綔妗f槑缁嗗巻鍙蹭繚瀛樺け璐ワ紒锛�");
-            }
-        });
-        return false;
+
+        return true;
     }
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/TaskLogServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/TaskLogServiceImpl.java
index cd66568..fc1f532 100644
--- a/src/main/java/com/zy/asrs/service/impl/TaskLogServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/TaskLogServiceImpl.java
@@ -40,10 +40,8 @@
         BeanUtils.copyProperties(task, taskLog);
         taskLog.setLogId(task.getId());
 
-        if (!this.insert(taskLog)) {
-            throw new CoolException("浠诲姟鏃ュ織淇濆瓨澶辫触锛侊紒");
-        }
+        this.insert(taskLog);
 
-        return false;
+        return true;
     }
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/TaskServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/TaskServiceImpl.java
index a983123..1bd3253 100644
--- a/src/main/java/com/zy/asrs/service/impl/TaskServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/TaskServiceImpl.java
@@ -165,16 +165,16 @@
                 locSts = "D";
                 // 搴撲綅杞Щ ===>> D.绌烘《/绌烘爤鏉�
             } else if (wrkMast.getIoType() == 11) {
-                locSts = wrkMast.getFullPlt().equalsIgnoreCase("N") ? "D" : "F";
-                // 搴撲綅杞Щ锛氱洰鏍囧簱浣�
-                LocCache locMast = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", wrkMast.getLocNo()));
-                if (Cools.isEmpty(locMast)) {
-                    throw new CoolException("鍙栨秷搴撲綅杞Щ澶辫触锛岀洰鏍囧簱浣嶄笉瀛樺湪:" + wrkMast.getSourceLocNo());
-                }
-                locMast.setLocSts("O");
-                locMast.setModiTime(now);
-                locMast.setModiUser(userId);
-                locCacheService.updateById(locMast);
+//                locSts = wrkMast.getFullPlt().equalsIgnoreCase("N") ? "D" : "F";
+//                // 搴撲綅杞Щ锛氱洰鏍囧簱浣�
+//                LocCache locMast = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", wrkMast.getLocNo()));
+//                if (Cools.isEmpty(locMast)) {
+//                    throw new CoolException("鍙栨秷搴撲綅杞Щ澶辫触锛岀洰鏍囧簱浣嶄笉瀛樺湪:" + wrkMast.getSourceLocNo());
+//                }
+//                locMast.setLocSts("O");
+//                locMast.setModiTime(now);
+//                locMast.setModiUser(userId);
+//                locCacheService.updateById(locMast);
             }
         } else {
             throw new CoolException("褰撳墠宸ヤ綔鐘舵�佹棤娉曞彇娑�");
@@ -271,17 +271,17 @@
         }
 
         // 淇敼搴撲綅鐘舵��
-        LocCache locMast = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", locNo));
-        if (Cools.isEmpty(locMast)) {
-            throw new CoolException("鍙栨秷宸ヤ綔妗eけ璐ワ紝搴撲綅涓嶅瓨鍦�:" + locNo);
-        }
-        locMast.setLocSts(locSts);
-        locMast.setModiTime(now);
-        locMast.setModiUser(userId);
-        boolean locMastRes = locCacheService.updateById(locMast);
-        if (!wrkMastRes || !locMastRes) {
-            throw new CoolException("淇濆瓨鏁版嵁澶辫触");
-        }
+//        LocCache locMast = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", locNo));
+//        if (Cools.isEmpty(locMast)) {
+//            throw new CoolException("鍙栨秷宸ヤ綔妗eけ璐ワ紝搴撲綅涓嶅瓨鍦�:" + locNo);
+//        }
+//        locMast.setLocSts(locSts);
+//        locMast.setModiTime(now);
+//        locMast.setModiUser(userId);
+//        boolean locMastRes = locCacheService.updateById(locMast);
+//        if (!wrkMastRes || !locMastRes) {
+//            throw new CoolException("淇濆瓨鏁版嵁澶辫触");
+//        }
     }
 
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
index 86a7212..2c21f63 100644
--- a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -370,6 +370,12 @@
                 wrkDetl.setAppeUser(userId);
                 wrkDetl.setModiTime(now);
                 wrkDetl.setModiUser(userId);
+                wrkDetl.setMatnr(detlDto.getLocDetl().getMatnr());
+                wrkDetl.setMaktx(detlDto.getLocDetl().getMaktx());
+                wrkDetl.setUnit(detlDto.getLocDetl().getUnit());
+                wrkDetl.setSpecs(detlDto.getLocDetl().getSpecs());
+                wrkDetl.setUnit(detlDto.getLocDetl().getUnit());
+                wrkDetl.setModel(detlDto.getLocDetl().getModel());
                 if (!wrkDetlService.insert(wrkDetl)) {
                     throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
                 }
@@ -457,6 +463,11 @@
             wrkDetl.setAppeUser(userId);
             wrkDetl.setModiTime(now);
             wrkDetl.setModiUser(userId);
+            wrkDetl.setMatnr(orderDetl.getMatnr());
+            wrkDetl.setMaktx(orderDetl.getMaktx());
+            wrkDetl.setSpecs(orderDetl.getSpecs());
+            wrkDetl.setModel(orderDetl.getModel());
+            wrkDetl.setUnit(orderDetl.getUnit());
             if (!wrkDetlService.insert(wrkDetl)) {
                 throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
             }
@@ -1224,7 +1235,7 @@
     @Override
     @Transactional
     public void pickWrkMast(String workNo, Long userId) {
-        WrkMast wrkMast = wrkMastService.selectById(workNo);
+        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",workNo));
         if (Cools.isEmpty(wrkMast)) {
             throw new CoolException(workNo + "宸ヤ綔妗d笉瀛樺湪");
         }
@@ -1247,7 +1258,7 @@
         // 鑾峰彇鐩爣绔�
         Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                 .eq("type_no", wrkMast.getIoType() - 50)
-                .eq("stn_no", wrkMast.getStaNo()) // 浣滀笟绔欑偣 = 鎷f枡鍑哄簱鐨勭洰鏍囩珯
+                .eq("stn_no", Integer.parseInt(wrkMast.getStaNo())-2) // 浣滀笟绔欑偣 = 鎷f枡鍑哄簱鐨勭洰鏍囩珯
                 .eq("crn_no", wrkMast.getCrnNo()); // 鍫嗗灈鏈哄彿
         StaDesc staDesc = staDescService.selectOne(wrapper);
         if (Cools.isEmpty(staDesc)) {
diff --git a/src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java
index 3eaaa7a..9cd517b 100644
--- a/src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java
@@ -45,6 +45,11 @@
             wrkDetl.setAppeTime(now);
             wrkDetl.setModiUser(userId);
             wrkDetl.setModiTime(now);
+            wrkDetl.setMatnr(mat.getMatnr());
+            wrkDetl.setMaktx(mat.getMaktx());
+            wrkDetl.setSpecs(mat.getSpecs());
+            wrkDetl.setModel(mat.getModel());
+            wrkDetl.setUnit(mat.getUnit());
             if (!this.insert(wrkDetl)) {
                 throw new CoolException("淇濆瓨宸ヤ綔鏄庣粏澶辫触");
             }
diff --git a/src/main/java/com/zy/asrs/task/BlockScheduler.java b/src/main/java/com/zy/asrs/task/BlockScheduler.java
new file mode 100644
index 0000000..3c2ca15
--- /dev/null
+++ b/src/main/java/com/zy/asrs/task/BlockScheduler.java
@@ -0,0 +1,26 @@
+package com.zy.asrs.task;
+
+import com.zy.asrs.service.RcsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@Component
+public class BlockScheduler {
+
+    @Resource
+    private RcsService rcsService;
+
+    /**
+     * 绠$悊灏侀攣鍖鸿姹�
+     *
+     */
+    @Scheduled(cron = "0/3 * * * * ? ")
+    private void execute(){
+//        rcsService.managerBlock();
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/task/OrderMoveHistoryScheduler.java b/src/main/java/com/zy/asrs/task/OrderMoveHistoryScheduler.java
index c2a7f49..df95659 100644
--- a/src/main/java/com/zy/asrs/task/OrderMoveHistoryScheduler.java
+++ b/src/main/java/com/zy/asrs/task/OrderMoveHistoryScheduler.java
@@ -6,7 +6,7 @@
 import org.springframework.stereotype.Component;
 
 
-@Component
+//@Component
 public class OrderMoveHistoryScheduler {
     @Autowired
     private OrderMoveHistoryHandler orderMoveHistoryHandler;
@@ -14,7 +14,7 @@
     /**
      * 灏嗗凡瀹屾垚order鍜宱rderDetl绉诲姩鍒發og琛�
      */
-    @Scheduled(cron = "0/30 * * * * ?")
+//    @Scheduled(cron = "0/30 * * * * ?")
     public void execute(){
         orderMoveHistoryHandler.start();
     }
@@ -22,7 +22,7 @@
     /**
      * 灏嗗凡涓婃姤order鍜宱rderDetl绉诲姩鍒發og琛�
      */
-    @Scheduled(cron = "0/30 * * * * ?")
+//    @Scheduled(cron = "0/30 * * * * ?")
     public void executeOrder(){
         orderMoveHistoryHandler.startOrder();
     }
diff --git a/src/main/java/com/zy/asrs/task/OrderSyncScheduler.java b/src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
index ef69df3..c6f6da8 100644
--- a/src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
+++ b/src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -1,9 +1,15 @@
 package com.zy.asrs.task;
 
+import com.alibaba.excel.util.StringUtils;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.Cools;
-import com.zy.asrs.entity.Order;
-import com.zy.asrs.service.ApiLogService;
-import com.zy.asrs.service.OrderService;
+import com.zy.asrs.entity.*;
+import com.zy.asrs.entity.mes.MesInApply;
+import com.zy.asrs.entity.mes.MesRecvFeedback;
+import com.zy.asrs.entity.mes.MesReturn;
+import com.zy.asrs.service.*;
+import com.zy.asrs.service.impl.RcsServiceImpl;
 import com.zy.asrs.task.core.ReturnT;
 import com.zy.asrs.task.handler.OrderSyncHandler;
 import com.zy.asrs.utils.OrderInAndOutUtil;
@@ -15,7 +21,11 @@
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * updated by IX in 2024/12/17
@@ -30,6 +40,18 @@
     private OrderService orderService;
     @Autowired
     private ApiLogService apiLogService;
+    @Resource
+    private OrderPakinService orderPakinService;
+    @Resource
+    private OrderPakoutService orderPakoutService;
+    @Resource
+    private MesService mesService;
+
+    @Resource
+    private OrderDetlPakinService orderDetlPakinService;
+
+    @Value("${mes.url}")
+    public String MES_URL;
 
     @Value("${erp.switch.ErpReportOld}")
     private boolean ErpReportOld;
@@ -43,7 +65,7 @@
         }
     }
 
-    @Scheduled(cron = "0 1 * * * ? ")
+//    @Scheduled(cron = "0 1 * * * ? ")
     @Async("orderThreadPool")
     public void completeAndReportOrderIssuedOnceMore() {
         List<Order> orderList = orderService.selectComplete99();
@@ -60,7 +82,7 @@
         }
     }
 
-    @Scheduled(cron = "0/30 * * * * ? ")
+//    @Scheduled(cron = "0/30 * * * * ? ")
     @Async("orderThreadPool")
     public void completeAndReportOrderIssued() {
 //        String erpReport = Parameter.get().getErpReport();
@@ -101,26 +123,126 @@
 //        }
     }
 
-//    @Scheduled(cron = "0/30 * * * * ? ")
+    // 鍏ュ簱璁㈠崟瀹屾垚涓婃姤-棰嗘枡鍗曪紝鍘熸潗鏂�
+    @Scheduled(cron = "0/30 * * * * ? ")
     @Async("orderThreadPool")
-    public void completeAndReportOrderReport() {
-        if (!ErpReportOld){
-            return;
-        }
+    void inOrderCompleteReport() {
         String erpReport = Parameter.get().getErpReport();
         if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
-            List<Order> orders = orderService.selectComplete();
-            for (Order order : orders) {
-                try {
-                    ReturnT<String> result = orderSyncHandler.startOrderReport(order);
-                    if (!result.isSuccess()) {
-                        log.error("鍗曟嵁[orderNo={}]涓婃姤erp澶辫触", order.getOrderNo());
-                    }
-                } catch (Exception e) {
-                    log.error(e.getMessage());
-                    log.error("鍗曟嵁[orderNo={}]涓婃姤erp澶辫触", order.getOrderNo());
+            OrderPakin orderPakin = orderPakinService.selectOne(new EntityWrapper<OrderPakin>().eq("settle", 4)
+                    .eq("doc_type",4).orderBy("update_time"));
+            if (orderPakin == null) {
+                return;
+            }
+            String orderNo = orderPakin.getOrderNo();
+            List<OrderDetlPakin> orderDetlPakins = orderDetlPakinService.selectByOrderId(orderPakin.getId());
+            List<MesRecvFeedback.MesRecvFeedbackItem> list = new ArrayList<>();
+            JSONObject dbMemo = JSONObject.parseObject(orderPakin.getMemo());
+
+            for (OrderDetlPakin orderDetl : orderDetlPakins) {
+                MesRecvFeedback.MesRecvFeedbackItem item = new MesRecvFeedback.MesRecvFeedbackItem();
+                item.setItemNo(orderDetl.getMatnr());
+                item.setOrderNo(orderNo);
+                item.setQty(orderDetl.getAnfme().intValue());
+                item.setRealQty(orderDetl.getAnfme().intValue());
+                // 鍥炰紶鎵樼洏缁戝畾鐨勯浂浠朵簩缁寸爜
+                String itemBarcode = orderDetl.getStandby1();
+                List<String> itemBarCodeList = new ArrayList<>();
+                Matcher matcher = Pattern.compile("\"([^\"]*)\"").matcher(itemBarcode);
+                while (matcher.find()) {
+                    itemBarCodeList.add(matcher.group(1));
+                }
+                item.setItemBarcode(itemBarCodeList);
+                list.add(item);
+            }
+            MesRecvFeedback mesRecvFeedback = new MesRecvFeedback();
+            mesRecvFeedback.setSourceNo(dbMemo.getString("sourceNo"));
+            mesRecvFeedback.setOperuser(dbMemo.getString("operuser"));
+            mesRecvFeedback.setItemdata(list);
+
+            String url = MES_URL + "MaterialReceiptAndReturn";
+            String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(mesRecvFeedback));
+            if (!StringUtils.isEmpty(response) && response.contains("Success")) {
+                MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+                if ("1".equals(mesReturn.getSuccess())) {
+                    orderPakin.setSettle(6L);
+                    orderPakinService.updateById(orderPakin);
+                    log.info("璁㈠崟涓婃姤鎴愬姛锛宱rderNo={}", orderNo);
                 }
             }
         }
     }
+
+    // 鍏朵粬鍏ュ簱鍗曚笂鎶�
+    @Scheduled(cron = "0/30 * * * * ? ")
+    @Async("orderThreadPool")
+    void otherInOrderCompleteReport() {
+        String erpReport = Parameter.get().getErpReport();
+        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
+            OrderPakin orderPakin = orderPakinService.selectOne(new EntityWrapper<OrderPakin>().eq("settle", 4)
+                    .eq("doc_type", 3).orderBy("update_time"));
+            if (orderPakin == null) {
+                return;
+            }
+            List<OrderDetlPakin> orderDetlPakins = orderDetlPakinService.selectByOrderId(orderPakin.getId());
+            for (OrderDetlPakin orderDetl : orderDetlPakins) {
+                MesInApply result = JSONObject.parseObject(orderPakin.getMemo(), MesInApply.class);
+                result.setQty(orderDetl.getQty().intValue());
+
+//                String url = MES_URL + "loadComplete";
+//                String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(result));
+//                if (!StringUtils.isEmpty(response) && response.contains("Success")) {
+//                    MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+//                    if ("1".equals(mesReturn.getSuccess())) {
+                        orderPakin.setSettle(6L);
+                        orderPakinService.updateById(orderPakin);
+                        log.info("璁㈠崟涓婃姤鎴愬姛锛宱rderNo={}", orderPakin.getOrderNo());
+//                    }
+//                }
+            }
+        }
+    }
+
+//    @Scheduled(cron = "0/30 * * * * ? ")
+    @Async("orderThreadPool")
+    public void completeAndReportOrderReport() {
+
+//        // 鍏ュ簱瀹屾垚
+//        List<OrderPakin> pakins = orderPakinService.selectComplete();
+//        for (OrderPakin orderPakin : pakins) {
+//            try {
+//                 mesService.inFeedback(orderPakin.getOrderNo());
+//            } catch (Exception e) {
+//                log.error("鎺ㄩ�佸叆搴撳畬鎴愪俊鎭敊璇�, order{}", orderPakin, e);
+//            }
+//        }
+
+//        List<OrderPakout> pakouts = orderPakoutService.selectComplete();
+//        for (OrderPakout orderPakout : pakouts) {
+//            try {
+//                mesService.outFeedback(orderPakout.getOrderNo());
+//            } catch (Exception e) {
+//                log.error("鎺ㄩ�佸嚭搴撳畬鎴愪俊鎭敊璇�, order{}", orderPakout, e);
+//            }
+//        }
+
+//        if (!ErpReportOld){
+//            return;
+//        }
+//        String erpReport = Parameter.get().getErpReport();
+//        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
+//            List<Order> orders = orderService.selectComplete();
+//            for (Order order : orders) {
+//                try {
+//                    ReturnT<String> result = orderSyncHandler.startOrderReport(order);
+//                    if (!result.isSuccess()) {
+//                        log.error("鍗曟嵁[orderNo={}]涓婃姤erp澶辫触", order.getOrderNo());
+//                    }
+//                } catch (Exception e) {
+//                    log.error(e.getMessage());
+//                    log.error("鍗曟嵁[orderNo={}]涓婃姤erp澶辫触", order.getOrderNo());
+//                }
+//            }
+//        }
+    }
 }
diff --git a/src/main/java/com/zy/asrs/task/WorkMastScheduler.java b/src/main/java/com/zy/asrs/task/WorkMastScheduler.java
index 0d39e15..714bd84 100644
--- a/src/main/java/com/zy/asrs/task/WorkMastScheduler.java
+++ b/src/main/java/com/zy/asrs/task/WorkMastScheduler.java
@@ -2,6 +2,7 @@
 
 import com.zy.asrs.entity.Task;
 import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.service.MesService;
 import com.zy.asrs.service.TaskService;
 import com.zy.asrs.service.WrkMastService;
 import com.zy.asrs.task.core.ReturnT;
@@ -12,6 +13,7 @@
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
 import java.util.Date;
 import java.util.List;
 
@@ -29,6 +31,9 @@
     private WorkMastHandler workMastHandler;
     @Autowired
     private TaskService taskService;
+    @Resource
+    private MesService mesService;
+    // TODO锛歳eporterTask()
 
     @Scheduled(cron = "0/3 * * * * ? ")
     private void execute(){
diff --git a/src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java b/src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java
index 002d171..761e68a 100644
--- a/src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java
@@ -8,10 +8,7 @@
 import com.zy.asrs.entity.DocType;
 import com.zy.asrs.entity.Order;
 import com.zy.asrs.entity.OrderDetl;
-import com.zy.asrs.service.ApiLogService;
-import com.zy.asrs.service.DocTypeService;
-import com.zy.asrs.service.OrderDetlService;
-import com.zy.asrs.service.OrderService;
+import com.zy.asrs.service.*;
 import com.zy.asrs.task.AbstractHandler;
 import com.zy.asrs.task.core.ReturnT;
 import com.zy.asrs.utils.OrderInAndOutUtil;
@@ -26,6 +23,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -46,6 +44,14 @@
     private ApiLogService apiLogService;
     @Autowired
     private DocTypeService docTypeService;
+    @Resource
+    private MesService mesService;
+    //TODO锛氬畬鎴愯鍗曟椂鎺ㄩ�丮ES recvFeedback(orderNo);
+    // mesService.inFeedback(memo.getString("OrderNo"));
+    //                        // 鍑哄簱瀹屾垚
+    //                        mesService.outFeedback(memo.getString("OrderNo"));
+
+
 
     @Transactional
     public ReturnT<String> startOrderIssuedOnceMore(Order order) {
diff --git a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
index 2d3edb0..4d77aac 100644
--- a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -131,6 +131,11 @@
                             locDetl.setZpallet(wrkDetl.getZpallet()); // 鎵樼洏鏉$爜
                             locDetl.setModiTime(now);
                             locDetl.setAppeTime(now);
+                            locDetl.setMatnr(wrkDetl.getMatnr());
+                            locDetl.setMaktx(wrkDetl.getMaktx());
+                            locDetl.setSpecs(wrkDetl.getSpecs());
+                            locDetl.setUnit(wrkDetl.getUnit());
+                            locDetl.setZpallet(wrkDetl.getZpallet());
                             if (!locDetlService.insert(locDetl)) {
 //                                exceptionHandle("鍏ㄦ澘鍏ュ簱 ===>> 娣诲姞搴撳瓨鏄庣粏澶辫触锛沎workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -202,6 +207,11 @@
                             locDetl.setZpallet(wrkDetl.getZpallet()); // 鎵樼洏鏉$爜
                             locDetl.setModiTime(now);
                             locDetl.setAppeTime(now);
+                            locDetl.setMatnr(wrkDetl.getMatnr());
+                            locDetl.setMaktx(wrkDetl.getMaktx());
+                            locDetl.setSpecs(wrkDetl.getSpecs());
+                            locDetl.setUnit(wrkDetl.getUnit());
+                            locDetl.setZpallet(wrkDetl.getZpallet());
                             if (!locDetlService.insert(locDetl)) {
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                 return FAIL.setMsg("鎷f枡閫斾腑骞舵澘 ===>> 娣诲姞搴撳瓨鏄庣粏澶辫触; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
@@ -308,6 +318,11 @@
                             locDetl.setZpallet(wrkDetl.getZpallet()); // 鎵樼洏鏉$爜
                             locDetl.setModiTime(now);
                             locDetl.setAppeTime(now);
+                            locDetl.setMatnr(wrkDetl.getMatnr());
+                            locDetl.setMaktx(wrkDetl.getMaktx());
+                            locDetl.setSpecs(wrkDetl.getSpecs());
+                            locDetl.setUnit(wrkDetl.getUnit());
+                            locDetl.setZpallet(wrkDetl.getZpallet());
                             if (!locDetlService.insert(locDetl)) {
                                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                 return FAIL.setMsg("骞舵澘鍏ュ簱 ===>> 鏂板搴撳瓨鏄庣粏澶辫触; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
diff --git a/src/main/java/com/zy/asrs/utils/VersionUtils.java b/src/main/java/com/zy/asrs/utils/VersionUtils.java
index bdf8dd8..9c0c680 100644
--- a/src/main/java/com/zy/asrs/utils/VersionUtils.java
+++ b/src/main/java/com/zy/asrs/utils/VersionUtils.java
@@ -28,7 +28,7 @@
      **/
     public static boolean locMoveCheckLocTypeComplete(LocMast loc, LocTypeDto dto) {
         // 濡傛灉婧愬簱浣嶆槸楂樺簱浣嶏紝鐩爣搴撲綅鏄綆搴撲綅
-        return dto.getLocType1().equals(loc.getLocType1());
+        return dto.getLocType1().equals(loc.getLocType2());
     }
 
 }
diff --git a/src/main/java/com/zy/common/config/ControllerResAdvice.java b/src/main/java/com/zy/common/config/ControllerResAdvice.java
index a4cdc97..4546239 100644
--- a/src/main/java/com/zy/common/config/ControllerResAdvice.java
+++ b/src/main/java/com/zy/common/config/ControllerResAdvice.java
@@ -3,6 +3,7 @@
 import com.alibaba.fastjson.JSON;
 import com.core.common.Cools;
 import com.core.common.R;
+import com.zy.asrs.entity.mes.MesReturn;
 import com.zy.asrs.service.ApiLogService;
 import com.zy.common.utils.IpTools;
 import lombok.extern.slf4j.Slf4j;
@@ -59,6 +60,21 @@
                         );
                     }
                 }
+                if (o instanceof MesReturn) {
+                    MesReturn mesReturn = (MesReturn) o;
+                    String appkey = request.getHeader("appkey");
+                    Object reqCache = request.getAttribute("cache");
+                        // 淇濆瓨鎺ュ彛鏃ュ織
+                        apiLogService.save(
+                                String.valueOf(appAuth),
+                                request.getRequestURI(),
+                                appkey,
+                                IpTools.gainRealIp(request),
+                                reqCache==null?"": JSON.toJSONString(reqCache),
+                                JSON.toJSONString(o),
+                                String.valueOf(mesReturn.getSuccess()).equalsIgnoreCase("1")
+                        );
+                }
             }
         }
         return o;
diff --git a/src/main/java/com/zy/common/config/LogAspect.java b/src/main/java/com/zy/common/config/LogAspect.java
new file mode 100644
index 0000000..533e920
--- /dev/null
+++ b/src/main/java/com/zy/common/config/LogAspect.java
@@ -0,0 +1,112 @@
+package com.zy.common.config;
+
+import com.core.common.R;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.rmi.NoSuchObjectException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * Created by Administrator on 2019-07-09.
+ */
+@Component
+@Aspect
+@Slf4j
+@Order(2)
+public class LogAspect {
+
+    private final List<String> logApiList = Stream.of("digitalTwin", "api/mes", "api/robot")
+            .collect(Collectors.toList());
+
+    public LogAspect() {
+    }
+
+    /**
+     * 鍒囧叆鐐�
+     */
+    @Pointcut("execution(* com.zy.asrs.controller.*.*(..))") // && !execution(* com.lg.iac.controller.PictureController.*(..))
+    public void controllerPc() {
+    }
+
+    /**
+     * 鐜粫閫氱煡
+     * @param pjp ProceedingJoinPoint
+     * @return 鏂规硶缁撴灉
+     */
+    @Around("controllerPc()")
+    public Object around(ProceedingJoinPoint pjp) {
+        try {
+            ServletRequestAttributes attributes = Optional.ofNullable((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
+                    .orElseThrow(() -> new NoSuchObjectException("鍓嶇疆閫氱煡涓幏鍙栫殑 ServletRequestAttributes 瀵硅薄涓虹┖"));
+            HttpServletRequest request = attributes.getRequest();
+
+            if(urlContain(request.getRequestURL().toString())){
+                // 鍓嶇疆閫氱煡
+                log.info("------銆愬墠缃�氱煡銆�------");
+                // 璁板綍璇锋眰鍐呭
+                log.info("娴忚鍣ㄨ緭鍏ョ殑缃戝潃锛歿}", request.getRequestURL().toString());
+                log.info("HTTP_METHOD锛歿}", request.getMethod());
+                log.info("IP锛歿}", request.getRemoteAddr());
+                log.info("鎵ц鐨勪笟鍔℃柟娉曞悕锛歿}", pjp.getSignature().getDeclaringTypeName() + "." + pjp.getSignature().getName());
+                log.info("涓氬姟鏂规硶鑾峰緱鐨勫弬鏁帮細{}", Arrays.toString(pjp.getArgs()));
+
+                Object result = pjp.proceed();
+
+                // 鍚庣疆閫氱煡
+                log.info("------銆愬悗缃�氱煡銆�------");
+                log.info("{}鏂规硶鐨勮繑鍥炲�硷細{}", pjp.getSignature().getName(), result);
+                return result;
+            } else {
+                return pjp.proceed();
+            }
+        } catch (Throwable e) {
+            // 寮傚父閫氱煡
+            log.error("------銆愬紓甯搁�氱煡銆�------");
+            log.error("{}鏂规硶寮傚父锛屽弬鏁帮細{}锛屽紓甯革細", pjp.getSignature().getName(), Arrays.toString(pjp.getArgs()), e);
+            return R.error("鏈嶅姟鍣ㄥ鐞嗘暟鎹紓甯�");
+        } finally {
+            try{
+                ServletRequestAttributes attributes = Optional.ofNullable((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
+                        .orElseThrow(() -> new NoSuchObjectException("鍓嶇疆閫氱煡涓幏鍙栫殑 ServletRequestAttributes 瀵硅薄涓虹┖"));
+                HttpServletRequest request = attributes.getRequest();
+                if(urlContain(request.getRequestURL().toString())){
+                    // 鏈�缁堥�氱煡
+                    log.info("------銆愭渶缁堥�氱煡銆�------");
+                    log.info("{}鏂规硶鎵ц缁撴潫", pjp.getSignature().getName());
+                }
+            } catch (Exception ignored){
+            }
+        }
+    }
+
+    /**
+     * 鏄惁涓嶅寘鍚繃婊ゆ棩蹇楁帴鍙�
+     *
+     * @param url
+     * @return
+     */
+    private boolean urlContain(String url){
+        boolean have = false;
+        for(String str : logApiList){
+            if(url.contains(str)){
+                have = true;
+                return have;
+            }
+        }
+        return have;
+    }
+
+}
diff --git a/src/main/java/com/zy/common/config/WebConfig.java b/src/main/java/com/zy/common/config/WebConfig.java
index 91f0c82..6695972 100644
--- a/src/main/java/com/zy/common/config/WebConfig.java
+++ b/src/main/java/com/zy/common/config/WebConfig.java
@@ -1,7 +1,8 @@
 package com.zy.common.config;
 
-import com.zy.common.constant.MesConstant;
-import com.zy.common.utils.Http;
+//import com.zy.common.constant.MesConstant;
+//import com.zy.common.route.RouteFilter;
+//import com.zy.common.utils.Http;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
@@ -15,6 +16,7 @@
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -30,11 +32,22 @@
 
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
+//        registry.addInterceptor(new RouteFilter())
+//                .addPathPatterns("/api/robot") // 鎷︽埅璺緞
+//                .excludePathPatterns("/static/**"); // 鎺掗櫎闈欐�佽祫婧�
         registry.addInterceptor(adminInterceptor)
                 .addPathPatterns("/**")
         ;
     }
 
+//    @Bean
+//    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
+//        RequestMappingHandlerMapping handlerMapping = new CustomRequestMappingHandlerMapping();
+//        handlerMapping.setOrder(0);
+//        handlerMapping.setInterceptors(new RouteFilter());
+//        return handlerMapping;
+//    }
+
     @Override
     public void addCorsMappings(CorsRegistry registry) {
         registry.addMapping("/**")
diff --git a/src/main/java/com/zy/common/model/LocTypeDto.java b/src/main/java/com/zy/common/model/LocTypeDto.java
index c6630aa..154c4b8 100644
--- a/src/main/java/com/zy/common/model/LocTypeDto.java
+++ b/src/main/java/com/zy/common/model/LocTypeDto.java
@@ -26,13 +26,13 @@
     }
 
     public LocTypeDto(BasDevp basDevp) {
-        if (basDevp.getLocType1() == null || basDevp.getLocType1() == 0) {
+        if (basDevp.getLocType2() == null || basDevp.getLocType2() == 0) {
             throw new CoolException("plc楂樹綆妫�娴嬪紓甯�");
         }
-        if (basDevp.getLocType1() == 1) {
-            this.locType1 = 1; // 浣庡簱浣�
+        if (basDevp.getLocType2() == 1) {
+            this.locType2 = 1; // 浣庡簱浣�
         } else {
-            this.locType1 = 2; // 楂樺簱浣�
+            this.locType2 = 2; // 楂樺簱浣�
         }
         log.info(JSON.toJSONString(this));
     }
diff --git a/src/main/java/com/zy/common/route/RouteFilter.java b/src/main/java/com/zy/common/route/RouteFilter.java
new file mode 100644
index 0000000..1b7a07e
--- /dev/null
+++ b/src/main/java/com/zy/common/route/RouteFilter.java
@@ -0,0 +1,159 @@
+package com.zy.common.route;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.zy.asrs.entity.AgvInfo;
+import com.zy.asrs.entity.rcs.RcsReporterEqpt;
+import com.zy.asrs.entity.rcs.RcsReporterTask;
+import com.zy.asrs.entity.rcs.RcsReturn;
+import com.zy.asrs.mapper.AgvInfoMapper;
+import com.zy.asrs.service.RcsService;
+import com.zy.asrs.service.impl.RcsServiceImpl;
+import lombok.Value;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tika.utils.StringUtils;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
+
+@Slf4j
+@Component
+public class RouteFilter implements HandlerInterceptor {
+
+    private static final String[] WAREHOUSE_CODE = {"dj", "jg", "ljq", "hk"};
+//    private static final String[] WAREHOUSE = {"鍒�鍏峰簱", "鍔犲伐搴�", "鑱旂粨鍣ㄨ閰嶅簱", "婊戝潡搴�"};
+//    @Value("${mes}")
+    private static Integer CURRENT_WMS_ID = 4;  //婊戝潡
+
+    @Resource
+    private RcsService rcsService;
+    @Resource
+    private AgvInfoMapper agvInfoMapper;
+
+
+    // 璇锋眰鍓�
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+
+//        if (findIndex(request) != CURRENT_WMS_ID) {
+//            // 杞彂
+//            // 鑾峰彇RequestDispatcher瀵硅薄
+//            RequestDispatcher dispatcher = request.getRequestDispatcher("/SecondServlet");
+//
+//            // 杞彂璇锋眰鍒癝econdServlet
+//            dispatcher.forward(request, response);
+//
+////            forward(request);
+//        }
+
+        forward(request, response);
+
+//        long startTime = System.currentTimeMillis();
+//        System.out.println("preHandle锛孖n:" + startTime);
+//        request.setAttribute("startTime", startTime);
+        return true;
+    }
+
+    // TODO:璇锋眰杞彂涓庡搷搴旈噸瀹氬悜  //TODO:HttpServletRequest璇诲彇涓�娆″悗涓嶈兘鍐嶄娇鐢紝闇�閲嶆瀯涓嬮�昏緫椤哄簭
+    private void forward(HttpServletRequest request, HttpServletResponse response) throws IOException {
+
+        String url = request.getRequestURI();
+        StringBuilder body = new StringBuilder();
+
+        BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream(), StandardCharsets.UTF_8));
+        String line;
+        while ((line = in.readLine()) != null) {
+            body.append(line);
+        }
+        JSONObject bodyJson = JSONObject.parseObject(body.toString());
+        String singleRobotCode = bodyJson.getString("singleRobotCode");
+        if (!StringUtils.isBlank(singleRobotCode)) {    //浠诲姟鍥為鎺ュ彛
+            int index = findIndex(singleRobotCode);
+            if (index != CURRENT_WMS_ID) {
+                String wmsId = WAREHOUSE_CODE[index - 1];  //瀛樺偍鎵�鏈堿GV鎵�灞炲簱鍖�
+                url = url.replace(WAREHOUSE_CODE[CURRENT_WMS_ID - 1], wmsId);
+
+                // 杞彂
+                String returns = RcsServiceImpl.sendPost(url, body.toString());
+                log.info("杞彂璇锋眰url:{}锛宐ody:{}锛岃繑鍥烇細{}", url, body, returns);
+                response(response, returns);
+            } else {
+                // 鍐呴儴閫昏緫澶勭悊
+                RcsReporterTask param = JSONObject.toJavaObject(bodyJson, RcsReporterTask.class);
+                RcsReturn rcsReturn = rcsService.reporterTask(param);
+
+                response(response, rcsReturn.toString());
+            }
+        } else {    //璇锋眰澶栬锛堝皝閿佸尯锛夛紝灏侀攣鍖虹敱褰撳墠绋嬪簭绠$悊涓嶈浆鍙�
+            RcsReporterEqpt param = JSONObject.toJavaObject(bodyJson, RcsReporterEqpt.class);
+            RcsReturn rcsReturn = rcsService.reporterEqpt(param);
+
+            response(response, rcsReturn.toString());
+        }
+    }
+
+    private int findIndex(String agvNo) {
+
+        AgvInfo agvInfo = agvInfoMapper.selectById(agvNo);
+        if (agvInfo != null) {
+            return Integer.parseInt(agvInfo.getBelongArea());
+        }
+        return -1;
+    }
+
+    public static void response(HttpServletResponse response, String baseRes){
+        response.setCharacterEncoding("utf-8");
+        response.setContentType("application/json; charset=utf-8");
+        try (PrintWriter out = response.getWriter()) {
+            out.print(JSON.toJSONString(baseRes));
+            out.flush();
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+//            e.printStackTrace();
+        }
+    }
+
+//    public static void response(HttpServletResponse response, String baseRes){
+//        response.setCharacterEncoding("utf-8");
+//        response.setContentType("application/json; charset=utf-8");
+//        try (PrintWriter out = response.getWriter()) {
+//            R r = R.parse(baseRes);
+//            JSONObject jsonObject = new JSONObject();
+//            jsonObject.put("total", "0");
+//            jsonObject.put("record", "");
+//            r.add(jsonObject);
+//            out.print(JSON.toJSONString(r));
+//            out.flush();
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//    }
+
+//    /**
+//     * 璁剧疆webflux妯″瀷鍝嶅簲
+//     *
+//     * @param response ServerHttpResponse
+//     * @param contentType content-type
+//     * @param status http鐘舵�佺爜
+//     * @param code 鍝嶅簲鐘舵�佺爜
+//     * @param value 鍝嶅簲鍐呭
+//     * @return Mono<Void>
+//     */
+//    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, String contentType, HttpStatus status, Object value, int code)
+//    {
+//        response.setStatusCode(status);
+//        response.getHeaders().add(HttpHeaders.CONTENT_TYPE, contentType);
+//        RcsReturn<?> result = RcsReturn.fail(code, value.toString());
+//        DataBuffer dataBuffer = response.bufferFactory().wrap(JSON.toJSONString(result).getBytes());
+//        return response.writeWith(Mono.just(dataBuffer));
+//    }
+
+
+}
diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index e659ad1..ad88815 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -156,6 +156,37 @@
         return null;
     }
 
+    @Transactional
+    public StartupDto getLocNoNew(Integer staDescId,Integer sourceStaNo, LocTypeDto locTypeDto) {
+        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts", 3).eq("crn_err", 0).eq("in_enable", "Y"));
+        if(basCrnps.size() == 0) {
+            log.error("鍏ュ簱璇锋眰搴撲綅澶辫触锛氬爢鍨涙満鎶ヨ/鏃犲彲鐢�/鏃犲彲鍏�");
+            throw new CoolException("鍏ュ簱璇锋眰搴撲綅澶辫触锛氬爢鍨涙満鎶ヨ/鏃犲彲鐢�/鏃犲彲鍏�");
+        }
+
+        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>().eq("type_no", staDescId).eq("stn_no", sourceStaNo).eq("crn_no", 1));
+        if (staDesc == null) {
+            log.error("鍏ュ簱璇锋眰搴撲綅澶辫触锛氳矾寰勪笉瀛樺湪" + staDescId +"," + sourceStaNo);
+            throw new CoolException("鍏ュ簱璇锋眰搴撲綅澶辫触锛氳矾寰勪笉瀛樺湪" + staDescId +"," + sourceStaNo);
+        }
+
+        Short locType2 = locTypeDto.getLocType2();
+        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("loc_type2", locType2).orderBy("lev1").orderBy("bay1").orderBy("row1"));
+        if (locMast == null) {
+            log.error("鍏ュ簱璇锋眰搴撲綅澶辫触锛氭棤搴撲綅" + locType2);
+            throw new CoolException("鍏ュ簱璇锋眰搴撲綅澶辫触锛氭棤搴撲綅" + locType2);
+        }
+
+        StartupDto startupDto = new StartupDto();
+        startupDto.setWorkNo(getWorkNo(0));
+        startupDto.setCrnNo(locMast.getCrnNo());
+        startupDto.setSourceStaNo(staDesc.getCrnStn());
+        startupDto.setStaNo(staDesc.getStnNo());
+        startupDto.setLocNo(locMast.getLocNo());
+
+        return startupDto;
+    }
+
     /**
      * 妫�绱㈠簱浣嶅彿
      *
diff --git a/src/main/java/com/zy/common/web/WcsController.java b/src/main/java/com/zy/common/web/WcsController.java
index c0c677f..8e8fcba 100644
--- a/src/main/java/com/zy/common/web/WcsController.java
+++ b/src/main/java/com/zy/common/web/WcsController.java
@@ -51,6 +51,8 @@
     @Autowired
     private WorkService workService;
 
+    // TODO锛氱О閲嶃�佹媿鐓т笂鎶ュ瓨鍌紝CTU鏂欑杩愯浆
+
     @PostMapping("/pakin/loc/v1")
     @ResponseBody
     public synchronized R getLocNo(@RequestBody SearchLocParam param) {
@@ -86,7 +88,7 @@
 
         // 婧愮珯鐐圭姸鎬佹娴�
         BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
-        sourceStaNo.setLocType1(param.getLocType1());
+        sourceStaNo.setLocType2(param.getLocType1());
         LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
 
         StartupDto dto = null;
@@ -166,8 +168,9 @@
 //        List<String> matnrs = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList());
 //        List<String> batchs = waitPakins.stream().map(WaitPakin::getBatch).distinct().collect(Collectors.toList());
 //        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(matnrs.get(0), batchs.get(0));
-        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0));
-        StartupDto dto = commonService.getLocNo( 1, devpNo,findLocNoAttributeVo, locTypeDto);
+//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0));
+//        StartupDto dto = commonService.getLocNo( 1, devpNo,findLocNoAttributeVo, locTypeDto);
+        StartupDto dto = commonService.getLocNoNew(1,devpNo,locTypeDto);
         int workNo = dto.getWorkNo();
         Date now = new Date();
         // 鐢熸垚宸ヤ綔妗�
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index ffa0b84..07d72b5 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -1,5 +1,5 @@
 server:
-  port: 8080
+  port: 8089
   servlet:
     context-path: /@pom.build.finalName@
 
@@ -11,8 +11,11 @@
   datasource:
     driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
     username: sa
-    password: Skyouc#23
-    url: jdbc:sqlserver://127.0.0.1:1433;databasename=jsxswms
+    password: sa@123
+    url: jdbc:sqlserver://127.0.0.1:1433;databasename=jgwms
+#    username: sa
+#    password: Skyouc#23
+#    url: jdbc:sqlserver://192.168.4.24:1433;databasename=jsxswms
   mvc:
     static-path-pattern: /**
   redis:
@@ -109,4 +112,34 @@
     acctID: "647e849ab6fa0f"
     username: "llw"
     password: "666666"
-    lcid: 2052
\ No newline at end of file
+    lcid: 2052
+
+#鍒嗗簱閰嶇疆
+wms:
+  #褰撳墠鏄鍑犲簱
+  currentId: 2
+  #褰撳墠搴撳悕绉�
+  currentName: 鍔犲伐搴�
+  #绔嬪簱AGV鑷姩杩愯揣鍑哄簱鍙g紪鐮�
+  wmsTransStartStation1: 205
+  #绔嬪簱AGV鑷姩杩愯揣鍏ュ簱鍙g紪鐮侊紙杈撻�佺嚎锛�
+  wmsTransStartStation2: 202
+  #绔嬪簱AGV鑷姩杩愯揣鍑哄簱鍙g紪鐮侊紙杈撻�佺嚎锛�
+  wmsTransStartStation3: 204
+  #鎵樼洏鐗╂枡鍙�
+  zpalletId: tuopan
+
+#mes瀵规帴
+mes:
+  url: http://172.26.11.250/dev-api/basicmodel/Api/WMS/
+  #榛樿鎺ュ彛鎿嶄綔浜哄憳id
+  defaultUserId: 30
+
+#娴峰悍瀵规帴
+hik:
+  url: http://127.0.0.1:8089/hik/
+
+#鍗庢檽瀵规帴
+hx:
+  url: http://127.0.0.1:8089/hx/
+
diff --git a/src/main/resources/libs/framework-3.2.0.jar b/src/main/resources/libs/framework-3.2.0.jar
new file mode 100644
index 0000000..503dc7b
--- /dev/null
+++ b/src/main/resources/libs/framework-3.2.0.jar
Binary files differ
diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml
index f72c762..2f71db0 100644
--- a/src/main/resources/logback-spring.xml
+++ b/src/main/resources/logback-spring.xml
@@ -19,6 +19,9 @@
         </encoder>
     </appender>
 
+    <!-- 鏃ュ織淇濆瓨璺緞 -->
+    <property name="LOG_PATH" value="D:/wmslogs/jg" />
+
     <!--info绾у埆-->
     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${LOG_PATH}/info.log</file>
diff --git a/src/main/resources/mapper/BlockStationMapper.xml b/src/main/resources/mapper/BlockStationMapper.xml
new file mode 100644
index 0000000..bb688ac
--- /dev/null
+++ b/src/main/resources/mapper/BlockStationMapper.xml
@@ -0,0 +1,24 @@
+<?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.zy.asrs.mapper.BlockStationMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BlockStation">
+        <result column="task_code" property="taskCode" />
+        <result column="apply_time" property="applyTime" />
+        <result column="block_no" property="blockNo" />
+        <result column="block_name" property="blockName" />
+        <result column="method" property="method" />
+        <result column="completed" property="completed" />
+        <result column="agv_factory" property="agvFactory" />
+    </resultMap>
+
+    <update id="addByBlockNo">
+        UPDATE agv_block_station SET status = #{status}, agv_num = ISNULL(agv_num, 0) + 1 WHERE block_no = #{blockNo}
+    </update>
+
+    <update id="delByBlockNo">
+        UPDATE agv_block_station SET status = #{status}, agv_num = ISNULL(agv_num, 0) - 1 WHERE block_no = #{blockNo}
+    </update>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/BlockTaskMapper.xml b/src/main/resources/mapper/BlockTaskMapper.xml
new file mode 100644
index 0000000..1c22bf0
--- /dev/null
+++ b/src/main/resources/mapper/BlockTaskMapper.xml
@@ -0,0 +1,24 @@
+<?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.zy.asrs.mapper.BlockTaskMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BlockTask">
+        <result column="task_code" property="taskCode" />
+        <result column="apply_time" property="applyTime" />
+        <result column="block_no" property="blockNo" />
+        <result column="block_name" property="blockName" />
+        <result column="method" property="method" />
+        <result column="completed" property="completed" />
+        <result column="agv_factory" property="agvFactory" />
+    </resultMap>
+
+    <select id="findTop" resultType="com.zy.asrs.entity.BlockTask">
+        SELECT TOP 1 * FROM agv_block_task WHERE completed = 0 AND method = 'APPLY_LOCK' ORDER BY apply_time ASC
+    </select>
+
+    <select id="findByTaskCode" resultType="com.zy.asrs.entity.BlockTask">
+        SELECT * FROM agv_block_task WHERE method = 'APPLY_LOCK' AND completed = 0 AND task_code = #{taskCode}
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/LocCountMapper.xml b/src/main/resources/mapper/LocCountMapper.xml
new file mode 100644
index 0000000..60bc842
--- /dev/null
+++ b/src/main/resources/mapper/LocCountMapper.xml
@@ -0,0 +1,42 @@
+<?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.zy.asrs.mapper.LocCountMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.LocCount">
+        <result column="date" property="date" />
+        <result column="area_id" property="areaId" />
+        <result column="loc_num" property="locNum" />
+        <result column="remain_num" property="remainNum" />
+    </resultMap>
+
+    <select id="getByAreaAndDate" resultType="com.zy.asrs.entity.LocCount">
+        SELECT * FROM asr_loc_count
+        WHERE area_id = #{areaId} AND date &gt; #{startDate} AND date &lt; #{endDate}
+    </select>
+
+    <select id="getByDate" resultType="com.zy.asrs.entity.LocCount">
+        SELECT date, SUM(ISNULL(loc_num, 0)) AS loc_num, SUM(ISNULL(remain_num, 0)) AS remain_num
+        FROM asr_loc_count
+        GROUP BY date
+    </select>
+
+    <insert id="insertOrUpdate" parameterType="com.zy.asrs.entity.LocCount">
+        IF EXISTS (SELECT date FROM asr_loc_count WHERE date = #{model.date} AND area_id = #{model.areaId})
+            INSERT INTO asr_loc_count(date, area_id, loc_num, remain_num)
+            VALUES (#{model.date}, #{model.areaId}, #{model.locNum}, #{model.remainNum})
+        ELSE
+            UPDATE asr_loc_count SET loc_num = #{model.locNum}, remain_num = #{model.remainNum}
+    </insert>
+
+    <select id="totalLoc" resultType="com.zy.asrs.entity.LocCount">
+        SELECT area_id, COUNT(*) AS loc_num FROM asr_loc_mast WHERE loc_sts != 'Z' GROUP BY area_id
+    </select>
+
+    <select id="useLoc" resultType="com.zy.asrs.entity.LocCount">
+        SELECT area_id, COUNT(*) AS loc_num FROM asr_loc_mast
+        WHERE loc_sts = 'F' or loc_sts = 'P' or loc_sts = 'Q' or loc_sts = 'R' or loc_sts = 'S' or loc_sts = 'X'
+        GROUP BY area_id
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/LocDetlMapper.xml b/src/main/resources/mapper/LocDetlMapper.xml
index 958190a..31cc31b 100644
--- a/src/main/resources/mapper/LocDetlMapper.xml
+++ b/src/main/resources/mapper/LocDetlMapper.xml
@@ -20,6 +20,7 @@
         <result column="price" property="price" />
         <result column="sku" property="sku" />
         <result column="units" property="units" />
+        <result column="units" property="units" />
         <result column="barcode" property="barcode" />
         <result column="origin" property="origin" />
         <result column="manu" property="manu" />
diff --git a/src/main/resources/mapper/OrderDetlPakinMapper.xml b/src/main/resources/mapper/OrderDetlPakinMapper.xml
index 3f3e522..1103efc 100644
--- a/src/main/resources/mapper/OrderDetlPakinMapper.xml
+++ b/src/main/resources/mapper/OrderDetlPakinMapper.xml
@@ -57,70 +57,70 @@
     </resultMap>
 
     <sql id="standbyAll">
-        <choose>
-            <when test="batch != null and batch != ''">
-                and batch = #{batch}
-            </when>
-            <otherwise>
-                and (batch IS NULL OR batch = '')
-            </otherwise>
-        </choose>
-        <choose>
-            <when test="brand != null and brand != ''">
-                and brand = #{brand}
-            </when>
-            <otherwise>
-                and (brand IS NULL OR brand = '')
-            </otherwise>
-        </choose>
-        <choose>
-            <when test="standby1 != null and standby1 != ''">
-                and standby1 = #{standby1}
-            </when>
-            <otherwise>
-                and (standby1 IS NULL OR standby1 = '')
-            </otherwise>
-        </choose>
-        <choose>
-            <when test="standby2 != null and standby2 != ''">
-                and standby2 = #{standby2}
-            </when>
-            <otherwise>
-                and (standby2 IS NULL OR standby2 = '')
-            </otherwise>
-        </choose>
-        <choose>
-            <when test="standby3 != null and standby3 != ''">
-                and standby3 = #{standby3}
-            </when>
-            <otherwise>
-                and (standby3 IS NULL OR standby3 = '')
-            </otherwise>
-        </choose>
-        <choose>
-            <when test="boxType1 != null and boxType1 != ''">
-                and box_type1 = #{boxType1}
-            </when>
-            <otherwise>
-                and (box_type1 IS NULL OR box_type1 = '')
-            </otherwise>
-        </choose>
-        <choose>
-            <when test="boxType2 != null and boxType2 != ''">
-                and box_type2 = #{boxType2}
-            </when>
-            <otherwise>
-                and (box_type2 IS NULL OR box_type2 = '')
-            </otherwise>
-        </choose>
-        <choose>
-            <when test="boxType3 != null and boxType3 != ''">
-                and box_type3 = #{boxType3}
-            </when>
-            <otherwise>
-                and (box_type3 IS NULL OR box_type3 = '')
-            </otherwise>
-        </choose>
+<!--        <choose>-->
+<!--            <when test="batch != null and batch != ''">-->
+<!--                and batch = #{batch}-->
+<!--            </when>-->
+<!--            <otherwise>-->
+<!--                and (batch IS NULL OR batch = '')-->
+<!--            </otherwise>-->
+<!--        </choose>-->
+<!--        <choose>-->
+<!--            <when test="brand != null and brand != ''">-->
+<!--                and brand = #{brand}-->
+<!--            </when>-->
+<!--            <otherwise>-->
+<!--                and (brand IS NULL OR brand = '')-->
+<!--            </otherwise>-->
+<!--        </choose>-->
+<!--        <choose>-->
+<!--            <when test="standby1 != null and standby1 != ''">-->
+<!--                and standby1 = #{standby1}-->
+<!--            </when>-->
+<!--            <otherwise>-->
+<!--                and (standby1 IS NULL OR standby1 = '')-->
+<!--            </otherwise>-->
+<!--        </choose>-->
+<!--        <choose>-->
+<!--            <when test="standby2 != null and standby2 != ''">-->
+<!--                and standby2 = #{standby2}-->
+<!--            </when>-->
+<!--            <otherwise>-->
+<!--                and (standby2 IS NULL OR standby2 = '')-->
+<!--            </otherwise>-->
+<!--        </choose>-->
+<!--        <choose>-->
+<!--            <when test="standby3 != null and standby3 != ''">-->
+<!--                and standby3 = #{standby3}-->
+<!--            </when>-->
+<!--            <otherwise>-->
+<!--                and (standby3 IS NULL OR standby3 = '')-->
+<!--            </otherwise>-->
+<!--        </choose>-->
+<!--        <choose>-->
+<!--            <when test="boxType1 != null and boxType1 != ''">-->
+<!--                and box_type1 = #{boxType1}-->
+<!--            </when>-->
+<!--            <otherwise>-->
+<!--                and (box_type1 IS NULL OR box_type1 = '')-->
+<!--            </otherwise>-->
+<!--        </choose>-->
+<!--        <choose>-->
+<!--            <when test="boxType2 != null and boxType2 != ''">-->
+<!--                and box_type2 = #{boxType2}-->
+<!--            </when>-->
+<!--            <otherwise>-->
+<!--                and (box_type2 IS NULL OR box_type2 = '')-->
+<!--            </otherwise>-->
+<!--        </choose>-->
+<!--        <choose>-->
+<!--            <when test="boxType3 != null and boxType3 != ''">-->
+<!--                and box_type3 = #{boxType3}-->
+<!--            </when>-->
+<!--            <otherwise>-->
+<!--                and (box_type3 IS NULL OR box_type3 = '')-->
+<!--            </otherwise>-->
+<!--        </choose>-->
     </sql>
     <sql id="standbyAllMemo">
         --         and line_number = #{lineNumber}
diff --git a/src/main/resources/mapper/ViewDigitalTwinMapper.xml b/src/main/resources/mapper/ViewDigitalTwinMapper.xml
new file mode 100644
index 0000000..4f909df
--- /dev/null
+++ b/src/main/resources/mapper/ViewDigitalTwinMapper.xml
@@ -0,0 +1,79 @@
+<?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.zy.asrs.mapper.DigitalTwinMapper">
+
+    <!--鎬昏锛氭�诲簱浣嶃�佸凡鐢ㄥ簱浣嶃�佷粖鏃ュ簱瀛樸�佷粖鏃ュ嚭搴撱�佷粖鏃ュ叆搴�-->
+    <select id="overview" resultType="Double">
+        SELECT COUNT(*) FROM asr_loc_mast WHERE loc_sts != 'Z'
+            <if test="areaId != null">
+                and area_id = #{areaId}
+            </if>
+        UNION ALL
+        SELECT COUNT(*) FROM asr_loc_mast WHERE loc_sts = 'F' or loc_sts = 'P' or loc_sts = 'Q' or loc_sts = 'R' or loc_sts = 'S' or loc_sts = 'X'
+        <if test="areaId != null">
+            and area_id = #{areaId}
+        </if>
+        UNION ALL
+        SELECT ISNULL(SUM(anfme), 0) FROM asr_loc_detl
+        <if test="areaId != null">
+            WHERE area_id = #{areaId}
+        </if>
+        UNION ALL
+        SELECT ISNULL(SUM(anfme), 0) FROM asr_wrkin_view WHERE CONVERT(VARCHAR, io_time, 23) = CONVERT(VARCHAR, GETDATE(), 23)
+        <if test="areaId != null">
+            and area_id = #{areaId}
+        </if>
+        UNION ALL
+        SELECT ISNULL(SUM(anfme), 0) FROM asr_wrkout_view WHERE CONVERT(VARCHAR, io_time, 23) = CONVERT(VARCHAR, GETDATE(), 23)
+        <if test="areaId != null">
+            and area_id = #{areaId}
+        </if>
+    </select>
+
+    <select id="recentOrder" resultType="com.zy.asrs.entity.digitaltwin.DtOrderVo">
+        SELECT CONVERT(VARCHAR, order_time, 23) as orderDate, COUNT(*) AS orderNum
+        FROM man_order
+        WHERE order_time BETWEEN #{startTime} AND #{endTime}
+        GROUP BY CONVERT(VARCHAR, order_time, 23)
+    </select>
+
+    <select id="recentInBound" resultType="com.zy.asrs.entity.digitaltwin.DtInAndOutBoundVo">
+        SELECT CONVERT(VARCHAR, io_time, 23) AS boundDate, SUM(anfme) AS inBoundNum
+        FROM asr_wrkin_view
+        WHERE io_time BETWEEN #{startTime} AND #{endTime}
+        <if test="areaId != null">
+            and area_id = #{areaId}
+        </if>
+        GROUP BY CONVERT(VARCHAR, io_time, 23)
+    </select>
+
+    <select id="recentOutBound" resultType="com.zy.asrs.entity.digitaltwin.DtInAndOutBoundVo">
+        SELECT CONVERT(VARCHAR, io_time, 23) AS boundDate, SUM(anfme) AS outBoundNum
+        FROM asr_wrkout_view
+        WHERE io_time BETWEEN #{startTime} AND #{endTime}
+        <if test="areaId != null">
+            and area_id = #{areaId}
+        </if>
+        GROUP BY CONVERT(VARCHAR, io_time, 23)
+    </select>
+
+    <select id="recentDetainMat" resultType="com.zy.asrs.entity.digitaltwin.DtDetainMatVo">
+        select
+        *
+        from (
+            select
+                ROW_NUMBER() OVER(Order by t.io_time desc) as row , *
+            from (
+                SELECT area_id AS belongAreaId, area_name AS belongAreaName, matnr AS matId, maktx AS matName,
+                       loc_no AS lokId, '' AS lokName,
+                       DATEDIFF(MINUTE, appe_time, GETDATE()) AS detainTime, appe_time AS inBoundTime
+                    FROM asr_loc_detl WHERE appe_time &lt; #{startTime}
+                <if test="areaId != null">
+                    and area_id = #{areaId}
+                </if>
+                ) t
+        ) a where 1=1 and a.row between ((#{pageIndex}-1)*#{pageSize}+1) and (#{pageIndex}*#{pageSize})
+    </select>
+
+</mapper>
diff --git a/src/main/webapp/static/js/common.js b/src/main/webapp/static/js/common.js
index 4d9623f..3bf62ea 100644
--- a/src/main/webapp/static/js/common.js
+++ b/src/main/webapp/static/js/common.js
@@ -1,4 +1,4 @@
-var baseUrl = "/wms";
+var baseUrl = "/jgwms";
 
 // 璇︽儏绐楀彛-楂樺害
 var detailHeight = '80%';
@@ -180,15 +180,15 @@
 }
 
 var matCols = [
-    {field: 'matnr', align: 'center',title: '鍟嗗搧缂栧彿锛堝搧鍙凤級', width: 180}
+    {field: 'matnr', align: 'center',title: '鐗╂枡缂栧彿', width: 180}
     // {field: 'id', align: 'center',title: 'ID'}
     // ,{field: 'uuid', align: 'center',title: '缂栧彿'}
-    ,{field: 'maktx', align: 'center',title: '鍟嗗搧鍚嶇О锛堝搧鍚嶏級', width: 200}
+    ,{field: 'maktx', align: 'center',title: '鐗╂枡鍚嶇О', width: 200}
     ,{field: 'specs', align: 'center',title: '瑙勬牸'}
-    ,{field: 'model', align: 'center',title: '浠g爜', hide: true}
+    ,{field: 'model', align: 'center',title: '灞炴��'}
     ,{field: 'color', align: 'center',title: '棰滆壊', hide: true}
     ,{field: 'brand', align: 'center',title: '鍝佺墝', hide: true}
-    ,{field: 'upQty', align: 'center',title: '缁勬墭涓婇檺'}
+    // ,{field: 'upQty', align: 'center',title: '缁勬墭涓婇檺'}
     ,{field: 'unit', align: 'center',title: '鍗曚綅', hide: false}
     ,{field: 'price', align: 'center',title: '鍗曚环', hide: true}
     ,{field: 'sku', align: 'center',title: 'sku', hide: true}
@@ -213,10 +213,11 @@
     ,{field: 'danger$', align: 'center',title: '鍗遍櫓鍝�', hide: true}
     // ,{field: 'status$', align: 'center',title: '鐘舵��'}
     // ,{field: 'createBy$', align: 'center',title: '娣诲姞浜哄憳'}
-    // ,{field: 'createTime$', align: 'center',title: '娣诲姞鏃堕棿'}
+    ,{field: 'memo', align: 'center',title: '澶囨敞', hide: false}
+    ,{field: 'createTime$', align: 'center',title: '娣诲姞鏃堕棿',width: 165}
     ,{field: 'updateBy$', align: 'center',title: '淇敼浜哄憳', hide: true}
     ,{field: 'updateTime$', align: 'center',title: '淇敼鏃堕棿', hide: true}
-    ,{field: 'memo', align: 'center',title: '澶囨敞', hide: true}
+
 
 ]
 
@@ -242,14 +243,14 @@
 ]
 
 var detlCols = [
-    {field: 'matnr', align: 'center',title: '鍟嗗搧缂栧彿锛堝搧鍙凤級', sort:true}
-    ,{field: 'maktx', align: 'center',title: '鍟嗗搧鍚嶇О锛堝搧鍚嶏級', sort:true}
+    {field: 'matnr', align: 'center',title: '鐗╂枡缂栧彿', sort:true}
+    ,{field: 'maktx', align: 'center',title: '鐗╂枡鍚嶇О', sort:true}
     ,{field: 'orderNo', align: 'center',title: '鍗曟嵁缂栧彿', hide: false}
-    ,{field: 'batch', align: 'center',title: '璐у搧鐗瑰緛', sort:true}
+    // ,{field: 'batch', align: 'center',title: '璐у搧鐗瑰緛', sort:true}
     ,{field: 'anfme', align: 'center',title: '鏁伴噺', hide: false}
     ,{field: 'zpallet', align: 'center',title: '鎵樼洏鏉$爜', hide: false}
     ,{field: 'specs', align: 'center',title: '瑙勬牸', hide: false}
-    ,{field: 'model', align: 'center',title: '浠g爜', hide: true}
+    ,{field: 'model', align: 'center',title: '灞炴��', hide: false}
     ,{field: 'color', align: 'center',title: '棰滆壊', hide: true}
     ,{field: 'brand', align: 'center',title: '鍝佺墝', hide: true}
     ,{field: 'unit', align: 'center',title: '鍗曚綅', hide: false}
diff --git a/src/main/webapp/static/js/locDetl/locDetl.js b/src/main/webapp/static/js/locDetl/locDetl.js
index 14c17ee..154bb97 100644
--- a/src/main/webapp/static/js/locDetl/locDetl.js
+++ b/src/main/webapp/static/js/locDetl/locDetl.js
@@ -6,8 +6,8 @@
         ,{field: 'storeDate', align: 'center',title: '搴撻緞(澶�)', sort:true}
         ,{field: 'matnr', align: 'center',title: '鍟嗗搧缂栧彿', sort:true}
         ,{field: 'maktx', align: 'center',title: '鍟嗗搧鍚嶇О', sort:true}
-        ,{field: 'orderNo', align: 'center',title: '鍗曟嵁缂栧彿', hide: true}
-        ,{field: 'batch', align: 'center',title: '鎵瑰彿', width: 300, sort:true}
+        ,{field: 'orderNo', align: 'center',title: '鍗曟嵁缂栧彿'}
+        ,{field: 'batch', align: 'center',title: '鎵瑰彿', width: 300, hide:true}
         ,{field: 'anfme', align: 'center',title: '鏁伴噺'}
         ,{field: 'zpallet', align: 'center',title: '鎵樼洏鏉$爜'}
         ,{field: 'specs', align: 'center',title: '瑙勬牸'}
diff --git a/src/main/webapp/static/js/mat/mat.js b/src/main/webapp/static/js/mat/mat.js
index 777cab7..63483d5 100644
--- a/src/main/webapp/static/js/mat/mat.js
+++ b/src/main/webapp/static/js/mat/mat.js
@@ -6,7 +6,7 @@
     var cols = [
         {type: 'checkbox'}
         , {field: 'tagId$', align: 'center', title: '褰掔被', templet: '#tagTpl'}
-        , {field: 'locType$', align: 'center', title: '搴撲綅绫诲瀷'}
+        // , {field: 'locType$', align: 'center', title: '搴撲綅绫诲瀷'}
         // ,{field: 'store_max', align: 'center',title: '搴撳瓨涓婇檺'}
         // ,{field: 'store_min', align: 'center',title: '搴撳瓨涓嬮檺'}
         // ,{field: 'store_max_date', align: 'center',title: '搴撻緞涓婇檺(澶�)'}
@@ -211,52 +211,53 @@
                     });
                 }
                 break;
-            case "batchModifties":
-                var selected = checkStatus.data;
-                if (selected.length === 0) {
-                    layer.msg('璇烽�夋嫨淇敼鏁版嵁');
-                } else {
-                    let selIds = selected.map(item => {
-                       return  item.id
-                    });
-                    layer.open({
-                        type: 1,
-                        title: '鎵归噺淇敼',
-                        area: ['500px'],
-                        shadeClose: true,
-                        content: $('#batchModifties'),
-                        success: function (layero, index) {
-                            layer.iframeAuto(index);
-                            form.on('submit(batchModify)', function (data) {
-                                let params = {...data?.field}
-                                params.id = selIds
-                                $.ajax({
-                                    url: baseUrl + "/mat/batch/auth",
-                                    headers: {'token': localStorage.getItem('token')},
-                                    data: JSON.stringify(params),
-                                    dataType: 'json',
-                                    contentType: 'application/json;charset=UTF-8',
-                                    method: 'POST',
-                                    success: function (res) {
-                                        layer.closeAll();
-                                        if (res.code === 200) {
-
-                                        } else if (res.code === 403) {
-                                            top.location.href = baseUrl + "/";
-                                        } else {
-                                            layer.msg(res.msg)
-                                        }
-                                    }
-                                });
-                                layer.closeAll();
-                            });
-                        },
-                        end: function () {
-
-                        }
-                    });
-                }
-                break;
+            // case "batchModifties":
+            //     console.log('椤堕《椤�')
+            //     var selected = checkStatus.data;
+            //     if (selected.length === 0) {
+            //         layer.msg('璇烽�夋嫨淇敼鏁版嵁');
+            //     } else {
+            //         let selIds = selected.map(item => {
+            //            return  item.id
+            //         });
+            //         layer.open({
+            //             type: 1,
+            //             title: '鎵归噺淇敼',
+            //             area: ['500px'],
+            //             shadeClose: true,
+            //             content: $('#batchModifties'),
+            //             success: function (layero, index) {
+            //                 layer.iframeAuto(index);
+            //                 form.on('submit(batchModify)', function (data) {
+            //                     let params = {...data?.field}
+            //                     params.id = selIds
+            //                     $.ajax({
+            //                         url: baseUrl + "/mat/batch/auth",
+            //                         headers: {'token': localStorage.getItem('token')},
+            //                         data: JSON.stringify(params),
+            //                         dataType: 'json',
+            //                         contentType: 'application/json;charset=UTF-8',
+            //                         method: 'POST',
+            //                         success: function (res) {
+            //                             layer.closeAll();
+            //                             if (res.code === 200) {
+            //
+            //                             } else if (res.code === 403) {
+            //                                 top.location.href = baseUrl + "/";
+            //                             } else {
+            //                                 layer.msg(res.msg)
+            //                             }
+            //                         }
+            //                     });
+            //                     layer.closeAll();
+            //                 });
+            //             },
+            //             end: function () {
+            //
+            //             }
+            //         });
+            //     }
+            //     break;
             default:
                 break;
         }
diff --git a/src/main/webapp/static/js/orderPakin/order.js b/src/main/webapp/static/js/orderPakin/order.js
index 6b38ea5..5266f2e 100644
--- a/src/main/webapp/static/js/orderPakin/order.js
+++ b/src/main/webapp/static/js/orderPakin/order.js
@@ -45,9 +45,9 @@
             {field: 'orderNo', title: '鍗曟嵁缂栧彿', templet: '#orderNoTpl'},
             {field: 'docType$', align: 'center', title: '绫诲瀷',  minWidth: 160, width: 160},
             {align: 'center', title: '鏄庣粏', toolbar: '#tbLook', minWidth: 160, width: 160},
+            {field: 'memo', align: 'center',title: '澶囨敞'},
             {field: 'createTime$', title: '鍒涘缓鏃堕棿', minWidth: 200, width: 200},
             {field: 'settle$', align: 'center', title: '鐘舵��', templet: '#settleTpl',  minWidth: 160, width: 160},
-            {field: 'memo', align: 'center',title: '澶囨敞', hide: true},
             {align: 'center', title: '鎿嶄綔', toolbar: '#operate', width: 180}
         ]],
         request: {
@@ -122,12 +122,15 @@
                         cellMinWidth: 100,
                         cols: [[
                             {type: 'numbers'},
-                            {field: 'matnr', title: '鍟嗗搧缂栫爜', width: 160},
-                            {field: 'maktx', title: '鍟嗗搧鍚嶇О', width: 160},
-                            {field: 'batch', title: '鎵瑰彿'},
+                            {field: 'matnr', title: '鍟嗗搧缂栫爜'},
+                            {field: 'maktx', title: '鍟嗗搧鍚嶇О'},
+                            {field: 'specs', title: '瑙勬牸'},
+                            // {field: 'batch', title: '鎵瑰彿'},
                             {field: 'anfme', title: '鏁伴噺'},
                             {field: 'workQty', title: '浣滀笟鏁伴噺'},
                             {field: 'qty', title: '瀹屾垚鏁伴噺', style: 'font-weight: bold'},
+                            {field: 'standby1', title: '闆朵欢浜岀淮鐮�'},
+                            {field: 'standby2', title: '榻愬鎬ф鏌�'}
                             // {field: 'unit', title: '鍗曚綅'},
                             // {
                             //     field: 'createTime$', title: '鍒涘缓鏃堕棿', sort: true, templet: function (d) {
@@ -136,7 +139,7 @@
                             // },
                             // {field: 'inQty', title: '宸插叆搴撻噺'},
                             // {field: 'color', title: '棰滆壊'},
-                            {field: 'specs', title: '瑙勬牸'}
+
                         ]],
                         request: {
                             pageName: 'curr',
diff --git a/src/main/webapp/static/js/task/task.js b/src/main/webapp/static/js/task/task.js
index 6235ea8..df4e346 100644
--- a/src/main/webapp/static/js/task/task.js
+++ b/src/main/webapp/static/js/task/task.js
@@ -22,20 +22,23 @@
         height: 'full-120',
         cols: [[
             {type: 'checkbox'}
-            , {field: 'wrkNo', align: 'center', title: '宸ヤ綔鍙�', sort: true, width: 105}
-            , {field: 'ioTime$', align: 'center', title: '宸ヤ綔鏃堕棿', width: 160}
+            , {field: 'wrkNo', align: 'center', title: '宸ヤ綔鍙�', sort: true}
+            , {field: 'taskNo', align: 'center', title: 'AGV浠诲姟鍙�', sort: true}
+            // , {field: 'ioTime$', align: 'center', title: '宸ヤ綔鏃堕棿', width: 160}
             , {field: 'wrkSts$', align: 'center', title: '宸ヤ綔鐘舵��', width: 150}
             , {field: 'ioType$', align: 'center', title: '鍏ュ嚭搴撶被鍨�', width: 150}
             , {field: 'ioPri', align: 'center', title: '浼樺厛绾�', width: 80}
             , {field: 'taskType$', align: 'center', title: '浠诲姟绫诲瀷'}
             , {field: 'crnNo$', align: 'center', title: '鍫嗗灈鏈�', hide: true}
-            , {field: 'sourceStaNo$', align: 'center', title: '婧愮珯'}
-            , {field: 'staNo$', align: 'center', title: '鐩爣绔�', width: 120}
-            , {field: 'sourceLocNo', align: 'center', title: '婧愬簱浣�', width: 120}
-            , {field: 'locNo', align: 'center', title: '鐩爣搴撲綅', width: 120}
+            , {field: 'sourceStaNo', align: 'center', title: '婧愮珯'}
+            , {field: 'staNo', align: 'center', title: '鐩爣绔�', width: 120}
+            // , {field: 'sourceLocNo', align: 'center', title: '婧愬簱浣�', width: 120}
+            // , {field: 'locNo', align: 'center', title: '鐩爣搴撲綅', width: 120}
             , {field: 'barcode', align: 'center', title: '鏉$爜', width: 110}
-            , {field: 'preHave', align: 'center', title: '鍏堝叆鍝�', hide: true}
-            , {field: 'takeNone', align: 'center', title: '绌烘搷浣�', hide: true}
+            // , {field: 'preHave', align: 'center', title: '鍏堝叆鍝�', hide: true}
+            // , {field: 'takeNone', align: 'center', title: '绌烘搷浣�', hide: true}
+            , {field: 'modiUser$', align: 'center', title: '鍒涘缓浜哄憳'}
+            , {field: 'appeTime$', align: 'center', title: '鍒涘缓鏃堕棿'}
             , {field: 'modiUser$', align: 'center', title: '淇敼浜哄憳', hide: true}
             , {field: 'modiTime$', align: 'center', title: '淇敼鏃堕棿', hide: true, width: 160}
             , {fixed: 'right', title: '鎿嶄綔', align: 'center', toolbar: '#operate', width: 200}
@@ -171,7 +174,7 @@
                         title: '宸ヤ綔鍙凤細' + data.wrkNo,
                         shadeClose: true
                     }, function () {
-                        http.post(baseUrl + "/hand/control/wrkMast", {workNo: data.wrkNo, type: 2}, function (res) {
+                        http.post(baseUrl + "/task/control", {workNo: data.wrkNo, type: 2}, function (res) {
                             $(".layui-laypage-btn")[0].click();
                             layer.msg(data.wrkNo + res.msg);
                         })
@@ -182,7 +185,7 @@
                         title: '宸ヤ綔鍙凤細' + data.wrkNo,
                         shadeClose: true
                     }, function () {
-                        http.post(baseUrl + "/hand/control/wrkMast", {workNo: data.wrkNo, type: 2}, function (res) {
+                        http.post(baseUrl + "/task/control", {workNo: data.wrkNo, type: 2}, function (res) {
                             $(".layui-laypage-btn")[0].click();
                             layer.msg(data.wrkNo + res.msg);
                         })
@@ -193,7 +196,7 @@
             //  鎷f枡鍏ュ簱
             case 'pick':
                 layer.confirm('鎷f枡鍏ュ簱璇ョ瑪宸ヤ綔妗o紵', {title: '宸ヤ綔鍙凤細' + data.wrkNo, shadeClose: true}, function () {
-                    http.post(baseUrl + "/hand/control/wrkMast", {workNo: data.wrkNo, type: 3}, function (res) {
+                    http.post(baseUrl + "/task/control", {workNo: data.wrkNo, type: 3}, function (res) {
                         $(".layui-laypage-btn")[0].click();
                         layer.msg(data.wrkNo + res.msg);
                     })
diff --git a/src/main/webapp/static/js/waitPakin/waitPakin.js b/src/main/webapp/static/js/waitPakin/waitPakin.js
index 93d9ac5..a108631 100644
--- a/src/main/webapp/static/js/waitPakin/waitPakin.js
+++ b/src/main/webapp/static/js/waitPakin/waitPakin.js
@@ -24,8 +24,8 @@
                 return html;
             }
         }
-        , {field: 'modiUser$', align: 'center', title: '淇敼浜哄憳', hide: true}
-        , {field: 'modiTime$', align: 'center', title: '淇敼鏃堕棿', hide: true})
+        ,{field: 'appeUser$', align: 'center',title: '鍒涘缓浜�', hide: false}
+        ,{field: 'appeTime$', align: 'center',title: '鍒涘缓鏃堕棿', hide: false})
     return cols;
 }
 
diff --git a/src/main/webapp/views/basWhs/basWhs.html b/src/main/webapp/views/basWhs/basWhs.html
index 615c3e9..432053a 100644
--- a/src/main/webapp/views/basWhs/basWhs.html
+++ b/src/main/webapp/views/basWhs/basWhs.html
@@ -31,7 +31,8 @@
 
 <!-- 琛ㄦ牸 -->
 <div class="layui-form">
-    <table class="layui-hide" id="basWhsType" lay-filter="basWhsType"></table>
+<!--    <table class="layui-hide" id="basWhsType" lay-filter="basWhsType"></table>-->
+    <table class="layui-hide" id="basWhs" lay-filter="basWhs"></table>
 </div>
 <script type="text/html" id="toolbar">
     <div class="layui-btn-container">
@@ -49,7 +50,7 @@
 <script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
 <script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
 <script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
-<script type="text/javascript" src="../../static/js/basWhsType/basWhsType.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/basWhs/basWhs.js" charset="utf-8"></script>
 
 <iframe id="detail-iframe" scrolling="auto" style="display:none;"></iframe>
 
diff --git a/src/main/webapp/views/mat/mat.html b/src/main/webapp/views/mat/mat.html
index 19ed4fb..cc72761 100644
--- a/src/main/webapp/views/mat/mat.html
+++ b/src/main/webapp/views/mat/mat.html
@@ -97,12 +97,12 @@
                                 <input name="maktx" class="layui-input" placeholder="杈撳叆鍟嗗搧鍚嶇О"/>
                             </div>
                         </div>
-                        <div class="layui-inline">
-                            <label class="layui-form-label" style="padding: 8px 15px 8px 15px">鍟嗗搧瑙勬牸:</label>
-                            <div class="layui-input-inline">
-                                <input name="specs" class="layui-input" placeholder="杈撳叆鍟嗗搧瑙勬牸"/>
-                            </div>
-                        </div>
+<!--                        <div class="layui-inline">-->
+<!--                            <label class="layui-form-label" style="padding: 8px 15px 8px 15px">鍟嗗搧瑙勬牸:</label>-->
+<!--                            <div class="layui-input-inline">-->
+<!--                                <input name="specs" class="layui-input" placeholder="杈撳叆鍟嗗搧瑙勬牸"/>-->
+<!--                            </div>-->
+<!--                        </div>-->
                         <div class="layui-inline">&emsp;
                             <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
                                 <i class="layui-icon">&#xe615;</i>鎼滅储
diff --git a/src/main/webapp/views/pda/comb.html b/src/main/webapp/views/pda/comb.html
index 4739ffb..13b9cb1 100644
--- a/src/main/webapp/views/pda/comb.html
+++ b/src/main/webapp/views/pda/comb.html
@@ -54,11 +54,11 @@
             limit: 500,
             cellMinWidth: 50,
             cols: [[
-                {fixed: 'left', align: 'center', field: 'count', title: '鏁伴噺', style:'color: blue', width:50},
+                {fixed: 'left', align: 'center', field: 'anfme', title: '鏁伴噺', style:'color: blue', width:50},
                 {field: 'matnr', align: 'center', title: '鍟嗗搧缂栧彿'},
                 {field: 'maktx', align: 'center', title: '鍟嗗搧鍚嶇О'}
             ]],
-            done: function (res, curr, count) {
+            done: function (res, curr, anfme) {
             }
         });
 
@@ -100,7 +100,7 @@
         let toPush = true;
         for (var j=0;j<matData.length;j++){
             if (data.matnr === matData[j].matnr) {
-                matData[j].count = Number(matData[j].count) + Number(data.count);
+                matData[j].anfme = Number(matData[j].anfme) + Number(data.anfme);
                 toPush  = false;
             }
         }
diff --git a/src/main/webapp/views/pda/login.html b/src/main/webapp/views/pda/login.html
index a03b30f..c326171 100644
--- a/src/main/webapp/views/pda/login.html
+++ b/src/main/webapp/views/pda/login.html
@@ -123,7 +123,8 @@
             debugger
             $.ajax({
                 url: baseUrl+"/login.action",
-                data: user,
+                headers: {'Content-Type': 'application/json'},
+                data: JSON.stringify(user),
                 method: 'POST',
                 success: function (res) {
                     if (res.code === 200){
diff --git a/src/main/webapp/views/pda/matQuery.html b/src/main/webapp/views/pda/matQuery.html
index 1c2b07b..7883180 100644
--- a/src/main/webapp/views/pda/matQuery.html
+++ b/src/main/webapp/views/pda/matQuery.html
@@ -124,9 +124,10 @@
             success: function (res) {
                 if (res.code === 200) {
                     if (res.data != null) {
-                        $('#matName').val(res.data.matName);
-                        $('#str1').val(res.data.str1);
-                        $('#str2').val(res.data.str2);
+                        console.log(res.data)
+                        $('#matName').val(res.data.maktx);
+                        $('#str1').val(res.data.unit);
+                        $('#str2').val(res.data.specs);
                         countDom.val(initMatCount);
                         $('#count').focus().select();
                     }
@@ -144,9 +145,9 @@
      */
     function confirm(){
         var data = {
-            matNo: $('#matNo').val(),
-            matName: $('#matName').val(),
-            count: countDom.val()
+            matnr: $('#matNo').val(),
+            maktx: $('#matName').val(),
+            anfme: Number(countDom.val())
         };
         parent.addTableData(data);
         parent.layer.close(parent.matCodeLayerIdx);
diff --git a/src/main/webapp/views/task/task.html b/src/main/webapp/views/task/task.html
index b3e97a7..285250e 100644
--- a/src/main/webapp/views/task/task.html
+++ b/src/main/webapp/views/task/task.html
@@ -19,7 +19,7 @@
                 <div class="layui-form-item">
                     <div class="layui-inline">
                         <div class="layui-input-inline">
-                            <input class="layui-input" type="text" name="id" placeholder="缂栧彿" autocomplete="off">
+                            <input class="layui-input" type="text" name="wrk_no" placeholder="宸ヤ綔鍙�" autocomplete="off">
                         </div>
                     </div>
                     <div class="layui-inline" style="width: 300px">

--
Gitblit v1.9.1