zhangxin 1 năm trước cách đây
mục cha
commit
f62be6a0a1
73 tập tin đã thay đổi với 1226 bổ sung908 xóa
  1. 0 0
      base_sql/base.sql
  2. 0 0
      base_sql/business_sql/business_ddl.sql
  3. 0 0
      base_sql/business_sql/business_dml.sql
  4. 15 0
      pom.xml
  5. 1 1
      ry.bat
  6. 1 1
      ry.sh
  7. 1 2
      warewms-ams/src/main/java/com/warewms/business/service/impl/BusinessServiceImpl.java
  8. 5 1
      warewms-ams/src/main/java/com/warewms/common/AmsConstant.java
  9. 100 110
      warewms-ams/src/main/java/com/warewms/ndc/AciService.java
  10. 0 45
      warewms-ams/src/main/java/com/warewms/ndc/controller/AmsTaskController.java
  11. 0 96
      warewms-ams/src/main/java/com/warewms/ndc/domain/AmsHexdefineHeader.java
  12. 29 0
      warewms-ams/src/main/java/com/warewms/ndc/service/BusinessMsgEventHandler.java
  13. 0 70
      warewms-ams/src/main/java/com/warewms/ndc/service/IAmsHexdefineHeaderService.java
  14. 0 50
      warewms-ams/src/main/java/com/warewms/ndc/service/SocketBufferService.java
  15. 12 26
      warewms-ams/src/main/java/com/warewms/ndc/service/impl/SocketBufferServiceImpl.java
  16. 0 20
      warewms-ams/src/main/java/com/warewms/ndc/service/StatusUpdateService.java
  17. 0 149
      warewms-ams/src/main/java/com/warewms/ndc/service/impl/AmsHexdefineHeaderServiceImpl.java
  18. 0 63
      warewms-ams/src/main/java/com/warewms/ndc/service/impl/StatusUpdateServiceImpl.java
  19. 0 91
      warewms-ams/src/main/java/com/warewms/nio/NioBaseServer.java
  20. 88 0
      warewms-ams/src/main/java/com/warewms/task/controller/AmsTaskController.java
  21. 1 1
      warewms-ams/src/main/java/com/warewms/ndc/domain/AmsHexdefineDetail.java
  22. 1 1
      warewms-ams/src/main/java/com/warewms/ndc/domain/AmsNdcEvent.java
  23. 1 1
      warewms-ams/src/main/java/com/warewms/ndc/domain/AmsTask.java
  24. 10 0
      warewms-ams/src/main/java/com/warewms/task/domain/AmsTaskConfig.java
  25. 1 1
      warewms-ams/src/main/java/com/warewms/ndc/dto/AmsTaskCallBackDTO.java
  26. 1 1
      warewms-ams/src/main/java/com/warewms/ndc/dto/AmsTaskCancelDTO.java
  27. 20 0
      warewms-ams/src/main/java/com/warewms/task/dto/AmsTaskCancelToWmsDTO.java
  28. 166 0
      warewms-ams/src/main/java/com/warewms/task/dto/AmsTaskDTO.java
  29. 1 1
      warewms-ams/src/main/java/com/warewms/ndc/dto/AmsTaskInfoDTO.java
  30. 1 1
      warewms-ams/src/main/java/com/warewms/ndc/dto/AmsTaskInsertDTO.java
  31. 1 1
      warewms-ams/src/main/java/com/warewms/ndc/dto/AmsTaskStateFeedbackDTO.java
  32. 123 0
      warewms-ams/src/main/java/com/warewms/task/dto/BaseLocationInfoDTO.java
  33. 45 0
      warewms-ams/src/main/java/com/warewms/task/dto/BaseLocationInfoInsertDTO.java
  34. 2 2
      warewms-ams/src/main/java/com/warewms/ndc/mapper/AmsHexdefineDetailMapper.java
  35. 2 3
      warewms-ams/src/main/java/com/warewms/ndc/mapper/AmsHexdefineHeaderMapper.java
  36. 2 2
      warewms-ams/src/main/java/com/warewms/ndc/mapper/AmsNdcEventMapper.java
  37. 2 2
      warewms-ams/src/main/java/com/warewms/ndc/mapper/AmsTaskMapper.java
  38. 3 3
      warewms-ams/src/main/java/com/warewms/ndc/service/IAmsHexdefineDetailService.java
  39. 2 2
      warewms-ams/src/main/java/com/warewms/ndc/service/IAmsNdcEventService.java
  40. 9 6
      warewms-ams/src/main/java/com/warewms/ndc/service/IAmsTaskService.java
  41. 5 5
      warewms-ams/src/main/java/com/warewms/ndc/service/impl/AmsHexdefineDetailServiceImpl.java
  42. 4 4
      warewms-ams/src/main/java/com/warewms/ndc/service/impl/AmsNdcEventServiceImpl.java
  43. 63 11
      warewms-ams/src/main/java/com/warewms/ndc/service/impl/AmsTaskServiceImpl.java
  44. 1 2
      warewms-ams/src/main/java/com/warewms/thread/ClientHandler.java
  45. 1 2
      warewms-ams/src/main/java/com/warewms/wcs/service/impl/WcsServiceImpl.java
  46. 1 1
      warewms-ams/src/main/resources/mapper/ams/AmsHexdefineDetailMapper.xml
  47. 0 102
      warewms-ams/src/main/resources/mapper/ams/AmsHexdefineHeaderMapper.xml
  48. 1 1
      warewms-ams/src/main/resources/mapper/ams/AmsNdcEventMapper.xml
  49. 1 1
      warewms-ams/src/main/resources/mapper/ams/AmsTaskMapper.xml
  50. 2 2
      warewms-wms/install.sh
  51. 7 1
      warewms-wms/pom.xml
  52. 0 5
      warewms-wms/src/main/java/com/warewms/common/base/domain/BaseEntity.java
  53. 11 0
      warewms-wms/src/main/java/com/warewms/common/base/domain/BaseExtEntity.java
  54. 2 2
      warewms-wms/src/main/java/com/warewms/common/constant/Constants.java
  55. 30 0
      warewms-wms/src/main/java/com/warewms/common/constant/EnumType.java
  56. 7 0
      warewms-wms/src/main/java/com/warewms/common/constant/base/BizEnum.java
  57. 30 0
      warewms-wms/src/main/java/com/warewms/common/constant/base/EnumUtils.java
  58. 5 0
      warewms-wms/src/main/java/com/warewms/common/utils/DateUtils.java
  59. 34 0
      warewms-wms/src/main/java/com/warewms/common/utils/JacksonUtil.java
  60. 228 0
      warewms-wms/src/main/java/com/warewms/common/utils/webclient/WebClientUtils.java
  61. 24 0
      warewms-wms/src/main/java/com/warewms/common/utils/webclient/bean/BaseRequest.java
  62. 31 0
      warewms-wms/src/main/java/com/warewms/common/utils/webclient/bean/BaseResponse.java
  63. 9 0
      warewms-wms/src/main/java/com/warewms/common/utils/webclient/bean/BizGetRequest.java
  64. 9 0
      warewms-wms/src/main/java/com/warewms/common/utils/webclient/bean/BizPostRequest.java
  65. 9 0
      warewms-wms/src/main/java/com/warewms/common/utils/webclient/bean/BizRequest.java
  66. 1 1
      warewms-wms/src/main/java/com/warewms/framework/config/CaptchaConfig.java
  67. 54 0
      warewms-wms/src/main/java/com/warewms/framework/config/MybatisPlusMetaObjectHandler.java
  68. 1 1
      warewms-wms/src/main/java/com/warewms/generator/controller/GenController.java
  69. 1 1
      warewms-wms/src/main/resources/application-prod.yml
  70. 4 9
      warewms-wms/src/main/resources/application.yml
  71. 1 1
      warewms-wms/src/main/resources/banner.txt
  72. 2 2
      warewms-wms/src/main/resources/generator.yml
  73. 1 1
      warewms-wms/src/main/resources/logback.xml

base_sql/ry_20210908.sql → base_sql/base.sql


base_sql/pallet_sql/jinyinhua_ddl_20231025.sql → base_sql/business_sql/business_ddl.sql


base_sql/pallet_sql/jinyinhua_dml_20231025.sql → base_sql/business_sql/business_dml.sql


+ 15 - 0
pom.xml

@@ -37,6 +37,8 @@
         <lombok.version>1.18.24</lombok.version>
         <hutool.version>5.8.5</hutool.version>
         <httpclient.version>4.5.2</httpclient.version>
+        <guava.version>23.0</guava.version>
+        <flux.version>2.5.9</flux.version>
     </properties>
 
     <!-- 依赖声明 -->
@@ -184,6 +186,19 @@
                 <version>${httpclient.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>${guava.version}</version>
+            </dependency>
+
+            <!-- WebClient支持 -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-webflux</artifactId>
+                <version>${flux.version}</version>
+            </dependency>
+
             <!-- warewms基础信息模块-->
             <dependency>
                 <groupId>com.warewms</groupId>

+ 1 - 1
ry.bat

@@ -1,7 +1,7 @@
 @echo off
 
 rem jarƽ¼¶Ä¿Â¼
-set AppName=ruoyi-admin.jar
+set AppName=warewms-wms.jar
 
 rem JVM²ÎÊý
 set JVM_OPTS="-Dname=%AppName%  -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps  -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"

+ 1 - 1
ry.sh

@@ -1,6 +1,6 @@
 #!/bin/sh
 # ./ry.sh start 启动 stop 停止 restart 重启 status 状态
-AppName=ruoyi-admin.jar
+AppName=warewms-wms.jar
 
 # JVM参数
 JVM_OPTS="-Dname=$AppName  -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps  -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"

+ 1 - 2
warewms-ams/src/main/java/com/warewms/business/service/impl/BusinessServiceImpl.java

@@ -19,8 +19,7 @@ import com.warewms.common.utils.redis.RedisKey;
 import com.warewms.common.utils.uuid.SnowflakeIdWorker;
 import com.warewms.ndc.common.ByteUtil;
 import com.warewms.ndc.common.CRC16Util;
-import com.warewms.ndc.domain.AmsTask;
-import com.warewms.ndc.service.IAmsTaskService;
+import com.warewms.task.domain.AmsTask;
 import com.warewms.wms.asn.form.PaForm;
 import com.warewms.wms.asn.service.IWmsDocAsnHeaderService;
 import com.warewms.wms.base.dto.BaseLocationInfoSameColDTO;

+ 5 - 1
warewms-ams/src/main/java/com/warewms/common/AmsConstant.java

@@ -231,7 +231,11 @@ public class AmsConstant {
         /**
          * 未下发
          */
-        N(0);
+        N(0),
+        /**
+         * 已取消
+         */
+        D(2);
 
         private Integer value;
 

+ 100 - 110
warewms-ams/src/main/java/com/warewms/ndc/AciService.java

@@ -4,27 +4,22 @@ import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSON;
 import com.warewms.common.AmsConstant;
-import com.warewms.common.exception.base.BaseException;
 import com.warewms.ndc.common.Aci;
 import com.warewms.ndc.common.ByteUtil;
-import com.warewms.ndc.domain.AmsHexdefineDetail;
-import com.warewms.ndc.domain.AmsTask;
+import com.warewms.task.domain.AmsHexdefineDetail;
+import com.warewms.task.domain.AmsTask;
 import com.warewms.ndc.entity.Order;
-import com.warewms.ndc.service.IAmsHexdefineDetailService;
-import com.warewms.ndc.service.IAmsTaskService;
-import com.warewms.ndc.service.SocketBufferService;
+import com.warewms.ndc.service.BusinessMsgEventHandler;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.net.SocketAddress;
 import java.nio.ByteBuffer;
-import java.nio.channels.SelectionKey;
-import java.nio.channels.Selector;
 import java.nio.channels.SocketChannel;
 import java.util.Date;
-import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -40,46 +35,46 @@ public class AciService {
 
     private static final int BUFF_SIZE = 2048;
 
-    private static final String IP = "127.0.0.1";
+    private static final String IP_ADDR = "127.0.0.1";
 
-    private Selector selector;
-
-    private SocketChannel socketChannel;
-
-    private static final int PORT = 30002;
+    private static final int IP_PORT = 30002;
 
     @Autowired
-    private SocketBufferService socketBufferService;
+    private BusinessMsgEventHandler businessMsgEventHandler;
     @Autowired
     private IAmsTaskService amsTaskService;
     @Autowired
     private IAmsHexdefineDetailService amsHexdefineDetailService;
 
-    public void init() throws IOException {
-        selector = Selector.open();
-        try {
-            socketChannel = socketChannel.open(new InetSocketAddress(IP, PORT));
-            socketChannel.configureBlocking(false);
-            socketChannel.register(selector, SelectionKey.OP_READ);
-        } catch (Exception exception) {
-            log.warn("AciService socketChannel open is on error");
-            try {
-                Thread.currentThread().sleep(3000);
-            }catch (InterruptedException e) {
-                throw new BaseException(e.getMessage());
-            }
-            init();
-        }
-    }
-
     @SuppressWarnings("InfiniteLoopStatement")
     public void start() throws IOException {
-        init();
-        readInfo();
+
+        String ip_addr = IP_ADDR; //redisUtils.get(RedisEnum.NDC_IP.getMessage());
+        int ip_port = IP_PORT; //redisUtils.getInt(RedisEnum.NDC_PORT.getMessage());
+
+        SocketChannel socketChannel = SocketChannel.open();
+        socketChannel.configureBlocking(false); // 解决了IO阻塞
         while (true) {
+
             try {
+                //链接服务端Socket
+                if (!socketChannel.isConnected()) {
+                    if (!socketChannel.isOpen()) {
+                        socketChannel = SocketChannel.open();
+                        socketChannel.configureBlocking(false); // 解决了IO阻塞
+                    }
+                    // 非阻塞模式下 这段代码并不是等到连接建立之后再往下执行
+                    SocketAddress socketAddress = new InetSocketAddress(ip_addr, ip_port);
+                    socketChannel.connect(socketAddress);
+                    Thread.sleep(2000);
+                    if (socketChannel.isConnectionPending()) {
+                        socketChannel.finishConnect();
+                    }
+                }
+
                 ByteBuffer buffer = ByteBuffer.allocate(BUFF_SIZE);
                 buffer.clear();
+
                 //删除指令
                 AmsTask taskBean = new AmsTask();
                 taskBean.setIsDelete(1);
@@ -144,96 +139,91 @@ public class AciService {
                             continue;
                         }
 //                        try {
-                            String order = amsHexdefineDetailService.concatOrder(t, basTask);
-                            log.info("writeOrder:" + order);
-                            if (t.getBusinessType().equals("m") ||
-                                    t.getBusinessType().equals("01")
-                            ) {
-
-                                buffer.put(ByteUtil.hexString2ByteArray(order));
-                                buffer.flip();
-                                socketChannel.write(buffer);
-                                buffer.clear();
-                                if (DateUtil.between(t.getAddtime(), new Date(), DateUnit.MINUTE) > 2) {
-                                    t.setAciAccept(2);
-                                    t.setRoadway("下发超时2分钟未接收自动取消");
-                                    amsTaskService.updateAmsTask(t);
-                                }
-                            } else {
-                                buffer.put(ByteUtil.hexString2ByteArray(order));
-                                buffer.flip();
-                                socketChannel.write(buffer);
-                                buffer.clear();
-                                // 修改已发送
-                                t.setAciAccept(1);
-                                t.setRoadway("TS请求反馈任务发送成功!");
+                        String order = amsHexdefineDetailService.concatOrder(t, basTask);
+                        log.info("writeOrder:" + order);
+                        if (t.getBusinessType().equals("m") ||
+                                t.getBusinessType().equals("01")
+                        ) {
+
+                            buffer.put(ByteUtil.hexString2ByteArray(order));
+                            buffer.flip();
+                            socketChannel.write(buffer);
+                            buffer.clear();
+                            if (DateUtil.between(t.getAddtime(), new Date(), DateUnit.MINUTE) > 2) {
+                                t.setAciAccept(2);
+                                t.setRoadway("下发超时2分钟未接收自动取消");
                                 amsTaskService.updateAmsTask(t);
                             }
+                        } else {
+                            buffer.put(ByteUtil.hexString2ByteArray(order));
+                            buffer.flip();
+                            socketChannel.write(buffer);
+                            buffer.clear();
+                            // 修改已发送
+                            t.setAciAccept(1);
+                            t.setRoadway("TS请求反馈任务发送成功!");
+                            amsTaskService.updateAmsTask(t);
+                        }
+                    }
+                }
+
+                //从服务端读取
+                buffer.clear();
+                //因为设置了异步 这边不会阻塞 测试了一下 服务器断开这边会抛出异常 但是写的时候不会抛出异常 可能是设置了异步的原因
+                int readLenth = socketChannel.read(buffer);
+                if (readLenth == -1) {
+//                    throw new IOException();
+                }
+                if (readLenth > 0) {
+                    buffer.flip();
+                    byte[] bytes = new byte[readLenth];
+                    buffer.get(bytes);
+                    List<Order> bufferSeparators = businessMsgEventHandler.bufferSeparator(bytes);
+                    for (Order order : bufferSeparators) {
+                        log.info("NDC Msg info is :{}", order);
+                        switch (order.getMessageType()) {
+
+                            case Aci.MSG_ORDER_STATUS://车体状态信息、位置信息
+                                businessMsgEventHandler.handleMsgOrderStatus(order.getParameters());
+                                break;
+                            case Aci.MSG_EVENT://任务反馈、自定义消息
+                                businessMsgEventHandler.handleMsgEvent(order.getParameters());
+                                break;
+                            case Aci.MSG_STOP://交通管制暂停
+                                businessMsgEventHandler.handleMsgStopStart(order.getParameters(), true);
+                                break;
+                            case Aci.MSG_START://启动信息
+                                businessMsgEventHandler.handleMsgStopStart(order.getParameters(), false);
+                                break;
+                            case Aci.MSG_ORDER_ACK://信息接收反馈
+                                businessMsgEventHandler.handleMsgOrderAck(order.getParameters());
+                                break;
+                        }
                     }
                 }
+                buffer.clear();
+
                 try {
                     Thread.sleep(500);
                 } catch (InterruptedException e) {
-                    throw new BaseException(e.getMessage());
+                    e.printStackTrace();
                 }
 
-            }catch (Exception e) {
-                log.error("NDC通讯异常!");
+            }catch (IOException i) {
+                log.error("NDC通讯异常!" ,i);
                 try {
                     socketChannel.close();
                 } catch (Exception exception) {
-                    throw new BaseException(exception.getMessage());
+                    i.printStackTrace();
                 }
-                throw new BaseException(e.getMessage());
-            }
-        }
-    }
-
-    public void readInfo() {
-        //读取客户端消息
-        new Thread(() -> {
-            while (true) {
+            }catch (Exception e) {
+                e.printStackTrace();
                 try {
-                    int readChannels = selector.select();
-                    if (readChannels > 0) {
-                        Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
-                        while (iterator.hasNext()) {
-                            SelectionKey key = iterator.next();
-                            if (!key.isReadable()) {
-                                iterator.remove();
-                                continue;
-                            }
-                            SocketChannel channel = (SocketChannel) key.channel();
-                            ByteBuffer buffer = ByteBuffer.allocate(BUFF_SIZE);
-                            channel.read(buffer);
-                            List<Order> bufferSeparators = socketBufferService.bufferSeparator(buffer.array());
-                            for (Order order : bufferSeparators) {
-                                switch (order.getMessageType()) {
-                                    case Aci.MSG_ORDER_STATUS://车体状态信息、位置信息
-                                        socketBufferService.handleMsgOrderStatus(order.getParameters());
-                                        break;
-                                    case Aci.MSG_EVENT://任务反馈、自定义消息
-                                        socketBufferService.handleMsgEvent(order.getParameters());
-                                        break;
-                                    case Aci.MSG_STOP://交通管制暂停
-                                        socketBufferService.handleMsgStopStart(order.getParameters(), true);
-                                        break;
-                                    case Aci.MSG_START://启动信息
-                                        socketBufferService.handleMsgStopStart(order.getParameters(), false);
-                                        break;
-                                    case Aci.MSG_ORDER_ACK://信息接收反馈
-                                        socketBufferService.handleMsgOrderAck(order.getParameters());
-                                        break;
-                                }
-                            }
-                            iterator.remove();
-                        }
-                    }
-                    Thread.currentThread().sleep(3000);
-                } catch (Exception e) {
-                    throw new BaseException(e.getMessage());
+                    socketChannel.close();
+                } catch (Exception exception) {
+                    e.printStackTrace();
                 }
             }
-        }).start();
+        }
     }
 }

+ 0 - 45
warewms-ams/src/main/java/com/warewms/ndc/controller/AmsTaskController.java

@@ -1,45 +0,0 @@
-package com.warewms.ndc.controller;
-
-import com.warewms.common.base.controller.BaseController;
-import com.warewms.common.base.domain.AjaxResult;
-import com.warewms.ndc.dto.AmsTaskCancelDTO;
-import com.warewms.ndc.dto.AmsTaskInfoDTO;
-import com.warewms.ndc.dto.AmsTaskInsertDTO;
-import com.warewms.ndc.service.IAmsTaskService;
-import org.assertj.core.util.Maps;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import javax.validation.Valid;
-
-/**
- * AGV任务Controller
- *
- * @author andy
- * @date 2022-03-10
- */
-@RestController
-@RequestMapping("/ams")
-public class AmsTaskController extends BaseController {
-    @Autowired
-    private IAmsTaskService amsTaskService;
-
-    @PostMapping(value = "/wcsTask/taskInsert")
-    public AjaxResult taskInsert(@RequestBody @Valid AmsTaskInsertDTO amsTaskInsertDTO) {
-        Long taskNo = amsTaskService.amsTaskInsert(amsTaskInsertDTO);
-        return AjaxResult.success("任务生成成功", Maps.newHashMap("taskNo", taskNo));
-    }
-
-    @GetMapping(value = "/wcsTask/getTaskInfo")
-    public AjaxResult getTaskInfo(@RequestParam String businessNo) {
-        AmsTaskInfoDTO AmsTaskInfoDTO = amsTaskService.getAmsTaskInfo(businessNo);
-        return AjaxResult.success(AmsTaskInfoDTO);
-    }
-
-    @PostMapping(value = "/wcsTask/taskCancel")
-    public AjaxResult taskCancel(@RequestBody @Valid AmsTaskCancelDTO amsTaskCancelDTO) {
-        amsTaskService.cancelAmsTask(amsTaskCancelDTO);
-        return AjaxResult.success();
-    }
-
-}

+ 0 - 96
warewms-ams/src/main/java/com/warewms/ndc/domain/AmsHexdefineHeader.java

@@ -1,96 +0,0 @@
-package com.warewms.ndc.domain;
-
-import com.warewms.common.annotation.Excel;
-import com.warewms.common.base.domain.BaseEntity;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
-import java.util.Date;
-import java.util.List;
-
-/**
- * 16进制指令定义对象 ams_hexdefine_header
- * 
- * @author andy
- * @date 2022-08-12
- */
-public class AmsHexdefineHeader extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 主键 */
-    private Long id;
-
-    /** 任务名称 */
-    @Excel(name = "任务名称")
-    private String taskName;
-
-    /** 任务类型 */
-    @Excel(name = "任务类型")
-    private String businessType;
-
-    /** $column.columnComment */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private Date createDate;
-
-    /** 任务定义(lp0-lp30)信息 */
-    private List<AmsHexdefineDetail> amsHexdefineDetailList;
-
-    public void setId(Long id) 
-    {
-        this.id = id;
-    }
-
-    public Long getId() 
-    {
-        return id;
-    }
-    public void setTaskName(String taskName) 
-    {
-        this.taskName = taskName;
-    }
-
-    public String getTaskName() 
-    {
-        return taskName;
-    }
-    public void setBusinessType(String businessType) 
-    {
-        this.businessType = businessType;
-    }
-
-    public String getBusinessType() 
-    {
-        return businessType;
-    }
-    public void setCreateDate(Date createDate) 
-    {
-        this.createDate = createDate;
-    }
-
-    public Date getCreateDate() 
-    {
-        return createDate;
-    }
-
-    public List<AmsHexdefineDetail> getAmsHexdefineDetailList()
-    {
-        return amsHexdefineDetailList;
-    }
-
-    public void setAmsHexdefineDetailList(List<AmsHexdefineDetail> amsHexdefineDetailList)
-    {
-        this.amsHexdefineDetailList = amsHexdefineDetailList;
-    }
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("id", getId())
-            .append("taskName", getTaskName())
-            .append("businessType", getBusinessType())
-            .append("createDate", getCreateDate())
-            .append("amsHexdefineDetailList", getAmsHexdefineDetailList())
-            .toString();
-    }
-}

+ 29 - 0
warewms-ams/src/main/java/com/warewms/ndc/service/BusinessMsgEventHandler.java

@@ -0,0 +1,29 @@
+package com.warewms.ndc.service;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.warewms.task.domain.AmsTask;
+import com.warewms.task.service.IAmsTaskService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class BusinessMsgEventHandler extends SocketBufferServiceImpl {
+
+    @Autowired
+    private IAmsTaskService amsTaskService;
+
+    @Override
+    protected void onHandleMsgEvent(long taskId, int carNo) {
+        AmsTask amsTask = amsTaskService.selectAmsTaskById(taskId);
+        if (ObjectUtil.isNull(amsTask)) return;
+
+        log.info("任务回调-------------------------》" + amsTask.getTaskNo());
+        if (amsTask.getAciIndex() == null) {
+            log.error("没有index,未下发的任务");
+        }
+
+        amsTaskService.updateAmsTask(amsTask);
+    }
+}

+ 0 - 70
warewms-ams/src/main/java/com/warewms/ndc/service/IAmsHexdefineHeaderService.java

@@ -1,70 +0,0 @@
-package com.warewms.ndc.service;
-
-import com.warewms.ndc.domain.AmsHexdefineHeader;
-
-import java.util.List;
-
-/**
- * 16进制指令定义Service接口
- * 
- * @author andy
- * @date 2022-08-12
- */
-public interface IAmsHexdefineHeaderService 
-{
-    /**
-     * 查询16进制指令定义
-     * 
-     * @param id 16进制指令定义主键
-     * @return 16进制指令定义
-     */
-     AmsHexdefineHeader selectAmsHexdefineHeaderById(Long id);
-
-    /**
-     * 查询16进制指令定义列表
-     * 
-     * @param amsHexdefineHeader 16进制指令定义
-     * @return 16进制指令定义集合
-     */
-     List<AmsHexdefineHeader> selectAmsHexdefineHeaderList(AmsHexdefineHeader amsHexdefineHeader);
-
-    /**
-     * 查询16进制指令定义
-     *
-     * @param amsHexdefineHeader 16进制指令定义
-     * @return 16进制指令定义集合
-     */
-    AmsHexdefineHeader selectAmsHexdefineHeaderByModel(AmsHexdefineHeader amsHexdefineHeader);
-
-    /**
-     * 新增16进制指令定义
-     * 
-     * @param amsHexdefineHeader 16进制指令定义
-     * @return 结果
-     */
-     int insertAmsHexdefineHeader(AmsHexdefineHeader amsHexdefineHeader);
-
-    /**
-     * 修改16进制指令定义
-     * 
-     * @param amsHexdefineHeader 16进制指令定义
-     * @return 结果
-     */
-     int updateAmsHexdefineHeader(AmsHexdefineHeader amsHexdefineHeader);
-
-    /**
-     * 批量删除16进制指令定义
-     * 
-     * @param ids 需要删除的16进制指令定义主键集合
-     * @return 结果
-     */
-     int deleteAmsHexdefineHeaderByIds(Long[] ids);
-
-    /**
-     * 删除16进制指令定义信息
-     * 
-     * @param id 16进制指令定义主键
-     * @return 结果
-     */
-     int deleteAmsHexdefineHeaderById(Long id);
-}

+ 0 - 50
warewms-ams/src/main/java/com/warewms/ndc/service/SocketBufferService.java

@@ -1,50 +0,0 @@
-package com.warewms.ndc.service;
-
-import com.warewms.ndc.entity.Order;
-
-import java.util.List;
-
-/**
- * Created by IntelliJ IDEA.
- * User: andy.qu
- * Date: 2022/8/5
- * Description: NDC消息拆包
- */
-public interface SocketBufferService {
-    /**
-     * TCP拆包
-     * @param buffer 2048长度的流数据,实际内容可能不足2048,也有可能超2048
-     * @return
-     */
-    List<Order> bufferSeparator(byte[] buffer);
-
-
-    //根据Message Type的不同进行不同的业务处理
-    //目前用到的是b、s、E、R、t
-
-    /**
-     * 处理s消息
-     * 车辆电量、车辆坐标点
-     * @param parameters 截取的参数
-     */
-    void handleMsgOrderStatus(byte[] parameters);
-
-    /**
-     * 处理e消息
-     * 主要业务处理均在此处
-     * @param parameters 截取的参数
-     */
-    void handleMsgEvent(byte[] parameters);
-
-    /**
-     * NDC消息接收反馈
-     * @param parameters 截取的参数
-     */
-    void handleMsgOrderAck(byte[] parameters);
-
-    /**
-     * 处理车辆交管停止(R)和启动消息(t)
-     * @param parameters 截取的参数
-     */
-    void handleMsgStopStart(byte[] parameters, boolean isStop);
-}

+ 12 - 26
warewms-ams/src/main/java/com/warewms/ndc/service/impl/SocketBufferServiceImpl.java

@@ -1,18 +1,16 @@
-package com.warewms.ndc.service.impl;
+package com.warewms.ndc.service;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
-import com.warewms.common.constant.WmsConstant;
+import com.warewms.common.utils.string.StringUtils;
 import com.warewms.ndc.common.Aci;
 import com.warewms.ndc.common.ByteUtil;
-import com.warewms.ndc.domain.AmsNdcEvent;
-import com.warewms.ndc.domain.AmsTask;
-import com.warewms.ndc.service.IAmsNdcEventService;
-import com.warewms.ndc.service.IAmsTaskService;
-import com.warewms.ndc.service.SocketBufferService;
-import com.warewms.ndc.service.StatusUpdateService;
+import com.warewms.ndc.entity.Order;
+import com.warewms.task.domain.AmsNdcEvent;
+import com.warewms.task.domain.AmsTask;
+import com.warewms.task.service.IAmsNdcEventService;
+import com.warewms.task.service.IAmsTaskService;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -31,14 +29,12 @@ import java.util.concurrent.TimeUnit;
  */
 @Slf4j
 @Component
-public class SocketBufferServiceImpl implements SocketBufferService {
+public abstract class SocketBufferServiceImpl {
 
     @Autowired
     private IAmsNdcEventService amsNdcEventService;
     @Autowired
     private IAmsTaskService amsTaskService;
-    @Autowired
-    private StatusUpdateService statusUpdateService;
 
     // 创建一个线程池
     private static ExecutorService executorService;
@@ -50,7 +46,6 @@ public class SocketBufferServiceImpl implements SocketBufferService {
                 , new SynchronousQueue<Runnable>(true));
     }
 
-    @Override
     public List<Order> bufferSeparator(byte[] buffer) {
         List<Order> orderList = new ArrayList<>();
         String bufferStr = ByteUtil.byteArray2HexString(buffer);
@@ -98,7 +93,6 @@ public class SocketBufferServiceImpl implements SocketBufferService {
         return orderList;
     }
 
-    @Override
     public void handleMsgOrderStatus(byte[] parameters) {
         int carNo = ByteUtil.getUnsignedShort(parameters, 6);
         switch (parameters[5]) {
@@ -116,7 +110,6 @@ public class SocketBufferServiceImpl implements SocketBufferService {
         }
     }
 
-    @Override
     public void handleMsgEvent(byte[] parameters) {
         int icarNo = ByteUtil.getShort(parameters, 40);
         AmsNdcEvent event = new AmsNdcEvent();
@@ -131,9 +124,6 @@ public class SocketBufferServiceImpl implements SocketBufferService {
             event.setLp3("" + ByteUtil.getInt(parameters, 42));
             event.setLp4("" + ByteUtil.getInt(parameters, 46));
             int eventId = event.getId();
-            if (ObjectUtil.isNotNull(WmsConstant.TASK_STS.getValueByKey(eventId))){
-                statusUpdateService.taskStateResponse(WmsConstant.TASK_STS.getValueByKey(eventId), icarNo, Integer.parseInt(event.getLp1()));
-            }
             AmsTask taskBean = new AmsTask();
 
 //            log.info("----event:" + eventId);
@@ -155,9 +145,7 @@ public class SocketBufferServiceImpl implements SocketBufferService {
                     amsTaskService.updateAmsTask(taskBeanUpdate);
                     //任务状态回调
                     long taskId_85 = taskBean.getId().longValue();
-                    executorService.execute(() -> {
-                        statusUpdateService.updateStatus(taskId_85, icarNo);
-                    });
+                    executorService.execute(() -> onHandleMsgEvent(taskId_85, icarNo));
                     break;
                 case 86://user event Order Receive              任务开始
                 case 87://user event FETCH(LP1) is Invalid!!
@@ -183,9 +171,7 @@ public class SocketBufferServiceImpl implements SocketBufferService {
                         amsTaskService.updateAmsTask(taskBeanUpdate01);
 
                         long taskId = taskBean.getId().longValue();
-                        executorService.execute(() -> {
-                            statusUpdateService.updateStatus(taskId, icarNo);
-                        });
+                        executorService.execute(() -> onHandleMsgEvent(taskId, icarNo));
                     }
                     break;
                 case 112://user event  Carrier status
@@ -302,7 +288,6 @@ public class SocketBufferServiceImpl implements SocketBufferService {
 
     }
 
-    @Override
     public void handleMsgOrderAck(byte[] parameters) {
         AmsTask taskBean = new AmsTask();
         String ndcStatusValue;
@@ -436,8 +421,9 @@ public class SocketBufferServiceImpl implements SocketBufferService {
         }
     }
 
-    @Override
     public void handleMsgStopStart(byte[] parameters, boolean isStop) {
 
     }
+
+    protected abstract void onHandleMsgEvent(long taskId, int carNo);
 }

+ 0 - 20
warewms-ams/src/main/java/com/warewms/ndc/service/StatusUpdateService.java

@@ -1,20 +0,0 @@
-package com.warewms.ndc.service;
-
-/**
- * Created by IntelliJ IDEA.
- * User: andy.qu
- * Date: 2022/8/8
- * Description:
- */
-public interface StatusUpdateService {
-
-    void taskStateResponse(Integer state, Integer carNo, Integer aciIndex);
-
-    /**
-     * 任务状态反馈
-     *
-     * @param id    amstaskid
-     * @param carNo 车号(只有取货完成后才会有反馈)
-     */
-    void updateStatus(Long id, Integer carNo);
-}

+ 0 - 149
warewms-ams/src/main/java/com/warewms/ndc/service/impl/AmsHexdefineHeaderServiceImpl.java

@@ -1,149 +0,0 @@
-package com.warewms.ndc.service.impl;
-
-import cn.hutool.core.collection.CollectionUtil;
-import com.warewms.ndc.domain.AmsHexdefineDetail;
-import com.warewms.ndc.domain.AmsHexdefineHeader;
-import com.warewms.ndc.mapper.AmsHexdefineHeaderMapper;
-import com.warewms.ndc.service.IAmsHexdefineHeaderService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 16进制指令定义Service业务层处理
- * 
- * @author andy
- * @date 2022-08-12
- */
-@Service
-public class AmsHexdefineHeaderServiceImpl implements IAmsHexdefineHeaderService
-{
-    @Autowired
-    private AmsHexdefineHeaderMapper amsHexdefineHeaderMapper;
-
-    /**
-     * 查询16进制指令定义
-     * 
-     * @param id 16进制指令定义主键
-     * @return 16进制指令定义
-     */
-    @Override
-    public AmsHexdefineHeader selectAmsHexdefineHeaderById(Long id)
-    {
-        return amsHexdefineHeaderMapper.selectAmsHexdefineHeaderById(id);
-    }
-
-    /**
-     * 查询16进制指令定义列表
-     * 
-     * @param amsHexdefineHeader 16进制指令定义
-     * @return 16进制指令定义
-     */
-    @Override
-    public List<AmsHexdefineHeader> selectAmsHexdefineHeaderList(AmsHexdefineHeader amsHexdefineHeader)
-    {
-        return amsHexdefineHeaderMapper.selectAmsHexdefineHeaderList(amsHexdefineHeader);
-    }
-
-    /**
-     * 查询16进制指令定义
-     *
-     * @param amsHexdefineHeader 16进制指令定义
-     * @return 16进制指令定义
-     */
-    @Override
-    public AmsHexdefineHeader selectAmsHexdefineHeaderByModel(AmsHexdefineHeader amsHexdefineHeader)
-    {
-        List<AmsHexdefineHeader> list = amsHexdefineHeaderMapper.selectAmsHexdefineHeaderList(amsHexdefineHeader);
-        if (list!=null && list.size()>0) {
-            return list.get(0);
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * 新增16进制指令定义
-     * 
-     * @param amsHexdefineHeader 16进制指令定义
-     * @return 结果
-     */
-    @Transactional
-    @Override
-    public int insertAmsHexdefineHeader(AmsHexdefineHeader amsHexdefineHeader)
-    {
-        int rows = amsHexdefineHeaderMapper.insertAmsHexdefineHeader(amsHexdefineHeader);
-        insertAmsHexdefineDetail(amsHexdefineHeader);
-        return rows;
-    }
-
-    /**
-     * 修改16进制指令定义
-     * 
-     * @param amsHexdefineHeader 16进制指令定义
-     * @return 结果
-     */
-    @Transactional
-    @Override
-    public int updateAmsHexdefineHeader(AmsHexdefineHeader amsHexdefineHeader)
-    {
-        amsHexdefineHeaderMapper.deleteAmsHexdefineDetailByBusinessType(amsHexdefineHeader.getId());
-        insertAmsHexdefineDetail(amsHexdefineHeader);
-        return amsHexdefineHeaderMapper.updateAmsHexdefineHeader(amsHexdefineHeader);
-    }
-
-    /**
-     * 批量删除16进制指令定义
-     * 
-     * @param ids 需要删除的16进制指令定义主键
-     * @return 结果
-     */
-    @Transactional
-    @Override
-    public int deleteAmsHexdefineHeaderByIds(Long[] ids)
-    {
-        amsHexdefineHeaderMapper.deleteAmsHexdefineDetailByBusinessTypes(ids);
-        return amsHexdefineHeaderMapper.deleteAmsHexdefineHeaderByIds(ids);
-    }
-
-    /**
-     * 删除16进制指令定义信息
-     * 
-     * @param id 16进制指令定义主键
-     * @return 结果
-     */
-    @Transactional
-    @Override
-    public int deleteAmsHexdefineHeaderById(Long id)
-    {
-        amsHexdefineHeaderMapper.deleteAmsHexdefineDetailByBusinessType(id);
-        return amsHexdefineHeaderMapper.deleteAmsHexdefineHeaderById(id);
-    }
-
-    /**
-     * 新增任务定义(lp0-lp30)信息
-     * 
-     * @param amsHexdefineHeader 16进制指令定义对象
-     */
-    public void insertAmsHexdefineDetail(AmsHexdefineHeader amsHexdefineHeader)
-    {
-        List<AmsHexdefineDetail> amsHexdefineDetailList = amsHexdefineHeader.getAmsHexdefineDetailList();
-        String businessType = amsHexdefineHeader.getBusinessType();
-        if (CollectionUtil.isNotEmpty(amsHexdefineDetailList))
-        {
-            List<AmsHexdefineDetail> list = new ArrayList<AmsHexdefineDetail>();
-            for (AmsHexdefineDetail amsHexdefineDetail : amsHexdefineDetailList)
-            {
-                amsHexdefineDetail.setBusinessType(businessType);
-                list.add(amsHexdefineDetail);
-            }
-            if (list.size() > 0)
-            {
-                amsHexdefineHeaderMapper.batchAmsHexdefineDetail(list);
-            }
-        }
-    }
-}

+ 0 - 63
warewms-ams/src/main/java/com/warewms/ndc/service/impl/StatusUpdateServiceImpl.java

@@ -1,63 +0,0 @@
-package com.warewms.ndc.service.impl;
-
-import cn.hutool.core.util.ObjectUtil;
-import com.alibaba.fastjson.JSONObject;
-import com.warewms.common.constant.WmsConstant;
-import com.warewms.ndc.domain.AmsTask;
-import com.warewms.ndc.dto.AmsTaskStateFeedbackDTO;
-import com.warewms.ndc.service.IAmsTaskService;
-import com.warewms.ndc.service.StatusUpdateService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.retry.annotation.Backoff;
-import org.springframework.retry.annotation.Retryable;
-import org.springframework.stereotype.Component;
-import org.springframework.web.client.RestClientException;
-import org.springframework.web.client.RestTemplate;
-
-@Slf4j
-@Component
-public class StatusUpdateServiceImpl implements StatusUpdateService {
-
-    @Autowired
-    private IAmsTaskService amsTaskService;
-
-    private RestTemplate restTemplate = new RestTemplate();
-
-    private final String WMS_URL = "localhost:28080/v2/api-docs/erp/execResult";
-
-    @Retryable(
-            maxAttempts = 4,
-            backoff = @Backoff(delay = 2000, multiplier = 2)
-    )
-    @Override
-    public void taskStateResponse(Integer state, Integer carNo, Integer aciIndex){
-        AmsTask amsTask = amsTaskService.getAmsTaskByAciIndex(aciIndex);
-        if (ObjectUtil.isNull(amsTask)) return;
-        AmsTaskStateFeedbackDTO amsTaskStateFeedbackDTO = new AmsTaskStateFeedbackDTO();
-        amsTaskStateFeedbackDTO.setState(state);
-        amsTaskStateFeedbackDTO.setTaskNo(String.valueOf(amsTask.getId()));
-        amsTaskStateFeedbackDTO.setBusinessNo(amsTask.getTaskNo());
-        amsTaskStateFeedbackDTO.setCarNo(carNo);
-        Object response = null;
-        try {
-            response = restTemplate.postForObject(WMS_URL, amsTaskStateFeedbackDTO, Object.class);
-        } catch (RestClientException e) {
-            log.error("AMS send request to WMS is on error, pause is :{}", e.getMessage());
-        }
-        log.info("wms response data is :{}", JSONObject.toJSONString(response));
-    }
-
-    @Override
-    public void updateStatus(Long id, Integer carNo) {
-        AmsTask amsTask = amsTaskService.selectAmsTaskById(id);
-        if (ObjectUtil.isNull(amsTask)) return;
-
-        log.info("任务回调-------------------------》" + amsTask.getTaskNo());
-        if (amsTask.getAciIndex() == null) {
-            log.error("没有index,未下发的任务");
-        }
-        amsTask.setSystemStatus(WmsConstant.TASK_STS.getValueByKey(amsTask.getEvent()));
-        amsTaskService.updateAmsTask(amsTask);
-    }
-}

+ 0 - 91
warewms-ams/src/main/java/com/warewms/nio/NioBaseServer.java

@@ -1,91 +0,0 @@
-package com.warewms.nio;
-
-import cn.hutool.core.util.NumberUtil;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.channels.SelectionKey;
-import java.nio.channels.Selector;
-import java.nio.channels.ServerSocketChannel;
-import java.nio.channels.SocketChannel;
-import java.util.Iterator;
-
-@Slf4j
-public abstract class NioBaseServer {
-
-    private ServerSocketChannel listenChannel;
-
-    private Selector selector;
-
-    public NioBaseServer(int port) {
-        try {
-            selector = Selector.open();
-            listenChannel = ServerSocketChannel.open();
-            listenChannel.socket().bind(new InetSocketAddress(port));
-            listenChannel.configureBlocking(Boolean.FALSE);
-            listenChannel.register(selector, SelectionKey.OP_ACCEPT);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void start() {
-        try {
-            while (true) {
-                int count = selector.select();
-                if (NumberUtil.isGreater(BigDecimal.valueOf(count), BigDecimal.ZERO)) {
-                    Iterator<SelectionKey> selectionKeyIterator = selector.selectedKeys().iterator();
-                    while (selectionKeyIterator.hasNext()) {
-                        SelectionKey selectionKey = selectionKeyIterator.next();
-                        //连接事件
-                        if (selectionKey.isAcceptable()) {
-                            SocketChannel socketChannel = listenChannel.accept();
-                            socketChannel.configureBlocking(Boolean.FALSE);
-                            socketChannel.register(selector, SelectionKey.OP_READ);
-                            log.info("The server has a new client connection :{}", socketChannel.getRemoteAddress());
-                        }
-                        //读取事件
-                        if (selectionKey.isReadable()) read(selectionKey);
-                        selectionKeyIterator.remove();
-                    }
-                }
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-    //读取客户端消息
-    private void read(SelectionKey key) {
-        //取到关联的channel
-        SocketChannel channel = null;
-        try {
-            //得到channel
-            channel = (SocketChannel) key.channel();
-            channel.configureBlocking(Boolean.FALSE);
-            //创建buffer
-            ByteBuffer buffer = ByteBuffer.allocate(1024);
-            int count = channel.read(buffer);
-            if (count > 0) {
-                readData(buffer.array());
-            }
-        } catch (IOException e) {
-            try {
-                log.info("the client {} connection is disconnected", channel.getRemoteAddress());
-                //取消注册
-                key.cancel();
-                //关闭通道
-                channel.close();
-            } catch (IOException e2) {
-                e2.printStackTrace();
-            }
-        }
-    }
-
-
-    protected abstract void readData(byte[] data);
-
-}

+ 88 - 0
warewms-ams/src/main/java/com/warewms/task/controller/AmsTaskController.java

@@ -0,0 +1,88 @@
+package com.warewms.task.controller;
+
+import com.warewms.common.base.controller.BaseController;
+import com.warewms.common.base.domain.AjaxResult;
+import com.warewms.common.base.page.PageData;
+import com.warewms.common.constant.Constants;
+import com.warewms.task.dto.*;
+import com.warewms.task.service.IAmsTaskService;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.assertj.core.util.Maps;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.validation.Valid;
+import java.util.Map;
+
+/**
+ * AGV任务Controller
+ *
+ * @author andy
+ * @date 2022-03-10
+ */
+@RestController
+@RequestMapping("/ams")
+public class AmsTaskController extends BaseController {
+    @Autowired
+    private IAmsTaskService amsTaskService;
+
+    @GetMapping("page")
+    @ApiOperation("分页")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = Constants.PAGE, value = "当前页码,从1开始", paramType = "query", required = true, dataType = "int"),
+            @ApiImplicitParam(name = Constants.LIMIT, value = "每页显示记录数", paramType = "query", required = true, dataType = "int"),
+            @ApiImplicitParam(name = Constants.ORDER_FIELD, value = "排序字段", paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = Constants.ORDER, value = "排序方式,可选值(asc、desc)", paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "taskNo", value = "任务编号", paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "aciIndex", value = "aci主键", paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "stFrom", value = "起点", paramType = "query", dataType = "Long"),
+            @ApiImplicitParam(name = "stTo", value = "终点", paramType = "query", dataType = "Long"),
+            @ApiImplicitParam(name = "beginTime", value = "起始时间", paramType = "query", dataType = "String"),
+            @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "String")
+    })
+    public AjaxResult page(@ApiIgnore @RequestParam Map<String, Object> params){
+        PageData<AmsTaskDTO> page = amsTaskService.page(params);
+        return AjaxResult.success(page);
+    }
+
+    @PostMapping(value = "/wcsTask/taskInsert")
+    public AjaxResult taskInsert(@RequestBody @Valid AmsTaskInsertDTO amsTaskInsertDTO) {
+        Long taskNo = amsTaskService.amsTaskInsert(amsTaskInsertDTO);
+        return AjaxResult.success("任务生成成功", Maps.newHashMap("taskNo", taskNo));
+    }
+
+    @GetMapping("{id}")
+    @ApiOperation("信息")
+    public AjaxResult get(@PathVariable("id") Long id){
+        AmsTaskDTO data = amsTaskService.get(id);
+        return AjaxResult.success(data);
+    }
+
+    @GetMapping(value = "/wcsTask/getTaskInfo")
+    public AjaxResult getTaskInfo(@RequestParam String businessNo) {
+        AmsTaskInfoDTO AmsTaskInfoDTO = amsTaskService.getAmsTaskInfo(businessNo);
+        return AjaxResult.success(AmsTaskInfoDTO);
+    }
+
+    @PostMapping(value = "/wcsTask/taskCancel")
+    public AjaxResult taskCancel(@RequestBody @Valid AmsTaskCancelDTO amsTaskCancelDTO) {
+        amsTaskService.cancelAmsTask(amsTaskCancelDTO);
+        return AjaxResult.success();
+    }
+
+    @PostMapping(value = "/cancelAmsTaskToWms")
+    public AjaxResult cancelAmsTaskToWms(@RequestBody @Valid AmsTaskCancelToWmsDTO amsTaskCancelToWmsDTO) {
+        amsTaskService.cancelAmsTaskToWms(amsTaskCancelToWmsDTO);
+        return AjaxResult.success();
+    }
+
+    @PostMapping(value = "/completeAmsTaskToWms")
+    public AjaxResult completeAmsTaskToWms(@RequestParam Long id) {
+        amsTaskService.completeAmsTaskToWms(id);
+        return AjaxResult.success();
+    }
+
+}

+ 1 - 1
warewms-ams/src/main/java/com/warewms/ndc/domain/AmsHexdefineDetail.java

@@ -1,4 +1,4 @@
-package com.warewms.ndc.domain;
+package com.warewms.task.domain;
 
 import com.warewms.common.annotation.Excel;
 import com.warewms.common.base.domain.BaseEntity;

+ 1 - 1
warewms-ams/src/main/java/com/warewms/ndc/domain/AmsNdcEvent.java

@@ -1,4 +1,4 @@
-package com.warewms.ndc.domain;
+package com.warewms.task.domain;
 
 import com.warewms.common.annotation.Excel;
 import com.warewms.common.base.domain.BaseEntity;

+ 1 - 1
warewms-ams/src/main/java/com/warewms/ndc/domain/AmsTask.java

@@ -1,4 +1,4 @@
-package com.warewms.ndc.domain;
+package com.warewms.task.domain;
 
 import com.warewms.common.annotation.Excel;
 import com.warewms.common.base.domain.BaseEntity;

+ 10 - 0
warewms-ams/src/main/java/com/warewms/task/domain/AmsTaskConfig.java

@@ -0,0 +1,10 @@
+package com.warewms.task.domain;
+
+import com.warewms.common.base.domain.BaseEntity;
+import lombok.Data;
+
+@Data
+public class AmsTaskConfig extends BaseEntity {
+
+
+}

+ 1 - 1
warewms-ams/src/main/java/com/warewms/ndc/dto/AmsTaskCallBackDTO.java

@@ -1,4 +1,4 @@
-package com.warewms.ndc.dto;
+package com.warewms.task.dto;
 
 import lombok.Data;
 

+ 1 - 1
warewms-ams/src/main/java/com/warewms/ndc/dto/AmsTaskCancelDTO.java

@@ -1,4 +1,4 @@
-package com.warewms.ndc.dto;
+package com.warewms.task.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 20 - 0
warewms-ams/src/main/java/com/warewms/task/dto/AmsTaskCancelToWmsDTO.java

@@ -0,0 +1,20 @@
+package com.warewms.task.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Data
+public class AmsTaskCancelToWmsDTO implements Serializable {
+
+    private static final long serialVersionUID = 2632946436423179432L;
+
+    @ApiModelProperty("id")
+    @NotNull(message = "id不能为空!")
+    private Long id;
+
+    @ApiModelProperty("取消原因")
+    private String reason;
+}

+ 166 - 0
warewms-ams/src/main/java/com/warewms/task/dto/AmsTaskDTO.java

@@ -0,0 +1,166 @@
+package com.warewms.task.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.warewms.common.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * ams任务列表对象 ams_task
+ *
+ * @author andy
+ * @date 2022-08-08
+ */
+@Data
+public class AmsTaskDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * $column.columnComment
+     */
+    private String id;
+
+    public void setId(Long id) {
+        this.id = String.valueOf(id);
+    }
+
+    /**
+     * 任务编号
+     */
+    @Excel(name = "任务编号")
+    private String taskNo;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long ikey;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Integer aciIndex;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Integer stFrom;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Integer stTo;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Integer priority;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Integer systemStatus;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Integer event;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Integer serverAck;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Integer aciAccept;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Integer isDelete;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String callbackurl;
+
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date addtime;
+
+    /**
+     * $column.columnComment
+     */
+    
+    private String addwho;
+
+    /**
+     * 调用系统名称
+     */
+    @Excel(name = "调用系统名称")
+    private String sysName;
+
+    /**
+     * 设备名称
+     */
+    @Excel(name = "设备名称")
+    private String deviceName;
+
+    /**
+     * 任务类型(01普通任务60进判断位90出判断位m释放判断位)
+     */
+    @Excel(name = "任务类型(01普通任务60进判断位90出判断位m释放判断位)")
+    private String businessType;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ext1;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ext2;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ext3;
+
+    /**
+     * 1(低) 2(中) 3(高)
+     */
+    @Excel(name = "1(低) 2(中) 3(高)")
+    private String heightLevel;
+
+    /**
+     * 巷道
+     */
+    @Excel(name = "巷道")
+    private String roadway;
+
+    /**
+     * 层
+     */
+    @Excel(name = "层")
+    private String tier;
+
+}

+ 1 - 1
warewms-ams/src/main/java/com/warewms/ndc/dto/AmsTaskInfoDTO.java

@@ -1,4 +1,4 @@
-package com.warewms.ndc.dto;
+package com.warewms.task.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 1 - 1
warewms-ams/src/main/java/com/warewms/ndc/dto/AmsTaskInsertDTO.java

@@ -1,4 +1,4 @@
-package com.warewms.ndc.dto;
+package com.warewms.task.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 1 - 1
warewms-ams/src/main/java/com/warewms/ndc/dto/AmsTaskStateFeedbackDTO.java

@@ -1,4 +1,4 @@
-package com.warewms.ndc.dto;
+package com.warewms.task.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 123 - 0
warewms-ams/src/main/java/com/warewms/task/dto/BaseLocationInfoDTO.java

@@ -0,0 +1,123 @@
+package com.warewms.task.dto;
+
+import com.warewms.common.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 库位信息对象 base_location_info
+ *
+ * @author andy
+ * @date 2022-02-18
+ */
+@Data
+public class BaseLocationInfoDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    private Long warehouseId;
+
+    /**
+     * 区域id
+     */
+    @Excel(name = "区域id")
+    private Long zoneId;
+
+    /**
+     * 库位编码
+     */
+    @Excel(name = "库位编码")
+    private String locationNo;
+
+    /**
+     * 排号
+     */
+    @Excel(name = "排号")
+    private String rowNo;
+
+    /**
+     * 排序号
+     */
+    @Excel(name = "排序号")
+    private Long rowIndex;
+
+    /**
+     * 列号
+     */
+    @Excel(name = "列号")
+    private String colNo;
+
+    /**
+     * 列序号
+     */
+    @Excel(name = "列序号")
+    private Long colIndex;
+
+    /**
+     * 层号
+     */
+    @Excel(name = "层号")
+    private String shiftNo;
+
+    /**
+     * 层序号
+     */
+    @Excel(name = "层序号")
+    private Long shiftIndex;
+
+    /**
+     * 储位状态(00)空闲,(10)占用,(20)完成,(90)合格,(99)不合格(80封存)
+     */
+    private String stockStatus;
+
+    /**
+     * 是否为空(Y空/N非空)
+     */
+    @Excel(name = "是否为空")
+    private String isEmpty;
+
+    /**
+     * 指定产品
+     */
+//    @Excel(name = "指定产品")
+    private String bindSku;
+
+    /**
+     * 储位类型(1货架2地堆3流离货架)
+     */
+    @Excel(name = "储位类型(1=货架,2=地堆)")
+    private String locationType;
+
+    /**
+     * 盘架编号
+     */
+    private String rackId;
+
+    /**
+     * AGV点位
+     */
+    @Excel(name = "AGV点位")
+    private Long agvStation;
+
+    /**
+     * 车号(标识这个库位是几号车做任务)
+     */
+    @Excel(name = "车号(输入1或者2)")
+    private String foldedTag;
+
+    /**
+     * 叠空托盘上限(当folded_tag为1时有效)
+     */
+    private Long foldedCount;
+
+    private Double heightLimit;
+
+    private Double weightLimit;
+
+
+}

+ 45 - 0
warewms-ams/src/main/java/com/warewms/task/dto/BaseLocationInfoInsertDTO.java

@@ -0,0 +1,45 @@
+package com.warewms.task.dto;
+
+import com.warewms.common.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 库位信息对象 base_location_info
+ *
+ * @author andy
+ * @date 2022-02-18
+ */
+@Data
+public class BaseLocationInfoInsertDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+
+    private Long warehouseId;
+
+    /**
+     * 区域id
+     */
+    @Excel(name = "区域id")
+    private Long zoneId;
+
+    /**
+     * 库位编码
+     */
+    @Excel(name = "库位编码")
+    private String locationNo;
+
+    /**
+     * 排号
+     */
+    @Excel(name = "排号")
+    private String rowNo;
+
+    /**
+     * AGV点位
+     */
+    @Excel(name = "AGV点位")
+    private Long agvStation;
+
+}

+ 2 - 2
warewms-ams/src/main/java/com/warewms/ndc/mapper/AmsHexdefineDetailMapper.java

@@ -1,6 +1,6 @@
-package com.warewms.ndc.mapper;
+package com.warewms.task.mapper;
 
-import com.warewms.ndc.domain.AmsHexdefineDetail;
+import com.warewms.task.domain.AmsHexdefineDetail;
 
 import java.util.List;
 

+ 2 - 3
warewms-ams/src/main/java/com/warewms/ndc/mapper/AmsHexdefineHeaderMapper.java

@@ -1,7 +1,6 @@
-package com.warewms.ndc.mapper;
+package com.warewms.task.mapper;
 
-import com.warewms.ndc.domain.AmsHexdefineDetail;
-import com.warewms.ndc.domain.AmsHexdefineHeader;
+import com.warewms.task.domain.AmsHexdefineDetail;
 
 import java.util.List;
 

+ 2 - 2
warewms-ams/src/main/java/com/warewms/ndc/mapper/AmsNdcEventMapper.java

@@ -1,6 +1,6 @@
-package com.warewms.ndc.mapper;
+package com.warewms.task.mapper;
 
-import com.warewms.ndc.domain.AmsNdcEvent;
+import com.warewms.task.domain.AmsNdcEvent;
 
 import java.util.List;
 

+ 2 - 2
warewms-ams/src/main/java/com/warewms/ndc/mapper/AmsTaskMapper.java

@@ -1,7 +1,7 @@
-package com.warewms.ndc.mapper;
+package com.warewms.task.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.warewms.ndc.domain.AmsTask;
+import com.warewms.task.domain.AmsTask;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;

+ 3 - 3
warewms-ams/src/main/java/com/warewms/ndc/service/IAmsHexdefineDetailService.java

@@ -1,7 +1,7 @@
-package com.warewms.ndc.service;
+package com.warewms.task.service;
 
-import com.warewms.ndc.domain.AmsHexdefineDetail;
-import com.warewms.ndc.domain.AmsTask;
+import com.warewms.task.domain.AmsHexdefineDetail;
+import com.warewms.task.domain.AmsTask;
 
 import java.util.List;
 

+ 2 - 2
warewms-ams/src/main/java/com/warewms/ndc/service/IAmsNdcEventService.java

@@ -1,6 +1,6 @@
-package com.warewms.ndc.service;
+package com.warewms.task.service;
 
-import com.warewms.ndc.domain.AmsNdcEvent;
+import com.warewms.task.domain.AmsNdcEvent;
 
 import java.util.List;
 

+ 9 - 6
warewms-ams/src/main/java/com/warewms/ndc/service/IAmsTaskService.java

@@ -1,9 +1,8 @@
-package com.warewms.ndc.service;
+package com.warewms.task.service;
 
-import com.warewms.ndc.domain.AmsTask;
-import com.warewms.ndc.dto.AmsTaskCancelDTO;
-import com.warewms.ndc.dto.AmsTaskInfoDTO;
-import com.warewms.ndc.dto.AmsTaskInsertDTO;
+import com.warewms.framework.service.CrudService;
+import com.warewms.task.domain.AmsTask;
+import com.warewms.task.dto.*;
 
 import java.util.List;
 
@@ -13,7 +12,7 @@ import java.util.List;
  * @author andy
  * @date 2022-08-08
  */
-public interface IAmsTaskService {
+public interface IAmsTaskService extends CrudService<AmsTask, AmsTaskDTO> {
     /**
      * 查询ams任务列表
      *
@@ -80,7 +79,11 @@ public interface IAmsTaskService {
 
     AmsTaskInfoDTO getAmsTaskInfo(String businessNo);
 
+    void cancelAmsTaskToWms(AmsTaskCancelToWmsDTO amsTaskCancelToWmsDTO);
+
     Boolean cancelAmsTask(AmsTaskCancelDTO amsTaskCancelDTO);
 
+    void completeAmsTaskToWms(Long id);
+
     AmsTask getAmsTaskByAciIndex(Integer aciIndex);
 }

+ 5 - 5
warewms-ams/src/main/java/com/warewms/ndc/service/impl/AmsHexdefineDetailServiceImpl.java

@@ -1,10 +1,10 @@
-package com.warewms.ndc.service.impl;
+package com.warewms.task.service.impl;
 
 import com.warewms.ndc.common.ValType;
-import com.warewms.ndc.domain.AmsHexdefineDetail;
-import com.warewms.ndc.domain.AmsTask;
-import com.warewms.ndc.mapper.AmsHexdefineDetailMapper;
-import com.warewms.ndc.service.IAmsHexdefineDetailService;
+import com.warewms.task.domain.AmsHexdefineDetail;
+import com.warewms.task.domain.AmsTask;
+import com.warewms.task.mapper.AmsHexdefineDetailMapper;
+import com.warewms.task.service.IAmsHexdefineDetailService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 

+ 4 - 4
warewms-ams/src/main/java/com/warewms/ndc/service/impl/AmsNdcEventServiceImpl.java

@@ -1,8 +1,8 @@
-package com.warewms.ndc.service.impl;
+package com.warewms.task.service.impl;
 
-import com.warewms.ndc.domain.AmsNdcEvent;
-import com.warewms.ndc.mapper.AmsNdcEventMapper;
-import com.warewms.ndc.service.IAmsNdcEventService;
+import com.warewms.task.domain.AmsNdcEvent;
+import com.warewms.task.mapper.AmsNdcEventMapper;
+import com.warewms.task.service.IAmsNdcEventService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 

+ 63 - 11
warewms-ams/src/main/java/com/warewms/ndc/service/impl/AmsTaskServiceImpl.java

@@ -1,22 +1,24 @@
-package com.warewms.ndc.service.impl;
+package com.warewms.task.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.comparator.CompareUtil;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.warewms.common.AmsConstant;
 import com.warewms.common.exception.base.BaseException;
 import com.warewms.common.utils.ConvertUtils;
+import com.warewms.common.utils.DateUtils;
 import com.warewms.common.utils.string.StringUtils;
+import com.warewms.framework.service.impl.CrudServiceImpl;
 import com.warewms.ndc.common.ByteUtil;
 import com.warewms.ndc.common.CRC16Util;
-import com.warewms.ndc.domain.AmsTask;
-import com.warewms.ndc.dto.AmsTaskCancelDTO;
-import com.warewms.ndc.dto.AmsTaskInfoDTO;
-import com.warewms.ndc.dto.AmsTaskInsertDTO;
-import com.warewms.ndc.mapper.AmsTaskMapper;
-import com.warewms.ndc.service.IAmsTaskService;
+import com.warewms.task.domain.AmsTask;
+import com.warewms.task.dto.*;
+import com.warewms.task.mapper.AmsTaskMapper;
+import com.warewms.task.service.IAmsTaskService;
 import io.jsonwebtoken.lang.Assert;
 import org.assertj.core.util.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,7 +26,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * ams任务列表Service业务层处理
@@ -33,7 +37,7 @@ import java.util.List;
  * @date 2022-08-08
  */
 @Service
-public class AmsTaskServiceImpl implements IAmsTaskService
+public class AmsTaskServiceImpl extends CrudServiceImpl<AmsTaskMapper, AmsTask, AmsTaskDTO>  implements IAmsTaskService
 {
     @Autowired
     private AmsTaskMapper amsTaskMapper;
@@ -180,6 +184,17 @@ public class AmsTaskServiceImpl implements IAmsTaskService
         return amsTaskInfoDTO;
     }
 
+    @Override
+    public void cancelAmsTaskToWms(AmsTaskCancelToWmsDTO amsTaskCancelToWmsDTO) {
+        AmsTaskDTO amsTaskDTO = get(amsTaskCancelToWmsDTO.getId());
+        AmsTaskCancelDTO amsTaskCancelDTO = new AmsTaskCancelDTO();
+        amsTaskCancelDTO.setTaskNo(amsTaskCancelToWmsDTO.getId().toString());
+        amsTaskCancelDTO.setReason("AMS申请取消, ".concat(StringUtils.isNotBlank(amsTaskCancelToWmsDTO.getReason()) ?
+                amsTaskCancelToWmsDTO.getReason() : StringUtils.EMPTY));
+        cancelAmsTask(amsTaskCancelDTO);
+    }
+
+
     /**
      * 任务取消
      * @param amsTaskCancelDTO
@@ -189,7 +204,7 @@ public class AmsTaskServiceImpl implements IAmsTaskService
     @Override
     public Boolean cancelAmsTask(AmsTaskCancelDTO amsTaskCancelDTO) {
         String id = amsTaskCancelDTO.getTaskNo();
-        String remark = StringUtils.isNotBlank(amsTaskCancelDTO.getReason()) ? amsTaskCancelDTO.getReason() : null;
+        String remark = StringUtils.isNotBlank(amsTaskCancelDTO.getReason()) ? amsTaskCancelDTO.getReason() : StringUtils.EMPTY;
         AmsTask amsTask = getAmsTaskById(id);
         Assert.isTrue(ObjectUtil.isNotNull(amsTask), "任务不存在!");
         //请求ams 取消任务
@@ -198,8 +213,12 @@ public class AmsTaskServiceImpl implements IAmsTaskService
         return amsTaskMapper.update(new AmsTask(), Wrappers.<AmsTask>lambdaUpdate()
                 .eq(AmsTask::getId, id)
                 .set(AmsTask::getIsDelete, AmsConstant.DELETE_STATUS.Y.getValue())
-                .set(AmsTask::getAciAccept, AmsConstant.ACI_ACCEPT_STATUS.N.getValue())
-                .set(AmsTask::getRemark, "下发超时1分钟未接收自动取消, 取消原因为:" + remark)) > 0;
+                .set(AmsTask::getAciAccept, AmsConstant.ACI_ACCEPT_STATUS.D.getValue())
+                .set(AmsTask::getEvent, AmsConstant.TASK_STS.TASK7.getKey())
+                .set(AmsTask::getSystemStatus, AmsConstant.TASK_STS.TASK7.getValue())
+                .set(AmsTask::getRemark, "任务创建时间为:" + amsTask.getAddtime() + ", 取消原因为:" + remark)
+                .set(AmsTask::getAddtime, DateUtils.getNowDate())
+        ) > 0;
     }
 
     public Integer getAmsTaskState(AmsTask amsTask){
@@ -212,6 +231,18 @@ public class AmsTaskServiceImpl implements IAmsTaskService
         return AmsConstant.TASK_STS.getValueByKey(amsTask.getEvent());
     }
 
+    @Override
+    public void completeAmsTaskToWms(Long id) {
+        AmsTaskDTO amsTaskDTO = get(id);
+        amsTaskMapper.update(new AmsTask(), Wrappers.<AmsTask>lambdaUpdate()
+                .eq(AmsTask::getId, id)
+                .set(AmsTask::getIsDelete, AmsConstant.DELETE_STATUS.N.getValue())
+                .set(AmsTask::getAciAccept, AmsConstant.ACI_ACCEPT_STATUS.Y.getValue())
+                .set(AmsTask::getEvent, AmsConstant.TASK_STS.TASK2.getKey())
+                .set(AmsTask::getSystemStatus, AmsConstant.TASK_STS.TASK2.getValue())
+                .set(AmsTask::getRemark, "ams系统手动完成"));
+    }
+
     public AmsTask getAmsTaskById(String id){
         return getAmsTaskList(null, Lists.newArrayList(id), null).stream().findFirst().orElseGet(() -> null);
     }
@@ -228,4 +259,25 @@ public class AmsTaskServiceImpl implements IAmsTaskService
                 .eq(ObjectUtil.isNotNull(aciIndex), AmsTask::getAciIndex, aciIndex));
         return amsTaskList;
     }
+
+    @Override
+    public QueryWrapper<AmsTask> getWrapper(Map<String, Object> params) {
+        QueryWrapper<AmsTask> queryWrapper = new QueryWrapper<>();
+        Integer taskNo = StringUtils.isNotBlank((String) params.get("taskNo")) ? Integer.parseInt((String) params.get("taskNo")) : null;
+        Integer aciIndex = StringUtils.isNotBlank((String) params.get("aciIndex")) ? Integer.parseInt((String) params.get("aciIndex")) : null;
+        Integer stFrom = StringUtils.isNotBlank((String) params.get("stFrom")) ? Integer.parseInt((String) params.get("stFrom")) : null;
+        Integer stTo = StringUtils.isNotBlank((String) params.get("stTo")) ? Integer.parseInt((String) params.get("stTo")) : null;
+        //如果不传则默认起始时间为去年今日
+        Date beginTime = StringUtils.isNotBlank((String) params.get("beginTime")) ?
+                DateUtil.parse((String) params.get("beginTime"), DateUtils.YYYY_MM_DD_HH_MM_SS) : DateUtils.offsetYear(DateUtils.getNowDate(), -1);
+        //如果不传则默认结束时间为今日
+        Date endTime = StringUtils.isNotBlank((String) params.get("endTime")) ?
+                DateUtil.parse((String) params.get("endTime"), DateUtils.YYYY_MM_DD_HH_MM_SS) : DateUtils.getNowDate();
+        queryWrapper.lambda().eq(ObjectUtil.isNotNull(taskNo), AmsTask::getTaskNo, taskNo)
+                .eq(ObjectUtil.isNotNull(aciIndex), AmsTask::getAciIndex, aciIndex)
+                .eq(ObjectUtil.isNotNull(stFrom), AmsTask::getStFrom, stFrom)
+                .eq(ObjectUtil.isNotNull(stTo), AmsTask::getStTo, stTo)
+                .between(AmsTask::getAddtime, beginTime, endTime);
+        return queryWrapper;
+    }
 }

+ 1 - 2
warewms-ams/src/main/java/com/warewms/thread/ClientHandler.java

@@ -6,8 +6,7 @@ import com.warewms.common.utils.redis.RedisCache;
 import com.warewms.common.utils.spring.SpringUtils;
 import com.warewms.ndc.common.ByteUtil;
 import com.warewms.ndc.common.CRC16Util;
-import com.warewms.ndc.domain.AmsTask;
-import com.warewms.ndc.service.IAmsTaskService;
+import com.warewms.task.domain.AmsTask;
 import com.warewms.system.entity.SysConfig;
 import com.warewms.system.service.ISysConfigService;
 import lombok.extern.slf4j.Slf4j;

+ 1 - 2
warewms-ams/src/main/java/com/warewms/wcs/service/impl/WcsServiceImpl.java

@@ -6,8 +6,7 @@ import com.warewms.common.AmsConstant;
 import com.warewms.common.utils.redis.RedisCache;
 import com.warewms.ndc.common.ByteUtil;
 import com.warewms.ndc.common.CRC16Util;
-import com.warewms.ndc.domain.AmsTask;
-import com.warewms.ndc.service.IAmsTaskService;
+import com.warewms.task.domain.AmsTask;
 import com.warewms.wcs.form.BtnOpForm;
 import com.warewms.wcs.service.IWcsService;
 import lombok.extern.slf4j.Slf4j;

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

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.warewms.ndc.mapper.AmsHexdefineDetailMapper">
+<mapper namespace="com.warewms.task.mapper.AmsHexdefineDetailMapper">
     
     <resultMap type="AmsHexdefineDetail" id="AmsHexdefineDetailResult">
         <result property="id"    column="id"    />

+ 0 - 102
warewms-ams/src/main/resources/mapper/ams/AmsHexdefineHeaderMapper.xml

@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.warewms.ndc.mapper.AmsHexdefineHeaderMapper">
-    
-    <resultMap type="AmsHexdefineHeader" id="AmsHexdefineHeaderResult">
-        <result property="id"    column="id"    />
-        <result property="taskName"    column="task_name"    />
-        <result property="businessType"    column="business_type"    />
-        <result property="createDate"    column="create_date"    />
-    </resultMap>
-
-    <resultMap id="AmsHexdefineHeaderAmsHexdefineDetailResult" type="AmsHexdefineHeader" extends="AmsHexdefineHeaderResult">
-        <collection property="amsHexdefineDetailList" notNullColumn="sub_id" javaType="java.util.List" resultMap="AmsHexdefineDetailResult" />
-    </resultMap>
-
-    <resultMap type="AmsHexdefineDetail" id="AmsHexdefineDetailResult">
-        <result property="id"    column="sub_id"    />
-        <result property="businessType"    column="sub_business_type"    />
-        <result property="colName"    column="sub_col_name"    />
-        <result property="colType"    column="sub_col_type"    />
-        <result property="bindTable"    column="sub_bind_table"    />
-        <result property="colVal"    column="sub_col_val"    />
-        <result property="valType"    column="sub_val_type"    />
-        <result property="sortIndex"    column="sub_sort_index"    />
-    </resultMap>
-
-    <sql id="selectAmsHexdefineHeaderVo">
-        select id, task_name, business_type, create_date from ams_hexdefine_header
-    </sql>
-
-    <select id="selectAmsHexdefineHeaderList" parameterType="AmsHexdefineHeader" resultMap="AmsHexdefineHeaderResult">
-        <include refid="selectAmsHexdefineHeaderVo"/>
-        <where>  
-            <if test="taskName != null  and taskName != ''"> and task_name like concat('%', #{taskName}, '%')</if>
-            <if test="businessType != null  and businessType != ''"> and business_type = #{businessType}</if>
-            <if test="createDate != null "> and create_date = #{createDate}</if>
-        </where>
-    </select>
-    
-    <select id="selectAmsHexdefineHeaderById" parameterType="Long" resultMap="AmsHexdefineHeaderAmsHexdefineDetailResult">
-        select a.id, a.task_name, a.business_type, a.create_date,
- b.id as sub_id, b.business_type as sub_business_type, b.col_name as sub_col_name, b.col_type as sub_col_type, b.bind_table as sub_bind_table, b.col_val as sub_col_val, b.val_type as sub_val_type, b.sort_index as sub_sort_index
-        from ams_hexdefine_header a
-        left join ams_hexdefine_detail b on b.business_type = a.id
-        where a.id = #{id}
-    </select>
-        
-    <insert id="insertAmsHexdefineHeader" parameterType="AmsHexdefineHeader" useGeneratedKeys="true" keyProperty="id">
-        insert into ams_hexdefine_header
-        <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="taskName != null">task_name,</if>
-            <if test="businessType != null">business_type,</if>
-            <if test="createDate != null">create_date,</if>
-         </trim>
-        <trim prefix="values (" suffix=")" suffixOverrides=",">
-            <if test="taskName != null">#{taskName},</if>
-            <if test="businessType != null">#{businessType},</if>
-            <if test="createDate != null">#{createDate},</if>
-         </trim>
-    </insert>
-
-    <update id="updateAmsHexdefineHeader" parameterType="AmsHexdefineHeader">
-        update ams_hexdefine_header
-        <trim prefix="SET" suffixOverrides=",">
-            <if test="taskName != null">task_name = #{taskName},</if>
-            <if test="businessType != null">business_type = #{businessType},</if>
-            <if test="createDate != null">create_date = #{createDate},</if>
-        </trim>
-        where id = #{id}
-    </update>
-
-    <delete id="deleteAmsHexdefineHeaderById" parameterType="Long">
-        delete from ams_hexdefine_header where id = #{id}
-    </delete>
-
-    <delete id="deleteAmsHexdefineHeaderByIds" parameterType="String">
-        delete from ams_hexdefine_header where id in 
-        <foreach item="id" collection="array" open="(" separator="," close=")">
-            #{id}
-        </foreach>
-    </delete>
-    
-    <delete id="deleteAmsHexdefineDetailByBusinessTypes" parameterType="String">
-        delete from ams_hexdefine_detail where business_type in 
-        <foreach item="businessType" collection="array" open="(" separator="," close=")">
-            #{businessType}
-        </foreach>
-    </delete>
-
-    <delete id="deleteAmsHexdefineDetailByBusinessType" parameterType="Long">
-        delete from ams_hexdefine_detail where business_type = #{businessType}
-    </delete>
-
-    <insert id="batchAmsHexdefineDetail">
-        insert into ams_hexdefine_detail( id, business_type, col_name, col_type, bind_table, col_val, val_type, sort_index) values
-		<foreach item="item" index="index" collection="list" separator=",">
-            ( #{item.id}, #{item.businessType}, #{item.colName}, #{item.colType}, #{item.bindTable}, #{item.colVal}, #{item.valType}, #{item.sortIndex})
-        </foreach>
-    </insert>
-</mapper>

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

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.warewms.ndc.mapper.AmsNdcEventMapper">
+<mapper namespace="com.warewms.task.mapper.AmsNdcEventMapper">
     
     <resultMap type="AmsNdcEvent" id="AmsNdcEventResult">
         <result property="id"    column="id"    />

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

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.warewms.ndc.mapper.AmsTaskMapper">
+<mapper namespace="com.warewms.task.mapper.AmsTaskMapper">
     
     <resultMap type="AmsTask" id="AmsTaskResult">
         <result property="id"    column="id"    />

+ 2 - 2
warewms-wms/install.sh

@@ -24,7 +24,7 @@ file='start.sh'
 
 echo '#!/bin/bash' > $file
 # 启动入口类,该脚本文件用于别的项目时要改这里
-echo 'MAIN_CLASS=com.ruoyi.RuoYiApplication' >> $file
+echo 'MAIN_CLASS=com.warewms.WareWmsApplication' >> $file
 echo 'APP_BASE_PATH=$(cd `dirname $0`; pwd)' >> $file
 echo 'CP=${APP_BASE_PATH}/conf:${APP_BASE_PATH}/lib/*' >> $file
 echo 'java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} > logs/console.log 2>&1 &' >> $file
@@ -34,7 +34,7 @@ file='stop.sh'
 
 echo '#!/bin/bash' > $file
 # 启动入口类,该脚本文件用于别的项目时要改这里
-echo 'MAIN_CLASS=com.ruoyi.RuoYiApplication' >> $file
+echo 'MAIN_CLASS=com.warewms.WareWmsApplication' >> $file
 echo 'kill `pgrep -f ${MAIN_CLASS}` 2>/dev/null' >> $file
 
 chmod +x *.sh

+ 7 - 1
warewms-wms/pom.xml

@@ -56,6 +56,12 @@
             <artifactId>spring-boot-starter-test</artifactId>
         </dependency>
 
+        <!-- webClient支持 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-webflux</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
@@ -328,7 +334,7 @@
                             <appendAssemblyId>false</appendAssemblyId>
                             <!-- 指向打包描述文件 package.xml -->
                             <descriptors>
-                                <descriptor>package.xml</descriptor>
+                                <descriptor>${project.parent.basedir}/package.xml</descriptor>
                             </descriptors>
                             <!-- 打包结果输出的基础目录 -->
                             <outputDirectory>${project.build.directory}/</outputDirectory>

+ 0 - 5
warewms-wms/src/main/java/com/warewms/common/base/domain/BaseEntity.java

@@ -22,25 +22,20 @@ public class BaseEntity implements Serializable
     private String searchValue;
 
     /** 创建者 */
-    @TableField(exist = false)
     private String createBy;
 
     /** 创建时间 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @TableField(exist = false)
     private Date createTime;
 
     /** 更新者 */
-    @TableField(exist = false)
     private String updateBy;
 
     /** 更新时间 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @TableField(exist = false)
     private Date updateTime;
 
     /** 备注 */
-    @TableField(exist = false)
     private String remark;
 
     /** 请求参数 */

+ 11 - 0
warewms-wms/src/main/java/com/warewms/common/base/domain/BaseExtEntity.java

@@ -0,0 +1,11 @@
+package com.warewms.common.base.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class BaseExtEntity implements Serializable {
+
+
+}

+ 2 - 2
warewms-wms/src/main/java/com/warewms/common/constant/Constants.java

@@ -157,13 +157,13 @@ public class Constants
     /**
      * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
      */
-    public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" };
+    public static final String[] JOB_WHITELIST_STR = { "com.warewms" };
 
     /**
      * 定时任务违规的字符
      */
     public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
-            "org.springframework", "org.apache", "com.ruoyi.common.utils.file" };
+            "org.springframework", "org.apache", "com.warewms.common.utils.file" };
 
     /**
      *  升序

+ 30 - 0
warewms-wms/src/main/java/com/warewms/common/constant/EnumType.java

@@ -0,0 +1,30 @@
+package com.warewms.common.constant;
+
+
+import com.warewms.common.constant.base.BizEnum;
+
+public class EnumType {
+
+    public enum HttpMethod implements BizEnum {
+        GET("GET"),
+
+        POST("POST");
+
+        private final String methodCode;
+
+        HttpMethod(String methodCode) {
+            this.methodCode = methodCode;
+        }
+
+        public String getMethodCode() {
+            return methodCode;
+        }
+
+        @Override
+        public String getCode() {
+            return getMethodCode();
+        }
+
+
+    }
+}

+ 7 - 0
warewms-wms/src/main/java/com/warewms/common/constant/base/BizEnum.java

@@ -0,0 +1,7 @@
+package com.warewms.common.constant.base;
+
+public interface BizEnum{
+
+	Object getCode();
+
+}

+ 30 - 0
warewms-wms/src/main/java/com/warewms/common/constant/base/EnumUtils.java

@@ -0,0 +1,30 @@
+package com.warewms.common.constant.base;
+
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ObjectUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Arrays;
+
+
+/**
+ * @see BizEnum 该类中的枚举都可以使用改工具类,即继承自BizEnum即可
+ * @description 通过code来获取枚举对象方法,根据Code找不到对应枚举会返回Null,调用者请避免NPE
+ * @author chenyang
+ */
+@Slf4j
+public class EnumUtils {
+
+	public static <T extends BizEnum> T getEnumByCode(Object code, Class<T> enumClass){
+
+		//参数校验
+		if(ObjectUtil.isNull(code)) return null;
+		T[] enumConstants = enumClass.getEnumConstants();
+		if(ArrayUtil.isEmpty(enumConstants)){
+			log.warn("EnumUtils-getEnumByCode-enumConstants is Empty, current class: {}", enumClass.getName());
+			return null;
+		}
+		//筛选
+		return Arrays.stream(enumConstants).filter(item -> ObjectUtil.equal(code, item.getCode())).findFirst().orElse(null);
+	}
+}

+ 5 - 0
warewms-wms/src/main/java/com/warewms/common/utils/DateUtils.java

@@ -1,5 +1,7 @@
 package com.warewms.common.utils;
 
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateUtil;
 import org.apache.commons.lang3.time.DateFormatUtils;
 
 import java.lang.management.ManagementFactory;
@@ -153,4 +155,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         // long sec = diff % nd % nh % nm / ns;
         return day + "天" + hour + "小时" + min + "分钟";
     }
+    public static Date offsetYear(Date date, int offset){
+        return DateUtil.offset(date, DateField.YEAR, offset);
+    }
 }

+ 34 - 0
warewms-wms/src/main/java/com/warewms/common/utils/JacksonUtil.java

@@ -0,0 +1,34 @@
+package com.warewms.common.utils;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.SneakyThrows;
+import org.apache.commons.lang3.StringUtils;
+
+public class JacksonUtil {
+    private static ObjectMapper mapper = new ObjectMapper();
+
+    @SneakyThrows
+    public static String toString(Object object) {
+      return ObjectUtil.isNotNull(object) ? mapper.writeValueAsString(object) : null ;
+    }
+
+    @SneakyThrows
+    public static <T> T toObject(String jsonString, Class<T> clazz) {
+        return StringUtils.isNotBlank(jsonString) ? mapper.readValue(jsonString, clazz) : null ;
+    }
+
+
+    @SneakyThrows
+    public static <T> T toObject(String jsonString, TypeReference<T> typeReference) {
+        return (T)(StringUtils.isNotBlank(jsonString) ? mapper.readValue(jsonString, typeReference) : null) ;
+    }
+
+
+    @SneakyThrows
+    public static JavaType constructJavaType(Class<?> parametrized, Class<?>... innerClass) {
+        return mapper.getTypeFactory().constructParametricType(parametrized, innerClass);
+    }
+}

+ 228 - 0
warewms-wms/src/main/java/com/warewms/common/utils/webclient/WebClientUtils.java

@@ -0,0 +1,228 @@
+package com.warewms.common.utils.webclient;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.HttpUtil;
+import com.warewms.common.constant.EnumType;
+import com.warewms.common.utils.JacksonUtil;
+import com.warewms.common.utils.webclient.bean.*;
+import io.netty.channel.ChannelOption;
+import io.netty.handler.timeout.ReadTimeoutHandler;
+import io.netty.handler.timeout.WriteTimeoutHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.client.reactive.ClientHttpConnector;
+import org.springframework.http.client.reactive.ReactorClientHttpConnector;
+import org.springframework.http.client.reactive.ReactorResourceFactory;
+import org.springframework.web.reactive.function.client.ClientResponse;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Mono;
+import reactor.netty.http.client.HttpClient;
+import reactor.netty.resources.ConnectionProvider;
+import reactor.netty.resources.LoopResources;
+
+import java.util.Map;
+
+/**
+ * @author ChenYang
+ * 创建一个全局唯一的webClient并对外开放底层接口
+ */
+@Slf4j
+public class WebClientUtils {
+
+    private static final ReactorResourceFactory reactorResourceFactory = new ReactorResourceFactory();
+
+    private static final WebClient webClient;
+
+
+    /**
+     * 系统级别的配置,业务配置不应该在这里处理,
+     * 这里的所有参数为WebClient的创建的时候的配置参数,
+     * 加入到系统级别配置(而非业务配置),以便于在后续测试中通过调整参数来进行性能优化
+     */
+    private static final String RESOURCE_REMARK = "http_client";
+    private static final Integer INIT_WORK_COUNT = 50;
+    private static final Integer MAX_CONN_COUNT = 50;
+    private static final Integer DEFAULT_CONNECT_TIMEOUT = 60;
+    private static final int DEFAULT_WRITE_TIMEOUT = 10;
+    private static final int DEFAULT_READ_TIMEOUT = 10;
+    private static final long DEFAULT_RETRY_COUNT = 3L;
+
+    /**
+     * //TODO 下面是后期优化计划
+     * 缺点:是webClient一旦被创建则不可变, 无法对当前的web进行重写,当前妥协的方式可以提供方法由子类进行复制一份进行构建,
+     * 使用{@link WebClient#mutate()}方法即可,
+     * 创建一个WebClientConfig读取配置文件并注入到Spring中,
+     * 并定义一个WebClient处理器如同WebClientProcessor进行数据的处理和传输,
+     * 以便于自定义工作线程连接资源的数据,
+     * 这里可以使用initWebClient方法配置各种参数配置文件中,
+     */
+    static {
+
+        //创建网络连接资源的工厂参数初始化
+        reactorResourceFactory.setUseGlobalResources(Boolean.FALSE);
+        reactorResourceFactory.setConnectionProvider(ConnectionProvider.create(RESOURCE_REMARK, MAX_CONN_COUNT));
+        reactorResourceFactory.setLoopResources(LoopResources.create(RESOURCE_REMARK, INIT_WORK_COUNT, Boolean.TRUE));
+
+        ClientHttpConnector httpConnector =
+                new ReactorClientHttpConnector(reactorResourceFactory, httpClient ->
+                     HttpClient.create().option(ChannelOption.CONNECT_TIMEOUT_MILLIS,  DEFAULT_CONNECT_TIMEOUT)
+                            .option(ChannelOption.TCP_NODELAY, Boolean.TRUE)
+                            .doOnConnected(connection ->
+                            {
+                                //因为HTTP协议为短链接,所有在指定之间之内没有发生读写时间,则触发断开连接的操作,
+                                // 此时默认的超时时间为10s,即从本次读写事件起10s检测不到读写事件了,则断开此次连接。
+                                connection.addHandlerLast(new ReadTimeoutHandler(DEFAULT_READ_TIMEOUT));
+                                connection.addHandlerLast(new WriteTimeoutHandler(DEFAULT_WRITE_TIMEOUT));
+                            }));
+
+        webClient = WebClient.builder()
+                .filter((request, next) -> {
+                    log.info("current request url is {}, request header info is {}, current time is {}",
+                            request.url(), request.headers(), DateUtil.now());
+                    Mono<ClientResponse> exchange = next.exchange(request).retry(DEFAULT_RETRY_COUNT);
+                    ClientResponse clientResponse = exchange.block();
+                    if(ObjectUtil.isNull(clientResponse.headers())) return exchange;
+                    log.info("request header info is {}, current time is {}",
+                            clientResponse.headers().asHttpHeaders(), DateUtil.now());
+                    return exchange;
+                }).clientConnector(httpConnector).build();
+    }
+
+    public static <T extends BizRequest, R> BaseResponse<R> invoke(String url, HttpHeaders headerInfo,
+                                                                   BaseRequest<T> request, Class<R> responseType){
+        log.info("current request body is {}, current time is {}", JacksonUtil.toString(request.getBizRequest()), DateUtil.now());
+        BaseResponse<R> baseResponse = new BaseResponse<>();
+        if(ObjectUtil.equal(request.getHttpMethod(), EnumType.HttpMethod.GET))
+            baseResponse = invokeGet(url, headerInfo, (BizGetRequest) request.getBizRequest(), responseType);
+        if(ObjectUtil.equal(request.getHttpMethod(), EnumType.HttpMethod.POST))
+            baseResponse = invokePost(url, headerInfo, (BizPostRequest) request.getBizRequest(), responseType);
+        log.info("current request body is {}, current time is {}", JacksonUtil.toString(baseResponse), DateUtil.now());
+        return baseResponse;
+    }
+
+    /**
+     * 创建GET请求,进行同步调用
+     * @param url 请求的Url全路径
+     * @param request 请求体,需要继承BaseRequest
+     * @param responseType 响应体类型
+     * @param <T> 请求体泛型
+     * @param <R> 响应业务数据
+     * @return
+     */
+    public static <T extends BizGetRequest, R> BaseResponse<R> invokeGet(String url, T request, Class<R> responseType){
+        return invokeGet(url, request, responseType);
+    }
+
+    /**
+     * 创建GET请求,进行同步调用
+     * @param url 请求的Url全路径
+     * @param request 请求体,需要继承BaseRequest
+     * @param headerInfo 请求头信息
+     * @param responseType 响应体业务类型
+     * @param <T> 请求体泛型
+     * @param <R> 响应业务数据
+     * @return
+     */
+    public static <T extends BizGetRequest, R> BaseResponse<R> invokeGet(String url, HttpHeaders headerInfo, T request, Class<R> responseType){
+
+        WebClient.RequestHeadersSpec<?> headersSpec = webClient.get().uri(url, uriBuilder ->
+                uriBuilder.query(HttpUtil.toParams(BeanUtil.beanToMap(request))).build());
+        if(CollectionUtil.isNotEmpty(headerInfo)) {
+            headersSpec = headersSpec.headers(headers -> headers.addAll(headerInfo));
+        }
+
+        Mono<BaseResponse<R>> responseMono
+                = headersSpec.retrieve()
+                .bodyToMono(ParameterizedTypeReference.forType(JacksonUtil.constructJavaType(BaseResponse.class, responseType)));
+        return responseMono.block();
+    }
+
+    /**
+     * 使用路径参数的GET请求同步调用
+     * @param url 请求的Url全路径(带上占位符)
+     * @param responseType 响应的业务参数,适合响应场景是BaseResponse<Object>的情况
+     * @param pathVariables 放在路径中的参数,有多少占位符请放置多少个
+     * @param <R> 响应的业务体
+     * @return
+     */
+    public static <R> BaseResponse<R> invokeGet(String url, Class<R> responseType, Object ... pathVariables){
+        return invokeGet(url, responseType, pathVariables);
+    }
+
+
+    /**
+     * 使用路径参数的GET请求同步调用
+     * @param url 请求的Url全路径(带上占位符)
+     * @param headerInfo 请求头信息
+     * @param responseType 响应的业务参数,适合响应场景是BaseResponse<Object>的情况
+     * @param pathVariables 放在路径中的参数,有多少占位符请放置多少个
+     * @param <R>
+     * @return
+     */
+    public static <R> BaseResponse<R> invokeGet(String url, HttpHeaders headerInfo, Class<R> responseType, Object ... pathVariables){
+        WebClient.RequestHeadersSpec<?> headersSpec = webClient.get().uri(url, pathVariables);
+        if(CollectionUtil.isNotEmpty(headerInfo)) {
+            headersSpec = headersSpec.headers(headers -> headers.addAll(headerInfo));
+        }
+        Mono<BaseResponse<R>> responseMono
+                = headersSpec.retrieve()
+                .bodyToMono(ParameterizedTypeReference.forType(JacksonUtil.constructJavaType(BaseResponse.class, responseType)));;
+        return responseMono.block();
+    }
+
+
+    /**
+     * 使用路径参数的GET请求同步调用
+     * @param url 请求的Url全路径(带上占位符)
+     * @param pathVariableInfo 构建路径变量映射, 键值对一一对应
+     * @param responseType 响应的业务参数,适合响应场景是BaseResponse<Object>的情况
+     * @param <R> 响应的业务体
+     * @return
+     */
+    public static <R> BaseResponse<R> invokeGet(String url, Map<String, Object> pathVariableInfo, Class<R> responseType){
+        return invokeGet(url, pathVariableInfo, responseType);
+    }
+
+
+    /**
+     * 使用路径参数的GET请求同步调用
+     * @param url 请求的Url全路径(带上占位符)
+     * @param headerInfo 请求头信息
+     * @param responseType 响应的业务参数,适合响应场景是BaseResponse<Object>的情况
+     * @param pathVariableInfo 构建路径变量映射,有多少占位符请放置多少个
+     * @param <R>
+     * @return
+     */
+    public static <R> BaseResponse<R> invokeGet(String url, HttpHeaders headerInfo, Map<String, Object> pathVariableInfo, Class<R> responseType){
+        WebClient.RequestHeadersSpec<?> headersSpec = webClient.get().uri(url, pathVariableInfo);
+        if(CollectionUtil.isNotEmpty(headerInfo)) {
+            headersSpec = headersSpec.headers(headers -> headers.addAll(headerInfo));
+        }
+        Mono<BaseResponse<R>> responseMono
+                = headersSpec.retrieve()
+                .bodyToMono(ParameterizedTypeReference.forType(JacksonUtil.constructJavaType(BaseResponse.class, responseType)));;
+        return responseMono.block();
+    }
+
+    public static <T extends BizPostRequest, R> BaseResponse<R> invokePost(String url, T request, Class<R> responseType){
+        return invokePost(url, null, request, responseType);
+    }
+
+    public static <T extends BizPostRequest, R> BaseResponse<R> invokePost(String url, HttpHeaders headerInfo, T request, Class<R> responseType){
+        if(ObjectUtil.isNull(headerInfo.getContentType())) headerInfo.setContentType(MediaType.APPLICATION_JSON);
+        WebClient.RequestBodySpec requestBodySpec = webClient.post().uri(url);
+        if(CollectionUtil.isNotEmpty(headerInfo)) {
+            requestBodySpec = requestBodySpec.headers(headers -> headers.addAll(headerInfo));
+        }
+        Mono<BaseResponse<R>> responseMono = requestBodySpec.body(Mono.justOrEmpty(request), request.getClass()).retrieve()
+                .bodyToMono(ParameterizedTypeReference.forType(JacksonUtil.constructJavaType(BaseResponse.class, responseType)));
+        return responseMono.block();
+    }
+
+
+}

+ 24 - 0
warewms-wms/src/main/java/com/warewms/common/utils/webclient/bean/BaseRequest.java

@@ -0,0 +1,24 @@
+package com.warewms.common.utils.webclient.bean;
+
+
+import com.warewms.common.constant.EnumType;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class BaseRequest<T extends BizRequest> implements Serializable {
+
+    private static final long serialVersionUID = -8879540887531777462L;
+
+    private String systemCode;
+
+    private EnumType.HttpMethod httpMethod;
+
+    private T bizRequest;
+
+    public BaseRequest(){
+        this.systemCode = "warewms";
+    }
+
+}

+ 31 - 0
warewms-wms/src/main/java/com/warewms/common/utils/webclient/bean/BaseResponse.java

@@ -0,0 +1,31 @@
+package com.warewms.common.utils.webclient.bean;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class BaseResponse<R> implements Serializable {
+
+    private static final long serialVersionUID = -2971211544879725090L;
+
+    @JsonProperty("success")
+    private String isSuccess;
+
+    @JsonProperty("error_code")
+    private String resultCode;
+
+    @JsonProperty("msg")
+    private String message;
+
+    @JsonProperty("data")
+    private R resultData;
+
+    public BaseResponse(){
+        isSuccess = "false";
+        resultCode = "9999";
+        message = "request params is illegal";
+    }
+
+}

+ 9 - 0
warewms-wms/src/main/java/com/warewms/common/utils/webclient/bean/BizGetRequest.java

@@ -0,0 +1,9 @@
+package com.warewms.common.utils.webclient.bean;
+
+import java.io.Serializable;
+
+public class BizGetRequest extends BizRequest implements Serializable {
+
+    private static final long serialVersionUID = -7103301271364092771L;
+
+}

+ 9 - 0
warewms-wms/src/main/java/com/warewms/common/utils/webclient/bean/BizPostRequest.java

@@ -0,0 +1,9 @@
+package com.warewms.common.utils.webclient.bean;
+
+import java.io.Serializable;
+
+public class BizPostRequest extends BizRequest implements Serializable {
+
+    private static final long serialVersionUID = 1823783918760487619L;
+
+}

+ 9 - 0
warewms-wms/src/main/java/com/warewms/common/utils/webclient/bean/BizRequest.java

@@ -0,0 +1,9 @@
+package com.warewms.common.utils.webclient.bean;
+
+import java.io.Serializable;
+
+public class BizRequest implements Serializable {
+
+    private static final long serialVersionUID = 904948414328941542L;
+
+}

+ 1 - 1
warewms-wms/src/main/java/com/warewms/framework/config/CaptchaConfig.java

@@ -65,7 +65,7 @@ public class CaptchaConfig
         // KAPTCHA_SESSION_KEY
         properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");
         // 验证码文本生成器
-        properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ruoyi.framework.config.KaptchaTextCreator");
+        properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.warewms.framework.config.KaptchaTextCreator");
         // 验证码文本字符间距 默认为2
         properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");
         // 验证码文本字符长度 默认为5

+ 54 - 0
warewms-wms/src/main/java/com/warewms/framework/config/MybatisPlusMetaObjectHandler.java

@@ -0,0 +1,54 @@
+package com.warewms.framework.config;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import com.warewms.common.utils.SecurityUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Date;
+
+@Slf4j
+@Configuration
+public class MybatisPlusMetaObjectHandler implements MetaObjectHandler {
+
+    private final static String CREATE_TIME = "createTime";
+    private final static String CREATE_BY = "createBy";
+    private final static String UPDATE_TIME = "updateTime";
+    private final static String UPDATE_BY = "updateBy";
+
+    /**
+     * 插入时候的填充策略
+     *
+     * @param metaObject
+     */
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        String userName;
+        try {
+            userName = SecurityUtils.getUsername();
+        } catch (Exception e) {
+            userName = "PDA";
+        }
+        this.setFieldValByName(CREATE_TIME, new Date(), metaObject);
+        this.setFieldValByName(CREATE_BY, userName, metaObject);
+    }
+
+    /**
+     * 更新时候的填充策略
+     *
+     * @param metaObject
+     */
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        String userName;
+        try {
+            userName = SecurityUtils.getUsername();
+        } catch (Exception e) {
+            userName = "PDA";
+        }
+        this.setFieldValByName(UPDATE_TIME, new Date(), metaObject);
+        this.setFieldValByName(UPDATE_BY, userName, metaObject);
+    }
+
+}

+ 1 - 1
warewms-wms/src/main/java/com/warewms/generator/controller/GenController.java

@@ -200,7 +200,7 @@ public class GenController extends BaseController
         response.reset();
         response.addHeader("Access-Control-Allow-Origin", "*");
         response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");
-        response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\"");
+        response.setHeader("Content-Disposition", "attachment; filename=\"warewms.zip\"");
         response.addHeader("Content-Length", "" + data.length);
         response.setContentType("application/octet-stream; charset=UTF-8");
         IOUtils.write(data, response.getOutputStream());

+ 1 - 1
warewms-wms/src/main/resources/application-prod.yml

@@ -82,7 +82,7 @@ spring:
 logging:
     level:
       com.warewms: info
-        org.springframework: info
+      org.springframework: info
 
 # 是否开启服务
 testtag:

+ 4 - 9
warewms-wms/src/main/resources/application.yml

@@ -1,11 +1,11 @@
 # 项目相关配置
-ruoyi:
+warewms:
   # 名称
-  name: RuoYi
+  name: WareWms
   # 版本
-  version: 3.8.1
+  version: 1.0.0
   # 版权年份
-  copyrightYear: 2021
+  copyrightYear: 2026
   # 实例演示开关
   demoEnabled: true
   # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
@@ -106,8 +106,3 @@ xss:
   excludes: /system/notice
   # 匹配链接
   urlPatterns: /system/*,/monitor/*,/tool/*
-
-# 是否开启服务
-#testtag:
-#  autosend: true
-#  aciservice: true

+ 1 - 1
warewms-wms/src/main/resources/banner.txt

@@ -1,4 +1,4 @@
-Application Version: ${ruoyi.version}
+Application Version: ${warewms.version}
 Spring Boot Version: ${spring-boot.version}
  __   __  ___       __        _______    _______      __   __  ___  ___      ___   ________
 |"  |/  \|  "|     /""\      /"      \  /"     "|    |"  |/  \|  "||"  \    /"  | /"       )

+ 2 - 2
warewms-wms/src/main/resources/generator.yml

@@ -1,9 +1,9 @@
 # 代码生成
 gen: 
   # 作者
-  author: ruoyi
+  author: warewms
   # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
-  packageName: com.ruoyi.system
+  packageName: com.warewms.system
   # 自动去除表前缀,默认是false
   autoRemovePre: false
   # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)

+ 1 - 1
warewms-wms/src/main/resources/logback.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-	<property name="log.path" value="../../../logs" />
+    <property name="log.path" value="../../../warewms/logs" />
     <!-- 日志输出格式 -->
 	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />