#
zjj
2024-03-15 a30c391e7d84ebfad7bda46d5fd86be54a0591d2
#
8个文件已修改
321 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/TaskWrk.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/TaskWrkMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/TaskWrkService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/TaskWrkServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/TaskLogScheduler.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/TaskWrkMapper.xml 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/TaskWrk.java
@@ -238,7 +238,7 @@
            case 2:
                return "派发";
            case 3:
                return "步序完成";
                return "设备完成";
            case 4:
                return "取消";
            case 5:
src/main/java/com/zy/asrs/mapper/TaskWrkMapper.java
@@ -40,4 +40,5 @@
    List<TaskWrk> selectWorkingTask();//获取工作中的任务
    List<TaskWrk> selectbyWrksts4();
}
src/main/java/com/zy/asrs/service/TaskWrkService.java
@@ -30,4 +30,5 @@
    int saveToHistory(String taskNo);//将任务转历史日志
    List<TaskWrk> selectbyWrksts4();
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -323,9 +323,18 @@
                                    log.error("输送线命令下方失败!!! [工作号:{}]", taskWrk.getWrkNo());
                                    continue;//命令下发失败
                                }
                                // 复位堆垛机
                                crnThread.setResetFlag(true);
                                if (taskWrk.getIoType() == 1 || taskWrk.getIoType() == 3){
                                    taskWrk.setWrkSts(4);
                                } else if (taskWrk.getIoType() == 2) {
                                    taskWrk.setWrkSts(14);
                                }
                                if (!taskWrkService.updateById(taskWrk)){
                                    log.error(taskWrk.getTaskNo()+ " 堆垛机任务完成,改变任务状态失败");
                                }
                            }
                        }
@@ -793,6 +802,14 @@
                if (commandInfoService.updateById(commandInfo)) {//修改成功后复位堆垛机
                    // 堆垛机复位
                    crnThread.setResetFlag(true);
                    if (taskWrk.getIoType() == 1 || taskWrk.getIoType() == 3){
                        taskWrk.setWrkSts(4);
                    } else if (taskWrk.getIoType() == 2) {
                        taskWrk.setWrkSts(14);
                    }
                    if (!taskWrkService.updateById(taskWrk)){
                        log.error(taskWrk.getTaskNo()+ " 堆垛机任务完成,改变任务状态失败");
                    }
                }
            }
        }
src/main/java/com/zy/asrs/service/impl/TaskWrkServiceImpl.java
@@ -204,4 +204,9 @@
    public int saveToHistory(String taskNo) {
        return this.baseMapper.saveToHistory(taskNo);
    }
    @Override
    public List<TaskWrk> selectbyWrksts4() {
        return this.baseMapper.selectbyWrksts4();
    }
}
src/main/java/com/zy/asrs/task/TaskLogScheduler.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.SpringUtils;
import com.zy.asrs.domain.enums.TaskStatusType;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.TaskOverToWms;
@@ -142,5 +143,94 @@
            }
        }
    }
    @Scheduled(cron = "0/3 * * * * ? ")
    public void task4to5(){
        List<TaskWrk> taskWrks = taskWrkService.selectbyWrksts4();
        for (TaskWrk taskWrk: taskWrks){
            String tasktype = null;
            switch (taskWrk.getIoType()){
                case 1:
                    tasktype= "RK";
                    break;
                case 2:
                    tasktype= "CK";
                    break;
                case 3:
                    tasktype= "YK";
                    break;
                default:
                    tasktype= "未知";
            }
            Map<String, Object> map = new HashMap<>();
            map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2");
            TaskOverToWms taskOverToWms = new TaskOverToWms();
            taskOverToWms.setFeedbackFrom("WCS"); //来源
            taskOverToWms.setWarehouseId("1688469798893297665"); //仓库标识
            taskOverToWms.setTaskNo(taskWrk.getTaskNo()); //任务号
            taskOverToWms.setTaskType(tasktype); // 任务类型
            taskOverToWms.setContainerCode(taskWrk.getBarcode()); // 容器编码
            if (taskWrk.getIoType() ==1){
                taskOverToWms.setEquipmentCode(String.valueOf(taskWrk.getCrnNo())); //设备编码
                taskOverToWms.setTargetLocationCode(taskWrk.getOriginTargetPoint()); //目标库位
            }else if (taskWrk.getIoType() ==2){
                Map<Integer,String> map1 = new HashMap<>();
                map1.put(102,"J-1101");
                map1.put(106,"J-1103");
                map1.put(110,"J-1105");
                map1.put(114,"J-1107");
                map1.put(118,"J-1109");
                map1.put(122,"J-1111");
                map1.put(305,"H-1101");
                map1.put(405,"G-1101");
                taskOverToWms.setEquipmentCode(map1.get(taskWrk.getTargetPoint())); //设备编码
                taskOverToWms.setSourceLocationCode(taskWrk.getOriginStartPoint()); //源库位
            } else if (taskWrk.getIoType() == 3) {
                taskOverToWms.setEquipmentCode(String.valueOf(taskWrk.getCrnNo())); //设备编码
                taskOverToWms.setSourceLocationCode(taskWrk.getOriginStartPoint());
                taskOverToWms.setTargetLocationCode(taskWrk.getOriginTargetPoint()); //目标库位
            }
            taskOverToWms.setTaskStatus("location_done"); //任务状态
            String response = null;
            try {
                response = new HttpHandler.Builder()
                        .setHeaders(map)
                        .setUri("10.32.53.195:8080")
                        .setPath("wcsManager/wcsInterface/taskStatusFeedback")
                        .setJson(JSON.toJSONString(taskOverToWms))
                        .build()
                        .doPost();
            }catch (Exception e){
                log.error("堆垛机任务完成,请求wms任务完成接口失败");
            }
            ApiLogService apiLogService = SpringUtils.getBean(ApiLogService.class);
            apiLogService.save("Wms任务完成接口"
                    ,"10.32.53.195:8080"+"/wcsManager/wcsInterface/taskStatusFeedback"
                    ,null
                    ,"127.0.0.1"
                    ,JSON.toJSONString(taskOverToWms)
                    ,response
                    ,true
            );
            JSONObject jsonObject = JSON.parseObject(response);
            if (jsonObject.getInteger("code").equals(200)){
                if (taskWrk.getIoType() == 3 || taskWrk.getIoType() == 1){
                    taskWrk.setWrkSts(5);
                }else {
                    taskWrk.setWrkSts(15);
                }
                if (!taskWrkService.updateById(taskWrk)){
                    log.error("堆垛机任务完成,改变任务状态失败");
                }
                log.info("堆垛机任务完成,请求wms任务完成接口成功");
            }else {
                log.error("堆垛机任务完成,请求wms任务完成接口完成,但返回失败");
            }
        }
    }
}
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -202,89 +202,6 @@
                    if (write(crnCommand)) {
                        resetFlag = false;
                        //堆垛机任务完成后访问wms请求任务完成 locationDone 货位处理完成
                        TaskWrkService taskWrkService = SpringUtils.getBean(TaskWrkService.class);
                        TaskWrk taskWrk = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("wrk_no",crnProtocol.getTaskNo()));
                        String tasktype = null;
                        switch (taskWrk.getIoType()){
                            case 1:
                                tasktype= "RK";
                                break;
                            case 2:
                                tasktype= "CK";
                                break;
                            case 3:
                                tasktype= "YK";
                                break;
                            default:
                                tasktype= "未知";
                        }
                        Map<String, Object> map = new HashMap<>();
                        map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2");
                        TaskOverToWms taskOverToWms = new TaskOverToWms();
                        taskOverToWms.setFeedbackFrom("WCS"); //来源
                        taskOverToWms.setWarehouseId("1688469798893297665"); //仓库标识
                        taskOverToWms.setTaskNo(taskWrk.getTaskNo()); //任务号
                        taskOverToWms.setTaskType(tasktype); // 任务类型
                        taskOverToWms.setContainerCode(taskWrk.getBarcode()); // 容器编码
                        if (taskWrk.getIoType() ==1){
                            taskOverToWms.setEquipmentCode(String.valueOf(taskWrk.getCrnNo())); //设备编码
                            taskOverToWms.setTargetLocationCode(taskWrk.getOriginTargetPoint()); //目标库位
                        }else if (taskWrk.getIoType() ==2){
                            Map<Integer,String> map1 = new HashMap<>();
                            map1.put(102,"J-1101");
                            map1.put(106,"J-1103");
                            map1.put(110,"J-1105");
                            map1.put(114,"J-1107");
                            map1.put(118,"J-1109");
                            map1.put(122,"J-1111");
                            map1.put(305,"H-1101");
                            map1.put(405,"G-1101");
                            taskOverToWms.setEquipmentCode(map1.get(taskWrk.getTargetPoint())); //设备编码
                            taskOverToWms.setSourceLocationCode(taskWrk.getOriginStartPoint()); //源库位
                        } else if (taskWrk.getIoType() == 3) {
                            taskOverToWms.setEquipmentCode(String.valueOf(taskWrk.getCrnNo())); //设备编码
                            taskOverToWms.setSourceLocationCode(taskWrk.getOriginStartPoint());
                            taskOverToWms.setTargetLocationCode(taskWrk.getOriginTargetPoint()); //目标库位
                        }
                        taskOverToWms.setTaskStatus("location_done"); //任务状态
                        String response = null;
                        try {
                            response = new HttpHandler.Builder()
                                    .setHeaders(map)
                                    .setUri("10.32.53.195:8080")
                                    .setPath("wcsManager/wcsInterface/taskStatusFeedback")
                                    .setJson(JSON.toJSONString(taskOverToWms))
                                    .build()
                                    .doPost();
                        }catch (Exception e){
                            log.error("堆垛机任务完成,请求wms任务完成接口失败");
                        }
                        ApiLogService apiLogService = SpringUtils.getBean(ApiLogService.class);
                        apiLogService.save("Wms任务完成接口"
                                ,"10.32.53.195:8080"+"/wcsManager/wcsInterface/taskStatusFeedback"
                                ,null
                                ,"127.0.0.1"
                                ,JSON.toJSONString(taskOverToWms)
                                ,response
                                ,true
                        );
                        JSONObject jsonObject = JSON.parseObject(response);
                        if (jsonObject.getInteger("code").equals(200)){
                            if (taskWrk.getIoType() == 3 || taskWrk.getIoType() == 1){
                                taskWrk.setWrkSts(4);
                            }else {
                                taskWrk.setWrkSts(14);
                            }
                            if (!taskWrkService.updateById(taskWrk)){
                                log.error("堆垛机任务完成,改变任务状态失败");
                            }
                            log.info("堆垛机任务完成,请求wms任务完成接口成功");
                        }else {
                            log.error("堆垛机任务完成,请求wms任务完成接口完成,但返回失败");
                        }
                    }
@@ -434,7 +351,7 @@
    /**
     * 写入数据
     */
    private boolean write2(CrnCommand command){
    private boolean write2(CrnCommand command) throws InterruptedException {
        if (null == command) {
            log.error("堆垛机写入命令为空");
            return false;
@@ -473,11 +390,10 @@
        array[6] = command.getDestinationPosZ();
        array[7] = command.getDestinationPosX();
        array[8] = command.getDestinationPosY();
        array[9] = command.getCommand();
//        array[9] = command.getCommand();
        // 作业信息
        OperateResult result = siemensNet.Write("DB100.0", array);
        // 日志记录
//        try {
            if (command.getAckFinish() != 1) {
                BasCrnOptService bean = SpringUtils.getBean(BasCrnOptService.class);
                BasCrnOpt basCrnOpt = new BasCrnOpt(
@@ -499,7 +415,7 @@
                );
                bean.insert(basCrnOpt);
            }
//        } catch (Exception ignore) {}
        //更新命令日志
        CommandInfoLogService commandInfoLogService = SpringUtils.getBean(CommandInfoLogService.class);
@@ -512,22 +428,7 @@
        }
        CommandInfoLog commandInfoLog = JSON.parseObject(JSON.toJSONString(commandInfo), CommandInfoLog.class);
        commandInfoLog.setId(null);
//        CommandInfoLog commandInfoLog = new CommandInfoLog();
//        if (commandInfo != null) {
//            commandInfoLog = JSON.parseObject(JSON.toJSONString(commandInfo), CommandInfoLog.class);
//            commandInfoLog.setId(null);
//        }else {
//            Date now = new Date();
//            commandInfoLog.setCommand(JSON.toJSONString(command));
//            commandInfoLog.setCommandStatus(3);
//            commandInfoLog.setStartTime(now);
//            commandInfoLog.setExecuteTime(now);
//            commandInfoLog.setCompleteTime(now);
//            commandInfoLog.setDevice(SlaveType.Devp.toString());
//            commandInfoLog.setWrkNo(9999);
//            commandInfoLog.setTaskNo("9999");
//            commandInfoLog.setCommandDesc("手动命令");
//        }
        if (result.IsSuccess) {
@@ -564,41 +465,84 @@
            commandInfoLogService.insert(commandInfoLog);
            return false;
        }
        //堆垛机任务写入后,回读一次,看是否成功
        Thread.sleep(200);
        try{
            //堆垛机任务写入后,回读一次,看是否成功
            Thread.sleep(500);
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24);
            if (resultRead.IsSuccess) {
                CrnCommand one = new CrnCommand();
                one.setAckFinish(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0));
                one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                //one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
                one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
                one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
//                one.setSourceStaNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 18));
//                one.setDestinationStaNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 20));
                if (!crnCommand.getTaskNo().equals(one.getTaskNo()) && !crnCommand.getAckFinish().equals(one.getAckFinish())
                && !crnCommand.getSourcePosZ().equals(one.getSourcePosZ()) &&  !crnCommand.getSourcePosX().equals(one.getSourcePosX()) && !crnCommand.getSourcePosY().equals(one.getSourcePosY())
                        && !crnCommand.getDestinationPosZ().equals(one.getDestinationPosZ()) &&  !crnCommand.getDestinationPosX().equals(one.getDestinationPosX()) && !crnCommand.getDestinationPosY().equals(one.getDestinationPosY())
                one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
                one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
                one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
//                one.setTraySize(siemensNet.getByteTransform().TransBool(resultRead.Content, 22));
                if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
                        || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
                        || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
                        || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
                ){
                    log.error("堆垛机命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    log.error("堆垛机命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(crnCommand));
                    MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(5, crnCommand));
                    try{
                        log.error("堆垛机命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    }catch (Exception e){
                        try{
                            log.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead));
                        }catch (Exception e1){
                            log.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                        }
                    }
                    log.error("堆垛机命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                    MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command));
                    Thread.sleep(100);
                    readStatus();
                    return false;
                } else {
                    log.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
                }
            }
        }catch (Exception e){
            log.error("堆垛机命令地址写入后回读出错");
        }
        if (command.getAckFinish() == 0) {
            if (result.IsSuccess) {
                Thread.sleep(300);
                //任务下发次数
                int writeCount2 = 0;
                do {
                    writeCount2++;
                    short commandFinish = (short) 1;
                    result = siemensNet.Write("DB100.18", commandFinish);
                    if(result.IsSuccess){
                        //堆垛机任务写入后,回读一次,看是否成功
                        Thread.sleep(200);
                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.18", (short) 2);
                        if (resultRead.IsSuccess) {
                            commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
                            if (commandFinish != 1){
                                log.error("堆垛机任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次");
                            }else{
                                //任务命令写入成功
                                log.info("堆垛机任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次");
                                break;
                            }
                        }else {
                            log.error("堆垛机任务确认位"+commandFinish+"回读失败!"+"循环执行次数:"+writeCount2+"次");
                        }
                    } else {
                        log.error("堆垛机任务确认位"+commandFinish+"写入失败!"+"循环执行次数:"+writeCount2+"次");
                    }
                }while (writeCount2<5);
            }
        }
        return true;
    }
src/main/resources/mapper/TaskWrkMapper.xml
@@ -119,7 +119,7 @@
    <select id="selectToBeHistoryData" resultMap="BaseResultMap">
        select * from dbo.wcs_task_wrk
        where 1=1
        and ((wrk_sts=14 and status=5) or status=4 or (wrk_sts=4 and status=5))
        and ((wrk_sts=15 and status=5) or status=4 or (wrk_sts=5 and status=5))
        order by io_pri desc,create_time,wrk_no ASC
    </select>
@@ -129,9 +129,16 @@
    <select id="selectWorkingTask" resultMap="BaseResultMap">
        select * from dbo.wcs_task_wrk
        where (wrk_sts=5 and io_type = 1)
        or (wrk_sts=15 and io_type = 2)
        or (wrk_sts = 5 and io_type = 3)
        order by io_pri desc,create_time,wrk_no ASC
    </select>
    <select id="selectbyWrksts4" resultMap="BaseResultMap">
        select * from dbo.wcs_task_wrk
        where (wrk_sts=4 and io_type = 1)
        or (wrk_sts=14 and io_type = 2)
        or (wrk_sts = 4 and io_type = 3)
           or (wrk_sts=14 and io_type = 2)
           or (wrk_sts = 4 and io_type = 3)
        order by io_pri desc,create_time,wrk_no ASC
    </select>