Browse Source

---添加接收任务后对PLC写呼叫成功消息,任务完成取消呼叫成功消息
---优化库位显示

zhifei 1 year ago
parent
commit
8517b334ae

+ 17 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/ams/WcsTaskController.java

@@ -114,7 +114,7 @@ public class WcsTaskController extends BaseController {
         int agvNo = 9999;
         WcsTask wcsTask = wcsTaskService.selectWcsTaskByTaskNo(taskNo);
         if (wcsTask == null) {
-            return AjaxResult.error("任务回调失败");
+            return AjaxResult.error("任务查询不存在");
         }
         if (StringUtils.isNotEmpty(wcsTask.getAgvNo())) {
             agvNo = Integer.parseInt(wcsTask.getAgvNo());
@@ -128,12 +128,26 @@ public class WcsTaskController extends BaseController {
         int agvNo = 9999;
         WcsTask wcsTask = wcsTaskService.selectWcsTaskByTaskNo(taskNo);
         if (wcsTask == null) {
-           return AjaxResult.error("任务回调失败");
+           return AjaxResult.error("任务查询不存在");
         }
         if (StringUtils.isNotEmpty(wcsTask.getAgvNo())) {
             agvNo = Integer.parseInt(wcsTask.getAgvNo());
         }
-        return wcsTaskService.callBack(wcsTask.getTaskNo(), 4, agvNo);
+        return wcsTaskService.callBack(wcsTask.getTaskNo(), 6, agvNo);
+    }
+
+    @Log(title = "任务完成", businessType = BusinessType.INSERT)
+    @PutMapping(value = "/missionAccomplished/{taskNo}")
+    public AjaxResult missionAccomplished(@PathVariable("taskNo") String taskNo) {
+        int agvNo = 9999;
+        WcsTask wcsTask = wcsTaskService.selectWcsTaskByTaskNo(taskNo);
+        if (wcsTask == null) {
+            return AjaxResult.error("任务查询不存在");
+        }
+        if (StringUtils.isNotEmpty(wcsTask.getAgvNo())) {
+            agvNo = Integer.parseInt(wcsTask.getAgvNo());
+        }
+        return wcsTaskService.callBack(wcsTask.getTaskNo(), 2, agvNo);
     }
 
     @Log(title = "任务取消", businessType = BusinessType.INSERT)

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

@@ -71,7 +71,7 @@ init-task:
     # plc连接配置
 plc:
     plcList[0]:
-        ip: 192.68.100.101
+        ip: 192.168.100.101
         enable: false
         name: packingMachine_1Plc
         ePlcType: S1200

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

@@ -73,28 +73,28 @@ init-task:
     # plc连接配置
 plc:
     plcList[0]:
-        ip: 192.68.100.101
+        ip: 192.168.100.101
         enable: true
         name: packingMachine_1Plc
         ePlcType: S1200
         heartbeat: DB5000.2
         confirmTheStatus:
     plcList[1]:
-        ip: 192.68.100.102
+        ip: 192.168.100.102
         enable: true
         name: packingMachine_2Plc
         ePlcType: S1200
         heartbeat: DB5000.2
         confirmTheStatus:
     plcList[2]:
-        ip: 192.68.100.103
+        ip: 192.168.100.103
         enable: true
         name: packingMachine_3Plc
         ePlcType: S1200
         heartbeat: DB5000.2
         confirmTheStatus:
     plcList[3]:
-        ip: 192.68.100.104
+        ip: 192.168.100.104
         enable: true
         name: stackingMachinePlc
         ePlcType: S1200

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

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

+ 53 - 11
ruoyi-admin/src/test/java/com/ruoyi/admin/test/base/WarehouseTest.java

@@ -1,5 +1,7 @@
 package com.ruoyi.admin.test.base;
 
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.ruoyi.RuoYiApplication;
 import com.ruoyi.ams.agv.ndc.domain.AmsHexdefineDetail;
@@ -21,6 +23,8 @@ import com.ruoyi.ams.config.service.IFlowConfigHeaderService;
 import com.ruoyi.ams.config.service.LocationAllocationStrategy;
 import com.ruoyi.ams.inv.domain.InvLotLocId;
 import com.ruoyi.ams.inv.mapper.InvLotLocIdMapper;
+import com.ruoyi.ams.inv.service.IInvLotAttService;
+import com.ruoyi.ams.inv.service.IInvLotLocIdService;
 import com.ruoyi.ams.locationView.domain.form.LocationViewForm;
 import com.ruoyi.ams.locationView.domain.vo.LocationViewVO;
 import com.ruoyi.ams.locationView.service.LocationViewService;
@@ -306,20 +310,58 @@ public class WarehouseTest {
         deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_2.getMetaName(),"获取到下料信号:"+true,"1"));
 
     }
-
+    @Autowired
+    private IInvLotLocIdService invLotLocIdService;
+    @Autowired
+    private IInvLotAttService iInvLotAttService;
     @Test
     public void testAms() {
-        List<AmsHexdefineDetail> basTask = amsHexdefineDetailService.selectAmsHexdefineDetailByBusinessType("01");
-        try {
-            AmsTask amsTask = amsTaskService.selectAmsTaskById(3L);
-            amsTask.init();
-            String order = amsHexdefineDetailService.concatOrder(amsTask, basTask);
-            System.out.println("-------------------------->");
-            System.out.println(order);
-        }catch (Exception e) {
-            e.printStackTrace();
-        }
+        iInvLotAttService.deleteInvLotAttBylocationId(100003L);
+        invLotLocIdService.deleteInvLotLocIdById(100003L);
+        baseLocationInfoService.updateLocationIdleAndEmpty(100003L, Constant.WAREHOUSE_ID, "AMS");
 
     }
 
+
+    @Test
+    public void updateLocation(){
+        String a ="[\n" +
+                "{\"location\":\"DOWN-1\",\"agv\":7},\n" +
+                "{\"location\":\"DOWN-2\",\"agv\":9},\n" +
+                "{\"location\":\"DOWN-3\",\"agv\":11},\n" +
+                "{\"location\":\"UP-1\",\"agv\":8},\n" +
+                "{\"location\":\"UP-2\",\"agv\":10},\n" +
+                "{\"location\":\"UP-3\",\"agv\":12},\n" +
+                "{\"location\":\"SM_UP\",\"agv\":1},\n" +
+                "{\"location\":\"SM_1-1\",\"agv\":4},\n" +
+                "{\"location\":\"SM_1-2\",\"agv\":5},\n" +
+                "{\"location\":\"SM_1-3\",\"agv\":6},\n" +
+                "{\"location\":\"PM_1-1\",\"agv\":14},\n" +
+                "{\"location\":\"PM_1-2\",\"agv\":15},\n" +
+                "{\"location\":\"PM_1-3\",\"agv\":16},\n" +
+                "{\"location\":\"PM_1-4\",\"agv\":17},\n" +
+                "{\"location\":\"PM_1-5\",\"agv\":18},\n" +
+                "{\"location\":\"PM_1-6\",\"agv\":19},\n" +
+                "{\"location\":\"PM_1-7\",\"agv\":20},\n" +
+                "{\"location\":\"PM_1-8\",\"agv\":21},\n" +
+                "{\"location\":\"PM_1-9\",\"agv\":22},\n" +
+                "{\"location\":\"PM_1-10\",\"agv\":23},\n" +
+                "{\"location\":\"PM_1-11\",\"agv\":24},\n" +
+                "\n" +
+                "]";
+        StringBuffer err = new StringBuffer();
+        err.append("跟新出现问题的:");
+        for (Object o : JSONUtil.parseArray(a)) {
+            JSONObject json = (JSONObject) o;
+            BaseLocationInfo location = baseLocationInfoMapper.selectBaseLocationInfoByLocationNo(json.get("location").toString(), 1L);
+            try {
+                location.setAgvStation(Long.parseLong(json.get("agv").toString()));
+                baseLocationInfoMapper.updateBaseLocationInfo(location);
+            }catch (Exception e){
+                err.append(o).append(",");
+                System.out.println(err);
+            }
+        }
+
+    }
 }

+ 14 - 4
ruoyi-dongfangyaiye/src/main/java/com/ruoyi/taiye/controller/DeviceLogController.java

@@ -47,6 +47,9 @@ public class DeviceLogController extends BaseController
         return getDataTable(list);
     }
 
+    public static void main(String[] args) {
+        System.out.println(Integer.toHexString(70));
+    }
     /**
      * 导出设备日志列表
      */
@@ -74,12 +77,19 @@ public class DeviceLogController extends BaseController
      * @param plcName
      * @return
      */
-    @GetMapping(value = "/writeBoolean/{plcName}/{plcSignal}")
-    public AjaxResult writeBoolean(@PathVariable String plcName, @PathVariable String plcSignal)
+    @GetMapping(value = "/writeBoolean/{plcName}/{plcSignal}/{value}")
+    public AjaxResult writeBoolean(@PathVariable String plcName, @PathVariable String plcSignal, @PathVariable boolean value)
     {
-        log.info("==={}:{}",plcName,plcSignal);
-        plcConnectServiceRunner.getPlcServer(plcName).writeBoolean(plcSignal, true);
+        log.info("==={}:{}:{}",plcName,plcSignal,value);
+        plcConnectServiceRunner.getPlcServer(plcName).writeBoolean(plcSignal, value);
         return AjaxResult.success();
     }
 
+    @GetMapping(value = "/readBoolean/{plcName}/{plcSignal}")
+    public AjaxResult readBoolean(@PathVariable String plcName, @PathVariable String plcSignal)
+    {
+        boolean value = plcConnectServiceRunner.getPlcServer(plcName).readBoolean(plcSignal);
+        log.info("==={}:{}:{}",plcName,plcSignal,value);
+        return AjaxResult.success();
+    }
 }

+ 29 - 21
ruoyi-dongfangyaiye/src/main/java/com/ruoyi/taiye/job/AMSJob.java

@@ -1,5 +1,7 @@
 package com.ruoyi.taiye.job;
 
+import com.ruoyi.ams.inv.service.IInvLotAttService;
+import com.ruoyi.ams.inv.service.IInvLotLocIdService;
 import com.ruoyi.system.init.PlcConnectServiceRunner;
 import com.ruoyi.common.core.domain.DeviceLog;
 import com.ruoyi.system.enums.PLCConnectNameEnum;
@@ -22,39 +24,45 @@ public class AMSJob {
     @Autowired
     private IDeviceLogService deviceLogService;
 
+
+
     public void test() {
         // 一号包装机
         boolean b1 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_1.getMetadata());
-        log.info("一号包装机下料信号:{}:{}:{}", PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCEnum.PACKING_MACHINE_UNLOADING_1.getMetadata(),b1);
+        log.info("一号包装机下料信号:{}:{}:{}", PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCEnum.PACKING_MACHINE_UNLOADING_1.getMetadata(), b1);
         boolean b2 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_PALLETS_1.getMetadata());
-        log.info("一号包装机上空信号:{}:{}:{}", PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCEnum.PACKING_MACHINE_UP_EMPTY_PALLETS_1.getMetadata(),b2);
+        log.info("一号包装机上空信号:{}:{}:{}", PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCEnum.PACKING_MACHINE_UP_EMPTY_PALLETS_1.getMetadata(), b2);
         boolean b3 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_ENTER_1.getMetadata());
-        log.info("一号包装机下料允许进入信号:{}:{}:{}", PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCEnum.PACKING_MACHINE_UNLOADING_ENTER_1.getMetadata(),b3);
+        log.info("一号包装机下料允许进入信号:{}:{}:{}", PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCEnum.PACKING_MACHINE_UNLOADING_ENTER_1.getMetadata(), b3);
         boolean b4 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_ENTER_1.getMetadata());
-        log.info("一号包装机上空允许进入信号:{}:{}:{}", PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCEnum.PACKING_MACHINE_UP_EMPTY_ENTER_1.getMetadata(),b4);
+        log.info("一号包装机上空允许进入信号:{}:{}:{}", PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCEnum.PACKING_MACHINE_UP_EMPTY_ENTER_1.getMetadata(), b4);
         boolean b5 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_Leave_1.getMetadata());
-        log.info("一号包装机下料完成信号:{}:{}:{}", PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCEnum.PACKING_MACHINE_UNLOADING_Leave_1.getMetadata(),b5);
+        log.info("一号包装机下料完成信号:{}:{}:{}", PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCEnum.PACKING_MACHINE_UNLOADING_Leave_1.getMetadata(), b5);
         boolean b6 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_1.getMetadata());
-        log.info("一号包装机上空完成信号:{}:{}:{}", PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_1.getMetadata(),b6);
+        log.info("一号包装机上空完成信号:{}:{}:{}", PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_1.getMetadata(), b6);
+
+
         // 叠包机
         boolean b7 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).readBoolean(PLCEnum.STACKING_MACHINE_FEEDING.getMetadata());
-        log.info("叠包机上料信号:{}:{}:{}", PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCEnum.STACKING_MACHINE_FEEDING.getMetadata(),b7);
+        log.info("叠包机上料信号:{}:{}:{}", PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCEnum.STACKING_MACHINE_FEEDING.getMetadata(), b7);
         boolean b8 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).readBoolean(PLCEnum.STACKING_MACHINE_FEEDING_ENTER.getMetadata());
-        log.info("叠包机允许进入:{}:{}:{}", PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCEnum.STACKING_MACHINE_FEEDING_ENTER.getMetadata(),b8);
+        log.info("叠包机允许进入:{}:{}:{}", PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCEnum.STACKING_MACHINE_FEEDING_ENTER.getMetadata(), b8);
         boolean b9 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).readBoolean(PLCEnum.STACKING_MACHINE_FEEDING_FINISH.getMetadata());
-        log.info("叠包机上料完成信号:{}:{}:{}", PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCEnum.STACKING_MACHINE_FEEDING_FINISH.getMetadata(),b9);
+        log.info("叠包机上料完成信号:{}:{}:{}", PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCEnum.STACKING_MACHINE_FEEDING_FINISH.getMetadata(), b9);
     }
 
+
+
     /**
      * 一号包装机下料任务
      */
     public void onePackingMachineUnloading() {
         log.info("一号包装机下料信号:{}:{}", PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCEnum.PACKING_MACHINE_UNLOADING_1.getMetadata());
         boolean b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_1.getMetadata());
-        deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_1.getMetaName(),"获取到下料信号:"+b,"1"));
+        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"));
+            deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCConnectNameEnum.STACKING_MACHINE.getMetaName(), "获取到上料信号:" + b1, "1"));
             if (b1) {
                 processService.createPackingMachineUnloadingTask("PM_L_1", 100000);
             }
@@ -66,10 +74,10 @@ public class AMSJob {
      */
     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"));
+        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"));
+            deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCConnectNameEnum.STACKING_MACHINE.getMetaName(), "获取到上料信号:" + b1, "1"));
             if (b1) {
                 processService.createPackingMachineUnloadingTask("PM_L_3", 100001);
             }
@@ -81,10 +89,10 @@ public class AMSJob {
      */
     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"));
+        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"));
+            deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCConnectNameEnum.STACKING_MACHINE.getMetaName(), "获取到上料信号:" + b1, "1"));
             if (b1) {
                 processService.createPackingMachineUnloadingTask("PM_L_3", 100002);
             }
@@ -99,7 +107,7 @@ public class AMSJob {
         boolean b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_PALLETS_1.getMetadata());
         deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_1.getMetaName(),"获取到上空信号:"+b,"1"));
         if (b) {
-            processService.createPackingMachineUpEmptyPallets("PM_UP_1",100003);
+        processService.createPackingMachineUpEmptyPallets("PM_UP_1", 100003L);
         }
 
     }
@@ -109,9 +117,9 @@ public class AMSJob {
      */
     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"));
+        deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_2.getMetaName(), "获取到上空信号:" + b, "1"));
         if (b) {
-            processService.createPackingMachineUpEmptyPallets("PM_UP_2",100004);
+            processService.createPackingMachineUpEmptyPallets("PM_UP_2", 100004L);
         }
     }
 
@@ -120,9 +128,9 @@ public class AMSJob {
      */
     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"));
+        deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_3.getMetaName(), "获取到上空信号:" + b, "1"));
         if (b) {
-            processService.createPackingMachineUpEmptyPallets("PM_UP_3",100005);
+            processService.createPackingMachineUpEmptyPallets("PM_UP_3", 100005L);
         }
     }
 
@@ -131,7 +139,7 @@ public class AMSJob {
      */
     public void cleanPLCDeviceLog() {
         int i = deviceLogService.cleanUpDataFromAWeekAgo();
-        log.info("已清除一周前的数据,数量:{}",i);
+        log.info("已清除一周前的数据,数量:{}", i);
     }
 
 }

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

@@ -13,5 +13,5 @@ public interface ProcessService {
      * @param taskType 上空任务类型
      * @param to 上空库位ID
      */
-    void createPackingMachineUpEmptyPallets(String taskType, Integer to);
+    void createPackingMachineUpEmptyPallets(String taskType, Long to);
 }

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

@@ -1,14 +1,22 @@
 package com.ruoyi.taiye.service.impl;
 
+import cn.hutool.extra.spring.SpringUtil;
 import com.ruoyi.ams.business.IBusinessService;
 import com.ruoyi.ams.config.domain.dto.AgvCallDTO;
 import com.ruoyi.ams.config.domain.dto.AgvCallItemDTO;
 import com.ruoyi.ams.config.domain.dto.LotattDTO;
+import com.ruoyi.ams.inv.service.IInvLotAttService;
+import com.ruoyi.ams.inv.service.IInvLotLocIdService;
 import com.ruoyi.ams.task.domain.WcsTask;
 import com.ruoyi.ams.task.mapper.WcsTaskMapper;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.domain.BaseLocationInfo;
 import com.ruoyi.base.service.IBaseLocationInfoService;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.DeviceLog;
+import com.ruoyi.system.enums.PLCConnectNameEnum;
+import com.ruoyi.system.enums.PLCEnum;
+import com.ruoyi.system.init.PlcConnectServiceRunner;
 import com.ruoyi.taiye.service.ProcessService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -16,6 +24,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 @Slf4j
@@ -24,47 +33,74 @@ public class ProcessServiceImpl implements ProcessService {
     @Autowired
     WcsTaskMapper wcsTaskMapper;
 
-    private final String SMID = "";
+    private final String SMID = "100006";
 
     @Autowired
     private IBusinessService iBusinessService;
 
     @Autowired
-    private IBaseLocationInfoService iBaseLocationInfoService;
+    private IBaseLocationInfoService baseLocationInfoService;
+
+    @Autowired
+    private IInvLotLocIdService invLotLocIdService;
+    @Autowired
+    private IInvLotAttService iInvLotAttService;
+
+    @Autowired
+    private PlcConnectServiceRunner plcConnectServiceRunner;
 
     @Override
     public void createPackingMachineUnloadingTask(String taskType, Integer from) {
         WcsTask wcsTask = new WcsTask();
         wcsTask.setLocationTo(SMID);
         List<WcsTask> tasking = wcsTaskMapper.getTasking(wcsTask);
-        if (!tasking.isEmpty()){
+        if (!tasking.isEmpty()) {
+            log.info(taskType + "请求下料存在进行的任务:" + tasking.stream().map(WcsTask::getTaskNo).collect(Collectors.toList()));
             return;
         }
-//        BaseLocationInfo fromLocation = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(SMID, Constant.WAREHOUSE_ID);
-//        fromLocation.setIsEmpty("N");
-//        iBaseLocationInfoService.updateBaseLocationInfo(fromLocation);
         AgvCallDTO agvCallDTO = new AgvCallDTO();
-        agvCallDTO.setLocationFrom(from+"");
+        agvCallDTO.setLocationFrom(from + "");
         agvCallDTO.setLocationTo(SMID);
-        iBusinessService.agvCall(Constant.FLOW_CONFIG_ID.valueOf(taskType).getValue(),agvCallDTO);
+        AjaxResult ajaxResult = iBusinessService.agvCall(Constant.FLOW_CONFIG_ID.valueOf(taskType).getValue(), agvCallDTO);
+        if (ajaxResult.isSuccess()) {
+            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_RECEPTION_1.getMetadata(), true);
+                SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_1.getMetaName(), "任务完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UP_EMPTY_RECEPTION_1.getMetadata() + "值:true", "1"));
+            }
+            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_RECEPTION_2.getMetadata(), true);
+                SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_2.getMetaName(), "任务完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UP_EMPTY_RECEPTION_2.getMetadata() + "值:true", "1"));
+            }
+            if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_UP_3.name())) {
+                plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_RECEPTION_3.getMetadata(), true);
+                SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_3.getMetaName(), "任务完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UP_EMPTY_RECEPTION_3.getMetadata() + "值:true", "1"));
+            }
+            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).writeBoolean(PLCEnum.STACKING_MACHINE_FEEDING_RECEPTION.getMetadata(), true);
+            SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCConnectNameEnum.STACKING_MACHINE.getMetaName(), "任务完成修改PLC数值,地址:" + PLCEnum.STACKING_MACHINE_FEEDING_RECEPTION.getMetadata() + "值:true", "1"));
+        }
     }
 
     @Override
-    public void createPackingMachineUpEmptyPallets(String taskType, Integer to) {
+    public void createPackingMachineUpEmptyPallets(String taskType, Long to) {
         WcsTask wcsTask = new WcsTask();
-        wcsTask.setLocationTo(to+"");
+        wcsTask.setLocationTo(to + "");
         List<WcsTask> tasking = wcsTaskMapper.getTasking(wcsTask);
-        if (!tasking.isEmpty()){
+        if (!tasking.isEmpty()) {
+            log.info(taskType + "请求上空托存在进行的任务:" + tasking.stream().map(WcsTask::getTaskNo).collect(Collectors.toList()));
             return;
         }
+        iInvLotAttService.deleteInvLotAttBylocationId(to);
+        invLotLocIdService.deleteInvLotLocIdById(to);
+        baseLocationInfoService.updateLocationIdleAndEmpty(to, Constant.WAREHOUSE_ID, "AMS");
         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(to + "");
         agvCallDTO.setAgvCallItemDTOList(agvCallItemDTOList);
-        iBusinessService.agvCall(Constant.FLOW_CONFIG_ID.valueOf(taskType).getValue(),agvCallDTO);
+        iBusinessService.agvCall(Constant.FLOW_CONFIG_ID.valueOf(taskType).getValue(), agvCallDTO);
     }
+
 }

+ 1 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -119,6 +119,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/device/log/writeBoolean/{plcName}/{plcSignal}").permitAll()
                 // 库位视图
                 .antMatchers("/ams/locationView/**").permitAll()
+                .antMatchers("/device/log/**").permitAll()
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()
                 .and()

+ 4 - 9
ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java

@@ -79,21 +79,16 @@ public abstract class AbstractQuartzJob implements Job
         sysJobLog.setInvokeTarget(sysJob.getInvokeTarget());
         sysJobLog.setStartTime(startTime);
         sysJobLog.setStopTime(new Date());
-//        long runMs = sysJobLog.getStopTime().getTime() - sysJobLog.getStartTime().getTime();
-//        sysJobLog.setJobMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒");
+        long runMs = sysJobLog.getStopTime().getTime() - sysJobLog.getStartTime().getTime();
+        sysJobLog.setJobMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒");
         if (e != null)
         {
             sysJobLog.setStatus(Constants.FAIL);
             String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000);
             sysJobLog.setExceptionInfo(errorMsg);
+            // 写入数据库当中
+            SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog);
         }
-        else
-        {
-            sysJobLog.setStatus(Constants.SUCCESS);
-        }
-
-        // 写入数据库当中
-        SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog);
     }
 
     /**

+ 72 - 1
ruoyi-system/src/main/java/com/ruoyi/system/enums/PLCEnum.java

@@ -105,7 +105,78 @@ public enum PLCEnum {
     /**
      * 叠包机上料完成信号
      */
-    STACKING_MACHINE_FEEDING_FINISH("DB5000.0.0");
+    STACKING_MACHINE_FEEDING_FINISH("DB5000.0.1"),
+
+    /**
+     * 一号包装机下料接收返回信号
+     */
+    PACKING_MACHINE_UNLOADING_RECEPTION_1("DB5000.1.2"),
+
+    /**
+     * 二号包装机下料接收返回信号
+     */
+    PACKING_MACHINE_UNLOADING_RECEPTION_2("DB5000.1.2"),
+
+    /**
+     * 三号包装机下料接收返回信号
+     */
+    PACKING_MACHINE_UNLOADING_RECEPTION_3("DB5000.1.2"),
+
+    /**
+     * 一号包装机上空接收返回信号
+     */
+    PACKING_MACHINE_UP_EMPTY_RECEPTION_1("DB5000.0.2"),
+
+    /**
+     * 二号包装机上空接收返回信号
+     */
+    PACKING_MACHINE_UP_EMPTY_RECEPTION_2("DB5000.0.2"),
+
+    /**
+     * 三号包装机上空接收返回信号
+     */
+    PACKING_MACHINE_UP_EMPTY_RECEPTION_3("DB5000.0.2"),
+
+    /**
+     * 叠包机上料接收返回信号
+     */
+    STACKING_MACHINE_FEEDING_RECEPTION("DB5000.0.2"),
+
+
+    /**
+     * 一号包装机下料请求允许进入信号
+     */
+    PACKING_MACHINE_UNLOADING_REQUEST_ENTER_1("DB5000.1.0"),
+
+    /**
+     * 二号包装机下料请求允许进入信号
+     */
+    PACKING_MACHINE_UNLOADING_REQUEST_ENTER_2("DB5000.1.0"),
+
+    /**
+     * 三号包装机下料请求允许进入信号
+     */
+    PACKING_MACHINE_UNLOADING_REQUEST_ENTER_3("DB5000.1.0"),
+
+    /**
+     * 一号包装机上空请求允许进入信号
+     */
+    PACKING_MACHINE_UP_EMPTY_REQUEST_ENTER_1("DB5000.1.0"),
+
+    /**
+     * 二号包装机上空请求允许进入信号
+     */
+    PACKING_MACHINE_UP_EMPTY_REQUEST_ENTER_2("DB5000.0.0"),
+
+    /**
+     * 三号包装机上空请求允许进入信号
+     */
+    PACKING_MACHINE_UP_EMPTY_REQUEST_ENTER_3("DB5000.0.0"),
+
+    /**
+     * 叠包机请求允许进入
+     */
+    STACKING_MACHINE_FEEDING_REQUEST_ENTER("DB5000.0.0"),;
 
     private String metadata;
 

+ 1 - 1
warewms-ams/pom.xml

@@ -24,7 +24,7 @@
         <!-- 系统模块-->
         <dependency>
             <groupId>com.ruoyi</groupId>
-            <artifactId>ruoyi-system</artifactId>
+                <artifactId>ruoyi-system</artifactId>
         </dependency>
 
         <dependency>

+ 57 - 39
warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/service/impl/StatusUpdateServiceImpl.java

@@ -156,48 +156,66 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
     }
 
     private boolean AGVUnloadOrPickUpSafetyJudgment(AmsTask amsTask, String type) {
-        WcsTask wcsTask = wcsTaskMapper.selectWcsTaskByTaskNo(amsTask.getTaskNo());
-        if (Constant.FLOW_CONFIG_ID.M_EP.name().equals(wcsTask.getTaskType())) {
-            return true;
-        }
-        boolean b = false;
-        if (AGV_ACTION.UNLOAD.getValue().equals(type)) {
-            if ("PM_L".equals(wcsTask.getTaskType().substring(0, 4))) {
-                b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).readBoolean(PLCEnum.STACKING_MACHINE_FEEDING_ENTER.getMetadata());
-                log.info("叠包机允许进入信号,{}", b);
-                return b;
-            }
-            switch (wcsTask.getTaskType()) {
-                case "PM_UP_1":
-                    b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_ENTER_1.getMetadata());
-                    log.info("一号打包机允许进入上空托区域信号,{}", b);
-                    break;
-                case "PM_UP_2":
-                    b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_ENTER_2.getMetadata());
-                    log.info("二号打包机允许进入上空托区域信号,{}", b);
-                    break;
-                case "PM_UP_3":
-                    b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_ENTER_3.getMetadata());
-                    log.info("三号打包机允许进入上空托区域信号,{}", b);
-                    break;
+        String PLCConnectName = null;
+        String theAddressOfTheRequest = null;
+        String enterTheSignalAddress = null;
+        try {
+            WcsTask wcsTask = wcsTaskMapper.selectWcsTaskByTaskNo(amsTask.getTaskNo());
+            if (Constant.FLOW_CONFIG_ID.M_EP.name().equals(wcsTask.getTaskType())) {
+                return true;
             }
-        } else {
-            switch (wcsTask.getTaskType()) {
-                case "PM_L_1":
-                    b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_ENTER_1.getMetadata());
-                    log.info("一号打包机允许进入下料区域信号,{}", b);
-                    break;
-                case "PM_L_2":
-                    b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_ENTER_2.getMetadata());
-                    log.info("二号打包机允许进入下料区域信号,{}", b);
-                    break;
-                case "PM_L_3":
-                    b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_ENTER_3.getMetadata());
-                    log.info("三号号打包机允许进入下料区域信号,{}", b);
-                    break;
+            if (AGV_ACTION.UNLOAD.getValue().equals(type)) {
+                if ("PM_L".equals(wcsTask.getTaskType().substring(0, 4))) {
+                    PLCConnectName = PLCConnectNameEnum.STACKING_MACHINE.getMetadata();
+                    theAddressOfTheRequest = PLCEnum.STACKING_MACHINE_FEEDING_REQUEST_ENTER.getMetadata();
+                    enterTheSignalAddress = PLCEnum.STACKING_MACHINE_FEEDING_ENTER.getMetadata();
+                } else {
+                    switch (wcsTask.getTaskType()) {
+                        case "PM_UP_1":
+                            PLCConnectName = PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata();
+                            theAddressOfTheRequest = PLCEnum.PACKING_MACHINE_UP_EMPTY_REQUEST_ENTER_1.getMetadata();
+                            enterTheSignalAddress = PLCEnum.PACKING_MACHINE_UP_EMPTY_ENTER_1.getMetadata();
+                            break;
+                        case "PM_UP_2":
+                            PLCConnectName = PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata();
+                            theAddressOfTheRequest = PLCEnum.PACKING_MACHINE_UP_EMPTY_REQUEST_ENTER_2.getMetadata();
+                            enterTheSignalAddress = PLCEnum.PACKING_MACHINE_UP_EMPTY_ENTER_2.getMetadata();
+                            break;
+                        case "PM_UP_3":
+                            PLCConnectName = PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata();
+                            theAddressOfTheRequest = PLCEnum.PACKING_MACHINE_UP_EMPTY_REQUEST_ENTER_3.getMetadata();
+                            enterTheSignalAddress = PLCEnum.PACKING_MACHINE_UP_EMPTY_ENTER_3.getMetadata();
+                            break;
+                    }
+                }
+            } else {
+                switch (wcsTask.getTaskType()) {
+                    case "PM_L_1":
+                        PLCConnectName = PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata();
+                        theAddressOfTheRequest = PLCEnum.PACKING_MACHINE_UNLOADING_REQUEST_ENTER_1.getMetadata();
+                        enterTheSignalAddress = PLCEnum.PACKING_MACHINE_UNLOADING_ENTER_1.getMetadata();
+                        break;
+                    case "PM_L_2":
+                        PLCConnectName = PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata();
+                        theAddressOfTheRequest = PLCEnum.PACKING_MACHINE_UNLOADING_REQUEST_ENTER_2.getMetadata();
+                        enterTheSignalAddress = PLCEnum.PACKING_MACHINE_UNLOADING_ENTER_2.getMetadata();
+                        break;
+                    case "PM_L_3":
+                        PLCConnectName = PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata();
+                        theAddressOfTheRequest = PLCEnum.PACKING_MACHINE_UNLOADING_REQUEST_ENTER_3.getMetadata();
+                        enterTheSignalAddress = PLCEnum.PACKING_MACHINE_UNLOADING_ENTER_3.getMetadata();
+                        break;
+                }
             }
+            log.info("正在请求:PLC:{}请求写入地址{},请求进入地址{}",PLCConnectName,theAddressOfTheRequest,enterTheSignalAddress);
+            plcConnectServiceRunner.getPlcServer(PLCConnectName).writeBoolean(theAddressOfTheRequest, true);
+            Thread.sleep(1000L);
+            plcConnectServiceRunner.getPlcServer(PLCConnectName).writeBoolean(theAddressOfTheRequest, false);
+            return plcConnectServiceRunner.getPlcServer(PLCConnectName).readBoolean(enterTheSignalAddress);
+        } catch (Exception e) {
+            log.error("AGV安全握发生故障,PLC:{}请求写入地址{},请求进入地址{},msg:",PLCConnectName,theAddressOfTheRequest,enterTheSignalAddress, e);
+            return false;
         }
-        return b;
     }
 
     @Override

+ 31 - 116
warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java

@@ -137,14 +137,14 @@ public class BusinessServiceImpl implements IBusinessService {
 
                 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");
+                    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_UP".equals(flowConfigHeaderVO.getRemark())){
+                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);
@@ -152,9 +152,6 @@ public class BusinessServiceImpl implements IBusinessService {
                             , 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);
-                    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));
                 }
             }
@@ -259,121 +256,39 @@ public class BusinessServiceImpl implements IBusinessService {
     @Override
     public BaseLocationInfo zoneLocationAllocation(List<BaseLocationInfo> locationInfoList, String locationType
             , String type, AsnSoStrategy asnSoStrategy, Long token) {
-        BaseLocationInfo locationInfo = null;
-        if (type.equals("ASN")) {
-            //入库
-            if (locationType.equals("locationFrom")) {
-                for (BaseLocationInfo b : locationInfoList) {
-                    if (!b.getStockStatus().equals("00")) {
-                        continue;
-                    }
-                    if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
-                        continue;
-                    }
-                    locationInfo = b;
-                    break;
-                }
-                if (locationInfo == null) {
-                    throw new ServiceException("入库起始库位没有可以分配的空库位", token);
-                }
-            } else {
-                for (BaseLocationInfo b : locationInfoList) {
-                    if (!b.getStockStatus().equals("00") || !b.getIsEmpty().equals("Y") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
-                        continue;
-                    }
-                    // 第六层不能放数量超过2的货
-                    int boxNum = Integer.parseInt(asnSoStrategy.getAsnHeightLimit());
-                    if (b.getShiftNo().equals("6")) {
-                        if (boxNum > 2) continue;
-                    } else {
-                        // 其他层数放置箱子数量不能超过6
-                        if (boxNum > 6) {
-                            log.error("入库箱数量不能超过6!");
-                            continue;
-                        }
-                    }
-                    if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
-                        continue;
-                    }
-                    locationInfo = b;
-                    break;
-                }
-                if (locationInfo == null) {
-                    throw new ServiceException("入库目标点没有可以分配的库位", token);
-                }
-            }
-        } else if (type.equals("SO")) {
-            //起始库位
-            if (locationType.equals("locationFrom")) {
-                for (BaseLocationInfo b : locationInfoList) {
-                    if (!b.getStockStatus().equals("00") || !b.getIsEmpty().equals("N") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
-                        continue;
-                    }
-                    if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
-                        continue;
-                    }
-                    // 判断起始库位上的库存质检状态是否可以出库
-                    boolean con = invLotLocIdService.verifyInventoryCanOutbound(b.getId().toString());
-                    if (!con) {
-                        continue;
-                    }
-                    locationInfo = b;
-                    break;
-                }
-                if (locationInfo == null) {
-                    throw new ServiceException("出库起始点没有可以分配的库存!", token);
-                }
+        BaseLocationInfo locationInfo = null;//移库
+        if (locationType.equals("locationFrom")) {
 
-            } else { //目标库位
-                for (BaseLocationInfo b : locationInfoList) {
-                    if (!b.getStockStatus().equals("00") || !b.getIsEmpty().equals("Y") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
-                        continue;
-                    }
-                    if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
-                        continue;
-                    }
-                    locationInfo = b;
-                    break;
+            for (BaseLocationInfo b : locationInfoList) {
+                if (!b.getStockStatus().equals("00") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
+                    continue;
                 }
-                if (locationInfo == null) {
-                    throw new ServiceException("出库目标点没有可以分配的库位", token);
+                if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
+                    continue;
                 }
+                locationInfo = b;
+                break;
             }
-        } else { //移库
-            if (locationType.equals("locationFrom")) {
-
-                for (BaseLocationInfo b : locationInfoList) {
-                    if (!b.getStockStatus().equals("00") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
-                        continue;
-                    }
-                    if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
-                        continue;
-                    }
-                    locationInfo = b;
-                    break;
-                }
 
-                //进行判断
-                if (locationInfo == null) {
-                    throw new ServiceException("移库起始点没有可以分配的库位", token);
-                }
+            //进行判断
+            if (locationInfo == null) {
+                throw new ServiceException("移库起始点没有可以分配的库位", token);
+            }
 
-            } else {
-                for (BaseLocationInfo b : locationInfoList) {
-                    if (!b.getStockStatus().equals("00") || !b.getIsEmpty().equals("Y") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
-                        continue;
-                    }
-                    if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
-                        continue;
-                    }
-                    locationInfo = b;
-                    break;
+        } else {
+            for (BaseLocationInfo b : locationInfoList) {
+                if (!b.getStockStatus().equals("00") || !b.getIsEmpty().equals("Y") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
+                    continue;
                 }
-
-                //进行判断
-                if (locationInfo == null) {
-                    throw new ServiceException("移库目标点没有可以分配的库位", token);
+                if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
+                    continue;
                 }
+                locationInfo = b;
+                break;
+            }
+            //进行判断
+            if (locationInfo == null) {
+                throw new ServiceException("移库目标点没有可以分配的库位", token);
             }
         }
         return locationInfo;
@@ -691,7 +606,7 @@ public class BusinessServiceImpl implements IBusinessService {
 //                return false;
 //            }
 
-            //起始库位巷道检测(起始库位检测是否同巷道)
+        //起始库位巷道检测(起始库位检测是否同巷道)
 //            if (!StringUtils.isEmpty(basLocationInfoFrom.getColNo())) {
 //                List<BaseLocationInfo> locationInfoList = baseLocationInfoMapper.laneCheck(basLocationInfoFrom.getColNo(), "LANE_FROM", Constant.WAREHOUSE_ID);
 //                if (locationInfoList != null && locationInfoList.size() > 0) {

+ 185 - 121
warewms-ams/src/main/java/com/ruoyi/ams/task/service/impl/WcsTaskServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ams.task.service.impl;
 
 import java.lang.reflect.Method;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -10,6 +11,9 @@ import com.ruoyi.ams.agv.ndc.domain.AmsTask;
 import com.ruoyi.ams.agv.ndc.service.IAmsTaskService;
 import com.ruoyi.ams.box.service.IWmsBoxInfoService;
 import com.ruoyi.ams.config.domain.FlowConfigEvent;
+import com.ruoyi.ams.config.domain.dto.AgvCallDTO;
+import com.ruoyi.ams.config.domain.dto.AgvCallItemDTO;
+import com.ruoyi.ams.config.domain.dto.LotattDTO;
 import com.ruoyi.ams.config.service.IFlowConfigEventService;
 import com.ruoyi.ams.inv.domain.InvLotLocId;
 import com.ruoyi.ams.inv.mapper.InvLotLocIdMapper;
@@ -380,127 +384,175 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
             log.info("已取消的任务无需重复取消");
             return AjaxResult.error("已取消的任务无需重复取消");
         }
-        //转发类型任务才回调
-        if (wcsTask.getTaskType().equals(Constant.TASK_TYPE.FORWARD.getValue())) {
-            try {
-                switch (state) {
-                    case 1:
-                        wcsTask.setStartTime(new Date());
-                        break;
-                    case 2://完成
-                        if (wcsTask.getState() != 4
-                                && (StringUtils.isEmpty(wcsTask.getBeforeTask()) || !wcsTask.getBeforeTask().equals("1"))) {
-                            log.info("任务未取货,不能直接完成!" + taskNo);
-                            return AjaxResult.error("任务未取货,不能直接完成!" + taskNo);
-                        }
-                        if (wcsTask.getState() == 2) {
-                            log.info("不能重复放货," + taskNo);
-                            return AjaxResult.error("不能重复放货," + taskNo);
-                        }
-                        wcsTask.setEndTime(new Date());
+        try {
+            switch (state) {
+                case 1:
+                    wcsTask.setStartTime(new Date());
+                    break;
+                case 2://完成
+                    if (wcsTask.getState() != 4
+                            && (StringUtils.isEmpty(wcsTask.getBeforeTask()) || !wcsTask.getBeforeTask().equals("1"))) {
+                        log.info("任务未取货,不能直接完成!" + taskNo);
+                        return AjaxResult.error("任务未取货,不能直接完成!" + taskNo);
+                    }
+                    if (wcsTask.getState() == 2) {
+                        log.info("不能重复放货," + taskNo);
+                        return AjaxResult.error("不能重复放货," + taskNo);
+                    }
+                    wcsTask.setEndTime(new Date());
+                    // 解锁终点库位
+                    baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationTo())
+                            , Constant.WAREHOUSE_ID, updateBy);
+                    // 将中间缓存位库存移动到终点
+                    moveMiddleCacheToDestination(wcsTask);
+
+                    //释放redis锁
+                    if (!StringUtils.isEmpty(wcsTask.getExt8())) {
+                        redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
+                    }
+
+                    //叠包机
+                    if ("PM_L".equals(wcsTask.getTaskType().substring(0, 4))) {
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).writeBoolean(PLCEnum.STACKING_MACHINE_FEEDING_FINISH.getMetadata(), true);
+                        Thread.sleep(3000L);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).writeBoolean(PLCEnum.STACKING_MACHINE_FEEDING_FINISH.getMetadata(), false);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).writeBoolean(PLCEnum.STACKING_MACHINE_FEEDING_RECEPTION.getMetadata(), false);
+                        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCConnectNameEnum.STACKING_MACHINE.getMetaName(), "任务完成修改PLC数值,地址:" + PLCEnum.STACKING_MACHINE_FEEDING_FINISH.getMetadata() + "值:true", "1"));
+                        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCConnectNameEnum.STACKING_MACHINE.getMetaName(), "任务完成修改PLC数值,地址:" + PLCEnum.STACKING_MACHINE_FEEDING_RECEPTION.getMetadata() + "值:false", "1"));
+                    }
+                    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);
+                        Thread.sleep(3000L);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_1.getMetadata(), false);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_RECEPTION_1.getMetadata(), false);
+
+                        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_1.getMetaName(), "任务完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_1.getMetadata() + "值:true", "1"));
+                        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_1.getMetaName(), "任务完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UP_EMPTY_RECEPTION_1.getMetadata() + "值:false", "1"));
+                    }
+                    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);
+                        Thread.sleep(3000L);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_2.getMetadata(), false);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_RECEPTION_2.getMetadata(), false);
+
+                        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_2.getMetaName(), "任务完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_2.getMetadata() + "值:true", "1"));
+                        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_2.getMetaName(), "任务完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UP_EMPTY_RECEPTION_2.getMetadata() + "值:false", "1"));
+                    }
+                    if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_UP_3.name())) {
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_3.getMetadata(), true);
+                        Thread.sleep(3000L);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_3.getMetadata(), false);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_RECEPTION_3.getMetadata(), false);
+
+                        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_3.getMetaName(), "任务完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_3.getMetadata() + "值:true", "1"));
+                        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_3.getMetaName(), "任务完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UP_EMPTY_RECEPTION_3.getMetadata() + "值:false", "1"));
+                    }
+                    break;
+                case 3:
+                    break;
+                case 4:
+                    if (wcsTask.getState() == 4) {
+                        log.info("不能重复取货," + taskNo);
+                        return AjaxResult.error("不能重复取货," + taskNo);
+                    }
+                    // 标记已经取货完成
+                    wcsTask.setBeforeTask("1");
+                    // 解锁起始库位
+                    baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom())
+                            , Constant.WAREHOUSE_ID, updateBy);
+                    // 将起始点库存移动到中间缓存位
+                    moveStartingPointToMiddleCache(wcsTask);
+                    //释放redis锁
+                    if (!StringUtils.isEmpty(wcsTask.getExt8())) {
+                        System.out.println(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_1.getMetadata(), true);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_RECEPTION_1.getMetadata(), true);
+                        Thread.sleep(3000L);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_Leave_1.getMetadata(), false);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_RECEPTION_1.getMetadata(), false);
+
+                        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_1.getMetaName(), "取货完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UNLOADING_Leave_1.getMetadata() + "值:true", "1"));
+                        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_1.getMetaName(), "取货完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UNLOADING_RECEPTION_1.getMetadata() + "值:true", "1"));
+                    }
+                    if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_L_2.name())) {
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_Leave_2.getMetadata(), true);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_RECEPTION_2.getMetadata(), true);
+                        Thread.sleep(3000L);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_Leave_2.getMetadata(), false);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_RECEPTION_2.getMetadata(), false);
+
+                        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_2.getMetaName(), "取货完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UNLOADING_Leave_2.getMetadata() + "值:true", "1"));
+                        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_2.getMetaName(), "取货完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UNLOADING_RECEPTION_2.getMetadata() + "值:true", "1"));
+                    }
+                    if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_L_3.name())) {
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_Leave_3.getMetadata(), true);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_RECEPTION_1.getMetadata(), true);
+                        Thread.sleep(3000L);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_Leave_3.getMetadata(), false);
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_RECEPTION_3.getMetadata(), false);
+
+                        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_3.getMetaName(), "取货完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UNLOADING_Leave_3.getMetadata() + "值:true", "1"));
+                        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata(), PLCConnectNameEnum.PACKING_MACHINE_3.getMetaName(), "取货完成修改PLC数值,地址:" + PLCEnum.PACKING_MACHINE_UNLOADING_RECEPTION_3.getMetadata() + "值:true", "1"));
+                    }
+                    break;
+                case 5:
+                    break;
+                case 6://卸货
+                    if (wcsTask.getState() != 4
+                            && (StringUtils.isEmpty(wcsTask.getBeforeTask()) || !wcsTask.getBeforeTask().equals("1"))) {
+                        log.info("任务未取货,不能直接完成!" + taskNo);
+                        return AjaxResult.error("任务未取货,不能直接完成!" + taskNo);
+                    }
+                    if (wcsTask.getState() == 2) {
+                        log.info("不能重复放货," + taskNo);
+                        return AjaxResult.error("不能重复放货," + taskNo);
+                    }
+                    if (wcsTask.getState() == 6) {
+                        return AjaxResult.error("不能重复放货," + taskNo);
+                    }
+                    wcsTask.setEndTime(new Date());
+                    // 解锁终点库位
+                    baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationTo())
+                            , Constant.WAREHOUSE_ID, updateBy);
+                    // 将中间缓存位库存移动到终点
+                    moveMiddleCacheToDestination(wcsTask);
+                    //释放redis锁
+                    if (!StringUtils.isEmpty(wcsTask.getExt8())) {
+                        redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
+                    }
+                    break;
+                case 7://取消
+                    wcsTask.setEndTime(new Date());
+                    //如果取到货就只解锁终点库位
+                    if (wcsTask.getState() == 4 || wcsTask.getState() == 5) {
                         // 解锁终点库位
                         baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationTo())
                                 , Constant.WAREHOUSE_ID, updateBy);
-                        // 将中间缓存位库存移动到终点
-                        moveMiddleCacheToDestination(wcsTask);
-                        //叠包机
-                        if ("PM_L".equals(wcsTask.getTaskType().substring(0, 4))) {
-                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).writeBoolean(PLCEnum.STACKING_MACHINE_FEEDING_FINISH.getMetadata(), true);
-                            SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.STACKING_MACHINE.getMetadata(),PLCConnectNameEnum.STACKING_MACHINE.getMetaName(),"任务完成修改PLC数值,地址:"+PLCEnum.STACKING_MACHINE_FEEDING_FINISH.getMetadata()+"值:true","1"));
-                        }
-                        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);
-                            SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_1.getMetaName(),"任务完成修改PLC数值,地址:"+PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_1.getMetadata()+"值:true","1"));
-                        }
-                        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);
-                            SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_2.getMetaName(),"任务完成修改PLC数值,地址:"+PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_2.getMetadata()+"值:true","1"));
-                        }
-                        if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_UP_3.name())) {
-                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_3.getMetadata(), true);
-                            SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_3.getMetaName(),"任务完成修改PLC数值,地址:"+PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_3.getMetadata()+"值:true","1"));
-                        }
-                        break;
-                    case 3:
-                        break;
-                    case 4:
-                        if (wcsTask.getState() == 4) {
-                            log.info("不能重复取货," + taskNo);
-                            return AjaxResult.error("不能重复取货," + taskNo);
-                        }
-                        if (wcsTask.getBeforeTask() != null && wcsTask.getBeforeTask().equals("1")) {
-                            log.info("不能重复取货," + taskNo);
-                            return AjaxResult.error("不能重复取货," + taskNo);
-                        }
-                        // 标记已经取货完成
-                        wcsTask.setBeforeTask("1");
-                        // 解锁起始库位
-                        baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom())
+                    } else {
+                        // 解锁终点和起始库位
+                        baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()), Long.parseLong(wcsTask.getLocationTo())
                                 , Constant.WAREHOUSE_ID, updateBy);
-                        // 将起始点库存移动到中间缓存位
-                        moveStartingPointToMiddleCache(wcsTask);
-                        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_1.getMetadata(), true);
-                            SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_1.getMetaName(),"取货完成修改PLC数值,地址:"+PLCEnum.PACKING_MACHINE_UNLOADING_Leave_1.getMetadata()+"值:true","1"));
-                        }
-                        if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_L_2.name())) {
-                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_Leave_2.getMetadata(), true);
-                            SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_2.getMetaName(),"取货完成修改PLC数值,地址:"+PLCEnum.PACKING_MACHINE_UNLOADING_Leave_2.getMetadata()+"值:true","1"));
-                        }
-                        if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_L_3.name())) {
-                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_Leave_3.getMetadata(), true);
-                            SpringUtil.getApplicationContext().publishEvent(new DeviceLog(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata(),PLCConnectNameEnum.PACKING_MACHINE_3.getMetaName(),"取货完成修改PLC数值,地址:"+PLCEnum.PACKING_MACHINE_UNLOADING_Leave_3.getMetadata()+"值:true","1"));
-                        }
-                        break;
-                    case 5:
-                        break;
-                    case 6://卸货
-                        if (wcsTask.getState() != 4
-                                && (StringUtils.isEmpty(wcsTask.getBeforeTask()) || !wcsTask.getBeforeTask().equals("1"))) {
-                            log.info("任务未取货,不能直接完成!" + taskNo);
-                            return AjaxResult.error("任务未取货,不能直接完成!" + taskNo);
-                        }
-                        if (wcsTask.getState() == 2) {
-                            log.info("不能重复放货," + taskNo);
-                            return AjaxResult.error("不能重复放货," + taskNo);
-                        }
-                        if (wcsTask.getState() == 6) {
-                            return AjaxResult.error("不能重复放货," + taskNo);
-                        }
-                        wcsTask.setEndTime(new Date());
-                        // 解锁终点库位
-                        baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationTo())
-                                , Constant.WAREHOUSE_ID, updateBy);
-                        // 将中间缓存位库存移动到终点
-                        moveMiddleCacheToDestination(wcsTask);
-                        break;
-                    case 7://取消
-                        wcsTask.setEndTime(new Date());
-                        //如果取到货就只解锁终点库位
-                        if (wcsTask.getState() == 4 || wcsTask.getState() == 5) {
-                            // 解锁终点库位
-                            baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationTo())
-                                    , Constant.WAREHOUSE_ID, updateBy);
-                        } else {
-                            // 解锁终点和起始库位
-                            baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()), Long.parseLong(wcsTask.getLocationTo())
-                                    , Constant.WAREHOUSE_ID, updateBy);
-                        }
-                        break;
-                    case 8:
-                        log.error("任务异常状态------------" + wcsTask.getTaskNo());
-                        break;
-                    default:
-                        break;
-                }
-            } catch (Exception e) {
-                log.info(wcsTask.getTaskNo() + "-----" + "回调状态:" + state + "异常", e);
-                wcsTask.setRemark("回调状态:" + state + "异常");
-                SpringUtil.getApplicationContext().publishEvent(new DeviceLog(wcsTask.getTaskNo(),"AGV","任务失败,发生异常:"+e.getMessage(),"2"));
-                throw new RuntimeException();
+                    }
+                    //释放redis锁
+                    if (!StringUtils.isEmpty(wcsTask.getExt8())) {
+                        redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
+                    }
+                    break;
+                case 8:
+                    log.error("任务异常状态------------" + wcsTask.getTaskNo());
+                    break;
+                default:
+                    break;
             }
-        } else {
-
+        } catch (Exception e) {
+            log.info(wcsTask.getTaskNo() + "-----" + "回调状态:" + state + "异常", e);
+            wcsTask.setRemark("回调状态:" + state + "异常");
+            SpringUtil.getApplicationContext().publishEvent(new DeviceLog(wcsTask.getTaskNo(), "AGV", "任务失败,发生异常:" + e.getMessage(), "2"));
+            throw new RuntimeException();
         }
         wcsTask.setState(state.longValue());
         wcsTask.setUpdateDate(new Date());
@@ -508,6 +560,7 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
         return AjaxResult.success("操作成功!");
     }
 
+
     /**
      * 将起点库存放到中间缓存位置
      *
@@ -598,15 +651,26 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
     }
 
     @Override
+    @Transactional
     public int moveEmptyPallets(WcsTask wcsTask) {
         BaseLocationInfo formAddress = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(wcsTask.getLocationFrom(), Constant.WAREHOUSE_ID);
         if (ObjectUtil.isNull(formAddress)) {
             throw new BaseException("起始位置不存在");
         }
+        //修改库存
+        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.setAgvCallItemDTOList(agvCallItemDTOList);
+        invLotLocIdService.initInv(String.valueOf(formAddress.getId()), agvCallDTO);
+
         WcsTask task = new WcsTask();
-        task.setLocationFrom(formAddress.getId()+"");
+        task.setLocationFrom(formAddress.getId() + "");
         List<WcsTask> tasking = wcsTaskMapper.getTasking(task);
-        if (!tasking.isEmpty()){
+        if (!tasking.isEmpty()) {
             throw new BaseException("起始位置存在任务!");
         }
         BaseLocationInfo toAddress = null;
@@ -617,14 +681,14 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
         List<BaseLocationInfo> baseLocationInfos = iBaseLocationInfoService.selectBaseLocationInfoList(baseLocationInfo);
         for (BaseLocationInfo locationInfo : baseLocationInfos) {
             task = new WcsTask();
-            task.setLocationTo(locationInfo.getId()+"");
+            task.setLocationTo(locationInfo.getId() + "");
             tasking = wcsTaskMapper.getTasking(task);
-            if (!tasking.isEmpty()){
+            if (!tasking.isEmpty()) {
                 continue;
             }
             toAddress = locationInfo;
         }
-        if (ObjectUtil.isNull(toAddress)){
+        if (ObjectUtil.isNull(toAddress)) {
             throw new BaseException("没有合适的空库位");
         }
         WcsTask wcsTask1 = new WcsTask();

+ 1 - 1
warewms-base/src/main/resources/mapper/base/BaseLocationInfoMapper.xml

@@ -182,7 +182,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isEmpty != null  and isEmpty != ''"> and is_empty = #{isEmpty}</if>
             <if test="locationType != null  and locationType != ''"> and location_type = #{locationType}</if>
         </where>
-        order by location_no
+        order by col_no + 0,col_index
     </select>
 
     <select id="selectBaseLocationInfoByLocationNo" parameterType="BaseLocationInfo" resultMap="BaseLocationInfoResult">