自动化立体仓库 - WMS系统
chen.llin
2 天以前 9611dc686299be640ce5e5f5990c747765161ec7
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -12,6 +12,7 @@
import com.zy.asrs.entity.result.StockVo;
import com.zy.asrs.mapper.TagMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.task.handler.AgvHandler;
import com.zy.asrs.utils.MatUtils;
import com.zy.common.model.DetlDto;
import com.zy.common.utils.NodeUtils;
@@ -22,6 +23,7 @@
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
@@ -58,10 +60,13 @@
    @Resource
    private TaskService taskService;
    @Resource
    private AgvHandler agvHandler;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R agvCallback(AgvCallbackDto param) {
        log.debug("agvCallback param:{}", param);
        log.debug("agv回调 param:{}", param);
        // 优先使用taskId,如果没有则使用id(向后兼容)
        String taskId = Cools.isEmpty(param.getTaskId()) ? param.getId() : param.getTaskId();
        if (Cools.isEmpty(taskId)) {
@@ -74,14 +79,48 @@
            param.getKind());
        
        // 根据taskId查询任务
        // taskId格式:T + 工作号(如"T5299")或 T + 任务ID(向后兼容)
        Task task = null;
        try {
            // 尝试将taskId解析为Long类型的id
            Long taskIdLong = Long.parseLong(taskId);
            task = taskService.selectById(taskIdLong);
        } catch (NumberFormatException e) {
            // 如果不是数字,尝试通过其他字段查询(如sheetNo等)
            log.debug("taskId不是数字格式,尝试通过其他字段查询,taskId:{}", taskId);
            // 处理"T"前缀格式(如"T5299"或"T130")
            String numericId = taskId;
            if (taskId.startsWith("T") && taskId.length() > 1) {
                numericId = taskId.substring(1);
                    log.debug("检测到T前缀格式的taskId,提取数字:{}", numericId);
            }
            // 先尝试通过工作号(wrk_no)查询(优先,因为现在使用工作号作为taskId)
            try {
                Integer wrkNo = Integer.parseInt(numericId);
                task = taskService.selectOne(
                    new EntityWrapper<Task>().eq("wrk_no", wrkNo)
                );
                if (task != null) {
                    log.debug("通过工作号(wrk_no={})找到任务,taskId:{}", wrkNo, task.getId());
                }
            } catch (NumberFormatException e) {
                log.debug("无法解析为工作号,taskId:{}", taskId);
            }
            // 如果通过工作号没找到,尝试通过任务ID查询(向后兼容)
            if (task == null) {
                try {
                    Long taskIdLong = Long.parseLong(numericId);
                    task = taskService.selectById(taskIdLong);
                    if (task != null) {
                        log.debug("通过任务ID(id={})找到任务,taskId:{}", taskIdLong, taskId);
                    }
                } catch (NumberFormatException e) {
                    log.debug("无法解析为任务ID,taskId:{}", taskId);
                }
            }
        } catch (Exception e) {
            log.debug("解析taskId异常,taskId:{},异常:{}", taskId, e.getMessage());
        }
        // 如果还是没找到,尝试通过其他字段查询(如sheetNo等,向后兼容)
        if (task == null) {
            log.debug("通过工作号和任务ID都没找到,尝试通过其他字段查询,taskId:{}", taskId);
            task = taskService.selectOne(
                new EntityWrapper<Task>().eq("sheet_no", taskId)
            );
@@ -108,16 +147,46 @@
        
        task.setModiTime(new Date());
        
        // 标记任务是否已经被转移到历史表
        boolean taskMovedToHistory = false;
        // 如果有status字段,按原有逻辑处理(向后兼容)
        if (!Cools.isEmpty(param.getStatus())) {
            switch (param.getStatus()) {
                case "Assigned":
                    // AGV已派车,确认接收命令,记录确认时间
                    if (task.getPlcStrTime() == null) {
                        task.setPlcStrTime(new Date());
//                        log.info("AGV已确认接收命令,记录确认时间,taskId:{}", taskId);
                    }
                    if (Cools.isEmpty(robotGroup)) {
                        task.setInvWh(param.getRobotName());
                    }
                    break;
                case "Done":
                    task.setWrkSts(9L);
                    // status="Done" 才算搬运完成,结束掉AGV任务(适用于所有任务类型:入库、出库、转移)
                    if (task.getWrkSts() != null && task.getWrkSts() == 8L) {
                        task.setWrkSts(9L);
                        task.setModiTime(new Date());
                        String taskTypeName = "";
                        if (!Cools.isEmpty(param.getKind())) {
                            taskTypeName = param.getKind();
                        }
                        log.info("AGV回调搬运完成(status=Done),完结AGV呼叫单,taskId:{},任务类型:{}", taskId, taskTypeName);
                        // 保存任务更新后,转移到历史表
                        if (taskService.updateById(task)) {
                            try {
                                agvHandler.moveTaskToHistory(Collections.singletonList(task));
                                taskMovedToHistory = true;
                                log.info("AGV回调搬运完成,已将任务转移到历史表,taskId:{}", taskId);
                            } catch (Exception e) {
                                log.error("AGV回调搬运完成,转移任务到历史表失败,taskId:{}", taskId, e);
                            }
                        }
                    } else {
                        log.debug("AGV回调status=Done,但任务状态不是8(当前状态:{}),不结束任务,taskId:{}",
                            task.getWrkSts(), taskId);
                    }
                    break;
                case "Failed":
                case "Cancelled":
@@ -126,18 +195,26 @@
            }
        }
        
        // 根据任务类型进行相应处理
        // 根据任务类型进行相应处理(记录日志,但不在此处结束任务,任务结束统一由status="Done"处理)
        if (!Cools.isEmpty(param.getKind())) {
            String kind = param.getKind();
            if ("货物转运".equals(kind)) {
                log.info("处理货物转运任务,taskId:{}", taskId);
            } else if ("实托入库".equals(kind)) {
                log.info("处理实托入库任务,taskId:{}", taskId);
                log.info("处理货物转运任务,taskId:{},status:{}", taskId, param.getStatus());
            } else if ("实托入库".equals(kind) || "空托入库".equals(kind)) {
                log.info("处理入库任务,taskId:{},status:{}", taskId, param.getStatus());
                // 注意:任务结束统一由 status="Done" 处理,此处不再重复处理
            } else if ("实托出库".equals(kind)) {
                log.info("处理实托出库任务,taskId:{}", taskId);
                log.info("处理实托出库任务,taskId:{},status:{}", taskId, param.getStatus());
                // 注意:任务结束统一由 status="Done" 处理,此处不再重复处理
            }
        }
        
        // 如果任务已经被转移到历史表,直接返回成功
        if (taskMovedToHistory) {
            log.info("AGV任务回调处理成功,任务已转移到历史表,taskId:{}", taskId);
            return R.ok();
        }
        // 保存任务更新
        if (!taskService.updateById(task)) {
            log.error("更新任务失败,taskId:{}", taskId);