Browse Source

完成B1区AGV安全握的对接及紧急任务切换导航

zhifei 1 year ago
parent
commit
b0fe725027
23 changed files with 446 additions and 178 deletions
  1. 12 0
      pom.xml
  2. 2 2
      ruoyi-admin/src/main/resources/application-dev.yml
  3. 4 4
      ruoyi-admin/src/main/resources/application-prod.yml
  4. 7 6
      ruoyi-admin/src/main/resources/application.yml
  5. 10 10
      ruoyi-admin/src/main/resources/logback.xml
  6. 2 2
      ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml
  7. 100 4
      ruoyi-admin/src/test/java/com/ruoyi/admin/test/base/WarehouseTest.java
  8. 4 4
      ruoyi-system/src/main/java/com/ruoyi/system/config/MQTTConfig.java
  9. 2 0
      ruoyi-system/src/main/java/com/ruoyi/system/config/PlcConfig.java
  10. 10 6
      ruoyi-system/src/main/java/com/ruoyi/system/enums/CnveyorBeltsPlcEnum.java
  11. 8 7
      ruoyi-system/src/main/java/com/ruoyi/system/init/PlcConnectServiceRunner.java
  12. 4 3
      ruoyi-system/src/main/java/com/ruoyi/system/init/PublishAGVInfo.java
  13. 2 2
      warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/AciService.java
  14. 8 3
      warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/service/StatusUpdateService.java
  15. 0 1
      warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/service/impl/AmsTaskServiceImpl.java
  16. 31 20
      warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/service/impl/SocketBufferServiceImpl.java
  17. 150 48
      warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/service/impl/StatusUpdateServiceImpl.java
  18. 16 17
      warewms-ams/src/main/java/com/ruoyi/ams/task/service/impl/WcsTaskServiceImpl.java
  19. 1 0
      warewms-ams/src/main/resources/mapper/ams/AmsTaskMapper.xml
  20. 5 6
      warewms-base/src/main/java/com/ruoyi/base/constant/Constant.java
  21. 21 9
      warewms-base/src/main/java/com/ruoyi/base/service/impl/CarInfoServiceImpl.java
  22. 4 1
      warewms-tianao/src/main/java/com/ruoyi/tianao/job/FeedbackJob.java
  23. 43 23
      warewms-tianao/src/main/java/com/ruoyi/tianao/service/impl/TianaoServiceImpl.java

+ 12 - 0
pom.xml

@@ -35,6 +35,7 @@
         <velocity.version>2.3</velocity.version>
         <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>
@@ -243,6 +244,17 @@
                 <version>${iotCommunication.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>
 
 
         </dependencies>

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

@@ -64,6 +64,6 @@ logging:
 
 # 是否开启服务
 init-task:
-    autosend: true # 自动下发任务
-    aciservice: true # ndc通讯
+    autosend: false # 自动下发任务
+    aciservice: false # ndc通讯
 

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

@@ -64,16 +64,16 @@ logging:
 
 # 是否开启服务
 init-task:
-    autosend: false # 自动下发任务
-    aciservice: false # ndc通讯
+    autosend: true # 自动下发任务
+    aciservice: true # ndc通讯
 
 modbus:
     tcp-master:
         fourth: # 充电机(三向车)
-            open: true
+            open: false
             host: 192.168.42.208
             port: 8899
         fifth: # 充电机(迷你堆垛)
-            open: true
+            open: false
             host: 192.168.42.209
             port: 8899

+ 7 - 6
ruoyi-admin/src/main/resources/application.yml

@@ -120,15 +120,16 @@ xss:
   urlPatterns: /system/*,/monitor/*,/tool/*
 
 tianao:
-  address: http://61.169.55.83:7225
-  taskBackUrl: http://61.169.55.83:7225/Api_Changlian/ForksUpdateTask
-  AGVStatusBackUrl: http://61.169.55.83:7225/Api_Changlian/ForksUpdateAgvAxis
+  address: http://192.168.60.50:7225
+  taskBackUrl: http://192.168.60.50:7225/Api_Changlian/ForksUpdateTask
+  AGVStatusBackUrl: http://192.168.60.50:7225/Api_Changlian/ForksUpdateAgvAxis
 
 # plc连接配置
 plc:
   plcList[0]:
-    ip: 192.168.2.151
-    enable: false
+    ip: 192.168.60.151
+    enable: true
     name: conveyorBeltsPlc
     ePlcType: S1200
-    heartbeat: DB1051.0.0
+    heartbeat: DB1054.0.0
+    confirmTheStatus: DB1055.0.0

+ 10 - 10
ruoyi-admin/src/main/resources/logback.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-	<property name="log.path" value="../../../logs/ruoyi/logs" />
+	<property name="log.path" value="../logs" />
     <!-- 日志输出格式 -->
 	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 
@@ -11,14 +11,14 @@
 			<pattern>${log.pattern}</pattern>
 		</encoder>
 	</appender>
-	
+
 	<!-- 系统日志输出 -->
 	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
 	    <file>${log.path}/sys-info.log</file>
         <!-- 循环政策:基于时间创建日志文件 -->
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
-			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<fileNamePattern>${log.path}/info/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
 			<!-- 日志最大的历史 60天 -->
 			<maxHistory>60</maxHistory>
 		</rollingPolicy>
@@ -34,13 +34,13 @@
             <onMismatch>DENY</onMismatch>
         </filter>
 	</appender>
-	
+
 	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
 	    <file>${log.path}/sys-error.log</file>
         <!-- 循环政策:基于时间创建日志文件 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
-            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <fileNamePattern>${log.path}/error/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
 			<!-- 日志最大的历史 60天 -->
 			<maxHistory>60</maxHistory>
         </rollingPolicy>
@@ -56,7 +56,7 @@
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
-	
+
 	<!-- 用户访问日志输出  -->
     <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
 		<file>${log.path}/sys-user.log</file>
@@ -70,7 +70,7 @@
             <pattern>${log.pattern}</pattern>
         </encoder>
     </appender>
-	
+
 	<!-- 系统模块日志级别控制  -->
 	<logger name="com.ruoyi" level="info" />
 	<!-- Spring日志级别控制  -->
@@ -79,15 +79,15 @@
 	<root level="info">
 		<appender-ref ref="console" />
 	</root>
-	
+
 	<!--系统操作日志-->
     <root level="info">
         <appender-ref ref="file_info" />
         <appender-ref ref="file_error" />
     </root>
-	
+
 	<!--系统用户操作日志-->
     <logger name="sys-user" level="info">
         <appender-ref ref="sys-user"/>
     </logger>
-</configuration> 
+</configuration>

+ 2 - 2
ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml

@@ -12,10 +12,10 @@
         <!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
         <setting name="defaultExecutorType" value="SIMPLE"/>
         <!-- 指定 MyBatis 所用日志的具体实现 -->
-        <setting name="logImpl" value="SLF4J"/>
+<!--        <setting name="logImpl" value="SLF4J"/>-->
         <!-- 使用驼峰命名法转换字段 -->
         <!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
-        <setting name="logImpl" value="STDOUT_LOGGING"/>
+<!--        <setting name="logImpl" value="org.apache.ibatis.logging.nologging.NoLoggingImpl"/>-->
     </settings>
 
 </configuration>

File diff suppressed because it is too large
+ 100 - 4
ruoyi-admin/src/test/java/com/ruoyi/admin/test/base/WarehouseTest.java


+ 4 - 4
ruoyi-system/src/main/java/com/ruoyi/system/config/MQTTConfig.java

@@ -5,12 +5,12 @@ import lombok.Getter;
 @Getter
 public class MQTTConfig {
 
-    private String HOST= "";
+    private String HOST= "tcp://61.169.55.85:1883";
 
-    private String clientId ="";
+    private String clientId ="mqtt_client";
 
-    private String userName ="";
+    private String userName ="admin";
 
-    private String password ="";
+    private String password ="cdta@2022";
 
 }

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/system/config/PlcConfig.java

@@ -27,6 +27,8 @@ public class PlcConfig {
 
     private String heartbeat;
 
+    private String confirmTheStatus;
+
     public void setSiemensPLCS(String  ePlcType) {
         this.ePlcType = EPlcType.valueOf(ePlcType);
     }

+ 10 - 6
ruoyi-system/src/main/java/com/ruoyi/system/enums/CnveyorBeltsPlcEnum.java

@@ -2,17 +2,21 @@ package com.ruoyi.system.enums;
 
 public enum CnveyorBeltsPlcEnum {
 
-    TO_COMMAND_1("DB1051.6.0"),
+    TO_COMMAND_1("DB1055.7.0"),
 
-    TO_COMMAND_4("DB1051.108.0"),
+    TO_COMMAND_3("DB1055.109.0"),
 
-    ACK_1("DB1051.4.0"),
+    ACK_1("DB1055.4.0"),
 
-    ACK_4("DB1051.106.0"),
+    ACK_3("DB1055.106.0"),
 
-    MOVE_1("DB1050.14.0"),
+    REJECT_REASON_1("DB1054.20.0"),
 
-    MOVE_4("DB1050.128.0");
+    REJECT_REASON_3("DB1054.134.0"),
+
+    RELEASE_SIGNAL_1("DB1054.19.0"),
+
+    RELEASE_SIGNAL_3("DB1054.133.0");
 
     private String metadata;
 

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

@@ -43,7 +43,7 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
     @Override
     public void run(String... args) throws Exception {
         initConnect();
-        log.info("plc初始化完成!");
+        log.info("PLC initialization complete!");
     }
 
     private HashMap<String, S7PLC> plcToolsMap = new HashMap<>();
@@ -62,10 +62,10 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
                     s7PLC.connect();
                     if (s7PLC.checkConnected()){
                         plcToolsMap.put(plcConfig.getName(),s7PLC);
-                        log.info("plc:{},ip:{},连接成功",plcConfig.getName(),plcConfig.getIp());
+                        log.info("plc:{},ip:{},The connection was successful",plcConfig.getName(),plcConfig.getIp());
                     }
                 }catch (Exception e){
-                    log.info("plc:{},ip:{},连接失败",plcConfig.getName(),plcConfig.getIp());
+                    log.info("plc:{},ip:{},Connection failed",plcConfig.getName(),plcConfig.getIp());
                     retry(plcConfig);
                 }
             }
@@ -90,13 +90,13 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
                         s7PLC.connect();
                         if (s7PLC.checkConnected()){
                             plcToolsMap.put(plcConfig.getName(),s7PLC);
-                            log.info("plc:{},ip:{},重试连接成功",plcConfig.getName(),plcConfig.getIp());
+                            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:{},重试连接失败,meg:{}",plcConfig.getName(),plcConfig.getIp(),e.getMessage());
+                        log.info("plc:{},ip:{},Retry connection failed,meg:{}",plcConfig.getName(),plcConfig.getIp(),e.getMessage());
                         return false;
                     }
                     return false;
@@ -118,9 +118,10 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
             scheduledExecutorService.scheduleWithFixedDelay(()->{
                 if (!reTryPlc.contains(plcConfig.getName())){
                     try {
-                        s7PLC.readBoolean(plcConfig.getHeartbeat());
+                        byte b = s7PLC.readByte(plcConfig.getHeartbeat());
+                        s7PLC.writeByte(plcConfig.getConfirmTheStatus(),b);
                     }catch (Exception e){
-                        log.error("设备:{},连接中断",plcConfig.getName());
+                        log.error("device:{},The connection is lost",plcConfig.getName());
                         retry(plcConfig);
                     }
                 }

+ 4 - 3
ruoyi-system/src/main/java/com/ruoyi/system/init/PublishAGVInfo.java

@@ -19,19 +19,19 @@ import org.springframework.stereotype.Component;
 @Slf4j
 public class PublishAGVInfo implements CommandLineRunner {
 
-    private final String topic="";
+    private final String topic="position";
 
     private int  qos = 1;
 
     private  MemoryPersistence persistence = new MemoryPersistence();
 
-    private MQTTConfig mqttConfig;
+    private MQTTConfig mqttConfig = new MQTTConfig();
 
     private MqttClient sampleClient;
 
     @Override
     public void run(String... args) throws Exception {
-//        initConnect();
+        initConnect();
     }
 
     private void initConnect(){
@@ -47,6 +47,7 @@ public class PublishAGVInfo implements CommandLineRunner {
             connOpts.setPassword(mqttConfig.getPassword().toCharArray());
             // 建立连接
             sampleClient.connect(connOpts);
+            log.info("MQTT 连接完成!");
         } catch (MqttException me) {
             log.error("An exception occurred when initializing the MQTT connection,msg:{}",me.getMessage());
         }

+ 2 - 2
warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/AciService.java

@@ -38,7 +38,7 @@ public class AciService {
 
     private static final int BUFF_SIZE = 2048;
 
-    private static final String IP_ADDR = "192.168.2.51";
+    private static final String IP_ADDR = "192.168.62.51";
 
     private static final int IP_PORT = 30002;
 
@@ -144,7 +144,7 @@ public class AciService {
 //                        try {
                         String order = amsHexdefineDetailService.concatOrder(t, basTask);
                         log.info("writeOrder:" + order);
-                        if (t.getBusinessType().equals("01")) {
+                        if ("01".equals(t.getBusinessType()) || "m".equals(t.getBusinessType())|| "50".equals(t.getBusinessType())) {
 
                             buffer.put(ByteUtil.hexString2ByteArray(order));
                             buffer.flip();

+ 8 - 3
warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/service/StatusUpdateService.java

@@ -23,7 +23,7 @@ public interface StatusUpdateService {
      * @param aciIndex index
      * @param type     取卸货
      */
-    void confirmAnalysis(String taskNo, Integer aciIndex, String type, Integer carNo);
+    void confirmAnalysis(String taskNo, Integer aciIndex, String type, Integer carNo) throws InterruptedException;
 
     /**
      * 取卸货确认分析
@@ -36,7 +36,13 @@ public interface StatusUpdateService {
      */
     void confirmAnalysis(String taskNo, Integer aciIndex, Integer carNo
             , String updateLocation, String updateValue);
-
+    /**
+     * 切换导航
+     * @param carNo
+     * @param ikey
+     * @param i
+     */
+    void changeNavigation(Integer carNo, Long ikey, String i);
 
     /**
      * 回告ts门已经打开
@@ -57,5 +63,4 @@ public interface StatusUpdateService {
      */
     void closeDoor(Integer doorNo);
 
-
 }

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

@@ -53,7 +53,6 @@ public class AmsTaskServiceImpl implements IAmsTaskService
     public AmsTask selectAmsTaskByModel(AmsTask amsTask)
     {
         List<AmsTask> list = amsTaskMapper.selectAmsTaskList(amsTask);
-        System.out.println(list);
         if (list!=null && list.size()>0) {
             return list.get(0);
         } else {

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

@@ -122,11 +122,11 @@ public class SocketBufferServiceImpl implements SocketBufferService {
                 //xy轴位置
                 //car.setX(251770 - ByteUtil.getUnsignedShort(parameters, 6) * 10);
                 //car.setY(96620 - ByteUtil.getUnsignedShort(parameters, 14) * 10);
-                CarStatus carStatus = new CarStatus();
-                carStatus.setCarNo(carNo);
-                carStatus.setX(251770 - ByteUtil.getUnsignedShort(parameters, 6) * 10);
-                carStatus.setY(96620 - ByteUtil.getUnsignedShort(parameters, 14) * 10);
-                SpringUtil.getApplicationContext().publishEvent(carStatus);
+//                CarStatus carStatus = new CarStatus();
+//                carStatus.setCarNo(carNo);
+//                carStatus.setX(251770 - ByteUtil.getUnsignedShort(parameters, 6) * 10);
+//                carStatus.setY(96620 - ByteUtil.getUnsignedShort(parameters, 14) * 10);
+//                SpringUtil.getApplicationContext().publishEvent(carStatus);
                 //car.update();
                 break;
         }
@@ -149,7 +149,7 @@ public class SocketBufferServiceImpl implements SocketBufferService {
             event.setLp4("" + ByteUtil.getInt(parameters, 46));
             int eventId = event.getId();
             AmsTask taskBean = new AmsTask();
-
+//            log.info("反馈event:{}",event);
 //            log.info("----event:" + eventId);
             switch (eventId) {
                 case 85://user event ts cancel                  任务取消
@@ -182,6 +182,7 @@ public class SocketBufferServiceImpl implements SocketBufferService {
                 case 88://user event FETCH Covert Failed
                 case 89://userevent DELIV Convert Failed
                 case 90://user event Order Complete             任务完成
+                case 204: //                                    取货添加车号
                 case 91://user event Loaded                     取货完成
                 case 92://user event Delivered                  卸货完成
                 case 93://user event Redirect message for FETCH
@@ -201,9 +202,10 @@ public class SocketBufferServiceImpl implements SocketBufferService {
                         amsTaskService.updateAmsTask(taskBeanUpdate01);
 
                         long taskId = taskBean.getId().longValue();
+                        String agvNo = event.getLp2();
                         executorService.execute(() -> {
                             try {
-                                statusUpdateService.updateStatus(taskId, icarNo);
+                                statusUpdateService.updateStatus(taskId,Integer.parseInt( agvNo));
                             } catch (InterruptedException e) {
                                 log.error("An exception occurred in the task update,msg,{}",e.getMessage());
                             }
@@ -230,12 +232,17 @@ public class SocketBufferServiceImpl implements SocketBufferService {
                     } else {
                         //解析卸货确认状态
                         executorService.execute(() -> {
-                            statusUpdateService.confirmAnalysis(task60.getTaskNo(), aciIndex, PICKUP.getValue(), icarNo);
+                            try {
+                                statusUpdateService.confirmAnalysis(task60.getTaskNo(), aciIndex, UNLOAD.getValue(), icarNo);
+                            } catch (InterruptedException e) {
+                                throw new RuntimeException(e);
+                            }
                         });
                     }
                     break;
                 case 115:
                     //60任务取货确认
+
                     Integer aciIndexPick = Integer.parseInt(event.getLp1());
                     log.info("MSG_EVENT114:取货确认{}", JSON.toJSONString(event));
 
@@ -246,9 +253,13 @@ public class SocketBufferServiceImpl implements SocketBufferService {
                     if (task60Pick == null) {
                         log.info("aciIndex:" + aciIndexPick + "查询不到对应的60任务");
                     } else {
-                        //解析货确认状态
+                        //解析货确认状态
                         executorService.execute(() -> {
-                            statusUpdateService.confirmAnalysis(task60Pick.getTaskNo(), aciIndexPick, UNLOAD.getValue(), icarNo);
+                            try {
+                                statusUpdateService.confirmAnalysis(task60Pick.getTaskNo(), aciIndexPick, PICKUP.getValue(), icarNo);
+                            } catch (InterruptedException e) {
+                                throw new RuntimeException(e);
+                            }
                         });
                     }
                     break;
@@ -268,15 +279,6 @@ public class SocketBufferServiceImpl implements SocketBufferService {
                     }
                     break;
                 case 123:
-                    log.info("申请空托!" + "-" + JSON.toJSONString(event));
-                    Integer index123 = Integer.parseInt(event.getLp1());
-                    AmsTask task123 = amsTaskService.selectAmsTaskByModel(index123);
-                    if (task123 != null) {
-                        executorService.execute(() -> {
-                            statusUpdateService.confirmAnalysis(task123.getTaskNo(), index123, icarNo
-                                    , "09", "0001");
-                        });
-                    }
                     break;
                 case 126:
                     break;
@@ -382,6 +384,15 @@ public class SocketBufferServiceImpl implements SocketBufferService {
                         chargerButtProxy.theChargingSynchronizer(index202, chargingSite202, agvNo202, END);
                     });
                     break;
+                case 203: //NDC eCode = 400 | 反馈坐标
+                    CarStatus carStatus = new CarStatus();
+                    carStatus.setCarNo(icarNo);
+                    carStatus.setX(Integer.parseInt( event.getLp2()));
+                    carStatus.setY(Integer.parseInt(event.getLp3()));
+                    carStatus.setBattery(Integer.parseInt(event.getLp4()));
+//                    log.info("获取AGV信息:{},{},{},{}",carStatus.getCarNo(),carStatus.getX(),carStatus.getY(),carStatus.getBattery());
+                    SpringUtil.getApplicationContext().publishEvent(carStatus);
+                    break;
                 default:
                     log.info("----event:" + eventId);
                     break;
@@ -427,7 +438,7 @@ public class SocketBufferServiceImpl implements SocketBufferService {
                 if (taskBean != null) {
                     AmsTask taskM = new AmsTask();
                     taskM.setRemark(taskBean.getTaskNo());
-                    taskM = amsTaskService.selectAmsTaskByModel(taskBean);
+                    taskM = amsTaskService.selectAmsTaskByModel(taskM);
                     if (taskM != null) {
                         if (parameters[3] == 7 || parameters[4] == Integer.parseInt(taskM.getExt2())) {
                             taskM.setAciAccept(1);

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

@@ -1,5 +1,7 @@
 package com.ruoyi.ams.agv.ndc.service.impl;
 
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.thread.ThreadUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
@@ -15,7 +17,7 @@ import com.ruoyi.ams.task.service.IWcsTaskService;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.domain.BaseLocationInfo;
 import com.ruoyi.base.service.IBaseLocationInfoService;
-import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.utils.uuid.SnowflakeIdWorker;
 import com.ruoyi.hard.modbus.tcp.AutoDoorClient;
 import com.ruoyi.system.enums.CnveyorBeltsPlcEnum;
@@ -25,7 +27,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
+import java.time.Duration;
+import java.util.Date;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import static com.ruoyi.ams.agv.ndc.service.impl.StatusUpdateServiceImpl.AGV_ACTION.UNLOAD;
 
@@ -54,6 +59,11 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
     @Autowired
     ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
+    @Autowired
+    private StatusUpdateService statusUpdateService;
+    @Autowired
+    private RedisCache redisCache;
+
     public enum AGV_ACTION {
         /***
          * 取货
@@ -99,27 +109,44 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
                         result.setState(1);
                         break;
                     case 90:
-
+                        if (wcsTask.getState()==7){
+                            log.info("任务已取消!");
+                            return;
+                        }
                         result.setState(2);
                         break;
+                    case 204:
+                        //切换导航
+                        threadPoolTaskExecutor.execute(() -> {
+                            try {
+                                if ("10016".equals(wcsTask.getAreaTo())) {
+                                    statusUpdateService.changeNavigation(carNo, amsTask.getIkey(), "0001");
+                                }
+                            } catch (Exception e) {
+                                log.error("切换导航失败,Switching navigation failed,msg:{}", e.getMessage());
+                            }
+
+                        });
+                        result.setState(3);
+                        break;
                     case 91:
                         result.setState(4);
-                        threadPoolTaskExecutor.execute(()->{
+                        threadPoolTaskExecutor.execute(() -> {
                             try {
                                 endOfMissionSecurity(wcsTask);
                             } catch (InterruptedException e) {
-                                log.error("The security judgment execution is abnormal,msg:{}",e.getMessage());
+                                log.error("The security judgment execution is abnormal,msg:{}", e.getMessage());
                             }
 
                         });
                         break;
                     case 92:
                         result.setState(6);
-                        threadPoolTaskExecutor.execute(()->{
+                        threadPoolTaskExecutor.execute(() -> {
                             try {
                                 endOfMissionSecurity(wcsTask);
                             } catch (Exception e) {
-                                log.error("The security judgment execution is abnormal,msg:{}",e.getMessage());
+                                log.error("The security judgment execution is abnormal,msg:{}", e.getMessage());
                             }
 
                         });
@@ -130,12 +157,9 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
                     case 113:
                         result.setState(8);
                         break;
-                    case 114:
-                        result.setState(2);
-                        break;
                 }
             }
-
+            log.info("任务回调执行:{}", result);
             wcsTaskService.callBack(result.getTaskNo(), result.getState(), result.getCarNo());
 
             amsTask.setSystemStatus(result.getState());
@@ -145,31 +169,32 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
 
     private void endOfMissionSecurity(WcsTask wcsTask) throws InterruptedException {
         S7PLC conveyorBeltsPlc = plcConnectServiceRunner.getPlcServer("conveyorBeltsPlc");
-        byte command = 24;
+        byte command = 25;
         byte initial = 0;
         byte submit = 1;
-        if("102102".equals(wcsTask.getLocationTo())){
-            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_1.getMetadata(),command);
-            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_1.getMetadata(),submit);
+        if ("102102".equals(wcsTask.getLocationTo())) {
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_1.getMetadata(), command);
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_1.getMetadata(), submit);
             Thread.sleep(3000);
-            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_1.getMetadata(),initial);
-            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_1.getMetadata(),initial);
-        }else {
-            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_4.getMetadata(),command);
-            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_4.getMetadata(),submit);
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_1.getMetadata(), initial);
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_1.getMetadata(), initial);
+        } else if ("102103".equals(wcsTask.getLocationTo())) {
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_3.getMetadata(), command);
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_3.getMetadata(), submit);
             Thread.sleep(3000);
-            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_4.getMetadata(),initial);
-            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_4.getMetadata(),initial);
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_3.getMetadata(), initial);
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_3.getMetadata(), initial);
         }
+        log.info("agv安全退出");
     }
 
     @Override
-    public synchronized void confirmAnalysis(String taskNo, Integer aciIndex, String type, Integer carNo) {
+    public synchronized void confirmAnalysis(String taskNo, Integer aciIndex, String type, Integer carNo) throws InterruptedException {
         AmsTask amsTask = new AmsTask();
         amsTask.setTaskNo(taskNo);
         amsTask = amsTaskService.selectAmsTaskByModel(amsTask);
         //添加取货卸货前安全握
-        if (AGVUnloadOrPickUpSafetyJudgment(taskNo,type)){
+        if (AGVUnloadOrPickUpSafetyJudgment(taskNo, type,amsTask.getAciIndex().toString())) {
             return;
         }
         if (amsTask != null) {
@@ -222,6 +247,7 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
             addTaskForm.setRemark(taskNo);
             addTaskForm.setExt2(updateLocation);
             addTaskForm.setExt3(updateValue);
+            addTaskForm.setIkey((long) BusinessServiceImpl.geniKey(addTaskForm.getTaskNo()));
             //如果ams_task已经有此任务的待接收m消息,则不生成新的m消息
             AmsTask amsTaskQuery = new AmsTask();
             amsTaskQuery.setAciAccept(0);
@@ -230,6 +256,7 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
             amsTaskQuery.setBusinessType(Constant.TASK_BUSINESS_TYPE.TASK_m.getValue());
             amsTaskQuery.setExt2(addTaskForm.getExt2());
             amsTaskQuery.setExt2(addTaskForm.getExt3());
+            amsTaskQuery.setIkey((long) BusinessServiceImpl.geniKey(addTaskForm.getTaskNo()));
             List<AmsTask> undoneList = amsTaskService.selectAmsTaskList(amsTaskQuery);
             if (undoneList.size() > 0) {
                 return;
@@ -240,6 +267,25 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
         }
     }
 
+    @Override
+    public void changeNavigation(Integer carNo, Long ikey, String i) {
+        AmsTask amsTask = new AmsTask();
+        amsTask = amsTaskService.selectAmsTaskByModel(amsTask);
+        if (amsTask != null) {
+            AmsTask addTaskForm = new AmsTask();
+            addTaskForm.setTaskNo(System.currentTimeMillis() + "");
+            addTaskForm.setBusinessType(Constant.TASK_BUSINESS_TYPE.TASK_50.getValue());
+            addTaskForm.setStFrom(998);
+            addTaskForm.setStTo(999);
+            addTaskForm.setPriority(1);
+            addTaskForm.setExt1(carNo.toString());
+            addTaskForm.setExt2(i);
+            addTaskForm.setExt3(ikey.toString());
+            addTaskForm.setIkey((long) BusinessServiceImpl.geniKey(addTaskForm.getTaskNo()));
+            amsTaskService.insertAmsTask(addTaskForm);
+        }
+    }
+
     @Override
     public void feedbackTS(Integer doorNo) {
         AmsTask addTaskForm = new AmsTask();
@@ -301,40 +347,96 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
         }
     }
 
-    public boolean AGVUnloadOrPickUpSafetyJudgment(String taskNo,String type) {
+    public boolean AGVUnloadOrPickUpSafetyJudgment(String taskNo, String type, String aciIndex) throws InterruptedException {
+        byte command_21 = 21;
+        byte command_22 = 22;
+        byte initial = 0;
+        byte submit = 1;
+
+        if (ObjectUtil.isNull(redisCache.getCacheObject("Confirm"+taskNo))){
+            log.info("agv进行安全握");
+            redisCache.setCacheObject("Confirm"+taskNo,new Date().getTime(),60,TimeUnit.SECONDS);
+        }else {
+            Long time = Long.parseLong( redisCache.getCacheObject("Confirm" + taskNo).toString());
+            DateTime dateTime = new DateTime(new Date(time));
+            Duration between = LocalDateTimeUtil.between(dateTime.toLocalDateTime(), new DateTime(new Date()).toLocalDateTime());
+            long seconds = between.getSeconds();
+            if (seconds>30){
+                AmsTask addTaskForm = new AmsTask();
+                addTaskForm.setTaskNo(System.currentTimeMillis() + "");
+                addTaskForm.setBusinessType(Constant.TASK_BUSINESS_TYPE.TASK_m.getValue());
+                addTaskForm.setExt1(aciIndex);
+                addTaskForm.setStFrom(998);
+                addTaskForm.setStTo(999);
+                addTaskForm.setPriority(1);
+                addTaskForm.setRemark(taskNo);
+                // 取货确认
+                if (type.equals(AGV_ACTION.PICKUP.getValue())) {
+                    addTaskForm.setExt2("08");
+                    addTaskForm.setExt3("0002");
+                    // 卸货确认
+                } else if (type.equals(AGV_ACTION.UNLOAD.getValue())) {
+                    addTaskForm.setExt2("09");
+                    addTaskForm.setExt3("0002");
+                }
+                //如果ams_task已经有此任务的待接收m消息,则不生成新的m消息
+                AmsTask amsTaskQuery = new AmsTask();
+                amsTaskQuery.setAciAccept(0);
+                amsTaskQuery.setIsDelete(0);
+                amsTaskQuery.setRemark(taskNo);
+                amsTaskQuery.setBusinessType(Constant.TASK_BUSINESS_TYPE.TASK_m.getValue());
+                amsTaskQuery.setExt2(addTaskForm.getExt2());
+                List<AmsTask> undoneList = amsTaskService.selectAmsTaskList(amsTaskQuery);
+                if (undoneList.size() > 0) {
+                    return true;
+                }
+                amsTaskService.insertAmsTask(addTaskForm);
+            }
+        }
         WcsTask wcsTask = wcsTaskMapper.selectWcsTaskByTaskNo(taskNo);
-        if (ObjectUtil.isNull(wcsTask)){
-            throw  new ServiceException("The AGV feedback task does not exist,Security judgment cannot be made!!!");
+        if (ObjectUtil.isNull(wcsTask)) {
+            log.error("The AGV feedback task does not exist,Security judgment cannot be made!!!");
+            return true;
         }
         S7PLC conveyorBeltsPlc = plcConnectServiceRunner.getPlcServer("conveyorBeltsPlc");
-        if (type.equals(UNLOAD.getValue())){
-            BaseLocationInfo baseLocationInfo = iBaseLocationInfoService.selectBaseLocationInfoById(Long.parseLong( wcsTask.getLocationTo()));
-            if (baseLocationInfo.getZoneId().equals(10005L)){
-                if("102102".equals(wcsTask.getLocationTo())){
-                    if (conveyorBeltsPlc.readByte(CnveyorBeltsPlcEnum.MOVE_1.getMetadata()) ==3){
-                        return true;
-                    }
-                }else {
-                    if (conveyorBeltsPlc.readByte(CnveyorBeltsPlcEnum.MOVE_4.getMetadata()) ==3){
-                        return true;
+        BaseLocationInfo to = iBaseLocationInfoService.selectBaseLocationInfoById(Long.parseLong(wcsTask.getLocationTo()));
+        BaseLocationInfo from = iBaseLocationInfoService.selectBaseLocationInfoById(Long.parseLong(wcsTask.getLocationFrom()));
+        if (to.getZoneId().equals(10005L) || from.getZoneId().equals(10005L)) {
+            if ("102102".equals(wcsTask.getLocationTo())) {
+                if (conveyorBeltsPlc.readByte(CnveyorBeltsPlcEnum.RELEASE_SIGNAL_1.getMetadata()) == 1) {
+                    log.info("agv结束安全握,一号位");
+                    return false;
+                }else{
+                    log.info("一号位禁止进入原因:{}",conveyorBeltsPlc.readByte(CnveyorBeltsPlcEnum.REJECT_REASON_1.getMetadata()));
+                    if (type.equals(UNLOAD.getValue())){
+                        conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_1.getMetadata(),command_21);
+                    }else {
+                        conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_1.getMetadata(),command_22);
                     }
+                    conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_1.getMetadata(), submit);
+                    Thread.sleep(3000L);
+                    conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_1.getMetadata(),initial);
+                    conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_1.getMetadata(), initial);
                 }
-            }
-        }else {
-            BaseLocationInfo baseLocationInfo = iBaseLocationInfoService.selectBaseLocationInfoById(Long.parseLong( wcsTask.getLocationFrom()));
-            if (baseLocationInfo.getZoneId().equals(10005L)) {
-                if ("102103".equals(wcsTask.getLocationTo())) {
-                    if (conveyorBeltsPlc.readByte(CnveyorBeltsPlcEnum.MOVE_1.getMetadata()) != 3) {
-                        return true;
-                    }
-                } else {
-                    if (conveyorBeltsPlc.readByte(CnveyorBeltsPlcEnum.MOVE_4.getMetadata()) != 3) {
-                        return true;
+            } else {
+                if (conveyorBeltsPlc.readByte(CnveyorBeltsPlcEnum.RELEASE_SIGNAL_3.getMetadata()) == 1) {
+                    log.info("agv结束安全握,三号位");
+                    return false;
+                }else{
+                    log.info("三号位禁止进入原因:{}",conveyorBeltsPlc.readByte(CnveyorBeltsPlcEnum.REJECT_REASON_3.getMetadata()));
+                    if (type.equals(UNLOAD.getValue())){
+                        conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_3.getMetadata(),command_21);
+                    }else {
+                        conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_3.getMetadata(),command_22);
                     }
+                    conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_3.getMetadata(), submit);
+                    Thread.sleep(3000L);
+                    conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_3.getMetadata(),initial);
+                    conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_3.getMetadata(), initial);
                 }
             }
         }
-        return false;
+        return true;
     }
 
 }

+ 16 - 17
warewms-ams/src/main/java/com/ruoyi/ams/task/service/impl/WcsTaskServiceImpl.java

@@ -68,7 +68,8 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
     @Autowired
     private AutoDoorClient autoDoorClient;
 
-    private final List<Integer> statusList = Arrays.asList(1, 2, 4, 7);;
+    private final List<Integer> statusList = Arrays.asList(2, 3, 4, 7);
+    ;
 
     //任务状态翻译
     private String codeConvert(int code) {
@@ -349,9 +350,7 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
             return AjaxResult.error("agv回传没有任务记录------------->");
         }
 
-        if (state >= 1 && state != 7) {
-            wcsTask.setAgvNo(carNo + "");
-        }
+        wcsTask.setAgvNo(carNo + "");
 
         if (wcsTask.getState() == 2) {
             log.info("已完成的任务无需反馈");
@@ -379,9 +378,6 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                             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())
@@ -389,9 +385,9 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                         // 将中间缓存位库存移动到终点
                         moveMiddleCacheToDestination(wcsTask);
                         //释放redis锁
-                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
-                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
-                        }
+//                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
+//                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
+//                        }
                         carInfo.setUpdateType("status");
                         carInfo.setState("1");
                         SpringUtil.getApplicationContext().publishEvent(carInfo);
@@ -416,9 +412,9 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                         moveStartingPointToMiddleCache(wcsTask);
 
                         //释放redis锁
-                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
-                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()), wcsTask.getLocationFrom());
-                        }
+//                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
+//                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()), wcsTask.getLocationFrom());
+//                        }
 
                         //修改车辆状态
                         carInfo.setUpdateType("status");
@@ -429,7 +425,7 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                         break;
                     case 6://卸货
                         if (wcsTask.getState() != 4
-                                && (StringUtils.isEmpty(wcsTask.getBeforeTask())|| !wcsTask.getBeforeTask().equals("1"))) {
+                                && (StringUtils.isEmpty(wcsTask.getBeforeTask()) || !wcsTask.getBeforeTask().equals("1"))) {
                             log.info("任务未取货,不能直接完成!" + taskNo);
                             return AjaxResult.error("任务未取货,不能直接完成!" + taskNo);
                         }
@@ -464,9 +460,9 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                                     , Constant.WAREHOUSE_ID, updateBy);
                         }
                         //释放redis锁
-                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
-                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
-                        }
+//                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
+//                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
+//                        }
                         // 取消任务删除中间缓存库存
 //                        cancelTaskDelMiddleCache(wcsTask);
                         carInfo.setUpdateType("status");
@@ -502,6 +498,9 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
         wcsTaskService.updateWcsTask(wcsTask);
         //根据具体状态反馈WMS
         if (statusList.contains(state)) {
+            if (state ==3){
+                wcsTask.setState(1L);
+            }
             SpringUtil.getApplicationContext().publishEvent(wcsTask);
         }
         return AjaxResult.success("操作成功!");

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

@@ -75,6 +75,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="ext6 != null  and ext6 != ''"> and ext6 = #{ext6}</if>
             <if test="ext7 != null  and ext7 != ''"> and ext7 = #{ext7}</if>
             <if test="ext8 != null  and ext8 != ''"> and ext8 = #{ext8}</if>
+            <if test="remark != null  and remark != ''"> and remark = #{remark}</if>
         </where>
         order by addtime desc
     </select>

+ 5 - 6
warewms-base/src/main/java/com/ruoyi/base/constant/Constant.java

@@ -402,6 +402,10 @@ public class Constant {
          * m
          */
         TASK_m("m"),
+        /**
+         * 50
+         */
+        TASK_50("50"),
         /**
          * 暂停
          */
@@ -434,12 +438,7 @@ public class Constant {
         /**
          * 转发任务
          */
-        FORWARD("FW"),
-
-        /**
-         *
-         */
-        Handling("TA");
+        FORWARD("FW");
         private String value;
 
         TASK_TYPE(String value) {

+ 21 - 9
warewms-base/src/main/java/com/ruoyi/base/service/impl/CarInfoServiceImpl.java

@@ -118,24 +118,36 @@ public class CarInfoServiceImpl implements ICarInfoService {
     @EventListener
     @Async
     public void  updateStatus(CarInfo carInfo){
-        CarInfo car = carList.get(carInfo.getCarno().intValue() - 1);
+        int index = -1;
+        if (ObjectUtil.isNull(carList)){
+            selectCarInfoList(new CarInfo());
+        }
+        for (int i = 0; i < carList.size(); i++) {
+            if (carList.get(i).getCarno().equals(carInfo.getCarno())){
+                carInfo = carList.get(i);
+                index = i;
+            }
+        }
+        if (index ==-1){
+            return;
+        }
         if ("status".equals(carInfo.getUpdateType())){
-           if(!car.getState().equals(carInfo.getState())){
-               car.setState(carInfo.getState());
-               carList.set(carInfo.getCarno().intValue() - 1,car);
+           if(!carInfo.getState().equals(carInfo.getState())){
+               carInfo.setState(carInfo.getState());
+               carList.set(carInfo.getCarno().intValue() - 1,carInfo);
            }
         }else {
             int a = 0;
-            if(!car.getX().equals(carInfo.getX())){
-                car.setX(carInfo.getX());
+            if(!carInfo.getX().equals(carInfo.getX())){
+                carInfo.setX(carInfo.getX());
                 a =1;
             }
-            if(!car.getY().equals(carInfo.getY())){
-                car.setY(carInfo.getY());
+            if(!carInfo.getY().equals(carInfo.getY())){
+                carInfo.setY(carInfo.getY());
                 a =1;
             }
             if (a==1){
-                carList.set(carInfo.getCarno().intValue() - 1,car);
+                carList.set(carInfo.getCarno().intValue() - 1,carInfo);
             }
         }
     }

+ 4 - 1
warewms-tianao/src/main/java/com/ruoyi/tianao/job/FeedbackJob.java

@@ -4,6 +4,7 @@ import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import com.ruoyi.base.domain.CarInfo;
 import com.ruoyi.base.service.ICarInfoService;
+import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.system.init.PublishAGVInfo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -31,9 +32,11 @@ public class FeedbackJob {
         JSONArray objects = new JSONArray();
         for (CarInfo carInfo : iCarInfoService.selectCarInfoList(new CarInfo())) {
             JSONObject jsonObject = new JSONObject();
-            jsonObject.set("carNo",carInfo.getUserdefine2());
+            jsonObject.set("euqNo",carInfo.getUserdefine2());
             jsonObject.set("X",carInfo.getX());
             jsonObject.set("Y",carInfo.getY());
+            jsonObject.set("type",carInfo.getUserdefine3());
+            jsonObject.set("addTime", DateUtils.getTime());
             objects.add(jsonObject);
         }
         publishAGVInfo.publishMessage(objects.toString());

+ 43 - 23
warewms-tianao/src/main/java/com/ruoyi/tianao/service/impl/TianaoServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ruoyi.tianao.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.HttpRequest;
 import com.alibaba.fastjson.JSONObject;
 import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
 import com.ruoyi.ams.agv.ndc.domain.AmsTask;
@@ -12,8 +13,10 @@ import com.ruoyi.ams.task.mapper.WcsTaskMapper;
 import com.ruoyi.ams.task.service.IWcsTaskService;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.domain.BaseLocationInfo;
+import com.ruoyi.base.domain.CarInfo;
 import com.ruoyi.base.mapper.BaseLocationZoneMapper;
 import com.ruoyi.base.service.IBaseLocationInfoService;
+import com.ruoyi.base.service.ICarInfoService;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.DateUtils;
@@ -80,11 +83,15 @@ public class TianaoServiceImpl implements TianaoService {
 
     private final List<Long> statusLsit = Arrays.asList(2L, 5L, 6L, 7L);
 
-    private final List<Long> zoneList = Arrays.asList(10003L, 10005L);
+    private final List<Long> zoneList = Arrays.asList(10003L, 10005L, 10016L, 10015L);
+    private final List<Long> notInventory = Arrays.asList(10005L, 10016L);
 
     @Autowired
     private RedisCache redisCache;
 
+    @Autowired
+    ICarInfoService iCarInfoService;
+
 
     @Override
     @Transactional
@@ -107,7 +114,7 @@ public class TianaoServiceImpl implements TianaoService {
             if (ObjectUtil.isNull(toAddress)) {
                 return returnJson("e0001", "目标位置不存在", "fail");
             }
-            if ("N".equals(toAddress.getIsEmpty())) {
+            if (!notInventory.contains(toAddress.getZoneId()) && "N".equals(toAddress.getIsEmpty())) {
                 return returnJson("e0001", "目标位置库存不为空", "fail");
             }
             if (formAddress.getZoneId().equals(10004L) || toAddress.getZoneId().equals(10004L)) {
@@ -118,6 +125,10 @@ public class TianaoServiceImpl implements TianaoService {
                 WcsTask wcsTask = createWcsTask(tianaoTask, formAddress, toAddress, "0");
                 formAddress.setIsEmpty("N");
                 iBaseLocationInfoService.updateBaseLocationInfo(formAddress);
+                if (notInventory.contains(toAddress.getZoneId())) {
+                    toAddress.setIsEmpty("N");
+                    iBaseLocationInfoService.updateBaseLocationInfo(toAddress);
+                }
                 wcsTaskService.insertWcsTask(wcsTask);
             } else {
                 //拆分任务,获取任务执行的中转区
@@ -204,20 +215,21 @@ public class TianaoServiceImpl implements TianaoService {
         if ("N".equals(baseLocationInfo.getIsEmpty())) {
             return returnJson("e0001", "目标卸货点不为空", "fail");
         }
+        log.info("查询出的任务:{}", wcsTask);
         if (wcsTask.getState() != 9L) {
             try {
                 AmsTask amsTask = new AmsTask();
                 amsTask.setTaskNo(wcsTask.getTaskNo());
                 amsTask = amsTaskService.selectAmsTaskByModel(amsTask);
-                Integer carNo = Integer.getInteger(wcsTask.getAgvNo());
+                Integer carNo = Integer.parseInt(wcsTask.getAgvNo());
                 if (ObjectUtil.isNotNull(carNo)) {
                     //修改AGV任务目标地址
                     statusUpdateService.confirmAnalysis(wcsTask.getTaskNo(), amsTask.getAciIndex(), carNo
-                            , "02", baseLocationInfo.getId().toString());
-                    Thread.sleep(1000);
-                    statusUpdateService.confirmAnalysis(wcsTask.getTaskNo(), amsTask.getAciIndex(), carNo
-                            , "10", "1");
+                            , "07", baseLocationInfo.getAgvStation().toString());
                     Thread.sleep(1000);
+                    //添加切换导航的对接
+//                    statusUpdateService.changeNavigation(carNo,amsTask.getIkey(),"0001");
+                    log.info("AGV修改目标点:{}", baseLocationInfo.getLocationNo().toString());
                 }
             } catch (Exception e) {
                 log.info(e.getMessage());
@@ -232,6 +244,7 @@ public class TianaoServiceImpl implements TianaoService {
         return returnJson("e0001", "任务修改卸货点失败", "fail");
     }
 
+
     @EventListener
     @Async
     public String getAGVCoordinate(CarStatus car) {
@@ -242,7 +255,7 @@ public class TianaoServiceImpl implements TianaoService {
         jsonObject1.put("x", car.getX());
         jsonObject1.put("time", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, new Date()));
         jsonObject.put("HEADER", jsonObject1);
-        log.info("反馈AGV坐标请求参数:{}", jsonObject);
+//        log.info("反馈AGV坐标请求参数:{}", jsonObject);
 //        String body = HttpRequest.post(AGVStatusBackUrl)
 //                .body(jsonObject.toString())
 //                .contentType("application/json").execute().body();
@@ -255,24 +268,30 @@ public class TianaoServiceImpl implements TianaoService {
     @Async
     public String tianaoCallBack(WcsTask wcsTask) {
         if (StringUtils.isNotEmpty(wcsTask.getExt7())) {
-            if (wcsTask.getState().equals(2L) && "1".equals(wcsTask.getExt5())){
+            if (wcsTask.getState().equals(2L) && "1".equals(wcsTask.getExt5())) {
                 return null;
             }
             JSONObject jsonObject = new JSONObject();
-            JSONObject jsonObject1 = new JSONObject();
-            jsonObject1.put("lcs_task_id", wcsTask.getExt7());
-            jsonObject1.put("container_no", wcsTask.getBatchNo());
-            jsonObject1.put("task_type", wcsTask.getBusinessType());
-            jsonObject1.put("task_status", wcsTask.getState());
-            jsonObject1.put("agv_no", wcsTask.getAgvNo());
-            jsonObject1.put("time", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, new Date()));
-            jsonObject.put("HEADER", jsonObject1);
+            System.out.println(wcsTask.getAgvNo());
+            if ((ObjectUtil.isNotNull(wcsTask.getAgvNo()) || StringUtils.isNotEmpty(wcsTask.getAgvNo())) && !"null".equals(wcsTask.getAgvNo())) {
+                CarInfo carInfo = new CarInfo();
+                carInfo.setCarno(Long.parseLong(wcsTask.getAgvNo()));
+                carInfo = iCarInfoService.selectCarInfoByModel(carInfo);
+                if (ObjectUtil.isNotNull(carInfo)) {
+                    jsonObject.put("agv_no", carInfo.getUserdefine1());
+                }
+            }
+            jsonObject.put("lcs_task_id", wcsTask.getExt7());
+            jsonObject.put("container_no", wcsTask.getBatchNo());
+            jsonObject.put("task_type", wcsTask.getExt6());
+            jsonObject.put("task_status", wcsTask.getState());
+            jsonObject.put("time", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, new Date()));
             log.info("反馈任务状态请求参数:{}", jsonObject);
-//            String body = HttpRequest.post(taskBackUrl)
-//                    .body(jsonObject.toString())
-//                    .contentType("application/json").execute().body();
-//            log.info("反馈任务状态回调结果:{}", body);
-//            return body;
+            String body = HttpRequest.post(taskBackUrl)
+                    .body(jsonObject.toString())
+                    .contentType("application/json").execute().body();
+            log.info("反馈任务状态回调结果:{}", body);
+            return body;
         }
         return null;
     }
@@ -301,7 +320,7 @@ public class TianaoServiceImpl implements TianaoService {
         WcsTask wcsTask = new WcsTask();
         wcsTask.setTaskNo(System.currentTimeMillis() + "");
         wcsTask.setState(9L);
-        wcsTask.setTaskType(Constant.TASK_TYPE.Handling.getValue());
+        wcsTask.setTaskType(Constant.TASK_TYPE.FORWARD.getValue());
         wcsTask.setBusinessType("01");
         wcsTask.setAreaFrom(formAddress.getZoneId().toString());
         wcsTask.setLocationFrom(formAddress.getId().toString());
@@ -314,6 +333,7 @@ public class TianaoServiceImpl implements TianaoService {
         wcsTask.setExt7(tianaoTask.getLcs_task_id());
         wcsTask.setBatchNo(tianaoTask.getContainer_no());
         wcsTask.setExt5(frontLoadingOrNot);
+        wcsTask.setExt6(tianaoTask.getTask_type());
         return wcsTask;
     }
 }