自动化立体仓库 - WCS系统
44be6da8fc2740a7e81d5b878a894e318b6a5f8c..184980deb3f854a98eb112e7998875113ebbba9a
9 小时以前 lsh
*
184980 对比 | 目录
9 小时以前 lsh
*
f9b268 对比 | 目录
10 小时以前 lsh
*
319239 对比 | 目录
10 小时以前 lsh
*
8bfb0b 对比 | 目录
12 小时以前 lsh
*
0cf26d 对比 | 目录
13 小时以前 lsh
*
e386fa 对比 | 目录
13 小时以前 lsh
*
e82ebf 对比 | 目录
14 小时以前 lsh
*
aede5c 对比 | 目录
15 小时以前 lsh
*
385f25 对比 | 目录
17 小时以前 lsh
*
808d32 对比 | 目录
8个文件已添加
32个文件已修改
2197 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 137 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/TaskWrkController.java 77 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/TaskWrkLogController.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasDevp.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgvErr.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/StaDesc.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/ToWmsDTO.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/BasCrnpWmsParam.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/BasDevpWmsParam.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/BasRgvWmsParam.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/CarryParam.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/TaskCreateParam.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/WMSAndAGVInterfaceParam.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasRgvErrMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/TaskWrkLogMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/TaskWrkMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasRgvErrService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/TaskWrkLogService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/TaskWrkService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasRgvErrServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 953 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/TaskWrkLogServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/TaskWrkServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/MatDto.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/DevpThread.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/Slave.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/DevpSlave.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/ScaleThread.java 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasRgvErrMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/TaskWrkLogMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/TaskWrkMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/taskWrk/taskWrk.html 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/taskWrkLog/taskWrkLog.html 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -8,13 +8,20 @@
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.CarryParam;
import com.zy.asrs.entity.param.TaskOverParam;
import com.zy.asrs.entity.param.WMSAndAGVInterfaceParam;
import com.zy.asrs.entity.param.TaskCreateParam;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.BasCrnErrorServiceImpl;
import com.zy.asrs.utils.Utils;
import com.zy.common.web.BaseController;
import com.zy.core.CrnThread;
import com.zy.core.cache.RgvStatusCache;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.protocol.CrnProtocol;
import com.zy.core.model.protocol.RgvProtocol;
import com.zy.core.properties.SlaveProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -30,6 +37,8 @@
@RequestMapping("/open")
public class OpenController extends BaseController {
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private OpenService openService;
    @Autowired
@@ -48,6 +57,10 @@
    private StaDescService staDescService;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private BasRgvErrService basRgvErrService;
    @Autowired
    private BasCrnErrorServiceImpl basCrnErrorService;
    @Value("${wms.url}")
    private String wmsUrl;
@@ -57,6 +70,7 @@
    public static final ArrayList<String> APP_KEY_LIST = new ArrayList<String>() {{
        add("ea1f0459efc02a79f046f982767939ae");
    }};
    //agv任务完成
    @PostMapping("/toAgvTaskOver")
    @AppAuth(memo = "agv任务完成接口")
@@ -78,9 +92,10 @@
    }
    //创建任务
    @PostMapping("/taskCreate")
    @PostMapping("/taskCreate2")
    @AppAuth(memo = "WMS任务下发")
    @Transactional
    public R taskCreate(@RequestHeader String appkey,
    public synchronized R taskCreate(@RequestHeader String appkey,
                          @RequestBody List<TaskCreateParam> param1,
                          HttpServletRequest request) {
        auth(appkey, param1, request);
@@ -91,15 +106,19 @@
                if (Cools.isEmpty(param)) {
                    return R.parse(BaseRes.PARAM);
                }
                if (Cools.isEmpty(param.getTaskNo())) {
                    return R.error("任务号[taskNo]不能为空");
                }
                if (Cools.isEmpty(param.getIoType())) {
                    return R.error("任务类型[ioType]不能为空");
                }
                param.updateIoTyoe(param.getIoType());//中航下发  1:出库,2:移库 3:入库   ====转换为====>  1:入库,2:出库,3:移库
                if (Cools.isEmpty(param.getBarcode())) {
                    return R.error("条码[barcode]不能为空");
                }
                String locNo=null;
                if(param.getIoType()==1){
                    locNo=param.getTargetPoint();
@@ -313,14 +332,17 @@
    }
    //任务下发接口
    @PostMapping("/outboundTaskSend")
//    @PostMapping("/outboundTaskSend")
    @PostMapping("/taskCreate")
    @AppAuth(memo = "任务下发接口")
    @Transactional
    public R outboundTaskSend(@RequestHeader String appkey,
                              @RequestBody List<CarryParam> params,
                              @RequestBody List<CarryParam> params,//中航下发  1:出库,2:移库 3:入库
                              HttpServletRequest request) {
        //auth(appkey, params, request);
        List<WMSAndAGVInterfaceParam> params1 =new ArrayList<>();
        auth(appkey, params, request);
//        List<WMSAndAGVInterfaceParam> params1 =new ArrayList<>();
        for (CarryParam param:params){
            param.updateIoTyoe(param.getIoType());//中航下发  1:出库,2:移库 3:入库   ====转换为====>  1:入库,2:出库,3:移库
            if (Cools.isEmpty(param)){
                return R.error("参数为空!");
@@ -344,14 +366,32 @@
//                }
//            }
            LocMast locMast = locMastService.selectByLocNo(param.getStartPoint());
            String locNo=null;
            if(param.getIoType()==1){
                locNo=param.getTargetPoint();
            }else{
                locNo=param.getStartPoint();
            }
            LocMast locMast = locMastService.selectByLocNo(locNo);
            if(Cools.isEmpty(locMast)){
                return R.error("初始库位无法找到");
            }
            R r = null;
            if(param.getIoType() == 2){
            if(param.getIoType() == 1){
                //入库任务创建
                StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                        .eq("type_no",1)
                        .eq("crn_no",locMast.getCrnNo())
                        .eq("stn_no",param.getStartPoint()));
                if(Cools.isEmpty(staDesc)){
                    return R.error("入库路劲不存在");
                }
                r = openService.taskCreate(new TaskCreateParam(param,staDesc.getCrnNo()));
            }else if(param.getIoType() == 2){
                //出库任务创建
                StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                        .eq("type_no",2)
@@ -362,6 +402,13 @@
                }
                r = openService.taskCreate(new TaskCreateParam(param,staDesc.getCrnNo()));
            }else if (param.getIoType() == 3){
                LocMast locMast2 = locMastService.selectByLocNo(param.getTargetPoint());
                if(Cools.isEmpty(locMast2)){
                    return R.error("目标库位无法找到");
                }
                if (!locMast2.getCrnNo().equals(locMast.getCrnNo())){
                    return R.error("起始库位与目标库位不再同一巷道");
                }
                //移库任务创建
                r = openService.taskCreate(new TaskCreateParam(param,locMast.getCrnNo()));
            }
@@ -383,9 +430,10 @@
    //任务取消接口
    @PostMapping("/taskCancel")
    public R taskCancel(@RequestHeader String appkey,
                               @RequestBody WMSAndAGVInterfaceParam param,
                               @RequestBody WMSAndAGVInterfaceParam param,//中航下发  1:出库,2:移库 3:入库    1:取消  2 完成
                               HttpServletRequest request) {
        auth(appkey, param, request);
//        param.updateTaskStatus(param.getTaskStatus());
        if (Cools.isEmpty(param)){
            return R.error("参数为空!");
        } else if (Cools.isEmpty(param.getTaskNo())){
@@ -444,12 +492,67 @@
        List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
        List<Object> list = new ArrayList<>();
        for (BasDevp basDevp:basDevps){
            list.add(basDevp);
            BasDevpWmsParam basDevpWmsParam = new BasDevpWmsParam();
            basDevpWmsParam.setDevNo(basDevp.getDevNo());
            basDevpWmsParam.setWrkNo(basDevp.getWrkNo().longValue());
            basDevpWmsParam.setAutoing(basDevp.getAutoing());
            basDevpWmsParam.setLoading(basDevp.getLoading());
            basDevpWmsParam.setInEnable(basDevp.getInEnable());
            basDevpWmsParam.setOutEnable(basDevp.getOutEnable());
            basDevpWmsParam.setDevErr(basDevp.getStaErr().longValue());
            basDevpWmsParam.setDevErrM(basDevpWmsParam.getDevErr$());
            list.add(basDevpWmsParam);
        }
        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<>());
        for (BasCrnp basCrnp:basCrnps){
            list.add(basCrnp);
        List<BasCrnpWmsParam> basCrnpWmsParamList = new ArrayList<>();
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) { continue; }
            BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
            if (basCrnp == null) {
                log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId());
                continue;
            }
            BasCrnpWmsParam basCrnpWmsParam = new BasCrnpWmsParam();
            basCrnpWmsParam.sync(basCrnp);
            basCrnpWmsParam.setCrnNoH(crnProtocol.getLaneNo());
            basCrnpWmsParamList.add(basCrnpWmsParam);
            try{
                BasCrnError basCrnError = basCrnErrorService.selectById(basCrnp.getCrnErr());
                basCrnpWmsParam.setCrnErrM(basCrnError.getErrName());
            } catch (Exception e){
                basCrnpWmsParam.setCrnErrM("未知异常");
            }
            list.add(basCrnpWmsParam);
        }
        for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
            RgvProtocol rgvStatus = RgvStatusCache.getRgvStatus(rgvSlave.getId());
            if (Cools.isEmpty(rgvStatus)){
                continue;
            }
            BasRgvWmsParam basRgvWmsParam = new BasRgvWmsParam();
            basRgvWmsParam.setWrkNo(rgvStatus.getTaskNo());
            basRgvWmsParam.setCrnSts(rgvStatus.getStatus().intValue());
            basRgvWmsParam.setStatusType(rgvStatus.getStatusType().desc);
            basRgvWmsParam.setSteNo(rgvSlave.getId());
            basRgvWmsParam.setSteErr(rgvStatus.getAlarm().longValue());
            try{
                BasRgvErr basRgvErr = basRgvErrService.selectById(rgvStatus.getAlarm().longValue());
                basRgvWmsParam.setSteErrM(basRgvErr.getErrName());
            } catch (Exception e){
                basRgvWmsParam.setSteErrM("未知异常");
            }
            list.add(basRgvWmsParam);
        }
//        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<>());
//        for (BasCrnp basCrnp:basCrnps){
//            list.add(basCrnp);
//        }
        return R.ok(list);
    }
src/main/java/com/zy/asrs/controller/TaskWrkController.java
@@ -6,14 +6,10 @@
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.core.exception.CoolException;
import com.zy.asrs.domain.enums.TaskStatusType;
import com.zy.asrs.entity.CommandInfo;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.TaskWrk;
import com.zy.asrs.entity.param.TaskOverToWms;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.CommandInfoService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.TaskWrkService;
import com.core.annotations.ManagerAuth;
@@ -40,9 +36,6 @@
    private TaskWrkService taskWrkService;
    @Autowired
    private CommandInfoService commandInfoService;
    @Autowired
    private LocMastService locMastService;
    @Value("${wms.taskStatusFeedbackPath}")
@@ -64,11 +57,45 @@
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<TaskWrk> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        return R.ok(taskWrkService.selectPage(new Page<>(curr, limit), wrapper));
        try{
            Integer wrkNo = null;
            Integer taskNo = null;
            Integer status = null;
            Date modiTimeStart = null, modiTimeEnd = null;
            for (Map.Entry<String, Object> entry : param.entrySet()) {
                String val = String.valueOf(entry.getValue());
                if (Cools.isEmpty(val)) {
                    continue;
                }
                if (val.contains(RANGE_TIME_LINK)) {
                    String[] dates = val.split(RANGE_TIME_LINK);
                    modiTimeStart = DateUtils.convert(dates[0]);
                    modiTimeEnd = DateUtils.convert(dates[1]);
                } else if (entry.getKey().equals("wrk_no")) {
                    wrkNo = Integer.parseInt(val);
                } else if (entry.getKey().equals("task_no")) {
                    taskNo = Integer.parseInt(val);
                } else if (entry.getKey().equals("status")) {
                    status = Integer.parseInt(val);
                }
            }
            EntityWrapper<TaskWrk> wrapper = new EntityWrapper<>();
            excludeTrash(param);
            convert(param, wrapper);
            if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
            List<TaskWrk> taskWrkList = taskWrkService.selectTaskWrkList(wrkNo,taskNo,status,modiTimeStart,modiTimeEnd, curr, limit);
            Page<TaskWrk> page1 = new Page<TaskWrk>(curr, limit).setRecords(taskWrkList);
            page1.setTotal(taskWrkService.selectTaskWrkListTotal(wrkNo,taskNo,status,modiTimeStart,modiTimeEnd));
            return R.ok(page1);
//        return R.ok(taskWrkService.selectPage(new Page<>(curr, limit), wrapper));
        } catch (Exception e) {
            return R.error("查询失败,请检查参数:"+e.getMessage());
        }
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
@@ -121,10 +148,30 @@
    @RequestMapping(value = "/taskWrk/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Long[] ids){
         for (Long id : ids){
            taskWrkService.deleteById(id);
    public R delete(@RequestParam String taskNo){
//         for (Long id : ids){
//            taskWrkService.deleteById(id);
//        }
        TaskWrk taskWrk = taskWrkService.selectByTaskNo(taskNo);
        if (taskWrk == null) {
            return R.error();
        }
        Date now = new Date();
        taskWrk.setMemo("手动强制删除!!!");
        taskWrk.setModiTime(now);
        taskWrk.setModiUser(getUserId());
        if (!taskWrkService.updateById(taskWrk)){
            log.error("删除失败" + taskWrk);
            return R.error("删除失败" + taskWrk);
        }
        if (taskWrkService.saveToHistoryD(taskWrk.getTaskNo()) == 0) {
            log.error("任务档转任务历史档失败" + taskWrk);
            return R.error("任务档转任务历史档失败" + taskWrk);
        }
        //删除任务
        taskWrkService.delete(new EntityWrapper<TaskWrk>().eq("task_no", taskWrk.getTaskNo()));
        return R.ok();
    }
src/main/java/com/zy/asrs/controller/TaskWrkLogController.java
@@ -1,6 +1,5 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
@@ -37,12 +36,36 @@
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<TaskWrkLog> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        wrapper.orderDesc(Collections.singleton("CREATE_TIME"));
        return R.ok(taskWrkLogService.selectPage(new Page<>(curr, limit), wrapper));
        try{
            Integer wrkNo = null;
            Integer taskNo = null;
            Integer status = null;
            Date modiTimeStart = null, modiTimeEnd = null;
            for (Map.Entry<String, Object> entry : param.entrySet()) {
                String val = String.valueOf(entry.getValue());
                if (Cools.isEmpty(val)) {
                    continue;
                }
                if (val.contains(RANGE_TIME_LINK)) {
                    String[] dates = val.split(RANGE_TIME_LINK);
                    modiTimeStart = DateUtils.convert(dates[0]);
                    modiTimeEnd = DateUtils.convert(dates[1]);
                } else if (entry.getKey().equals("wrk_no")) {
                    wrkNo = Integer.parseInt(val);
                } else if (entry.getKey().equals("task_no")) {
                    taskNo = Integer.parseInt(val);
                } else if (entry.getKey().equals("status")) {
                    status = Integer.parseInt(val);
                }
            }
            List<TaskWrkLog> taskWrkList = taskWrkLogService.selectTaskWrkLogList(wrkNo,taskNo,status,modiTimeStart,modiTimeEnd, curr, limit);
            Page<TaskWrkLog> page1 = new Page<TaskWrkLog>(curr, limit).setRecords(taskWrkList);
            page1.setTotal(taskWrkLogService.selectTaskWrkLogListTotal(wrkNo,taskNo,status,modiTimeStart,modiTimeEnd));
            return R.ok(page1);
        } catch (Exception e) {
            return R.error("查询失败,请检查参数:"+e.getMessage());
        }
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
src/main/java/com/zy/asrs/entity/BasDevp.java
@@ -228,7 +228,7 @@
    @ApiModelProperty(value= "异常码")
    @TableField("STA_ERR")
    private Integer staErr;
    private Integer staErr = -1;
    public String getIoTime$(){
src/main/java/com/zy/asrs/entity/BasRgvErr.java
New file
@@ -0,0 +1,102 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import com.core.common.Cools;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
@Data
@TableName("\"SOURCE\".\"asr_bas_rgv_err\"")
public class BasRgvErr implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 异常码
     */
    @ApiModelProperty(value= "异常码")
    @TableId(value = "ERROR_CODE", type = IdType.INPUT)
    @TableField("ERROR_CODE")
    private Long errorCode;
    /**
     * 异常
     */
    @ApiModelProperty(value= "异常")
    @TableField("ERR_NAME")
    private String errName;
    /**
     * 修改人员
     */
    @ApiModelProperty(value= "修改人员")
    @TableField("MODI_USER")
    private Long modiUser;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("MODI_TIME")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date modiTime;
    /**
     * 添加人员
     */
    @ApiModelProperty(value= "添加人员")
    @TableField("APPE_USER")
    private Long appeUser;
    /**
     * 添加时间
     */
    @ApiModelProperty(value= "添加时间")
    @TableField("APPE_TIME")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date appeTime;
    public BasRgvErr() {}
    public BasRgvErr(Long errorCode, String errName, Long modiUser, Date modiTime, Long appeUser, Date appeTime) {
        this.errorCode = errorCode;
        this.errName = errName;
        this.modiUser = modiUser;
        this.modiTime = modiTime;
        this.appeUser = appeUser;
        this.appeTime = appeTime;
    }
//    BasRgvErr basRgvErr = new BasRgvErr(
//            null,    // 异常码[非空]
//            null,    // 异常
//            null,    // 修改人员
//            null,    // 修改时间
//            null,    // 添加人员
//            null    // 添加时间
//    );
    public String getModiTime$(){
        if (Cools.isEmpty(this.modiTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.modiTime);
    }
    public String getAppeTime$(){
        if (Cools.isEmpty(this.appeTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime);
    }
}
src/main/java/com/zy/asrs/entity/StaDesc.java
@@ -69,14 +69,6 @@
    private Integer crnNo;
    /**
     * 堆垛机号
     */
    @ApiModelProperty(value= "堆垛机号")
    @TableId(value = "LANE_NO", type = IdType.INPUT)
    @TableField("LANE_NO")
    private Integer laneNo;
    /**
     * 堆垛机站点
     */
    @ApiModelProperty(value= "堆垛机站点")
@@ -307,13 +299,5 @@
            return "";
        }
        return basWrkIotype.getIoDesc();
    }
    public Integer getLaneNo() {
        return laneNo;
    }
    public void setLaneNo(Integer laneNo) {
        this.laneNo = laneNo;
    }
}
src/main/java/com/zy/asrs/entity/ToWmsDTO.java
@@ -23,11 +23,26 @@
    private Integer stationCode;
    //库位类型
    private Integer locType;
    private Integer status;//空满版
    private Double grossWt;
    public ToWmsDTO(String barcode, Integer stationCode, Integer locType){
//    public ToWmsDTO(String barcode, Integer stationCode, Integer locType){
//        this.barcode = barcode;
//        this.stationCode = stationCode;
//        this.locType = locType;
//    }
    public ToWmsDTO(String barcode, Integer stationCode, Integer status){
        this.barcode = barcode;
        this.stationCode = stationCode;
        this.locType = locType;
        this.status = status;
    }
    public ToWmsDTO(Integer stationCode, Double grossWt, String barcode, Integer status) {
        this.stationCode = stationCode;
        this.grossWt = grossWt;
        this.barcode = barcode;
        this.status = status;
    }
    public ToWmsDTO(){
src/main/java/com/zy/asrs/entity/param/BasCrnpWmsParam.java
New file
@@ -0,0 +1,103 @@
package com.zy.asrs.entity.param;
import com.zy.common.utils.Synchro;
import lombok.Data;
import java.util.Date;
@Data
public class BasCrnpWmsParam {
    /**
     * 编号
     */
    private Integer crnNo;
    private Integer crnNoH;
    /**
     * 可入
     */
    private String inEnable;
    /**
     * 可出
     */
    private String outEnable;
    /**
     * 状态
     */
    private Integer crnSts;
    /**
     * 工作号
     */
    private Integer wrkNo;
    /**
     * 异常码
     */
    private Long crnErr;
    private String crnErrM;
    /**
     * 源库位
     */
    private String frmLocno;
    /**
     * 源站
     */
    private Integer frmSta;
    /**
     * 目标站
     */
    private Integer toSta;
    /**
     * 目标库位
     */
    private String toLocno;
//    /**
//     * 创建者
//     */
//    private Long appeUser;
//
//    /**
//     * 创建时间
//     */
//    private Date appeTime;
//
//    /**
//     * 修改人员
//     */
//    private Long modiUser;
//
//    /**
//     * 修改时间
//     */
//    private Date modiTime;
//
//    private String hpMk;
//
//    private String retrieveMk;
//
//    private String ctlHp;
//
//    private String ctlRest;
//
//    private String empIn;
//
//    private Integer tankQty;
//
//    private Integer tankQty1;
    public BasCrnpWmsParam() {}
    public void sync(Object source) {
        Synchro.Copy(source, this);
    }
}
src/main/java/com/zy/asrs/entity/param/BasDevpWmsParam.java
New file
@@ -0,0 +1,44 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class BasDevpWmsParam {
    /**
     * 编号
     */
    private Integer devNo;//输送给站点号
    /**
     * 工作号
     */
    private Long wrkNo;
    /**
     * 异常码
     */
    private Long devErr;//异常码   0:正常
    private String devErrM;//异常   正常
    private String devMk;//备注
    private String inEnable;//可入
    private String outEnable;//可出
    private String autoing;//自动
    private String loading;//有物
    private String barcode = "";//条码
    private Double grossWt;//重量
    public BasDevpWmsParam() {}
    public String getDevErr$() {
        if (devErr == null) return "未知异常";
        switch (devErr.intValue()){
            case 0:
                return "正常";
            case 1:
                return "超重";
            default:
                return "未知异常";
        }
    }
}
src/main/java/com/zy/asrs/entity/param/BasRgvWmsParam.java
New file
@@ -0,0 +1,32 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class BasRgvWmsParam {
    /**
     * 编号
     */
    private Integer steNo;
    /**
     * 状态
     */
    private Integer crnSts;
    private String statusType;
    /**
     * 工作号
     */
    private Long wrkNo;
    /**
     * 异常码
     */
    private Long steErr;
    private String steErrM;
    public BasRgvWmsParam() {}
}
src/main/java/com/zy/asrs/entity/param/CarryParam.java
@@ -10,6 +10,9 @@
    //入出库类型
    private Integer ioType;
    //优先级
    private Integer taskPriority;
    //容器编码
    private String barcode;
@@ -22,4 +25,20 @@
    //备注
    private String meno;
    public void updateIoTyoe(Integer ioTypeOld){
        switch (ioTypeOld){
            case 1:
                this.ioType = 2;
                break;
            case 2:
                this.ioType = 3;
                break;
            case 3:
                this.ioType = 1;
                break;
            default:
                this.ioType = 3;
        }
    }
}
src/main/java/com/zy/asrs/entity/param/TaskCreateParam.java
@@ -34,6 +34,27 @@
    public TaskCreateParam(){};
    public TaskCreateParam(String taskNo, Integer ioType, String barcode, String startPoint, Integer taskPriority, String targetPoint, String emptyContainer) {
        this.taskNo = taskNo;
        this.ioType = ioType;
        this.barcode = barcode;
        this.startPoint = startPoint;
        this.taskPriority = taskPriority;
        this.targetPoint = targetPoint;
        this.emptyContainer = emptyContainer;
    }
    public TaskCreateParam(String taskNo, Integer ioType, String startPoint, Integer taskPriority, String targetPoint, String emptyContainer, String barcode, String memo) {
        this.taskNo = taskNo;
        this.ioType = ioType;
        this.startPoint = startPoint;
        this.taskPriority = taskPriority;
        this.targetPoint = targetPoint;
        this.emptyContainer = emptyContainer;
        this.barcode = barcode;
        this.memo = memo;
    }
    public TaskCreateParam(WMSAndAGVInterfaceParam param){
        this.taskNo = param.getTaskNo();
        this.ioType = convertParamIoType(param.getTaskType());
@@ -49,7 +70,7 @@
        this.taskNo = param.getTaskNo();
        this.ioType = param.getIoType();
        this.barcode = param.getBarcode();
        this.taskPriority = 300;
        this.taskPriority = param.getTaskPriority();
        this.startPoint = param.getStartPoint();
        this.targetPoint = param.getTargetPoint();
        this.emptyContainer = "N";
@@ -70,4 +91,20 @@
        }
    }
    public void updateIoTyoe(Integer ioTypeOld){
        switch (ioTypeOld){
            case 1:
                this.ioType = 2;
                break;
            case 2:
                this.ioType = 3;
                break;
            case 3:
                this.ioType = 1;
                break;
            default:
                this.ioType = 3;
        }
    }
}
src/main/java/com/zy/asrs/entity/param/WMSAndAGVInterfaceParam.java
@@ -53,5 +53,16 @@
    private String requestType;         //请求类型:         1=取货;2=放货
    private String wharfCode;           //码头编号
//
//    public void updateTaskStatus(Integer TaskStatusOld){
//        switch (TaskStatusOld){
//            case 1:
//                this.taskStatus = 1;
//                break;
//            case 2:
//                this.taskStatus = 3;
//            default:
//                this.ioType = 0;
//        }
//    }
}
src/main/java/com/zy/asrs/mapper/BasRgvErrMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.BasRgvErr;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface BasRgvErrMapper extends BaseMapper<BasRgvErr> {
}
src/main/java/com/zy/asrs/mapper/TaskWrkLogMapper.java
@@ -3,10 +3,27 @@
import com.zy.asrs.entity.TaskWrkLog;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
@Mapper
@Repository
public interface TaskWrkLogMapper extends BaseMapper<TaskWrkLog> {
    List<TaskWrkLog> selectTaskWrkLogList(@Param("wrkNo") Integer wrkNo,
                                       @Param("taskNo") Integer taskNo,
                                       @Param("status") Integer status,
                                       @Param("modiTimeStart") Date modiTimeStart,
                                       @Param("modiTimeEnd") Date modiTimeEnd,
                                       @Param("pageNumber") Integer curr,
                                       @Param("pageSize") Integer limit);
    Long selectTaskWrkLogListTotal(@Param("wrkNo") Integer wrkNo,
                                @Param("taskNo") Integer taskNo,
                                @Param("status") Integer status,
                                @Param("modiTimeStart") Date modiTimeStart,
                                @Param("modiTimeEnd") Date modiTimeEnd);
}
src/main/java/com/zy/asrs/mapper/TaskWrkMapper.java
@@ -7,6 +7,7 @@
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
@Mapper
@@ -34,10 +35,29 @@
    TaskWrk selectCrnNoInWorking(@Param("crnNo") Integer crnNo,@Param("workNo") Integer workNo);
    TaskWrk selectWalkSta(@Param("crnNo") Integer crnNo,@Param("workNo") Integer workNo);
    List<TaskWrk> selectToBeHistoryData();
    int saveToHistory(String taskNo);//将任务转历史日志
    List<TaskWrk> selectWorkingTask();//获取工作中的任务
    List<TaskWrk> selectTaskWrkList(@Param("wrkNo") Integer wrkNo,
                                    @Param("taskNo") Integer taskNo,
                                    @Param("status") Integer status,
                                    @Param("modiTimeStart") Date modiTimeStart,
                                    @Param("modiTimeEnd") Date modiTimeEnd,
                                    @Param("pageNumber") Integer curr,
                                    @Param("pageSize") Integer limit);
    Long selectTaskWrkListTotal(@Param("wrkNo") Integer wrkNo,
                                @Param("taskNo") Integer taskNo,
                                @Param("status") Integer status,
                                @Param("modiTimeStart") Date modiTimeStart,
                                @Param("modiTimeEnd") Date modiTimeEnd);
    int saveToHistoryD(String taskNo);//将任务转历史日志
}
src/main/java/com/zy/asrs/service/BasRgvErrService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.BasRgvErr;
public interface BasRgvErrService extends IService<BasRgvErr> {
}
src/main/java/com/zy/asrs/service/TaskWrkLogService.java
@@ -3,6 +3,11 @@
import com.zy.asrs.entity.TaskWrkLog;
import com.baomidou.mybatisplus.service.IService;
import java.util.Date;
import java.util.List;
public interface TaskWrkLogService extends IService<TaskWrkLog> {
    List<TaskWrkLog> selectTaskWrkLogList(Integer wrkNo, Integer taskNo, Integer status, Date modiTimeStart, Date modiTimeEnd, Integer curr, Integer limit);
    Long selectTaskWrkLogListTotal(Integer wrkNo,Integer taskNo,Integer status,Date modiTimeStart,Date modiTimeEnd);
}
src/main/java/com/zy/asrs/service/TaskWrkService.java
@@ -3,6 +3,7 @@
import com.zy.asrs.entity.TaskWrk;
import com.baomidou.mybatisplus.service.IService;
import java.util.Date;
import java.util.List;
public interface TaskWrkService extends IService<TaskWrk> {
@@ -29,5 +30,9 @@
    List<TaskWrk> selectToBeHistoryData();
    int saveToHistory(String taskNo);//将任务转历史日志
    int saveToHistoryD(String taskNo);//将任务转历史日志
    List<TaskWrk> selectTaskWrkList(Integer wrkNo, Integer taskNo, Integer status, Date modiTimeStart, Date modiTimeEnd, Integer curr, Integer limit);
    Long selectTaskWrkListTotal(Integer wrkNo,Integer taskNo,Integer status,Date modiTimeStart,Date modiTimeEnd);
}
src/main/java/com/zy/asrs/service/impl/BasRgvErrServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zy.asrs.entity.BasRgvErr;
import com.zy.asrs.mapper.BasRgvErrMapper;
import com.zy.asrs.service.BasRgvErrService;
import org.springframework.stereotype.Service;
@Service("basRgvErrService")
public class BasRgvErrServiceImpl extends ServiceImpl<BasRgvErrMapper, BasRgvErr> implements BasRgvErrService {
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -16,20 +16,21 @@
import com.zy.asrs.utils.RouteUtils;
import com.zy.asrs.utils.TrackRangeUtils;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.MatDto;
import com.zy.common.service.CommonService;
import com.zy.common.utils.CollectionUtils;
import com.zy.common.utils.HttpHandler;
import com.zy.core.CrnThread;
import com.zy.core.DevpThread;
import com.zy.core.cache.*;
import com.zy.core.enums.*;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.Task;
import com.zy.core.model.*;
import com.zy.core.model.command.CrnCommand;
import com.zy.core.model.command.LedCommand;
import com.zy.core.model.protocol.*;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.BarcodeThread;
import com.zy.core.thread.LedThread;
import com.zy.core.thread.RgvThread;
import com.zy.core.thread.SiemensDevpThread;
import lombok.extern.slf4j.Slf4j;
@@ -42,6 +43,7 @@
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
 * 立体仓库WCS系统主流程业务
@@ -155,13 +157,13 @@
                    }
                    // 退回
                    if (back) {
                        if (stano == inSta.getBackSta().shortValue()){
                        if (stano == inSta.getBackSta().shortValue()) {
                            continue;
                        }
                        if (workNo == 0 && stano == 0){
                        if (workNo == 0 && stano == 0) {
                            continue;
                        }
                        if (!staProtocol.isPakMk()){
                        if (!staProtocol.isPakMk()) {
                            continue;
                        }
//                        News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg);
@@ -180,27 +182,30 @@
                    // 判断是否满足入库条件
                    if (staProtocol.isAutoing() && staProtocol.isLoading()
                            && staProtocol.isInEnable()
                            && !staProtocol.isEmptyMk() && (workNo == 9991 )
                            && staProtocol.isPakMk()) {
                            && !staProtocol.isEmptyMk() && (workNo == 0 || (workNo>9000 && workNo<10000))
                            && staProtocol.isPakMk()
                            && staProtocol.isPakMkWalk()
                    ) {
                        // 获取条码扫描仪信息
                        BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                        if (barcodeThread == null) {
                            continue;
                        }
                        String barcode = barcodeThread.getBarcode();
                        if(!Cools.isEmpty(barcode) && !barcode.equals("99999999")) {
                        if (!Cools.isEmpty(barcode) && !barcode.equals("99999999")) {
                            // 请求wms接口,获取工作号和目标库位
                            ToWmsDTO toWmsDTO = new ToWmsDTO(barcode,staProtocol.getSiteId(),staProtocol.isHigh() ? 2 : 1);
                            TaskWrk taskWrk1=taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode",barcode));
                            if(!Cools.isEmpty(taskWrk1)){
                                log.info("托盘码:"+barcode+"任务档存在");
                                if (taskWrk1.getIoType()==1 && taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString())){
                            ToWmsDTO toWmsDTO = new ToWmsDTO(staProtocol.getSiteId(),staProtocol.getGrossWt(),barcode, 0);
                            TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode", barcode));
                            if (!Cools.isEmpty(taskWrk1)) {
                                log.info("托盘码:" + barcode + "任务档存在");
                                if (taskWrk1.getIoType() == 1 && taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString())) {
                                    StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                            .eq("crn_no", taskWrk1.getCrnNo()).eq("type_no",1).eq("stn_no",staProtocol.getSiteId()));
                                    if (Cools.isEmpty(staDesc)){
                                        log.info("托盘码:"+barcode+"任务档存在");
                                            .eq("CRN_NO", taskWrk1.getCrnNo()).eq("TYPE_NO", 1).eq("STN_NO", staProtocol.getSiteId()));
                                    if (Cools.isEmpty(staDesc)) {
                                        log.info("托盘码:" + barcode + "任务档存在");
                                        return;
                                    }else {
                                    } else {
                                        staProtocol.setWorkNo(taskWrk1.getWrkNo());
                                        staProtocol.setStaNo(staDesc.getCrnStn());
                                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
@@ -209,9 +214,9 @@
                                return;
                            }
                            HashMap<String, Object> headParam = new HashMap<>();
                            headParam.put("Content-Type","application/json");
                            headParam.put("Content-Type", "application/json");
                            String response;
                            try{
                            try {
                                response = new HttpHandler.Builder()
                                        // .setHeaders(headParam)
                                        .setUri(wmsUrl)
@@ -219,140 +224,54 @@
                                        .setJson(JSON.toJSONString(toWmsDTO))
                                        .build()
                                        .doPost();
                            }catch (Exception e){
                            } catch (Exception e) {
                                log.error("请求入库调用接口失败");
                                log.error("异常信息打印:"+e);
                                try{
                                log.error("异常信息打印:" + e);
                                try {
                                    BasDevp basDevp = basDevpService.selectById(inSta.getStaNo());
                                    if (Cools.isEmpty(basDevp)){
                                        log.error("站点号异常"+inSta.getStaNo());
                                    } else if (basDevp.getStaErr()!=0){
                                    if (Cools.isEmpty(basDevp)) {
                                        log.error("站点号异常" + inSta.getStaNo());
                                    } else if (basDevp.getStaErr() != 0) {
                                        basDevp.setStaErr(2);
                                        basDevpService.updateById(basDevp);
                                    }
                                }catch (Exception e1){
                                } catch (Exception e1) {
                                    // 退回
                                    log.error("扫码检测程序异常"+inSta.getStaNo()+"异常信息"+e1);
                                    log.error("扫码检测程序异常" + inSta.getStaNo() + "异常信息" + e1);
                                }
                                staProtocol.setWorkNo(9999);
                                staProtocol.setStaNo(inSta.getStaNo());
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                                    TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo));
//                                    if (taskWrk != null) {
//                                        taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示
//                                        taskWrkMapper.updateById(taskWrk);
//                                    }
                                continue;
                            }
                            JSONObject jsonObject = JSON.parseObject(response);
                            apiLogService.save("wms请求入库货位接口"
                                    ,wmsUrl+inboundTaskApplyPath
                                    ,null
                                    ,"127.0.0.1"
                                    ,JSON.toJSONString(toWmsDTO)
                                    ,response
                                    ,true
                                    , wmsUrl + inboundTaskApplyPath
                                    , null
                                    , "127.0.0.1"
                                    , JSON.toJSONString(toWmsDTO)
                                    , response
                                    , true
                            );
                            log.info("入库请求参数{}" + JSON.toJSONString(toWmsDTO));
                            log.info("入库请求返回参数{}" + JSON.toJSONString(response));
                            if (jsonObject.getInteger("code").equals(200) && !Cools.isEmpty(jsonObject.get("data").toString())) {
                                GetWmsDto getWmsDto = JSON.parseObject(jsonObject.get("data").toString(), GetWmsDto.class);
                                try{
                                    BasDevp basDevp = basDevpService.selectById(inSta.getStaNo());
                                    if (Cools.isEmpty(basDevp)){
                                        log.error("站点号异常1"+inSta.getStaNo());
                                        throw new CoolException("站点号异常1,未查询到站点信息"+inSta.getStaNo());
                                    }
                                    Integer staNoCrnNo = Utils.StaNoCrnNo(inSta.getStaNo());
                                    if (staNoCrnNo==0){
                                        basDevp.setStaErr(1);
                                        basDevpService.updateById(basDevp);
                                        log.error("站点号异常2"+inSta.getStaNo());
                                        throw new CoolException("站点号异常2,站点号不存在"+inSta.getStaNo());
                                    }else {
                                        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                                                .eq("crn_no", staNoCrnNo.longValue())
                                                .eq("loc_no", getWmsDto.getLocNo()));
                                        if (Cools.isEmpty(locMast)){
                                            basDevp.setStaErr(1);
                                            basDevpService.updateById(basDevp);
                                            log.error("站点号异常3"+inSta.getStaNo());
                                            throw new CoolException("站点号异常3:此巷道不存在目标库位"+inSta.getStaNo());
                                        }
                                    }
                                } catch (Exception e){
//                                    log.error("扫码检测程序异常"+inSta.getStaNo()+"异常信息"+e);
                            if (jsonObject.getInteger("code").equals(200)) {
                                try {
                                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                                } catch (Exception e) {
                                    // 退回
                                    log.error("扫码检测程序异常"+inSta.getStaNo()+errMsg);
                                    log.error("扫码检测程序异常,异常信息"+e);
                                    log.error("扫码检测程序异常" + inSta.getStaNo() + errMsg);
                                    log.error("扫码检测程序异常,异常信息" + e);
                                    staProtocol.setWorkNo(9999);
                                    staProtocol.setStaNo(inSta.getStaNo());
                                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                                    TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo));
//                                    if (taskWrk != null) {
//                                        taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示
//                                        taskWrkMapper.updateById(taskWrk);
//                                    }
                                    continue;
                                }
                                //查看该库位是否为空库位
                                LocMast locMast=locMastService.selectOne(new EntityWrapper<LocMast>()
                                        .eq("loc_sts","O")
                                        .eq("loc_no",getWmsDto.getLocNo()));
                                if(Cools.isEmpty(locMast)){
                                    try{
                                        HashMap<String, Object> headParam1 = new HashMap<>();
                                        headParam1.put("taskNo",getWmsDto.getTaskNo());
                                        headParam1.put("status",6);
                                        headParam1.put("ioType",1);
                                        headParam1.put("barcode",barcode);
                                        String response2;
                                        response2 = new HttpHandler.Builder()
                                                // .setHeaders(headParam)
                                                .setUri(wmsUrl)
                                                .setPath(taskStatusFeedbackPath)
                                                .setJson(JSON.toJSONString(headParam1))
                                                .build()
                                                .doPost();
                                        JSONObject jsonObject1 = JSON.parseObject(response2);
                                        apiLogService.save("wcs派发库位==》不为空《==上报wms"
                                                ,wmsUrl+taskStatusFeedbackPath
                                                ,null
                                                ,"127.0.0.1"
                                                ,JSON.toJSONString(headParam1)
                                                ,response
                                                ,true
                                        );
                                    }catch (Exception e){
                                        log.error("wcs派发库位==》不为空《==上报wms", getWmsDto.getWrkNo());
                                        throw new CoolException("wcs派发入库任务上报wms失败,派发库位==》不为空《==,异常信息:"+e);
                                    }
                                }
                                // 创新一个入库工作档
                                TaskWrk taskWrk = taskWrkService.selectByTaskNo(getWmsDto.getWrkNo());
                                if(Cools.isEmpty(taskWrk)) {
                                    taskWrk = createTask(getWmsDto,barcode);
                                    if (Cools.isEmpty(taskWrk)){
                                        log.error("库位异常,库位号:{}", getWmsDto.getTargetLocationCode());
                                    }else {
                                        taskWrkService.insert(taskWrk);
                                        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                                .eq("crn_no", taskWrk.getCrnNo()).eq("type_no",1).eq("stn_no",staProtocol.getSiteId()));
                                        staProtocol.setWorkNo(taskWrk.getWrkNo());
                                        staProtocol.setStaNo(staDesc.getCrnStn());
                                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                    }
                                }
                            }else {
                                continue;
                            }
                        } else {
                            // 退回
                            log.error("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg);
@@ -379,6 +298,254 @@
        }
    }
    public void generateStoreWrkFileIsEmptyMk() {
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历入库口
                for (DevpSlave.Sta inSta : devp.getInSta()) {
                    // 获取入库站信息
                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    Integer workNo = staProtocol.getWorkNo();
                    Integer stano = staProtocol.getStaNo();
                    // 尺寸检测异常
                    boolean back = false;
                    String errMsg = "";
                    if (staProtocol.isFrontErr()) {
                        errMsg = "前超限";
                        back = true;
                    }
                    if (!back && staProtocol.isBackErr()) {
                        errMsg = "后超限";
                        back = true;
                    }
                    if (!back && staProtocol.isHighErr()) {
                        errMsg = "高超限";
                        back = true;
                    }
                    if (!back && staProtocol.isLeftErr()) {
                        errMsg = "左超限";
                        back = true;
                    }
                    if (!back && staProtocol.isRightErr()) {
                        errMsg = "右超限";
                        back = true;
                    }
                    if (!back && staProtocol.isWeightErr()) {
                        errMsg = "超重";
                        back = true;
                    }
                    // 退回
                    if (back) {
                        if (stano == inSta.getBackSta().shortValue()) {
                            continue;
                        }
                        if (workNo == 0 && stano == 0) {
                            continue;
                        }
                        if (!staProtocol.isPakMk()) {
                            continue;
                        }
//                        News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg);
                        staProtocol.setWorkNo(workNo);
                        staProtocol.setStaNo(inSta.getStaNo());
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo));
                        if (taskWrk != null) {
                            taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示
                            taskWrk.setModiTime(new Date());
                            taskWrkMapper.updateById(taskWrk);
                        }
                        continue;
                    }
                    // 判断是否满足入库条件
                    if (staProtocol.isAutoing() && staProtocol.isLoading()
                            && staProtocol.isInEnable()
                            && staProtocol.isEmptyMk() && (workNo == 0 || (workNo>9000 && workNo<10000))
                            && staProtocol.isPakMk()
                            && staProtocol.isPakMkWalk()
                    ) {
                        // 请求wms接口,获取工作号和目标库位
                        ToWmsDTO toWmsDTO = new ToWmsDTO("", staProtocol.getSiteId(), 1);
                        HashMap<String, Object> headParam = new HashMap<>();
                        headParam.put("Content-Type", "application/json");
                        String response;
                        try {
                            response = new HttpHandler.Builder()
                                    // .setHeaders(headParam)
                                    .setUri(wmsUrl)
                                    .setPath(inboundTaskApplyPath)
                                    .setJson(JSON.toJSONString(toWmsDTO))
                                    .build()
                                    .doPost();
                        } catch (Exception e) {
                            log.error("请求入库调用接口失败");
                            log.error("异常信息打印:" + e);
                            try {
                                BasDevp basDevp = basDevpService.selectById(inSta.getStaNo());
                                if (Cools.isEmpty(basDevp)) {
                                    log.error("站点号异常" + inSta.getStaNo());
                                } else if (basDevp.getStaErr() != 0) {
                                    basDevp.setStaErr(2);
                                    basDevpService.updateById(basDevp);
                                }
                            } catch (Exception e1) {
                                // 退回
                                log.error("扫码检测程序异常" + inSta.getStaNo() + "异常信息" + e1);
                            }
                            staProtocol.setWorkNo(9999);
                            staProtocol.setStaNo(inSta.getStaNo());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            continue;
                        }
                        JSONObject jsonObject = JSON.parseObject(response);
                        apiLogService.save("wms请求入库货位接口"
                                , wmsUrl + inboundTaskApplyPath
                                , null
                                , "127.0.0.1"
                                , JSON.toJSONString(toWmsDTO)
                                , response
                                , true
                        );
                        log.info("入库请求参数{}" + JSON.toJSONString(toWmsDTO));
                        log.info("入库请求返回参数{}" + JSON.toJSONString(response));
                        if (jsonObject.getInteger("code").equals(200)) {
                            try {
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                            } catch (Exception e) {
//                                    log.error("扫码检测程序异常"+inSta.getStaNo()+"异常信息"+e);
                                // 退回
                                log.error("扫码检测程序异常" + inSta.getStaNo() + errMsg);
                                log.error("扫码检测程序异常,异常信息" + e);
                                staProtocol.setWorkNo(9999);
                                staProtocol.setStaNo(inSta.getStaNo());
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            }
                        } else {
                            continue;
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("generateStoreWrkFile e", e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    public void generateStoreWrkFileWalk() {
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历入库口
                for (DevpSlave.Sta inSta : devp.getInWalkSta()) {
                    // 获取入库站信息
                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    Integer workNo = staProtocol.getWorkNo();
                    // 判断是否满足入库条件
                    if (staProtocol.isAutoing() && staProtocol.isLoading()
                            && staProtocol.isInEnable() && (workNo == 0 || (workNo>9000 && workNo<10000))
                            && staProtocol.isPakMkWalk()
                    ) {
                        if (inSta.isBarcodeSign()){
                            // 获取条码扫描仪信息
                            BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                            if (barcodeThread == null) {
                                continue;
                            }
                            String barcode = barcodeThread.getBarcode();
                            if (!Cools.isEmpty(barcode) && !barcode.equals("99999999")) {
                                // 请求wms接口,获取工作号和目标库位
                                ToWmsDTO toWmsDTO = new ToWmsDTO(barcode, staProtocol.getSiteId(), 0);
                                TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode", barcode));
                                if (!Cools.isEmpty(taskWrk1)) {
                                    log.info("托盘码:" + barcode + "任务档存在");
                                    if (taskWrk1.getIoType() == 1 && taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString())) {
                                        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                                .eq("CRN_NO", taskWrk1.getCrnNo()).eq("TYPE_NO", 1).eq("STN_NO", staProtocol.getSiteId()));
                                        if (Cools.isEmpty(staDesc)) {
                                            log.info("托盘码:" + barcode + "任务档存在");
                                            return;
                                        } else {
                                            staProtocol.setWorkNo(taskWrk1.getWrkNo());
                                            staProtocol.setStaNo(staDesc.getCrnStn());
                                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                        }
                                    }
                                    return;
                                }
                            } else {
                                TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>());
                                if (!Cools.isEmpty(taskWrk1)) {
                                    if (taskWrk1.getIoType() == 1 && taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString())) {
                                        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                                .eq("CRN_NO", taskWrk1.getCrnNo()).eq("TYPE_NO", 1).eq("STN_NO", staProtocol.getSiteId()));
                                        if (Cools.isEmpty(staDesc)) {
                                            return;
                                        } else {
                                            staProtocol.setWorkNo(taskWrk1.getWrkNo());
                                            staProtocol.setStaNo(staDesc.getCrnStn());
                                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                        }
                                    }
                                    return;
                                }
                            }
                        } else {
                            TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>());
                            if (!Cools.isEmpty(taskWrk1)) {
                                if (taskWrk1.getIoType() == 1 && taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString())) {
                                    StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                            .eq("CRN_NO", taskWrk1.getCrnNo()).eq("TYPE_NO", 1).eq("STN_NO", staProtocol.getSiteId()));
                                    if (Cools.isEmpty(staDesc)) {
                                        return;
                                    } else {
                                        staProtocol.setWorkNo(taskWrk1.getWrkNo());
                                        staProtocol.setStaNo(staDesc.getCrnStn());
                                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                    }
                                }
                                return;
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("generateStoreWrkFile e", e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    /**
     * 堆垛机站出库到出库站
     */
@@ -388,15 +555,17 @@
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) { continue; }
            if (crnProtocol == null) {
                continue;
            }
            BasCrnp basCrnp = basCrnpService.selectById(crnSlave.getId());
            if (basCrnp == null) {
                log.error("{}号堆垛机尚未在数据库进行维护!", crnSlave.getId());
                continue;
            }
            if (!crnSlave.getId().equals(crnProtocol.getLaneNo())){
            if (!crnSlave.getId().equals(crnProtocol.getLaneNo())) {
                for (CrnSlave crnOther : slaveProperties.getCrn()) {
                    if (crnOther.getId().equals(crnProtocol.getLaneNo())){
                    if (crnOther.getId().equals(crnProtocol.getLaneNo())) {
                        crnSlave.updateCrnInStn(crnOther);
                    }
                }
@@ -404,10 +573,9 @@
            // 遍历堆垛机出库站
            for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
                List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnSlave.getId()).eq("LANE_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
//                List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", crnSlave.getId()).eq("").eq("crn_stn", crnStn.getStaNo()));
                for (StaDesc staDesc : staDescs){
                    try{
                List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
                for (StaDesc staDesc : staDescs) {
                    try {
                        // 获取堆垛机出库站信息
                        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                        StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
@@ -422,33 +590,33 @@
                            if (taskWrk == null) {
                                continue;
                            }
                            log.info("下发输送线任务:taskWrk:"+JSON.toJSONString(taskWrk));
                            log.info("下发输送线任务:taskWrk:" + JSON.toJSONString(taskWrk));
//                            R r = siteController.siteDetlUpdate(Integer.valueOf(taskWrk.getTargetPoint()), taskWrk.getWrkNo().shortValue(), (short) 0, "Y", false, false);
                            staProtocol.setWorkNo(taskWrk.getWrkNo());
                            staProtocol.setStaNo(staDesc.getCrnStn());
                            boolean offer = false;
                            try{
                            try {
                                offer = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
                            }catch (Exception e){
                                log.error("下发输送线任务失败:异常:"+e);
                                log.error("下发输送线任务失败:异常:offer:"+offer);
                            } catch (Exception e) {
                                log.error("下发输送线任务失败:异常:" + e);
                                log.error("下发输送线任务失败:异常:offer:" + offer);
                            }
//                            JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(r));
                            if (offer){
                                log.info("下发输送线任务成功:taskWrk:"+JSON.toJSONString(taskWrk));
                            if (offer) {
                                log.info("下发输送线任务成功:taskWrk:" + JSON.toJSONString(taskWrk));
                                Date now = new Date();
                                taskWrk.setStatus(5);
                                taskWrk.setWrkSts(14);
                                taskWrk.setModiTime(now);
                                taskWrk.setCompleteTime(now);
                                taskWrkService.updateById(taskWrk);
                            }else {
                                log.error("下发输送线任务失败:taskWrk:"+JSON.toJSONString(taskWrk));
                            } else {
                                log.error("下发输送线任务失败:taskWrk:" + JSON.toJSONString(taskWrk));
//                                log.error("下发输送线任务失败:异常信息:"+JSON.toJSONString(r));
                            }
                        }
                    }catch (Exception e){
                        log.error("出库到出库站异常:异常信息:"+e);
                    } catch (Exception e) {
                        log.error("出库到出库站异常:异常信息:" + e);
                    }
                }
@@ -464,16 +632,18 @@
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) { continue; }
            if (crnProtocol == null) {
                continue;
            }
            BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
            if (basCrnp == null) {
                log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId());
                continue;
            }
            if (!crn.getId().equals(crnProtocol.getLaneNo())){
            if (!crn.getId().equals(crnProtocol.getLaneNo())) {
                for (CrnSlave crnOther : slaveProperties.getCrn()) {
                    if (crnOther.getId().equals(crnProtocol.getLaneNo())){
                    if (crnOther.getId().equals(crnProtocol.getLaneNo())) {
                        crn.updateCrnInStn(crnOther);
                    }
                }
@@ -515,7 +685,8 @@
     */
    public void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol) throws IOException {
        for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) {
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", slave.getId()).eq("LANE_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
            for (StaDesc staDesc : staDescs) {
                boolean flag = false;
                // 获取堆垛机入库站信息
@@ -533,7 +704,7 @@
                    continue;
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
                        && staDetl.getCanining()!=null && staDetl.getCanining().equals("Y")) {
                        && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                    flag = true;
                }
                if (!flag) {
@@ -542,7 +713,7 @@
                // 获取工作状态为2(设备上走)的入库工作档
                TaskWrk taskWrk = taskWrkMapper.selectPakIn(crnProtocol.getLaneNo(), staProtocol.getWorkNo().intValue(), staDesc.getStnNo().toString());
                if(null == taskWrk) {
                if (null == taskWrk) {
                    continue;
                }
@@ -601,7 +772,7 @@
                // 命令下发区 --------------------------------------------------------------------------
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                crnCommand.setCrnNo(staDesc.getLaneNo()); // 堆垛机巷道编号
                crnCommand.setCrnNo(crnProtocol.getLaneNo()); // 堆垛机巷道编号
                crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号
                crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
@@ -611,23 +782,23 @@
                crnCommand.setDestinationPosX(Utils.getRowShort(taskWrk.getTargetPoint()));     // 目标库位列
                crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint()));     // 目标库位层
                crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint()));     // 目标库位排
                crnCommand.setCommand((short)1);
                if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand),false)) {
                crnCommand.setCommand((short) 1);
                if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand), false)) {
                    log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
                    throw new CoolException("堆垛机命令生成失败");
                }else{
                    try{
                } else {
                    try {
                        taskWrkService.updateById(taskWrk);
                    }catch (Exception e){
                    } catch (Exception e) {
                        log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", taskWrk.getWrkNo());
                        log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,异常:"+e);
                        log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,异常:" + e);
                    }
                    try{
                    try {
                        HashMap<String, Object> headParam = new HashMap<>();
                        headParam.put("taskNo",taskWrk.getTaskNo());
                        headParam.put("status",taskWrk.getStatus());
                        headParam.put("ioType",taskWrk.getIoType());
                        headParam.put("barcode",taskWrk.getBarcode());
                        headParam.put("taskNo", taskWrk.getTaskNo());
                        headParam.put("status", taskWrk.getStatus());
                        headParam.put("ioType", taskWrk.getIoType());
                        headParam.put("barcode", taskWrk.getBarcode());
                        String response;
                        response = new HttpHandler.Builder()
                                // .setHeaders(headParam)
@@ -638,14 +809,14 @@
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        apiLogService.save("wcs派发入库任务上报wms"
                                ,wmsUrl+taskStatusFeedbackPath
                                ,null
                                ,"127.0.0.1"
                                ,JSON.toJSONString(headParam)
                                ,response
                                ,true
                                , wmsUrl + taskStatusFeedbackPath
                                , null
                                , "127.0.0.1"
                                , JSON.toJSONString(headParam)
                                , response
                                , true
                        );
                    } catch (Exception e){
                    } catch (Exception e) {
                        log.error("wcs派发入库任务上报wms失败", JSON.toJSONString(taskWrk));
//                        throw new CoolException("wcs派发入库任务上报wms失败");
                    }
@@ -661,19 +832,17 @@
     * 出库  ===>>  库位到堆垛机站
     * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库
     */
    public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol){
    public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol) {
        List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(crnProtocol.getLaneNo(), null);
        if (taskWrksInitial.size()==0){
        if (taskWrksInitial.size() == 0) {
            return;
        }
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", slave.getId()).eq("LANE_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
//            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", crnProtocol.getLaneNo()).eq("crn_stn", crnStn.getStaNo()));
            for (StaDesc staDesc : staDescs){
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
            for (StaDesc staDesc : staDescs) {
                // 获取工作状态为11(生成出库ID)的出库工作档
                List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(crnProtocol.getLaneNo(),staDesc.getStnNo().toString());
                for (TaskWrk taskWrk : taskWrks){
                List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(crnProtocol.getLaneNo(), staDesc.getStnNo().toString());
                for (TaskWrk taskWrk : taskWrks) {
                    if (taskWrk == null) {
                        continue;
                    }
@@ -699,7 +868,7 @@
                    }
                    // 判断堆垛机出库站状态
                    if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() !=null && staDetl.getCanouting().equals("Y")
                    if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")
                            && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
                        // 命令下发区 --------------------------------------------------------------------------
@@ -725,12 +894,12 @@
                        command.setDestinationPosX(crnStn.getRow().shortValue());     // 目标库位排
                        command.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列
                        command.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层
                        command.setCommand((short)1);
                        if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, command),false)) {
                            log.error("堆垛机命令生成失败,堆垛机号={},巷道={},任务数据={}",slave.getId(), taskWrk.getCrnNo(), JSON.toJSON(command));
                        command.setCommand((short) 1);
                        if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, command), false)) {
                            log.error("堆垛机命令生成失败,堆垛机号={},巷道={},任务数据={}", slave.getId(), taskWrk.getCrnNo(), JSON.toJSON(command));
                            throw new CoolException("堆垛机命令生成失败");
                        }else{
                            try{
                        } else {
                            try {
                                // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                                Date now = new Date();
                                taskWrk.setWrkSts(12);
@@ -740,16 +909,16 @@
                                if (taskWrkMapper.updateById(taskWrk) == 0) {
                                    log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo());
                                }
                            }catch (Exception e){
                            } catch (Exception e) {
                                log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo());
                                log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,异常:"+e);
                                log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,异常:" + e);
                            }
                            try{
                            try {
                                HashMap<String, Object> headParam = new HashMap<>();
                                headParam.put("taskNo",taskWrk.getTaskNo());
                                headParam.put("status",taskWrk.getStatus());
                                headParam.put("ioType",taskWrk.getIoType());
                                headParam.put("barcode",taskWrk.getBarcode());
                                headParam.put("taskNo", taskWrk.getTaskNo());
                                headParam.put("status", taskWrk.getStatus());
                                headParam.put("ioType", taskWrk.getIoType());
                                headParam.put("barcode", taskWrk.getBarcode());
                                String response;
                                response = new HttpHandler.Builder()
                                        // .setHeaders(headParam)
@@ -760,14 +929,14 @@
                                        .doPost();
                                JSONObject jsonObject = JSON.parseObject(response);
                                apiLogService.save("wcs派发出库任务上报wms"
                                        ,wmsUrl+taskStatusFeedbackPath
                                        ,null
                                        ,"127.0.0.1"
                                        ,JSON.toJSONString(headParam)
                                        ,response
                                        ,true
                                        , wmsUrl + taskStatusFeedbackPath
                                        , null
                                        , "127.0.0.1"
                                        , JSON.toJSONString(headParam)
                                        , response
                                        , true
                                );
                            }catch (Exception e){
                            } catch (Exception e) {
                                log.error("wcs派发出库任务上报wms失败", JSON.toJSONString(taskWrk));
//                                throw new CoolException("wcs派发入库任务上报wms失败");
                            }
@@ -781,16 +950,16 @@
    /**
     * 库位移转
     */
    public void locToLoc(CrnSlave slave, CrnProtocol crnProtocol){
    public void locToLoc(CrnSlave slave, CrnProtocol crnProtocol) {
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            // 获取工作状态为11(生成出库ID)的移库工作档
            List<TaskWrk> taskWrks = taskWrkMapper.selectList(
                    new EntityWrapper<TaskWrk>()
                    .eq("CRN_NO",crnProtocol.getLaneNo())
                    .eq("WRK_STS",11)
                    .eq("IO_TYPE",3)
                    .orderBy("IO_PRI",false));
            for (TaskWrk taskWrk : taskWrks){
                            .eq("CRN_NO", crnProtocol.getLaneNo())
                            .eq("WRK_STS", 11)
                            .eq("IO_TYPE", 3)
                            .orderBy("IO_PRI", false));
            for (TaskWrk taskWrk : taskWrks) {
                // 双深库位且浅库位有货,则需先对浅库位进行库位移转
//                if (Utils.isDeepLoc(slaveProperties, taskWrk.getStartPoint())) {
@@ -822,8 +991,6 @@
                // 命令下发区 --------------------------------------------------------------------------
                // 1.堆垛机开始移动
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
@@ -838,7 +1005,7 @@
                crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint()));     // 目标库位列
                crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint()));     // 目标库位层
                crnCommand.setCommand((short) 1);
                if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand),false)) {
                if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand), false)) {
                    log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
                } else {
                    // 修改工作档状态 11.生成出库ID => 12.吊车出库中
@@ -850,12 +1017,12 @@
                    if (taskWrkMapper.updateById(taskWrk) == 0) {
                        log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo());
                    }
                    try{
                    try {
                        HashMap<String, Object> headParam = new HashMap<>();
                        headParam.put("taskNo",taskWrk.getTaskNo());
                        headParam.put("status",taskWrk.getStatus());
                        headParam.put("ioType",taskWrk.getIoType());
                        headParam.put("barcode",taskWrk.getBarcode());
                        headParam.put("taskNo", taskWrk.getTaskNo());
                        headParam.put("status", taskWrk.getStatus());
                        headParam.put("ioType", taskWrk.getIoType());
                        headParam.put("barcode", taskWrk.getBarcode());
                        String response;
                        response = new HttpHandler.Builder()
                                // .setHeaders(headParam)
@@ -866,14 +1033,14 @@
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        apiLogService.save("wcs派发移库任务上报wms"
                                ,wmsUrl+taskStatusFeedbackPath
                                ,null
                                ,"127.0.0.1"
                                ,JSON.toJSONString(headParam)
                                ,response
                                ,true
                                , wmsUrl + taskStatusFeedbackPath
                                , null
                                , "127.0.0.1"
                                , JSON.toJSONString(headParam)
                                , response
                                , true
                        );
                    }catch (Exception e){
                    } catch (Exception e) {
                        log.error("wcs派发移库库任务上报wms失败", taskWrk);
//                        throw new CoolException("wcs派发移库库任务上报wms失败");
                    }
@@ -893,11 +1060,13 @@
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) { continue; }
            if (crnProtocol == null) {
                continue;
            }
            if (!crn.getId().equals(crnProtocol.getLaneNo())){
            if (!crn.getId().equals(crnProtocol.getLaneNo())) {
                for (CrnSlave crnOther : slaveProperties.getCrn()) {
                    if (crnOther.getId().equals(crnProtocol.getLaneNo())){
                    if (crnOther.getId().equals(crnProtocol.getLaneNo())) {
                        crn.updateCrnInStn(crnOther);
                    }
                }
@@ -906,20 +1075,20 @@
            //  状态:等待确认 并且  任务完成位 = 1
            if (!Cools.isEmpty(crnProtocol.getTaskFinish()) && crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
                //获取入库待确认工作档
                TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crnProtocol.getLaneNo(),crnProtocol.getTaskNo().intValue());
                if (Cools.isEmpty(taskWrk)&&crnProtocol.getTaskNo() !=999) {
                    log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},巷道号={},工作号={}", crn.getId(),crnProtocol.getLaneNo(), crnProtocol.getTaskNo());
                TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crnProtocol.getLaneNo(), crnProtocol.getTaskNo().intValue());
                if (Cools.isEmpty(taskWrk) && crnProtocol.getTaskNo() != 999) {
                    log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},巷道号={},工作号={}", crn.getId(), crnProtocol.getLaneNo(), crnProtocol.getTaskNo());
                    continue;
                }
                Thread.sleep(300);
                //确认完成信号
                CrnOperatorParam crnOperatorParam=new CrnOperatorParam();
                CrnOperatorParam crnOperatorParam = new CrnOperatorParam();
                crnOperatorParam.setCrnNo(crn.getId());
                Date now = new Date();
                crnController.crnTaskComplete(crnOperatorParam);
                if(!Cools.isEmpty(taskWrk)){
                    if(taskWrk.getIoType()==1 && taskWrk.getWrkSts()==3){
                if (!Cools.isEmpty(taskWrk)) {
                    if (taskWrk.getIoType() == 1 && taskWrk.getWrkSts() == 3) {
                        taskWrk.setWrkSts(4);//入库完成
                        taskWrk.setStatus(5);//完结
                        //更新库位状态
@@ -929,7 +1098,7 @@
                        locMast.setModiTime(now);
                        locMast.setModiUser(9999L);
                        locMastService.updateById(locMast);
                    }else if(taskWrk.getIoType()==2&&taskWrk.getWrkSts()==12){
                    } else if (taskWrk.getIoType() == 2 && taskWrk.getWrkSts() == 12) {
                        taskWrk.setWrkSts(13);//出库完成
                        taskWrk.setStatus(5);//完结
                        //更新库位状态
@@ -939,7 +1108,7 @@
                        locMast.setModiTime(now);
                        locMast.setModiUser(9999L);
                        locMastService.updateById(locMast);
                    }else if(taskWrk.getIoType()==3&&taskWrk.getWrkSts()==12){
                    } else if (taskWrk.getIoType() == 3 && taskWrk.getWrkSts() == 12) {
                        taskWrk.setWrkSts(4);//入库完成
                        taskWrk.setStatus(5);//完结
                        //更新库位状态
@@ -962,12 +1131,12 @@
                    taskWrkService.updateById(taskWrk);
                    try{
                    try {
                        HashMap<String, Object> headParam = new HashMap<>();
                        headParam.put("taskNo",taskWrk.getTaskNo());
                        headParam.put("status",taskWrk.getStatus());
                        headParam.put("ioType",taskWrk.getIoType());
                        headParam.put("barcode",taskWrk.getBarcode());
                        headParam.put("taskNo", taskWrk.getTaskNo());
                        headParam.put("status", taskWrk.getStatus());
                        headParam.put("ioType", taskWrk.getIoType());
                        headParam.put("barcode", taskWrk.getBarcode());
                        String response;
                        log.error("wcs完结任务上报wms==》", headParam);
@@ -984,14 +1153,14 @@
//                        log.error("wcs完结任务上报wms==》", jsonObject);
                        apiLogService.save("wcs派发入库任务上报wms"
                                ,wmsUrl+taskStatusFeedbackPath
                                ,null
                                ,"127.0.0.1"
                                ,JSON.toJSONString(headParam)
                                ,response
                                ,true
                                , wmsUrl + taskStatusFeedbackPath
                                , null
                                , "127.0.0.1"
                                , JSON.toJSONString(headParam)
                                , response
                                , true
                        );
                    }catch (Exception e){
                    } catch (Exception e) {
                        log.error("wcs完结任务上报wms失败", taskWrk);
                        log.error("wcs完结任务上报wms失败,报错信息:", e);
//                        throw new CoolException("wcs派发入库任务上报wms失败");
@@ -1005,7 +1174,7 @@
    /**
     * 堆垛机异常信息记录
     */
    public void recCrnErr(){
    public void recCrnErr() {
        Date now = new Date();
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
@@ -1027,7 +1196,7 @@
                                continue;
                            }
                            BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm());
                            String errName = crnError==null? String.valueOf(crnProtocol.getAlarm()):crnError.getErrName();
                            String errName = crnError == null ? String.valueOf(crnProtocol.getAlarm()) : crnError.getErrName();
                            BasErrLog basErrLog = new BasErrLog(
                                    null,    // 编号
                                    wrkMast.getWrkNo(),    // 工作号
@@ -1074,7 +1243,7 @@
                        // 记录新异常
                        if (latest == null || (latest.getErrCode() != crnProtocol.getAlarm().intValue())) {
                            BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm());
                            String errName = crnError==null? String.valueOf(crnProtocol.getAlarm()):crnError.getErrName();
                            String errName = crnError == null ? String.valueOf(crnProtocol.getAlarm()) : crnError.getErrName();
                            BasErrLog basErrLog = new BasErrLog(
                                    null,    // 编号
                                    null,    // 工作号
@@ -1089,7 +1258,7 @@
                                    null,    // 源站
                                    null,    // 源库位
                                    null,    // 条码
                                    (int)crnProtocol.getAlarm(),    // 异常码
                                    (int) crnProtocol.getAlarm(),    // 异常码
                                    errName,    // 异常
                                    1,    // 异常情况
                                    now,    // 添加时间
@@ -1120,9 +1289,9 @@
        }
    }
    private TaskWrk createTask(GetWmsDto dto, String barcode){
    private TaskWrk createTask(GetWmsDto dto, String barcode) {
        String wcsLocNo = dto.getLocNo();
        if(Cools.isEmpty(wcsLocNo)){
        if (Cools.isEmpty(wcsLocNo)) {
            return null;
        }
        Date now = new Date();
@@ -1142,7 +1311,7 @@
        taskWrk.setCrnNo(locMast.getCrnNo());
        taskWrk.setTargetPoint(wcsLocNo);
        taskWrk.setStartPoint(dto.getStaNo().toString());
        if(taskWrk.getIoType() == 1){
        if (taskWrk.getIoType() == 1) {
            taskWrk.setWrkSts(2);
            if (!Cools.isEmpty(taskWrk.getTargetPoint())) {
                taskWrk.setOriginTargetPoint(taskWrk.getTargetPoint());
@@ -1151,14 +1320,14 @@
        return taskWrk;
    }
    public String rgvOtherTaskWrk(RgvSlave slave){
    public String rgvOtherTaskWrk(RgvSlave slave) {
        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getOtherId());
        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
        ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
        if (!allTaskProtocol.isEmpty()){
            for (TaskProtocol taskProtocol : allTaskProtocol.values()){
                if (taskProtocol.getTaskNo() != 0 ){
        if (!allTaskProtocol.isEmpty()) {
            for (TaskProtocol taskProtocol : allTaskProtocol.values()) {
                if (taskProtocol.getTaskNo() != 0) {
                    return taskProtocol.getTaskNo().toString();
                }
            }
@@ -1166,11 +1335,12 @@
        return "无";
    }
    public boolean rgvDetection(RgvSlave slave){
    public boolean rgvDetection(RgvSlave slave) {
        RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
        RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
        if (rgvProtocol == null || rgvTaskProtocol ==null) {
        if (rgvProtocol == null || rgvTaskProtocol == null) {
            return false;
        }
        if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L) || rgvTaskProtocol.getAvoid() == -1 || rgvProtocol.getRgvPosDestination() == 0L
@@ -1183,39 +1353,39 @@
        if (rgvProtocolOther == null) {
            return false;
        }
        if (rgvProtocolOther.statusEnable){
            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L) || rgvTaskProtocolOther.getAvoid() == -1  || rgvProtocolOther.getRgvPosDestination() == 0L) {
        if (rgvProtocolOther.statusEnable) {
            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L) || rgvTaskProtocolOther.getAvoid() == -1 || rgvProtocolOther.getRgvPosDestination() == 0L) {
                return false;
            }
        }
        return true;
    }
    public TaskWrk deviceDetection(RgvSlave.RgvStn inSta){
    public TaskWrk deviceDetection(RgvSlave.RgvStn inSta) {
        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, inSta.getDevpPlcId());
        StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
        if (staProtocol == null){
        if (staProtocol == null) {
            return null;
        }
        // 判断是否满足取货条件
        if (staProtocol.isAutoing()
//                && staProtocol.isLoading()
                && staProtocol.getWorkNo()!=0) {
                && staProtocol.getWorkNo() != 0) {
            TaskWrk taskWrk = taskWrkService.selectByTaskNo(staProtocol.getWorkNo().toString());
            if (taskWrk!=null){
            if (taskWrk != null) {
                return taskWrk;
            }
        }
        return null;
    }
    public boolean rgvOtherStatusEnable(RgvSlave slave){
    public boolean rgvOtherStatusEnable(RgvSlave slave) {
        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
        if (rgvProtocolOther == null) {
            return true;
        }
        if (rgvProtocolOther.statusEnable){
        if (rgvProtocolOther.statusEnable) {
//            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L)) {
            return true;
//            }
@@ -1225,8 +1395,8 @@
    public synchronized void taskStart() {
        for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
            try{
                if (rgvDetection(rgvSlave)){
            try {
                if (rgvDetection(rgvSlave)) {
                    String taskNoNow = rgvOtherTaskWrk(rgvSlave);
                    List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("PLC_POSITION", true));
                    boolean itSmall = new TrackRangeUtils().IsItSmall(rgvSlave);
@@ -1236,9 +1406,9 @@
                    }
                    List<TaskWrk> taskWrkList = new ArrayList<>();
                    List<Integer> staList = new ArrayList<>();
                    for (RgvSlave.RgvStn inSta : rgvSlave.getRgvInSta()){
                    for (RgvSlave.RgvStn inSta : rgvSlave.getRgvInSta()) {
                        TaskWrk taskWrk = deviceDetection(inSta);
                        if (taskWrk!=null){
                        if (taskWrk != null) {
                            if (taskWrk.getTaskNo().equals(taskNoNow)) continue;
                            taskWrkList.add(taskWrk);
                            staList.add(inSta.getStaNo());
@@ -1249,9 +1419,9 @@
                    boolean sign = false;
                    if (rgvOtherStatusEnable(rgvSlave)){
                    if (rgvOtherStatusEnable(rgvSlave)) {
                        //分成上下两部分任务
                        List<Integer>[] avoidRange = RouteUtils.gradeRange(staList, basDevpPositions,itSmall);
                        List<Integer>[] avoidRange = RouteUtils.gradeRange(staList, basDevpPositions, itSmall);
                        List<Integer> rangeListSou = avoidRange[itSmall ? 0 : 1];
                        List<Integer> rangeListSouOther = avoidRange[itSmall ? 1 : 0];
                        //就近排序
@@ -1267,87 +1437,87 @@
                        Long[][] avoidedRange = new TrackRangeUtils().avoidRangeArr(rgvSlave, trackEntireLength, trackBenchmark, avoidDistance);
                        List<Integer> belongToRange = RouteUtils.SortNearby(RouteUtils.belongToRange(rangeList, avoidedRange[0], basDevpPositions), rgvProtocol.RgvPos, basDevpPositions);
                        for (Integer staNoNow : belongToRange){
                            for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
                                if (rgvStn.getStaNo().equals(staNoNow)){
                        for (Integer staNoNow : belongToRange) {
                            for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) {
                                if (rgvStn.getStaNo().equals(staNoNow)) {
                                    TaskWrk taskWrk = deviceDetection(rgvStn);
                                    if (taskWrk!=null){
                                    if (taskWrk != null) {
                                        BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", taskWrk.getTargetPointConvert()));
                                        if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,basDevpPosition.getPlcPosition(),basDevpPositions,itSmall)){
                                            sign = taskGenerate(rgvSlave,rgvStn,0);
                                        if (RouteUtils.CheckIfItIsWithinTheRange(rangeList, basDevpPosition.getPlcPosition(), basDevpPositions, itSmall)) {
                                            sign = taskGenerate(rgvSlave, rgvStn, 0);
                                        }
                                    }
                                    break;
                                }
                            }
                            if (sign){
                            if (sign) {
                                break;
                            }
                        }
                        if (!sign){
                        if (!sign) {
                            //  筛选范围内取货任务
                            for (Integer staNoNow : belongToRange){
                                for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
                                    if (rgvStn.getStaNo().equals(staNoNow)){
                                        sign = taskGenerate(rgvSlave,rgvStn,0);
                            for (Integer staNoNow : belongToRange) {
                                for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) {
                                    if (rgvStn.getStaNo().equals(staNoNow)) {
                                        sign = taskGenerate(rgvSlave, rgvStn, 0);
                                        break;
                                    }
                                }
                                if (sign){
                                if (sign) {
                                    break;
                                }
                            }
                        }
                        if (!sign){
                            for (Integer staNoNow : rangeList){
                                for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
                                    if (rgvStn.getStaNo().equals(staNoNow)){
                        if (!sign) {
                            for (Integer staNoNow : rangeList) {
                                for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) {
                                    if (rgvStn.getStaNo().equals(staNoNow)) {
                                        TaskWrk taskWrk = deviceDetection(rgvStn);
                                        if (taskWrk!=null){
                                        if (taskWrk != null) {
                                            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", taskWrk.getTargetPointConvert()));
                                            if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,basDevpPosition.getPlcPosition(),basDevpPositions,itSmall)){
                                                sign = taskGenerate(rgvSlave,rgvStn,0);
                                            if (RouteUtils.CheckIfItIsWithinTheRange(rangeList, basDevpPosition.getPlcPosition(), basDevpPositions, itSmall)) {
                                                sign = taskGenerate(rgvSlave, rgvStn, 0);
                                            }
                                        }
                                        break;
                                    }
                                }
                                if (sign){
                                if (sign) {
                                    break;
                                }
                            }
                        }
                        if (!sign){
                        if (!sign) {
                            //  半边区域内取货任务
                            for (Integer staNoNow : rangeList){
                                for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
                                    if (rgvStn.getStaNo().equals(staNoNow)){
                                        sign = taskGenerate(rgvSlave,rgvStn,0);
                            for (Integer staNoNow : rangeList) {
                                for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) {
                                    if (rgvStn.getStaNo().equals(staNoNow)) {
                                        sign = taskGenerate(rgvSlave, rgvStn, 0);
                                        break;
                                    }
                                }
                                if (sign){
                                if (sign) {
                                    break;
                                }
                            }
                        }
                        if (!sign){
                        if (!sign) {
                            //  半边区域内放货任务
                            for (Integer staNoNow : rangeListOther){
                                for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
                                    if (rgvStn.getStaNo().equals(staNoNow)){
                            for (Integer staNoNow : rangeListOther) {
                                for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) {
                                    if (rgvStn.getStaNo().equals(staNoNow)) {
                                        TaskWrk taskWrk = deviceDetection(rgvStn);
                                        if (taskWrk!=null){
                                        if (taskWrk != null) {
                                            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", taskWrk.getTargetPointConvert()));
                                            if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,basDevpPosition.getPlcPosition(),basDevpPositions,itSmall)){
                                                sign = taskGenerate(rgvSlave,rgvStn,0);
                                            if (RouteUtils.CheckIfItIsWithinTheRange(rangeList, basDevpPosition.getPlcPosition(), basDevpPositions, itSmall)) {
                                                sign = taskGenerate(rgvSlave, rgvStn, 0);
                                            }
                                        }
                                        break;
                                    }
                                }
                                if (sign){
                                if (sign) {
                                    break;
                                }
                            }
@@ -1358,33 +1528,34 @@
                        RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(rgvSlave.getId());
                        List<Integer> rangeList = RouteUtils.SortNearby(staList, rgvProtocol.RgvPos, basDevpPositions);
                        //  半边区域内取货任务
                        for (Integer staNoNow : rangeList){
                            for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
                                if (rgvStn.getStaNo().equals(staNoNow)){
                                    sign = taskGenerate(rgvSlave,rgvStn,0);
                        for (Integer staNoNow : rangeList) {
                            for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) {
                                if (rgvStn.getStaNo().equals(staNoNow)) {
                                    sign = taskGenerate(rgvSlave, rgvStn, 0);
                                    break;
                                }
                            }
                            if (sign){
                            if (sign) {
                                break;
                            }
                        }
                    }
                }
            } catch (Exception e){
                log.error("任务生成失败===》异常信息:{}",e.getMessage());
            } catch (Exception e) {
                log.error("任务生成失败===》异常信息:{}", e.getMessage());
            }
        }
    }
    //获取起点与终点对象
    public RgvSlave.RgvStn getRgvStnNow(RgvSlave rgvSlave,Integer staNo) {
        for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
            if (rgvStn.getStaNo().equals(staNo)){
    public RgvSlave.RgvStn getRgvStnNow(RgvSlave rgvSlave, Integer staNo) {
        for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) {
            if (rgvStn.getStaNo().equals(staNo)) {
                return rgvStn;
            }
        }
        for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvOutSta()){
            if (rgvStn.getStaNo().equals(staNo)){
        for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvOutSta()) {
            if (rgvStn.getStaNo().equals(staNo)) {
                return rgvStn;
            }
        }
@@ -1392,43 +1563,43 @@
    }
    //获取起点与终点对象
    public RgvSlave.RgvStn[] getRgvStnAll(RgvSlave rgvSlave,Integer souSta,Integer endSta) {
    public RgvSlave.RgvStn[] getRgvStnAll(RgvSlave rgvSlave, Integer souSta, Integer endSta) {
        RgvSlave.RgvStn[] rgvStns = new RgvSlave.RgvStn[2];
        for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
            if (rgvStn.getStaNo().equals(souSta)){
        for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) {
            if (rgvStn.getStaNo().equals(souSta)) {
                rgvStns[0] = rgvStn;
            }
        }
        for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvOutSta()){
            if (rgvStn.getStaNo().equals(endSta)){
        for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvOutSta()) {
            if (rgvStn.getStaNo().equals(endSta)) {
                rgvStns[1] = rgvStn;
            }
        }
        return rgvStns;
    }
    public boolean taskGenerate(RgvSlave rgvSlave,RgvSlave.RgvStn rgvStn,Integer sign) {
        try{
    public boolean taskGenerate(RgvSlave rgvSlave, RgvSlave.RgvStn rgvStn, Integer sign) {
        try {
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
            TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
            TaskProtocol issuedTake = new TaskProtocol();
            TaskProtocol issuedPut = new TaskProtocol();
            try{
            try {
                ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
                if (allTaskProtocol.size() > 0){
                if (allTaskProtocol.size() > 0) {
                    return false;
                }
                TaskWrk taskWrk = deviceDetection(rgvStn);
                if (taskWrk == null){
                if (taskWrk == null) {
                    return false;
                }
                Integer targetPointConvert = taskWrk.getTargetPointConvert();
                if (targetPointConvert == null){
                if (targetPointConvert == null) {
                    return false;
                }
                RgvSlave.RgvStn rgvStnEnd = getRgvStnNow(rgvSlave, targetPointConvert);
                if (rgvStnEnd == null){
                if (rgvStnEnd == null) {
                    return false;
                }
@@ -1437,7 +1608,7 @@
                //执行
                issuedTake.setTaskNo(Long.valueOf(taskWrk.getTaskNo()));
                issuedTake.setTaskStatus(1);
                issuedTake.setTaskNoDirection(issuedTake.gettaskNoDirection$(issuedTake.getTaskNo(),issuedTake.getTaskStatus()));
                issuedTake.setTaskNoDirection(issuedTake.gettaskNoDirection$(issuedTake.getTaskNo(), issuedTake.getTaskStatus()));
                issuedTake.setTargetPosition(basDevpPositionSou.getPlcPosition());
                issuedTake.setIsRunning(1);
                issuedTake.setDirection(rgvStn.isDirection());
@@ -1445,16 +1616,16 @@
                issuedPut.setTaskNo(Long.valueOf(taskWrk.getTaskNo()));
                issuedPut.setTaskStatus(2);
                issuedPut.setTaskNoDirection(issuedPut.gettaskNoDirection$(issuedPut.getTaskNo(),issuedPut.getTaskStatus()));
                issuedPut.setTaskNoDirection(issuedPut.gettaskNoDirection$(issuedPut.getTaskNo(), issuedPut.getTaskStatus()));
                issuedPut.setTargetPosition(basDevpPositionEnd.getPlcPosition());
                issuedPut.setIsRunning(1);
                issuedPut.setDirection(rgvStnEnd.isDirection());
            }catch (Exception e){
                log.error("任务生成失败issued1===》异常信息:{}",e.getMessage());
            } catch (Exception e) {
                log.error("任务生成失败issued1===》异常信息:{}", e.getMessage());
                return false;
            }
            switch (sign){
            switch (sign) {
                case 1:
                    taskProtocolCache.updateTaskProtocol(issuedTake);
                    break;
@@ -1466,12 +1637,124 @@
                    taskProtocolCache.updateTaskProtocol(issuedPut);
                    break;
            }
        } catch (Exception e){
            log.error("任务生成失败issued2===》异常信息:{}",e.getMessage());
        } catch (Exception e) {
            log.error("任务生成失败issued2===》异常信息:{}", e.getMessage());
        }
        return true;
    }
    /**
     * 出库  ===>> 工作档信息写入led显示器
     */
    public synchronized void ledExecute(Integer mark) {
        for (LedSlave led : slaveProperties.getLed()) {
            // 获取输送线plc线程
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
            // 命令集合
            List<LedCommand> commands = new ArrayList<>();
            // 工作档集合
            List<WrkMast> wrkMasts = new ArrayList<>();
            for (Integer staNo : led.getStaArr()) {
                // 获取叉车站点
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 获取工作档数据
                LedCommand ledCommand = new LedCommand();
//
//                ledCommand.setWorkNo(wrkMast.getWrkNo());
//                ledCommand.setIoType(wrkMast.getIoType());
//                ledCommand.setTitle("空板出库");
//                ledCommand.setEmptyMk(true);
//                ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
//                ledCommand.setLocNo(wrkMast.getLocNo());
//                ledCommand.setStaNo(wrkMast.getStaNo());
                MatDto matDto = new MatDto();
                ledCommand.getMatDtos().add(matDto);
                commands.add(ledCommand);
            }
            Set<Integer> workNos = wrkMasts.stream().map(WrkMast::getWrkNo).collect(Collectors.toSet());
            // 获取LED线程
            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId());
            // 相同工作号集合则过滤
            if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) {
                continue;
            }
            // 命令下发 -------------------------------------------------------------------------------
            if (!commands.isEmpty()) {
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
//                    News.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                    continue;
                }else {
                    ledThread.setLedMk(false);
                }
            }
            try {
                // 修改主档led标记
                for (WrkMast wrkMast : wrkMasts) {
                    wrkMast.setOveMk("Y");
                    wrkMast.setModiTime(new Date());
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
//                        News.errorNoLog(""+mark+" - 4"+" - 更新工作档失败");
                        throw new CoolException("更新工作档失败");
                    }
                }
                // 更新线程当前工作号集合
                ledThread.setWorkNos(workNos);
            } catch (Exception e) {
                e.printStackTrace();
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            }
        }
//        News.infoNoLog(""+mark+" - 0"+" - 出库  ===>> 工作档信息写入led显示器执行完成");
    }
    /**
     * 其他  ===>> LED显示器复位,显示默认信息
     */
    public synchronized void ledReset(Integer mark) {
//        News.warnNoLog(""+mark+" - 0"+" - 开始执行:其他  ===>> LED显示器复位,显示默认信息");
        for (LedSlave led : slaveProperties.getLed()) {
            // 获取输送线plc线程
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
            // 命令集合
            boolean reset = true;
            for (Integer staNo : led.getStaArr()) {
                // 获取叉车站点
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (staProtocol == null) {
                    continue;
                }
                if (staProtocol.getWorkNo() != 0 && staProtocol.isLoading()) {
                    reset = false;
                    break;
                }
            }
            // 获取led线程
            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId());
            // led显示默认内容
            if (reset && !ledThread.isLedMk()) {
                ledThread.setLedMk(true);
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(4, new ArrayList<>()))) {
//                    News.error(""+mark+" - 1"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                } else {
                }
            }
        }
//        News.infoNoLog(""+mark+" - 0"+" - 执行完成:其他  ===>> LED显示器复位,显示默认信息");
    }
}
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -73,8 +73,12 @@
        Date now = new Date();
        taskWrk = new TaskWrk();
        LocMast locMast=locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",param.getStartPoint()));
        int workNo1 = commonService.getWorkNo(WorkNoType.PAKOUT.type);//获取入库工作号
        int workNo1 = 0;//获取入库工作号
        if (param.getIoType() .equals(1)){
            workNo1 = commonService.getWorkNo(WorkNoType.PAKOUT.type);
        } else {
            workNo1 = commonService.getWorkNo(WorkNoType.PAKIN.type);
        }
        taskWrk.setTaskNo(param.getTaskNo());//任务号
        taskWrk.setWrkNo(workNo1);
        taskWrk.setStatus(TaskStatusType.RECEIVE.id);//任务状态:接收
@@ -82,23 +86,28 @@
        taskWrk.setModiTime(now);
        taskWrk.setAssignTime(new Date());
        taskWrk.setModiUser(6666L);
        try{
            if (param.getIoType()>1){
                if (Utils.locNoRowBoolean(locMast.getRow1())){
                    param.setTaskPriority(11);
                }
            }
        }catch (Exception e){
        }
//        try{
//            if (param.getIoType()>1){
//                LocMast locMast=locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",param.getStartPoint()));
//                if (Utils.locNoRowBoolean(locMast.getRow1())){
//                      param.setTaskPriority(11);
//                }
//            }
//        }catch (Exception e){
//        }
        taskWrk.setIoPri(param.getTaskPriority());
        taskWrk.setIoType(param.getIoType());//任务类型
        taskWrk.setIoPri(param.getTaskPriority());//优先级
        taskWrk.setBarcode(param.getBarcode());//条码
        taskWrk.setCrnNo(locMast.getCrnNo());
        taskWrk.setCrnNo(param.getCrn());
        if(param.getIoType() == 1){
            taskWrk.setWrkSts(1);
            if (!Cools.isEmpty(param.getTargetPoint())) {
                taskWrk.setTargetPoint(Utils.getWcsLocNo(param.getTargetPoint()));//终点
                taskWrk.setOriginTargetPoint(param.getTargetPoint());
//                taskWrk.setTargetPoint(Utils.getWcsLocNo(param.getTargetPoint()));//终点  转换下
                taskWrk.setTargetPoint(param.getTargetPoint());//终点
                taskWrk.setStartPoint(param.getStartPoint());
                taskWrk.setOriginStartPoint(param.getStartPoint());
            }
        } else if (param.getIoType() == 2) {
src/main/java/com/zy/asrs/service/impl/TaskWrkLogServiceImpl.java
@@ -6,7 +6,18 @@
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Service("taskWrkLogService")
public class TaskWrkLogServiceImpl extends ServiceImpl<TaskWrkLogMapper, TaskWrkLog> implements TaskWrkLogService {
    @Override
    public List<TaskWrkLog> selectTaskWrkLogList(Integer wrkNo, Integer taskNo, Integer status, Date modiTimeStart, Date modiTimeEnd, Integer curr, Integer limit) {
        return this.baseMapper.selectTaskWrkLogList(wrkNo,taskNo, status,modiTimeStart,modiTimeEnd,curr,limit);
    }
    @Override
    public Long selectTaskWrkLogListTotal(Integer wrkNo,Integer taskNo,Integer status,Date modiTimeStart,Date modiTimeEnd) {
        return this.baseMapper.selectTaskWrkLogListTotal(wrkNo,taskNo, status,modiTimeStart,modiTimeEnd);
    }
}
src/main/java/com/zy/asrs/service/impl/TaskWrkServiceImpl.java
@@ -6,6 +6,7 @@
import com.core.exception.CoolException;
import com.zy.asrs.domain.enums.TaskStatusType;
import com.zy.asrs.domain.enums.WorkNoType;
import com.zy.asrs.entity.DeviceError;
import com.zy.asrs.entity.StaDesc;
import com.zy.asrs.mapper.TaskWrkMapper;
import com.zy.asrs.entity.TaskWrk;
@@ -247,4 +248,22 @@
    public int saveToHistory(String taskNo) {
        return this.baseMapper.saveToHistory(taskNo);
    }
    @Override
    public List<TaskWrk> selectTaskWrkList(Integer wrkNo,Integer taskNo,Integer status,Date modiTimeStart,Date modiTimeEnd, Integer curr, Integer limit) {
        return this.baseMapper.selectTaskWrkList(wrkNo,taskNo, status,modiTimeStart,modiTimeEnd,curr,limit);
    }
    @Override
    public Long selectTaskWrkListTotal(Integer wrkNo,Integer taskNo,Integer status,Date modiTimeStart,Date modiTimeEnd) {
        return this.baseMapper.selectTaskWrkListTotal(wrkNo,taskNo, status,modiTimeStart,modiTimeEnd);
    }
    @Override
    public int saveToHistoryD(String taskNo) {
        return this.baseMapper.saveToHistoryD(taskNo);
    }
}
src/main/java/com/zy/common/model/MatDto.java
@@ -8,21 +8,34 @@
@Data
public class MatDto {
    // 物料编号
    private String matNo;
    private String matnr;
    // 物料名称
    private String maknx;
    private String maktx;
    // 库位规格
    private String specs;
    // 物料数量
    private Double count;
    // 库位数量
    private Double total;
    //工序
    private String sku;
    public MatDto() {
    }
    public MatDto(String matNo, String maknx, Double count) {
        this.matNo = matNo;
        this.maknx = maknx;
    public MatDto(String matnr, String maktx, String specs, Double count, Double total, String sku) {
        this.matnr = matnr;
        this.maktx = maktx;
        this.specs = specs;
        this.count = count;
        this.total = total;
        this.sku = sku;
    }
}
src/main/java/com/zy/core/DevpThread.java
@@ -9,5 +9,7 @@
    Map<Integer, StaProtocol> getStation();
    void setPakMk(Integer siteId, boolean pakMk);
    void setPakMkWalk(Integer siteId, boolean pakMkWalk);
    void setGrossWt(Integer siteId, Double grossWt);
}
src/main/java/com/zy/core/MainProcess.java
@@ -41,6 +41,11 @@
                    // 入库  ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档
                    mainService.generateStoreWrkFile(); // 组托
                    mainService.generateStoreWrkFileIsEmptyMk(); // 组托  空托
                    mainService.generateStoreWrkFileWalk(); // 任务下发
                    // 出库  ===>>  堆垛机出库站到出库站
                    mainService.crnStnToOutStn();
                    // 入出库  ===>>  堆垛机入出库作业下发
@@ -54,6 +59,12 @@
                    // 任务下发
                    mainService.taskStart();
                    // 出库  ===>> 工作档信息写入led显示器
//                    mainService.ledExecute(9);
                    // 其他  ===>> LED显示器复位,显示默认信息
//                    mainService.ledReset(10);
                } catch (Exception e) {
src/main/java/com/zy/core/Slave.java
@@ -14,4 +14,9 @@
    private Integer port;
    private Integer staNo;
    // 输送线plc编号
    private Integer devpPlcId;
}
src/main/java/com/zy/core/model/DevpSlave.java
@@ -27,6 +27,8 @@
    private List<Sta> pickSta = new ArrayList<>();
    private List<Sta> inWalkSta = new ArrayList<>();
    @Data
    public static class Sta {
@@ -37,6 +39,8 @@
        private Integer scale;
        private Integer backSta;
        private boolean barcodeSign;
    }
}
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -38,7 +38,7 @@
    /**
     * 任务号
     */
    public Short taskNo = 0;
    public Long taskNo = 0L;
    /**
     * 有物
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -48,6 +48,7 @@
    // 锁定标记
    private boolean pakMk = true;
    private boolean pakMkWalk = true;
    // 入库暂存数
    private Short inQty;
@@ -83,6 +84,7 @@
    //指令ID
    private Integer commandId;
    private Double grossWt;
    public BasDevp toSqlModel(){
        BasDevp basDevp = new BasDevp();
src/main/java/com/zy/core/thread/RgvThread.java
@@ -492,7 +492,7 @@
//        taskProtocol.setRgvNo(slave.getId());
        Long[] array = new Long[11];
//        array[0] = taskProtocol.getAckFinish1();
        array[1] = taskProtocol.getTaskNo();
//        array[1] = taskProtocol.getTaskNo();
//        array[2] = taskProtocol.getTaskMode();
//        array[4] = command.getDestinationStaNo();
//        array[10] = taskProtocol.getCommand();
src/main/java/com/zy/core/thread/ScaleThread.java
@@ -7,9 +7,13 @@
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.DeviceErrorService;
import com.zy.core.DevpThread;
import com.zy.core.Slave;
import com.zy.core.ThreadHandler;
import com.zy.core.cache.OutputQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.protocol.StaProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -52,25 +56,47 @@
                    if (!Cools.isEmpty(s) && s.startsWith("=")) {
                        scale = Double.parseDouble(s.substring(1));
//                        String substring = s.substring(1);
//                        String s1 = new StringBuilder(substring).reverse().toString();//逆序
//                        scale = Double.parseDouble(s1);
                        //将称重重量写入设备基础数据中的gross_wt字段
                        if(scale > 20) {
                            BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
                            Integer staNo = slave.getId() == 1 ? 101 : 201;
                            BasDevp basDevp = basDevpService.selectById(staNo);
                            if(!Cools.isEmpty(basDevp)) {
                                basDevp.setGrossWt(scale);
                                if (null != basDevpService && !basDevpService.updateById(basDevp)) {
                                    throw new Exception("更新数据库数据失败");
                            try{
                                // 获取站信息
                                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, slave.getDevpPlcId());
                                StaProtocol staProtocol = devpThread.getStation().get(slave.getStaNo());
                                if (staProtocol != null) {
                                    devpThread.setGrossWt(staProtocol.getSiteId(), scale);
                                    JSONObject jsonObject = new JSONObject();
                                    jsonObject.put("time", DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F));
                                    jsonObject.put("id", slave.getStaNo());
                                    jsonObject.put("scale", scale);
                                    if (OutputQueue.SCALE.size() >= 32) {
                                        OutputQueue.SCALE.poll();
                                    }
                                    OutputQueue.SCALE.offer(jsonObject);
                                }
                                JSONObject jsonObject = new JSONObject();
                                jsonObject.put("time", DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F));
                                jsonObject.put("id", staNo);
                                jsonObject.put("scale", scale);
                                if (OutputQueue.SCALE.size() >= 32) {
                                    OutputQueue.SCALE.poll();
                                }
                                OutputQueue.SCALE.offer(jsonObject);
                            } catch (Exception e){
                                log.error("称重模块异常"+e.getMessage());
                            }
//                            BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
//                            BasDevp basDevp = basDevpService.selectById(slave.getStaNo());
//                            if(!Cools.isEmpty(basDevp)) {
//                                basDevp.setGrossWt(scale);
//                                if (null != basDevpService && !basDevpService.updateById(basDevp)) {
//                                    throw new Exception("更新数据库数据失败");
//                                }
//                                JSONObject jsonObject = new JSONObject();
//                                jsonObject.put("time", DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F));
//                                jsonObject.put("id", slave.getStaNo());
//                                jsonObject.put("scale", scale);
//                                if (OutputQueue.SCALE.size() >= 32) {
//                                    OutputQueue.SCALE.poll();
//                                }
//                                OutputQueue.SCALE.offer(jsonObject);
//
//                            }
                        }
                    }
                }
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -191,6 +191,13 @@
                staProtocol.setHigh(status[6]);     // 高库位
                staProtocol.setLow(status[7]);      // 低库位
                if (!staProtocol.isPakMkWalk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                    staProtocol.setPakMkWalk(true);
                }
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                }
@@ -394,6 +401,28 @@
        }
    }
    /**
     * 设置入库标记
     */
    @Override
    public void setPakMkWalk(Integer siteId, boolean pakMkWalk) {
        StaProtocol staProtocol = station.get(siteId);
        if (null != staProtocol) {
            staProtocol.setPakMkWalk(pakMkWalk);
        }
    }
    /**
     * 设置入库标记
     */
    @Override
    public void setGrossWt(Integer siteId, Double grossWt) {
        StaProtocol staProtocol = station.get(siteId);
        if (null != staProtocol) {
            staProtocol.setGrossWt(grossWt);
        }
    }
    @Override
    public void close() {
        siemensS7Net.ConnectClose();
src/main/resources/application-prod.yml
@@ -1,7 +1,132 @@
wcs-slave:
  doubleDeep: false #双深
  doubleLocs: 3,6,7,10,13 #双深库位排号 3,6,7,10,13
  doubleLocs: 3 #双深库位排号
  groupCount: 2 #一个堆垛机负责的货架排数
  devp[0]: #输送线
    ip: 192.168.4.250
    slot: 0
    port: 102
    rack: 102
    id: 1
    # 入库口1
    inSta[0]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
#      led: ${wcs-slave.led[0].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
#      led: ${wcs-slave.led[0].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
    # 入库下发口1
    inWalkSta[0]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
    # 入库下发口1
    inWalkSta[1]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
    # 入库下发口1
    inWalkSta[2]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
      barcodeSign: true
    # 出库口1
    outSta[0]:
      staNo: 102
      led: ${wcs-slave.led[0].id}
#      led: ${wcs-slave.led[0].id}
  # RGV穿梭车1
  rgv[0]:
    id: 1
    ip: 192.168.4.250
    port: 502
    rack: 0
    slot: 0
    otherId: 2
    carBodyJiaoMing: 100
    carBodyKunPeng: 100
    #RGV源站点
    rgvInSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvInSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
    #RGV目标站点
    rgvOutSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvOutSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
  # RGV穿梭车2
  rgv[1]:
    id: 2
    ip: 192.168.1.1
    port: 502
    rack: 0
    slot: 0
    otherId: 1
    carBodyJiaoMing: 100
    carBodyKunPeng: 100
    #RGV源站点
    rgvInSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvInSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
    #RGV目标站点
    rgvOutSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvOutSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
  barcode[0]: #条码扫描仪1
    port: 51236
    ip: 10.10.10.52
    id: 1
  barcode[1]: #条码扫描仪1
    port: 51236
    ip: 10.10.10.52
    id: 2
  barcode[2]: #条码扫描仪1
    port: 51236
    ip: 10.10.10.52
    id: 3
    # 磅秤
  scale[0]:
    id: 1
    ip: 10.10.10.207
    port: 5005
    staNo: 281
    devpPlcId: 1
  crn[0]: #堆垛机1
    ip: 192.168.4.250
    id: 1
@@ -101,74 +226,4 @@
      row: 1
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
  barcode[0]: #条码扫描仪1
    port: 51236
    ip: 10.10.10.52
    id: 1
  devp[0]: #输送线
    ip: 192.168.4.250
    slot: 0
    port: 102
    rack: 102
    id: 1
  # RGV穿梭车1
  rgv[0]:
    id: 1
    ip: 192.168.4.250
    port: 502
    rack: 0
    slot: 0
    otherId: 2
    carBodyJiaoMing: 100
    carBodyKunPeng: 100
    #RGV源站点
    rgvInSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvInSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
    #RGV目标站点
    rgvOutSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvOutSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
  # RGV穿梭车2
  rgv[1]:
    id: 2
    ip: 192.168.1.1
    port: 502
    rack: 0
    slot: 0
    otherId: 1
    carBodyJiaoMing: 100
    carBodyKunPeng: 100
    #RGV源站点
    rgvInSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvInSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
    #RGV目标站点
    rgvOutSta[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      direction: true
    rgvOutSta[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      #执行方向(面朝轨道 定位值左小右大)  true:左   false:右
      direction: false
      devpPlcId: ${wcs-slave.devp[0].id}
src/main/resources/mapper/BasRgvErrMapper.xml
New file
@@ -0,0 +1,16 @@
<?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.zy.asrs.mapper.BasRgvErrMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasRgvErr">
        <id column="ERROR_CODE" property="errorCode" />
        <result column="ERR_NAME" property="errName" />
        <result column="MODI_USER" property="modiUser" />
        <result column="MODI_TIME" property="modiTime" />
        <result column="APPE_USER" property="appeUser" />
        <result column="APPE_TIME" property="appeTime" />
    </resultMap>
</mapper>
src/main/resources/mapper/TaskWrkLogMapper.xml
@@ -26,4 +26,36 @@
    </resultMap>
    <sql id="batchSeq">
        <if test="wrkNo != null">
            and WRK_NO = #{wrkNo}
        </if>
        <if test="taskNo != null">
            and TASK_NO = #{taskNo}
        </if>
        <if test="status != null">
            and STATUS = #{status}
        </if>
        <if test="modiTimeStart != null ">
            <if test="modiTimeEnd != null ">
                and MODI_TIME between #{modiTimeStart} and #{modiTimeEnd}
            </if>
        </if>
    </sql>
    <select id="selectTaskWrkLogList" resultMap="BaseResultMap">
        SELECT * FROM "SOURCE"."wcs_task_wrk_log"
        WHERE 1=1
        <include refid="batchSeq"></include>
        ORDER BY CREATE_TIME DESC
        LIMIT #{pageSize} OFFSET ((#{pageNumber} - 1) * #{pageSize});
    </select>
    <select id="selectTaskWrkLogListTotal" resultType="Long">
        SELECT count(1) FROM "SOURCE"."wcs_task_wrk_log"
        WHERE 1=1
        <include refid="batchSeq"></include>
    </select>
</mapper>
src/main/resources/mapper/TaskWrkMapper.xml
@@ -133,6 +133,10 @@
          and ("STATUS"=5 or "STATUS"=4 or "STATUS"=6)
    </insert>
    <insert id="saveToHistoryD">
        insert into "SOURCE"."wcs_task_wrk_log" select * from "SOURCE"."wcs_task_wrk" where TASK_NO = #{taskNo}
    </insert>
    <select id="selectWorkingTask" resultMap="BaseResultMap">
        select * from "SOURCE"."wcs_task_wrk"
        where ("WRK_STS"=3 and "IO_TYPE" = 1)
@@ -140,4 +144,36 @@
        order by "IO_PRI" desc,"CREATE_TIME","WRK_NO" ASC
    </select>
    <sql id="batchSeq">
        <if test="wrkNo != null">
            and WRK_NO = #{wrkNo}
        </if>
        <if test="taskNo != null">
            and TASK_NO = #{taskNo}
        </if>
        <if test="status != null">
            and STATUS = #{status}
        </if>
        <if test="modiTimeStart != null ">
            <if test="modiTimeEnd != null ">
                and MODI_TIME between #{modiTimeStart} and #{modiTimeEnd}
            </if>
        </if>
    </sql>
    <select id="selectTaskWrkList" resultMap="BaseResultMap">
        SELECT * FROM "SOURCE"."wcs_task_wrk"
        WHERE 1=1
        <include refid="batchSeq"></include>
        ORDER BY CREATE_TIME DESC
        LIMIT #{pageSize} OFFSET ((#{pageNumber} - 1) * #{pageSize});
    </select>
    <select id="selectTaskWrkListTotal" resultType="Long">
        SELECT count(1) FROM "SOURCE"."wcs_task_wrk"
        WHERE 1=1
        <include refid="batchSeq"></include>
    </select>
</mapper>
src/main/webapp/views/taskWrk/taskWrk.html
@@ -58,6 +58,7 @@
                                <el-dropdown-item command="assign">派发</el-dropdown-item>
                                <el-dropdown-item command="complete">完结</el-dropdown-item>
                                <el-dropdown-item command="cancel">取消</el-dropdown-item>
                                <el-dropdown-item command="delete">删除无需上报</el-dropdown-item>
                            </el-dropdown-menu>
                        </el-dropdown>
                    </template>
@@ -231,6 +232,10 @@
                        //取消任务
                        this.cancelWrk(row)
                        break;
                    case "delete":
                        //取消任务
                        this.deleteWrk(row)
                        break;
                }
            },
            showCommand(row) {
@@ -343,6 +348,36 @@
                    }
                });
            },
            deleteWrk(row) {
                //取消任务
                let that = this
                $.ajax({
                    url: baseUrl + "/taskWrk/delete/auth",
                    headers: {
                        'token': localStorage.getItem('token')
                    },
                    data: {
                        taskNo: row.taskNo
                    },
                    method: 'POST',
                    success: function (res) {
                        if (res.code == 200) {
                            that.$message({
                                message: "删除成功",
                                type: 'success'
                            });
                            that.getTableData()
                        } else if (res.code === 403) {
                            top.location.href = baseUrl + "/";
                        } else {
                            that.$message({
                                message: res.msg,
                                type: 'error'
                            });
                        }
                    }
                });
            },
            cancelWrk(row) {
                //取消任务
                let that = this
src/main/webapp/views/taskWrkLog/taskWrkLog.html
@@ -25,6 +25,14 @@
                <el-form-item label="">
                    <el-input v-model="tableSearchParam.wrk_no" placeholder="工作号"></el-input>
                </el-form-item>
                <el-form-item label="">
                    <el-select v-model="tableSearchParam.status" placeholder="任务状态">
                        <el-option label="接收" value="1"></el-option>
                        <el-option label="派发" value="2"></el-option>
                        <el-option label="完结" value="3"></el-option>
                        <el-option label="取消" value="4"></el-option>
                    </el-select>
                </el-form-item>
                <el-form-item>
                    <el-button type="primary" @click="getTableData">查询</el-button>
                    <el-button type="primary" @click="resetParam">重置</el-button>