Browse Source

天奥对接基本完成

zhifei 1 year ago
parent
commit
91820f3f79

+ 8 - 0
pom.xml

@@ -222,6 +222,13 @@
                 <version>${warewms.version}</version>
             </dependency>
 
+            <!-- 天奥对接模块-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>warewms-tianao</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 
@@ -235,6 +242,7 @@
         <module>warewms-base</module>
         <module>warewms-ams</module>
         <module>warewms-hard</module>
+        <module>warewms-tianao</module>
     </modules>
     <packaging>pom</packaging>
 

+ 6 - 0
ruoyi-admin/pom.xml

@@ -90,6 +90,12 @@
             <artifactId>warewms-hard</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>warewms-tianao</artifactId>
+        </dependency>
+
+
     </dependencies>
 
 <!--    <build>-->

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

@@ -20,7 +20,8 @@ import java.util.List;
 
 @Slf4j
 @Component
-public class StartService implements CommandLineRunner {
+public class
+StartService implements CommandLineRunner {
 
     @Autowired
     private IBusinessService businessService;

+ 13 - 26
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/ams/WcsTaskController.java

@@ -1,39 +1,26 @@
 package com.ruoyi.web.controller.warewms.ams;
 
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
-
+import com.ruoyi.ams.task.domain.WcsTask;
 import com.ruoyi.ams.task.domain.form.TaskDispositionForm;
 import com.ruoyi.ams.task.form.AddTaskForm;
+import com.ruoyi.ams.task.service.IWcsTaskService;
 import com.ruoyi.base.constant.Constant;
-import com.ruoyi.base.utils.IdSequenceUtils;
-import com.ruoyi.common.core.domain.model.LoginUser;
-import com.ruoyi.common.utils.StringUtils;
-import io.swagger.annotations.ApiModelProperty;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.ams.task.domain.WcsTask;
-import com.ruoyi.ams.task.service.IWcsTaskService;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
+import java.util.List;
 
 /**
  * AGV任务Controller

+ 63 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/tianao/TianaoApiContoller.java

@@ -0,0 +1,63 @@
+package com.ruoyi.web.controller.warewms.tianao;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.ams.task.domain.WcsTask;
+import com.ruoyi.ams.task.form.AddTaskForm;
+import com.ruoyi.ams.task.service.IWcsTaskService;
+import com.ruoyi.base.constant.Constant;
+import com.ruoyi.base.domain.BaseLocationInfo;
+import com.ruoyi.base.service.IBaseLocationInfoService;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.tianao.domian.TianaoTask;
+import com.ruoyi.tianao.service.TianaoService;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+
+/**
+ * Created with IntelliJ IDEA.
+ *
+ * @author: liuzhifei
+ * Date: 2023/6/6
+ * Time: 13:27
+ * To change this template use File | Settings | File Templates.
+ * Description: 天奥
+ **/
+
+@Slf4j
+@Api("天奥接口对接")
+@RestController
+@RequestMapping("/tianao")
+public class TianaoApiContoller extends BaseController {
+
+    @Autowired
+    private TianaoService tianaoService;
+
+    @PostMapping(value = "/addTask")
+    public AjaxResult addTestTask(@Validated @RequestBody TianaoTask tianaoTask) {
+        if ("0".equals(tianaoTask.getTaskType())){
+            return  tianaoService.addTask(tianaoTask);
+        }
+        if ("5".equals(tianaoTask.getTaskType())){
+            return  tianaoService.updateTask(tianaoTask);
+        }
+        if ("10".equals(tianaoTask.getTaskType())){
+            return  tianaoService.cancelTask(tianaoTask);
+        }
+        return AjaxResult.error("任务类型不存在");
+    }
+
+
+}

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

@@ -6,7 +6,7 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://47.100.220.92:3306/wareams?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
+                url: jdbc:mysql://47.100.220.92:3306/wareams_tianao?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
                 username: warewms
                 password: warewms123
             # 从库数据源

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

@@ -91,6 +91,12 @@ mybatis:
   # 加载全局的配置文件
   configLocation: classpath:mybatis/mybatis-config.xml
 
+logging:
+  com.example.demo.mapper: DEBUG
+  org.springframework.web: DEBUG
+  java.sql: DEBUG
+  org.mybatis.spring: DEBUG
+
 # PageHelper分页插件
 pagehelper:
   helperDialect: mysql

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

@@ -1,20 +1,21 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE configuration
-PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-config.dtd">
+        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
     <!-- 全局参数 -->
     <settings>
         <!-- 使全局的映射器启用或禁用缓存 -->
-        <setting name="cacheEnabled"             value="true"   />
+        <setting name="cacheEnabled" value="true"/>
         <!-- 允许JDBC 支持自动生成主键 -->
-        <setting name="useGeneratedKeys"         value="true"   />
+        <setting name="useGeneratedKeys" value="true"/>
         <!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
-        <setting name="defaultExecutorType"      value="SIMPLE" />
-		<!-- 指定 MyBatis 所用日志的具体实现 -->
-        <setting name="logImpl"                  value="SLF4J"  />
+        <setting name="defaultExecutorType" value="SIMPLE"/>
+        <!-- 指定 MyBatis 所用日志的具体实现 -->
+        <setting name="logImpl" value="SLF4J"/>
         <!-- 使用驼峰命名法转换字段 -->
-		<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
-	</settings>
-	
+        <!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
+        <setting name="logImpl" value="STDOUT_LOGGING"/>
+    </settings>
+
 </configuration>

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

@@ -115,6 +115,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/wcs/**").anonymous()
                 .antMatchers("/api/wcstask/**").permitAll()
                 .antMatchers("/test/**").permitAll()
+                .antMatchers("/tianao/**").permitAll()
                 // 库位视图
                 .antMatchers("/ams/locationView/**").permitAll()
                 // 除上面外的所有请求全部需要鉴权认证

+ 17 - 17
ruoyi-ui/src/utils/request.js

@@ -61,8 +61,8 @@ service.interceptors.request.use(config => {
   }
   return config
 }, error => {
-    console.log(error)
-    Promise.reject(error)
+  console.log(error)
+  Promise.reject(error)
 })
 
 // 响应拦截器
@@ -79,22 +79,22 @@ service.interceptors.response.use(res => {
       if (!isReloginShow) {
         isReloginShow = true;
         MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
-          confirmButtonText: '重新登录',
-          cancelButtonText: '取消',
-          type: 'warning'
-        }
-      ).then(() => {
-        isReloginShow = false;
-        store.dispatch('LogOut').then(() => {
-          // 如果是登录页面不需要重新加载
-          if (window.location.hash.indexOf("#/login") != 0) {
-            location.href = '/index';
+            confirmButtonText: '重新登录',
+            cancelButtonText: '取消',
+            type: 'warning'
           }
-        })
-      }).catch(() => {
-        isReloginShow = false;
-      });
-    }
+        ).then(() => {
+          isReloginShow = false;
+          store.dispatch('LogOut').then(() => {
+            // 如果是登录页面不需要重新加载
+            if (window.location.hash.indexOf("#/login") != 0) {
+              location.href = '/index';
+            }
+          })
+        }).catch(() => {
+          isReloginShow = false;
+        });
+      }
       return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
     } else if (code === 500) {
       Message({

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

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

+ 15 - 8
warewms-ams/src/main/java/com/ruoyi/ams/task/mapper/WcsTaskMapper.java

@@ -7,23 +7,30 @@ import org.apache.ibatis.annotations.Param;
 
 /**
  * AGV任务Mapper接口
- * 
+ *
  * @author andy
  * @date 2022-03-10
  */
-public interface WcsTaskMapper 
+public interface WcsTaskMapper
 {
     /**
      * 查询AGV任务
-     * 
+     *
      * @param taskNo AGV任务主键
      * @return AGV任务
      */
      WcsTask selectWcsTaskByTaskNo(String taskNo);
 
+    /**
+     * 根据LCS任务编码查询任务
+     * @param taskId
+     * @return
+     */
+     WcsTask selectWcsTaskByLcsTaskId(String taskId);
+
     /**
      * 查询AGV任务列表
-     * 
+     *
      * @param wcsTask AGV任务
      * @return AGV任务集合
      */
@@ -38,7 +45,7 @@ public interface WcsTaskMapper
 
     /**
      * 新增AGV任务
-     * 
+     *
      * @param wcsTask AGV任务
      * @return 结果
      */
@@ -46,7 +53,7 @@ public interface WcsTaskMapper
 
     /**
      * 修改AGV任务
-     * 
+     *
      * @param wcsTask AGV任务
      * @return 结果
      */
@@ -54,7 +61,7 @@ public interface WcsTaskMapper
 
     /**
      * 删除AGV任务
-     * 
+     *
      * @param taskNo AGV任务主键
      * @return 结果
      */
@@ -62,7 +69,7 @@ public interface WcsTaskMapper
 
     /**
      * 批量删除AGV任务
-     * 
+     *
      * @param taskNos 需要删除的数据主键集合
      * @return 结果
      */

+ 140 - 144
warewms-ams/src/main/java/com/ruoyi/ams/task/service/impl/WcsTaskServiceImpl.java

@@ -1,21 +1,20 @@
 package com.ruoyi.ams.task.service.impl;
 
-import java.lang.reflect.Method;
-import java.util.Date;
-import java.util.List;
-
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
 import com.ruoyi.ams.agv.ndc.domain.AmsTask;
-import com.ruoyi.ams.agv.ndc.entity.CallbackResult;
 import com.ruoyi.ams.agv.ndc.service.IAmsTaskService;
 import com.ruoyi.ams.box.service.IWmsBoxInfoService;
 import com.ruoyi.ams.config.domain.FlowConfigEvent;
 import com.ruoyi.ams.config.service.IFlowConfigEventService;
-import com.ruoyi.ams.inv.domain.InvLotAtt;
 import com.ruoyi.ams.inv.domain.InvLotLocId;
 import com.ruoyi.ams.inv.mapper.InvLotLocIdMapper;
 import com.ruoyi.ams.inv.service.IInvLotAttService;
 import com.ruoyi.ams.inv.service.IInvLotLocIdService;
+import com.ruoyi.ams.task.domain.WcsTask;
 import com.ruoyi.ams.task.dto.WcsTaskLocationDTO;
+import com.ruoyi.ams.task.mapper.WcsTaskMapper;
+import com.ruoyi.ams.task.service.IWcsTaskService;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.domain.BaseLocationInfo;
 import com.ruoyi.base.service.IBaseLocationInfoService;
@@ -28,11 +27,13 @@ import com.ruoyi.hard.modbus.tcp.AutoDoorClient;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.ruoyi.ams.task.mapper.WcsTaskMapper;
-import com.ruoyi.ams.task.domain.WcsTask;
-import com.ruoyi.ams.task.service.IWcsTaskService;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
 /**
  * AGV任务Service业务层处理
  *
@@ -66,6 +67,8 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
     @Autowired
     private AutoDoorClient autoDoorClient;
 
+    private final List<Integer> statusList = Arrays.asList(1, 2, 4, 7);;
+
     //任务状态翻译
     private String codeConvert(int code) {
         switch (code) {
@@ -264,23 +267,12 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
     @Transactional
     @Override
     public AjaxResult cancelTask(WcsTask wcsTask) {
-
-        String taskNo = wcsTask.getTaskNo();
-        // 任务状态: 队列等待 直接删除即可 其他状态 需要请求AMS删除
-        if (wcsTask.getState() == Constant.TASK_STS.TASK9.getValue().longValue()
-                || wcsTask.getState() == Constant.TASK_STS.TASK10.getValue().longValue()) {
-            return callBack(wcsTask.getTaskNo(), 7, null);
-        } else {
-            //请求ams 取消任务
-            AmsTask amsTaskQuery = new AmsTask();
-            amsTaskQuery.setTaskNo(taskNo);
-            AmsTask amsTask = iAmsTaskService.selectAmsTaskByModel(amsTaskQuery);
-            if (amsTask == null) {
-                return AjaxResult.error("amsTask没有对应任务!");
-            }
-            if (null != amsTask.getEvent() && amsTask.getEvent() == 85) {
-                return AjaxResult.error("任务已取消!");
-            }
+        callBack(wcsTask.getTaskNo(), 7, null);
+        //请求ams 取消任务
+        AmsTask amsTaskQuery = new AmsTask();
+        amsTaskQuery.setTaskNo(wcsTask.getTaskNo());
+        AmsTask amsTask = iAmsTaskService.selectAmsTaskByModel(amsTaskQuery);
+        if (ObjectUtil.isNotNull(amsTask)) {
             AmsTask amsTaskUpdate = new AmsTask();
             amsTaskUpdate.setId(amsTask.getId());
             amsTaskUpdate.setIsDelete(1);
@@ -368,127 +360,131 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
             log.info("已取消的任务无需重复取消");
             return AjaxResult.error("已取消的任务无需重复取消");
         }
-        //转发类型任务才回调
-        if (wcsTask.getTaskType().equals(Constant.TASK_TYPE.FORWARD.getValue())) {
-            try {
-                switch (state) {
-                    case 1:
-                        wcsTask.setStartTime(new Date());
-                        break;
-                    case 2://完成
-                        if (wcsTask.getState() != 4
-                                && (StringUtils.isEmpty(wcsTask.getBeforeTask()) || !wcsTask.getBeforeTask().equals("1"))) {
-                            log.info("任务未取货,不能直接完成!" + taskNo);
-                            return AjaxResult.error("任务未取货,不能直接完成!" + taskNo);
-                        }
-                        if (wcsTask.getState() == 2) {
-                            log.info("不能重复放货," + taskNo);
-                            return AjaxResult.error("不能重复放货," + taskNo);
-                        }
-                        if (wcsTask.getState() == 6) {
-                            return AjaxResult.error("不能重复放货," + taskNo);
-                        }
-                        wcsTask.setEndTime(new Date());
-                        // 解锁终点库位
-                        baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationTo())
-                                , Constant.WAREHOUSE_ID, updateBy);
-                        // 将中间缓存位库存移动到终点
-                        moveMiddleCacheToDestination(wcsTask);
-                        //释放redis锁
-                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
-                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
-                        }
-                        break;
-                    case 3:
-                        break;
-                    case 4:
-                        if (wcsTask.getState() == 4) {
-                            log.info("不能重复取货," + taskNo);
-                            return AjaxResult.error("不能重复取货," + taskNo);
-                        }
-                        if (wcsTask.getBeforeTask() != null && wcsTask.getBeforeTask().equals("1")) {
-                            log.info("不能重复取货," + taskNo);
-                            return AjaxResult.error("不能重复取货," + taskNo);
-                        }
-                        // 标记已经取货完成
-                        wcsTask.setBeforeTask("1");
-                        // 解锁起始库位
-                        baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom())
-                                , Constant.WAREHOUSE_ID, updateBy);
-                        // 将起始点库存移动到中间缓存位
-                        moveStartingPointToMiddleCache(wcsTask);
-
-                        //释放redis锁
-                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
-                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()), wcsTask.getLocationFrom());
-                        }
-                        break;
-                    case 5:
-                        break;
-                    case 6://卸货
-                        if (wcsTask.getState() != 4
-                                && (StringUtils.isEmpty(wcsTask.getBeforeTask())|| !wcsTask.getBeforeTask().equals("1"))) {
-                            log.info("任务未取货,不能直接完成!" + taskNo);
-                            return AjaxResult.error("任务未取货,不能直接完成!" + taskNo);
-                        }
-                        if (wcsTask.getState() == 2) {
-                            log.info("不能重复放货," + taskNo);
-                            return AjaxResult.error("不能重复放货," + taskNo);
-                        }
-                        if (wcsTask.getState() == 6) {
-                            return AjaxResult.error("不能重复放货," + taskNo);
-                        }
-                        wcsTask.setEndTime(new Date());
-                        // 解锁终点库位
-                        baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationTo())
-                                , Constant.WAREHOUSE_ID, updateBy);
-                        // 将中间缓存位库存移动到终点
-                        moveMiddleCacheToDestination(wcsTask);
-                        //释放redis锁
-                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
-                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
-                        }
-                        break;
-                    case 7://取消
-                        wcsTask.setEndTime(new Date());
-                        //如果取到货就只解锁终点库位
-                        if (wcsTask.getState() == 4 || wcsTask.getState() == 5) {
-                            // 解锁终点库位
-                            baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationTo())
-                                    , Constant.WAREHOUSE_ID, updateBy);
-                        } else {
-                            // 解锁终点和起始库位
-                            baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()), Long.parseLong(wcsTask.getLocationTo())
-                                    , Constant.WAREHOUSE_ID, updateBy);
-                        }
-                        //释放redis锁
-                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
-                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
-                        }
-                        // 取消任务删除中间缓存库存
-//                        cancelTaskDelMiddleCache(wcsTask);
-                        break;
-                    case 8:
-                        log.error("任务异常状态------------" + wcsTask.getTaskNo());
-                        break;
-                    default:
-                        break;
-                }
-            } catch (Exception e) {
-                log.info(wcsTask.getTaskNo() + "-----" + "回调状态:" + state + "异常", e);
-                wcsTask.setRemark("回调状态:" + state + "异常");
-                //释放redis锁
-                if (!StringUtils.isEmpty(wcsTask.getExt8())) {
-                    redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
-                }
-                throw new RuntimeException();
-            }
-        } else {
-
-        }
+//        //转发类型任务才回调
+//        if (wcsTask.getTaskType().equals(Constant.TASK_TYPE.FORWARD.getValue())) {
+//            try {
+//                switch (state) {
+//                    case 1:
+//                        wcsTask.setStartTime(new Date());
+//                        break;
+//                    case 2://完成
+//                        if (wcsTask.getState() != 4
+//                                && (StringUtils.isEmpty(wcsTask.getBeforeTask()) || !wcsTask.getBeforeTask().equals("1"))) {
+//                            log.info("任务未取货,不能直接完成!" + taskNo);
+//                            return AjaxResult.error("任务未取货,不能直接完成!" + taskNo);
+//                        }
+//                        if (wcsTask.getState() == 2) {
+//                            log.info("不能重复放货," + taskNo);
+//                            return AjaxResult.error("不能重复放货," + taskNo);
+//                        }
+//                        if (wcsTask.getState() == 6) {
+//                            return AjaxResult.error("不能重复放货," + taskNo);
+//                        }
+//                        wcsTask.setEndTime(new Date());
+//                        // 解锁终点库位
+//                        baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationTo())
+//                                , Constant.WAREHOUSE_ID, updateBy);
+//                        // 将中间缓存位库存移动到终点
+//                        moveMiddleCacheToDestination(wcsTask);
+//                        //释放redis锁
+//                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
+//                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
+//                        }
+//                        break;
+//                    case 3:
+//                        break;
+//                    case 4:
+//                        if (wcsTask.getState() == 4) {
+//                            log.info("不能重复取货," + taskNo);
+//                            return AjaxResult.error("不能重复取货," + taskNo);
+//                        }
+//                        if (wcsTask.getBeforeTask() != null && wcsTask.getBeforeTask().equals("1")) {
+//                            log.info("不能重复取货," + taskNo);
+//                            return AjaxResult.error("不能重复取货," + taskNo);
+//                        }
+//                        // 标记已经取货完成
+//                        wcsTask.setBeforeTask("1");
+//                        // 解锁起始库位
+//                        baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom())
+//                                , Constant.WAREHOUSE_ID, updateBy);
+//                        // 将起始点库存移动到中间缓存位
+//                        moveStartingPointToMiddleCache(wcsTask);
+//
+//                        //释放redis锁
+//                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
+//                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()), wcsTask.getLocationFrom());
+//                        }
+//                        break;
+//                    case 5:
+//                        break;
+//                    case 6://卸货
+//                        if (wcsTask.getState() != 4
+//                                && (StringUtils.isEmpty(wcsTask.getBeforeTask())|| !wcsTask.getBeforeTask().equals("1"))) {
+//                            log.info("任务未取货,不能直接完成!" + taskNo);
+//                            return AjaxResult.error("任务未取货,不能直接完成!" + taskNo);
+//                        }
+//                        if (wcsTask.getState() == 2) {
+//                            log.info("不能重复放货," + taskNo);
+//                            return AjaxResult.error("不能重复放货," + taskNo);
+//                        }
+//                        if (wcsTask.getState() == 6) {
+//                            return AjaxResult.error("不能重复放货," + taskNo);
+//                        }
+//                        wcsTask.setEndTime(new Date());
+//                        // 解锁终点库位
+//                        baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationTo())
+//                                , Constant.WAREHOUSE_ID, updateBy);
+//                        // 将中间缓存位库存移动到终点
+//                        moveMiddleCacheToDestination(wcsTask);
+//                        //释放redis锁
+//                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
+//                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
+//                        }
+//                        break;
+//                    case 7://取消
+//                        wcsTask.setEndTime(new Date());
+//                        //如果取到货就只解锁终点库位
+//                        if (wcsTask.getState() == 4 || wcsTask.getState() == 5) {
+//                            // 解锁终点库位
+//                            baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationTo())
+//                                    , Constant.WAREHOUSE_ID, updateBy);
+//                        } else {
+//                            // 解锁终点和起始库位
+//                            baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()), Long.parseLong(wcsTask.getLocationTo())
+//                                    , Constant.WAREHOUSE_ID, updateBy);
+//                        }
+//                        //释放redis锁
+//                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
+//                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
+//                        }
+//                        // 取消任务删除中间缓存库存
+////                        cancelTaskDelMiddleCache(wcsTask);
+//                        break;
+//                    case 8:
+//                        log.error("任务异常状态------------" + wcsTask.getTaskNo());
+//                        break;
+//                    default:
+//                        break;
+//                }
+//            } catch (Exception e) {
+//                log.info(wcsTask.getTaskNo() + "-----" + "回调状态:" + state + "异常", e);
+//                wcsTask.setRemark("回调状态:" + state + "异常");
+//                //释放redis锁
+//                if (!StringUtils.isEmpty(wcsTask.getExt8())) {
+//                    redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
+//                }
+//                throw new RuntimeException();
+//            }
+//        } else {
+//
+//        }
+        wcsTask.setUpdateBy(updateBy);
         wcsTask.setState(state.longValue());
         wcsTask.setUpdateDate(new Date());
         wcsTaskService.updateWcsTask(wcsTask);
+        if (statusList.contains(state)) {
+            SpringUtil.getApplicationContext().publishEvent(wcsTask);
+        }
         return AjaxResult.success("操作成功!");
     }
 

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

@@ -148,6 +148,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where task_no = #{taskNo}
     </select>
 
+    <select id="selectWcsTaskByLcsTaskId" parameterType="String" resultMap="WcsTaskResult">
+        <include refid="selectWcsTaskVo"/>
+        where ext7 = #{taskId}
+    </select>
+
     <insert id="insertWcsTask" parameterType="WcsTask">
         insert into wcs_task
         <trim prefix="(" suffix=")" suffixOverrides=",">

+ 38 - 0
warewms-tianao/.gitignore

@@ -0,0 +1,38 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store

+ 50 - 0
warewms-tianao/pom.xml

@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.ruoyi</groupId>
+        <artifactId>ruoyi</artifactId>
+        <version>3.8.1</version>
+    </parent>
+
+    <artifactId>warewms-tianao</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <!-- 通用工具-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-common</artifactId>
+        </dependency>
+
+        <!-- 系统模块-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-system</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>warewms-base</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>warewms-hard</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>warewms-ams</artifactId>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 84 - 0
warewms-tianao/src/main/java/com/ruoyi/tianao/domian/TianaoTask.java

@@ -0,0 +1,84 @@
+package com.ruoyi.tianao.domian;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * Created with IntelliJ IDEA.
+ *
+ * @author: liuzhifei
+ * Date: 2023/6/6
+ * Time: 13:39
+ * To change this template use File | Settings | File Templates.
+ * Description: 天奥对接实体
+ **/
+@Data
+public class TianaoTask{
+    /**
+     * LCS任务编码
+     */
+    @NotEmpty(message = "LCS任务编码不能为空")
+    private  String lcsTaskId;
+
+    /**
+     * 托盘号
+     */
+    @NotEmpty(message = "托盘号不能为空")
+    private  String containerNo;
+
+    /**
+     * 任务类型
+     */
+    @NotEmpty(message = "任务类型不能为空")
+    private  String taskType;
+
+    /**
+     * 起始位置
+     */
+    @NotEmpty(message = "起始位置不能为空")
+    private  String fromLocation;
+
+    /**
+     *  目标位置
+     */
+    @NotEmpty(message = "目标位置不能为空")
+    private  String toLocation;
+
+    /**
+     *
+     */
+    private  String reservedField01;
+
+    /**
+     *
+     */
+    private  String reservedField02;
+
+    /**
+     *
+     */
+    private  String reservedField03;
+
+    /**
+     *
+     */
+    private  String reservedField04;
+
+    /**
+     *
+     */
+    private  String reservedField05;
+
+    /**
+     * 任务下发时间
+     */
+    @NotNull(message = "任务下发时间不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date time;
+}

+ 22 - 0
warewms-tianao/src/main/java/com/ruoyi/tianao/service/TianaoService.java

@@ -0,0 +1,22 @@
+package com.ruoyi.tianao.service;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.tianao.domian.TianaoTask;
+
+/**
+ * Created with IntelliJ IDEA.
+ *
+ * @author: liuzhifei
+ * Date: 2023/6/6
+ * Time: 14:52
+ * To change this template use File | Settings | File Templates.
+ * Description:
+ **/
+public interface TianaoService {
+
+    AjaxResult addTask(TianaoTask tianaoTask) ;
+
+    AjaxResult cancelTask(TianaoTask tianaoTask);
+
+    AjaxResult updateTask(TianaoTask tianaoTask);
+}

+ 158 - 0
warewms-tianao/src/main/java/com/ruoyi/tianao/service/impl/TianaoServiceImpl.java

@@ -0,0 +1,158 @@
+package com.ruoyi.tianao.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.HttpRequest;
+import com.ruoyi.ams.agv.ndc.domain.AmsTask;
+import com.ruoyi.ams.agv.ndc.service.IAmsTaskService;
+import com.ruoyi.ams.agv.ndc.service.StatusUpdateService;
+import com.ruoyi.ams.task.domain.WcsTask;
+import com.ruoyi.ams.task.mapper.WcsTaskMapper;
+import com.ruoyi.ams.task.service.IWcsTaskService;
+import com.ruoyi.base.constant.Constant;
+import com.ruoyi.base.domain.BaseLocationInfo;
+import com.ruoyi.base.service.IBaseLocationInfoService;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.tianao.domian.TianaoTask;
+import com.ruoyi.tianao.service.TianaoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created with IntelliJ IDEA.
+ *
+ * @author: liuzhifei
+ * Date: 2023/6/6
+ * Time: 14:53
+ * To change this template use File | Settings | File Templates.
+ * Description:
+ **/
+@Service
+@Slf4j
+public class TianaoServiceImpl implements TianaoService {
+
+
+    @Autowired
+    private IWcsTaskService wcsTaskService;
+
+    @Autowired
+    private WcsTaskMapper wcsTaskMapper;
+
+    @Autowired
+    private IBaseLocationInfoService iBaseLocationInfoService;
+
+    @Autowired
+    private StatusUpdateService statusUpdateService;
+
+    @Autowired
+    private IAmsTaskService amsTaskService;
+
+    private final String  backUrl = "" ;
+
+    private final List<Long> statusLsit = Arrays.asList(11L,12L,5L,6L,7L);
+
+
+    @Override
+    public AjaxResult addTask(TianaoTask tianaoTask) {
+
+        if (tianaoTask.getFromLocation().equals(tianaoTask.getToLocation())) {
+            throw new BaseException("起始库位与目标库位不能相同");
+        }
+        BaseLocationInfo formAddress = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getFromLocation(), Constant.WAREHOUSE_ID);
+        if(ObjectUtil.isNull(formAddress)){
+            throw new BaseException("起始位置不存在,请联系管理员");
+        }
+        BaseLocationInfo toAddress = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getToLocation(), Constant.WAREHOUSE_ID);
+        if(ObjectUtil.isNull(formAddress)){
+            throw new BaseException("目标位置不存在,请联系管理员");
+        }
+        WcsTask wcsTask = new WcsTask();
+        wcsTask.setTaskNo(System.currentTimeMillis() + "");
+        wcsTask.setState(9L);
+        wcsTask.setTaskType(Constant.TASK_TYPE.FORWARD.getValue());
+        wcsTask.setBusinessType(tianaoTask.getTaskType());
+        wcsTask.setAreaFrom(formAddress.getZoneId().toString());
+        wcsTask.setLocationFrom(tianaoTask.getFromLocation());
+        wcsTask.setAreaTo(toAddress.getZoneId().toString());
+        wcsTask.setLocationTo(tianaoTask.getToLocation());
+        wcsTask.setCreateTime(tianaoTask.getTime());
+        wcsTask.setCreateBy("上层调用");
+        wcsTask.setShopId(Constant.WAREHOUSE_ID.toString());
+        wcsTask.setPriority(10L);
+        wcsTask.setExt7(tianaoTask.getLcsTaskId());
+        wcsTask.setExt8(tianaoTask.getContainerNo());
+        if (wcsTaskService.insertWcsTask(wcsTask) ==1){
+            return AjaxResult.success("任务发起成功");
+        }
+        return AjaxResult.error("任务发起出错") ;
+    }
+
+    @Override
+    public AjaxResult cancelTask(TianaoTask tianaoTask) {
+        WcsTask wcsTask = wcsTaskMapper.selectWcsTaskByLcsTaskId(tianaoTask.getLcsTaskId());
+        log.info(wcsTask.toString());
+        if (ObjectUtil.isNull(wcsTask)) {
+          return  AjaxResult.error("任务查询不存在");
+        }
+        return wcsTaskService.cancelTask(wcsTask);
+    }
+
+    @Override
+    @Transactional
+    public AjaxResult updateTask(TianaoTask tianaoTask) {
+        WcsTask wcsTask = wcsTaskMapper.selectWcsTaskByLcsTaskId(tianaoTask.getLcsTaskId());
+        if (ObjectUtil.isNull(wcsTask)) {
+            return  AjaxResult.error("任务查询不存在");
+        }
+
+        if (statusLsit.contains(wcsTask.getState())){
+            return AjaxResult.error("当前任务无法修改卸货点");
+        }
+        if (wcsTask.getState()!=9) {
+            try {
+                AmsTask amsTask = new AmsTask();
+                amsTask.setTaskNo(wcsTask.getTaskNo());
+                amsTask = amsTaskService.selectAmsTaskByModel(amsTask);
+                Integer carNo = Integer.getInteger(wcsTask.getAgvNo());
+                statusUpdateService.confirmAnalysis(wcsTask.getTaskNo(), amsTask.getAciIndex(),carNo
+                        , "02", tianaoTask.getToLocation());
+                Thread.sleep(1000);
+                statusUpdateService.confirmAnalysis(wcsTask.getTaskNo(),  amsTask.getAciIndex(), carNo
+                        , "10", "1");
+                Thread.sleep(1000);
+                wcsTaskService.cancelTask(wcsTask);
+            }catch (Exception e){
+                log.info(e.getMessage());
+                return AjaxResult.error("任务修改卸货点失败");
+            }
+        }
+        BaseLocationInfo toAddress = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getToLocation(), Constant.WAREHOUSE_ID);
+        wcsTask.setAreaTo(toAddress.getZoneId().toString());
+        wcsTask.setLocationTo(tianaoTask.getToLocation());
+        return AjaxResult.success("卸货点修改成功");
+    }
+
+    @EventListener
+    @Async
+    public void tianaoCallBack(WcsTask wcsTask){
+        if (StringUtils.isNotEmpty(wcsTask.getExt7())){
+            String body = HttpRequest.post(backUrl)
+                    .form("lcsTaskId", wcsTask.getExt7())
+                    .form("containerNo", wcsTask.getExt8())
+                    .form("task_type", wcsTask.getBusinessType())
+                    .form("task_status", wcsTask.getState())
+                    .form("time", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,new Date())).execute().body();
+            System.out.println(String.format("回调结果:%s", body));
+        }
+    }
+}