From 701542ac0a90cf0e3a0a81ec2bb8066b5de68e75 Mon Sep 17 00:00:00 2001
From: zyh <zyh@123>
Date: 星期六, 28 三月 2026 11:21:17 +0800
Subject: [PATCH] 更新为正式部署许可证

---
 src/main/java/com/zy/asrs/entity/param/CombParam.java                |    2 
 src/main/java/com/zy/asrs/controller/LocMastController.java          |    4 
 src/main/java/com/zy/asrs/entity/mes/TransTask.java                  |    2 
 src/main/java/com/zy/common/config/AdminInterceptor.java             |    2 
 src/main/java/com/zy/asrs/entity/Task.java                           |    8 
 src/main/java/com/zy/asrs/mapper/CanFinMapper.java                   |   16 
 src/main/java/com/zy/asrs/service/MesService.java                    |    2 
 src/main/java/com/zy/asrs/entity/digitaltwin/DtDetainMatVo.java      |    1 
 src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java           |  152 ++
 src/main/java/com/zy/asrs/task/ErrorStockScheduler.java              |   74 +
 src/main/java/com/zy/asrs/entity/CanFin.java                         |   65 +
 src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java           |  129 ++
 src/main/resources/application-dev.yml                               |   10 
 src/main/java/com/zy/asrs/service/RcsService.java                    |    4 
 src/main/java/com/zy/asrs/controller/MesController.java              |   67 +
 src/main/java/com/zy/common/service/CommonService.java               |    2 
 src/main/java/com/zy/system/entity/license/LicenseCheckListener.java |   38 
 src/main/resources/mapper/ViewDigitalTwinMapper.xml                  |   75 
 src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java          |  116 ++
 src/main/resources/logback-spring.xml                                |    2 
 src/main/webapp/views/pakStore/groupinto.html                        |  134 ++
 src/main/java/com/zy/asrs/controller/TaskController.java             |   27 
 src/main/java/com/zy/asrs/task/WorkMastScheduler.java                |   11 
 src/main/java/com/zy/asrs/task/OrderSyncScheduler.java               |  121 ++
 src/main/java/com/zy/asrs/entity/rcs/RcsReporterTask.java            |    3 
 src/main/java/com/zy/asrs/entity/LocDetl.java                        |    1 
 src/main/java/com/zy/asrs/entity/mes/TransParent.java                |   11 
 src/main/resources/license.lic                                       |    0 
 src/main/java/com/zy/asrs/service/OrderPakoutService.java            |    3 
 src/main/java/com/zy/asrs/task/AGVTaskReportScheduler.java           |  101 +
 src/main/java/com/zy/asrs/entity/digitaltwin/AllLocationsVo.java     |   36 
 src/main/java/com/zy/asrs/controller/DigitalTwinController.java      | 1033 +++++++++++++++++---
 src/main/java/com/zy/asrs/entity/mes/MesOutApply.java                |    2 
 src/main/java/com/zy/common/web/WcsController.java                   |    7 
 src/main/java/com/zy/asrs/entity/mes/MesCallOutApply.java            |    2 
 src/main/java/com/zy/asrs/entity/mes/MesMatInfo.java                 |    2 
 src/main/java/com/zy/asrs/entity/param/AbnormalLocDetlParam.java     |    6 
 src/main/java/com/zy/asrs/entity/digitaltwin/DtEquipmentVo.java      |    4 
 src/main/java/com/zy/asrs/service/DigitalTwinService.java            |   14 
 src/main/java/com/zy/common/config/LogAspect.java                    |    3 
 src/main/java/com/zy/asrs/task/BlockScheduler.java                   |    4 
 src/main/java/com/zy/system/timer/LoadingConfigTimer.java            |    2 
 src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java        |   29 
 src/main/java/com/zy/asrs/controller/OutController.java              |   24 
 src/main/java/com/zy/asrs/mapper/DigitalTwinMapper.java              |    9 
 src/main/java/com/zy/asrs/service/MobileService.java                 |   11 
 src/main/java/com/zy/asrs/controller/LocDetlController.java          |   54 
 src/main/java/com/zy/asrs/task/handler/AGVTaskReportHandler.java     |   27 
 src/main/java/com/zy/asrs/controller/MobileController.java           |   41 
 src/main/java/com/zy/asrs/controller/OrderPakoutController.java      |   24 
 src/main/java/com/zy/asrs/service/impl/OrderPakoutServiceImpl.java   |  170 +++
 src/main/java/com/zy/common/properties/StationProperties.java        |   16 
 src/main/java/com/zy/asrs/controller/RcsController.java              |    9 
 src/main/resources/mapper/LocCountMapper.xml                         |   15 
 src/main/java/com/zy/asrs/service/impl/DigitalTwinServiceImpl.java   |  250 +++-
 55 files changed, 2,533 insertions(+), 444 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/DigitalTwinController.java b/src/main/java/com/zy/asrs/controller/DigitalTwinController.java
index 73de14d..de63682 100644
--- a/src/main/java/com/zy/asrs/controller/DigitalTwinController.java
+++ b/src/main/java/com/zy/asrs/controller/DigitalTwinController.java
@@ -1,25 +1,50 @@
 package com.zy.asrs.controller;
 
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.R;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.zy.asrs.entity.LocChartPie;
 import com.zy.asrs.entity.LocDetl;
 import com.zy.asrs.entity.LocMast;
 import com.zy.asrs.entity.digitaltwin.*;
+import com.zy.asrs.mapper.LocDetlMapper;
+import com.zy.asrs.mapper.ReportQueryMapper;
 import com.zy.asrs.service.DigitalTwinService;
+import com.zy.common.utils.HttpHandler;
 import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
-
+import com.fasterxml.jackson.core.type.TypeReference;
 import javax.annotation.Resource;
+import java.io.IOException;
+import java.text.ParseException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @RequestMapping("/digitalTwin")
 @RestController
 public class DigitalTwinController extends BaseController {
 
+    @Value("${digitalTwins.jgUrl}")
+    private String JG_URL;
+
+    @Value("${digitalTwins.djUrl}")
+    private String DJ_URL;
+
+    @Value("${digitalTwins.ljqUrl}")
+    private String LJQ_URL;
+
     @Resource
     private DigitalTwinService digitalTwinService;
+    @Autowired
+    ReportQueryMapper reportQueryMapper;
+    @Autowired
+    private LocDetlMapper locDetlMapper;
 
     /**
      * 鏁版嵁鎬昏
@@ -29,49 +54,232 @@
      */
     @RequestMapping(value = "/overview")
 //    @ManagerAuth
-    public R overview(@RequestParam(required = false) String areaId){
+    public R overview(@RequestParam(required = false) String areaId) throws IOException {
 
-        DtOverviewVo dtOverviewVo = digitalTwinService.overview(areaId);
+        Map<String, Object> map = new HashMap<>();
+        if (areaId != null) {
+            map.put("areaId", areaId);
+        }
+        HttpHandler.Builder builder = new HttpHandler.Builder()
+                .setPath("/digitalTwin/overview")
+                .setParams(map);
 
-//        DtOverviewVo dtOverviewVo = DtOverviewVo.builder()
-//                .totalLoc(999)
-//                .useLoc(900)
-//                .idleLoc(99)
-//                .todayOutbound(160)
-//                .todayWarehousing(170)
-//                .remainingStock(180)
-//                .build();
+        ObjectMapper objectMapper = new ObjectMapper();
+        if (areaId != null) {
+            switch (areaId) {
+                case "A": {
+                    String resA = builder.setUri(JG_URL).build().doGet();
 
-        return R.ok().add(dtOverviewVo);
+                    Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    Map<String, Object> data = (Map<String, Object>) result.get("data");
+                    return R.ok(data);
+                }
+                case "B": {
+                    String resB = builder.setUri(DJ_URL).build().doGet();
+
+                    Map<String, Object> result = objectMapper.readValue(resB, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    Map<String, Object> data = (Map<String, Object>) result.get("data");
+                    return R.ok(data);
+                }
+                case "C": {
+
+                    String resC = builder.setUri(LJQ_URL).build().doGet();
+
+                    Map<String, Object> result = objectMapper.readValue(resC, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    Map<String, Object> data = (Map<String, Object>) result.get("data");
+                    return R.ok(data);
+                }
+                case "D": {
+                    return R.ok(digitalTwinService.overview(areaId));
+                }
+                default:
+                    Map<String, Object> mergedResult = new HashMap<>();
+                    Map<String, Object> mergedData = new HashMap<>();
+
+                    String resA = builder.setUri(JG_URL).build().doGet();
+                    Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+                    if (resultA.get("data") != null) {
+                        mergedData.put("A", resultA.get("data"));
+                    }
+
+                    String resB = builder.setUri(DJ_URL).build().doGet();
+                    Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+                    if (resultB.get("data") != null) {
+                        mergedData.put("B", resultB.get("data"));
+                    }
+
+                    String resC = builder.setUri(LJQ_URL).build().doGet();
+                    Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+                    if (resultC.get("data") != null) {
+                        mergedData.put("C", resultC.get("data"));
+                    }
+
+                    Object resultD = digitalTwinService.overview(areaId);
+                    if (resultD != null) {
+                        mergedData.put("D", resultD);
+                    }
+
+                    return R.ok(mergedData);
+            }
+        } else {
+            Map<String, Object> mergedResult = new HashMap<>();
+            Map<String, Object> mergedData = new HashMap<>();
+
+            String resA = builder.setUri(JG_URL).build().doGet();
+            Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+            if (resultA.get("data") != null) {
+                mergedData.put("A", resultA.get("data"));
+            }
+
+            String resB = builder.setUri(DJ_URL).build().doGet();
+            Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+            if (resultB.get("data") != null) {
+                mergedData.put("B", resultB.get("data"));
+            }
+
+            String resC = builder.setUri(LJQ_URL).build().doGet();
+            Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+            if (resultC.get("data") != null) {
+                mergedData.put("C", resultC.get("data"));
+            }
+
+            Object resultD = digitalTwinService.overview(areaId);
+            if (resultD != null) {
+                mergedData.put("D", resultD);
+            }
+
+            return R.ok(mergedData);
+        }
     }
 
     /**
      * 杩戞湡璁㈠崟锛堥粯璁�7澶╋級
      *
+     * @param areaId    搴撳尯缂栫爜
      * @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){
+    public R recentOrder(@RequestParam(required = false) String areaId,
+                         @RequestParam(required = false) String startDate,
+                         @RequestParam(required = false) String endDate) throws IOException {
 
-        List<DtOrderVo> orderVoList = digitalTwinService.order(startDate, endDate);
+        Map<String, Object> map = new HashMap<>();
+        if (areaId != null) {
+            map.put("areaId", areaId);
+        }
+        if (startDate != null) {
+            map.put("startDate", startDate);
+        }
+        if (endDate != null) {
+            map.put("endDate", endDate);
+        }
+        HttpHandler.Builder builder = new HttpHandler.Builder()
+                .setPath("/digitalTwin/recentOrder")
+                .setParams(map);
 
-//        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);
+        ObjectMapper objectMapper = new ObjectMapper();
+        if (areaId != null) {
+            switch (areaId) {
+                case "A": {
 
-        return R.ok().add(orderVoList);
+                    String resA = builder.setUri(JG_URL).build().doGet();
+
+                    Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    List data = (List) result.get("data");
+                    return R.ok(data);
+                }
+                case "B": {
+
+                    String resB = builder.setUri(DJ_URL).build().doGet();
+
+                    Map<String, Object> result = objectMapper.readValue(resB, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    List data = (List) result.get("data");
+                    return R.ok(data);
+                }
+                case "C": {
+
+                    String resC = builder.setUri(LJQ_URL).build().doGet();
+
+                    Map<String, Object> result = objectMapper.readValue(resC, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    List data = (List) result.get("data");
+                    return R.ok(data);
+                }
+                case "D": {
+                    return R.ok(digitalTwinService.order(startDate, endDate));
+                }
+                default:
+                    Map<String, Object> mergedResult = new HashMap<>();
+                    Map<String, Object> mergedData = new HashMap<>();
+
+                    String resA = builder.setUri(JG_URL).build().doGet();
+                    Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+                    if (resultA.get("data") != null) {
+                        mergedData.put("A", resultA.get("data"));
+                    }
+
+                    String resB = builder.setUri(DJ_URL).build().doGet();
+                    Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+                    if (resultB.get("data") != null) {
+                        mergedData.put("B", resultB.get("data"));
+                    }
+
+                    String resC = builder.setUri(LJQ_URL).build().doGet();
+                    Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+                    if (resultC.get("data") != null) {
+                        mergedData.put("C", resultC.get("data"));
+                    }
+
+                    Object resultD = digitalTwinService.order(startDate, endDate);
+                    if (resultD != null) {
+                        mergedData.put("D", resultD);
+                    }
+
+                    return R.ok(mergedData);
+            }
+        } else {
+            Map<String, Object> mergedResult = new HashMap<>();
+            Map<String, Object> mergedData = new HashMap<>();
+
+            String resA = builder.setUri(JG_URL).build().doGet();
+            Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+            if (resultA.get("data") != null) {
+                mergedData.put("A", resultA.get("data"));
+            }
+
+            String resB = builder.setUri(DJ_URL).build().doGet();
+            Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+            if (resultB.get("data") != null) {
+                mergedData.put("B", resultB.get("data"));
+            }
+
+            String resC = builder.setUri(LJQ_URL).build().doGet();
+            Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+            if (resultC.get("data") != null) {
+                mergedData.put("C", resultC.get("data"));
+            }
+
+            Object resultD = digitalTwinService.order(startDate, endDate);
+            if (resultD != null) {
+                mergedData.put("D", resultD);
+            }
+
+            return R.ok(mergedData);
+        }
     }
 
     /**
@@ -86,23 +294,116 @@
 //    @ManagerAuth
     public R recentIdleLoc(@RequestParam(required = false) String areaId,
                            @RequestParam(required = false) String startDate,
-                         @RequestParam(required = false) String endDate){
+                           @RequestParam(required = false) String endDate) throws IOException {
 
-        List<DtLocVo> locVoList = digitalTwinService.recentLoc(areaId, startDate, endDate);
+        Map<String, Object> map = new HashMap<>();
+        if (areaId != null) {
+            map.put("areaId", areaId);
+        }
+        if (startDate != null) {
+            map.put("startDate", startDate);
+        }
+        if (endDate != null) {
+            map.put("endDate", endDate);
+        }
+        HttpHandler.Builder builder = new HttpHandler.Builder()
+                .setPath("/digitalTwin/recentIdleLoc")
+                .setParams(map);
 
-//        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);
+        ObjectMapper objectMapper = new ObjectMapper();
+        if (areaId != null) {
+            switch (areaId) {
+                case "A": {
 
-        return R.ok().add(locVoList);
+                    String resA = builder.setUri(JG_URL).build().doGet();
+
+                    Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    List data = (List) result.get("data");
+                    return R.ok(data);
+                }
+                case "B": {
+
+                    String resA = builder.setUri(DJ_URL).build().doGet();
+
+                    Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    List data = (List) result.get("data");
+                    return R.ok(data);
+                }
+                case "C": {
+
+                    String resA = builder.setUri(LJQ_URL).build().doGet();
+
+                    Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    List data = (List) result.get("data");
+                    return R.ok(data);
+                }
+                case "D": {
+                    return R.ok(digitalTwinService.recentLoc(areaId, startDate, endDate));
+                }
+                default:
+                    Map<String, Object> mergedResult = new HashMap<>();
+                    Map<String, Object> mergedData = new HashMap<>();
+
+                    String resA = builder.setUri(JG_URL).build().doGet();
+                    Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+                    if (resultA.get("data") != null) {
+                        mergedData.put("A", resultA.get("data"));
+                    }
+
+                    String resB = builder.setUri(DJ_URL).build().doGet();
+                    Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+                    if (resultB.get("data") != null) {
+                        mergedData.put("B", resultB.get("data"));
+                    }
+
+                    String resC = builder.setUri(LJQ_URL).build().doGet();
+                    Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+                    if (resultC.get("data") != null) {
+                        mergedData.put("C", resultC.get("data"));
+                    }
+
+                    Object resultD = digitalTwinService.recentLoc(areaId, startDate, endDate);
+                    if (resultD != null) {
+                        mergedData.put("D", resultD);
+                    }
+
+                    return R.ok(mergedData);
+            }
+        } else {
+            Map<String, Object> mergedResult = new HashMap<>();
+            Map<String, Object> mergedData = new HashMap<>();
+
+            String resA = builder.setUri(JG_URL).build().doGet();
+            Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+            if (resultA.get("data") != null) {
+                mergedData.put("A", resultA.get("data"));
+            }
+
+            String resB = builder.setUri(DJ_URL).build().doGet();
+            Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+            if (resultB.get("data") != null) {
+                mergedData.put("B", resultB.get("data"));
+            }
+
+            String resC = builder.setUri(LJQ_URL).build().doGet();
+            Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+            if (resultC.get("data") != null) {
+                mergedData.put("C", resultC.get("data"));
+            }
+
+            Object resultD = digitalTwinService.recentLoc(areaId, startDate, endDate);
+            if (resultD != null) {
+                mergedData.put("D", resultD);
+            }
+
+            return R.ok(mergedData);
+        }
     }
 
     /**
@@ -116,27 +417,118 @@
     @RequestMapping(value = "/recentInAndOutBound")
 //    @ManagerAuth
     public R recentInAndOutBound(@RequestParam(required = false) String areaId,
-                           @RequestParam(required = false) String startDate,
-                           @RequestParam(required = false) String endDate){
+                                 @RequestParam(required = false) String startDate,
+                                 @RequestParam(required = false) String endDate) throws ParseException, IOException {
 
-        List<DtInAndOutBoundVo> inAndOutBoundVoList = digitalTwinService.inAndOutBound(areaId, startDate, endDate);
+        Map<String, Object> map = new HashMap<>();
+        if (areaId != null) {
+            map.put("areaId", areaId);
+        }
+        if (startDate != null) {
+            map.put("startDate", startDate);
+        }
+        if (endDate != null) {
+            map.put("endDate", endDate);
+        }
+        HttpHandler.Builder builder = new HttpHandler.Builder()
+                .setPath("/digitalTwin/recentInAndOutBound")
+                .setParams(map);
 
+        ObjectMapper objectMapper = new ObjectMapper();
+        if (areaId != null) {
+            switch (areaId) {
+                case "A": {
 
-//        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);
+                    String resA = builder.setUri(JG_URL).build().doGet();
 
-        return R.ok().add(inAndOutBoundVoList);
+                    Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    List data = (List) result.get("data");
+                    return R.ok(data);
+                }
+                case "B": {
+
+                    String resA = builder.setUri(DJ_URL).build().doGet();
+
+                    Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    List data = (List) result.get("data");
+                    return R.ok(data);
+                }
+                case "C": {
+
+                    String resA = builder.setUri(LJQ_URL).build().doGet();
+
+                    Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    List data = (List) result.get("data");
+                    return R.ok(data);
+                }
+                case "D": {
+                    return R.ok(digitalTwinService.inAndOutBound(areaId, startDate, endDate));
+                }
+                default:
+                    Map<String, Object> mergedResult = new HashMap<>();
+                    Map<String, Object> mergedData = new HashMap<>();
+
+                    String resA = builder.setUri(JG_URL).build().doGet();
+                    Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+                    if (resultA.get("data") != null) {
+                        mergedData.put("A", resultA.get("data"));
+                    }
+
+                    String resB = builder.setUri(DJ_URL).build().doGet();
+                    Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+                    if (resultB.get("data") != null) {
+                        mergedData.put("B", resultB.get("data"));
+                    }
+
+                    String resC = builder.setUri(LJQ_URL).build().doGet();
+                    Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+                    if (resultC.get("data") != null) {
+                        mergedData.put("C", resultC.get("data"));
+                    }
+
+                    Object resultD = digitalTwinService.inAndOutBound(areaId, startDate, endDate);
+                    if (resultD != null) {
+                        mergedData.put("D", resultD);
+                    }
+
+                    return R.ok(mergedData);
+            }
+        } else {
+            // 濡傛灉娌℃湁鎻愪緵areaId锛岄粯璁よ皟鐢ㄦ湰鍦版湇鍔�
+            Map<String, Object> mergedResult = new HashMap<>();
+            Map<String, Object> mergedData = new HashMap<>();
+
+            String resA = builder.setUri(JG_URL).build().doGet();
+            Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+            if (resultA.get("data") != null) {
+                mergedData.put("A", resultA.get("data"));
+            }
+
+            String resB = builder.setUri(DJ_URL).build().doGet();
+            Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+            if (resultB.get("data") != null) {
+                mergedData.put("B", resultB.get("data"));
+            }
+
+            String resC = builder.setUri(LJQ_URL).build().doGet();
+            Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+            if (resultC.get("data") != null) {
+                mergedData.put("C", resultC.get("data"));
+            }
+
+            Object resultD = digitalTwinService.inAndOutBound(areaId, startDate, endDate);
+            if (resultD != null) {
+                mergedData.put("D", resultD);
+            }
+
+            return R.ok(mergedData);
+        }
     }
 
     /**
@@ -151,35 +543,121 @@
     public R recentDetainMat(@RequestParam(required = false) String areaId,
                              @RequestParam(required = false) Integer overDayNum,
                              @RequestParam(required = false) Integer pageIndex,
-                             @RequestParam(required = false) Integer pageSize){
+                             @RequestParam(required = false) Integer pageSize,
+                             @RequestParam(required = false) String condition) throws IOException {
 
-        List<DtDetainMatVo> detainMatVoList = digitalTwinService.recentDetainMat(areaId, overDayNum, pageIndex, pageSize);
+        Map<String, Object> map = new HashMap<>();
+        if (areaId != null) {
+            map.put("areaId", areaId);
+        }
+        if (overDayNum != null) {
+            map.put("overDayNum", overDayNum);
+        }
+        if (pageIndex != null) {
+            map.put("pageIndex", pageIndex);
+        }
+        if (pageSize != null) {
+            map.put("pageSize", pageSize);
+        }
+        if (condition != null) {
+            map.put("condition", condition);
+        }
+        HttpHandler.Builder builder = new HttpHandler.Builder()
+                .setPath("/digitalTwin/recentDetainMat")
+                .setParams(map);
 
-//        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);
+        ObjectMapper objectMapper = new ObjectMapper();
+        if (areaId != null) {
+            switch (areaId) {
+                case "A": {
+                    String resA = builder.setUri(JG_URL).build().doGet();
 
-        return R.ok().add(detainMatVoList);
+                    Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    List data = (List) result.get("data");
+                    return R.ok(data);
+                }
+                case "B": {
+                    String resA = builder.setUri(DJ_URL).build().doGet();
+
+                    Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    List data = (List) result.get("data");
+                    return R.ok(data);
+                }
+                case "C": {
+                    String resA = builder.setUri(LJQ_URL).build().doGet();
+
+                    Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    List data = (List) result.get("data");
+                    return R.ok(data);
+                }
+                case "D": {
+                    return R.ok(digitalTwinService.recentDetainMat(areaId, overDayNum, pageIndex, pageSize, condition));
+                }
+                default:
+                    Map<String, Object> mergedResult = new HashMap<>();
+                    Map<String, Object> mergedData = new HashMap<>();
+
+                    String resA = builder.setUri(JG_URL).build().doGet();
+                    Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+                    if (resultA.get("data") != null) {
+                        mergedData.put("A", resultA.get("data"));
+                    }
+
+                    String resB = builder.setUri(DJ_URL).build().doGet();
+                    Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+                    if (resultB.get("data") != null) {
+                        mergedData.put("B", resultB.get("data"));
+                    }
+
+                    String resC = builder.setUri(LJQ_URL).build().doGet();
+                    Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+                    if (resultC.get("data") != null) {
+                        mergedData.put("C", resultC.get("data"));
+                    }
+
+                    Object resultD = digitalTwinService.recentDetainMat(areaId, overDayNum, pageIndex, pageSize, condition);
+                    if (resultD != null) {
+                        mergedData.put("D", resultD);
+                    }
+
+                    return R.ok(mergedData);
+            }
+        } else {
+            // 濡傛灉娌℃湁鎻愪緵areaId锛岄粯璁よ皟鐢ㄦ湰鍦版湇鍔�
+            Map<String, Object> mergedResult = new HashMap<>();
+            Map<String, Object> mergedData = new HashMap<>();
+
+            String resA = builder.setUri(JG_URL).build().doGet();
+            Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+            if (resultA.get("data") != null) {
+                mergedData.put("A", resultA.get("data"));
+            }
+
+            String resB = builder.setUri(DJ_URL).build().doGet();
+            Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+            if (resultB.get("data") != null) {
+                mergedData.put("B", resultB.get("data"));
+            }
+
+            String resC = builder.setUri(LJQ_URL).build().doGet();
+            Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+            if (resultC.get("data") != null) {
+                mergedData.put("C", resultC.get("data"));
+            }
+
+            Object resultD = digitalTwinService.recentDetainMat(areaId, overDayNum, pageIndex, pageSize, condition);
+            if (resultD != null) {
+                mergedData.put("D", resultD);
+            }
+
+            return R.ok(mergedData);
+        }
     }
 
     /**
@@ -190,37 +668,103 @@
      */
     @RequestMapping(value = "/equipment")
 //    @ManagerAuth
-    public R equipment(@RequestParam(required = false) String areaId){
+    public R equipment(@RequestParam(required = false) String areaId) throws IOException {
 
-        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);
+        Map<String, Object> map = new HashMap<>();
+        map.put("areaId", areaId);
+        HttpHandler.Builder builder = new HttpHandler.Builder()
+                .setPath("/digitalTwin/equipment")
+                .setParams(map);
 
-        return R.ok().add(dtEquipmentVoList);
+        ObjectMapper objectMapper = new ObjectMapper();
+        if (areaId != null){
+            switch (areaId) {
+                case "A": {
+                    String resA = builder.setUri(JG_URL).build().doGet();
+                    Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+                    DtEquipmentVo data = objectMapper.convertValue(result.get("data"), DtEquipmentVo.class);
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    //DtEquipmentVo data = (DtEquipmentVo) result.get("data");
+                    return R.ok(data);
+                }
+                case "B": {
+                    String resA = builder.setUri(DJ_URL).build().doGet();
+                    Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+                    DtEquipmentVo data = objectMapper.convertValue(result.get("data"), DtEquipmentVo.class);
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    //DtEquipmentVo data = (DtEquipmentVo) result.get("data");
+                    return R.ok(data);
+                }
+                case "C": {
+                    String resA = builder.setUri(LJQ_URL).build().doGet();
+
+                    Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+                    DtEquipmentVo data = objectMapper.convertValue(result.get("data"), DtEquipmentVo.class);
+                    // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                    //DtEquipmentVo data = (DtEquipmentVo) result.get("data");
+                    return R.ok(data);
+                }
+                case "D": {
+                    return R.ok(digitalTwinService.equipment(areaId));
+                }
+                default:
+                    Map<String, Object> mergedResult = new HashMap<>();
+                    Map<String, Object> mergedData = new HashMap<>();
+
+                    String resA = builder.setUri(JG_URL).build().doGet();
+                    Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+                    if (resultA.get("data") != null) {
+                        mergedData.put("A", resultA.get("data"));
+                    }
+
+                    String resB = builder.setUri(DJ_URL).build().doGet();
+                    Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+                    if (resultB.get("data") != null) {
+                        mergedData.put("B", resultB.get("data"));
+                    }
+
+                    String resC = builder.setUri(LJQ_URL).build().doGet();
+                    Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+                    if (resultC.get("data") != null) {
+                        mergedData.put("C", resultC.get("data"));
+                    }
+
+                    Object resultD = digitalTwinService.equipment(areaId);
+                    if (resultD != null) {
+                        mergedData.put("D", resultD);
+                    }
+
+                    return R.ok(mergedData);
+            }
+        }else {
+            Map<String, Object> mergedResult = new HashMap<>();
+            Map<String, Object> mergedData = new HashMap<>();
+
+            String resA = builder.setUri(JG_URL).build().doGet();
+            Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+            if (resultA.get("data") != null) {
+                mergedData.put("A", resultA.get("data"));
+            }
+
+            String resB = builder.setUri(DJ_URL).build().doGet();
+            Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+            if (resultB.get("data") != null) {
+                mergedData.put("B", resultB.get("data"));
+            }
+
+            String resC = builder.setUri(LJQ_URL).build().doGet();
+            Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+            if (resultC.get("data") != null) {
+                mergedData.put("C", resultC.get("data"));
+            }
+
+            Object resultD = digitalTwinService.equipment(areaId);
+            if (resultD != null) {
+                mergedData.put("D", resultD);
+            }
+
+            return R.ok(mergedData);
+        }
     }
 
     /**
@@ -231,75 +775,202 @@
      */
     @RequestMapping(value = "/warehouseDetail")
 //    @ManagerAuth
-    public R warehouseDetail(@RequestParam(required = false) String areaId){
-        List<DtLocDetailVo> dtLocDetailVoList = digitalTwinService.warehouseDetail(areaId);
+    public R warehouseDetail(@RequestParam(required = false) String areaId) throws IOException {
+        Map<String, Object> map = new HashMap<>();
+        if (areaId != null) {
+            map.put("areaId", areaId);
+        }
 
-        return R.ok().add(dtLocDetailVoList);
+        HttpHandler.Builder builder = new HttpHandler.Builder()
+                .setPath("/digitalTwin/warehouseDetail")
+                .setParams(map);
+
+        ObjectMapper objectMapper = new ObjectMapper();
+        if (areaId != null) {
+            switch (areaId) {
+            case "A": {
+
+                String resA = builder.setUri(JG_URL).build().doGet();
+
+                Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+
+                // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                List data = (List) result.get("data");
+                return R.ok(data);
+            }
+            case "B": {
+                builder.setPath("/digitalTwin/warehouseDetail");
+                String resA = builder.setUri(DJ_URL).build().doGet();
+
+                Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+
+                // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                List data = (List) result.get("data");
+                return R.ok(data);
+            }
+            case "C": {
+
+                String resA = builder.setUri(LJQ_URL).build().doGet();
+
+                Map<String, Object> result = objectMapper.readValue(resA, Map.class);
+
+                // 濡傛灉鍙渶瑕乨ata閮ㄥ垎
+                List data = (List) result.get("data");
+                return R.ok(data);
+            }
+            case "D": {
+                return R.ok(digitalTwinService.warehouseDetail(areaId));
+            }
+            default:
+                Map<String, Object> mergedResult = new HashMap<>();
+                Map<String, Object> mergedData = new HashMap<>();
+
+                String resA = builder.setUri(JG_URL).build().doGet();
+                Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+                if (resultA.get("data") != null) {
+                    mergedData.put("A", resultA.get("data"));
+                }
+
+                String resB = builder.setUri(DJ_URL).build().doGet();
+                Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+                if (resultB.get("data") != null) {
+                    mergedData.put("B", resultB.get("data"));
+                }
+
+                String resC = builder.setUri(LJQ_URL).build().doGet();
+                Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+                if (resultC.get("data") != null) {
+                    mergedData.put("C", resultC.get("data"));
+                }
+
+                Object resultD = digitalTwinService.warehouseDetail(areaId);
+                if (resultD != null) {
+                    mergedData.put("D", resultD);
+                }
+
+                return R.ok(mergedData);
+        }
+        } else {
+            // 濡傛灉娌℃湁鎻愪緵areaId锛岄粯璁よ皟鐢ㄦ湰鍦版湇鍔�
+            Map<String, Object> mergedResult = new HashMap<>();
+            Map<String, Object> mergedData = new HashMap<>();
+
+            String resA = builder.setUri(JG_URL).build().doGet();
+            Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+            if (resultA.get("data") != null) {
+                mergedData.put("A", resultA.get("data"));
+            }
+
+            String resB = builder.setUri(DJ_URL).build().doGet();
+            Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+            if (resultB.get("data") != null) {
+                mergedData.put("B", resultB.get("data"));
+            }
+
+            String resC = builder.setUri(LJQ_URL).build().doGet();
+            Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+            if (resultC.get("data") != null) {
+                mergedData.put("C", resultC.get("data"));
+            }
+
+            Object resultD = digitalTwinService.warehouseDetail(areaId);
+            if (resultD != null) {
+                mergedData.put("D", resultD);
+            }
+
+            return R.ok(mergedData);
+        }
     }
-//        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);
+    /**
+     * 鏌ヨ鎵�鏈夊簱浣嶇姸鎬佸拰鐗╂枡-浜屾満搴婁俊鎭寲鏁板瓧瀛敓鐢�
+     */
+    @RequestMapping(value = "/getAllLocations")
+    public R getAllLocations() throws IOException {
+        Map<String, Object> mergedData = new HashMap<>();
+        HttpHandler.Builder builder = new HttpHandler.Builder()
+                .setPath("/digitalTwin/getAllLocations");
+        ObjectMapper objectMapper = new ObjectMapper();
+        String resA = builder.setUri(JG_URL).build().doGet();
+        Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+        if (resultA.get("data") != null) {
+            mergedData.put("A", resultA.get("data"));
+        }
+
+        String resB = builder.setUri(DJ_URL).build().doGet();
+        Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+        if (resultB.get("data") != null) {
+            mergedData.put("B", resultB.get("data"));
+        }
+
+        String resC = builder.setUri(LJQ_URL).build().doGet();
+        Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+        if (resultC.get("data") != null) {
+            mergedData.put("C", resultC.get("data"));
+        }
+
+        mergedData.put("D",digitalTwinService.getAllLocations());
+
+        return R.ok(mergedData);
+    }
+    /**
+     * 鏌ヨ鎵�鏈夊簱鐨勫簱浣嶅埄鐢ㄧ巼
+     */
+    @RequestMapping(value = "/getLocalInfo")
+    public R getLocalInfo() throws IOException {
+        Map<String, Object> mergedData = new HashMap<>();
+        HttpHandler.Builder builder = new HttpHandler.Builder()
+                .setPath("/digitalTwin/getLocalInfo");
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        String resA = builder.setUri(JG_URL).build().doGet();
+        Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+        mergedData.put("A", resultA);
+
+        String resB = builder.setUri(DJ_URL).build().doGet();
+        Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+        mergedData.put("B", resultB);
+
+        String resC = builder.setUri(LJQ_URL).build().doGet();
+        Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+        mergedData.put("C", resultC);
+
+        LocChartPie locUseRate = reportQueryMapper.getLocUseRate();
+        mergedData.put("D", locUseRate);
+
+        return R.ok(mergedData);
+    }
+    /**
+     * 鏌ヨ鎵�鏈夊簱鐨勫簱瀛樻槑缁�
+     */
+    @RequestMapping(value = "/getLocalDetal")
+    public R getLocalDetal() throws IOException {
+        Map<String, Object> mergedData = new HashMap<>();
+        HttpHandler.Builder builder = new HttpHandler.Builder()
+                .setPath("/digitalTwin/getLocalDetal");
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        String resA = builder.setUri(JG_URL).build().doGet();
+        Map<String, Object> resultA = objectMapper.readValue(resA, Map.class);
+        if (resultA.get("data") != null) {
+            mergedData.put("A", resultA.get("data"));
+        }
+
+        String resB = builder.setUri(DJ_URL).build().doGet();
+        Map<String, Object> resultB = objectMapper.readValue(resB, Map.class);
+        if (resultB.get("data") != null) {
+            mergedData.put("B", resultB.get("data"));
+        }
+
+        String resC = builder.setUri(LJQ_URL).build().doGet();
+        Map<String, Object> resultC = objectMapper.readValue(resC, Map.class);
+        if (resultC.get("data") != null) {
+            mergedData.put("C", resultC.get("data"));
+        }
+
+        List<Map<String, Object>> detalList = digitalTwinService.getLocalDetal();
+        mergedData.put("D", detalList);
+
+        return R.ok(mergedData);
+    }
 
 }
diff --git a/src/main/java/com/zy/asrs/controller/LocDetlController.java b/src/main/java/com/zy/asrs/controller/LocDetlController.java
index 619459d..a3f5a2c 100644
--- a/src/main/java/com/zy/asrs/controller/LocDetlController.java
+++ b/src/main/java/com/zy/asrs/controller/LocDetlController.java
@@ -298,38 +298,48 @@
         List<LocDetl> list = locDetlService.selectList(wrapper);
         List<AbnormalLocDetlParam> result = new ArrayList<>();
 
-        Page<LocDetl> groupLocDetl = locDetlService.getStockStatis2(toPage(1, 10000, param, LocDetl.class));
-        for (LocDetl locDetl : groupLocDetl.getRecords()) {
+        // 浣跨敤瀹屾暣鐨勬槑缁嗘暟鎹紝鑰屼笉鏄垎缁勬暟鎹�
+        for (LocDetl locDetl : list) {
             AbnormalLocDetlParam abnormalLocDetlParam = new AbnormalLocDetlParam();
             Mat mat = matService.selectOne(new EntityWrapper<Mat>()
                     .eq("matnr", locDetl.getMatnr()));
             if (Cools.isEmpty(mat)) {
                 continue;
             }
-            if (!Cools.isEmpty(mat                                                                          .getStoreMax()) || !Cools.isEmpty(mat.getStoreMin())) {
-                abnormalLocDetlParam.setStoreMax(mat.getStoreMax());
-                abnormalLocDetlParam.setStoreMaxDate(mat.getStoreMaxDate());
-                abnormalLocDetlParam.setStoreMin(mat.getStoreMin());
-                abnormalLocDetlParam.setAnfme(locDetl.getAnfme());
-                abnormalLocDetlParam.setMaktx(mat.getMaktx());
-                abnormalLocDetlParam.setMatnr(mat.getMatnr());
-                abnormalLocDetlParam.setSpecs(mat.getSpecs());
-                abnormalLocDetlParam.setBatch(locDetl.getBatch());
 
-//                SimpleDateFormat simple = new SimpleDateFormat("yyyyMMdd");
-//                Date maxDate = simple.parse(locDetl.getBatch());
-//                long time = maxDate.getTime();
-//                Date now = new Date();
-//                long time1 = now.getTime();
-//                abnormalLocDetlParam.setNowTime((int) ((time1 - time) / (1000 * 60 * 60 * 24)));
+            // 璁剧疆鍩烘湰淇℃伅锛堟棤璁烘槸鍚﹀紓甯革級
+            abnormalLocDetlParam.setStoreMax(mat.getStoreMax());
+            abnormalLocDetlParam.setStoreMaxDate(mat.getStoreMaxDate());
+            abnormalLocDetlParam.setStoreMin(mat.getStoreMin());
+            abnormalLocDetlParam.setAnfme(locDetl.getAnfme());
+            abnormalLocDetlParam.setMaktx(mat.getMaktx());
+            abnormalLocDetlParam.setMatnr(mat.getMatnr());
+            abnormalLocDetlParam.setSpecs(mat.getSpecs());
+            abnormalLocDetlParam.setBatch(locDetl.getBatch());
 
-                if (!Cools.isEmpty(mat.getStoreMax()) && locDetl.getAnfme() > mat.getStoreMax()) {
-                    result.add(abnormalLocDetlParam);
-                } else if (!Cools.isEmpty(mat.getStoreMin()) && locDetl.getAnfme() < mat.getStoreMin()) {
-                    result.add(abnormalLocDetlParam);
-                }
+            // 璁剧疆瀵煎嚭闇�瑕佺殑鍏朵粬瀛楁
+            abnormalLocDetlParam.setLocNo(locDetl.getLocNo());
+            abnormalLocDetlParam.setZpallet(locDetl.getZpallet());
+            abnormalLocDetlParam.setOrderNo(locDetl.getOrderNo());
+            abnormalLocDetlParam.setModiTime(locDetl.getModiTime());
+
+            // 璁$畻搴撻緞锛堝疄闄呭湪搴撳ぉ鏁帮級
+            if (locDetl.getAppeTime() != null) {
+                long diff = System.currentTimeMillis() - locDetl.getAppeTime().getTime();
+                int days = (int) (diff / (1000 * 60 * 60 * 24));
+                abnormalLocDetlParam.setNowTime(days);
             }
+
+            // 纭繚鎵�鏈夊瓧娈甸兘鏈夊�硷紝閬垮厤绌哄�煎鑷村鍑哄紓甯�
+            if (abnormalLocDetlParam.getLocNo() == null) abnormalLocDetlParam.setLocNo("");
+            if (abnormalLocDetlParam.getZpallet() == null) abnormalLocDetlParam.setZpallet("");
+            if (abnormalLocDetlParam.getOrderNo() == null) abnormalLocDetlParam.setOrderNo("");
+            if (abnormalLocDetlParam.getSpecs() == null) abnormalLocDetlParam.setSpecs("");
+
+            // 鎬绘槸娣诲姞鍒扮粨鏋滃垪琛�
+            result.add(abnormalLocDetlParam);
         }
+
         return R.ok(exportSupport(result, fields));
     }
 
diff --git a/src/main/java/com/zy/asrs/controller/LocMastController.java b/src/main/java/com/zy/asrs/controller/LocMastController.java
index 32fc68c..e32f766 100644
--- a/src/main/java/com/zy/asrs/controller/LocMastController.java
+++ b/src/main/java/com/zy/asrs/controller/LocMastController.java
@@ -365,8 +365,8 @@
                 locNoStr = split[1];
                 picPath += "_" + locNoStr;
             }
-            picList.add("http://" + WCS_URL + "/image/" + picPath + "-1.jpg");
-            picList.add("http://" + WCS_URL + "/image/" + picPath + "-2.jpg");
+            picList.add("http://172.26.4.184:8080//" + picPath + ".jpg.jpg");
+            picList.add("http://172.26.4.184:8080//" + picPath + ".jpg.jpg");
 
             LocPicDto locPicDto = new LocPicDto();
             locPicDto.setLocNo(locNoStr);
diff --git a/src/main/java/com/zy/asrs/controller/MesController.java b/src/main/java/com/zy/asrs/controller/MesController.java
index 3497c5a..52306dc 100644
--- a/src/main/java/com/zy/asrs/controller/MesController.java
+++ b/src/main/java/com/zy/asrs/controller/MesController.java
@@ -1,23 +1,39 @@
 package com.zy.asrs.controller;
 
+import com.alibaba.excel.util.StringUtils;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.core.annotations.AppAuth;
+import com.core.annotations.ManagerAuth;
 import com.core.common.Cools;
+import com.core.common.R;
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.mes.*;
+import com.zy.asrs.entity.param.CombParam;
 import com.zy.asrs.service.MesService;
+import com.zy.asrs.service.MobileService;
+import com.zy.asrs.service.impl.RcsServiceImpl;
 import com.zy.common.web.BaseController;
 import lombok.extern.slf4j.Slf4j;
+import org.hibernate.validator.constraints.NotEmpty;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.util.List;
 
 @RestController
 @Slf4j
 public class MesController extends BaseController {
 
+    // 娴峰悍RCS鍦板潃
+    @Value("${hik.url}")
+    private String HIK_URL;
+    @Autowired
+    private MobileService mobileService;
     @Resource
     private MesService mesService;
 
@@ -29,11 +45,15 @@
     // 鐗╂枡淇℃伅鍚屾
     @PostMapping("/api/mes/synMatInfo")
     @AppAuth(memo = "鐗╂枡淇℃伅鍚屾")
-    public MesReturn synMatInfo(@RequestHeader(required = false) String appkey,@RequestBody MesMatRecvForm param, HttpServletRequest request){
-        auth(appkey, param, request);
+    //public MesReturn synMatInfo(@RequestHeader(required = false) String appkey, @RequestBody List<MesMatRecvForm> params, HttpServletRequest request){
+    public MesReturn synMatInfo(@RequestHeader(required = false) String appkey, @RequestBody MesMatRecvForm params, HttpServletRequest request){
+        auth(appkey, params, request);
         MesReturn mesReturn = new MesReturn();
         try {
-            mesReturn = mesService.matInfoAndInBound(param);
+//            for (MesMatRecvForm param : params){
+//                mesReturn = mesService.matInfoAndInBound(param);
+//            }
+            mesReturn = mesService.matInfoAndInBound(params);
         } catch (Exception e) {
             mesReturn.setSuccess("2");
             mesReturn.setMessage("鐗╂枡淇℃伅鍚屾澶辫触");
@@ -118,4 +138,45 @@
         return mesService.queryInventory(itemno,orderNo);
     }
 
+
+    /**
+     * MES璋冪敤PDA鐨凙GV璁㈠崟鍏ュ簱鎺ュ彛
+     * @param combParam
+     * @return
+     */
+    @RequestMapping("/comb/auth")
+    @ManagerAuth(memo = "缁勬墭")
+    public R comb(@RequestBody CombParam combParam){
+        log.info("=============== MES涓嬪彂缁勬墭璁㈠崟 ===============");
+        log.info("{}", combParam);
+        log.info("=============== MES涓嬪彂缁勬墭璁㈠崟 ===============");
+        if (combParam.getUserId() != null && !combParam.getUserId().equals(null)){
+            mobileService.comb(combParam, combParam.getUserId());
+        }else {
+            mobileService.comb(combParam, getUserId());
+        }
+        return R.ok("缁勬墭鎴愬姛");
+    }
+
+    @PostMapping("/api/mes/pauseAGV")
+    public MesReturn AGVPause(@RequestBody JSONObject param){
+        MesReturn mesReturn = new MesReturn();
+        int AGVType;
+        if (param.containsKey("zoneCode")){
+            param.put("mapCode", "BB");
+            param.put("invoke", "BLOCKADE");
+            AGVType = 1;
+        }else {
+            AGVType = 2;
+        }
+        if (mesService.AGVPause(param, AGVType) == 1){
+            mesReturn.setSuccess("1");
+            mesReturn.setMessage("鎴愬姛");
+            return mesReturn;
+        }else {
+            mesReturn.setSuccess("2");
+            mesReturn.setMessage("澶辫触");
+            return mesReturn;
+        }
+    }
 }
diff --git a/src/main/java/com/zy/asrs/controller/MobileController.java b/src/main/java/com/zy/asrs/controller/MobileController.java
index 5c9ae88..67833a3 100644
--- a/src/main/java/com/zy/asrs/controller/MobileController.java
+++ b/src/main/java/com/zy/asrs/controller/MobileController.java
@@ -12,6 +12,7 @@
 import com.zy.asrs.entity.*;
 import com.zy.asrs.entity.param.*;
 import com.zy.asrs.entity.result.MobileAdjustResult;
+import com.zy.asrs.mapper.CanFinMapper;
 import com.zy.asrs.mapper.ManLocDetlMapper;
 import com.zy.asrs.service.*;
 import com.zy.asrs.service.impl.OrderDetlPakinServiceImpl;
@@ -63,6 +64,8 @@
     private ManLocDetlMapper manLocDetlMapper;
     @Autowired
     private WrkDetlLogService wrkDetlLogService;
+    @Autowired
+    private CanFinMapper canFinMapper;
 
     @Resource
     private StaDescService staDescService;
@@ -555,7 +558,8 @@
     @PostMapping("/callEmptyBinOutBound")
     @ManagerAuth(memo = "pda鍛煎彨绌烘枡妗嗗嚭搴�")
     public synchronized R callEmptyBinOutBound(@RequestParam(required = false) String locNo
-            , @RequestParam(required = false) String size) {
+            , @RequestParam(required = false) String size
+            , @RequestParam(required = false) String agvTaskNo) {
         if (Cools.isEmpty(locNo) || Cools.isEmpty(size)) {
             return R.error("绔欑偣鎴栬�呭ぇ灏忎笉鑳戒负绌�");
         }
@@ -563,7 +567,7 @@
         if (wrkMast != null) {
             return R.error("璇ョ珯鐐�="+locNo+"宸茬粡鏈夌┖鏉垮嚭搴撲换鍔★紝涓轰簡涓嶅牭濉炲爢鍨涙満鎺ラ┏绔欑偣锛岀姝笅鍙戝涓┖鏉垮嚭搴撲换鍔�");
         }
-        return mobileService.callEmptyBinOutBound(locNo,size,getUserId());
+        return mobileService.callEmptyBinOutBound(locNo,size,getUserId(), agvTaskNo);
     }
 
     /**
@@ -619,7 +623,14 @@
                 .setAppeTime(date)
                 .setModiUser(9945L)
                 .setModiTime(date);
-        if (!taskService.insert(task)) {
+        if (taskService.insert(task)) {
+            Date now = new Date();
+            CanFin canFin = new CanFin();
+            canFin.setAgvType("agv-in");
+            canFin.setInNo(TaskNo);
+            canFin.setApplyTime(now);
+            canFinMapper.insert(canFin);
+        }else{
             throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
         }
 
@@ -652,20 +663,26 @@
 
     @RequestMapping("/orderOut")
     public synchronized R AGVOrderOutReturn() {
-        List<OrderPakout> settle = orderPakoutService.selectList(new EntityWrapper<OrderPakout>().in("settle", 1, 2).eq("doc_type",11));
+        List<OrderPakout> settle = orderPakoutService.selectList(new EntityWrapper<OrderPakout>().in("settle", 1, 2).eq("doc_type", 11));
         List<String> list = new ArrayList<>();
-        for (OrderPakout orderPakout: settle) {
-            if (orderPakout.getSettle()==2){
-                List<OrderDetlPakout> orderId = orderDetlPakoutService.selectList(new EntityWrapper<OrderDetlPakout>().eq("order_id", orderPakout.getId()));
-                Boolean boo=true;
-                for (OrderDetlPakout orderDetlPakout: orderId) {
-                    if (orderDetlPakout.getAnfme()>orderDetlPakout.getWorkQty()){
-                        boo=false;
+
+        // 浣跨敤杩唬鍣ㄩ亶鍘嗭紝鍙互瀹夊叏鍒犻櫎
+        Iterator<OrderPakout> iterator = settle.iterator();
+        while (iterator.hasNext()) {
+            OrderPakout orderPakout = iterator.next();
+
+            if (orderPakout.getSettle() == 2) {
+                List<OrderDetlPakout> orderId = orderDetlPakoutService.selectList(
+                        new EntityWrapper<OrderDetlPakout>().eq("order_id", orderPakout.getId()));
+                Boolean boo = true;
+                for (OrderDetlPakout orderDetlPakout : orderId) {
+                    if (orderDetlPakout.getAnfme() > orderDetlPakout.getWorkQty()) {
+                        boo = false;
                         break;
                     }
                 }
                 if (boo) {
-                    settle.remove(orderPakout);
+                    iterator.remove();  // 浣跨敤杩唬鍣ㄧ殑remove鏂规硶
                 }else {
                     list.add(orderPakout.getOrderNo());
                 }
diff --git a/src/main/java/com/zy/asrs/controller/OrderPakoutController.java b/src/main/java/com/zy/asrs/controller/OrderPakoutController.java
index 23fbfff..a3b3454 100644
--- a/src/main/java/com/zy/asrs/controller/OrderPakoutController.java
+++ b/src/main/java/com/zy/asrs/controller/OrderPakoutController.java
@@ -10,6 +10,7 @@
 import com.zy.asrs.entity.*;
 import com.zy.asrs.entity.param.OrderDomainParam;
 import com.zy.asrs.entity.result.WrkTraceVo;
+import com.zy.asrs.mapper.CanFinMapper;
 import com.zy.asrs.service.*;
 import com.zy.common.model.DetlDto;
 import com.zy.common.web.BaseController;
@@ -42,6 +43,8 @@
     private WrkMastService wrkMastService;
     @Autowired
     private WrkMastLogService wrkMastLogService;
+    @Autowired
+    private CanFinMapper canFinMapper;
 
     @RequestMapping(value = "/order/nav/list/auth")
     @ManagerAuth
@@ -375,6 +378,27 @@
     @ManagerAuth(memo = "鎵嬪姩鍒犻櫎璁㈠崟")
     @Transactional
     public R delete(@RequestParam Long orderId){
+        OrderPakout orderPakout = orderService.selectOne(new EntityWrapper<OrderPakout>()
+                .eq("id", orderId));
+        CanFin deleteCanFin = new CanFin();
+        deleteCanFin.setOutNo(orderPakout.getOrderNo());
+        List<CanFin> canFinList = canFinMapper.selectList(new EntityWrapper<CanFin>()
+                .orderBy("apply_time", true)
+                .isNotNull("out_no"));
+        if (!canFinList.isEmpty()){
+            for (CanFin canFin : canFinList){
+                if (canFin.getOutNo().equals(deleteCanFin.getOutNo())){
+                    canFinMapper.deleteById(canFin.getId());
+                }
+            }
+        }
+        List<CanFin> newCanFinList = canFinMapper.selectList(new EntityWrapper<CanFin>()
+                .orderBy("apply_time", true));
+        if (!newCanFinList.isEmpty()){
+            CanFin firstCanFin = newCanFinList.get(0);
+            firstCanFin.setTaskStatus("canout");
+            canFinMapper.updateById(firstCanFin);
+        }
         orderService.remove(orderId);
 //        Order order = orderService.selectById(orderId);
 //        if (order != null) {
diff --git a/src/main/java/com/zy/asrs/controller/OutController.java b/src/main/java/com/zy/asrs/controller/OutController.java
index f17d01b..1119dc3 100644
--- a/src/main/java/com/zy/asrs/controller/OutController.java
+++ b/src/main/java/com/zy/asrs/controller/OutController.java
@@ -312,7 +312,8 @@
                     }});
                     String agvSta = "";
                     if (locMast.getLocType3() == 2) {
-
+                        agvSta = "Z-LZP26";
+                    }else if (locType == 2){
                     } else {
                         agvSta = orderPakout.getCstmrName();//agv鐩爣绔欑偣浣嶇疆
                     }
@@ -378,16 +379,17 @@
                 }
             }
             if (issued > 0) {
-                LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued);
-                locDto.setBrand(orderDetl.getBrand());
-                locDto.setStandby1(orderDetl.getStandby1());
-                locDto.setStandby2(orderDetl.getStandby2());
-                locDto.setStandby3(orderDetl.getStandby3());
-                locDto.setBoxType1(orderDetl.getBoxType1());
-                locDto.setBoxType2(orderDetl.getBoxType2());
-                locDto.setBoxType3(orderDetl.getBoxType3());
-                locDto.setLack(Boolean.TRUE);
-                locDtos.add(locDto);
+//                LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued);
+//                locDto.setBrand(orderDetl.getBrand());
+//                locDto.setStandby1(orderDetl.getStandby1());
+//                locDto.setStandby2(orderDetl.getStandby2());
+//                locDto.setStandby3(orderDetl.getStandby3());
+//                locDto.setBoxType1(orderDetl.getBoxType1());
+//                locDto.setBoxType2(orderDetl.getBoxType2());
+//                locDto.setBoxType3(orderDetl.getBoxType3());
+//                locDto.setLack(Boolean.TRUE);
+//                locDtos.add(locDto);
+                return R.error("搴撳瓨涓嶈冻");
             }
         }
         R pakout = pakout(locDtos);
diff --git a/src/main/java/com/zy/asrs/controller/RcsController.java b/src/main/java/com/zy/asrs/controller/RcsController.java
index 3b0f903..42cac61 100644
--- a/src/main/java/com/zy/asrs/controller/RcsController.java
+++ b/src/main/java/com/zy/asrs/controller/RcsController.java
@@ -23,7 +23,6 @@
     // 鍙嶉浠诲姟鎵ц缁撴灉
     @PostMapping("/api/robot/reporter/task")
     public RcsReturn reporterTask(@RequestBody RcsReporterTask param){
-
         return rcsService.reporterTask(param);
     }
 
@@ -41,4 +40,12 @@
         return rcsService.hxApplyInLine(param);
     }
 
+
+    // 鍗庢檽AGV绂诲紑浜哄憳鍏ヤ镜妫�娴嬪尯鍩�
+    @PostMapping("/api/robot/apply/station")
+    public RcsReturn hxOutStation(@RequestBody TransParent param){
+
+        return rcsService.hxOutStation(param);
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/controller/TaskController.java b/src/main/java/com/zy/asrs/controller/TaskController.java
index b453629..979dabf 100644
--- a/src/main/java/com/zy/asrs/controller/TaskController.java
+++ b/src/main/java/com/zy/asrs/controller/TaskController.java
@@ -6,7 +6,9 @@
 import com.baomidou.mybatisplus.mapper.Wrapper;
 import com.baomidou.mybatisplus.plugins.Page;
 import com.core.common.DateUtils;
+import com.zy.asrs.entity.CanFin;
 import com.zy.asrs.entity.Task;
+import com.zy.asrs.mapper.CanFinMapper;
 import com.zy.asrs.service.TaskService;
 import com.core.annotations.ManagerAuth;
 import com.core.common.BaseRes;
@@ -23,6 +25,8 @@
 
     @Autowired
     private TaskService taskService;
+    @Autowired
+    private CanFinMapper canFinMapper;
 
     @RequestMapping(value = "/task/{id}/auth")
     @ManagerAuth
@@ -99,6 +103,29 @@
             taskService.completeWrkMast(workNo, getUserId());
             return R.ok("宸ヤ綔妗e凡瀹屾垚");
         } else if (type == 2) {
+            Task task = taskService.selectOne(new EntityWrapper<Task>()
+                    .eq("wrk_no", workNo));
+            if (task != null){
+                CanFin deleteCanFin = new CanFin();
+                deleteCanFin.setInNo(task.getTaskNo());
+                List<CanFin> canFinList = canFinMapper.selectList(new EntityWrapper<CanFin>()
+                        .orderBy("apply_time", true)
+                        .isNotNull("in_no"));
+                if (!canFinList.isEmpty()){
+                    for (CanFin canFin : canFinList){
+                        if (canFin.getInNo().equals(deleteCanFin.getInNo())){
+                            canFinMapper.deleteById(canFin.getId());
+                        }
+                    }
+                }
+                List<CanFin> newCanFinList = canFinMapper.selectList(new EntityWrapper<CanFin>()
+                        .orderBy("apply_time", true));
+                if (!newCanFinList.isEmpty()){
+                    CanFin firstCanFin = newCanFinList.get(0);
+                    firstCanFin.setTaskStatus("canout");
+                    canFinMapper.updateById(firstCanFin);
+                }
+            }
             taskService.cancelWrkMast(workNo, getUserId());
             return R.ok("宸ヤ綔妗e凡鍙栨秷");
         } else if (type == 3) {
diff --git a/src/main/java/com/zy/asrs/entity/CanFin.java b/src/main/java/com/zy/asrs/entity/CanFin.java
new file mode 100644
index 0000000..fed12f6
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/CanFin.java
@@ -0,0 +1,65 @@
+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.util.Date;
+
+@Data
+@TableName("can_fin")
+public class CanFin {
+
+    /**
+     * 涓婚敭缂栧彿
+     */
+    @ApiModelProperty(value= "涓婚敭")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 鍏ュ簱鍗曞彿
+    */
+    @TableField("in_no")
+    private String inNo;
+
+    /**
+     * 鍑哄簱鍙�
+     * */
+    @TableField("out_no")
+    private String outNo;
+
+    /**
+     * 鎻掑叆鏃堕棿
+     */
+    @TableField("apply_time")
+    private Date applyTime;
+
+    /**
+     * 浠诲姟绫诲瀷
+     */
+    @TableField("task_type")
+    private String taskType;
+
+    /**
+     * 浠诲姟鐘舵��
+     */
+    @TableField("task_status")
+    private String taskStatus;
+
+    /**
+     * 鍑哄簱绫诲瀷
+     */
+    @TableField("out_type")
+    private String outType;
+
+    /**
+     * agv绫诲瀷
+     */
+    @TableField("agv_type")
+    private String agvType;
+}
diff --git a/src/main/java/com/zy/asrs/entity/LocDetl.java b/src/main/java/com/zy/asrs/entity/LocDetl.java
index 34181dc..7f606c9 100644
--- a/src/main/java/com/zy/asrs/entity/LocDetl.java
+++ b/src/main/java/com/zy/asrs/entity/LocDetl.java
@@ -43,6 +43,7 @@
     private String locNo;
 
     @ApiModelProperty("area_id")
+    @TableField("area_id")
     private Long areaId;
 
     @ApiModelProperty("area_name")
diff --git a/src/main/java/com/zy/asrs/entity/Task.java b/src/main/java/com/zy/asrs/entity/Task.java
index cd8db31..0e218d5 100644
--- a/src/main/java/com/zy/asrs/entity/Task.java
+++ b/src/main/java/com/zy/asrs/entity/Task.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.annotations.TableField;
 
 import com.core.common.SpringUtils;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.zy.asrs.service.*;
 import com.zy.system.entity.User;
 import com.zy.system.service.UserService;
@@ -344,6 +345,13 @@
     @TableField("task_no")
     private String taskNo;
 
+    /**
+     * 鏄惁鏄痯da鍙戠殑
+     */
+    @ApiModelProperty(value= "鏄惁鏄疨DA鍙戠殑浠诲姟")
+    @TableField("is_PDA")
+    private String isPda;
+
     public Task() {}
 
     public String getYmd$(){
diff --git a/src/main/java/com/zy/asrs/entity/digitaltwin/AllLocationsVo.java b/src/main/java/com/zy/asrs/entity/digitaltwin/AllLocationsVo.java
new file mode 100644
index 0000000..3f7c2bc
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/digitaltwin/AllLocationsVo.java
@@ -0,0 +1,36 @@
+package com.zy.asrs.entity.digitaltwin;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author pang.jiabao
+ * @description 鏌ヨ鎵�鏈夊簱浣嶇姸鎬佸拰鐗╂枡-浜屾満搴婁俊鎭寲鏁板瓧瀛敓鐢�
+ * @createDate 2026/1/26 11:13
+ */
+@Data
+public class AllLocationsVo {
+
+    // 搴撲綅鍙�
+    private String locNo;
+
+    // 搴撲綅鐘舵�侊紝O绌哄簱浣嶏紙鑻辨枃涓嶆槸鏁板瓧锛夛紱F 鍦ㄥ簱锛汥 绌烘澘锛汸 鍑哄簱涓紱R 鍑哄簱棰勭害锛汼 鍏ュ簱棰勭害锛涘叾浠� 鍏朵粬锛�
+    private String locSts;
+
+    private List<LocDetl> locDetls  = new ArrayList<>();
+
+    @Data
+    public static class LocDetl {
+
+        @ApiModelProperty(value = "鍟嗗搧缂栧彿")
+        private String matnr;
+
+        @ApiModelProperty(value = "鍟嗗搧鍚嶇О")
+        private String maktx;
+
+        private Double anfme;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/entity/digitaltwin/DtDetainMatVo.java b/src/main/java/com/zy/asrs/entity/digitaltwin/DtDetainMatVo.java
index 29129c9..7890539 100644
--- a/src/main/java/com/zy/asrs/entity/digitaltwin/DtDetainMatVo.java
+++ b/src/main/java/com/zy/asrs/entity/digitaltwin/DtDetainMatVo.java
@@ -5,7 +5,6 @@
 
 // 鏁板瓧瀛敓锛氬憜婊炲搧淇℃伅
 @Data
-@Builder
 public class DtDetainMatVo {
 
     // 褰掑睘搴撳尯ID
diff --git a/src/main/java/com/zy/asrs/entity/digitaltwin/DtEquipmentVo.java b/src/main/java/com/zy/asrs/entity/digitaltwin/DtEquipmentVo.java
index 67d9fe7..ca04694 100644
--- a/src/main/java/com/zy/asrs/entity/digitaltwin/DtEquipmentVo.java
+++ b/src/main/java/com/zy/asrs/entity/digitaltwin/DtEquipmentVo.java
@@ -1,10 +1,14 @@
 package com.zy.asrs.entity.digitaltwin;
 
+import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 @Data
 @Builder
+@AllArgsConstructor
+@NoArgsConstructor
 public class DtEquipmentVo {
 
     // 璁惧ID
diff --git a/src/main/java/com/zy/asrs/entity/mes/MesCallOutApply.java b/src/main/java/com/zy/asrs/entity/mes/MesCallOutApply.java
index dd78348..67d0f90 100644
--- a/src/main/java/com/zy/asrs/entity/mes/MesCallOutApply.java
+++ b/src/main/java/com/zy/asrs/entity/mes/MesCallOutApply.java
@@ -56,7 +56,7 @@
         // 鏁伴噺
         @JsonProperty("Qty")
         @JSONField(name = "Qty")
-        private Integer Qty;
+        private Double Qty;
         // 鐗╂枡浜岀淮鐮�
         @JsonProperty("ItemBarcode")
         @JSONField(name = "ItemBarcode")
diff --git a/src/main/java/com/zy/asrs/entity/mes/MesMatInfo.java b/src/main/java/com/zy/asrs/entity/mes/MesMatInfo.java
index 669d754..505a957 100644
--- a/src/main/java/com/zy/asrs/entity/mes/MesMatInfo.java
+++ b/src/main/java/com/zy/asrs/entity/mes/MesMatInfo.java
@@ -108,7 +108,7 @@
 //    @NotNull
     @JsonProperty("qty")
     @JSONField(name = "qty")
-    private Integer qty;
+    private Double qty;
 
     // 闆朵欢浜岀淮鐮�
     @JsonProperty("ItemBarcode")
diff --git a/src/main/java/com/zy/asrs/entity/mes/MesOutApply.java b/src/main/java/com/zy/asrs/entity/mes/MesOutApply.java
index 230e26a..0dc4a3f 100644
--- a/src/main/java/com/zy/asrs/entity/mes/MesOutApply.java
+++ b/src/main/java/com/zy/asrs/entity/mes/MesOutApply.java
@@ -56,7 +56,7 @@
         // 鏁伴噺
         @JsonProperty("Qty")
         @JSONField(name = "Qty")
-        private Integer Qty;
+        private Double Qty;
         // 鐗╂枡浜岀淮鐮�
         @JsonProperty("ItemBarcode")
         @JSONField(name = "ItemBarcode")
diff --git a/src/main/java/com/zy/asrs/entity/mes/TransParent.java b/src/main/java/com/zy/asrs/entity/mes/TransParent.java
index 3f94b61..20dd9cf 100644
--- a/src/main/java/com/zy/asrs/entity/mes/TransParent.java
+++ b/src/main/java/com/zy/asrs/entity/mes/TransParent.java
@@ -33,7 +33,18 @@
     @JSONField(name = "TaskType")
     private String TaskType;
 
+    // 绌鸿溅鎴栨弧杞借繘鍑�
+    @JsonProperty("FullEmptyEnex")
+    @JSONField(name = "FullEmptyEnex")
+    private String FullEmptyEnex;
+
+    // 鍗庢檽鎴栨槸娴峰悍
+    @JsonProperty("agvFactory")
+    @JSONField(name = "agvFactory")
+    private Integer agvFactory;
+
     //璇锋眰绫诲瀷
     private String method;
 
+    private String areaNo;
 }
diff --git a/src/main/java/com/zy/asrs/entity/mes/TransTask.java b/src/main/java/com/zy/asrs/entity/mes/TransTask.java
index 14c53c6..389a074 100644
--- a/src/main/java/com/zy/asrs/entity/mes/TransTask.java
+++ b/src/main/java/com/zy/asrs/entity/mes/TransTask.java
@@ -75,4 +75,6 @@
     @JSONField(name = "TuoPanId")
     private String TuoPanId;
 
+
+    private String isPDA;
 }
diff --git a/src/main/java/com/zy/asrs/entity/param/AbnormalLocDetlParam.java b/src/main/java/com/zy/asrs/entity/param/AbnormalLocDetlParam.java
index 6063621..c1bcc8a 100644
--- a/src/main/java/com/zy/asrs/entity/param/AbnormalLocDetlParam.java
+++ b/src/main/java/com/zy/asrs/entity/param/AbnormalLocDetlParam.java
@@ -174,6 +174,12 @@
      * 瀹為檯鍦ㄥ簱澶╂暟
      */
     private Integer nowTime;
+    /**
+     * 搴撻緞(澶�)锛屽搴斿墠绔殑 storeDate 瀛楁
+     */
+    public Integer getStoreDate() {
+        return this.nowTime;
+    }
 
 
     public String getLocNo$() {
diff --git a/src/main/java/com/zy/asrs/entity/param/CombParam.java b/src/main/java/com/zy/asrs/entity/param/CombParam.java
index 77f6da8..b873c5f 100644
--- a/src/main/java/com/zy/asrs/entity/param/CombParam.java
+++ b/src/main/java/com/zy/asrs/entity/param/CombParam.java
@@ -24,6 +24,8 @@
 
     private List<CombMat> combMats;
 
+    private Long userId;  // 鏂板瀛楁
+
     @Data
     public static class CombMat {
 
diff --git a/src/main/java/com/zy/asrs/entity/rcs/RcsReporterTask.java b/src/main/java/com/zy/asrs/entity/rcs/RcsReporterTask.java
index 57a3144..f538710 100644
--- a/src/main/java/com/zy/asrs/entity/rcs/RcsReporterTask.java
+++ b/src/main/java/com/zy/asrs/entity/rcs/RcsReporterTask.java
@@ -18,4 +18,7 @@
 
     //鍗庢檽AGV浠诲姟鐘舵�佸強璇锋眰
     private String method;
+
+    private String AgvFactory;
+    private String FullEmptyEnex;
 }
diff --git a/src/main/java/com/zy/asrs/mapper/CanFinMapper.java b/src/main/java/com/zy/asrs/mapper/CanFinMapper.java
new file mode 100644
index 0000000..c7a1f52
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/CanFinMapper.java
@@ -0,0 +1,16 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.zy.asrs.entity.CanFin;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface CanFinMapper extends BaseMapper<CanFin> {
+
+    CanFin selectOne(Wrapper<CanFin> outNo);
+
+    List<CanFin> selectOne(String taskNo);
+}
diff --git a/src/main/java/com/zy/asrs/mapper/DigitalTwinMapper.java b/src/main/java/com/zy/asrs/mapper/DigitalTwinMapper.java
index 33f1999..2f56216 100644
--- a/src/main/java/com/zy/asrs/mapper/DigitalTwinMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/DigitalTwinMapper.java
@@ -7,6 +7,7 @@
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
+import java.util.Date;
 import java.util.List;
 
 @Mapper
@@ -15,12 +16,12 @@
 
     List<Double> overview(@Param("areaId")String areaId);
 
-    List<DtOrderVo> recentOrder(@Param("startTime")String startTime, @Param("endTime")String endTime);
+    List<DtOrderVo> recentOrder(@Param("startTime")Date startTime, @Param("endTime")Date endTime);
 
-    List<DtInAndOutBoundVo> recentInBound(@Param("areaId")String areaId, @Param("startTime")String startTime, @Param("endTime")String endTime);
+    List<DtInAndOutBoundVo> recentInBound(@Param("areaId")String areaId, @Param("startTime") Date startTime, @Param("endTime")Date endTime);
 
-    List<DtInAndOutBoundVo> recentOutBound(@Param("areaId")String areaId, @Param("startTime")String startTime, @Param("endTime")String endTime);
+    List<DtInAndOutBoundVo> recentOutBound(@Param("areaId")String areaId, @Param("startTime") Date startTime, @Param("endTime")Date endTime);
 
-    List<DtDetainMatVo> recentDetainMat(@Param("areaId")String areaId, @Param("startTime")String startTime,
+    List<DtDetainMatVo> recentDetainMat(@Param("areaId")String areaId, @Param("startTime")Date startTime,
                                         @Param("pageIndex")Integer pageIndex, @Param("pageSize")Integer pageSize);
 }
diff --git a/src/main/java/com/zy/asrs/service/DigitalTwinService.java b/src/main/java/com/zy/asrs/service/DigitalTwinService.java
index d56961f..a08ce35 100644
--- a/src/main/java/com/zy/asrs/service/DigitalTwinService.java
+++ b/src/main/java/com/zy/asrs/service/DigitalTwinService.java
@@ -1,8 +1,10 @@
 package com.zy.asrs.service;
 
+import com.core.common.R;
 import com.zy.asrs.entity.digitaltwin.*;
 
 import java.util.List;
+import java.util.Map;
 
 public interface DigitalTwinService {
 
@@ -40,9 +42,10 @@
      * @param overDayNum
      * @param pageIndex
      * @param pageSize
+     * @param condition 鎼滅储鏉′欢
      * @return
      */
-    List<DtDetainMatVo> recentDetainMat(String areaId, Integer overDayNum, Integer pageIndex, Integer pageSize);
+    List<DtDetainMatVo> recentDetainMat(String areaId, Integer overDayNum, Integer pageIndex, Integer pageSize, String condition);
 
     /**
      * 鏌ヨ搴撳瓨鍜屽簱浣嶈缁嗕俊鎭�
@@ -67,4 +70,13 @@
      *
      */
     void locNumCount();
+
+    DtEquipmentVo equipment(String areaId);
+
+    /**
+     * 鏌ヨ鎵�鏈夊簱浣嶇姸鎬佸拰鐗╂枡-浜屾満搴婁俊鎭寲鏁板瓧瀛敓鐢�
+     */
+    List<AllLocationsVo> getAllLocations();
+
+    List<Map<String, Object>> getLocalDetal();
 }
diff --git a/src/main/java/com/zy/asrs/service/MesService.java b/src/main/java/com/zy/asrs/service/MesService.java
index f88f88b..f3ba28b 100644
--- a/src/main/java/com/zy/asrs/service/MesService.java
+++ b/src/main/java/com/zy/asrs/service/MesService.java
@@ -147,4 +147,6 @@
     int outStation(TransParent apply);
 
     MesReturn queryInventory(String itemno,String orderNo);
+
+    int AGVPause(JSONObject params, int AGVType);
 }
diff --git a/src/main/java/com/zy/asrs/service/MobileService.java b/src/main/java/com/zy/asrs/service/MobileService.java
index 6c5a8f5..047c30d 100644
--- a/src/main/java/com/zy/asrs/service/MobileService.java
+++ b/src/main/java/com/zy/asrs/service/MobileService.java
@@ -6,7 +6,6 @@
 import com.zy.asrs.entity.LocDetl;
 import com.zy.asrs.entity.OrderDetl;
 import com.zy.asrs.entity.param.*;
-import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.Date;
 
@@ -103,10 +102,12 @@
 
     /**
      * pda鍛煎彨绌烘枡妗嗗嚭搴�
-     * @param staNo 鍑哄簱绔欑偣
-     * @param locType 鎵樼洏绫诲瀷 1.绐勶紝2.瀹�
-     * @param userId 鐢ㄦ埛id
+     *
+     * @param staNo     鍑哄簱绔欑偣
+     * @param locType   鎵樼洏绫诲瀷 1.绐勶紝2.瀹�
+     * @param userId    鐢ㄦ埛id
+     * @param agvTaskNo
      */
-    R callEmptyBinOutBound(String staNo, String locType, Long userId);
+    R callEmptyBinOutBound(String staNo, String locType, Long userId, String agvTaskNo);
 
 }
diff --git a/src/main/java/com/zy/asrs/service/OrderPakoutService.java b/src/main/java/com/zy/asrs/service/OrderPakoutService.java
index 60a6c8e..d162198 100644
--- a/src/main/java/com/zy/asrs/service/OrderPakoutService.java
+++ b/src/main/java/com/zy/asrs/service/OrderPakoutService.java
@@ -1,10 +1,12 @@
 package com.zy.asrs.service;
 
 import com.baomidou.mybatisplus.service.IService;
+import com.core.common.R;
 import com.zy.asrs.entity.OrderPakout;
 import com.zy.asrs.entity.OrderDetlPakout;
 import com.zy.asrs.entity.WrkDetl;
 import com.zy.asrs.entity.WrkMast;
+import com.zy.common.model.LocDto;
 
 import java.util.List;
 
@@ -33,5 +35,6 @@
 
     OrderPakout selectOrderMoveStatus();
     OrderPakout selectOrderMoveStatusInitial();
+    R pakout(List<LocDto> locDtos);
 
 }
diff --git a/src/main/java/com/zy/asrs/service/RcsService.java b/src/main/java/com/zy/asrs/service/RcsService.java
index 29123b8..306529c 100644
--- a/src/main/java/com/zy/asrs/service/RcsService.java
+++ b/src/main/java/com/zy/asrs/service/RcsService.java
@@ -63,4 +63,8 @@
      * @return
      */
     RcsReturn hxApplyInLine(TransParent apply);
+
+    RcsReturn hxOutStation(TransParent param);
+
+    int applyIn(JSONObject allow, int i);
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/DigitalTwinServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/DigitalTwinServiceImpl.java
index 32bb716..d0f8b22 100644
--- a/src/main/java/com/zy/asrs/service/impl/DigitalTwinServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/DigitalTwinServiceImpl.java
@@ -1,20 +1,29 @@
 package com.zy.asrs.service.impl;
 
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.zy.asrs.entity.BasCrnp;
 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.mapper.LocDetlMapper;
+import com.zy.asrs.mapper.LocMastMapper;
+import com.zy.asrs.service.BasCrnpService;
 import com.zy.asrs.service.DigitalTwinService;
+import com.zy.asrs.service.LocDetlService;
+import com.zy.asrs.service.LocMastService;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -24,6 +33,12 @@
     private DigitalTwinMapper digitalTwinMapper;
     @Resource
     private LocCountMapper locCountMapper;
+    @Resource
+    private LocMastMapper locMastMapper;
+    @Resource
+    private LocDetlMapper locDetlMapper;
+    @Resource
+    private LocMastService locMastService;
 
     /**
      * 鎬昏锛氭�诲簱浣嶃�佸凡鐢ㄥ簱浣嶃�佸墿浣欏簱浣嶃�佷粖鏃ュ嚭搴撱�佷粖鏃ュ叆搴撱�佸墿浣欏簱浣�
@@ -57,21 +72,49 @@
      */
     public List<DtOrderVo> order(String startDate, String endDate) {
 
-        String startTime;
-        String endTime;
+        Date startTime = new Date();
+        Date endTime = new Date();
         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();
+            startTime = calendar.getTime();
+            endTime = now;
 
-            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
-            endDate = sdf.format(now);
-            startDate = sdf.format(start);
+        } else {
+            SimpleDateFormat sdf;
+            try {
+                // 灏濊瘯瑙f瀽yyyyMMdd鏍煎紡
+                if (startDate.length() == 8 && endDate.length() == 8) {
+                    sdf = new SimpleDateFormat("yyyyMMdd");
+                    startTime = sdf.parse(startDate);
+                    endTime = sdf.parse(endDate);
+                    // 璁剧疆缁撴潫鏃堕棿涓哄綋澶╃殑23:59:59.999
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(endTime);
+                    calendar.set(Calendar.HOUR_OF_DAY, 23);
+                    calendar.set(Calendar.MINUTE, 59);
+                    calendar.set(Calendar.SECOND, 59);
+                    calendar.set(Calendar.MILLISECOND, 999);
+                    endTime = calendar.getTime();
+                } else {
+                    // 灏濊瘯瑙f瀽yyyy-MM-dd HH:mm:ss.SSS鏍煎紡
+                    sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+                    startTime = sdf.parse(startDate);
+                    endTime = sdf.parse(endDate);
+                }
+            } catch (ParseException e) {
+                e.printStackTrace();
+                // 瑙f瀽澶辫触鏃朵娇鐢ㄩ粯璁ょ殑7澶╂椂闂磋寖鍥�
+                Date now = new Date();
+                Calendar calendar = Calendar.getInstance();
+                calendar.setTime(now);
+                calendar.add(Calendar.DAY_OF_MONTH, -7);
+                startTime = calendar.getTime();
+                endTime = now;
+            }
         }
-        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);
         // 绌烘棩鏈熻ˉ鍏�
         for (DtOrderVo dtOrderVo : dbOrder) {
@@ -91,31 +134,59 @@
      */
     public List<DtInAndOutBoundVo> inAndOutBound(String areaId, String startDate, String endDate) {
 
-        List<DtInAndOutBoundVo> dtInAndOutBoundVos = new ArrayList<>();
-
-        String startTime;
-        String endTime;
+        Date startTime = new Date();
+        Date endTime = new Date();
         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();
+            startTime = calendar.getTime();
+            endTime = now;
 
-            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
-            endDate = sdf.format(now);
-            startDate = sdf.format(start);
+        } else {
+            SimpleDateFormat sdf;
+            try {
+                // 灏濊瘯瑙f瀽yyyyMMdd鏍煎紡
+                if (startDate.length() == 8 && endDate.length() == 8) {
+                    sdf = new SimpleDateFormat("yyyyMMdd");
+                    startTime = sdf.parse(startDate);
+                    endTime = sdf.parse(endDate);
+                    // 璁剧疆缁撴潫鏃堕棿涓哄綋澶╃殑23:59:59.999
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(endTime);
+                    calendar.set(Calendar.HOUR_OF_DAY, 23);
+                    calendar.set(Calendar.MINUTE, 59);
+                    calendar.set(Calendar.SECOND, 59);
+                    calendar.set(Calendar.MILLISECOND, 999);
+                    endTime = calendar.getTime();
+                } else {
+                    // 灏濊瘯瑙f瀽yyyy-MM-dd HH:mm:ss.SSS鏍煎紡
+                    sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+                    startTime = sdf.parse(startDate);
+                    endTime = sdf.parse(endDate);
+                }
+            } catch (ParseException e) {
+                e.printStackTrace();
+                // 瑙f瀽澶辫触鏃朵娇鐢ㄩ粯璁ょ殑7澶╂椂闂磋寖鍥�
+                Date now = new Date();
+                Calendar calendar = Calendar.getInstance();
+                calendar.setTime(now);
+                calendar.add(Calendar.DAY_OF_MONTH, -7);
+                startTime = calendar.getTime();
+                endTime = now;
+            }
         }
-        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);
 
         // 鏍煎紡鏁寸悊
+        List<DtInAndOutBoundVo> dtInAndOutBoundVos = new ArrayList<>(dtInBoundVos);
+        dtInAndOutBoundVos.addAll(dtOutBoundVos);
 
         return dtInAndOutBoundVos;
     }
-
     /**
      * 杩戞湡杩戞湡鍛嗘粸鍝佷俊鎭紝榛樿瓒呰繃30澶╀负鍛嗘粸鍝�
      *
@@ -123,9 +194,10 @@
      * @param overDayNum
      * @param pageIndex
      * @param pageSize
+     * @param condition 鎼滅储鏉′欢
      * @return
      */
-    public List<DtDetainMatVo> recentDetainMat(String areaId, Integer overDayNum, Integer pageIndex, Integer pageSize) {
+    public List<DtDetainMatVo> recentDetainMat(String areaId, Integer overDayNum, Integer pageIndex, Integer pageSize, String condition) {
 
         overDayNum = overDayNum == null ? 30 : overDayNum;
         pageIndex = pageIndex == null ? 1 : pageIndex;
@@ -136,10 +208,10 @@
         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);
+    /*    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String startTime = sdf.format(start);*/
 
-        List<DtDetainMatVo> dbDetainMats = digitalTwinMapper.recentDetainMat(areaId, startTime, pageIndex, pageSize);
+        List<DtDetainMatVo> dbDetainMats = digitalTwinMapper.recentDetainMat(areaId, start, pageIndex, pageSize);
 
         return dbDetainMats;
     }
@@ -151,31 +223,15 @@
      * @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;
+        List<LocMast> locMastList = locMastService.selectList(new EntityWrapper<>());
+        return locMastList.stream()
+                .map(loc -> {
+                    DtLocDetailVo vo = new DtLocDetailVo();
+                    BeanUtils.copyProperties(loc, vo);
+                    return vo;
+                })
+                .collect(Collectors.toList());
     }
 
     /**
@@ -201,13 +257,13 @@
             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));
-        }
+//        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();
@@ -226,30 +282,33 @@
      * 瀹氭湡缁熻鍓╀綑搴撳瓨
      *
      */
+    @Transactional
     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);
-        }
+        LocCount locCount1 = new LocCount();
+        locCount1.setDate(Integer.valueOf(date));
+        locCount1.setLocNum(totalLoc.get(0).getLocNum());
+        locCount1.setRemainNum(locCount1.getLocNum() - useLoc.get(0).getLocNum());
+
+        locCountMapper.insertOrUpdate(locCount1);
+    }
+
+
+    @Resource
+    private BasCrnpService basCrnpService;
+    @Override
+    public DtEquipmentVo equipment(String areaId) {
+        BasCrnp crnp = basCrnpService.selectOne(new EntityWrapper<>());
+        return DtEquipmentVo.builder()
+                .equipmentId("1").equipmentName("鍫嗗灈鏈�1").equipmentType(1)
+                .belongAreaId("D").belongAreaName("婊戝潡搴�").verticalSpeed(Integer.valueOf(Cools.isEmpty(crnp.getCtlHp())? "0" : crnp.getCtlHp()))
+                .horizontalSpeed(Integer.valueOf(Cools.isEmpty(crnp.getCtlRest())? "0" : crnp.getCtlRest())).voltage(220).status(crnp.getCrnErr() == 0 ? 1 : 3).operateMethod(crnp.getCrnSts() == 3 ? 1 : 3).build();
     }
 
 
@@ -270,5 +329,50 @@
     // 杈撻�佺嚎鎷嶇収銆佺О閲�
 
     // endregion
+    @Resource
+    private LocDetlService locDetlService;
+
+    @Override
+    public List<AllLocationsVo> getAllLocations() {
+        List<AllLocationsVo> allLocationsVos = new ArrayList<>();
+        List<LocMast> locMastList = locMastService.selectList(new EntityWrapper<>());
+        locMastList.forEach(locMast -> {
+            AllLocationsVo allLocationsVo = new AllLocationsVo();
+            allLocationsVo.setLocNo(locMast.getLocNo());
+            String locSts = locMast.getLocSts();
+            allLocationsVo.setLocSts(locSts);
+            // 鏈夊簱瀛�
+            if (locSts.equals("F") || locSts.equals("P") || locSts.equals("Q") || locSts.equals("R")) {
+                List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", locMast.getLocNo()));
+                if (!locDetls.isEmpty()) {
+                    List<AllLocationsVo.LocDetl> locDetlList = locDetls.stream().map(locDetl -> {
+                                AllLocationsVo.LocDetl locDetl1 = new AllLocationsVo.LocDetl();
+                                BeanUtils.copyProperties(locDetl, locDetl1);
+                                return locDetl1;
+                            }
+                    ).collect(Collectors.toList());
+                    allLocationsVo.setLocDetls(locDetlList);
+                }
+            }
+            allLocationsVos.add(allLocationsVo);
+        });
+        return allLocationsVos;
+    }
+
+    public List<Map<String, Object>> getLocalDetal() {
+        List<LocDetl> locDetls = locDetlMapper.selectList(new EntityWrapper<>());
+        List<Map<String, Object>> result = new ArrayList<>();
+
+        for (LocDetl locDetl : locDetls) {
+            Map<String, Object> item = new HashMap<>();
+            item.put("zpallet", locDetl.getZpallet());
+            item.put("anfme", locDetl.getAnfme());
+            item.put("matnr", locDetl.getMatnr());
+            item.put("maktx", locDetl.getMaktx());
+            result.add(item);
+        }
+
+        return result;
+    }
 
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java
index 1bfc8b4..8e8c95d 100644
--- a/src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.alibaba.excel.util.DateUtils;
 import com.alibaba.excel.util.StringUtils;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
@@ -14,6 +15,7 @@
 import com.zy.asrs.entity.param.EmptyPlateOutParam;
 import com.zy.asrs.entity.rcs.*;
 import com.zy.asrs.mapper.AgvInfoMapper;
+import com.zy.asrs.mapper.CanFinMapper;
 import com.zy.asrs.mapper.MatItemBarcodeMapper;
 import com.zy.asrs.service.*;
 import com.zy.asrs.utils.OrderInAndOutUtil;
@@ -26,8 +28,11 @@
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import javax.annotation.Resource;
+import java.io.IOException;
 import java.text.ParseException;
 import java.util.*;
 import java.util.concurrent.ExecutionException;
@@ -52,6 +57,14 @@
     public long defaultUserId;
     @Value("${wms.zpalletId}")
     public String WMS_ZPALLET_ID;
+
+    // 娴峰悍RCS鍦板潃
+    @Value("${hik.url}")
+    private String HIK_URL;
+
+    // 鍗庢檽RCS鍦板潃
+    @Value("${hx.url}")
+    private String HX_URL;
 
     @Resource
     private RcsService rcsService;
@@ -95,6 +108,8 @@
     private DocTypeService docTypeService;
     @Autowired
     private OrderService orderService;
+    @Autowired
+    private CanFinMapper canFinMapper;
 
 
     // region MES鎺ュ彛
@@ -266,7 +281,7 @@
                     OrderDetlPakin orderDetlPakin = new OrderDetlPakin();
                     orderDetlPakin.setOrderId(orderPakin.getId());
                     orderDetlPakin.setOrderNo(orderPakin.getOrderNo());
-                    orderDetlPakin.setAnfme(Double.valueOf(mesMatInfo.getQty()));
+                    orderDetlPakin.setAnfme(mesMatInfo.getQty());
                     orderDetlPakin.setQty(0.0);
                     orderDetlPakin.setMatnr(mat.getMatnr());
                     orderDetlPakin.setMaktx(mat.getMaktx());
@@ -937,6 +952,27 @@
         if (docType == null) {
             return 0;
         }
+
+/*
+        // 鏌ヨcan_fin琛ㄤ腑apply_time鏈�鏂扮殑璁板綍
+        List<CanFin> canFinList = canFinMapper.selectList(new EntityWrapper<CanFin>()
+                .orderBy("apply_time", false)
+        );
+        if (!canFinList.isEmpty()) {
+            CanFin firstCanFin = canFinList.get(0);
+            if (firstCanFin.getAgvType().equals("agv-in-out")) {
+                // 鍙慨鏀归渶瑕佹洿鏂扮殑瀛楁
+                firstCanFin.setOutType("waiting");
+                firstCanFin.setOutNo(mesCallOutApply.getOrderNo());
+                // 纭繚鍏朵粬瀛楁淇濇寔涓嶅彉
+                canFinMapper.updateById(firstCanFin);
+
+                log.info("宸叉洿鏂癱an_fin琛ㄦ渶鏃╄褰曠殑out_no锛孖D锛歿}锛屽嚭搴撳崟鍙凤細{}",
+                        firstCanFin.getId(), mesCallOutApply.getOrderNo());
+            }
+        }
+*/
+
         //鐢熸垚鍑哄簱鍗�
         if (docType.getPakout() == 1) {
             long settle = 1;
@@ -971,6 +1007,22 @@
                 log.error("MES淇濆瓨鍑哄簱璁㈠崟锛堝彨鏂欙級涓绘。澶辫触");
                 throw new CoolException("淇濆瓨鍑哄簱璁㈠崟锛堝彨鏂欙級涓绘。澶辫触");
             }
+
+            if (mesCallOutApply.getTransType().equals("瑁呴厤鍑哄簱鍗�")){
+                CanFin canFin = new CanFin();
+                Date time = now;
+                canFin.setAgvType("agv-out");
+                canFin.setOutNo(mesCallOutApply.getOrderNo());
+                List<CanFin> canFinList = canFinMapper.selectList(new EntityWrapper<>());
+                if (canFinList.isEmpty()){
+                    canFin.setTaskStatus("canout");
+                }else {
+                    canFin.setTaskStatus("waiting");
+                }
+                canFin.setApplyTime(time);
+                canFinMapper.insert(canFin);
+            }
+
             Set<String> set = new HashSet<>();
             // 鐢熸垚鏄庣粏
             if (mesCallOutApply.getItemdata() != null && !mesCallOutApply.getItemdata().isEmpty()) {
@@ -978,6 +1030,10 @@
 
                     set.add(mesOutApplyItem.getTrayid());
                     Mat mat = matService.selectByMatnr(mesOutApplyItem.getItemno());
+                    if (Cools.isEmpty(mat)) {
+                        log.error("鐗╂枡缂栧彿涓嶅瓨鍦�: {}", mesOutApplyItem.getItemno());
+                        throw new CoolException("鐗╂枡缂栧彿涓嶅瓨鍦�: " + mesOutApplyItem.getItemno());
+                    }
                     OrderDetlPakout orderDetlPakout = new OrderDetlPakout();
                     orderDetlPakout.setOrderId(orderPakout.getId());
                     orderDetlPakout.setOrderNo(orderPakout.getOrderNo());
@@ -1109,6 +1165,15 @@
         Task task = new Task();
         task.setWrkNo(workNo);
         task.setTaskType("ZX-AGV");
+        if (transTask.getTransType()!= null){
+            if (transTask.getTransType().equals("08-1")){
+                task.setTaskType("ZX-AGV-08-1");
+            }else if (transTask.getTransType().equals("08-2")){
+                task.setTaskType("ZX-AGV-08-2");
+            }else if (transTask.getTransType().equals("11")){
+                task.setTaskType("ZP-AGV");
+            }
+        }
         task.setWrkSts(301L);//301.AGV浠诲姟鍒涘缓
         task.setIoType(3);//3.绔欏埌绔�
         task.setIoPri(10.00);
@@ -1126,11 +1191,22 @@
         task.setPltType(transTask.getAgvFactory());//鍗庢檽AGV
         task.setPacked(transTask.getRackNumber());//鏂欐灦鍙�
         task.setCtnType(1);
+        task.setIsPda(transTask.getIsPDA());
 
         if (taskService.insert(task)) {
+            if (transTask.getNextStationId().equals("402") || transTask.getNextStationId().equals("401")){
+                CanFin canFin = new CanFin();
+//            canFin.setAgvType("agv-in-out");
+                canFin.setAgvType("agv-in");
+                canFin.setTaskStatus("waiting");
+                canFin.setInNo(transTask.getTaskno());
+                canFin.setApplyTime(now);
+                canFinMapper.insert(canFin);
                 result.put("Success", "1");
-                result.put("Message", "浠诲姟鎺ユ敹鎴愬姛");
-
+                result.put("Message", "浠诲姟涓嬪彂缁橰CS鎴愬姛");
+            }
+            result.put("Success", "1");
+            result.put("Message", "浠诲姟涓嬪彂缁橰CS鎴愬姛");
         }else {
             result.put("Success", "2");
             result.put("Message", "浠诲姟涓嬪彂缁橰CS澶辫触");
@@ -1230,9 +1306,14 @@
         mesReturn.setSuccess("2");
 
         if ("Y".equals(allow.getStatus())) {
-            Task task = taskService.selectOne(new EntityWrapper<Task>().eq("task_no", allow.getTaskno()));
+            String taskNo = allow.getTaskno();
+            if (taskNo.contains("-")) {
+                taskNo = allow.getTaskno().substring(0, taskNo.lastIndexOf("-"));
+            }
+            Task task = taskService.selectOne(new EntityWrapper<Task>().eq("task_no", taskNo));
             if (Cools.isEmpty(task)) {
-                mesReturn.setMessage("娌℃湁鎵句釜璇ヤ换鍔$紪鍙�=" + allow.getTaskno() + "鐨凙GV绉诲姩浠诲姟");
+
+                mesReturn.setMessage("娌℃湁鎵惧埌璇ヤ换鍔$紪鍙�=" + allow.getTaskno() + "鐨凙GV绉诲姩浠诲姟");
             } else {
                 //鏌ョ湅鐢宠绔欑偣鐨勬槸娴峰悍杩樻槸鍗庢檽
                 //娴峰悍
@@ -1248,13 +1329,23 @@
                     mesReturn.setSuccess(success == 1 ? "1" : "2");
                     mesReturn.setMessage(success == 1 ? "" : "杞彂缁橰CS澶辫触");
                 } else {
+                    JSONObject params = new JSONObject();
+                    params.put("EqptCode", allow.getStationId());
+                    params.put("TaskCode", allow.getTaskno());
+                    params.put("ActionStatus", "1");
                     allow.setMethod("APPLY_IN_STATION");
                     int success = rcsService.continueTask(allow, 2);
-                    mesReturn.setSuccess(success == 1 ? "1" : "2");
-                    mesReturn.setMessage(success == 1 ? "" : "杞彂缁橰CS澶辫触");
+                    int success1 = rcsService.applyIn(params, 2);
+                    if (success1 == 1 || success == 1){
+                        mesReturn.setSuccess("1");
+                        mesReturn.setMessage("");
+                    }else {
+                        mesReturn.setSuccess(success1 == 1 ? "1" : "2");
+                        mesReturn.setMessage(success1 == 1 ? "" : "杞彂缁橰CS澶辫触");
+                    }
                 }
-
             }
+
         }
 
         return mesReturn;
@@ -1318,23 +1409,27 @@
         mesReturn.setSuccess("2");
 
         if ("Y".equals(allow.getStatus())) {
-            Task task = taskService.selectOne(new EntityWrapper<Task>().eq("task_no", allow.getTaskno()));
+            String taskNo = allow.getTaskno();
+            if (taskNo.contains("-")) {
+                taskNo = allow.getTaskno().substring(0, taskNo.lastIndexOf("-"));
+            }
+            Task task = taskService.selectOne(new EntityWrapper<Task>().eq("task_no", taskNo));
             if (Cools.isEmpty(task)) {
                 mesReturn.setMessage("娌℃湁鎵句釜璇ヤ换鍔$紪鍙�=" + allow.getTaskno() + "鐨凙GV绉诲姩浠诲姟");
             } else {
                 //鏌ョ湅鐢宠绔欑偣鐨勬槸娴峰悍杩樻槸鍗庢檽
                 //娴峰悍
-                if (Cools.isEmpty(task.getPltType()) || task.getPltType() == 1) {
+                if (Cools.isEmpty(task.getPltType()) || task.getPltType() == 1 || task.getPltType() == 0) {
                     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, 1);
                     mesReturn.setSuccess(success == 1 ? "1" : "2");
                     mesReturn.setMessage(success == 1 ? "" : "杞彂缁橰CS澶辫触");
+
                 } else {
                     allow.setMethod("APPLY_OFF_STATION");
                     int success = rcsService.continueTask(allow, 2);
@@ -1382,6 +1477,7 @@
         return mesReturn;
     }
 
+
     // endregion
 
     /**
@@ -1395,5 +1491,39 @@
         AgvInfo agvInfo = agvInfoMapper.selectById(agvNo);
         return agvInfo.getAgvFactory();
     }
+    @Override
+    public int AGVPause(JSONObject params, int AGVType){
+        MesReturn mesReturn = new MesReturn();
 
+        String hik_blockUrl = "api/robot/controller/zone/blockade";
+        String hik_pauseUrl = "api/robot/controller/zone/pause";
+        String hx_url = "robot/controller/notify/isstop";
+
+        if (AGVType == 1){
+            String BLOCK_URL = HIK_URL + hik_blockUrl;
+            String PAUSE_URL = HIK_URL + hik_pauseUrl;
+
+            String blockResponse = RcsServiceImpl.sendPost(BLOCK_URL, JSONObject.toJSONString(params));
+            JSONObject jsonObject = JSON.parseObject(blockResponse);
+            if (!StringUtils.isEmpty(blockResponse) && (jsonObject.getString("code").equals("SUCCESS") || jsonObject.getInteger("code") == 200)) {
+                String PauseResponse = RcsServiceImpl.sendPost(PAUSE_URL, JSONObject.toJSONString(params));
+                JSONObject pauseJsonObject = JSON.parseObject(PauseResponse);
+                if (!StringUtils.isEmpty(PauseResponse) && (jsonObject.getString("code").equals("SUCCESS") || jsonObject.getInteger("code") == 200)) {
+                    return 1;
+                }else
+                    return 2;
+            }else
+                return 2;
+        }else {
+            String URL = "";
+            URL = HX_URL + hx_url;
+            String PauseResponse = RcsServiceImpl.sendPost(URL, JSONObject.toJSONString(params));
+            JSONObject jsonObject = JSON.parseObject(PauseResponse);
+            if (!StringUtils.isEmpty(PauseResponse) && (jsonObject.getString("code").equals("SUCCESS") || jsonObject.getInteger("code") == 200)) {
+                return 1;
+            }else
+                return 2;
+        }
+
+    }
 }
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 59f9de5..32b8a75 100644
--- a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -8,8 +8,8 @@
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.*;
 import com.zy.asrs.entity.param.*;
-import com.zy.asrs.enums.CommonEnum;
 import com.zy.asrs.enums.LocStsType;
+import com.zy.asrs.mapper.CanFinMapper;
 import com.zy.asrs.mapper.LocMastMapper;
 import com.zy.asrs.mapper.ManLocDetlMapper;
 import com.zy.asrs.service.*;
@@ -22,7 +22,6 @@
 import com.zy.common.model.enums.WorkNoType;
 import com.zy.common.service.CommonService;
 import com.zy.common.utils.HttpHandler;
-import com.zy.system.entity.Config;
 import com.zy.system.service.impl.ConfigServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
@@ -31,8 +30,6 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -118,6 +115,8 @@
     private BasContainerService basContainerService;
     @Autowired
     private ConfigServiceImpl configService;
+    @Autowired
+    private CanFinMapper canFinMapper;
 
     @Override
     @Transactional
@@ -771,7 +770,13 @@
                         .setAppeTime(date)
                         .setModiUser(9945L)
                         .setModiTime(date);
-                if (!taskService.insert(task)) {
+                if (taskService.insert(task)) {
+                    CanFin canFin = new CanFin();
+                    canFin.setApplyTime(now);
+                    canFin.setAgvType("agv-in");
+                    canFin.setInNo(detlDtos.get(0).getOrderNo());
+                    canFinMapper.insert(canFin);
+                }else {
                     throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
                 }
             }
@@ -1329,7 +1334,7 @@
 
     @Override
     @Transactional
-    public R callEmptyBinOutBound(String staNo, String locType, Long userId) {
+    public R callEmptyBinOutBound(String staNo, String locType, Long userId, String agvTaskNo) {
         LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", 'D').eq("loc_type2", locType));
         if(locMast == null) {
             return R.parse("璇ョ被鍨嬶細" + locType +"绌烘墭鐩樹笉瀛樺湪");
@@ -1373,12 +1378,23 @@
         wrkMast.setExitMk("N"); // 閫�鍑�
         wrkMast.setEmptyMk("Y"); // 绌烘澘
         wrkMast.setLinkMis("N");
+        if (agvTaskNo!=null){
+            wrkMast.setUserNo(agvTaskNo);
+        }else {
+            Date date = new Date();
+            wrkMast.setUserNo(staNo + "aa" + date.getTime());
+        }
         wrkMast.setAppeUser(userId);
         wrkMast.setAppeTime(now);
         wrkMast.setModiUser(userId);
         wrkMast.setModiTime(now);
         wrkMast.setMemo(staNo);
         wrkMastService.insert(wrkMast);
+        CanFin canFin = new CanFin();
+        canFin.setAgvType("agv-out");
+        canFin.setApplyTime(now);
+        canFin.setOutNo(wrkMast.getUserNo());
+        canFinMapper.insert(canFin);
 
         // 鏇存柊搴撲綅鐘舵��
         if (locMast.getLocSts().equals("D")) {
@@ -1549,3 +1565,4 @@
         }
     }
 }
+
diff --git a/src/main/java/com/zy/asrs/service/impl/OrderPakoutServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OrderPakoutServiceImpl.java
index 2e41247..d0b7de7 100644
--- a/src/main/java/com/zy/asrs/service/impl/OrderPakoutServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OrderPakoutServiceImpl.java
@@ -2,21 +2,23 @@
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
-import com.core.common.Cools;
-import com.core.common.DateUtils;
-import com.core.common.SnowflakeIdWorker;
+import com.core.common.*;
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.*;
+import com.zy.asrs.entity.param.EmptyPlateOutParam;
 import com.zy.asrs.entity.param.OpenOrderPakinParam;
 import com.zy.asrs.entity.param.OpenOrderPakoutParam;
 import com.zy.asrs.mapper.OrderDetlPakoutMapper;
 import com.zy.asrs.mapper.OrderPakoutMapper;
 import com.zy.asrs.service.*;
 import com.zy.common.model.DetlDto;
+import com.zy.common.model.LocDto;
+import com.zy.common.model.TaskDto;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -38,6 +40,19 @@
     private WrkDetlService wrkDetlService;
     @Autowired
     private OrderDetlPakoutServiceImpl orderDetlPakoutService;
+    @Autowired
+    private LocDetlService locDetlService;
+    @Autowired
+    private LocMastService locMastService;
+    @Autowired
+    private StaDescService staDescService;
+    @Autowired
+    private WorkService workService;
+    @Autowired
+    private BasDevpService basDevpService;
+
+    @Resource
+    private OrderPakoutService orderPakOutService;
 
     @Override
     public OrderPakout selectByNo(String orderNo) {
@@ -203,4 +218,153 @@
         return this.baseMapper.selectOrderMoveStatusInitial();
     }
 
+    @Override
+    public R pakout(List<LocDto> locDtos) {
+        if (Cools.isEmpty(locDtos)) {
+            return R.parse(BaseRes.PARAM);
+        }
+        List<LocDto> locDtoArrayList = new ArrayList<>();
+        for (LocDto locDto : locDtos) {
+            if (locDto.getFrozen() != 1 && locDto.getFrozenLoc() != 1) {
+                locDtoArrayList.add(locDto);
+            }
+        }
+        locDtos = locDtoArrayList;
+        if (Cools.isEmpty(locDtos)) {
+            return R.parse("搴撳瓨/搴撲綅琚喕缁擄紝璇峰鐞嗗悗鍑哄簱锛侊紒锛�");
+        }
+        boolean lack = true;
+        for (LocDto locDto : locDtos) {
+            if (!locDto.isLack()) {
+                lack = false;
+                break;
+            }
+        }
+        if (lack) {
+            return R.error("搴撳瓨涓嶈冻");
+        }
+
+        List<TaskDto> taskDtos = new ArrayList<>();
+        // 鏍规嵁 锛堝簱浣� & 鍑哄簱绔欙級 鍒嗙粍锛� 鐞嗘兂鐘舵�侊細涓�缁勪负涓�娆″嚭搴撲换鍔�
+        for (LocDto locDto : locDtos) {
+            if (locDto.isLack()) {
+                continue;
+            }
+            TaskDto taskDto = new TaskDto(locDto.getLocNo(), locDto.getStaNo(), locDto);
+            if (TaskDto.has(taskDtos, taskDto)) {
+                TaskDto dto = TaskDto.find(taskDtos, taskDto);
+                assert dto != null;
+                dto.getLocDtos().addAll(taskDto.getLocDtos());
+            } else {
+                taskDtos.add(taskDto);
+            }
+        }
+        OrderPakout orderPakout = orderPakOutService.selectByNo(locDtos.get(0).getOrderNo());
+
+        //閰嶇洏鍑哄簱鍗曠敤锛� i=5鏃舵垨鑰呭嚭搴撳埌鏈�鍚庢椂涓嬪彂绌烘澘鍑哄簱浠诲姟
+        int i = 0;
+        //闇�瑕佸嚭搴撶殑鎵樼洏鏁伴噺
+        int size = taskDtos.size();
+        //浼樺厛绾�
+        int ioPri = 50;
+        //宸蹭笅绌烘澘鍑哄簱浠诲姟鏁伴噺
+        int j = 1;
+        // -----------------------------------------------------------------------------------------------
+        for (TaskDto taskDto : taskDtos) {
+            BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo());
+            workService.stockOut(staNo, taskDto, 9995L, ioPri);
+            ioPri--;
+            i++;
+            //閰嶇洏鍑哄簱鍗曚娇鐢紝涓嬪彂闇�瑕佸嚭鐨勭┖鏉夸换鍔�
+            if (orderPakout.getDocType() == 11) {
+                if (i == size) {
+                    for (; j <= orderPakout.getPayType(); j++) {
+                        LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", taskDto.getLocNo()));
+                        Integer locType = Integer.valueOf(locMast1.getLocType2());
+                        //閰嶇洏 鍑哄簱鍗曞嚭搴撳尯鍩熸椂Q-L4鏃�,鍑哄ぇ鎵樼洏绌烘澘
+                        if(!Cools.isEmpty(orderPakout.getCstmrName())&&orderPakout.getCstmrName().equals("Q-L4")){
+                            locType = 2;
+                        }
+                        String bar = "";
+                        //鍏蜂綋寰呭畾
+//                        if(!Cools.isEmpty(orderPakout.getShipCode())&&orderPakout.getShipCode().equals("A01")){
+//                            bar = "A01";
+//                        }
+                        LocMast locMast = new LocMast();
+                        if (Cools.isEmpty(bar)) {
+                            locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
+                                    .eq("loc_sts", "D").eq("loc_type2", locType).orderBy("row1",false));
+                        } else {
+                            locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
+                                    .eq("loc_sts", "D").eq("loc_type2", locType).like("barcode", bar).orderBy("row1",false));
+                        }
+
+                        if (Cools.isEmpty(locMast)) {
+                            return R.error("搴撳瓨娌℃湁绌烘澘");
+                        }
+                        String locNo = locMast.getLocNo();
+                        EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam();
+                        emptyPlateOutParam.setOutSite(303);
+                        emptyPlateOutParam.setLocNos(new ArrayList<String>() {{
+                            add(locNo);
+                        }});
+                        String agvSta = "";
+                        if (locMast.getLocType3() == 2) {
+                            agvSta = "Z-LZP26";
+                        }else if(locType ==2){
+
+                        } else {
+                            agvSta = orderPakout.getCstmrName();//agv鐩爣绔欑偣浣嶇疆
+                        }
+                        WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam, ioPri, agvSta);
+                        ioPri--;
+
+                    }
+                } else if (i == 4) {
+                    LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", taskDto.getLocNo()));
+                    Integer locType = Integer.valueOf(locMast1.getLocType2());
+                    //閰嶇洏 鍑哄簱鍗曞嚭搴撳尯鍩熸椂Q-L4鏃�,鍑哄ぇ鎵樼洏绌烘澘
+                    if(orderPakout.getCstmrName().equals("Q-L4")){
+                        locType = 2;
+                    }
+
+                    String bar = "";
+                    if (!Cools.isEmpty(orderPakout.getShipCode()) && orderPakout.getShipCode().equals("A01")) {
+                        bar = "A01";
+                    }
+                    LocMast locMast = null;
+                    if (Cools.isEmpty(bar)) {
+                        locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
+                                .eq("loc_sts", "D").eq("loc_type2", locType).orderBy("row1",false));
+                    } else {
+                        locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
+                                .eq("loc_sts", "D").eq("loc_type2", locType).like("barcode", bar).orderBy("row1",false));
+                    }
+
+                    if (Cools.isEmpty(locMast)) {
+                        return R.error("搴撳瓨娌℃湁绌烘澘");
+                    }
+                    String locNo = locMast.getLocNo();
+                    EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam();
+                    emptyPlateOutParam.setOutSite(303);
+                    emptyPlateOutParam.setLocNos(new ArrayList<String>() {{
+                        add(locNo);
+                    }});
+                    String agvSta = "";
+                    if (locMast.getLocType3() == 2) {
+                        agvSta = "Z-LZP26";
+                    }else if(locType ==2){
+
+                    } else {
+                        agvSta = orderPakout.getCstmrName();//agv鐩爣绔欑偣浣嶇疆
+                    }
+                    WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam, ioPri, agvSta);
+                    ioPri--;
+                    j++;
+                }
+            }
+        }
+        return R.ok();
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java
index 28a4102..85db2cb 100644
--- a/src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java
@@ -5,13 +5,16 @@
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.Cools;
 import com.zy.asrs.entity.*;
+import com.zy.asrs.entity.mes.MesReturn;
 import com.zy.asrs.entity.mes.TransArrivalStation;
+import com.zy.asrs.entity.mes.TransInOutStationAllow;
 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 com.zy.asrs.task.core.ReturnT;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -26,10 +29,7 @@
 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.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -51,6 +51,8 @@
     private String inOk;
     @Value("${mes.defaultUserId}")
     public long defaultUserId;
+    @Value("${mes.url}")
+    private String url;
 
 
     @Resource
@@ -232,11 +234,7 @@
         if (!StringUtils.isEmpty(response) && response.contains("code")){
             RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
             if("SUCCESS".equals(rcsReturn.getCode())||"200".equals(rcsReturn.getCode())) {
-                JSONObject data = rcsReturn.getData();
-                String robotTaskCode = data.getString("robotTaskCode");
-                if (robotTaskCode.equals(rcsTaskSubmit.getRobotTaskCode())){
-                    return 1;
-                }
+                return 1;
             }
         }
 
@@ -253,10 +251,11 @@
     public int continueTask(Object rcsTaskContinue, int rcsFactory){
 
         String url = rcsFactory == 2 ? HX_URL+inOk :HIK_URL + "api/robot/controller/task/extend/continue";
+
         String response = sendPost(url, JSONObject.toJSONString(rcsTaskContinue));
         if (!StringUtils.isEmpty(response) && response.contains("code")){
             RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
-            if("200".equals(rcsReturn.getCode())) {
+            if("SUCCESS".equals(rcsReturn.getCode())||"200".equals(rcsReturn.getCode())) {
                 return 1;
             }
         }
@@ -264,6 +263,20 @@
         return 0;
     }
 
+    public int applyIn(JSONObject rcsTaskContinue, int rcsFactory){
+
+        String url = rcsFactory == 2 ? HX_URL+"eqpt/notify/traffic" :HIK_URL + "api/robot/controller/task/extend/continue";
+
+        String response = sendPost(url, JSONObject.toJSONString(rcsTaskContinue));
+        if (!StringUtils.isEmpty(response) && response.contains("code")){
+            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
+            if("SUCCESS".equals(rcsReturn.getCode())||"200".equals(rcsReturn.getCode())) {
+                return 1;
+            }
+        }
+
+        return 0;
+    }
     /**
      * 2.1.4浠诲姟鍙栨秷鎺ュ彛
      *
@@ -324,11 +337,13 @@
     public RcsReturn reporterTask(RcsReporterTask rcsReporterTask) {
 
         RcsReturn rcsReturn = new RcsReturn();
-
-        String robotTaskCode = rcsReporterTask.getRobotTaskCode();
         String singleRobotCode = rcsReporterTask.getSingleRobotCode();
-        String[] split = robotTaskCode.split("-");
-        robotTaskCode = split[0];
+        // 淇敼鍚庣殑閫昏緫锛氭湁"-"鍒欏幓鎺夋渶鍚庝竴涓�"-"鍙婂悗闈㈠唴瀹癸紝娌℃湁鍒欎繚鎸佸師鏍�
+        String robotTaskCode = rcsReporterTask.getRobotTaskCode();
+        if (robotTaskCode.contains("-")) {
+            robotTaskCode = robotTaskCode.substring(0, robotTaskCode.lastIndexOf("-"));
+        }
+
         //鍗庢檽AGV鐘舵�佸弽棣堬紝鍙婄敵璇�
         if(Cools.isEmpty(rcsReporterTask.getExtra())){
             if(Cools.isEmpty(rcsReporterTask.getMethod())){
@@ -365,11 +380,33 @@
                             rcsReturn.setData(data);
                             return rcsReturn;
                         }
-                        // 鏇存柊浠诲姟鐘舵�佺瓑鍐呴儴閫昏緫
-                        task.setWrkSts(304L);   // 301 浠诲姟涓嬪彂銆�302 浠诲姟鎵ц銆�303 浠诲姟涓柇銆�304 浠诲姟缁撴潫
-                        task.setModiTime(new Date());
-                        task.setModiUser(defaultUserId);
-                        taskService.updateById(task);
+                        HashMap<String,Object> map = new HashMap<>();
+                        map.put("taskno", task.getTaskNo());
+                        map.put("agvFactory", "2");
+                        String mesUrl = url+"AGVArrivalCompletedFit";
+                        String response = RcsServiceImpl.sendPost(mesUrl, JSONObject.toJSONString(map));
+                        if (!StringUtils.isEmpty(response) && response.contains("Success")){
+                            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+                            if("1".equals(mesReturn.getSuccess())) {
+                                task.setWrkSts(305L);//浠诲姟鐘舵�佷粠304--銆�305
+                                task.setModiTime(new Date());
+                                taskService.updateById(task);
+                            }else {
+                                rcsReturn.setCode("Err_RobotCodeNotMatch");
+                                rcsReturn.setMessage("");
+                                JSONObject data = new JSONObject();
+                                data.put("robotTaskCode", robotTaskCode);
+                                rcsReturn.setData(data);
+                                return rcsReturn;
+                            }
+                        }else {
+                            rcsReturn.setCode("Err_RobotCodeNotMatch");
+                            rcsReturn.setMessage("");
+                            JSONObject data = new JSONObject();
+                            data.put("robotTaskCode", robotTaskCode);
+                            rcsReturn.setData(data);
+                            return rcsReturn;
+                        }
                     } break;
                     case "APPLY_IN_STATION":
                     case "APPLY_OFF_STATION":
@@ -380,6 +417,7 @@
                         apply.setAgvCode(singleRobotCode);
                         String transType = memo.getString("TransType");
                         apply.setTransType(transType);
+                        apply.setAgvFactory(1);
                         apply.setProductLineId(memo.getString("ProductLineId"));
                         apply.setStationId(task.getSourceStaNo());
                         //agv鍏ョ珯鐢宠
@@ -660,11 +698,13 @@
      * @return
      */
     public RcsReturn hxApplyInLine(TransParent apply) {
-
         RcsReturn rcsReturn = new RcsReturn();
-
         String robotTaskCode = apply.getTaskno();
         String singleRobotCode = apply.getAgvCode();
+        apply.setAgvCode("1");
+        apply.setAgvFactory(2);
+        String fullEmptyEnex = apply.getFullEmptyEnex();
+        int allowInOrOut = 0;
         //鍗庢檽AGV鐢宠
             if(Cools.isEmpty(apply.getMethod())){
                 log.error("鍗庢檽AGV涓婃姤鐘舵�丮ethod涓虹┖锛�");
@@ -704,10 +744,55 @@
             data.put("robotTaskCode", robotTaskCode);
             rcsReturn.setData(data);
             //娴峰悍AGV鐘舵�佸弽棣堬紝鍙婄敵璇�
-
         return rcsReturn;
     }
 
+
+    public RcsReturn hxOutStation(TransParent param) {
+        RcsReturn rcsReturn = new RcsReturn();
+        String robotTaskCode = param.getTaskno();
+        if (Cools.isEmpty(param.getMethod())) {
+            log.error("鍗庢檽AGV涓婃姤鐘舵�丮ethod涓虹┖锛�");
+            rcsReturn.setCode("Err_Internal");
+            rcsReturn.setMessage("鍗庢檽AGV涓婃姤鐘舵�丮ethod涓虹┖");
+            JSONObject data = new JSONObject();
+            data.put("robotTaskCode", robotTaskCode);
+            rcsReturn.setData(data);
+        } else {
+            String method = param.getMethod();
+            param.setStationId(param.getAreaNo());
+            param.setAgvCode("1");
+            if (method.equals("APPLY_OUT_STATION")) {
+                if (mesService.outStation(param) == 1) {
+                    // 杩斿洖RCS
+                    rcsReturn.setCode("SUCCESS");
+                    rcsReturn.setMessage("鍗庢檽AGV涓婃姤鐘舵�佹垚鍔�");
+                    JSONObject data = new JSONObject();
+                    data.put("robotTaskCode", robotTaskCode);
+                    rcsReturn.setData(data);
+                    return rcsReturn;
+                }
+            }else if (method.equals("APPLY_IN_STATION")) {
+                if (mesService.applyInStation(param) == 1) {
+                    // 杩斿洖RCS
+                    rcsReturn.setCode("SUCCESS");
+                    rcsReturn.setMessage("鍗庢檽AGV涓婃姤鐘舵�佹垚鍔�");
+                    JSONObject data = new JSONObject();
+                    data.put("robotTaskCode", robotTaskCode);
+                    rcsReturn.setData(data);
+                    return rcsReturn;
+                }
+            }
+        }
+        log.error("鍗庢檽AGV涓婃姤鐘舵�佸け璐ワ紒");
+        rcsReturn.setCode("Err_Internal");
+        rcsReturn.setMessage("鍗庢檽AGV涓婃姤鐘舵�丮ethod澶辫触");
+        JSONObject data = new JSONObject();
+        data.put("robotTaskCode", robotTaskCode);
+        rcsReturn.setData(data);
+
+        return rcsReturn;
+    }
     // endregion
 
     // region httpUtil
diff --git a/src/main/java/com/zy/asrs/task/AGVTaskReportScheduler.java b/src/main/java/com/zy/asrs/task/AGVTaskReportScheduler.java
index a0cf2b6..dad533b 100644
--- a/src/main/java/com/zy/asrs/task/AGVTaskReportScheduler.java
+++ b/src/main/java/com/zy/asrs/task/AGVTaskReportScheduler.java
@@ -1,14 +1,19 @@
 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.core.exception.CoolException;
-import com.zy.asrs.entity.BasDevp;
-import com.zy.asrs.entity.Task;
-import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.entity.*;
+import com.zy.asrs.entity.mes.MesReturn;
+import com.zy.asrs.mapper.CanFinMapper;
+import com.zy.asrs.service.OrderPakoutService;
 import com.zy.asrs.service.TaskService;
+import com.zy.asrs.service.WrkDetlService;
 import com.zy.asrs.service.WrkMastService;
 import com.zy.asrs.service.impl.BasDevpServiceImpl;
+import com.zy.asrs.service.impl.RcsServiceImpl;
 import com.zy.asrs.task.core.ReturnT;
 import com.zy.asrs.task.handler.AGVTaskReportHandler;
 import org.slf4j.Logger;
@@ -32,9 +37,17 @@
     @Value("${hik.switch}")
     private Boolean switchErpReportOld;
     @Autowired
+    private WrkDetlService wrkDetlService;
+    @Autowired
     private WrkMastService wrkMastService;
     @Autowired
     private BasDevpServiceImpl basDevpService;
+    @Autowired
+    private OrderPakoutService orderPakoutService;
+    @Autowired
+    private CanFinMapper canFinMapper;
+    @Value("${mes.url}")
+    private String MES_URL;
 
     /**
      * 婊℃澘鍜岀┖鏉垮嚭搴撲换鍔★紝鍑哄埌杈撻�佺嚎鍚庡垱寤篈GV鎼繍浠诲姟
@@ -67,13 +80,31 @@
                 // 淇濆瓨宸ヤ綔妗�
                 Task task = new Task();
                 Date date = new Date();
-                String TaskNo = wrkMast.getWrkNo() + "aa" + date.getTime();
+                String TaskNo = wrkMast.getUserNo();
+                String taskType = "AGV";
+                List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
+
+                if (wrkMast.getIoType()==110){
+                    taskType = "ZX-AGV-08-1";
+                }else{
+                    if (wrkDetls != null && !Cools.isEmpty(wrkDetls.get(0).getOrderNo())){
+                        TaskNo = wrkDetls.get(0).getOrderNo();
+//                        OrderPakout orderPakout = orderPakoutService.selectByNo(wrkDetls.get(0).getOrderNo());
+//                        if (orderPakout.getDocType()==11){
+//                            taskType = "PP-AGV";
+//                        }else if (orderPakout.getDocType()==12){
+//                            taskType = "ZP-AGV";
+//                        }
+                        taskType = "ZP-AGV";
+                    }
+                }
+
                 task.setWrkNo(wrkMast.getWrkNo())
                         .setTaskNo(TaskNo)
                         .setIoTime(date)
                         .setWrkSts(301L) // 宸ヤ綔鐘舵�侊細301.浠诲姟涓嬪彂
                         .setIoType(ioType) // 鍏ュ嚭搴撶姸鎬侊細 3.绔欏埌绔�  4.绔欏埌鍖哄煙
-                        .setTaskType("agv")
+                        .setTaskType(taskType)
                         .setIoPri(10D)
                         .setFullPlt("Y") // 婊℃澘锛歒
                         .setPicking("N") // 鎷f枡
@@ -90,6 +121,24 @@
                 if (!taskService.insert(task)) {
                     throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
                 } else {
+                    if (!wrkMast.getBarcode().isEmpty() && !wrkMast.getMemo().isEmpty()) {
+                        JSONObject map = new JSONObject();
+                        map.put("taskNo", TaskNo);
+                        map.put("barCode", wrkMast.getBarcode());
+                        map.put("staNo", wrkMast.getStaNo());
+                        log.info("鏈鍑哄簱鎵樼洏锛歿}, 鐩爣绔檣}", wrkMast.getBarcode(), wrkMast.getMemo());
+                        String url = "ReceiveFinishedPalletCode";
+                        String URL = MES_URL + url;
+                        String response = RcsServiceImpl.sendPost(URL, JSONObject.toJSONString(map));
+                        if (!StringUtils.isEmpty(response) && response.contains("Success")){
+                            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+                            if("1".equals(mesReturn.getSuccess())) {
+                                log.info("涓婃姤瀹屾垚 ==> 鏈鍑哄簱鎵樼洏锛歿}, 鐩爣绔檣}", wrkMast.getBarcode(), wrkMast.getMemo());
+                            }else {
+                                log.error("涓婃姤澶辫触 ==> 鏈鍑哄簱鎵樼洏锛歿}, 鐩爣绔檣}", wrkMast.getBarcode(), wrkMast.getMemo());
+                            }
+                        }
+                    }
                     wrkMast.setWrkSts(31L);//31.AGV鎼繍浠诲姟鍒涘缓鎴愬姛
                     wrkMast.setModiTime(date);
                     wrkMastService.updateById(wrkMast);
@@ -101,7 +150,7 @@
     /**
      * AGV 浠诲姟涓嬪彂鎺ュ彛锛屽畾鏃剁粰AGV涓嬪彂浠诲姟
      */
-    @Scheduled(cron = "0/3 * * * * ? ")
+    @Scheduled(cron = "0/5 * * * * ? ")
     private void execute() {
         if (!switchErpReportOld) {
             return;
@@ -110,6 +159,45 @@
         List<Task> wrkSts = taskService.selectList(new EntityWrapper<Task>().eq("wrk_sts", 301).orderBy("appe_time"));
         if (wrkSts != null && !wrkSts.isEmpty()) {
             for (Task task : wrkSts) {
+
+                if (!task.getTaskType().equals("AGV绌烘枡鏋跺洖缂撳瓨鍖�") && !task.getTaskType().equals("AGV琛ョ┖鏂欐灦")){
+                    if((task.getStaNo().equals("402") || task.getStaNo().equals("401")) && task.getTaskType().equals("")){
+                        //绛涢�夊叏閮ㄨ繕鏈畬鎴愮殑鍑哄簱浠诲姟
+                        List<OrderPakout> orderPakouts = orderPakoutService.selectList(new EntityWrapper<OrderPakout>()
+                                .in("settle", 1, 2)     // 1琛ㄧず杩樻湭寮�濮嬶紝2琛ㄧず姝e湪鎵ц
+                                .eq("doc_type", 12)
+                                .orderBy("order_time", true));
+                        if (!orderPakouts.isEmpty()) {
+                            //鑾峰彇绗竴鏉″叆搴撳崟
+                            OrderPakout orderPakout = orderPakouts.get(0);
+                            // 濡傛灉绗竴鏉¤繕鏈紑濮嬬殑鍑哄簱浠诲姟鏃堕棿鏃╀簬绗竴鏉℃湭瀹屾垚鐨勫叆搴撲换鍔℃椂闂达紝璺宠繃锛屼笉鎵ц
+                            if (orderPakout.getCreateTime().getTime() < task.getWrkDate().getTime()){
+                                continue;
+                            }
+                        }
+                    }
+                }
+
+//                List<CanFin> canFinList = canFinMapper.selectList(new EntityWrapper<CanFin>()
+//                        .orderBy("apply_time", true)
+//                );
+//                if (!canFinList.isEmpty()) {
+//                    CanFin firstCanFin = canFinList.get(0);
+//                    // 妫�鏌� InNo 鏄惁涓虹┖
+//                    if (firstCanFin.getInNo() != null) {
+//                        // 妫�鏌ュ綋鍓嶄换鍔℃槸鍚︿笌杞簭浠诲姟鐩稿叧
+//                        if (task.getStaNo().equals("401") || task.getStaNo().equals("402")){
+//                            List<WrkMast> wrkMasts1 = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+//                                    .in("io_type", 1, 10));
+//                            BasDevp basDevp = basDevpService.checkSiteStatus(Integer.parseInt(task.getStaNo()));
+//                            if (basDevp.getWrkNo() != 0 || !wrkMasts1.isEmpty()){
+//                                continue;
+//                            }
+//
+//                        }
+//                    }
+//                }
+
                 //鏌ヨ鏄惁鏈夋鍦ㄤ綔涓氱殑婧愮珯鍜岀洰鏍囩珯鏈変竴鏍风殑agv鎼繍浠诲姟
                 //濡傛灉鏈夊垯璺宠繃鏈agv鎼繍浠诲姟涓嬪彂
                 Task task1 = taskService.selectOne(new EntityWrapper<Task>()
@@ -124,6 +212,7 @@
                     //濡傛灉鏄帴椹崇珯鐐瑰垯闇�瑕佸垽鏂帴椹崇珯鐐规槸鍚︽湁绌烘枡鏋�
                     //濡傛灉鏈夌┖鏂欐灦闇�瑕佸垽鏂槸鍚︽湁鍑哄簱浠诲姟
                     //鏈夊嚭搴撲换鍔″垯绂佹涓嬪彂鏈鎼繍浠诲姟
+
                     if (task.getStaNo().equals("401") || task.getStaNo().equals("402") || task.getStaNo().equals("307")) {
                         flag = false;
                         BasDevp basDevp = basDevpService.checkSiteStatus(Integer.parseInt(task.getStaNo()));
diff --git a/src/main/java/com/zy/asrs/task/BlockScheduler.java b/src/main/java/com/zy/asrs/task/BlockScheduler.java
index 3c2ca15..d906863 100644
--- a/src/main/java/com/zy/asrs/task/BlockScheduler.java
+++ b/src/main/java/com/zy/asrs/task/BlockScheduler.java
@@ -18,9 +18,9 @@
      * 绠$悊灏侀攣鍖鸿姹�
      *
      */
-    @Scheduled(cron = "0/3 * * * * ? ")
+    //@Scheduled(cron = "0/3 * * * * ? ")
     private void execute(){
-//        rcsService.managerBlock();
+        rcsService.managerBlock();
     }
 
 }
diff --git a/src/main/java/com/zy/asrs/task/ErrorStockScheduler.java b/src/main/java/com/zy/asrs/task/ErrorStockScheduler.java
index 917cfc4..430243f 100644
--- a/src/main/java/com/zy/asrs/task/ErrorStockScheduler.java
+++ b/src/main/java/com/zy/asrs/task/ErrorStockScheduler.java
@@ -1,18 +1,37 @@
 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.BasErrLog;
+import com.zy.asrs.entity.mes.MesReturn;
+import com.zy.asrs.service.BasErrLogService;
+import com.zy.asrs.service.impl.RcsServiceImpl;
 import com.zy.asrs.task.core.ReturnT;
 import com.zy.asrs.task.handler.ErrorStockHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
 
 /**
  * Created by vincent on 2020/7/7
  */
 @Component
 public class ErrorStockScheduler {
+
+    @Value("${mes.url}")
+    public String MES_URL;
+
+    @Autowired
+    private BasErrLogService basErrLogService;
 
     private static final Logger log = LoggerFactory.getLogger(ErrorStockScheduler.class);
 
@@ -27,4 +46,59 @@
         }
     }
 
+
+
+    /**
+     * 姣忔棩鏁呴殰淇℃伅涓婃姤
+     */
+    @Scheduled(cron = "0 0 20 * * ? ")
+    public void faultReport() {
+        // 鑾峰彇浠婂ぉ鐨勫紑濮嬫椂闂�
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        Date todayStart = calendar.getTime();
+
+        // 鑾峰彇浠婂ぉ鐨勭粨鏉熸椂闂�
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+        Date todayEnd = calendar.getTime();
+
+        List<BasErrLog> basErrLogs = basErrLogService.selectList(
+                new EntityWrapper<BasErrLog>()
+                        .between("create_time", todayStart, todayEnd)
+                        .orderBy("create_time", false)
+        );
+
+        int totalCount = basErrLogs.size();
+        long totalTime = 0;
+
+        for (BasErrLog basErrLog : basErrLogs) {
+            if (basErrLog.getStartTime() != null && basErrLog.getEndTime() != null) {
+                totalTime += basErrLog.getEndTime().getTime() - basErrLog.getStartTime().getTime();
+            }
+        }
+
+        JSONObject params = new JSONObject();
+        params.put("totalCount", totalCount);
+        params.put("totalTime", totalTime / 1000);
+
+        String url = "ErrorLogReport";
+        String URL = MES_URL + url;
+        String response = RcsServiceImpl.sendPost(URL, JSONObject.toJSONString(params));
+        if (!StringUtils.isEmpty(response) && response.contains("Success")){
+            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
+            if("1".equals(mesReturn.getSuccess())) {
+                log.info("涓婃姤瀹屾垚 ==> 鏁呴殰娆℃暟锛歿}, 鎬绘椂闀匡細{}", totalCount, totalTime);
+            }else {
+                log.error("涓婃姤澶辫触 ==> 鏁呴殰娆℃暟锛歿}, 鎬绘椂闀匡細{}", totalCount, totalTime);
+            }
+        }
+
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/task/OrderSyncScheduler.java b/src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
index 62af1a2..fa92e7c 100644
--- a/src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
+++ b/src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -4,14 +4,18 @@
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.Cools;
+import com.core.common.R;
+import com.zy.asrs.controller.OutController;
 import com.zy.asrs.entity.*;
 import com.zy.asrs.entity.mes.*;
+import com.zy.asrs.mapper.CanFinMapper;
 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;
 import com.zy.common.entity.Parameter;
+import com.zy.common.model.LocDto;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -20,8 +24,7 @@
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -38,6 +41,8 @@
     private OrderService orderService;
     @Autowired
     private ApiLogService apiLogService;
+    @Autowired
+    private CanFinMapper canFinMapper;
     @Resource
     private OrderPakinService orderPakinService;
     @Resource
@@ -45,6 +50,8 @@
     @Resource
     private MesService mesService;
 
+    @Autowired
+    private TaskService taskService;
     @Resource
     private OrderDetlPakinService orderDetlPakinService;
     @Resource
@@ -55,6 +62,19 @@
 
     @Value("${erp.switch.ErpReportOld}")
     private boolean ErpReportOld;
+
+
+    @Autowired
+    private LocDetlService locDetlService;
+
+    @Autowired
+    private LocMastService locMastService;
+
+    @Autowired
+    private StaDescService staDescService;
+
+    @Autowired
+    private OutController outController;
 
     @Scheduled(cron = "0 0 1 * * ? ")
     public void clearApiLog() {
@@ -284,4 +304,101 @@
 //            }
 //        }
     }
+
+
+    // 瑁呴厤鍗曡嚜鍔ㄥ嚭搴�
+    @Scheduled(cron = "0/1 * * * * ? ")
+//    @Async("orderThreadPool")
+    void AutoOutOrderPinOut() throws InterruptedException {
+        String erpReport = Parameter.get().getErpReport();
+        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
+            List<OrderPakout> orderPakouts = orderPakoutService.selectList(new EntityWrapper<OrderPakout>()
+                    .eq("settle", 1)
+                    .eq("doc_type", 12)
+                    .orderBy("update_time"));
+            if (orderPakouts.isEmpty()) {
+                return;
+            }
+            for (OrderPakout orderPakout : orderPakouts) {
+
+
+
+//                // 鏌ヨcan_fin琛ㄤ腑鐩稿悓鍗曞彿鐨勫唴瀹�
+//                List<CanFin> conntOut = canFinMapper.selectList(
+//                        new EntityWrapper<CanFin>()
+//                                .eq("out_no", orderPakout.getOrderNo())
+//                );
+//                if (!conntOut.isEmpty()) {
+//                    // 妫�鏌ユ槸鍚︽弧瓒崇户缁墽琛岀殑鏉′欢锛歛gv_type涓篴gv-in-out涓攖ask_type涓篶anout
+//                    boolean canContinue = false;
+//                    for (CanFin canFin : conntOut) {
+////                        if ("agv-in-out".equals(canFin.getAgvType()) && "canout".equals(canFin.getTaskStatus())) {
+//                        if ("agv-out".equals(canFin.getAgvType()) && "canout".equals(canFin.getTaskStatus())) {
+//                            log.info("can_fin琛ㄦ湁婊¤冻鏉′欢鐨勮褰曪紝鎵ц鍑哄簱鍗曪細{}", orderPakout.getOrderNo());
+//                            canContinue = true;
+//                            break;
+//                        }
+//                    }
+//                    if (!canContinue) {
+//                        // 涓嶆弧瓒虫潯浠讹紝璺宠繃鍑哄簱鍗�
+//                        continue;
+//                    }
+//                }
+                String sourceNo = orderPakout.getCstmrName();
+                List<Task> tasks = taskService.selectList(new EntityWrapper<Task>()
+                        .eq("source_sta_no", sourceNo)
+                        .in("wrk_sts", 301, 302, 303));
+                if (!tasks.isEmpty() && tasks != null){
+                    continue;
+                }
+
+
+                List<LocDto> locDtos = new ArrayList<>();
+                Boolean boo = false;
+                Set<String> exist = new HashSet<>();
+                List<OrderDetlPakout> orderDetlPakouts = orderDetlPakoutService.selectList(new EntityWrapper<OrderDetlPakout>().eq("order_no", orderPakout.getOrderNo()));
+                for (OrderDetlPakout orderDetl : orderDetlPakouts) {
+                    double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getWorkQty()).orElse(0.0D);
+                    if (issued <= 0.0D) {
+                        continue;
+                    }
+                    List<LocDetl> locDetls = locDetlService.queryStockAll(null, exist, orderDetl.getMatnr(), orderDetl.getBatch(),
+                            orderDetl.getBrand(), orderPakout.getDocType() == 11 ? null : orderDetl.getStandby1(), orderDetl.getStandby2(), orderDetl.getStandby3(), orderDetl.getBoxType1(), orderDetl.getBoxType2(), orderDetl.getBoxType3());
+                    for (LocDetl locDetl : locDetls) {
+                        if (issued > 0) {
+                            LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(),
+                                    issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued);
+                            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo()));
+                            locDto.setFrozen(locDetl.getFrozen());
+                            locDto.setFrozenLoc(locMast.getFrozen());
+                            List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103);
+                            locDto.setStaNos(staNos);
+                            locDto.setBrand(orderDetl.getBrand());
+                            locDto.setStandby1(orderDetl.getStandby1());
+                            locDto.setStandby2(orderDetl.getStandby2());
+                            locDto.setStandby3(orderDetl.getStandby3());
+                            locDto.setBoxType1(orderDetl.getBoxType1());
+                            locDto.setBoxType2(orderDetl.getBoxType2());
+                            locDto.setBoxType3(orderDetl.getBoxType3());
+                            locDtos.add(locDto);
+                            exist.add(locDetl.getLocNo());
+                            // 鍓╀綑寰呭嚭鏁伴噺閫掑噺
+                            issued = issued - locDetl.getAnfme();
+                        } else {
+                            break;
+                        }
+                    }
+                    if (issued > 0) {
+                        boo = true;
+                        continue;
+                    }
+                }
+                if (boo){
+                    continue;
+                }
+                R pakout = orderPakoutService.pakout(locDtos);
+                break;
+            }
+        }
+    }
 }
diff --git a/src/main/java/com/zy/asrs/task/WorkMastScheduler.java b/src/main/java/com/zy/asrs/task/WorkMastScheduler.java
index c574b8c..8b1dbe8 100644
--- a/src/main/java/com/zy/asrs/task/WorkMastScheduler.java
+++ b/src/main/java/com/zy/asrs/task/WorkMastScheduler.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.zy.asrs.entity.Task;
 import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.service.DigitalTwinService;
 import com.zy.asrs.service.MesService;
 import com.zy.asrs.service.TaskService;
 import com.zy.asrs.service.WrkMastService;
@@ -35,6 +36,16 @@
     @Resource
     private MesService mesService;
     // TODO锛歳eporterTask()
+    @Resource
+    private DigitalTwinService digitalTwinService;
+
+    /**
+     * 瀹氭椂缁熻姣忓ぉ鍓╀綑搴撳瓨
+     */
+    @Scheduled(cron = "0 50 23 * * ?")
+    private void locNumCount() {
+        digitalTwinService.locNumCount();
+    }
 
     @Scheduled(cron = "0/3 * * * * ? ")
     private void execute(){
diff --git a/src/main/java/com/zy/asrs/task/handler/AGVTaskReportHandler.java b/src/main/java/com/zy/asrs/task/handler/AGVTaskReportHandler.java
index b9f56da..4628c0f 100644
--- a/src/main/java/com/zy/asrs/task/handler/AGVTaskReportHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/AGVTaskReportHandler.java
@@ -7,6 +7,7 @@
 import com.zy.asrs.service.RcsService;
 import com.zy.asrs.task.AbstractHandler;
 import com.zy.asrs.task.core.ReturnT;
+import com.zy.common.properties.StationProperties;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -20,6 +21,9 @@
 @Service
 @Transactional
 public class AGVTaskReportHandler extends AbstractHandler<String> {
+
+    @Resource
+    private StationProperties stationProperties;
 
     @Resource
     private RcsService rcsService;
@@ -37,20 +41,37 @@
         }else if(task.getIoType()==5){
             SourceStaNoType = "ZONE";
         }
-        String taskType = "PP";
+        String taskType = "NB";
         Boolean flag1 = false;
         Boolean flag2 = false;
-        if(task.getStaNo().equals("401")|| task.getStaNo().equals("402")|| task.getStaNo().equals("307")){
+        if(stationProperties.getStation().contains(task.getStaNo())){
             taskType = "YLIN";
             flag1 = true;
         }
-        if (task.getSourceStaNo().equals("401")|| task.getSourceStaNo().equals("402")|| task.getSourceStaNo().equals("307")){
+        if (stationProperties.getStation().contains(task.getSourceStaNo())){
             taskType = "YLOUT";
             flag2 = true;
         }
         if(flag1&&flag2){
             taskType = "YLBOTH";
         }
+
+        if (task.getSourceStaNo().equals("Z-LVL20")||task.getSourceStaNo().equals("Z-LVL21")||task.getSourceStaNo().equals("Z-LVL22")||
+                task.getSourceStaNo().equals("Z-LVL23")||task.getSourceStaNo().equals("Z-LVL24")||task.getSourceStaNo().equals("Z-LVL25")||
+                task.getSourceStaNo().equals("Z-LVL26")||task.getSourceStaNo().equals("Z-LVL27")||task.getSourceStaNo().equals("Z-LVL28")||
+                task.getSourceStaNo().equals("Z-LVL29")||task.getSourceStaNo().equals("Z-LVL30")||task.getSourceStaNo().equals("Z-LVL31")){
+            taskType = "HKCPIN";
+        }
+        if (task.getStaNo().equals("Z-LVL20")||task.getStaNo().equals("Z-LVL21")||task.getStaNo().equals("Z-LVL22")||
+                task.getStaNo().equals("Z-LVL23")||task.getStaNo().equals("Z-LVL24")||task.getStaNo().equals("Z-LVL25")||
+                task.getStaNo().equals("Z-LVL26")||task.getStaNo().equals("Z-LVL27")||task.getStaNo().equals("Z-LVL28")||
+                task.getStaNo().equals("Z-LVL29")||task.getStaNo().equals("Z-LVL30")||task.getStaNo().equals("Z-LVL31")
+        ){
+            taskType = "HKCPOUT";
+        }
+        if (task.getIsPda() !=null && task.getIsPda().equals("Y")){
+            taskType = "NB";
+        }
         //AGV鍖哄煙涓棤娉曠敤-
         String StaNo = task.getStaNo();
         String SourceStaNo = task.getSourceStaNo();
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 6ce6963..554edd9 100644
--- a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -3,11 +3,13 @@
 import com.alibaba.excel.util.StringUtils;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
 import com.core.common.Cools;
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.*;
 import com.zy.asrs.entity.mes.MesReturn;
 import com.zy.asrs.enums.LocStsType;
+import com.zy.asrs.mapper.CanFinMapper;
 import com.zy.asrs.service.*;
 import com.zy.asrs.service.impl.*;
 import com.zy.asrs.task.AbstractHandler;
@@ -57,6 +59,11 @@
     private TaskDetlService taskDetlService;
     @Autowired
     private BasStationServiceImpl basStationService;
+    @Autowired
+    private CanFinMapper canFinMapper;
+    @Autowired
+    private OrderPakoutService orderPakoutService;
+
     @Value("${mes.url}")
     private String url;
 
@@ -455,11 +462,51 @@
                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                 return FAIL.setMsg("鏇存柊鍏ュ簱瀹屾垚鐘舵�佸け璐�; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
             }
+            
+            // 灏唚aitPakin琛ㄤ腑鐨勬暟鎹爣璁颁负宸插鐞�
+            if (wrkMast.getIoType() == 1) { // 鍏ㄦ澘鍏ュ簱
+                Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>().eq("zpallet", wrkMast.getBarcode());
+                WaitPakin setParam = new WaitPakin();
+                setParam.setStatus("N");
+                setParam.setModiTime(new Date());
+                waitPakinService.update(setParam, wrapper);
+                log.info("鏇存柊搴撳瓨鎴愬姛锛佹墭鐩樼爜锛歿}", wrkMast.getBarcode());
+            }
+
+
+
         } catch (Exception e) {
             log.error("fail", e);
             e.printStackTrace();
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
             return FAIL.setMsg(e.getMessage());
+        }
+
+        try{
+            CanFin canFin = new CanFin();
+            List<CanFin> canFinList = canFinMapper.selectList(
+                    new EntityWrapper<CanFin>()
+                            .orderBy("apply_time", true)
+            );
+            if (canFinList != null){
+                CanFin firstCanFin = canFinList.get(0);
+                if (firstCanFin.getAgvType().equals("agv-in")){
+//                    if (firstCanFin.getAgvType().equals("agv-in-out")){
+                    canFinMapper.deleteById(firstCanFin.getId());
+
+                    if (canFinList.size() > 1){
+                        CanFin firstCanFin1 = canFinList.get(1);
+                        firstCanFin1.setTaskStatus("canout");
+                        log.info("can_fin琛ㄥ凡鏇存柊锛屽叆搴撳崟鐘舵�亄}", firstCanFin1.getOutType());
+                        canFinMapper.updateById(firstCanFin1);
+                    }
+                }
+//                    else if(firstCanFin.getAgvType().equals("agv-in")){
+//                        canFinMapper.deleteById(firstCanFin.getId());
+//                    }
+            }
+        } catch (Exception e) {
+            log.error("鏈鍏ュ簱娌℃湁浠诲姟鍗�");
         }
 
         return SUCCESS;
@@ -598,6 +645,69 @@
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
             return FAIL.setMsg(e.getMessage());
         }
+
+
+        try{
+            List<CanFin> firstCanFinList = canFinMapper.selectList(
+                    new EntityWrapper<CanFin>()
+                            .orderBy("apply_time", true)
+            );
+            CanFin firstCanfin = firstCanFinList.get(0);
+            if (firstCanfin.getOutNo() != null && firstCanfin.getAgvType().equals("agv-out")){
+                log.info("can_fin琛ㄥ凡鏇存柊锛屽嚭搴撳崟{}宸插垹闄�",firstCanfin.getOutNo());
+                canFinMapper.deleteById(firstCanfin.getId());
+            }
+            if (firstCanfin.getOutNo() == null && firstCanfin.getAgvType().equals("agv-out")){
+                log.info("can_fin琛ㄥ凡鏇存柊锛屽嚭搴撲换鍔″凡鍒犻櫎锛屽綋鍓嶅嚭搴撴棤浠诲姟鍗�");
+                canFinMapper.deleteById(firstCanfin.getId());
+            }
+            if (firstCanFinList.size() > 1){
+                CanFin secondCanFin = firstCanFinList.get(1);
+                secondCanFin.setTaskStatus("canout");
+                canFinMapper.updateById(secondCanFin);
+            }
+//                else {
+//                OrderPakout isOut = orderPakoutService.selectOne(
+//                                        new EntityWrapper<OrderPakout>()
+//                                                .eq("settle", 2L)
+//                                                .eq("doc_type", 12L));
+//                String outOrderNo = isOut.getOrderNo();
+//                    List<CanFin> canFinList = canFinMapper.selectList(
+//                            new EntityWrapper<CanFin>()
+//                                    .eq("agv_type", "agv-in-out")
+//                                    .orderBy("apply_time", true)
+//                    );
+//                    if (canFinList != null){
+//                        CanFin firstCanFin = canFinList.get(0);
+//
+//                        OrderPakout isOut = orderPakoutService.selectOne(
+//                                new EntityWrapper<OrderPakout>()
+//                                        .eq("orderNo", firstCanFin.getOutNo()));
+//
+//                        String outOrderNo = isOut.getOrderNo();
+//                        if (outOrderNo.equals(firstCanFin.getOutNo())){
+//                            log.info("can_fin琛ㄥ凡鏇存柊锛岃浆搴忓嚭搴撳崟{}宸插垹闄�", firstCanFin.getOutNo());
+//                            canFinMapper.deleteById(firstCanFin.getId());
+//                        }else {
+//                            log.info("鏈壘鍒拌鍑哄簱鍗曪紝can_fin琛ㄦ湭鏇存柊");
+//                        }
+//                        List<CanFin> canFinList1 = canFinMapper.selectList(
+//                                new EntityWrapper<CanFin>()
+//                                        .eq("agv_type", "agv-in-out")
+//                                        .orderBy("apply_time", true));
+//                        if (!canFinList1.isEmpty()){
+//                            CanFin firstCanFin2 = canFinList.get(0);
+//                            firstCanFin2.setTaskType("Y");
+//                            log.info("can_fin琛ㄥ凡鏇存柊锛岃浆搴忓嚭搴撳崟鍙互杞簭", firstCanFin2.getOutNo());
+//                            canFinMapper.updateById(firstCanFin2);
+//                        }
+//                    }
+//                }
+        } catch (Exception e) {
+            log.error("鏈鍑哄簱娌℃湁浠诲姟鍗�");
+            return null;
+        }
+
         return SUCCESS;
     }
 
@@ -613,13 +723,14 @@
         WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", task.getWrkNo()));
         if (wrkMast != null) {
             if (wrkMast.getIoType()==110&& wrkMast.getWrkSts()>12){
-                wrkMast.setWrkSts(32L);//32.绛夊緟缁勬墭
-            }else if (wrkMast.getIoType()==101){
+                wrkMast.setWrkSts(15L);//32.绛夊緟缁勬墭
+            }else if (wrkMast.getIoType()==101 && wrkMast.getWrkSts()>12){
                 wrkMast.setWrkSts(15L);//15.鍑哄簱鏇存柊瀹屾垚
             }else if (wrkMast.getIoType()==103 && wrkMast.getWrkSts()>12){
                 wrkMast.setWrkSts(20L);//20.绛夊緟鍥炲簱
             }
             wrkMast.setModiTime(new Date());
+            wrkMast.setOveMk("Y");
             wrkMastService.updateById(wrkMast);
             task.setWrkSts(305L);//浠诲姟鐘舵�佷粠304--銆�305
             task.setModiTime(new Date());
@@ -629,6 +740,7 @@
         }else if(task.getTaskType().equals("ZX-AGV")){
             HashMap<String,Object> map = new HashMap<>();
             map.put("taskno", task.getTaskNo());
+            map.put("agvFactory", "2");
             String mesUrl = url+"AGVArrivalCompletedFit";
             String response = RcsServiceImpl.sendPost(mesUrl, JSONObject.toJSONString(map));
             if (!StringUtils.isEmpty(response) && response.contains("Success")){
diff --git a/src/main/java/com/zy/common/config/AdminInterceptor.java b/src/main/java/com/zy/common/config/AdminInterceptor.java
index 795e7a1..ea13bb7 100644
--- a/src/main/java/com/zy/common/config/AdminInterceptor.java
+++ b/src/main/java/com/zy/common/config/AdminInterceptor.java
@@ -123,7 +123,7 @@
 //            String deToken = Cools.deTokn(token, user.getPassword());
 //            long timestamp = Long.parseLong(deToken.substring(0, 13));
             // 15鍒嗛挓鍚庤繃鏈�
-            if (System.currentTimeMillis() - userLogin.getCreateTime().getTime() > 900000){
+            if (System.currentTimeMillis() - userLogin.getCreateTime().getTime() > 3600000){
                 Http.response(response, BaseRes.DENIED);
                 return false;
             }
diff --git a/src/main/java/com/zy/common/config/LogAspect.java b/src/main/java/com/zy/common/config/LogAspect.java
index 533e920..969ef82 100644
--- a/src/main/java/com/zy/common/config/LogAspect.java
+++ b/src/main/java/com/zy/common/config/LogAspect.java
@@ -28,7 +28,7 @@
 @Order(2)
 public class LogAspect {
 
-    private final List<String> logApiList = Stream.of("digitalTwin", "api/mes", "api/robot")
+    private final List<String> logApiList = Stream.of("api/mes", "api/robot")
             .collect(Collectors.toList());
 
     public LogAspect() {
@@ -108,5 +108,4 @@
         }
         return have;
     }
-
 }
diff --git a/src/main/java/com/zy/common/properties/StationProperties.java b/src/main/java/com/zy/common/properties/StationProperties.java
new file mode 100644
index 0000000..5e770b8
--- /dev/null
+++ b/src/main/java/com/zy/common/properties/StationProperties.java
@@ -0,0 +1,16 @@
+package com.zy.common.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "hik")
+public class StationProperties {
+    // 鍙屾繁搴撲綅鎺掑彿
+    private List<String> station = new ArrayList<>();
+}
diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index a5bd580..5044057 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -180,7 +180,7 @@
         if (locMast == null && locTypeDto.getLocType1() ==1) {
             LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
                     .eq("loc_sts", "O")
-                    .eq("loc_type1", locTypeDto.getLocType1() + 1)
+                    .ge("loc_type1", locTypeDto.getLocType1())
                     .eq("loc_type2", locTypeDto.getLocType2())
                     .orderBy("lev1")
                     .orderBy("bay1")
diff --git a/src/main/java/com/zy/common/web/WcsController.java b/src/main/java/com/zy/common/web/WcsController.java
index 0be9371..9ac8e9f 100644
--- a/src/main/java/com/zy/common/web/WcsController.java
+++ b/src/main/java/com/zy/common/web/WcsController.java
@@ -66,6 +66,9 @@
         if (Cools.isEmpty(param.getSourceStaNo())) {
             return R.error("婧愮珯缂栧彿涓嶈兘涓虹┖");
         }
+        if (Cools.isEmpty(param.getSourceStaNo())) {
+            return R.error("鎵樼洏涓嶈兘涓虹┖鎴栬�呮墭鐩樼爜涓嶄负鍏綅");
+        }
         List<WaitPakin> waitPakins = null;
         if (param.getIoType() == 1) {
             if (Cools.isEmpty(param.getBarcode())) {
@@ -90,7 +93,7 @@
         }
 
         //鍏ュ簱鏃跺绌烘澘鍑哄簱浠诲姟杩涜瀹屾垚
-        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("barcode", param.getBarcode()).eq("io_type",110));
+        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("barcode", param.getBarcode()).eq("wrk_sts",110));
         if (!Cools.isEmpty(wrkMast)) {
             wrkMast.setWrkSts(15L);//绌烘澘鍑哄簱浠诲姟杞巻鍙叉。
             wrkMastService.updateById(wrkMast);
@@ -257,7 +260,7 @@
         // 妫�绱㈠簱浣�
         FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
 
-        StartupDto dto = commonService.getLocNo( 10, devpNo, findLocNoAttributeVo, locTypeDto);
+        StartupDto dto =commonService.getLocNoNew(10,devpNo,locTypeDto);
         int workNo = dto.getWorkNo();
         // 鐢熸垚宸ヤ綔妗�
         WrkMast wrkMast = new WrkMast();
diff --git a/src/main/java/com/zy/system/entity/license/LicenseCheckListener.java b/src/main/java/com/zy/system/entity/license/LicenseCheckListener.java
index 99d99cc..a133cbd 100644
--- a/src/main/java/com/zy/system/entity/license/LicenseCheckListener.java
+++ b/src/main/java/com/zy/system/entity/license/LicenseCheckListener.java
@@ -83,30 +83,30 @@
                 param.setPublicKeysStorePath(publicKeysStorePath);
 
                 LicenseVerify licenseVerify = new LicenseVerify();
-                //瀹夎璇佷功
-//                LicenseContent install = licenseVerify.install(param);
+//                瀹夎璇佷功
+                LicenseContent install = licenseVerify.install(param);
 
                 logger.info("++++++++ 璁稿彲璇佸姞杞界粨鏉� ++++++++");
 
                 logger.info("++++++++ 璁稿彲璇佸姞杞芥爣璁帮紝鎼滅储淇敼 ++++++++");
-                licenseTimer.setSystemSupport(true);
-                licenseTimer.setLicenseDays(9999);
-                return true;
+//                licenseTimer.setSystemSupport(true);
+//                licenseTimer.setLicenseDays(9999);
+//                return true;
 
-//                licenseTimer.setSystemSupport(install!=null);
-//
-//                if (install != null) {
-//                    Date start = new Date();
-//                    Date end = install.getNotAfter();
-//                    Long starTime = start.getTime();
-//                    Long endTime = end.getTime();
-//                    Long num = endTime - starTime;//鏃堕棿鎴崇浉宸殑姣鏁�
-//                    int day = (int) (num / 24 / 60 / 60 / 1000);
-//                    licenseTimer.setLicenseDays(day);
-//                }
-//
-//
-//                return install != null;
+                licenseTimer.setSystemSupport(install!=null);
+
+                if (install != null) {
+                    Date start = new Date();
+                    Date end = install.getNotAfter();
+                    Long starTime = start.getTime();
+                    Long endTime = end.getTime();
+                    Long num = endTime - starTime;//鏃堕棿鎴崇浉宸殑姣鏁�
+                    int day = (int) (num / 24 / 60 / 60 / 1000);
+                    licenseTimer.setLicenseDays(day);
+                }
+
+
+                return install != null;
             } catch (Exception e) {
                 return false;
             }
diff --git a/src/main/java/com/zy/system/timer/LoadingConfigTimer.java b/src/main/java/com/zy/system/timer/LoadingConfigTimer.java
index 12e4a0a..1d3cdd8 100644
--- a/src/main/java/com/zy/system/timer/LoadingConfigTimer.java
+++ b/src/main/java/com/zy/system/timer/LoadingConfigTimer.java
@@ -18,7 +18,7 @@
     /**
      * token鏈夋晥鏈熸椂闂�
      */
-    private Integer tokenExpire = 1000 * 30 * 60;
+    private Integer tokenExpire = 1000 * 60 * 60 * 5;
     /**
      * token鏁伴噺闄愬埗
      */
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 35ccdff..7199f67 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -50,7 +50,7 @@
 
 #License鐩稿叧閰嶇疆
 license:
-  subject: jnejc-ljqasrs
+  subject: jnejc-hkwms
   publicAlias: publicCert
   storePass: public_zhongyang_123456789
   licensePath: license.lic
@@ -136,6 +136,8 @@
 mes:
 
   url: http://192.9.100.173:8088/prod-api/basicmodel/WmsFit/Api/
+#  url: http://172.26.160.73:8080/basicmodel/WmsFit/Api/
+#  url: http://172.26.160.5:8080/basicmodel/WmsFit/Api/
   #榛樿鎺ュ彛鎿嶄綔浜哄憳id
   defaultUserId: 30
 
@@ -143,6 +145,7 @@
 hik:
   switch: true
   url: http://172.26.11.98:80/rcs/rtas/
+  station: 402,401,307,Z-LZH19,Z-LZH20,Z-LZH21,Z-LZH22,Z-LZH23,Z-LZH24,Z-LZH25,Z-LZH26,Z-LZH27,Z-LZH28,Z-LZH29,Z-LZH30,Z-LZH31,Z-LZH32,Z-LZH33,Z-LZH34,Z-LZH35,Z-LZH36,Z-LZH37,Z-LZH38,Z-LZH39,L-LZH40,L-LZH41,L-LZH42
 
 #鍗庢檽瀵规帴
 hx:
@@ -155,3 +158,8 @@
 
   #绂荤珯瀹屾垚
 
+#wcs鍦板潃 鏁板瓧瀛敓
+digitalTwins:
+  jgUrl: http://172.26.11.88:8089/jgwms
+  djUrl: http://172.26.11.88:8088/djwms
+  ljqUrl: http://172.26.11.80:8083/ljqwms
diff --git a/src/main/resources/license.lic b/src/main/resources/license.lic
index 22364dc..a6bdd04 100644
--- a/src/main/resources/license.lic
+++ b/src/main/resources/license.lic
Binary files differ
diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml
index 2f71db0..00f98f6 100644
--- a/src/main/resources/logback-spring.xml
+++ b/src/main/resources/logback-spring.xml
@@ -20,7 +20,7 @@
     </appender>
 
     <!-- 鏃ュ織淇濆瓨璺緞 -->
-    <property name="LOG_PATH" value="D:/wmslogs/jg" />
+    <property name="LOG_PATH" value="D:/hkwmslogs/hk" />
 
     <!--info绾у埆-->
     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
diff --git a/src/main/resources/mapper/LocCountMapper.xml b/src/main/resources/mapper/LocCountMapper.xml
index 60bc842..eee2542 100644
--- a/src/main/resources/mapper/LocCountMapper.xml
+++ b/src/main/resources/mapper/LocCountMapper.xml
@@ -22,11 +22,18 @@
     </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})
+        IF EXISTS (SELECT 1 FROM asr_loc_count WHERE date = #{model.date})
+            BEGIN
+                UPDATE asr_loc_count
+                SET loc_num = #{model.locNum},
+                    remain_num = #{model.remainNum}
+                WHERE date = #{model.date}
+            END
         ELSE
-            UPDATE asr_loc_count SET loc_num = #{model.locNum}, remain_num = #{model.remainNum}
+            BEGIN
+                INSERT INTO asr_loc_count(date, area_id, loc_num, remain_num)
+                VALUES (#{model.date}, #{model.areaId}, #{model.locNum}, #{model.remainNum})
+            END
     </insert>
 
     <select id="totalLoc" resultType="com.zy.asrs.entity.LocCount">
diff --git a/src/main/resources/mapper/ViewDigitalTwinMapper.xml b/src/main/resources/mapper/ViewDigitalTwinMapper.xml
index bc08c3f..744bf7d 100644
--- a/src/main/resources/mapper/ViewDigitalTwinMapper.xml
+++ b/src/main/resources/mapper/ViewDigitalTwinMapper.xml
@@ -13,29 +13,29 @@
     <!--鎬昏锛氭�诲簱浣嶃�佸凡鐢ㄥ簱浣嶃�佷粖鏃ュ簱瀛樸�佷粖鏃ュ嚭搴撱�佷粖鏃ュ叆搴�-->
     <select id="overview" resultType="Double">
         SELECT COUNT(*) FROM asr_loc_mast WHERE loc_sts != 'Z'
-            <if test="areaId != null">
-                and area_id = #{areaId}
-            </if>
+<!--            <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>
+<!--        <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>
+<!--        <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>
+<!--        <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>
+<!--        <if test="areaId != null">-->
+<!--            and area_id = #{areaId}-->
+<!--        </if>-->
     </select>
 
     <select id="recentOrder" resultType="com.zy.asrs.entity.digitaltwin.DtOrderVo">
@@ -65,9 +65,9 @@
         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>
+<!--        <if test="areaId != null">-->
+<!--            and area_id = #{areaId}-->
+<!--        </if>-->
         GROUP BY CONVERT(VARCHAR, io_time, 23)
     </select>
 
@@ -75,28 +75,31 @@
         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>
+<!--        <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 *
+        FROM (
+                 SELECT
+                     ROW_NUMBER() OVER(ORDER BY t.inBoundTime DESC) AS rownum,
+                     t.*
+                 FROM (
+                          SELECT
+                              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}
+                      ) t
+             ) a
+        WHERE a.rownum BETWEEN ((#{pageIndex}-1)*#{pageSize}+1) AND (#{pageIndex}*#{pageSize})
     </select>
 
 </mapper>
diff --git a/src/main/webapp/views/pakStore/groupinto.html b/src/main/webapp/views/pakStore/groupinto.html
new file mode 100644
index 0000000..b8eba31
--- /dev/null
+++ b/src/main/webapp/views/pakStore/groupinto.html
@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        html {
+            height: 100%;
+            padding: 10px;
+            background-color: #f1f1f1;
+            box-sizing: border-box;
+        }
+        body {
+            background-color: #fff;
+            border-radius: 5px;
+            box-shadow: 0 0 3px rgba(0,0,0,.3);
+        }
+
+        .function-area {
+            padding: 20px 50px;
+        }
+        .function-btn {
+            font-size: 16px;
+            padding: 1px 2px;
+            width: 100px;
+            height: 50px;
+            border-color: #2b425b;
+            border-radius: 4px;
+            border-width: 2px;
+            background: none;
+            border-style: solid;
+            transition: 0.4s;
+            cursor: pointer;
+            letter-spacing: 1.5px;
+        }
+        .function-btn:hover {
+            background-color: #2b425b;
+            color: #fff;
+        }
+
+        .layui-layer-page .layui-layer-content {
+            position: relative;
+            overflow: visible !important;
+        }
+
+        #mat-query {
+            display: none;
+        }
+
+        #staNoSpan {
+            text-align: center;
+            display: inline-block;
+            width: 100px;
+            font-size: 13px;
+        }
+        .layui-btn-container .layui-form-select {
+            display: inline-block;
+            width: 150px;
+            height: 30px;
+        }
+        .layui-btn-container .layui-form-select.layui-form-selected {
+            display: inline-block;
+            width: 150px;
+        }
+        .layui-btn-container .layui-select-title input {
+            font-size: 13px;
+        }
+        .layui-btn-container .layui-anim.layui-anim-upbit dd {
+            font-size: 13px;
+        }
+
+        #btn-comb {
+            margin-left: 60px;
+            display: none;
+        }
+    </style>
+</head>
+<body>
+<!-- 鍔熻兘鍖� -->
+<div class="function-area">
+    <button id="mat-query" class="function-btn">鎻愬彇鍟嗗搧</button>
+</div>
+
+<hr>
+
+<!-- 琛ㄦ牸 -->
+<div style="padding-bottom: 5px; margin-bottom: 45px">
+
+    <!-- 澶撮儴 -->
+    <script type="text/html" id="toolbar">
+        <div class="layui-form">
+            <div class="layui-btn-container">
+                <!-- 1.閫夋嫨鍏ュ簱鍙� -->
+                <span id="staNoSpan">鍏ュ簱鍙o細</span>
+                <select id="putSiteSelect" lay-verify="required">
+                    <option value="">璇烽�夋嫨绔欑偣</option>
+                </select>
+                <!-- 2.鍚姩鍏ュ簱 -->
+                <button class="layui-btn layui-btn-normal layui-btn-lg" id="btn-comb" lay-event="comb" style="">鍚姩鍏ュ簱</button>
+                
+            </div>
+        </div>
+    </script>
+
+    <!-- 琛� -->
+    <script type="text/html" id="operate">
+        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove">绉婚櫎</a>
+    </script>
+
+    <table class="layui-table" id="chooseData" lay-filter="chooseData"></table>
+</div>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<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/handlebars/handlebars-v4.5.3.js"></script>
+<script type="text/javascript" src="../../static/js/pakStore/pakStore.js" charset="utf-8"></script>
+
+<script type="text/template" id="putSiteSelectTemplate">
+    {{#each data}}
+        <option value="{{this}}">{{this}}</option>
+    {{/each}}
+</script>
+</body>
+</html>
+

--
Gitblit v1.9.1