Browse Source

拆盘机、叠盘机呼叫生成搬运任务

dfsfs 1 year ago
parent
commit
2f6a2aca89
26 changed files with 983 additions and 289 deletions
  1. 20 0
      pom.xml
  2. 51 0
      ruoyi-admin/src/main/java/com/ruoyi/bionutrition/plc/PlcSignalTestController.java
  3. 16 45
      ruoyi-admin/src/main/resources/application-dev.yml
  4. 16 48
      ruoyi-admin/src/main/resources/application-prod.yml
  5. 10 0
      warewms-ams/pom.xml
  6. 2 1
      warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/service/impl/SocketBufferServiceImpl.java
  7. 70 1
      warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/service/impl/StatusUpdateServiceImpl.java
  8. 33 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/config/PlcConfig.java
  9. 22 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/config/PlcProperties.java
  10. 32 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/enums/PLCConnectNameEnum.java
  11. 119 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/enums/PLCEnum.java
  12. 154 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/init/PlcConnectServiceRunner.java
  13. 93 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/job/AMSJob.java
  14. 18 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/service/ProcessService.java
  15. 103 0
      warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/service/impl/ProcessServiceImpl.java
  16. 3 2
      warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java
  17. 2 6
      warewms-ams/src/main/java/com/ruoyi/ams/inv/service/impl/InvLotLocIdServiceImpl.java
  18. 75 76
      warewms-ams/src/main/java/com/ruoyi/ams/task/domain/WcsTask.java
  19. 2 0
      warewms-ams/src/main/java/com/ruoyi/ams/task/mapper/WcsTaskMapper.java
  20. 75 0
      warewms-ams/src/main/java/com/ruoyi/ams/task/service/impl/WcsTaskServiceImpl.java
  21. 1 1
      warewms-ams/src/main/resources/mapper/ams/InvLotLocIdMapper.xml
  22. 20 0
      warewms-ams/src/main/resources/mapper/ams/WcsTaskMapper.xml
  23. 8 52
      warewms-base/src/main/java/com/ruoyi/base/constant/Constant.java
  24. 5 15
      warewms-base/src/main/java/com/ruoyi/base/domain/BaseSku.java
  25. 1 1
      warewms-base/src/main/resources/mapper/base/BaseLocationInfoMapper.xml
  26. 32 41
      warewms-base/src/main/resources/mapper/base/BaseSkuMapper.xml

+ 20 - 0
pom.xml

@@ -36,6 +36,8 @@
         <jwt.version>0.9.1</jwt.version>
         <skipTests>true</skipTests>
         <guava.version>23.0</guava.version>
+        <guava.retry.version>2.0.0</guava.retry.version>
+        <iotCommunication.version>1.4.2</iotCommunication.version>
     </properties>
 
     <!-- 依赖声明 -->
@@ -228,6 +230,24 @@
                 <version>${warewms.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>${guava.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.github.rholder</groupId>
+                <artifactId>guava-retrying</artifactId>
+                <version>${guava.retry.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.github.xingshuangs</groupId>
+                <artifactId>iot-communication</artifactId>
+                <version>${iotCommunication.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 

+ 51 - 0
ruoyi-admin/src/main/java/com/ruoyi/bionutrition/plc/PlcSignalTestController.java

@@ -0,0 +1,51 @@
+package com.ruoyi.bionutrition.plc;
+
+import com.ruoyi.ams.bionutrition.plc.init.PlcConnectServiceRunner;
+import com.ruoyi.common.core.domain.AjaxResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+@Slf4j
+@RestController
+@RequestMapping("/plcWriteOrReadSignal")
+@Valid
+public class PlcSignalTestController {
+
+    @Autowired
+    PlcConnectServiceRunner plcConnectServiceRunner;
+
+    /**
+     * plc写数据测试
+     * @param plcSignal
+     * @param plcName
+     * @return
+     */
+    @GetMapping("/writeByte/{plcName}/{plcSignal}/{value}")
+    public AjaxResult writeByte(@PathVariable String plcName, @PathVariable String plcSignal, @PathVariable byte value)
+    {
+        log.info("==={}:{}:{}",plcName,plcSignal,value);
+        plcConnectServiceRunner.getPlcServer(plcName).writeByte(plcSignal, value);
+        return AjaxResult.success();
+    }
+
+    /**
+     * plc读数据测试
+     * @param plcName
+     * @param plcSignal
+     * @return
+     */
+    @GetMapping("/readByte/{plcName}/{plcSignal}")
+    public AjaxResult readByte(@PathVariable String plcName, @PathVariable String plcSignal)
+    {
+        byte value = plcConnectServiceRunner.getPlcServer(plcName).readByte(plcSignal);
+        log.info("==={}:{}:{}",plcName,plcSignal,value);
+        return AjaxResult.success();
+    }
+
+}

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

@@ -90,49 +90,20 @@ init-task:
     autosend: false # 自动下发任务
     aciservice: false # ndc通讯
 
-modbus:
-    tcp-master:
-        first: # 自动门(靠马路)
-            open: false
-            host: 192.168.42.201
-            port: 9000
-        second: # 自动门(靠里面)
-            open: false
-            host: 192.168.42.202
-            port: 9000
-        sixth: # 自动门(靠马路-第二层)
-            open: false
-            host: 192.168.42.210
-            port: 9000
-        seventh: # 卷帘门
-            open: false
-            host: 192.168.42.211
-            port: 9000
-        third: # 按钮盒
-            open: false
-            host: 192.168.42.205
-            port: 9000
-        fourth: # 充电机(三向车)
-            open: false
-            host: 192.168.42.208
-            port: 8899
-        fifth: # 充电机(迷你堆垛)
-            open: false
-            host: 192.168.42.209
-            port: 8899
-
-# 注意:这玩意只能跑在window上
-rfid:
-  first:
-      open: false
-      host: 169.168.42.203
-      port: 5084
-      number-of-tags: 3 # 一次读取标签的数量
-      timeout-milliseconds: 5000
-  second: # 靠里面
-      open: false
-      host: 192.168.42.204
-      port: 5084
-      number-of-tags: 3 # 一次读取标签的数量
-      timeout-milliseconds: 5000
+# plc连接配置
+plc:
+    plcList[0]:
+        ip: 192.168.88.42
+        enable: false
+        name: stacking_machine
+        ePlcType: S1200
+        heartbeat: DB101
+        confirmTheStatus:
+    plcList[1]:
+        ip: 192.168.88.40
+        enable: false
+        name: dismantling_machine
+        ePlcType: S1200
+        heartbeat: DB101
+        confirmTheStatus:
 

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

@@ -88,51 +88,19 @@ init-task:
     autosend: true # 自动下发任务
     aciservice: true # ndc通讯
 
-
-# modbus-tcp
-modbus:
-    tcp-master:
-        first: # 自动门(靠马路)
-            open: false
-            host: 192.168.42.201
-            port: 9000
-        second: # 自动门(靠里面)
-            open: false
-            host: 192.168.42.202
-            port: 9000
-        sixth: # 自动门(靠马路-第二层)
-            open: false
-            host: 192.168.42.210
-            port: 9000
-        seventh: # 卷帘门
-            open: false
-            host: 192.168.42.211
-            port: 9000
-        third: # 按钮盒
-            open: false
-            host: 192.168.42.205
-            port: 9000
-        fourth: # 充电机(三向车)
-            open: false
-            host: 192.168.42.208
-            port: 8899
-        fifth: # 充电机(迷你堆垛)
-            open: false
-            host: 192.168.42.209
-            port: 8899
-
-
-rfid:
-    first: # 靠马路
-        open: false
-        host: 192.168.42.203
-        port: 5084
-        number-of-tags: 3 # 一次读取标签的数量
-        timeout-milliseconds: 5000
-    second: # 靠里面
-        open: false
-        host: 192.168.42.204
-        port: 5084
-        number-of-tags: 3 # 一次读取标签的数量
-        timeout-milliseconds: 5000
-
+# plc连接配置
+plc:
+    plcList[0]:
+        ip: 192.168.88.42
+        enable: false
+        name: stacking_machine
+        ePlcType: S1200
+        heartbeat: DB101
+        confirmTheStatus:
+    plcList[1]:
+        ip: 192.168.88.40
+        enable: false
+        name: dismantling_machine
+        ePlcType: S1200
+        heartbeat: DB101
+        confirmTheStatus:

+ 10 - 0
warewms-ams/pom.xml

@@ -30,6 +30,16 @@
             <artifactId>spring-retry</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.rholder</groupId>
+            <artifactId>guava-retrying</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.xingshuangs</groupId>
+            <artifactId>iot-communication</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 2 - 1
warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/service/impl/SocketBufferServiceImpl.java

@@ -127,6 +127,7 @@ public class SocketBufferServiceImpl implements SocketBufferService {
         AmsNdcEvent event = new AmsNdcEvent();
         event.setType(parameters[13] & 0xff);
         event.setEcode((int) ByteUtil.getShort(parameters, 16));
+        log.info("----ddeCode:{}", event.getEcode());
         AmsNdcEvent eventBean = amsNdcEventService.selectAmsNdcEventByModel(event);
         if (eventBean != null) {
 
@@ -138,7 +139,7 @@ public class SocketBufferServiceImpl implements SocketBufferService {
             event.setLp4("" + ByteUtil.getInt(parameters, 46));
             int eventId = event.getId();
             AmsTask taskBean = new AmsTask();
-
+            log.info("----ddevent:{}", event);
 //            log.info("----event:" + eventId);
             switch (eventId) {
                 case 85://user event ts cancel                  任务取消

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

@@ -5,8 +5,13 @@ import com.ruoyi.ams.agv.ndc.domain.AmsTask;
 import com.ruoyi.ams.agv.ndc.entity.CallbackResult;
 import com.ruoyi.ams.agv.ndc.service.IAmsTaskService;
 import com.ruoyi.ams.agv.ndc.service.StatusUpdateService;
+import com.ruoyi.ams.bionutrition.plc.enums.PLCConnectNameEnum;
+import com.ruoyi.ams.bionutrition.plc.enums.PLCEnum;
+import com.ruoyi.ams.bionutrition.plc.init.PlcConnectServiceRunner;
 import com.ruoyi.ams.business.BusinessServiceImpl;
 import com.ruoyi.ams.business.IBusinessService;
+import com.ruoyi.ams.task.domain.WcsTask;
+import com.ruoyi.ams.task.mapper.WcsTaskMapper;
 import com.ruoyi.ams.task.service.IWcsTaskService;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.common.utils.uuid.SnowflakeIdWorker;
@@ -29,6 +34,10 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
     private IBusinessService businessService;
     @Autowired
     private AutoDoorClient autoDoorClient;
+    @Autowired
+    private WcsTaskMapper wcsTaskMapper;
+    @Autowired
+    private PlcConnectServiceRunner plcConnectServiceRunner;
 
     public enum AGV_ACTION {
         /***
@@ -104,11 +113,17 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
     @Override
     public synchronized void confirmAnalysis(String taskNo, Integer aciIndex, String type, Integer carNo) {
 
-        // todo 读取plc信号 1.12
         AmsTask amsTask = new AmsTask();
         amsTask.setTaskNo(taskNo);
         amsTask = amsTaskService.selectAmsTaskByModel(amsTask);
         if (amsTask != null) {
+            // 进行安全握
+            log.info("进行安全交握......");
+            if (!AGVUnloadOrPickUpSafetyJudgment(taskNo, type)) {
+                log.error("取货或卸货不被允许进入!");
+                return;
+            }
+            log.info("安全交握完成......");
             AmsTask addTaskForm = new AmsTask();
             addTaskForm.setTaskNo(System.currentTimeMillis() + "");
             addTaskForm.setBusinessType(Constant.TASK_BUSINESS_TYPE.TASK_m.getValue());
@@ -141,6 +156,60 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
         }
     }
 
+    /**
+     * AGV准备取卸托盘,与plc安全交握方法
+     * @param taskNo
+     * @param type
+     * @return
+     */
+    private boolean AGVUnloadOrPickUpSafetyJudgment(String taskNo, String type) {
+        String PLCConnectName = null;
+        String theAddressOfTheRequest = null;
+        String enterTheSignalAddress = null;
+        try {
+            WcsTask wcsTask = wcsTaskMapper.selectWcsTaskByTaskNo(taskNo);
+            if (AGV_ACTION.UNLOAD.getValue().equals(type)) {
+                switch (wcsTask.getExtParam()) {
+                    case "CPJ_IN":
+                        PLCConnectName = PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata();
+                        theAddressOfTheRequest = PLCEnum.AGV_TASK_SAFETY_SIGNAL.getMetadata();
+                        enterTheSignalAddress = PLCEnum.DISMANTLING_MACHINE_PLACE_ENTIRE_PALLET_ENABLE.getMetadata();
+                        break;
+                    case "DPJ_IN":
+                        PLCConnectName = PLCConnectNameEnum.STACKING_MACHINE.getMetadata();
+                        theAddressOfTheRequest = PLCEnum.AGV_TASK_SAFETY_SIGNAL.getMetadata();
+                        enterTheSignalAddress = PLCEnum.STACKING_MACHINE_PLACE_PALLET_ENABLE.getMetadata();
+                        break;
+                }
+            } else {
+                switch (wcsTask.getTaskType()) {
+                    case "CPJ_OUT":
+                        PLCConnectName = PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata();
+                        theAddressOfTheRequest = PLCEnum.AGV_TASK_SAFETY_SIGNAL.getMetadata();
+                        enterTheSignalAddress = PLCEnum.DISMANTLING_MACHINE_OUT_PALLET_ENABLE.getMetadata();
+                        break;
+                    case "DPJ_OUT":
+                        PLCConnectName = PLCConnectNameEnum.STACKING_MACHINE.getMetadata();
+                        theAddressOfTheRequest = PLCEnum.AGV_TASK_SAFETY_SIGNAL.getMetadata();
+                        enterTheSignalAddress = PLCEnum.STACKING_MACHINE_OUT_ENTIRE_PALLET_ENABLE.getMetadata();
+                        break;
+                }
+            }
+            log.info("正在请求:PLC:{}写入AGV开始工作地址{},读取无框/有框地址{}",PLCConnectName,theAddressOfTheRequest,enterTheSignalAddress);
+            // 写AGV作业信号 1:开始作业,plc停止运行
+            plcConnectServiceRunner.getPlcServer(PLCConnectName).writeByte(theAddressOfTheRequest, (byte) 1);
+//            Thread.sleep(1000L);
+//            plcConnectServiceRunner.getPlcServer(PLCConnectName).writeBoolean(theAddressOfTheRequest, false);
+            // 如果似乎卸货,读取信号为0,表示无框;取货读取信号为1,表示有框
+            return AGV_ACTION.UNLOAD.getValue().equals(type) ?
+                    plcConnectServiceRunner.getPlcServer(PLCConnectName).readByte(enterTheSignalAddress) == 0
+                    : plcConnectServiceRunner.getPlcServer(PLCConnectName).readByte(enterTheSignalAddress) == 1;
+        } catch (Exception e) {
+            log.error("AGV安全握发生故障,PLC:{}请求写入地址{},请求进入地址{},msg:",PLCConnectName,theAddressOfTheRequest,enterTheSignalAddress, e);
+            return false;
+        }
+    }
+
     @Override
     public synchronized void confirmAnalysis(String taskNo, Integer aciIndex, Integer carNo
             , String updateLocation, String updateValue) {

+ 33 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/config/PlcConfig.java

@@ -0,0 +1,33 @@
+package com.ruoyi.ams.bionutrition.plc.config;
+
+import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
+import lombok.Data;
+
+/**
+ * Created with IntelliJ IDEA.
+ *
+ * @author: liuzhifei
+ * Date: 2023/8/7
+ * Description: pcl配置类
+ **/
+@Data
+public class PlcConfig {
+
+    private String ip;
+
+    private Boolean enable;
+
+    private String name;
+
+    private byte slot;
+
+    private byte rack;
+
+    private EPlcType ePlcType;
+
+    private String heartbeat;
+
+    private String confirmTheStatus;
+
+
+}

+ 22 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/config/PlcProperties.java

@@ -0,0 +1,22 @@
+package com.ruoyi.ams.bionutrition.plc.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * Created with IntelliJ IDEA.
+ *
+ * @author: liuzhifei
+ * Date: 2023/8/7.
+ * Description:
+ **/
+@Data
+@Component
+@ConfigurationProperties(prefix = "plc")
+public class PlcProperties {
+
+    private List<PlcConfig> plcList;
+}

+ 32 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/enums/PLCConnectNameEnum.java

@@ -0,0 +1,32 @@
+package com.ruoyi.ams.bionutrition.plc.enums;
+
+public enum PLCConnectNameEnum {
+
+    /**
+     * 拆盘机PLC
+     */
+    DISMANTLING_MACHINE("dismantling_machine","拆盘机PLC"),
+
+    /**
+     * 叠盘机PLC
+     */
+    STACKING_MACHINE("stacking_machine","叠盘机PLC");
+
+    private String metadata;
+
+    private String metaName;
+
+    PLCConnectNameEnum(String metadata,String metaName) {
+        this.metadata = metadata;
+        this.metaName = metaName;
+    }
+
+    public String getMetadata() {
+        return metadata;
+    }
+
+    public String getMetaName() {
+        return metaName;
+    }
+
+}

+ 119 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/enums/PLCEnum.java

@@ -0,0 +1,119 @@
+package com.ruoyi.ams.bionutrition.plc.enums;
+
+public enum PLCEnum {
+
+    /**
+     * 拆盘机申请放整托信号
+     */
+    DISMANTLING_MACHINE_PLACE_ENTIRE_PALLET("DB101.8"),
+
+    /**
+     * 叠包机申请放空托信号
+     */
+    STACKING_MACHINE_PLACE_PALLET("DB101.8"),
+
+    /**
+     * 拆盘机申请出空托信号
+     */
+    DISMANTLING_MACHINE_OUT_PALLET("DB101.10"),
+
+    /**
+     * 叠盘机申请出整托信号
+     */
+    STACKING_MACHINE_OUT_ENTIRE_PALLET("DB101.10"),
+
+    /**
+     * 拆盘机允许放整托信号
+     */
+    DISMANTLING_MACHINE_PLACE_ENTIRE_PALLET_ENABLE("DB101.2"),
+
+    /**
+     * 叠盘机允许放空托信号
+     */
+    STACKING_MACHINE_PLACE_PALLET_ENABLE("DB101.2"),
+
+    /**
+     * 拆盘机允许出空托信号
+     */
+    DISMANTLING_MACHINE_OUT_PALLET_ENABLE("DB101.2"),
+
+    /**
+     * 叠盘机允许出整托信号
+     */
+    STACKING_MACHINE_OUT_ENTIRE_PALLET_ENABLE("DB101.2"),
+
+    /**
+     * 拆盘机AGV送整托完成信号
+     */
+    DISMANTLING_MACHINE_PLACE_ENTIRE_PALLET_FINISH("DB100.6"),
+
+    /**
+     * 叠盘机AGV送空托完成信号
+     */
+    STACKING_MACHINE_PLACE_PALLET_FINISH("DB100.6"),
+
+    /**
+     * 拆盘机AGV取空托完成信号
+     */
+    DISMANTLING_MACHINE_PICK_PALLET_FINISH("DB100.8"),
+
+    /**
+     * 叠盘机AGV取整托完成信号
+     */
+    STACKING_MACHINE_PICK_ENTIRE_PALLET_FINISH("DB100.8"),
+
+    /**
+     * 拆盘机请求送整托完成反馈信号
+     */
+    DISMANTLING_MACHINE_PLACE_ENTIRE_PALLET_FEEDBACK("DB101.4"),
+
+    /**
+     * 叠盘机请求送空托完成反馈信号
+     */
+    STACKING_MACHINE_PLACE_PALLET_FEEDBACK("DB101.4"),
+
+    /**
+     * 拆盘机请求出空托完成反馈信号
+     */
+    DISMANTLING_MACHINE_OUT_PALLET_FEEDBACK("DB101.6"),
+
+    /**
+     * 叠盘机请求出整托完成反馈信号
+     */
+    STACKING_MACHINE_OUT_ENTIRE_PALLET_FEEDBACK("DB101.6"),
+
+    /**
+     * 拆盘机送整托完成复位信号
+     */
+    DISMANTLING_MACHINE_PLACE_ENTIRE_PALLET_RESET("DB100.6"),
+
+    /**
+     * 叠盘机送空托完成复位信号
+     */
+    STACKING_MACHINE_PLACE_PALLET_RESET("DB100.6"),
+
+    /**
+     * 拆盘机取空托完成复位信号
+     */
+    DISMANTLING_MACHINE_PICK_PALLET_RESET("DB100.8"),
+
+    /**
+     * 叠盘机取整托完成复位信号
+     */
+    STACKING_MACHINE_PICK_ENTIRE_PALLET_RESET("DB100.8"),
+
+    /**
+     * AGV作业信号 1:开始作业,不安全 0:结束作业,安全
+     */
+    AGV_TASK_SAFETY_SIGNAL("DB100.12");
+
+    private String metadata;
+
+    PLCEnum(String metadata) {
+        this.metadata = metadata;
+    }
+
+    public String getMetadata() {
+        return metadata;
+    }
+}

+ 154 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/init/PlcConnectServiceRunner.java

@@ -0,0 +1,154 @@
+package com.ruoyi.ams.bionutrition.plc.init;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.github.rholder.retry.*;
+import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
+import com.ruoyi.ams.bionutrition.plc.config.PlcConfig;
+import com.ruoyi.ams.bionutrition.plc.config.PlcProperties;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * plc连接
+ */
+@Component
+@Order(1)
+@Slf4j
+public class PlcConnectServiceRunner implements CommandLineRunner {
+
+    @Resource
+    private PlcProperties plcProperties;
+
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+    @Resource
+    private ScheduledExecutorService scheduledExecutorService;
+
+    private HashMap<String, ScheduledFuture<?>> heartbeatThreads = new HashMap<>();
+
+    @Override
+    public void run(String... args) throws Exception {
+        initConnect();
+        log.info("PLC initialization complete!");
+    }
+
+    private HashMap<String, S7PLC> plcToolsMap = new HashMap<>();
+
+    private ArrayList<String> reTryPlc = new ArrayList<>();
+
+    /**
+     * 初始化
+     */
+    private void initConnect() throws InterruptedException {
+        for (PlcConfig plcConfig : plcProperties.getPlcList()) {
+            if (plcConfig.getEnable()) {
+                log.info("初始化:{},ip:{}", plcConfig.getName(), plcConfig.getIp());
+                try {
+                    S7PLC s7PLC = new S7PLC(plcConfig.getEPlcType(), plcConfig.getIp());
+                    s7PLC.connect();
+                    if (s7PLC.checkConnected()){
+                        plcToolsMap.put(plcConfig.getName(),s7PLC);
+                        log.info("plc:{},ip:{},The connection was successful",plcConfig.getName(),plcConfig.getIp());
+                        plcConnectsTheHeartbeat(plcConfig,s7PLC);
+                    }
+                }catch (Exception e){
+                    log.info("plc:{},ip:{},Connection failed",plcConfig.getName(),plcConfig.getIp());
+                    retry(plcConfig);
+                }
+            }
+        }
+
+    }
+
+    public void retry(PlcConfig plcConfig) {
+//        SpringUtil.getApplicationContext().publishEvent(new DeviceLog(plcConfig.getName(),"PLC设备已断开连接,请联系管理员","2"));
+        reTryPlc.add(plcConfig.getName());
+        ScheduledFuture<?> scheduledFuture = heartbeatThreads.get(plcConfig.getName());
+        if (ObjectUtil.isNotNull(scheduledFuture)){
+            scheduledFuture.cancel(true);
+        }
+        threadPoolTaskExecutor.execute (() -> {
+            Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
+                    .retryIfResult(Boolean.FALSE::equals)
+                    .retryIfExceptionOfType(Exception.class)
+                    .withStopStrategy(StopStrategies.neverStop())
+                    .withWaitStrategy(WaitStrategies.fixedWait(7, TimeUnit.SECONDS))
+                    .build();
+            try {
+                retryer.call(() -> {
+                    log.info("重试:{},ip:{}", plcConfig.getName(), plcConfig.getIp());
+                    try {
+                        S7PLC s7PLC = new S7PLC(plcConfig.getEPlcType(), plcConfig.getIp());
+                        s7PLC.connect();
+                        if (s7PLC.checkConnected()){
+//                            SpringUtil.getApplicationContext().publishEvent(new DeviceLog(plcConfig.getName(),"PLC设备已恢复连接","1"));
+                            plcToolsMap.put(plcConfig.getName(),s7PLC);
+                            log.info("plc:{},ip:{},Retry the connection succeeded",plcConfig.getName(),plcConfig.getIp());
+                            reTryPlc.remove(plcConfig.getName());
+                            plcConnectsTheHeartbeat(plcConfig,s7PLC);
+                            return true;
+                        }
+                    }catch (Exception e){
+                        log.info("plc:{},ip:{},Retry connection failed,meg:{}",plcConfig.getName(),plcConfig.getIp(),e.getMessage());
+                        return false;
+                    }
+                    return false;
+                });
+            } catch (RetryException | ExecutionException e) {
+                e.printStackTrace();
+            }
+        });
+    }
+
+    /**
+     *  plc连接心跳
+     * @param plcConfig
+     * @param s7PLC
+     */
+    private void plcConnectsTheHeartbeat(PlcConfig plcConfig,S7PLC s7PLC){
+        if (StringUtils.isNotEmpty( plcConfig.getHeartbeat())){
+            ScheduledFuture<?> scheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> {
+                if (!reTryPlc.contains(plcConfig.getName())) {
+                    try {
+                        byte b = s7PLC.readByte(plcConfig.getHeartbeat());
+                        s7PLC.writeByte(plcConfig.getConfirmTheStatus(), b);
+                    } catch (Exception e) {
+                        log.error("device:{},The connection is lost", plcConfig.getName());
+                        retry(plcConfig);
+                    }
+                }
+            }, 0, 1, TimeUnit.SECONDS);
+            heartbeatThreads.put(plcConfig.getName(),scheduledFuture);
+        }
+    }
+
+
+    /**
+     *
+     * @param pclName plc设备名
+     * @return
+     */
+    public S7PLC getPlcServer(String pclName) {
+        S7PLC s7PLC = plcToolsMap.get(pclName);
+        if(ObjectUtil.isNull(s7PLC) || reTryPlc.contains(pclName) ){
+            throw new ServiceException("The device is not connected");
+        }
+        return plcToolsMap.get(pclName);
+    }
+}

+ 93 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/job/AMSJob.java

@@ -0,0 +1,93 @@
+package com.ruoyi.ams.bionutrition.plc.job;
+
+import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
+import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
+import com.ruoyi.ams.bionutrition.plc.enums.PLCConnectNameEnum;
+import com.ruoyi.ams.bionutrition.plc.enums.PLCEnum;
+import com.ruoyi.ams.bionutrition.plc.init.PlcConnectServiceRunner;
+import com.ruoyi.ams.bionutrition.plc.service.ProcessService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component("AMSJob")
+@Slf4j
+public class AMSJob {
+    @Autowired
+    PlcConnectServiceRunner plcConnectServiceRunner;
+
+    @Autowired
+    private ProcessService processService;
+
+    public void test() {
+        // 叠盘机
+        byte b1 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).readByte(PLCEnum.STACKING_MACHINE_OUT_ENTIRE_PALLET.getMetadata());
+        log.info("叠盘机出整托信号:{}:{}:{}", PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCEnum.STACKING_MACHINE_OUT_ENTIRE_PALLET.getMetadata(), b1);
+        byte b2 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).readByte(PLCEnum.STACKING_MACHINE_PLACE_PALLET.getMetadata());
+        log.info("叠盘机放空托信号:{}:{}:{}", PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCEnum.STACKING_MACHINE_PLACE_PALLET.getMetadata(), b2);
+
+        // 拆盘机
+        byte b3 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata()).readByte(PLCEnum.DISMANTLING_MACHINE_PLACE_ENTIRE_PALLET.getMetadata());
+        log.info("拆盘机放整托信号:{}:{}:{}", PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata(), PLCEnum.DISMANTLING_MACHINE_PLACE_ENTIRE_PALLET.getMetadata(), b3);
+        byte b4 = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata()).readByte(PLCEnum.DISMANTLING_MACHINE_OUT_PALLET.getMetadata());
+        log.info("拆盘机出空托信号:{}:{}:{}", PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata(), PLCEnum.DISMANTLING_MACHINE_OUT_PALLET.getMetadata(), b4);
+    }
+
+    /**
+     * 拆盘机申请放整托任务
+     */
+    public void dismantlingMachinePlaceEntirePallet() {
+        log.info("==拆盘机申请放整托方法执行");
+        byte b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata()).readByte(PLCEnum.DISMANTLING_MACHINE_PLACE_ENTIRE_PALLET.getMetadata());
+        log.info("==拆盘机申请放整托信号读取成功:{}", b);
+//            deviceLogService.insertDeviceLog(new DeviceLog(PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCConnectNameEnum.STACKING_MACHINE.getMetaName(), "获取到上料信号:" + b1, "1"));
+        if (b == 1) {
+            log.info("==拆盘机申请放整托信号:{}:{}:{}", PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata(), PLCEnum.DISMANTLING_MACHINE_PLACE_ENTIRE_PALLET.getMetadata(), b);
+            processService.createPlacePalletTask("CPJ_IN", 110007l);
+            log.info("==拆盘机放整托任务生成");
+        }
+    }
+
+    /**
+     * 拆盘机申请出空托任务
+     */
+    public void dismantlingMachineOutPallet() {
+        log.info("==拆盘机申请出空托方法执行");
+        byte b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata()).readByte(PLCEnum.DISMANTLING_MACHINE_OUT_PALLET.getMetadata());
+        log.info("==拆盘机申请出空托信号读取成功:{}", b);
+        if (b == 1) {
+            log.info("==拆盘机申请出空托信号:{}:{}:{}", PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata(), PLCEnum.DISMANTLING_MACHINE_OUT_PALLET.getMetadata(), b);
+            processService.createOutPalletTask("CPJ_OUT", 110007l);
+            log.info("==拆盘机出空托任务生成");
+        }
+    }
+
+    /**
+     * 叠盘机申请放空托任务
+     */
+    public void stackingMachinePlacePallet() {
+        log.info("==叠盘机申请放空托方法执行");
+        byte b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).readByte(PLCEnum.STACKING_MACHINE_PLACE_PALLET.getMetadata());
+        log.info("==叠盘机申请放空托信号读取成功:{}", b);
+        if (b == 1) {
+            log.info("==叠盘机放空托信号:{}:{}:{}", PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCEnum.STACKING_MACHINE_PLACE_PALLET.getMetadata(), b);
+            processService.createPlacePalletTask("DPJ_IN", 110008l);
+            log.info("==叠盘机放空托任务生成");
+        }
+    }
+
+    /**
+     * 叠盘机申请出整托托任务
+     */
+    public void stackingMachineOutEntirePallet() {
+        log.info("==叠盘机申请出整托方法执行");
+        byte b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).readByte(PLCEnum.STACKING_MACHINE_OUT_ENTIRE_PALLET.getMetadata());
+        log.info("==叠盘机申请出整托信号读取成功:{}", b);
+        if (b == 1) {
+            log.info("==叠盘机申请出整托信号:{}:{}:{}", PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCEnum.STACKING_MACHINE_OUT_ENTIRE_PALLET.getMetadata(), b);
+            processService.createOutPalletTask("DPJ_OUT", 110008l);
+            log.info("==叠盘机出整托任务生成");
+        }
+    }
+
+}

+ 18 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/service/ProcessService.java

@@ -0,0 +1,18 @@
+package com.ruoyi.ams.bionutrition.plc.service;
+
+public interface ProcessService {
+
+    /**
+     * 创建放托盘任务
+     * @param taskType
+     * @param locationTo
+     */
+    void createPlacePalletTask(String taskType, Long locationTo);
+
+    /**
+     * 创建出托盘任务
+     * @param taskType
+     * @param locationFrom
+     */
+    void createOutPalletTask(String taskType, Long locationFrom);
+}

+ 103 - 0
warewms-ams/src/main/java/com/ruoyi/ams/bionutrition/plc/service/impl/ProcessServiceImpl.java

@@ -0,0 +1,103 @@
+package com.ruoyi.ams.bionutrition.plc.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.ruoyi.ams.bionutrition.plc.enums.PLCConnectNameEnum;
+import com.ruoyi.ams.bionutrition.plc.enums.PLCEnum;
+import com.ruoyi.ams.bionutrition.plc.init.PlcConnectServiceRunner;
+import com.ruoyi.ams.bionutrition.plc.service.ProcessService;
+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.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.service.IBaseLocationInfoService;
+import com.ruoyi.common.core.domain.AjaxResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class ProcessServiceImpl implements ProcessService {
+
+    @Autowired
+    WcsTaskMapper wcsTaskMapper;
+
+    @Autowired
+    private IBusinessService iBusinessService;
+
+    @Autowired
+    private IBaseLocationInfoService baseLocationInfoService;
+
+    @Autowired
+    private IInvLotLocIdService invLotLocIdService;
+
+
+    /**
+     * 创建放托盘任务:叠盘机放空托,拆盘机放整托
+     * @param taskType
+     * @param locationTo
+     */
+    @Override
+    public void createPlacePalletTask(String taskType, Long locationTo) {
+        WcsTask wcsTask = new WcsTask();
+        wcsTask.setLocationTo(locationTo.toString());
+        List<WcsTask> tasking = wcsTaskMapper.getTasking(wcsTask);
+        // 拆盘机还有未完成的任务
+        if (CollUtil.isNotEmpty(tasking)) {
+            log.info(taskType + "拆盘机放整托存在进行的任务:" + tasking.stream().map(WcsTask::getTaskNo).collect(Collectors.toList()));
+            return;
+        }
+        invLotLocIdService.deleteInvLotLocIdById(locationTo);
+        baseLocationInfoService.updateLocationIdleAndEmpty(locationTo, Constant.WAREHOUSE_ID, "AMS");
+        List<AgvCallItemDTO> agvCallItemDTOList = new ArrayList<>();
+        AgvCallItemDTO agvCallItemDTO = new AgvCallItemDTO();
+        agvCallItemDTO.setSku("EMPTY_TRAY"); // 空托
+        if (StringUtils.equals(taskType, "CPJ_IN")) agvCallItemDTO.setQty(8.0);// 拆盘机放整托,记录数量八个一托
+        agvCallItemDTOList.add(agvCallItemDTO);
+        AgvCallDTO agvCallDTO = new AgvCallDTO();
+        agvCallDTO.setLocationTo(locationTo.toString());
+        agvCallDTO.setExtParam(taskType);
+        agvCallDTO.setAgvCallItemDTOList(agvCallItemDTOList);
+        iBusinessService.agvCall(Constant.FLOW_CONFIG_ID.valueOf(taskType).getValue(), agvCallDTO);
+    }
+
+    /**
+     * 创建出托盘任务:叠盘机出整托,拆盘机出空托
+     * @param taskType
+     * @param locationFrom
+     */
+    @Override
+    public void createOutPalletTask(String taskType, Long locationFrom) {
+        WcsTask wcsTask = new WcsTask();
+        wcsTask.setLocationFrom(locationFrom.toString());
+        List<WcsTask> tasking = wcsTaskMapper.getTasking(wcsTask);
+        // 拆盘机还有未完成的任务,不生成新任务
+        if (!tasking.isEmpty()) {
+            log.info(taskType + "拆盘机出空托存在进行的任务:" + tasking.stream().map(WcsTask::getTaskNo).collect(Collectors.toList()));
+            return;
+        }
+        invLotLocIdService.deleteInvLotLocIdById(locationFrom);
+        baseLocationInfoService.updateLocationIdleAndEmpty(locationFrom, Constant.WAREHOUSE_ID, "AMS");
+        List<AgvCallItemDTO> agvCallItemDTOList = new ArrayList<>();
+        AgvCallItemDTO agvCallItemDTO = new AgvCallItemDTO();
+        agvCallItemDTO.setSku("EMPTY_TRAY"); // 空托
+        if (StringUtils.equals(taskType, "DPJ_OUT")) agvCallItemDTO.setQty(8.0);// 叠盘机出整托,记录数量八个一托
+        agvCallItemDTOList.add(agvCallItemDTO);
+        AgvCallDTO agvCallDTO = new AgvCallDTO();
+        agvCallDTO.setLocationFrom(locationFrom.toString());
+        agvCallDTO.setExtParam(taskType);
+        iBusinessService.agvCall(Constant.FLOW_CONFIG_ID.valueOf(taskType).getValue(), agvCallDTO);
+    }
+
+}

+ 3 - 2
warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java

@@ -201,7 +201,6 @@ public class BusinessServiceImpl implements IBusinessService {
                     locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "MV", asnSoStrategy, token);
                     // 初始化库存
                     if (agvCallDTO.getAgvCallItemDTOList().size() > 0) {
-                        iInvLotAttService.deleteInvLotAttBylocationId(locationFrom.getId());
                         invLotLocIdService.deleteInvLotLocIdById(locationFrom.getId());
                         invLotLocIdService.initInv(locationFrom.getId().toString(), agvCallDTO);
                     }
@@ -497,7 +496,9 @@ public class BusinessServiceImpl implements IBusinessService {
             wcsTask.setCreateDate(new Date());
             wcsTask.setBusinessType("01");
             wcsTask.setTaskType(Constant.TASK_TYPE.FORWARD.getValue());
-            wcsTask.setExt5(agvCallDTO.getDocNo()+","+agvCallDTO.getDocLineNo()+","+agvCallDTO.getBusinessType()+","+agvCallDTO.getDocType());
+            wcsTask.setExt5(StringUtils.isEmpty(agvCallDTO.getExtParam()) ?
+                    agvCallDTO.getDocNo()+","+agvCallDTO.getDocLineNo()+","+agvCallDTO.getBusinessType()+","+agvCallDTO.getDocType() :
+                    StringUtils.EMPTY);
             wcsTask.setCreateUser(agvCallDTO.getCreateUser());
             wcsTask.setExt8(token.toString());
             wcsTask.setExt7(flowConfigHeaderVO.getId().toString());

+ 2 - 6
warewms-ams/src/main/java/com/ruoyi/ams/inv/service/impl/InvLotLocIdServiceImpl.java

@@ -54,7 +54,7 @@ import java.util.stream.Stream;
  * @date 2022-03-03
  */
 @Slf4j
-@Service
+@Service("InvLotLocIdServiceImpl")
 public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
 
     @Autowired
@@ -137,8 +137,7 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
     /**
      * 定时更新库存过期状态
      */
-    @Scheduled(cron = "0 0 0 * * ?")
-    private void refreshExpireStatus() {
+    public void refreshExpireStatus() {
         List<InvLotLocIdLotattVO> invLotLocIdLotattVOS = invLotLocIdMapper.selectInvLocIdLotattList(new InvLocIdSearchFrom());
         String msg = null;
         invLotLocIdLotattVOS.stream().forEach(item -> {
@@ -568,11 +567,8 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
             invLotLocId.setSku(sku);
             invLotLocId.setCustomerId(customerId);
             invLotLocId.setQty(new BigDecimal(qty));
-            invLotLocId.setQtyEach(new BigDecimal(qty));
             invLotLocId.setTotalAmount(agvCallItemDTO.getTotalAmount());
             invLotLocId.setIfSample(Constant.IS_YES.N.name());
-            invLotLocId.setQtypa(BigDecimal.ZERO);
-            invLotLocId.setQtyrpin(BigDecimal.ZERO);
             invLotLocId.setIsExpire(Constant.EXPIRE_STATUS.UNEXPIRED.getValue());
             invLotLocId.setCreateTime(new Date());
             invLotLocIdMapper.insertInvLotLocId(invLotLocId);

+ 75 - 76
warewms-ams/src/main/java/com/ruoyi/ams/task/domain/WcsTask.java

@@ -10,7 +10,7 @@ import java.util.Date;
 
 /**
  * AGV任务对象 wcs_task
- * 
+ *
  * @author andy
  * @date 2022-03-10
  */
@@ -19,6 +19,7 @@ public class WcsTask extends BaseEntity
     private static final long serialVersionUID = 1L;
 
     /** AGV任务主键 */
+    @Excel(name = "任务号")
     private String taskNo;
 
     /** AGV任务类型 */
@@ -37,11 +38,9 @@ public class WcsTask extends BaseEntity
     private String whNoTo;
 
     /** 调用系统名称 */
-    @Excel(name = "调用系统名称")
     private String sysName;
 
     /** 调用设备名称 */
-    @Excel(name = "调用设备名称")
     private String deviceName;
 
     /** 批号 */
@@ -71,7 +70,7 @@ public class WcsTask extends BaseEntity
     private Long priority;
 
     /** ִ状态9:(队列等待) 0:(下达AMS成功) */
-    @Excel(name = "ִ状态9:(队列等待) 0:(下达AMS成功)")
+    @Excel(name = "ִ状态9:(队列等待) 0:(下达AMS成功)", dictType = "task_sts")
     private Long state;
 
     /** 创建人 */
@@ -145,327 +144,327 @@ public class WcsTask extends BaseEntity
     /** 是否有前置任务,有必须等待前置任务完成 */
     private String beforeTask;
 
-    public void setTaskNo(String taskNo) 
+    public void setTaskNo(String taskNo)
     {
         this.taskNo = taskNo;
     }
 
-    public String getTaskNo() 
+    public String getTaskNo()
     {
         return taskNo;
     }
-    public void setBusinessType(String businessType) 
+    public void setBusinessType(String businessType)
     {
         this.businessType = businessType;
     }
 
-    public String getBusinessType() 
+    public String getBusinessType()
     {
         return businessType;
     }
-    public void setWhTypeFrom(String whTypeFrom) 
+    public void setWhTypeFrom(String whTypeFrom)
     {
         this.whTypeFrom = whTypeFrom;
     }
 
-    public String getWhTypeFrom() 
+    public String getWhTypeFrom()
     {
         return whTypeFrom;
     }
-    public void setWhNoFrom(String whNoFrom) 
+    public void setWhNoFrom(String whNoFrom)
     {
         this.whNoFrom = whNoFrom;
     }
 
-    public String getWhNoFrom() 
+    public String getWhNoFrom()
     {
         return whNoFrom;
     }
-    public void setWhTypeTo(String whTypeTo) 
+    public void setWhTypeTo(String whTypeTo)
     {
         this.whTypeTo = whTypeTo;
     }
 
-    public String getWhTypeTo() 
+    public String getWhTypeTo()
     {
         return whTypeTo;
     }
-    public void setWhNoTo(String whNoTo) 
+    public void setWhNoTo(String whNoTo)
     {
         this.whNoTo = whNoTo;
     }
 
-    public String getWhNoTo() 
+    public String getWhNoTo()
     {
         return whNoTo;
     }
-    public void setSysName(String sysName) 
+    public void setSysName(String sysName)
     {
         this.sysName = sysName;
     }
 
-    public String getSysName() 
+    public String getSysName()
     {
         return sysName;
     }
-    public void setDeviceName(String deviceName) 
+    public void setDeviceName(String deviceName)
     {
         this.deviceName = deviceName;
     }
 
-    public String getDeviceName() 
+    public String getDeviceName()
     {
         return deviceName;
     }
-    public void setBatchNo(String batchNo) 
+    public void setBatchNo(String batchNo)
     {
         this.batchNo = batchNo;
     }
 
-    public String getBatchNo() 
+    public String getBatchNo()
     {
         return batchNo;
     }
-    public void setBatchOrderNo(Long batchOrderNo) 
+    public void setBatchOrderNo(Long batchOrderNo)
     {
         this.batchOrderNo = batchOrderNo;
     }
 
-    public Long getBatchOrderNo() 
+    public Long getBatchOrderNo()
     {
         return batchOrderNo;
     }
-    public void setLocationFrom(String locationFrom) 
+    public void setLocationFrom(String locationFrom)
     {
         this.locationFrom = locationFrom;
     }
 
-    public String getLocationFrom() 
+    public String getLocationFrom()
     {
         return locationFrom;
     }
-    public void setAreaFrom(String areaFrom) 
+    public void setAreaFrom(String areaFrom)
     {
         this.areaFrom = areaFrom;
     }
 
-    public String getAreaFrom() 
+    public String getAreaFrom()
     {
         return areaFrom;
     }
-    public void setLocationTo(String locationTo) 
+    public void setLocationTo(String locationTo)
     {
         this.locationTo = locationTo;
     }
 
-    public String getLocationTo() 
+    public String getLocationTo()
     {
         return locationTo;
     }
-    public void setAreaTo(String areaTo) 
+    public void setAreaTo(String areaTo)
     {
         this.areaTo = areaTo;
     }
 
-    public String getAreaTo() 
+    public String getAreaTo()
     {
         return areaTo;
     }
-    public void setPriority(Long priority) 
+    public void setPriority(Long priority)
     {
         this.priority = priority;
     }
 
-    public Long getPriority() 
+    public Long getPriority()
     {
         return priority;
     }
-    public void setState(Long state) 
+    public void setState(Long state)
     {
         this.state = state;
     }
 
-    public Long getState() 
+    public Long getState()
     {
         return state;
     }
-    public void setCreateUser(String createUser) 
+    public void setCreateUser(String createUser)
     {
         this.createUser = createUser;
     }
 
-    public String getCreateUser() 
+    public String getCreateUser()
     {
         return createUser;
     }
-    public void setCreateDate(Date createDate) 
+    public void setCreateDate(Date createDate)
     {
         this.createDate = createDate;
     }
 
-    public Date getCreateDate() 
+    public Date getCreateDate()
     {
         return createDate;
     }
-    public void setUpdateUser(Long updateUser) 
+    public void setUpdateUser(Long updateUser)
     {
         this.updateUser = updateUser;
     }
 
-    public Long getUpdateUser() 
+    public Long getUpdateUser()
     {
         return updateUser;
     }
-    public void setUpdateDate(Date updateDate) 
+    public void setUpdateDate(Date updateDate)
     {
         this.updateDate = updateDate;
     }
 
-    public Date getUpdateDate() 
+    public Date getUpdateDate()
     {
         return updateDate;
     }
-    public void setTaskType(String taskType) 
+    public void setTaskType(String taskType)
     {
         this.taskType = taskType;
     }
 
-    public String getTaskType() 
+    public String getTaskType()
     {
         return taskType;
     }
-    public void setShopId(String shopId) 
+    public void setShopId(String shopId)
     {
         this.shopId = shopId;
     }
 
-    public String getShopId() 
+    public String getShopId()
     {
         return shopId;
     }
-    public void setStartTime(Date startTime) 
+    public void setStartTime(Date startTime)
     {
         this.startTime = startTime;
     }
 
-    public Date getStartTime() 
+    public Date getStartTime()
     {
         return startTime;
     }
-    public void setEndTime(Date endTime) 
+    public void setEndTime(Date endTime)
     {
         this.endTime = endTime;
     }
 
-    public Date getEndTime() 
+    public Date getEndTime()
     {
         return endTime;
     }
-    public void setParentTask(String parentTask) 
+    public void setParentTask(String parentTask)
     {
         this.parentTask = parentTask;
     }
 
-    public String getParentTask() 
+    public String getParentTask()
     {
         return parentTask;
     }
-    public void setExtParam(String extParam) 
+    public void setExtParam(String extParam)
     {
         this.extParam = extParam;
     }
 
-    public String getExtParam() 
+    public String getExtParam()
     {
         return extParam;
     }
-    public void setExt1(String ext1) 
+    public void setExt1(String ext1)
     {
         this.ext1 = ext1;
     }
 
-    public String getExt1() 
+    public String getExt1()
     {
         return ext1;
     }
-    public void setExt2(String ext2) 
+    public void setExt2(String ext2)
     {
         this.ext2 = ext2;
     }
 
-    public String getExt2() 
+    public String getExt2()
     {
         return ext2;
     }
-    public void setExt3(String ext3) 
+    public void setExt3(String ext3)
     {
         this.ext3 = ext3;
     }
 
-    public String getExt3() 
+    public String getExt3()
     {
         return ext3;
     }
-    public void setExt4(String ext4) 
+    public void setExt4(String ext4)
     {
         this.ext4 = ext4;
     }
 
-    public String getExt4() 
+    public String getExt4()
     {
         return ext4;
     }
-    public void setExt5(String ext5) 
+    public void setExt5(String ext5)
     {
         this.ext5 = ext5;
     }
 
-    public String getExt5() 
+    public String getExt5()
     {
         return ext5;
     }
-    public void setExt6(String ext6) 
+    public void setExt6(String ext6)
     {
         this.ext6 = ext6;
     }
 
-    public String getExt6() 
+    public String getExt6()
     {
         return ext6;
     }
-    public void setExt7(String ext7) 
+    public void setExt7(String ext7)
     {
         this.ext7 = ext7;
     }
 
-    public String getExt7() 
+    public String getExt7()
     {
         return ext7;
     }
-    public void setExt8(String ext8) 
+    public void setExt8(String ext8)
     {
         this.ext8 = ext8;
     }
 
-    public String getExt8() 
+    public String getExt8()
     {
         return ext8;
     }
-    public void setAgvNo(String agvNo) 
+    public void setAgvNo(String agvNo)
     {
         this.agvNo = agvNo;
     }
 
-    public String getAgvNo() 
+    public String getAgvNo()
     {
         return agvNo;
     }
-    public void setBeforeTask(String beforeTask) 
+    public void setBeforeTask(String beforeTask)
     {
         this.beforeTask = beforeTask;
     }
 
-    public String getBeforeTask() 
+    public String getBeforeTask()
     {
         return beforeTask;
     }

+ 2 - 0
warewms-ams/src/main/java/com/ruoyi/ams/task/mapper/WcsTaskMapper.java

@@ -112,4 +112,6 @@ public interface WcsTaskMapper extends BaseMapper<WcsTask>
      List<WcsTask> selectBeforeTask(@Param("taskNo") String taskNo);
 
      List<WcsTaskInvLotDTO> selectWcsTaskListByExt5(String ext5);
+
+     List<WcsTask> getTasking(WcsTask wcsTask);
 }

+ 75 - 0
warewms-ams/src/main/java/com/ruoyi/ams/task/service/impl/WcsTaskServiceImpl.java

@@ -10,6 +10,7 @@ import java.util.List;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.json.JSON;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
@@ -24,6 +25,9 @@ import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocDetailsService;
 import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocHeaderService;
 import com.ruoyi.ams.bionutrition.dto.OrderAgvCallDTO;
 import com.ruoyi.ams.bionutrition.pda.IPdaAgvCallService;
+import com.ruoyi.ams.bionutrition.plc.enums.PLCConnectNameEnum;
+import com.ruoyi.ams.bionutrition.plc.enums.PLCEnum;
+import com.ruoyi.ams.bionutrition.plc.init.PlcConnectServiceRunner;
 import com.ruoyi.ams.box.service.IWmsBoxInfoService;
 import com.ruoyi.ams.business.IBusinessService;
 import com.ruoyi.ams.config.domain.FlowConfigEvent;
@@ -111,6 +115,9 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
     private BionutritionDocDetailsService bionutritionDocDetailsService;
     @Autowired
     private IFlowConfigHeaderService flowConfigHeaderService;
+    @Autowired
+    PlcConnectServiceRunner plcConnectServiceRunner;
+
 
     //任务状态翻译
     private String codeConvert(int code) {
@@ -464,6 +471,39 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                     if (!StringUtils.isEmpty(wcsTask.getExt8())) {
                         redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()), wcsTask.getLocationFrom());
                     }
+                    // 拆盘机出空托 写出空托完成、复位信号
+                    if (StringUtils.equals(wcsTask.getExtParam(), Constant.FLOW_CONFIG_ID.CPJ_OUT.name())) {
+                        log.info("==拆盘机出空托任务取货完成:{}:{}",PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata(), PLCEnum.DISMANTLING_MACHINE_PICK_PALLET_FINISH.getMetadata());
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata()).writeByte(PLCEnum.DISMANTLING_MACHINE_PICK_PALLET_FINISH.getMetadata(), (byte) 1);
+                        log.info("==拆盘机出空托任务写作业完成信号");
+                        Thread.sleep(3000L);
+                        // 读取请求出空托完成反馈信号为1:反馈完成
+                        byte b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata()).readByte(PLCEnum.DISMANTLING_MACHINE_OUT_PALLET_FEEDBACK.getMetadata());
+                        log.info("==拆盘机请求出空托完成反馈信号:{}", b);
+                        if (b == 1) {
+                            log.info("==拆盘机请求出空托写复位信号");
+                            // 写复位信号
+                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata()).writeByte(PLCEnum.DISMANTLING_MACHINE_PICK_PALLET_FINISH.getMetadata(), (byte) 0);
+                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata()).writeByte(PLCEnum.AGV_TASK_SAFETY_SIGNAL.getMetadata(), (byte) 0);
+                            log.info("==拆盘机请求出空托写复位信号完成");
+                        }
+                    }
+                    // 叠盘机出整托 写出整托完成、复位信号
+                    if (StringUtils.equals(wcsTask.getExtParam(), Constant.FLOW_CONFIG_ID.DPJ_OUT.name())) {
+                        log.info("==叠盘机出整托任务取货完成:{}:{}",PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCEnum.STACKING_MACHINE_PICK_ENTIRE_PALLET_FINISH.getMetadata());
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).writeByte(PLCEnum.STACKING_MACHINE_PICK_ENTIRE_PALLET_FINISH.getMetadata(), (byte) 1);
+                        log.info("==叠盘机出整托任务写作业完成信号");
+                        Thread.sleep(3000L);
+                        // 读取请求出整托完成反馈信号为1:反馈完成
+                        byte b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).readByte(PLCEnum.STACKING_MACHINE_OUT_ENTIRE_PALLET_FEEDBACK.getMetadata());
+                        log.info("==叠盘机请求出整托完成反馈信号:{}", b);
+                        if (b == 1) {
+                            log.info("==叠盘机请求出空托写复位信号");
+                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).writeByte(PLCEnum.STACKING_MACHINE_PICK_ENTIRE_PALLET_FINISH.getMetadata(), (byte) 0);
+                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).writeByte(PLCEnum.AGV_TASK_SAFETY_SIGNAL.getMetadata(), (byte) 0);
+                            log.info("==叠盘机请求出空托写复位信号完成");
+                        }
+                    }
                     break;
                 case 5:
                     break;
@@ -492,6 +532,41 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                     if (!StringUtils.isEmpty(wcsTask.getExt8())) {
                         redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
                     }
+                    // 拆盘机请求放整托卸货完成,写放整托完成、复位信号
+                    // 拆盘机出空托 写出空托完成、复位信号
+                    if (StringUtils.equals(wcsTask.getExtParam(), Constant.FLOW_CONFIG_ID.CPJ_IN.name())) {
+                        log.info("==拆盘机放整托任务取货完成:{}:{}",PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata(), PLCEnum.DISMANTLING_MACHINE_PLACE_ENTIRE_PALLET_FINISH.getMetadata());
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata()).writeByte(PLCEnum.DISMANTLING_MACHINE_PLACE_ENTIRE_PALLET_FINISH.getMetadata(), (byte) 1);
+                        log.info("==拆盘机放整托任务写作业完成信号");
+                        Thread.sleep(3000L);
+                        // 读取请求放整托完成反馈信号为1:反馈完成
+                        byte b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata()).readByte(PLCEnum.DISMANTLING_MACHINE_PLACE_ENTIRE_PALLET_FEEDBACK.getMetadata());
+                        log.info("==拆盘机请求放整托完成反馈信号:{}", b);
+                        if (b == 1) {
+                            log.info("==拆盘机请求放整托写复位信号");
+                            // 写复位信号
+                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata()).writeByte(PLCEnum.DISMANTLING_MACHINE_PLACE_ENTIRE_PALLET_FINISH.getMetadata(), (byte) 0);
+                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.DISMANTLING_MACHINE.getMetadata()).writeByte(PLCEnum.AGV_TASK_SAFETY_SIGNAL.getMetadata(), (byte) 0);
+                            log.info("==拆盘机请求放整托写复位信号完成");
+                        }
+                    }
+                    // 叠盘机放空托 写放空托完成、复位信号
+                    if (StringUtils.equals(wcsTask.getExtParam(), Constant.FLOW_CONFIG_ID.DPJ_IN.name())) {
+                        log.info("==叠盘机放空托任务取货完成:{}:{}",PLCConnectNameEnum.STACKING_MACHINE.getMetadata(), PLCEnum.STACKING_MACHINE_PLACE_PALLET_FINISH.getMetadata());
+                        plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).writeByte(PLCEnum.STACKING_MACHINE_PLACE_PALLET_FINISH.getMetadata(), (byte) 1);
+                        log.info("==叠盘机放空托任务写作业完成信号");
+                        Thread.sleep(3000L);
+                        // 读取请求出整托完成反馈信号为1:反馈完成
+                        byte b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).readByte(PLCEnum.STACKING_MACHINE_PLACE_PALLET_FEEDBACK.getMetadata());
+                        log.info("==叠盘机请求放空托完成反馈信号:{}", b);
+                        if (b == 1) {
+                            log.info("==叠盘机请求放空托写复位信号");
+                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).writeByte(PLCEnum.STACKING_MACHINE_PLACE_PALLET_FINISH.getMetadata(), (byte) 0);
+                            plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).writeByte(PLCEnum.AGV_TASK_SAFETY_SIGNAL.getMetadata(), (byte) 0);
+                            log.info("==叠盘机请求放空托写复位信号完成");
+                        }
+                    }
+
                     break;
                 case 7://取消
                     wcsTask.setEndTime(new Date());

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

@@ -383,7 +383,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 <if test="lotattDTO.lotatt18 != null  and lotattDTO.lotatt18 != ''"> and att.lotatt18 = #{lotattDTO.lotatt18}</if>
             </if>
         </where>
-        order by lpad(b.row_no, 11, '0'),b.row_index,lpad(b.shift_no, 11, '0'),b.shift_index,lpad(b.col_no, 11, '0'),b.col_index desc
+        order by is_expire, create_time desc, lpad(b.row_no, 11, '0'), b.row_index,lpad(b.shift_no, 11, '0'), b.shift_index,lpad(b.col_no, 11, '0'), b.col_index desc
     </select>
 
     <select id="selectInvLocIdLotattByLocationId" resultMap="InvLotLocIdLotattResult">

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

@@ -353,4 +353,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         left join inv_lot_att att on att.lotnum = inv.lotnum
         where ext5 = #{ext5} and state not in (7,8)
     </select>
+
+    <select id="getTasking" parameterType="WcsTask" resultMap="WcsTaskResult">
+        <include refid="selectWcsTaskVo"/>
+        <where>
+            <if test="locationFrom != null  and locationFrom != ''"> and location_from = #{locationFrom}</if>
+            <if test="areaFrom != null  and areaFrom != ''"> and area_from = #{areaFrom}</if>
+            <if test="locationTo != null  and locationTo != ''"> and location_to = #{locationTo}</if>
+            <if test="areaTo != null  and areaTo != ''"> and area_to = #{areaTo}</if>
+            <if test="priority != null "> and priority = #{priority}</if>
+            <if test="createUser != null  and createUser != ''"> and create_user = #{createUser}</if>
+            <if test="createDate != null "> and create_date = #{createDate}</if>
+            <if test="taskType != null  and taskType != ''"> and task_type = #{taskType}</if>
+            <if test="shopId != null  and shopId != ''"> and shop_id = #{shopId}</if>
+            <if test="startTime != null "> and start_time = #{startTime}</if>
+            <if test="endTime != null "> and end_time = #{endTime}</if>
+            <if test="parentTask != null  and parentTask != ''"> and parent_task = #{parentTask}</if>
+            <if test="agvNo != null  and agvNo != ''"> and agv_no like concat('%', #{agvNo}, '%')</if>
+        </where>
+        and state in(1,3,4,5,6,8,9,10)
+    </select>
 </mapper>

+ 8 - 52
warewms-base/src/main/java/com/ruoyi/base/constant/Constant.java

@@ -35,66 +35,22 @@ public class Constant {
      * 搬运任务配置id
      */
     public enum FLOW_CONFIG_ID {
-        /***
-         * 补空托(空托暂存区)
-         */
-        ONE(1l),
-        /**
-         * 空托上料(硫酸镍)
-         */
-        TWO(2l),
-        /**
-         * 空托上料(氯化镍)
-         */
-        THREE(3l),
-        /**
-         * 废料搬运(硫酸镍)
-         */
-        FOUR(4l),
-        /**
-         * 废料退空(硫酸镍)
-         */
-        FIVE(5l),
-        /**
-         * 废料搬运(氯化镍)
-         */
-        SIX(6l),
-        /**
-         * 废料退空(氯化镍)
-         */
-        SEVEN(7l),
-        /**
-         * 成品下线(硫酸镍)->裹膜
-         */
-        EIGHT(8l),
-        /**
-         * 成品下线(硫酸镍)->仓储区
-         */
-        NINE(9l),
-        /**
-         * 成品下线(硫酸镍)-裹膜->仓储区
-         */
-        TEN(10l),
-        /**
-         * 成品下线(氯化镍)->裹膜
-         */
-        ELEVEN(11l),
         /**
-         * 成品下线(氯化镍)->仓储区
+         * 拆盘机放整托
          */
-        TWELVE(12l),
+        CPJ_IN(18L),
         /**
-         * 成品下线(氯化镍)-裹膜->仓储区
+         * 拆盘机出空托
          */
-        THIRTEEN(13l),
+        CPJ_OUT(19L),
         /**
-         * 成品出库(硫酸镍)
+         * 叠盘机放空托
          */
-        FOURTEEN(14l),
+        DPJ_IN(20L),
         /**
-         * 成品出库(氯化镍)
+         * 叠盘机出整托
          */
-        FIFTEEN(15l);
+        DPJ_OUT(21L);
 
         private Long flowId;
 

+ 5 - 15
warewms-base/src/main/java/com/ruoyi/base/domain/BaseSku.java

@@ -39,6 +39,11 @@ public class BaseSku extends BaseEntity
      */
     @Excel(name = "包装规格")
     private String skuPackagingSpecs;
+    /**
+     * 存货编码
+     */
+    @Excel(name = "存货编码")
+    private String inventoryCode;
     /**
      * 过敏源信息
      */
@@ -73,21 +78,6 @@ public class BaseSku extends BaseEntity
      */
     @Excel(name = "描述")
     private String skuDesc;
-    /**
-     * 皮重
-     */
-    @Excel(name = "皮重")
-    private BigDecimal skuTare;
-    /**
-     * 毛重
-     */
-    @Excel(name = "毛重")
-    private BigDecimal skuGrossweight;
-    /**
-     * 净重
-     */
-    @Excel(name = "净重")
-    private BigDecimal skuNetweight;
     /**
      * 物料状态 Y:启用 N:禁用
      */

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

@@ -173,7 +173,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         left join base_location_zone t2 on t2.zone_id=t1.zone_id
         <where>
             <if test="id != null "> and id like concat('%', #{id}, '%')</if>
-            <if test="warehouseId != null "> and warehouse_id = #{warehouseId}</if>
+            <if test="warehouseId != null "> and t1.warehouse_id = #{warehouseId}</if>
             <if test="zoneId != null "> and t1.zone_id = #{zoneId}</if>
             <if test="zoneName != null "> and zone_name = #{zoneName}</if>
             <if test="locationNo != null  and locationNo != ''"> and location_no like concat('%', #{locationNo}, '%')</if>

+ 32 - 41
warewms-base/src/main/resources/mapper/base/BaseSkuMapper.xml

@@ -17,9 +17,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="skuQcCheck" column="sku_qc_check" />
         <result property="skuType" column="sku_type" />
         <result property="skuDesc" column="sku_desc" />
-        <result property="skuTare" column="sku_tare" />
-        <result property="skuGrossweight" column="sku_grossweight" />
-        <result property="skuNetweight" column="sku_netweight" />
+        <result property="inventoryCode" column="inventory_code" />
         <result property="skuStatus" column="sku_status" />
         <result property="skuPutawayZone" column="sku_putaway_zone" />
         <result property="skuHigh" column="sku_high" />
@@ -47,9 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 sku_qc_check,
                 sku_type,
                 sku_desc,
-                sku_tare,
-                sku_grossweight,
-                sku_netweight,
+                inventory_code,
                 sku_status,
                 sku_putaway_zone,
                 sku_high,
@@ -97,9 +93,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="skuQcCheck != null and skuQcCheck != ''">sku_qc_check,</if>
             <if test="skuType != null">sku_type,</if>
             <if test="skuDesc != null and skuDesc != ''">sku_desc,</if>
-            <if test="skuTare != null and skuTare != ''">sku_tare,</if>
-            <if test="skuGrossweight != null and skuGrossweight != ''">sku_grossweight,</if>
-            <if test="skuNetweight != null and skuNetweight != ''">sku_netweight,</if>
+            <if test="inventoryCode != null and inventoryCode != ''">inventory_code,</if>
             <if test="skuStatus != null and skuStatus != ''">sku_status,</if>
             <if test="skuPutawayZone != null and skuPutawayZone != ''">sku_putaway_zone,</if>
             <if test="skuHigh != null and skuHigh != ''">sku_high,</if>
@@ -126,9 +120,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="skuQcCheck != null and skuQcCheck != ''"> #{skuQcCheck},</if>
             <if test="skuType != null"> #{skuType},</if>
             <if test="skuDesc != null and skuDesc != ''"> #{skuDesc},</if>
-            <if test="skuTare != null and skuTare != ''"> #{skuTare},</if>
-            <if test="skuGrossweight != null and skuGrossweight != ''"> #{skuGrossweight},</if>
-            <if test="skuNetweight != null and skuNetweight != ''"> #{skuNetweight},</if>
+            <if test="inventoryCode != null and inventoryCode != ''"> #{inventory_code},</if>
             <if test="skuStatus != null and skuStatus != ''"> #{skuStatus},</if>
             <if test="skuPutawayZone != null and skuPutawayZone != ''"> #{skuPutawayZone},</if>
             <if test="skuHigh != null and skuHigh != ''"> #{skuHigh},</if>
@@ -159,9 +151,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test=" skuQcCheck !=null and skuQcCheck !='' ">sku_qc_check = #{skuQcCheck},</if>
             <if test=" skuType !=null">sku_type = #{skuType},</if>
             <if test=" skuDesc !=null and skuDesc !='' ">sku_desc = #{skuDesc},</if>
-            <if test=" skuTare !=null and skuTare !='' ">sku_tare = #{skuTare},</if>
-            <if test=" skuGrossweight !=null and skuGrossweight !='' ">sku_grossweight = #{skuGrossweight},</if>
-            <if test=" skuNetweight !=null and skuNetweight !='' ">sku_netweight = #{skuNetweight},</if>
+            <if test=" inventoryCode !=null and inventoryCode !='' ">inventory_code = #{inventoryCode},</if>
             <if test=" skuStatus !=null and skuStatus !='' ">sku_status = #{skuStatus},</if>
             <if test=" skuPutawayZone !=null and skuPutawayZone !='' ">sku_putaway_zone = #{skuPutawayZone},</if>
             <if test=" skuHigh !=null and skuHigh !='' ">sku_high = #{skuHigh},</if>
@@ -190,31 +180,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <select id="selectBaseSkuBySkuTypeList" resultMap="BaseSkuResult">
-        select  sku_customer_id
-                sku
-                sku_name
-                sku_specs
-                sku_packaging_specs
-                sku_allergen_information
-                sku_uom
-                sku_shelflife
-                sku_qc_time
-                sku_qc_check
-                sku_type
-                sku_desc
-                sku_tare
-                sku_grossweight
-                sku_netweight
-                sku_status
-                sku_putaway_zone
-                sku_high
-                sku_length
-                sku_width
-                sku_qc_rule
-                sku_manufacturer
-                creator
-                create_date
-                updater
+        select  sku_customer_id,
+                sku,
+                sku_name,
+                sku_specs,
+                sku_packaging_specs,
+                inventory_code,
+                sku_allergen_information,
+                sku_uom,
+                sku_shelflife,
+                sku_qc_time,
+                sku_qc_check,
+                sku_type,
+                sku_desc,
+                sku_tare,
+                sku_grossweight,
+                sku_netweight,
+                sku_status,
+                sku_putaway_zone,
+                sku_high,
+                sku_length,
+                sku_width,
+                sku_qc_rule,
+                sku_manufacturer,
+                creator,
+                create_date,
+                updater,
                 update_date
                 remark from base_sku
         where 1=1
@@ -224,6 +215,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 #{item}
             </foreach>
         </if>
-        and skuStatus = 'Y'
+        and sku_status = 'Y'
     </select>
 </mapper>