Browse Source

-- 天目系统接口开发
-- PLC对接业务开发

star 1 year ago
parent
commit
6dabc28605
24 changed files with 375 additions and 365 deletions
  1. 10 0
      README.md
  2. 1 1
      ruoyi-admin/src/main/java/com/ruoyi/init/StartService.java
  3. 38 5
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/tm/TsPostApiController.java
  4. 15 36
      ruoyi-admin/src/main/resources/application-prod.yml
  5. 1 1
      ruoyi-admin/src/main/resources/application.yml
  6. 0 5
      ruoyi-admin/src/test/java/com/ruoyi/admin/test/base/WarehouseTest.java
  7. 9 63
      ruoyi-dongfangyaiye/src/main/java/com/ruoyi/taiye/job/AMSJob.java
  8. 4 8
      ruoyi-dongfangyaiye/src/main/java/com/ruoyi/taiye/service/ProcessService.java
  9. 11 11
      ruoyi-dongfangyaiye/src/main/java/com/ruoyi/taiye/service/impl/ProcessServiceImpl.java
  10. 2 16
      ruoyi-system/src/main/java/com/ruoyi/system/enums/PLCConnectNameEnum.java
  11. 16 79
      ruoyi-system/src/main/java/com/ruoyi/system/enums/PLCEnum.java
  12. 1 1
      ruoyi-system/src/main/java/com/ruoyi/system/init/PlcConnectServiceRunner.java
  13. 2 2
      ruoyi-ui/src/views/ams/task/index.vue
  14. 1 1
      warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/thread/AutoTaskThread.java
  15. 102 37
      warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java
  16. 5 0
      warewms-ams/src/main/java/com/ruoyi/ams/business/IBusinessService.java
  17. 1 26
      warewms-ams/src/main/java/com/ruoyi/ams/task/service/impl/WcsTaskServiceImpl.java
  18. 8 6
      warewms-ams/src/main/java/com/ruoyi/ams/tm/common/TsDataConfiguration.java
  19. 1 1
      warewms-ams/src/main/java/com/ruoyi/ams/tm/entity/OrderSequence.java
  20. 6 1
      warewms-ams/src/main/java/com/ruoyi/ams/tm/service/ITsTaskService.java
  21. 133 41
      warewms-ams/src/main/java/com/ruoyi/ams/tm/service/impl/TsTaskServiceImpl.java
  22. 1 1
      warewms-ams/src/main/resources/mapper/ams/WcsTaskMapper.xml
  23. 4 20
      warewms-base/src/main/java/com/ruoyi/base/constant/Constant.java
  24. 3 3
      warewms-base/src/main/java/com/ruoyi/base/domain/BaseLocationInfo.java

+ 10 - 0
README.md

@@ -1 +1,11 @@
 # AMS产品
+# IP 192.168.2.1
+# V600.0-添加托盘,读到true生成任务,执行V600.3
+# V600.1-读到true,允许添加托盘,AGV开始卸货
+# V600.2-AGV添加托盘完成,码垛机可再次检测V600.0和V600.3是否写成false
+# V600.3-生成任务后,AGV将其写成true,码垛机读到true后将V600.0和C600.3写成false
+  
+# V601.0-把跺移。读到true生成任务,执行V601.3
+# V601.1-读到true,允许取货,AGV开始取货
+# V601.2-是AGV取货完成,码垛机可再次检测V601.0和V601.3是否写成false
+# V601.3-生成任务后,AGV将其写成true,码垛机读到true后将V601.0和C601.3写成false

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/init/StartService.java

@@ -40,7 +40,7 @@ public class StartService implements CommandLineRunner {
     @Override
     public void run(String... args) throws Exception {
         //自动下发任务
-/*        if (initTaskConfig.getAutoSend()) {
+        /*if (initTaskConfig.getAutoSend()) {
             Thread thread = new Thread(new AutoTaskThread(businessService));
             thread.start();
         }*/

+ 38 - 5
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/tm/TsPostApiController.java

@@ -9,11 +9,13 @@ import com.ruoyi.ams.tm.entity.TsTaskStateResponse;
 import com.ruoyi.ams.tm.service.ITsTaskService;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.core.page.TableSupport;
+import com.ruoyi.taiye.service.ProcessService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -24,6 +26,8 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/api/tstaskapi")
 public class TsPostApiController {
 
+    @Autowired
+    private ProcessService processService;
     @Autowired
     private ITsTaskService iTsTaskService;
     @Autowired
@@ -35,9 +39,8 @@ public class TsPostApiController {
      */
     @ApiOperation("TS-天目取卸货申请")
     @PostMapping("/applyUpAndUnload")
-    public TsTaskStateResponse applyUpAndUnload(TsRequest tsRequest) {
+    public TsTaskStateResponse applyUpAndUnload(@RequestBody TsRequest tsRequest) {
 
-        log.info("-----------TS-天目取卸货申请:" + JSON.toJSONString(tsRequest));
         return iTsTaskService.confirmAnalysis(tsRequest.getTsOrder(),tsRequest.getReqType(),tsRequest.getAgvNo());
     }
 
@@ -46,9 +49,8 @@ public class TsPostApiController {
      */
     @ApiOperation("TS-天目任务状态反馈")
     @PostMapping("/responseTaskState")
-    public TsTaskStateResponse responseTaskState(TsRequest tsRequest) {
+    public TsTaskStateResponse responseTaskState(@RequestBody TsRequest tsRequest) {
 
-        log.info("-----------TS-天目任务状态反馈:" + JSON.toJSONString(tsRequest));
         return iTsTaskService.tsTaskStateBack(tsRequest.getTsOrder(),tsRequest.getReqState(),tsRequest.getAgvNo());
     }
 
@@ -62,7 +64,7 @@ public class TsPostApiController {
         if(wcsTask == null){
             return new TsDataResponse();
         }
-        log.info("-----------TS-创建一个TS订单:" + JSON.toJSONString(wcsTask));
+
         return iTsTaskService.sendTaskOrder(wcsTask);
     }
 
@@ -129,4 +131,35 @@ public class TsPostApiController {
         log.info("-----------TS-创建充电任务:车号{},充电点位{}" ,agvNo,loc);
         return iTsTaskService.sendChargeJob(agvNo,loc);
     }
+
+    /**
+     * TS-删除充电任务
+     */
+    @ApiOperation("TS-删除充电任务")
+    @PostMapping("/delChargeOrder")
+    public TsDataResponse delChargeOrder(String agvTaskNo) {
+
+        log.info("-----------TS-删除充电任务:充电任务号{}" ,agvTaskNo);
+        return iTsTaskService.delChargeJob(agvTaskNo);
+    }
+
+    /**
+     * PLC-下料
+     */
+    @ApiOperation("PLC-下料")
+    @PostMapping("/plcXiaLiao")
+    public TsDataResponse plcXiaLiao() {
+        processService.createPackingMachineUnloadingTask("PM_XL","100000");
+        return new TsDataResponse();
+    }
+
+    /**
+     * PLC-上空
+     */
+    @ApiOperation("PLC-上空")
+    @PostMapping("/plcShangKong")
+    public TsDataResponse plcShangKong() {
+        processService.createPackingMachineUpEmptyPallets("PM_SK","100001");
+        return new TsDataResponse();
+    }
 }

+ 15 - 36
ruoyi-admin/src/main/resources/application-prod.yml

@@ -6,8 +6,8 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://localhost:3306/warewms-hualan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
-                username: warewms
+                url: jdbc:mysql://localhost:3306/warewms-sishuilifeng?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
+                username: root
                 password: warewms123
             # 从库数据源
             slave:
@@ -71,44 +71,44 @@ init-task:
 modbus:
     tcp-master:
         first: # 自动门(靠马路)
-            open: true
+            open: false
             host: 192.168.42.201
             port: 9000
         second: # 自动门(靠里面)
-            open: true
+            open: false
             host: 192.168.42.202
             port: 9000
         sixth: # 自动门(靠马路-第二层)
-            open: true
+            open: false
             host: 192.168.42.210
             port: 9000
         seventh: # 卷帘门
-            open: true
+            open: false
             host: 192.168.42.211
             port: 9000
         third: # 按钮盒
-            open: true
+            open: false
             host: 192.168.42.205
             port: 9000
         fourth: # 充电机(三向车)
-            open: true
+            open: false
             host: 192.168.42.208
             port: 8899
         fifth: # 充电机(迷你堆垛)
-            open: true
+            open: false
             host: 192.168.42.209
             port: 8899
 
 
 rfid:
     first: # 靠马路
-        open: true
+        open: false
         host: 192.168.42.203
         port: 5084
         number-of-tags: 3 # 一次读取标签的数量
         timeout-milliseconds: 5000
     second: # 靠里面
-        open: true
+        open: false
         host: 192.168.42.204
         port: 5084
         number-of-tags: 3 # 一次读取标签的数量
@@ -117,30 +117,9 @@ rfid:
     # plc连接配置
 plc:
     plcList[0]:
-        ip: 192.68.100.101
+        ip: 192.168.2.1
         enable: false
-        name: packingMachine_1Plc
-        ePlcType: S1200
-        heartbeat: DB5000.2
-        confirmTheStatus:
-    plcList[1]:
-        ip: 192.68.100.102
-        enable: false
-        name: packingMachine_2Plc
-        ePlcType: S1200
-        heartbeat: DB5000.2
-        confirmTheStatus:
-    plcList[2]:
-        ip: 192.68.100.103
-        enable: false
-        name: packingMachine_3Plc
-        ePlcType: S1200
-        heartbeat: DB5000.2
-        confirmTheStatus:
-    plcList[3]:
-        ip: 192.68.100.104
-        enable: false
-        name: stackingMachinePlc
-        ePlcType: S1200
-        heartbeat: DB5000.2
+        name: packingMachine_Plc
+        ePlcType: S200_SMART
+        heartbeat:
         confirmTheStatus:

+ 1 - 1
ruoyi-admin/src/main/resources/application.yml

@@ -37,7 +37,7 @@ spring:
     # 国际化资源文件路径
     basename: i18n/messages
   profiles:
-    active: dev
+    active: prod
   # 文件上传
   servlet:
     multipart:

+ 0 - 5
ruoyi-admin/src/test/java/com/ruoyi/admin/test/base/WarehouseTest.java

@@ -304,11 +304,6 @@ public class WarehouseTest {
 
     @Autowired
     IDeviceLogService deviceLogService;
-    @Test
-    public void testAmsTask() {
-        deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_2.getMetaName(),"获取到下料信号:"+true,"1"));
-
-    }
 
     @Test
     public void testAms() {

+ 9 - 63
ruoyi-dongfangyaiye/src/main/java/com/ruoyi/taiye/job/AMSJob.java

@@ -27,85 +27,31 @@ public class AMSJob {
     }
 
     /**
-     * 一号包装机下料任务
+     * 下料
      */
-    public void onePackingMachineUnloading() {
-        boolean b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_1.getMetadata());
+    public void onePackingMachineUnloadingTask() {
+        boolean b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata())
+                .readBoolean(PLCEnum.PACKING_BLANK_0.getMetadata());
         deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_1.getMetaName(),"获取到下料信号:"+b,"1"));
         if (b) {
-            boolean b1 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).readBoolean(PLCEnum.STACKING_MACHINE_FEEDING.getMetadata());
-            deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.STACKING_MACHINE.getMetadata(),PLCConnectNameEnum.STACKING_MACHINE.getMetaName(),"获取到上料信号:"+b1,"1"));
-            if (b1) {
-                processService.createPackingMachineUnloadingTask("PM_L_1", 100000);
-            }
-        }
-    }
-
-    /**
-     * 二号包装机下料任务
-     */
-    public void twoPackingMachineUnloading() {
-        boolean b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_2.getMetadata());
-        deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_2.getMetaName(),"获取到下料信号:"+b,"1"));
-        if (b) {
-            boolean b1 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).readBoolean(PLCEnum.STACKING_MACHINE_FEEDING.getMetadata());
-            deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.STACKING_MACHINE.getMetadata(),PLCConnectNameEnum.STACKING_MACHINE.getMetaName(),"获取到上料信号:"+b1,"1"));
-            if (b1) {
-                processService.createPackingMachineUnloadingTask("PM_L_3", 001);
-            }
-        }
-    }
-
-    /**
-     * 三号包装机下料任务
-     */
-    public void threePackingMachineUnloading() {
-        boolean b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_3.getMetadata());
-        deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_3.getMetaName(),"获取到下料信号:"+b,"1"));
-        if (b) {
-            boolean b1 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).readBoolean(PLCEnum.STACKING_MACHINE_FEEDING.getMetadata());
-            deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.STACKING_MACHINE.getMetadata(),PLCConnectNameEnum.STACKING_MACHINE.getMetaName(),"获取到上料信号:"+b1,"1"));
-            if (b1) {
-                processService.createPackingMachineUnloadingTask("PM_L_3", 001);
-            }
+            processService.createPackingMachineUnloadingTask("PM_XL","100000");
         }
 
     }
 
     /**
-     * 一号包装机上空
+     * 上空
      */
     public void onePackingMachineUpEmptyPallets() {
-        boolean b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_PALLETS_1.getMetadata());
+        boolean b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata())
+                .readBoolean(PLCEnum.PACKING_CALL_EMPTY_0.getMetadata());
         deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_1.getMetaName(),"获取到上空信号:"+b,"1"));
         if (b) {
-            processService.createPackingMachineUpEmptyPallets("PM_UP_1",001);
+            processService.createPackingMachineUpEmptyPallets("PM_SK","100001");
         }
 
     }
 
-    /**
-     * 二号包装机上空
-     */
-    public void twoPackingMachineUpEmptyPallets() {
-        boolean b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_PALLETS_2.getMetadata());
-        deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_2.getMetaName(),"获取到上空信号:"+b,"1"));
-        if (b) {
-            processService.createPackingMachineUpEmptyPallets("PM_UP_2",001);
-        }
-    }
-
-    /**
-     * 三号包装机上空
-     */
-    public void threePackingMachineUpEmptyPallets() {
-        boolean b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_PALLETS_3.getMetadata());
-        deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_3.getMetaName(),"获取到上空信号:"+b,"1"));
-        if (b) {
-            processService.createPackingMachineUpEmptyPallets("PM_UP_3",001);
-        }
-    }
-
     /**
      * 清空PLC信号日志
      */

+ 4 - 8
ruoyi-dongfangyaiye/src/main/java/com/ruoyi/taiye/service/ProcessService.java

@@ -2,16 +2,12 @@ package com.ruoyi.taiye.service;
 
 public interface ProcessService {
     /**
-     * 创建包装机下料及打包机下料任务
-     * @param taskType
-     * @param from
+     * 下料
      */
-    void createPackingMachineUnloadingTask(String taskType, Integer from);
+    void createPackingMachineUnloadingTask(String taskType, String loc);
 
     /**
-     * 创建包装机上空托任务
-     * @param taskType 上空任务类型
-     * @param to 上空库位ID
+     * 上空
      */
-    void createPackingMachineUpEmptyPallets(String taskType, Integer to);
+    void createPackingMachineUpEmptyPallets(String taskType, String loc);
 }

+ 11 - 11
ruoyi-dongfangyaiye/src/main/java/com/ruoyi/taiye/service/impl/ProcessServiceImpl.java

@@ -33,26 +33,27 @@ public class ProcessServiceImpl implements ProcessService {
     private IBaseLocationInfoService iBaseLocationInfoService;
 
     @Override
-    public void createPackingMachineUnloadingTask(String taskType, Integer from) {
+    public void createPackingMachineUnloadingTask(String taskType, String loc) {
         WcsTask wcsTask = new WcsTask();
-        wcsTask.setLocationTo(SMID);
+        wcsTask.setLocationFrom(loc);
         List<WcsTask> tasking = wcsTaskMapper.getTasking(wcsTask);
         if (!tasking.isEmpty()){
             return;
         }
-//        BaseLocationInfo fromLocation = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(SMID, Constant.WAREHOUSE_ID);
-//        fromLocation.setIsEmpty("N");
-//        iBaseLocationInfoService.updateBaseLocationInfo(fromLocation);
+
+        List<AgvCallItemDTO> agvCallItemDTOList = new ArrayList<>();
+        AgvCallItemDTO agvCallItemDTO = new AgvCallItemDTO();
+        agvCallItemDTOList.add(agvCallItemDTO);
         AgvCallDTO agvCallDTO = new AgvCallDTO();
-        agvCallDTO.setLocationFrom(from+"");
-        agvCallDTO.setLocationTo(SMID);
+        agvCallDTO.setLocationFrom(loc);
+        agvCallDTO.setAgvCallItemDTOList(agvCallItemDTOList);
         iBusinessService.agvCall(Constant.FLOW_CONFIG_ID.valueOf(taskType).getValue(),agvCallDTO);
     }
 
     @Override
-    public void createPackingMachineUpEmptyPallets(String taskType, Integer to) {
+    public void createPackingMachineUpEmptyPallets(String taskType, String loc) {
         WcsTask wcsTask = new WcsTask();
-        wcsTask.setLocationTo(to+"");
+        wcsTask.setLocationTo(loc);
         List<WcsTask> tasking = wcsTaskMapper.getTasking(wcsTask);
         if (!tasking.isEmpty()){
             return;
@@ -60,10 +61,9 @@ public class ProcessServiceImpl implements ProcessService {
         List<AgvCallItemDTO> agvCallItemDTOList = new ArrayList<>();
         AgvCallItemDTO agvCallItemDTO = new AgvCallItemDTO();
         agvCallItemDTO.setSku("EMPTY_TRAY"); // 空托
-        agvCallItemDTO.setQty(1.0);
         agvCallItemDTOList.add(agvCallItemDTO);
         AgvCallDTO agvCallDTO = new AgvCallDTO();
-        agvCallDTO.setLocationTo(to+"");
+        agvCallDTO.setLocationTo(loc);
         agvCallDTO.setAgvCallItemDTOList(agvCallItemDTOList);
         iBusinessService.agvCall(Constant.FLOW_CONFIG_ID.valueOf(taskType).getValue(),agvCallDTO);
     }

+ 2 - 16
ruoyi-system/src/main/java/com/ruoyi/system/enums/PLCConnectNameEnum.java

@@ -3,24 +3,10 @@ package com.ruoyi.system.enums;
 public enum PLCConnectNameEnum {
 
     /**
-     * 一号包装机PLC
+     * PLC
      */
-    PACKING_MACHINE_1("packingMachine_1Plc","一号包装机PLC"),
+    PACKING_MACHINE_1("packingMachine_Plc","PLC");
 
-    /**
-     * 二号包装机PLC
-     */
-    PACKING_MACHINE_2("packingMachine_2Plc","二号包装机PLC"),
-
-    /**
-     * 三号包装机PLC
-     */
-    PACKING_MACHINE_3("packingMachine_3Plc","三号包装机PLC"),
-
-    /**
-     * 叠包机PCL
-     */
-    STACKING_MACHINE("stackingMachinePlc","叠包机PCL");
 
     private String metadata;
 

+ 16 - 79
ruoyi-system/src/main/java/com/ruoyi/system/enums/PLCEnum.java

@@ -3,109 +3,46 @@ package com.ruoyi.system.enums;
 public enum PLCEnum {
 
     /**
-     * 一号包装机下料信号
+     * V600.0-添加托盘,读到true生成任务,执行V600.3
      */
-    PACKING_MACHINE_UNLOADING_1("DB5001.1.0"),
+    PACKING_CALL_EMPTY_0("VB600.0"),
 
     /**
-     * 二号包装机下料信号
+     * V600.1-读到true,允许添加托盘,AGV开始卸货
      */
-    PACKING_MACHINE_UNLOADING_2("DB5001.1.0"),
+    PACKING_CALL_EMPTY_1("VB600.1"),
 
     /**
-     * 三号包装机下料信号
+     * V600.2-AGV添加托盘完成,AGV将其写成true,码垛机可再次检测V600.0和V600.3是否写成false
      */
-    PACKING_MACHINE_UNLOADING_3("DB5001.1.0"),
+    PACKING_CALL_EMPTY_2("VB600.2"),
 
     /**
-     * 一号包装机上空信号
+     *  V600.3-生成任务后,AGV将其写成true,码垛机读到true后将V600.0和C600.3写成false
      */
-    PACKING_MACHINE_UP_EMPTY_PALLETS_1("DB5001.0.0"),
+    PACKING_CALL_EMPTY_3("VB600.3"),
 
     /**
-     * 二号包装机上空信号
+     * V601.0-把跺移。读到true生成任务,执行V601.3
      */
-    PACKING_MACHINE_UP_EMPTY_PALLETS_2("DB5001.0.0"),
+    PACKING_BLANK_0("VB601.0"),
 
     /**
-     * 三号包装机上空信号
+     * V601.1-读到true,允许取货,AGV开始取货
      */
-    PACKING_MACHINE_UP_EMPTY_PALLETS_3("DB5001.0.0"),
+    PACKING_BLANK_1("VB601.1"),
 
     /**
-     * 一号包装机下料允许进入信号
+     * V601.2-是AGV取货完成,AGV将其写成true,码垛机可再次检测V601.0和V601.3是否写成false
      */
-    PACKING_MACHINE_UNLOADING_ENTER_1("DB5001.1.1"),
+    PACKING_BLANK_2("VB601.2"),
 
     /**
-     * 二号包装机下料允许进入信号
+     * V601.3-生成任务后,AGV将其写成true,码垛机读到true后将V601.0和C601.3写成false
      */
-    PACKING_MACHINE_UNLOADING_ENTER_2("DB5001.1.1"),
+    PACKING_BLANK_3("VB601.3");
 
-    /**
-     * 三号包装机下料允许进入信号
-     */
-    PACKING_MACHINE_UNLOADING_ENTER_3("DB5001.1.1"),
-
-    /**
-     * 一号包装机上空允许进入信号
-     */
-    PACKING_MACHINE_UP_EMPTY_ENTER_1("DB5001.0.1"),
 
-    /**
-     * 二号包装机上空允许进入信号
-     */
-    PACKING_MACHINE_UP_EMPTY_ENTER_2("DB5001.0.1"),
-
-    /**
-     * 三号包装机上空允许进入信号
-     */
-    PACKING_MACHINE_UP_EMPTY_ENTER_3("DB5001.0.1"),
-
-    /**
-     * 一号包装机下料完成信号
-     */
-    PACKING_MACHINE_UNLOADING_Leave_1("DB5000.1.0"),
-
-    /**
-     * 二号包装机下料完成信号
-     */
-    PACKING_MACHINE_UNLOADING_Leave_2("DB5000.1.0"),
-
-    /**
-     * 三号包装机下料完成信号
-     */
-    PACKING_MACHINE_UNLOADING_Leave_3("DB5000.1.0"),
-
-    /**
-     * 一号包装机上空完成信号
-     */
-    PACKING_MACHINE_UP_EMPTY_Leave_1("DB5000.0.1"),
-
-    /**
-     * 二号包装机上空完成信号
-     */
-    PACKING_MACHINE_UP_EMPTY_Leave_2("DB5000.0.1"),
-
-    /**
-     * 三号包装机上空完成信号
-     */
-    PACKING_MACHINE_UP_EMPTY_Leave_3("DB5000.0.1"),
-
-    /**
-     * 叠包机上料信号
-     */
-    STACKING_MACHINE_FEEDING("DB5001.0.0"),
-
-    /**
-     * 叠包机允许进入
-     */
-    STACKING_MACHINE_FEEDING_ENTER("DB5001.0.1"),
-
-    /**
-     * 叠包机上料完成信号
-     */
-    STACKING_MACHINE_FEEDING_FINISH("DB5000.0.0");
 
     private String metadata;
 

+ 1 - 1
ruoyi-system/src/main/java/com/ruoyi/system/init/PlcConnectServiceRunner.java

@@ -136,7 +136,7 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
      */
     public S7PLC getPlcServer(String pclName) {
         S7PLC s7PLC = plcToolsMap.get(pclName);
-        if(ObjectUtil.isNull(s7PLC)){
+        if(ObjectUtil.isNull(s7PLC) || reTryPlc.contains(pclName) ){
             throw new ServiceException("The device is not connected");
         }
         return plcToolsMap.get(pclName);

+ 2 - 2
ruoyi-ui/src/views/ams/task/index.vue

@@ -216,8 +216,8 @@
           <div v-if="scope.row.state === 10">已下发</div>
           <div v-if="scope.row.state === 11">取消并归于起点</div>
           <div v-if="scope.row.state === 12">取消并归于终点</div>
-          <div v-if="scope.row.state === 13">取货待确认</div>
-          <div v-if="scope.row.state === 14">卸货待确认</div>
+          <div v-if="scope.row.state === 13">取货申请中</div>
+          <div v-if="scope.row.state === 14">卸货申请中</div>
         </template>
       </el-table-column>
       <el-table-column label="备注" align="center" prop="remark" />

+ 1 - 1
warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/thread/AutoTaskThread.java

@@ -18,7 +18,7 @@ public class AutoTaskThread implements Runnable {
         while (true) {
             try {
                 Thread.sleep(5000L);
-                businessService.autoSend();
+                businessService.autoSendTmTask();
             } catch (Exception e) {
                 e.printStackTrace();
             }

+ 102 - 37
warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java

@@ -19,6 +19,8 @@ import com.ruoyi.ams.task.domain.WcsTask;
 import com.ruoyi.ams.task.dto.WcsTaskLocationDTO;
 import com.ruoyi.ams.task.mapper.WcsTaskMapper;
 import com.ruoyi.ams.task.service.IWcsTaskService;
+import com.ruoyi.ams.tm.entity.TsDataResponse;
+import com.ruoyi.ams.tm.service.ITsTaskService;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.domain.BaseLocationInfo;
 import com.ruoyi.base.domain.BaseLocationZone;
@@ -34,6 +36,9 @@ import com.ruoyi.common.core.redis.RedisKey;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.uuid.SnowflakeIdWorker;
+import com.ruoyi.system.enums.PLCConnectNameEnum;
+import com.ruoyi.system.enums.PLCEnum;
+import com.ruoyi.system.init.PlcConnectServiceRunner;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -48,35 +53,40 @@ import java.util.stream.Collectors;
 public class BusinessServiceImpl implements IBusinessService {
 
     @Autowired
-    private IBusinessService businessService;
+    private RedisCache redisCache;
     @Autowired
-    private IBaseLocationInfoService baseLocationInfoService;
+    private WcsTaskMapper wcsTaskMapper;
     @Autowired
-    private LocationAllocationStrategy locationAllocationStrategy;
+    private ITsTaskService iTsTaskService;
     @Autowired
-    private InvLotLocIdMapper invLotLocIdMapper;
+    private IBaseSkuService baseSkuService;
     @Autowired
-    private IInvLotLocIdService invLotLocIdService;
+    private IWcsTaskService wcsTaskService;
     @Autowired
-    private IInvLotAttService iInvLotAttService;
+    private IAmsTaskService amsTaskService;
     @Autowired
-    private WcsTaskMapper wcsTaskMapper;
+    private IBusinessService businessService;
     @Autowired
-    private AsnSoStrategyMapper asnSoStrategyMapper;
+    private InvLotLocIdMapper invLotLocIdMapper;
     @Autowired
-    private BaseLocationInfoMapper baseLocationInfoMapper;
+    private IInvLotAttService iInvLotAttService;
     @Autowired
-    private IBaseSkuService baseSkuService;
+    private IWmsBoxInfoService wmsBoxInfoService;
     @Autowired
-    private RedisCache redisCache;
+    private IInvLotLocIdService invLotLocIdService;
     @Autowired
-    private IWmsBoxInfoService wmsBoxInfoService;
+    private AsnSoStrategyMapper asnSoStrategyMapper;
     @Autowired
-    private IWcsTaskService wcsTaskService;
+    private BaseLocationInfoMapper baseLocationInfoMapper;
     @Autowired
-    private IAmsTaskService amsTaskService;
+    private PlcConnectServiceRunner plcConnectServiceRunner;
     @Autowired
     private IFlowConfigHeaderService flowConfigHeaderService;
+    @Autowired
+    private IBaseLocationInfoService baseLocationInfoService;
+    @Autowired
+    private LocationAllocationStrategy locationAllocationStrategy;
+
 
     public static int geniKey(String taskNo) {
         int res = CRC16Util.calcCrc16(ByteUtil.string2byteArray(taskNo));
@@ -94,8 +104,8 @@ public class BusinessServiceImpl implements IBusinessService {
         //查询所属流程
         FlowConfigHeaderVO flowConfigHeaderVO = flowConfigHeaderService.selectFlowConfigHeaderById(flowId);
 
-        List<AgvCallDTO> agvCallDTOList = new ArrayList<>();
         agvCallDTO.setWarehouseId(Constant.WAREHOUSE_ID);
+        List<AgvCallDTO> agvCallDTOList = new ArrayList<>();
         agvCallDTOList.add(agvCallDTO);
         return businessService.agvCall(flowConfigHeaderVO, agvCallDTOList);
     }
@@ -127,35 +137,51 @@ public class BusinessServiceImpl implements IBusinessService {
                 BaseLocationInfo locationTo = null;
                 String paramLocationFrom = agvCallDTO.getLocationFrom();
                 String paramLocationTo = agvCallDTO.getLocationTo();
-                List<String> zoneIdList = new ArrayList<>();
-                if (StringUtils.isEmpty(paramLocationTo)) {
-                    paramLocationTo = flowConfigHeaderVO.getLocationTo();
+                List<String> zoneIdListFrom = new ArrayList<>();
+                List<String> zoneIdListTo = new ArrayList<>();
+
+                //如果起始/目标库位没有传参,就执行流程中配置的库位
+                AgvCallItemDTO agvCall = agvCallDTO.getAgvCallItemDTOList().get(0);
+                HashMap<String, String> hashMap = JSON.parseObject(JSON.toJSONString(agvCall.getLotattDTO()), HashMap.class);
+                //获取起始库位
+                if (StringUtils.isEmpty(paramLocationFrom)) {
+                    zoneIdListFrom = Arrays.stream(flowConfigHeaderVO.getLocationFrom().split(",")).collect(Collectors.toList());
+
+                    List<BaseLocationInfo> locationFromList = baseLocationInfoMapper.selectSortedLocationLotattListByZoneIdListOrderBy(zoneIdListFrom
+                            , agvCallDTO.getWarehouseId(), hashMap, agvCall.getSku(), "inv.create_time");
+                    locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "PM_XL", asnSoStrategy, token);
+                }else{
+                    locationFrom = baseLocationInfoService.selectBaseLocationInfoByIdOrNo(paramLocationFrom,Constant.WAREHOUSE_ID);
                 }
-                if (!StringUtils.isEmpty(flowConfigHeaderVO.getLocationFrom())) {
-                    zoneIdList = Arrays.stream(flowConfigHeaderVO.getLocationFrom().split(",")).collect(Collectors.toList());
+                //获取目标库位
+                if (StringUtils.isEmpty(paramLocationTo)) {
+                    zoneIdListTo = Arrays.stream(flowConfigHeaderVO.getLocationTo().split(",")).collect(Collectors.toList());
+
+                    List<BaseLocationInfo> locationToList = baseLocationInfoMapper.selectSortedLocationLotattListByZoneIdListOrderBy(zoneIdListTo
+                            , agvCallDTO.getWarehouseId(), hashMap, agvCall.getSku(), "inv.create_time");
+                    locationTo = this.zoneLocationAllocation(locationToList, "locationFrom", "PM_XL", asnSoStrategy, token);
+                }else{
+                    locationTo = baseLocationInfoService.selectBaseLocationInfoByIdOrNo(paramLocationTo,Constant.WAREHOUSE_ID);
                 }
 
                 List<WcsTask> wcsTaskList = new ArrayList<>();
-                if ("PM_L".equals(flowConfigHeaderVO.getRemark())) {
-                    locationFrom = baseLocationInfoService.selectBaseLocationInfoByIdOrNo(agvCallDTO.getLocationFrom(),Constant.WAREHOUSE_ID);
-                    locationTo =  baseLocationInfoService.selectBaseLocationInfoByIdOrNo(agvCallDTO.getLocationTo(),Constant.WAREHOUSE_ID);
-                    baseLocationInfoService.occupyLocation(locationTo.getId(),Constant.WAREHOUSE_ID,"AMS");
-                    baseLocationInfoService.unOccupyLocation(locationFrom.getId(),Constant.WAREHOUSE_ID,"AMS");
-                    wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, agvCallDTO, token));
 
+                if ("PM_XL".equals(flowConfigHeaderVO.getFlowType())) {
+
+                    baseLocationInfoService.occupyLocation(locationFrom.getId(),Constant.WAREHOUSE_ID,"AMS");
+                    wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, agvCallDTO, token));
+                    //下料 任务生成成功后 写PLC
+                    plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata())
+                            .writeBoolean(PLCEnum.PACKING_BLANK_3.getMetadata(), true);
                 }
-                if ("PM_UP".equals(flowConfigHeaderVO.getRemark())){
-                    AgvCallItemDTO agvCall = agvCallDTO.getAgvCallItemDTOList().get(0);
-                    List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId(), null);
-                    HashMap<String, String> hashMap = JSON.parseObject(JSON.toJSONString(agvCall.getLotattDTO()), HashMap.class);
-                    List<BaseLocationInfo> locationFromList = baseLocationInfoMapper.selectSortedLocationLotattListByZoneIdListOrderBy(zoneIdList
-                            , agvCallDTO.getWarehouseId(), hashMap, agvCall.getSku(), "inv.create_time");
-                    locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "PM_UP", asnSoStrategy, token);
-                    locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "PM_UP", asnSoStrategy, token);
+                if ("PM_SK".equals(flowConfigHeaderVO.getFlowType())){
+
                     iInvLotAttService.deleteInvLotAttBylocationId(locationTo.getId());
                     invLotLocIdService.deleteInvLotLocIdById(locationTo.getId());
-                    baseLocationInfoService.updateLocationIdleAndNoEmpty(locationTo.getId(),Constant.WAREHOUSE_ID,"AMS");
                     wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, agvCallDTO, token));
+                    //上空 任务生成成功后 写PLC
+                    plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata())
+                            .writeBoolean(PLCEnum.PACKING_CALL_EMPTY_3.getMetadata(), true);
                 }
             }
             return AjaxResult.success("任务下发成功");
@@ -432,6 +458,7 @@ public class BusinessServiceImpl implements IBusinessService {
             wcsTask.setTaskType(flowConfigHeaderVO.getFlowType());
             wcsTask.setExt8(token.toString());
             wcsTask.setExt7(flowConfigHeaderVO.getId().toString());
+            wcsTask.setExt6(flowConfigHeaderVO.getSkuType());
             wcsTaskList.add(wcsTask);
             businessService.addTask(wcsTask);
         } else {
@@ -570,8 +597,8 @@ public class BusinessServiceImpl implements IBusinessService {
             amsTask.setStTo(Integer.parseInt(wcsTask.getLocationTo()));
             amsTask.setDeviceName(wcsTask.getDeviceName());
         } else {
-            amsTask.setStFrom(locFrom.getAgvStation().intValue());
-            amsTask.setStTo(locTo.getAgvStation().intValue());
+            amsTask.setStFrom(Integer.valueOf(locFrom.getAgvStation()));
+            amsTask.setStTo(Integer.valueOf(locTo.getAgvStation()));
         }
         amsTask.setExt1(wcsTask.getExt1());
         amsTask.setExt2(wcsTask.getExt2());
@@ -632,6 +659,44 @@ public class BusinessServiceImpl implements IBusinessService {
         }
     }
 
+    @Transactional
+    @Override
+    public void autoSendTmTask() {
+
+        List<WcsTask> wcsTaskList = wcsTaskService.selectWcsUnallocated(Constant.WAREHOUSE_ID);
+        if (wcsTaskList != null && wcsTaskList.size() > 0) {
+            for (WcsTask wcsTask : wcsTaskList) {
+                //如果是充电任务直接下发
+                if (wcsTask.getBusinessType().equals(Constant.TASK_BUSINESS_TYPE.TASK_POWER.getValue())) {
+
+                    log.info("充电任务直接下发");
+                    TsDataResponse tsResult = iTsTaskService.sendChargeJob(wcsTask.getAgvNo(),wcsTask.getLocationTo());
+                    if("true".equals(tsResult)){
+                        wcsTask.setState(2L);
+                    }else{
+                        wcsTask.setRemark("错误码:"+tsResult.getError_code()+",错误信息:"+tsResult.getMsg());
+                    }
+                    wcsTaskService.updateWcsTask(wcsTask);
+                    continue;
+                }
+
+
+                try {
+                    //任务下发
+                    TsDataResponse tsResult = iTsTaskService.sendTaskOrder(wcsTask);
+                    if("true".equals(tsResult)){
+                        log.info("任务号:"+wcsTask.getTaskNo()+",下发任务成功");
+                    }else{
+                        log.info("任务号:"+wcsTask.getTaskNo()+",下发任务失败!错误码:"+tsResult.getError_code()+",错误信息:"+tsResult.getMsg());
+                    }
+                    Thread.sleep(500);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
     @Transactional
     @Override
     public void autoSendTranSit() {

+ 5 - 0
warewms-ams/src/main/java/com/ruoyi/ams/business/IBusinessService.java

@@ -123,6 +123,11 @@ public interface IBusinessService {
      */
     void autoSend();
 
+    /**
+     * 自动下发任务-TM
+     */
+    void autoSendTmTask();
+
     /**
      * 自动下发任务
      */

+ 1 - 26
warewms-ams/src/main/java/com/ruoyi/ams/task/service/impl/WcsTaskServiceImpl.java

@@ -338,7 +338,7 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
 
             TsDataResponse tsResult = tsTaskService.delOrderByIndex(wcsTask.getDeviceName());
             if("true".equals(tsResult.getSuccess())){
-                tsTaskService.tsTaskStateBack(wcsTask.getDeviceName(),"7",wcsTask.getAgvNo());
+                tsTaskService.tsTaskStateBack(wcsTask.getDeviceName(),"tsOrderFailed",wcsTask.getAgvNo());
                 return AjaxResult.success("取消成功!");
             }else{
                 return AjaxResult.error("取消失败!错误码:"+tsResult.getError_code()+",错误信息:"+tsResult.getMsg());
@@ -457,21 +457,6 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                         if (!StringUtils.isEmpty(wcsTask.getExt8())) {
                             redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
                         }
-                        //叠包机
-                        if (wcsTask.getTaskType().substring(0, 4).equals("PM_L")) {
-                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).writeBoolean(PLCEnum.STACKING_MACHINE_FEEDING_FINISH.getMetadata(), true);
-                        }
-                        if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_UP_1.name())) {
-                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_1.getMetadata(), true);
-                        }
-                        if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_UP_2.name())) {
-                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_2.getMetadata(), true);
-                        }
-                        if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_UP_3.name())) {
-                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_3.getMetadata(), true);
-                        }
-
-
                         break;
                     case 3:
                         break;
@@ -496,16 +481,6 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                         if (!StringUtils.isEmpty(wcsTask.getExt8())) {
                             redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()), wcsTask.getLocationFrom());
                         }
-                        if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_L_1.name())) {
-                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_Leave_2.getMetadata(), true);
-                        }
-                        if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_L_2.name())) {
-                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_Leave_2.getMetadata(), true);
-                        }
-                        if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_L_3.name())) {
-                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_Leave_3.getMetadata(), true);
-                        }
-
                         break;
                     case 5:
                         break;

+ 8 - 6
warewms-ams/src/main/java/com/ruoyi/ams/tm/common/TsDataConfiguration.java

@@ -8,17 +8,19 @@ public class TsDataConfiguration {
     //-----------------------------------TS 天目系统对接url-----------------------------------
 
     //创建一个 TS 订单
-    public static final String SEND_JOB_TS = "http://localhost:55200/v1/orderByTS";
+    public static final String SEND_JOB_TS = "http://192.168.2.200:55200/v1/orderByTS";
     //根据 TS index 获取 TS 订单信息
-    public static final String QUERY_ORDER_INFO_TS_INDEX = "http://localhost:55200/v1/transportStructureOrder";
+    public static final String QUERY_ORDER_INFO_TS_INDEX = "http://192.168.2.200:55200/v1/transportStructureOrder";
     //获取所有订单信息
-    public static final String QUERY_ORDER_INFO = "http://localhost:55200/v1/transportStructureOrders";
+    public static final String QUERY_ORDER_INFO = "http://192.168.2.200:55200/v1/transportStructureOrders";
     //根据订单名取消订单
-    public static final String DEL_ORDER_TS_INDEX = "http://localhost:55200/v1/orderByTS/withdrawalTSOrder";
+    public static final String DEL_ORDER_TS_INDEX = "http://192.168.2.200:55200/v1/orderByTS/withdrawalTSOrder";
     //根据车辆名称取消订单
-    public static final String DEL_ORDER_AGV_NO = "http://localhost:55200/v1/vehicles/withdrawalTSOrder";
+    public static final String DEL_ORDER_AGV_NO = "http://192.168.2.200:55200/v1/vehicles/withdrawalTSOrder";
     //创建充电订单
-    public static final String SEND_CHARGE_JOB = "http://localhost:55200/v1/transportOrders";
+    public static final String SEND_CHARGE_JOB = "http://192.168.2.200:55200/v1/transportOrders";
+    //取消充电任务
+    public static final String DEL_CHARGE_JOB = "http://192.168.2.200:55200/v1/transportOrders/withdrawalOrder";
 
     //------------------------------------------end------------------------------------------
 

+ 1 - 1
warewms-ams/src/main/java/com/ruoyi/ams/tm/entity/OrderSequence.java

@@ -8,7 +8,7 @@ import java.util.List;
 public class OrderSequence {
 
     //取货点为奇数,卸货点为偶数
-    private String step;
+    private int step;
     //点位列表
     private List<Destinations> destinations;
 }

+ 6 - 1
warewms-ams/src/main/java/com/ruoyi/ams/tm/service/ITsTaskService.java

@@ -53,10 +53,15 @@ public interface ITsTaskService {
      */
     TsDataResponse delOrderByAgvNo(String agvNo);
 
-
     /**
      * TS-创建充电任务
      * agvNo ——车辆名称
      */
     TsDataResponse sendChargeJob(String agvNo,String loc);
+
+    /**
+     * TS-创建充电任务
+     * agvNo ——车辆名称
+     */
+    TsDataResponse delChargeJob(String agvTaskNo);
 }

+ 133 - 41
warewms-ams/src/main/java/com/ruoyi/ams/tm/service/impl/TsTaskServiceImpl.java

@@ -12,10 +12,14 @@ import com.ruoyi.ams.tm.entity.TsDataResponse;
 import com.ruoyi.ams.tm.entity.TsTaskStateResponse;
 import com.ruoyi.ams.tm.service.ITsTaskService;
 import com.ruoyi.base.constant.Constant;
+import com.ruoyi.base.domain.BaseLocationInfo;
 import com.ruoyi.base.service.IBaseLocationInfoService;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.http.HttpRequest;
+import com.ruoyi.system.enums.PLCConnectNameEnum;
+import com.ruoyi.system.enums.PLCEnum;
+import com.ruoyi.system.init.PlcConnectServiceRunner;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -38,16 +42,25 @@ public class TsTaskServiceImpl implements ITsTaskService {
     @Autowired
     private WcsTaskServiceImpl wcsTaskServiceImpl;
     @Autowired
+    private PlcConnectServiceRunner plcConnectServiceRunner;
+    @Autowired
     private IBaseLocationInfoService baseLocationInfoService;
 
 
     //任务状态翻译
     private Integer tsStateConvert(String code) {
 
+        /**
+         * 1-任务开始
+         * 13-取货申请中  >   3-取货中   >   4-取货完成
+         * 14-卸货申请中  >   5-卸货中   >   6-卸货完成
+         * 2-任务完成
+         * 7-任务取消
+         */
         switch (code) {
-            case "tsOrderStarted":
+            case "tsOrder Started":
                 return 1;
-            case "tsOrderFinished":
+            case "tsOrder Finished":
                 return 2;
             case "Fetching":
                 return 3;
@@ -57,8 +70,12 @@ public class TsTaskServiceImpl implements ITsTaskService {
                 return 5;
             case "Delivered":
                 return 6;
-            case "tsOrderFailed":
+            case "tsOrder Failed":
                 return 7;
+            case "AskForFetch":
+                return 13;
+            case "AskForDeliver":
+                return 14;
         }
         return 0;
     }
@@ -68,14 +85,32 @@ public class TsTaskServiceImpl implements ITsTaskService {
     public synchronized TsTaskStateResponse confirmAnalysis(String tsOrder,String reqType, String agvNo) {
 
 
+        log.info("TS-天目取卸货申请------------->:TS任务号-{},状态-{},车号-{}",tsOrder,reqType,agvNo);
         //根据TSOrder 查询任务
-        WcsTask wcsTask = wcsTaskServiceImpl.selectWcsTaskByTaskNo(tsOrder);
+        WcsTask wcsTask = wcsTaskServiceImpl.selectWcsTaskByTsIndex(tsOrder);
         if(wcsTask == null){
+            log.info("TsTaskServiceImpl---confirmAnalysis:未查询到对应任务-" + JSON.toJSONString(tsOrder));
             return TsTaskStateResponse.error("未查询到对应任务!","");
         }
-        log.info("TsTaskServiceImpl---confirmAnalysis:" + JSON.toJSONString(wcsTask));
-        return TsTaskStateResponse.success("","");
 
+        //取卸货编号 (1:取货申请 2:卸货申请)
+        boolean b = true;
+        /*if("1".equals(reqType)){
+
+            b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata())
+                    .readBoolean(PLCEnum.PACKING_BLANK_1.getMetadata());
+        }else{
+
+            b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata())
+                    .readBoolean(PLCEnum.PACKING_CALL_EMPTY_1.getMetadata());
+        }*/
+        log.info("TsTaskServiceImpl---confirmAnalysis:申请PLC取卸货-" + JSON.toJSONString(b));
+
+        if(b){
+            return TsTaskStateResponse.success("申请PLC取卸货-可执行取卸货","");
+        }else{
+            return TsTaskStateResponse.error("申请PLC取卸货-不可执行取卸货","");
+        }
     }
 
 
@@ -106,11 +141,11 @@ public class TsTaskServiceImpl implements ITsTaskService {
             log.info("TsTaskServiceImpl---tsTaskStateBack:未匹配到任务状态!");
             return TsTaskStateResponse.error("未匹配到任务状态!","");
         }
-        if (state == 2) {
+        if (wcsTask.getState() == 2) {
             log.info("TsTaskServiceImpl---tsTaskStateBack:已完成的任务无需反馈!");
             return TsTaskStateResponse.error("已完成的任务无需反馈!","");
         }
-        if (state == 7 && wcsTask.getState() == 7) {
+        if (wcsTask.getState() == 7) {
             log.info("TsTaskServiceImpl---tsTaskStateBack:已取消的任务无需重复取消!");
             return TsTaskStateResponse.error("已取消的任务无需重复取消!","");
         }
@@ -121,12 +156,16 @@ public class TsTaskServiceImpl implements ITsTaskService {
             switch (state) {
                 case 1:
                     wcsTask.setStartTime(new Date());
+                    wcsTask.setRemark("任务开始执行!");
                     break;
                 case 2:
                     if (wcsTask.getState() == 3 || wcsTask.getState() == 4) {
                         log.info("任务未取货,不能直接完成!" + wcsTask.getTaskNo());
                         return TsTaskStateResponse.error("任务未取货,不能直接完成!" ,"");
                     }
+                    if (wcsTask.getState() == 6) {
+                        return TsTaskStateResponse.success("执行成功!" ,"");
+                    }
                     // 解锁终点库位
                     baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationTo()), Constant.WAREHOUSE_ID, "TS-TM");
                     // 将中间缓存位库存移动到终点
@@ -135,8 +174,10 @@ public class TsTaskServiceImpl implements ITsTaskService {
                     if (!StringUtils.isEmpty(wcsTask.getExt8())) {
                         redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
                     }
+                    wcsTask.setRemark("任务完成!");
                     break;
                 case 3:
+                    wcsTask.setRemark("任务取货申请中!");
                     break;
                 case 4:
                     if (wcsTask.getState() == 4) {
@@ -151,11 +192,18 @@ public class TsTaskServiceImpl implements ITsTaskService {
                     if (!StringUtils.isEmpty(wcsTask.getExt8())) {
                         redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()), wcsTask.getLocationFrom());
                     }
+                    //下料 取货完成后 写PLC
+                    /*if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_XL.name())) {
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata())
+                                .writeBoolean(PLCEnum.PACKING_BLANK_2.getMetadata(), true);
+                    }*/
+                    wcsTask.setRemark("任务取货完成!");
                     break;
                 case 5:
+                    wcsTask.setRemark("任务卸货申请中!");
                     break;
                 case 6:
-                    if (wcsTask.getState() == 3 || wcsTask.getState() == 4) {
+                    if (wcsTask.getState() != 4) {
                         log.info("任务未取货,不能直接卸货!" + wcsTask.getTaskNo());
                         return TsTaskStateResponse.error("任务未取货,不能直接卸货!","");
                     }
@@ -171,6 +219,12 @@ public class TsTaskServiceImpl implements ITsTaskService {
                     if (!StringUtils.isEmpty(wcsTask.getExt8())) {
                         redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
                     }
+                    // 添加空托 卸货完成后 写PLC
+                    /*if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_SK.name())) {
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata())
+                                .writeBoolean(PLCEnum.PACKING_CALL_EMPTY_2.getMetadata(), true);
+                    }*/
+                    wcsTask.setRemark("任务卸货完成!");
                     break;
                 case 7:
                     //如果取到货就只解锁终点库位
@@ -185,6 +239,7 @@ public class TsTaskServiceImpl implements ITsTaskService {
                     if (!StringUtils.isEmpty(wcsTask.getExt8())) {
                         redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
                     }
+                    wcsTask.setRemark("任务取消!");
                     break;
                 default:
                     break;
@@ -202,6 +257,7 @@ public class TsTaskServiceImpl implements ITsTaskService {
 
         wcsTask.setEndTime(new Date());
         wcsTask.setState(state.longValue());
+        wcsTask.setAgvNo(agvNo);
         wcsTask.setUpdateUser("TS-TM");
         wcsTask.setUpdateDate(new Date());
         wcsTaskService.updateWcsTask(wcsTask);
@@ -216,50 +272,59 @@ public class TsTaskServiceImpl implements ITsTaskService {
         try {
             List<OrderSequence> orderSequenceList = new ArrayList<>();
 
+            BaseLocationInfo blf = baseLocationInfoService.selectBaseLocationInfoById(Long.parseLong(wcsTask.getLocationFrom()));
+            BaseLocationInfo blt = baseLocationInfoService.selectBaseLocationInfoById(Long.parseLong(wcsTask.getLocationTo()));
+
+            if(blf == null || blt ==null){
+                return new TsDataResponse();
+            }
+
             //起始点位
             Destinations deLocF = new Destinations();
-            deLocF.setLocationName(wcsTask.getLocationFrom());
+            deLocF.setLocationName(blf.getAgvStation());
             deLocF.setOperation("Floor0_Take");
             List<Destinations> desFList = new ArrayList<>();
             desFList.add(deLocF);
             OrderSequence orderLocF = new OrderSequence();
-            orderLocF.setStep("1");
+            orderLocF.setStep(1);
             orderLocF.setDestinations(desFList);
             //目标点位
             Destinations deLocT = new Destinations();
-            deLocT.setLocationName(wcsTask.getLocationTo());
+            deLocT.setLocationName(blt.getAgvStation());
             deLocT.setOperation("Floor0_Place");
             List<Destinations> desTList = new ArrayList<>();
             desTList.add(deLocT);
             OrderSequence orderLocT = new OrderSequence();
-            orderLocT.setStep("2");
+            orderLocT.setStep(2);
             orderLocT.setDestinations(desTList);
 
             orderSequenceList.add(orderLocF);
             orderSequenceList.add(orderLocT);
 
             JSONObject jsonObject=  new JSONObject();
-            jsonObject.put("priority",wcsTask.getPriority());    //任务优先级
-            jsonObject.put("intendedVehicle","");                //计划车辆(不指定的话不传参数)
-            jsonObject.put("orderType","");                      //TS 流程编号(默认值由 TS 的 json 文件给出)
-            jsonObject.put("circulation","");                    //循环执行订单(给1则表示循环,不需要循环可以不给改参数)
+            //jsonObject.put("priority",wcsTask.getPriority());    //任务优先级   该项目TS不需要或者为空的话就不传
+            //jsonObject.put("intendedVehicle","");                //计划车辆(不指定的话不传参数)  该项目TS不需要或者为空的话就不传
+            jsonObject.put("orderType",Integer.valueOf(wcsTask.getExt6()));                      //TS 流程编号(默认值由 TS 的 json 文件给出)
+            //jsonObject.put("circulation","");                    //循环执行订单(给1则表示循环,不需要循环可以不给改参数) 该项目TS不需要或者为空的话就不传
             jsonObject.put("orderSequence",orderSequenceList);   //点位 列表
 
             log.info("TsTaskServiceImpl---sendTaskOrder:创建TS任务单:"+ JSON.toJSONString(jsonObject));
-            //String str = HttpRequest.postData(TsDataConfiguration.SEND_JOB_TS,jsonObject);
-            String str = "{\n" +
+            String str = HttpRequest.postData(TsDataConfiguration.SEND_JOB_TS,jsonObject);
+            /*String str = "{\n" +
                     " \"success\": true,\n" +
                     " \"error_code\": \"0000\",\n" +
                     " \"msg\": \"\",\n" +
                     " \"data\": \"TSOrder-0003\"\n" +
-                    "}";
+                    "}";*/
             log.info("TsTaskServiceImpl---sendTaskOrder:TS任务单创建结果:"+ JSON.toJSONString(str));
             TsDataResponse tsData = JSONObject.parseObject(str, TsDataResponse.class);
 
             if("true".equals(tsData.getSuccess())){
 
                 wcsTask.setState(10L);
+                wcsTask.setUpdateDate(new Date());
                 wcsTask.setDeviceName(tsData.getData().toString());
+                wcsTask.setRemark("TS任务下发成功!");
             }else{
 
                 wcsTask.setRemark("错误码:"+tsData.getError_code()+",错误信息:"+tsData.getMsg());
@@ -281,8 +346,11 @@ public class TsTaskServiceImpl implements ITsTaskService {
 
         try {
 
-            //String str = HttpRequest.getData(TsDataConfiguration.QUERY_ORDER_INFO_TS_INDEX,":orderIndex",tsIndex);
-            String str = "{\n" +
+            String url = TsDataConfiguration.QUERY_ORDER_INFO_TS_INDEX+"/"+tsIndex;
+            log.info("TsTaskServiceImpl---queryOrderInfoByIndex:获取订单路径:"+ JSON.toJSONString(url));
+
+            String str = HttpRequest.getData(url);
+            /*String str = "{\n" +
                     "\t\"success\": true,\n" +
                     "\t\"error_code\": \"0000\",\n" +
                     "\t\"msg\": \"\",\n" +
@@ -297,7 +365,7 @@ public class TsTaskServiceImpl implements ITsTaskService {
                     "\t\t\t\"Location-0004\"\n" +
                     "\t\t]\n" +
                     "\t}\n" +
-                    "}";
+                    "}";*/
             log.info("TsTaskServiceImpl---queryOrderInfoByIndex:获取订单信息结果:"+ JSON.toJSONString(str));
             TsDataResponse tsData = JSONObject.parseObject(str, TsDataResponse.class);
             return tsData;
@@ -315,8 +383,8 @@ public class TsTaskServiceImpl implements ITsTaskService {
 
         try {
 
-            //String str = HttpRequest.getData(TsDataConfiguration.QUERY_ORDER_INFO);
-            String str = "{\n" +
+            String str = HttpRequest.getData(TsDataConfiguration.QUERY_ORDER_INFO);
+            /*String str = "{\n" +
                     "\t\"success\": true,\n" +
                     "\t\"error_code\": \"0000\",\n" +
                     "\t\"msg\": \"\",\n" +
@@ -366,7 +434,7 @@ public class TsTaskServiceImpl implements ITsTaskService {
                     "\t\t\t]\n" +
                     "\t\t}\n" +
                     "\t]\n" +
-                    "}";
+                    "}";*/
             log.info("TsTaskServiceImpl---queryOrderInfo:全部订单信息结果:"+ JSON.toJSONString(str));
             TsDataResponse tsData = JSONObject.parseObject(str, TsDataResponse.class);
             return tsData;
@@ -388,14 +456,14 @@ public class TsTaskServiceImpl implements ITsTaskService {
                 return new TsDataResponse();
             }
 
-            JSONObject jsonObject=  new JSONObject();
-            jsonObject.put(":TSIndex",tsIndex);
-
-            //String str = HttpRequest.postData(TsDataConfiguration.DEL_ORDER_TS_INDEX,jsonObject);
-            String str = "{\n" +
+            String url = TsDataConfiguration.DEL_ORDER_TS_INDEX+"/"+tsIndex+"/true";
+            log.info("TsTaskServiceImpl---delOrderByIndex:根据TsIndex取消任务路径:"+ JSON.toJSONString(url));
+            String str = HttpRequest.postData(url);
+            /*String str = "{\n" +
                     "\"success\": true, \"error_code\": \"0000\", \"msg\": \"\", \"data\": \"\" }";
-            log.info("TsTaskServiceImpl---delOrderByIndex:取消结果:"+ JSON.toJSONString(str));
+            */
             TsDataResponse tsData = JSONObject.parseObject(str, TsDataResponse.class);
+            log.info("TsTaskServiceImpl---delOrderByIndex:根据TsIndex取消任务结果:"+ JSON.toJSONString(str));
             return tsData;
 
         }catch (Exception e){
@@ -411,14 +479,14 @@ public class TsTaskServiceImpl implements ITsTaskService {
 
         try {
 
-            JSONObject jsonObject=  new JSONObject();
-            jsonObject.put(":VehicleName",agvNo);
-
-            //String str = HttpRequest.postData(TsDataConfiguration.DEL_ORDER_AGV_NO,jsonObject);
-            String str = "{\n" +
+            String url = TsDataConfiguration.DEL_ORDER_AGV_NO+"/"+agvNo;
+            log.info("TsTaskServiceImpl---delOrderByAgvNo:根据车号取消任务路径:"+ JSON.toJSONString(url));
+            String str = HttpRequest.postData(url);
+            /*String str = "{\n" +
                     "\"success\": true, \"error_code\": \"0000\", \"msg\": \"\", \"data\": \"\" }";
-            log.info("TsTaskServiceImpl---delOrder:取消结果:"+ JSON.toJSONString(str));
+            */
             TsDataResponse tsData = JSONObject.parseObject(str, TsDataResponse.class);
+            log.info("TsTaskServiceImpl---delOrderByAgvNo:根据车号取消任务结果:"+ JSON.toJSONString(str));
             return tsData;
 
         }catch (Exception e){
@@ -446,11 +514,35 @@ public class TsTaskServiceImpl implements ITsTaskService {
             jsonObject.put("destinations",desList);
 
             log.info("TsTaskServiceImpl---sendChargeJob:发送充电任务:"+ JSON.toJSONString(jsonObject));
-            //String str = HttpRequest.postData(TsDataConfiguration.SEND_CHARGE_JOB,jsonObject);
-            String str = "{\n" +
+            String str = HttpRequest.postData(TsDataConfiguration.SEND_CHARGE_JOB,jsonObject);
+            /*String str = "{\n" +
+                    "\"success\": true, \"error_code\": \"0000\", \"msg\": \"\", \"data\": \"\" }";
+            log.info("TsTaskServiceImpl---sendChargeJob:充电消息发送结果:"+ JSON.toJSONString(str));*/
+            TsDataResponse tsData = JSONObject.parseObject(str, TsDataResponse.class);
+            log.info("TsTaskServiceImpl---sendChargeJob:发送任务结果:"+ JSON.toJSONString(tsData));
+            return tsData;
+
+        }catch (Exception e){
+            e.printStackTrace();
+            return new TsDataResponse();
+        }
+    }
+
+
+    @Transactional
+    @Override
+    public synchronized TsDataResponse delChargeJob(String agvTaskNo) {
+
+        try {
+
+            String url = TsDataConfiguration.DEL_CHARGE_JOB+"/"+agvTaskNo;
+            log.info("TsTaskServiceImpl---delChargeJob:取消充电任务路径:"+ JSON.toJSONString(url));
+            String str = HttpRequest.postData(url);
+            /*String str = "{\n" +
                     "\"success\": true, \"error_code\": \"0000\", \"msg\": \"\", \"data\": \"\" }";
-            log.info("TsTaskServiceImpl---sendChargeJob:充电消息发送结果:"+ JSON.toJSONString(str));
+            */
             TsDataResponse tsData = JSONObject.parseObject(str, TsDataResponse.class);
+            log.info("TsTaskServiceImpl---delOrderByAgvNo:取消充电任务结果:"+ JSON.toJSONString(str));
             return tsData;
 
         }catch (Exception e){

+ 1 - 1
warewms-ams/src/main/resources/mapper/ams/WcsTaskMapper.xml

@@ -157,7 +157,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="selectWcsTaskByAgvNo" parameterType="String" resultMap="WcsTaskResult">
         <include refid="selectWcsTaskVo"/>
-        where agv_no = #{tsIndex} and state in(1,3,4,5,6,9,10)
+        where agv_no = #{tsIndex} and state not in(2,7)
         ORDER BY create_date DESC
         LIMIT 1
     </select>

+ 4 - 20
warewms-base/src/main/java/com/ruoyi/base/constant/Constant.java

@@ -30,29 +30,13 @@ public class Constant {
      */
     public enum FLOW_CONFIG_ID {
         /**
-         * 一号包装机下料
+         * 下料
          */
-        PM_L_1(26L),
+        PM_XL(26L),
         /**
-         * 二号包装机下料
+         * 上空
          */
-        PM_L_2(27L),
-        /**
-         * 三号包装机下料
-         */
-        PM_L_3(28L),
-        /**
-         * 一号包装机上空托
-         */
-        PM_UP_1(29L),
-        /**
-         * 一号包装机上空托
-         */
-        PM_UP_2(30L),
-        /**
-         * 三号包装机上空托
-         */
-        PM_UP_3(31L);
+        PM_SK(27L);
 
         private Long flowId;
 

+ 3 - 3
warewms-base/src/main/java/com/ruoyi/base/domain/BaseLocationInfo.java

@@ -112,7 +112,7 @@ public class BaseLocationInfo extends BaseEntity {
      * AGV点位
      */
     @Excel(name = "AGV点位")
-    private Long agvStation;
+    private String agvStation;
 
     /**
      * 0默认(没有任何含义),1允许堆叠
@@ -278,11 +278,11 @@ public class BaseLocationInfo extends BaseEntity {
         return rackId;
     }
 
-    public void setAgvStation(Long agvStation) {
+    public void setAgvStation(String agvStation) {
         this.agvStation = agvStation;
     }
 
-    public Long getAgvStation() {
+    public String getAgvStation() {
         return agvStation;
     }