Browse Source

重构任务下发、任务取消及修改目的地

zhifei 1 year ago
parent
commit
d4d255c29a

+ 105 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/base/CarInfoController.java

@@ -0,0 +1,105 @@
+package com.ruoyi.web.controller.warewms.base;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.base.domain.CarInfo;
+import com.ruoyi.base.service.ICarInfoService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+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.enums.BusinessType;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 车辆信息Controller
+ *
+ * @author ruoyi
+ * @date 2023-09-19
+ */
+@RestController
+@RequestMapping("/warewms/car")
+public class CarInfoController extends BaseController
+{
+    @Autowired
+    private ICarInfoService carInfoService;
+
+    /**
+     * 查询车辆信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('warewms:car:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CarInfo carInfo)
+    {
+        startPage();
+        List<CarInfo> list = carInfoService.selectCarInfoList(carInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出车辆信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('warewms:car:export')")
+    @Log(title = "车辆信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, CarInfo carInfo)
+    {
+        List<CarInfo> list = carInfoService.selectCarInfoList(carInfo);
+        ExcelUtil<CarInfo> util = new ExcelUtil<CarInfo>(CarInfo.class);
+        util.exportExcel(response, list, "车辆信息数据");
+    }
+
+    /**
+     * 获取车辆信息详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('warewms:car:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(carInfoService.selectCarInfoById(id));
+    }
+
+    /**
+     * 新增车辆信息
+     */
+    @PreAuthorize("@ss.hasPermi('warewms:car:add')")
+    @Log(title = "车辆信息", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CarInfo carInfo)
+    {
+        return toAjax(carInfoService.insertCarInfo(carInfo));
+    }
+
+    /**
+     * 修改车辆信息
+     */
+    @PreAuthorize("@ss.hasPermi('warewms:car:edit')")
+    @Log(title = "车辆信息", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CarInfo carInfo)
+    {
+        return toAjax(carInfoService.updateCarInfo(carInfo));
+    }
+
+    /**
+     * 删除车辆信息
+     */
+    @PreAuthorize("@ss.hasPermi('warewms:car:remove')")
+    @Log(title = "车辆信息", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(carInfoService.deleteCarInfoByIds(ids));
+    }
+}

BIN
ruoyi-ui/dist.zip


+ 67 - 0
warewms-base/src/main/java/com/ruoyi/base/domain/CarInfo.java

@@ -0,0 +1,67 @@
+package com.ruoyi.base.domain;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 车辆信息对象 car_info
+ *
+ * @author ruoyi
+ * @date 2023-09-19
+ */
+@Data
+@NoArgsConstructor
+public class CarInfo extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** 车编号 */
+    @Excel(name = "车编号")
+    private Long carno;
+
+    /** 仓库编号 */
+    @Excel(name = "仓库编号")
+    private Long warehouseId;
+
+    /** 状态 */
+    @Excel(name = "状态")
+    private String state;
+
+    /** 是否启用 */
+    @Excel(name = "是否启用")
+    private String activeFlag;
+
+    /** $column.columnComment */
+    private String userdefine1;
+
+    /** $column.columnComment */
+    private String userdefine2;
+
+    /** $column.columnComment */
+    private String userdefine3;
+
+    /** $column.columnComment */
+    private String userdefine4;
+
+    /** $column.columnComment */
+    private String userdefine5;
+
+    /** 电池 */
+    @Excel(name = "电池")
+    private Long battery;
+
+    /** x轴 */
+    private Long x;
+
+    /** y轴 */
+    private Long y;
+
+    private String updateType;
+}

+ 62 - 0
warewms-base/src/main/java/com/ruoyi/base/mapper/CarInfoMapper.java

@@ -0,0 +1,62 @@
+package com.ruoyi.base.mapper;
+
+import com.ruoyi.base.domain.CarInfo;
+
+import java.util.List;
+
+/**
+ * 车辆信息Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-09-19
+ */
+public interface CarInfoMapper
+{
+    /**
+     * 查询车辆信息
+     *
+     * @param id 车辆信息主键
+     * @return 车辆信息
+     */
+     CarInfo selectCarInfoById(Long id);
+
+    /**
+     * 查询车辆信息列表
+     *
+     * @param carInfo 车辆信息
+     * @return 车辆信息集合
+     */
+     List<CarInfo> selectCarInfoList(CarInfo carInfo);
+
+    /**
+     * 新增车辆信息
+     *
+     * @param carInfo 车辆信息
+     * @return 结果
+     */
+     int insertCarInfo(CarInfo carInfo);
+
+    /**
+     * 修改车辆信息
+     *
+     * @param carInfo 车辆信息
+     * @return 结果
+     */
+     int updateCarInfo(CarInfo carInfo);
+
+    /**
+     * 删除车辆信息
+     *
+     * @param id 车辆信息主键
+     * @return 结果
+     */
+     int deleteCarInfoById(Long id);
+
+    /**
+     * 批量删除车辆信息
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+     int deleteCarInfoByIds(Long[] ids);
+}

+ 70 - 0
warewms-base/src/main/java/com/ruoyi/base/service/ICarInfoService.java

@@ -0,0 +1,70 @@
+package com.ruoyi.base.service;
+
+import com.ruoyi.base.domain.CarInfo;
+
+import java.util.List;
+
+/**
+ * 车辆信息Service接口
+ *
+ * @author ruoyi
+ * @date 2023-09-19
+ */
+public interface ICarInfoService
+{
+    /**
+     * 查询车辆信息
+     *
+     * @param id 车辆信息主键
+     * @return 车辆信息
+     */
+     CarInfo selectCarInfoById(Long id);
+
+    /**
+     * 查询车辆信息列表
+     *
+     * @param carInfo 车辆信息
+     * @return 车辆信息集合
+     */
+     List<CarInfo> selectCarInfoList(CarInfo carInfo);
+
+    /**
+     * 查询车辆信息
+     *
+     * @param carInfo 车辆信息
+     * @return 车辆信息集合
+     */
+    CarInfo selectCarInfoByModel(CarInfo carInfo);
+
+    /**
+     * 新增车辆信息
+     *
+     * @param carInfo 车辆信息
+     * @return 结果
+     */
+     int insertCarInfo(CarInfo carInfo);
+
+    /**
+     * 修改车辆信息
+     *
+     * @param carInfo 车辆信息
+     * @return 结果
+     */
+     int updateCarInfo(CarInfo carInfo);
+
+    /**
+     * 批量删除车辆信息
+     *
+     * @param ids 需要删除的车辆信息主键集合
+     * @return 结果
+     */
+     int deleteCarInfoByIds(Long[] ids);
+
+    /**
+     * 删除车辆信息信息
+     *
+     * @param id 车辆信息主键
+     * @return 结果
+     */
+     int deleteCarInfoById(Long id);
+}

+ 142 - 0
warewms-base/src/main/java/com/ruoyi/base/service/impl/CarInfoServiceImpl.java

@@ -0,0 +1,142 @@
+package com.ruoyi.base.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.base.domain.CarInfo;
+import com.ruoyi.base.mapper.CarInfoMapper;
+import com.ruoyi.base.service.ICarInfoService;
+import com.ruoyi.common.core.redis.RedisCache;
+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 javax.annotation.PostConstruct;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * 车辆信息Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-09-19
+ */
+@Service
+public class CarInfoServiceImpl implements ICarInfoService {
+    @Autowired
+    private CarInfoMapper carInfoMapper;
+
+    @Autowired
+    RedisCache redisCache;
+
+    private static CopyOnWriteArrayList<CarInfo> carList ;
+
+    /**
+     * 查询车辆信息
+     *
+     * @param id 车辆信息主键
+     * @return 车辆信息
+     */
+    @Override
+    public CarInfo selectCarInfoById(Long id) {
+        return carInfoMapper.selectCarInfoById(id);
+    }
+
+    /**
+     * 查询车辆信息列表
+     *
+     * @param carInfo 车辆信息
+     * @return 车辆信息
+     */
+    @Override
+    public List<CarInfo> selectCarInfoList(CarInfo carInfo) {
+        if (ObjectUtil.isNull(carList) ||carList.size() ==0){
+            carList = new CopyOnWriteArrayList<>(carInfoMapper.selectCarInfoList(carInfo));
+        }
+        return carList;
+    }
+
+    /**
+     * 查询车辆信息
+     *
+     * @param carInfo 车辆信息
+     * @return 车辆信息
+     */
+    @Override
+    public CarInfo selectCarInfoByModel(CarInfo carInfo) {
+        List<CarInfo> list = carInfoMapper.selectCarInfoList(carInfo);
+        if (list != null && list.size() > 0) {
+            return list.get(0);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 新增车辆信息
+     *
+     * @param carInfo 车辆信息
+     * @return 结果
+     */
+    @Override
+    public int insertCarInfo(CarInfo carInfo) {
+        return carInfoMapper.insertCarInfo(carInfo);
+    }
+
+    /**
+     * 修改车辆信息
+     *
+     * @param carInfo 车辆信息
+     * @return 结果
+     */
+    @Override
+    public int updateCarInfo(CarInfo carInfo) {
+        return carInfoMapper.updateCarInfo(carInfo);
+    }
+
+    /**
+     * 批量删除车辆信息
+     *
+     * @param ids 需要删除的车辆信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCarInfoByIds(Long[] ids) {
+        return carInfoMapper.deleteCarInfoByIds(ids);
+    }
+
+    /**
+     * 删除车辆信息信息
+     *
+     * @param id 车辆信息主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCarInfoById(Long id) {
+        return carInfoMapper.deleteCarInfoById(id);
+    }
+
+    @EventListener
+    @Async
+    public void  updateStatus(CarInfo carInfo){
+        CarInfo car = carList.get(carInfo.getCarno().intValue() - 1);
+        if ("status".equals(carInfo.getUpdateType())){
+           if(!car.getState().equals(carInfo.getState())){
+               car.setState(carInfo.getState());
+               carList.set(carInfo.getCarno().intValue() - 1,car);
+           }
+        }else {
+            int a = 0;
+            if(!car.getX().equals(carInfo.getX())){
+                car.setX(carInfo.getX());
+                a =1;
+            }
+            if(!car.getY().equals(carInfo.getY())){
+                car.setY(carInfo.getY());
+                a =1;
+            }
+            if (a==1){
+                carList.set(carInfo.getCarno().intValue() - 1,car);
+            }
+        }
+    }
+}

+ 104 - 0
warewms-base/src/main/resources/mapper/base/CarInfoMapper.xml

@@ -0,0 +1,104 @@
+<?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.ruoyi.base.mapper.CarInfoMapper">
+
+    <resultMap type="CarInfo" id="CarInfoResult">
+        <result property="id"    column="id"    />
+        <result property="carno"    column="carNo"    />
+        <result property="warehouseId"    column="warehouse_id"    />
+        <result property="state"    column="state"    />
+        <result property="activeFlag"    column="active_flag"    />
+        <result property="userdefine1"    column="userdefine1"    />
+        <result property="userdefine2"    column="userdefine2"    />
+        <result property="userdefine3"    column="userdefine3"    />
+        <result property="userdefine4"    column="userdefine4"    />
+        <result property="userdefine5"    column="userdefine5"    />
+        <result property="battery"    column="battery"    />
+        <result property="x"    column="x"    />
+        <result property="y"    column="y"    />
+    </resultMap>
+
+    <sql id="selectCarInfoVo">
+        select id, carNo, warehouse_id, state, active_flag, userdefine1, userdefine2, userdefine3, userdefine4, userdefine5, battery, x, y from car_info
+    </sql>
+
+    <select id="selectCarInfoList" parameterType="CarInfo" resultMap="CarInfoResult">
+        <include refid="selectCarInfoVo"/>
+        <where>
+            <if test="carno != null "> and carNo = #{carno}</if>
+            <if test="warehouseId != null "> and warehouse_id = #{warehouseId}</if>
+            <if test="state != null  and state != ''"> and state = #{state}</if>
+            <if test="activeFlag != null  and activeFlag != ''"> and active_flag = #{activeFlag}</if>
+        </where>
+        order by carNo
+    </select>
+
+    <select id="selectCarInfoById" parameterType="Long" resultMap="CarInfoResult">
+        <include refid="selectCarInfoVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertCarInfo" parameterType="CarInfo" useGeneratedKeys="true" keyProperty="id">
+        insert into car_info
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="carno != null">carNo,</if>
+            <if test="warehouseId != null">warehouse_id,</if>
+            <if test="state != null">state,</if>
+            <if test="activeFlag != null and activeFlag != ''">active_flag,</if>
+            <if test="userdefine1 != null">userdefine1,</if>
+            <if test="userdefine2 != null">userdefine2,</if>
+            <if test="userdefine3 != null">userdefine3,</if>
+            <if test="userdefine4 != null">userdefine4,</if>
+            <if test="userdefine5 != null">userdefine5,</if>
+            <if test="battery != null">battery,</if>
+            <if test="x != null">x,</if>
+            <if test="y != null">y,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="carno != null">#{carno},</if>
+            <if test="warehouseId != null">#{warehouseId},</if>
+            <if test="state != null">#{state},</if>
+            <if test="activeFlag != null and activeFlag != ''">#{activeFlag},</if>
+            <if test="userdefine1 != null">#{userdefine1},</if>
+            <if test="userdefine2 != null">#{userdefine2},</if>
+            <if test="userdefine3 != null">#{userdefine3},</if>
+            <if test="userdefine4 != null">#{userdefine4},</if>
+            <if test="userdefine5 != null">#{userdefine5},</if>
+            <if test="battery != null">#{battery},</if>
+            <if test="x != null">#{x},</if>
+            <if test="y != null">#{y},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCarInfo" parameterType="CarInfo">
+        update car_info
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="carno != null">carNo = #{carno},</if>
+            <if test="warehouseId != null">warehouse_id = #{warehouseId},</if>
+            <if test="state != null">state = #{state},</if>
+            <if test="activeFlag != null and activeFlag != ''">active_flag = #{activeFlag},</if>
+            <if test="userdefine1 != null">userdefine1 = #{userdefine1},</if>
+            <if test="userdefine2 != null">userdefine2 = #{userdefine2},</if>
+            <if test="userdefine3 != null">userdefine3 = #{userdefine3},</if>
+            <if test="userdefine4 != null">userdefine4 = #{userdefine4},</if>
+            <if test="userdefine5 != null">userdefine5 = #{userdefine5},</if>
+            <if test="battery != null">battery = #{battery},</if>
+            <if test="x != null">x = #{x},</if>
+            <if test="y != null">y = #{y},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteCarInfoById" parameterType="Long">
+        delete from car_info where id = #{id}
+    </delete>
+
+    <delete id="deleteCarInfoByIds" parameterType="String">
+        delete from car_info where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 16 - 0
warewms-tianao/src/main/java/com/ruoyi/tianao/config/MQTTConfig.java

@@ -0,0 +1,16 @@
+package com.ruoyi.tianao.config;
+
+import lombok.Getter;
+
+@Getter
+public class MQTTConfig {
+
+    private String HOST= "";
+
+    private String clientId ="";
+
+    private String userName ="";
+
+    private String password ="";
+
+}

+ 35 - 0
warewms-tianao/src/main/java/com/ruoyi/tianao/config/PlcConfig.java

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

+ 22 - 0
warewms-tianao/src/main/java/com/ruoyi/tianao/config/PlcProperties.java

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

+ 8 - 0
warewms-tianao/src/main/java/com/ruoyi/tianao/domian/AgvBack.java

@@ -0,0 +1,8 @@
+package com.ruoyi.tianao.domian;
+
+import lombok.Data;
+
+@Data
+public class AgvBack {
+
+}

+ 23 - 0
warewms-tianao/src/main/java/com/ruoyi/tianao/enums/CnveyorBeltsPlcEnum.java

@@ -0,0 +1,23 @@
+package com.ruoyi.tianao.enums;
+
+public enum CnveyorBeltsPlcEnum {
+
+    TO_COMMAND_1("DB1051.6.0"),
+
+    TO_COMMAND_4("DB1051.108.0"),
+
+    MOVE_1("DB1050.14.0"),
+
+    MOVE_4("DB1050.128.0");
+
+    private String metadata;
+
+
+    CnveyorBeltsPlcEnum(String metadata) {
+        this.metadata = metadata;
+    }
+
+    public String getMetadata() {
+        return metadata;
+    }
+}

+ 144 - 0
warewms-tianao/src/main/java/com/ruoyi/tianao/init/PlcConnectServiceRunner.java

@@ -0,0 +1,144 @@
+package com.ruoyi.tianao.init;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import com.github.rholder.retry.*;
+import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.tianao.config.PlcConfig;
+import com.ruoyi.tianao.config.PlcProperties;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * plc连接
+ */
+@Component
+@Order(1)
+@Slf4j
+public class PlcConnectServiceRunner implements CommandLineRunner {
+
+    @Resource
+    private PlcProperties plcProperties;
+
+    @Resource
+    ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+
+
+    @Resource
+    private ScheduledExecutorService scheduledExecutorService;
+
+    @Override
+    public void run(String... args) throws Exception {
+        initConnect();
+        log.info("plc初始化完成!");
+    }
+
+    private HashMap<String, S7PLC> plcToolsMap = new HashMap<>();
+
+    private ArrayList<String> reTryPlc = new ArrayList<>();
+
+    /**
+     * 初始化
+     */
+    private void initConnect() throws InterruptedException {
+        for (PlcConfig plcConfig : plcProperties.getPlcList()) {
+            if (plcConfig.getEnable()) {
+                log.info("初始化:{},ip:{}", plcConfig.getName(), plcConfig.getIp());
+                try {
+                    S7PLC s7PLC = new S7PLC(plcConfig.getEPlcType(), plcConfig.getIp());
+                    s7PLC.connect();
+                    if (s7PLC.checkConnected()){
+                        plcToolsMap.put(plcConfig.getName(),s7PLC);
+                        log.info("plc:{},ip:{},连接成功",plcConfig.getName(),plcConfig.getIp());
+                    }
+                }catch (Exception e){
+                    log.info("plc:{},ip:{},连接失败",plcConfig.getName(),plcConfig.getIp());
+                    retry(plcConfig);
+                }
+            }
+        }
+
+    }
+
+    public void retry(PlcConfig plcConfig) {
+        reTryPlc.add(plcConfig.getName());
+        threadPoolTaskExecutor.execute (() -> {
+            Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
+                    .retryIfResult(Boolean.FALSE::equals)
+                    .retryIfExceptionOfType(Exception.class)
+                    .withStopStrategy(StopStrategies.neverStop())
+                    .withWaitStrategy(WaitStrategies.fixedWait(7, TimeUnit.SECONDS))
+                    .build();
+            try {
+                retryer.call(() -> {
+                    log.info("重试:{},ip:{}", plcConfig.getName(), plcConfig.getIp());
+                    try {
+                        S7PLC s7PLC = new S7PLC(plcConfig.getEPlcType(), plcConfig.getIp());
+                        s7PLC.connect();
+                        if (s7PLC.checkConnected()){
+                            plcToolsMap.put(plcConfig.getName(),s7PLC);
+                            log.info("plc:{},ip:{},重试连接成功",plcConfig.getName(),plcConfig.getIp());
+                            reTryPlc.remove(plcConfig.getName());
+                            plcConnectsTheHeartbeat(plcConfig,s7PLC);
+                            return true;
+                        }
+                    }catch (Exception e){
+                        log.info("plc:{},ip:{},重试连接失败,meg:{}",plcConfig.getName(),plcConfig.getIp(),e.getMessage());
+                        return false;
+                    }
+                    return false;
+                });
+            } catch (RetryException | ExecutionException e) {
+                e.printStackTrace();
+            }
+        });
+    }
+
+    /**
+     *  plc连接心跳
+     * @param plcConfig
+     * @param s7PLC
+     */
+    private void plcConnectsTheHeartbeat(PlcConfig plcConfig,S7PLC s7PLC){
+        String heartbeatAdd = plcConfig.getHeartbeat();
+        if (StringUtils.isNotEmpty(heartbeatAdd)){
+            scheduledExecutorService.scheduleWithFixedDelay(()->{
+                if (!reTryPlc.contains(plcConfig.getName())){
+                    try {
+                        s7PLC.readBoolean(plcConfig.getHeartbeat());
+                    }catch (Exception e){
+                        log.error("设备:{},连接中断",plcConfig.getName());
+                        retry(plcConfig);
+                    }
+                }
+            },0,3,TimeUnit.SECONDS);
+        }
+    }
+
+
+    /**
+     *
+     * @param pclName plc设备名
+     * @return
+     */
+    public S7PLC getPlcServer(String pclName) {
+        S7PLC s7PLC = plcToolsMap.get(pclName);
+        if(ObjectUtil.isNull(s7PLC)){
+            throw new ServiceException("设备未连接");
+        }
+        return plcToolsMap.get(pclName);
+    }
+}

+ 79 - 0
warewms-tianao/src/main/java/com/ruoyi/tianao/init/PublishAGVInfo.java

@@ -0,0 +1,79 @@
+package com.ruoyi.tianao.init;
+
+import com.ruoyi.tianao.config.MQTTConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+/**
+ * mqtt发布AGV实时坐标
+ */
+@Component
+@Order(2)
+@Slf4j
+public class PublishAGVInfo implements CommandLineRunner {
+
+    private final String topic="";
+
+    private int  qos = 1;
+
+    private  MemoryPersistence persistence = new MemoryPersistence();
+
+    private MQTTConfig mqttConfig;
+
+    private MqttClient sampleClient;
+
+    @Override
+    public void run(String... args) throws Exception {
+//        initConnect();
+    }
+
+    private void initConnect(){
+        try {
+            // 创建客户端
+            sampleClient = new MqttClient(mqttConfig.getHOST(), mqttConfig.getClientId(), persistence);
+            // 创建链接参数
+            MqttConnectOptions connOpts = new MqttConnectOptions();
+            // 在重新启动和重新连接时记住状态
+            connOpts.setCleanSession(false);
+            // 设置连接的用户名
+            connOpts.setUserName(mqttConfig.getUserName());
+            connOpts.setPassword(mqttConfig.getPassword().toCharArray());
+            // 建立连接
+            sampleClient.connect(connOpts);
+        } catch (MqttException me) {
+            log.error("An exception occurred when initializing the MQTT connection,msg:{}",me.getMessage());
+        }
+    }
+
+    public void closeConnection(){
+        try {
+            // 断开连接
+            sampleClient.disconnect();
+            // 关闭客户端
+            sampleClient.close();
+        }catch (MqttException me){
+            log.error("An exception occurred when the connection about MQTT was closed,msg:{}",me.getMessage());
+        }
+
+    }
+
+    public void publishMessage(String content){
+        try {
+        // 创建消息
+        MqttMessage message = new MqttMessage(content.getBytes());
+        // 设置消息的服务质量
+        message.setQos(qos);
+        // 发布消息
+        sampleClient.publish(topic, message);
+        }catch (MqttException me){
+            log.error("An exception occurred in the release information,msg:{}",me.getMessage());
+        }
+    }
+}

+ 42 - 0
warewms-tianao/src/main/java/com/ruoyi/tianao/job/FeedbackJob.java

@@ -0,0 +1,42 @@
+package com.ruoyi.tianao.job;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import com.ruoyi.base.domain.CarInfo;
+import com.ruoyi.base.service.ICarInfoService;
+import com.ruoyi.tianao.init.PublishAGVInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component("feedbackJob")
+public class FeedbackJob {
+
+    @Autowired
+    ICarInfoService iCarInfoService;
+
+    @Autowired
+    PublishAGVInfo publishAGVInfo;
+
+    public void feedbackVehicleStatus(){
+        JSONArray objects = new JSONArray();
+        for (CarInfo carInfo : iCarInfoService.selectCarInfoList(new CarInfo())) {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.set("carNo",carInfo.getUserdefine2());
+            jsonObject.set("status",carInfo.getState());
+            objects.add(jsonObject);
+        }
+    }
+
+    public void feedbackForkliftCoordinates(){
+        JSONArray objects = new JSONArray();
+        for (CarInfo carInfo : iCarInfoService.selectCarInfoList(new CarInfo())) {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.set("carNo",carInfo.getUserdefine2());
+            jsonObject.set("X",carInfo.getX());
+            jsonObject.set("Y",carInfo.getY());
+            objects.add(jsonObject);
+        }
+        publishAGVInfo.publishMessage(objects.toString());
+    }
+}

+ 177 - 93
warewms-tianao/src/main/java/com/ruoyi/tianao/service/impl/TianaoServiceImpl.java

@@ -12,11 +12,16 @@ import com.ruoyi.ams.task.mapper.WcsTaskMapper;
 import com.ruoyi.ams.task.service.IWcsTaskService;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.domain.BaseLocationInfo;
+import com.ruoyi.base.domain.BaseLocationZone;
+import com.ruoyi.base.mapper.BaseLocationZoneMapper;
 import com.ruoyi.base.service.IBaseLocationInfoService;
+import com.ruoyi.base.service.IBaseLocationZoneService;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.service.ISysConfigService;
+import com.ruoyi.system.service.impl.SysConfigServiceImpl;
 import com.ruoyi.tianao.domian.TianaoTask;
 import com.ruoyi.tianao.service.TianaoService;
 import lombok.extern.slf4j.Slf4j;
@@ -61,111 +66,166 @@ public class TianaoServiceImpl implements TianaoService {
     @Autowired
     private IAmsTaskService amsTaskService;
 
+    @Autowired
+    private BaseLocationZoneMapper baseLocationZoneMapper;
+
+    @Autowired
+    private ISysConfigService iSysConfigService;
+
     @Value("${tianao.taskBackUrl}")
-    private String  taskBackUrl;
+    private String taskBackUrl;
     @Value("${tianao.AGVStatusBackUrl}")
-    private String  AGVStatusBackUrl ;
+    private String AGVStatusBackUrl;
 
-    private final List<Long> statusLsit = Arrays.asList(11L,12L,5L,6L,7L);
+    private final List<Long> statusLsit = Arrays.asList(2L, 5L, 6L, 7L);
+
+    private final List<Long> zoneList = Arrays.asList(10003L, 10005L);
 
     @Autowired
     private RedisCache redisCache;
 
 
     @Override
+    @Transactional
     public JSONObject addTask(TianaoTask tianaoTask) {
-        if (redisCache.checkIsLock(tianaoTask.getLcs_task_id())){
-            return returnJson("e0001","任务Id已重复","fail");
-        }
-        if (tianaoTask.getFrom_location().equals(tianaoTask.getTo_location())) {
-            return returnJson("e0001","起始库位与目标库位不能相同","fail");
-        }
-        BaseLocationInfo formAddress = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getFrom_location(), Constant.WAREHOUSE_ID);
-        if(ObjectUtil.isNull(formAddress)){
-            return returnJson("e0001","起始位置不存在","fail");
-        }
-        BaseLocationInfo toAddress = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getTo_location(), Constant.WAREHOUSE_ID);
-        if(ObjectUtil.isNull(toAddress)){
-            return returnJson("e0001","目标位置不存在","fail");
-        }
-        if("N".equals(toAddress.getIsEmpty())){
-            return returnJson("e0001","目标位置库存不为空","fail");
-        }
-        WcsTask wcsTask = new WcsTask();
-        wcsTask.setTaskNo(System.currentTimeMillis() + "");
-        wcsTask.setState(9L);
-        wcsTask.setTaskType(Constant.TASK_TYPE.FORWARD.getValue());
-        wcsTask.setBusinessType(tianaoTask.getTask_type());
-        wcsTask.setAreaFrom(formAddress.getZoneId().toString());
-        wcsTask.setLocationFrom(formAddress.getId().toString());
-        wcsTask.setAreaTo(toAddress.getZoneId().toString());
-        wcsTask.setLocationTo(toAddress.getId().toString());
-        wcsTask.setCreateTime(tianaoTask.getTime());
-        wcsTask.setCreateBy("上层调用");
-        wcsTask.setShopId(Constant.WAREHOUSE_ID.toString());
-        wcsTask.setPriority(10L);
-        wcsTask.setExt7(tianaoTask.getLcs_task_id());
-        wcsTask.setExt5(tianaoTask.getContainer_no());
-        if (wcsTaskService.insertWcsTask(wcsTask) ==1){
-            redisCache.setCacheObject(tianaoTask.getLcs_task_id(),tianaoTask.getLcs_task_id(),30,TimeUnit.SECONDS);
-            return returnJson("00000","任务发起成功","ok");
+        try {
+            if (redisCache.checkIsLock(tianaoTask.getLcs_task_id())) {
+                List<WcsTask> wcsTaskList = wcsTaskMapper.selectWcsTaskByLcsTaskId(tianaoTask.getLcs_task_id());
+                if (ObjectUtil.isNotNull(wcsTaskList) || wcsTaskList.size() > 0) {
+                    return returnJson("e0001", "任务Id已重复", "fail");
+                }
+            }
+            if (tianaoTask.getFrom_location().equals(tianaoTask.getTo_location())) {
+                return returnJson("e0001", "起始库位与目标库位不能相同", "fail");
+            }
+            BaseLocationInfo formAddress = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getFrom_location(), Constant.WAREHOUSE_ID);
+            if (ObjectUtil.isNull(formAddress)) {
+                return returnJson("e0001", "起始位置不存在", "fail");
+            }
+            BaseLocationInfo toAddress = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getTo_location(), Constant.WAREHOUSE_ID);
+            if (ObjectUtil.isNull(toAddress)) {
+                return returnJson("e0001", "目标位置不存在", "fail");
+            }
+            if ("N".equals(toAddress.getIsEmpty())) {
+                return returnJson("e0001", "目标位置库存不为空", "fail");
+            }
+            //判断是否需要拆分任务
+            if (zoneList.contains(formAddress.getZoneId()) || zoneList.contains(toAddress.getZoneId())) {
+                WcsTask wcsTask = createWcsTask(tianaoTask, formAddress, toAddress, "0");
+                formAddress.setIsEmpty("N");
+                iBaseLocationInfoService.updateBaseLocationInfo(formAddress);
+                wcsTaskService.insertWcsTask(wcsTask);
+            } else {
+                //拆分任务,获取任务执行的中转区
+                Long zoneId = null;
+                if (formAddress.getZoneId().equals(10009L) || toAddress.getZoneId().equals(10009L)) {
+                    zoneId = Long.parseLong(iSysConfigService.selectConfigByKey("sys.area.B2"));
+                } else {
+                    zoneId = Long.parseLong(iSysConfigService.selectConfigByKey("sys.area.C"));
+                }
+                //选择中转区空库位
+                BaseLocationInfo baseLocationInfo = new BaseLocationInfo();
+                baseLocationInfo.setZoneId(zoneId);
+                baseLocationInfo.setIsEmpty("Y");
+                List<BaseLocationInfo> baseLocationInfos = iBaseLocationInfoService.selectSortedLocatinListByZoneIdNoTask(baseLocationInfo);
+                if (ObjectUtil.isNull(baseLocationInfos) && baseLocationInfos.size() == 0) {
+                    return returnJson("e0001", "没有合适的中转库位", "fail");
+                }
+                System.out.println(baseLocationInfos.get(0));
+                WcsTask wcsTask1 = createWcsTask(tianaoTask, formAddress, baseLocationInfos.get(0), "1");
+                WcsTask wcsTask2 = createWcsTask(tianaoTask, baseLocationInfos.get(0), toAddress, "0");
+                wcsTask2.setParentTask(wcsTask1.getTaskNo());
+                formAddress.setIsEmpty("N");
+                iBaseLocationInfoService.updateBaseLocationInfo(formAddress);
+                //生成任务
+                wcsTaskService.insertWcsTask(wcsTask1);
+                wcsTaskService.insertWcsTask(wcsTask2);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("任务:{},生成出错,mag:{}", tianaoTask, e.getMessage());
+            return returnJson("e0001", "任务发起出错", "fail");
         }
-        return returnJson("e0001","任务发起出错","fail");
+        redisCache.setCacheObject(tianaoTask.getLcs_task_id(), tianaoTask.getLcs_task_id(), 30, TimeUnit.SECONDS);
+        return returnJson("00000", "任务发起成功", "ok");
     }
 
     @Override
     public JSONObject cancelTask(TianaoTask tianaoTask) {
-        WcsTask wcsTask = wcsTaskMapper.selectWcsTaskByLcsTaskId(tianaoTask.getLcs_task_id());
-        log.info(wcsTask.toString());
-        if (ObjectUtil.isNull(wcsTask)) {
-          return  returnJson("e0001","任务查询不存在","fail");
-        }
-        if (wcsTaskService.cancelTask(wcsTask).isSuccess()){
-            return returnJson("00000","任务取消成功","ok");
+        try {
+            List<WcsTask> wcsTaskList = wcsTaskMapper.selectWcsTaskByLcsTaskId(tianaoTask.getLcs_task_id());
+            log.info("取消任务详情:{}", wcsTaskList);
+            if (ObjectUtil.isNull(wcsTaskList) || wcsTaskList.size() == 0) {
+                return returnJson("e0001", "任务查询不存在", "fail");
+            }
+            for (WcsTask wcsTask : wcsTaskList) {
+                if (wcsTask.getState().equals(6L) || wcsTask.getState().equals(2L)) {
+                    return returnJson("e0001", "总任务或者前置任务已完成无法取消", "fail");
+                }
+            }
+            for (WcsTask wcsTask : wcsTaskList) {
+                wcsTaskService.cancelTask(wcsTask);
+            }
+            return returnJson("00000", "任务取消成功", "ok");
+        } catch (Exception e) {
+            log.error("取消任务失败,msg:{}", e.getMessage());
+            return returnJson("e0001", "任务取消出错", "fail");
         }
-        return returnJson("e0001","任务取消出错","fail");
     }
 
     @Override
     @Transactional
     public JSONObject updateTask(TianaoTask tianaoTask) {
-        WcsTask wcsTask = wcsTaskMapper.selectWcsTaskByLcsTaskId(tianaoTask.getLcs_task_id());
-        if (ObjectUtil.isNull(wcsTask)) {
-            return returnJson("e0001","任务查询不存在","fail");
+        List<WcsTask> wcsTaskList = wcsTaskMapper.selectWcsTaskByLcsTaskId(tianaoTask.getLcs_task_id());
+        if (ObjectUtil.isNull(wcsTaskList) || wcsTaskList.size() == 0) {
+            return returnJson("e0001", "任务查询不存在", "fail");
         }
-        if (statusLsit.contains(wcsTask.getState())){
-            return returnJson("e0001","当前任务无法修改卸货点","fail");
+        WcsTask wcsTask = new WcsTask();
+        if (wcsTaskList.size() == 1) {
+            wcsTask = wcsTaskList.get(0);
+        } else {
+            for (WcsTask task : wcsTaskList) {
+                if (StringUtils.isNotEmpty(task.getParentTask())) {
+                    wcsTask = task;
+                }
+            }
+        }
+        if (statusLsit.contains(wcsTask.getState())) {
+            return returnJson("e0001", "当前任务无法修改卸货点", "fail");
+        }
+        BaseLocationInfo baseLocationInfo = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getTo_location(), Constant.WAREHOUSE_ID);
+        if (ObjectUtil.isNull(baseLocationInfo)) {
+            return returnJson("e0001", "目标卸货点不存在", "fail");
         }
-        if("N".equals( iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getTo_location(), Constant.WAREHOUSE_ID).getIsEmpty())){
-            return returnJson("e0001","目标卸货点不为空","fail");
+        if ("N".equals(baseLocationInfo.getIsEmpty())) {
+            return returnJson("e0001", "目标卸货点不为空", "fail");
         }
-        if (wcsTask.getState()!=9) {
+        if (wcsTask.getState() != 9L) {
             try {
                 AmsTask amsTask = new AmsTask();
                 amsTask.setTaskNo(wcsTask.getTaskNo());
                 amsTask = amsTaskService.selectAmsTaskByModel(amsTask);
                 Integer carNo = Integer.getInteger(wcsTask.getAgvNo());
-                if (ObjectUtil.isNotNull(carNo)){
+                if (ObjectUtil.isNotNull(carNo)) {
                     //修改AGV任务目标地址
-                    statusUpdateService.confirmAnalysis(wcsTask.getTaskNo(), amsTask.getAciIndex(),carNo
-                            , "02", tianaoTask.getTo_location());
+                    statusUpdateService.confirmAnalysis(wcsTask.getTaskNo(), amsTask.getAciIndex(), carNo
+                            , "02", baseLocationInfo.getId().toString());
                     Thread.sleep(1000);
-                    statusUpdateService.confirmAnalysis(wcsTask.getTaskNo(),  amsTask.getAciIndex(), carNo
+                    statusUpdateService.confirmAnalysis(wcsTask.getTaskNo(), amsTask.getAciIndex(), carNo
                             , "10", "1");
                     Thread.sleep(1000);
                 }
-            }catch (Exception e){
+            } catch (Exception e) {
                 log.info(e.getMessage());
-                return returnJson("e0001","任务修改卸货点失败","fail");
+                return returnJson("e0001", "任务修改卸货点失败", "fail");
             }
         }
-        BaseLocationInfo toAddress = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getTo_location(), Constant.WAREHOUSE_ID);
-        wcsTask.setAreaTo(toAddress.getZoneId().toString());
-        wcsTask.setLocationTo(tianaoTask.getTo_location());
-        if(wcsTaskService.updateWcsTask(wcsTask)==1){
-            return returnJson("00000","卸货点修改成功","ok");
+        wcsTask.setAreaTo(baseLocationInfo.getZoneId().toString());
+        wcsTask.setLocationTo(baseLocationInfo.getId().toString());
+        if (wcsTaskService.updateWcsTask(wcsTask) == 1) {
+            return returnJson("00000", "卸货点修改成功", "ok");
         }
-        return returnJson("e0001","任务修改卸货点失败","fail");
+        return returnJson("e0001", "任务修改卸货点失败", "fail");
     }
 
     @EventListener
@@ -173,48 +233,52 @@ public class TianaoServiceImpl implements TianaoService {
     public String getAGVCoordinate(CarStatus car) {
         JSONObject jsonObject = new JSONObject();
         JSONObject jsonObject1 = new JSONObject();
-        jsonObject1.put("carNo",car.getCarNo());
-        jsonObject1.put("y",car.getY());
-        jsonObject1.put("x",car.getX());
-        jsonObject1.put("time",DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,new Date()));
-        jsonObject.put("HEADER",jsonObject1);
-        log.info("反馈AGV坐标请求参数:{}",jsonObject);
-        String body = HttpRequest.post(AGVStatusBackUrl)
-                .body(jsonObject.toString())
-                .contentType("application/json").execute().body();
-        log.info("反馈AGV坐标回调结果:{}",body);
-        return body;
+        jsonObject1.put("carNo", car.getCarNo());
+        jsonObject1.put("y", car.getY());
+        jsonObject1.put("x", car.getX());
+        jsonObject1.put("time", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, new Date()));
+        jsonObject.put("HEADER", jsonObject1);
+        log.info("反馈AGV坐标请求参数:{}", jsonObject);
+//        String body = HttpRequest.post(AGVStatusBackUrl)
+//                .body(jsonObject.toString())
+//                .contentType("application/json").execute().body();
+//        log.info("反馈AGV坐标回调结果:{}", body);
+//        return body;
+        return null;
     }
 
     @EventListener
     @Async
-    public String tianaoCallBack(WcsTask wcsTask){
-        if (StringUtils.isNotEmpty(wcsTask.getExt7())){
+    public String tianaoCallBack(WcsTask wcsTask) {
+        if (StringUtils.isNotEmpty(wcsTask.getExt7())) {
+            if (wcsTask.getState().equals(2L) && "1".equals(wcsTask.getExt5())){
+                return null;
+            }
             JSONObject jsonObject = new JSONObject();
             JSONObject jsonObject1 = new JSONObject();
             jsonObject1.put("lcs_task_id", wcsTask.getExt7());
-            jsonObject1.put("container_no", wcsTask.getExt5());
+            jsonObject1.put("container_no", wcsTask.getBatchNo());
             jsonObject1.put("task_type", wcsTask.getBusinessType());
             jsonObject1.put("task_status", wcsTask.getState());
             jsonObject1.put("agv_no", wcsTask.getAgvNo());
-            jsonObject1.put("time", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,new Date()));
-            jsonObject.put("HEADER",jsonObject1);
-            log.info("反馈任务状态请求参数:{}",jsonObject);
-            String body = HttpRequest.post(taskBackUrl)
-                    .body(jsonObject.toString())
-                    .contentType("application/json").execute().body();
-            log.info("反馈任务状态回调结果:{}", body);
-            return body;
+            jsonObject1.put("time", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, new Date()));
+            jsonObject.put("HEADER", jsonObject1);
+            log.info("反馈任务状态请求参数:{}", jsonObject);
+//            String body = HttpRequest.post(taskBackUrl)
+//                    .body(jsonObject.toString())
+//                    .contentType("application/json").execute().body();
+//            log.info("反馈任务状态回调结果:{}", body);
+//            return body;
         }
         return null;
     }
 
     @Override
-    public JSONObject returnJson(String code,String msg,String state){
+    public JSONObject returnJson(String code, String msg, String state) {
         JSONObject jsonObject = new JSONObject();
-        jsonObject.put("code",code);
-        jsonObject.put("msg",msg);
-        jsonObject.put("state",state);
+        jsonObject.put("code", code);
+        jsonObject.put("msg", msg);
+        jsonObject.put("state", state);
         return jsonObject;
     }
 
@@ -227,4 +291,24 @@ public class TianaoServiceImpl implements TianaoService {
     public String testAgvAddress(CarStatus car) {
         return getAGVCoordinate(car);
     }
+
+    private WcsTask createWcsTask(TianaoTask tianaoTask, BaseLocationInfo formAddress, BaseLocationInfo toAddress, String frontLoadingOrNot) {
+        WcsTask wcsTask = new WcsTask();
+        wcsTask.setTaskNo(System.currentTimeMillis() + "");
+        wcsTask.setState(9L);
+        wcsTask.setTaskType(Constant.TASK_TYPE.Handling.getValue());
+        wcsTask.setBusinessType("01");
+        wcsTask.setAreaFrom(formAddress.getZoneId().toString());
+        wcsTask.setLocationFrom(formAddress.getId().toString());
+        wcsTask.setAreaTo(toAddress.getZoneId().toString());
+        wcsTask.setLocationTo(toAddress.getId().toString());
+        wcsTask.setCreateTime(tianaoTask.getTime());
+        wcsTask.setCreateBy("上层调用");
+        wcsTask.setShopId(Constant.WAREHOUSE_ID.toString());
+        wcsTask.setPriority(10L);
+        wcsTask.setExt7(tianaoTask.getLcs_task_id());
+        wcsTask.setBatchNo(tianaoTask.getContainer_no());
+        wcsTask.setExt5(frontLoadingOrNot);
+        return wcsTask;
+    }
 }