| | |
| | | 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; |
| | |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | |
| | | @Resource |
| | | private TaskService taskService; |
| | | |
| | | @Resource |
| | | private AgvHandler agvHandler; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public R agvCallback(AgvCallbackDto param) { |
| | |
| | | param.getKind()); |
| | | |
| | | // 根据taskId查询任务 |
| | | // taskId格式:T + 工作号(如"T5299")或 T + 任务ID(向后兼容) |
| | | Task task = null; |
| | | try { |
| | | // 处理"T"前缀格式(如"T130"),这是AGV任务创建时的格式 |
| | | // 处理"T"前缀格式(如"T5299"或"T130") |
| | | String numericId = taskId; |
| | | if (taskId.startsWith("T") && taskId.length() > 1) { |
| | | numericId = taskId.substring(1); |
| | | log.debug("检测到T前缀格式的taskId,提取数字ID:{}", numericId); |
| | | log.debug("检测到T前缀格式的taskId,提取数字:{}", numericId); |
| | | } |
| | | // 尝试将taskId解析为Long类型的id |
| | | Long taskIdLong = Long.parseLong(numericId); |
| | | task = taskService.selectById(taskIdLong); |
| | | } catch (NumberFormatException e) { |
| | | // 如果不是数字,尝试通过其他字段查询(如sheetNo等) |
| | | log.debug("taskId不是数字格式,尝试通过其他字段查询,taskId:{}", taskId); |
| | | |
| | | // 先尝试通过工作号(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) |
| | | ); |
| | |
| | | |
| | | 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": |
| | |
| | | } |
| | | } |
| | | |
| | | // 根据任务类型进行相应处理 |
| | | // 根据任务类型进行相应处理(记录日志,但不在此处结束任务,任务结束统一由status="Done"处理) |
| | | if (!Cools.isEmpty(param.getKind())) { |
| | | String kind = param.getKind(); |
| | | if ("货物转运".equals(kind)) { |
| | | log.info("处理货物转运任务,taskId:{}", taskId); |
| | | log.info("处理货物转运任务,taskId:{},status:{}", taskId, param.getStatus()); |
| | | } else if ("实托入库".equals(kind) || "空托入库".equals(kind)) { |
| | | log.info("处理入库任务,taskId:{}", taskId); |
| | | // 入库任务:如果收到确认取货回调(loaded=true),完结AGV呼叫单 |
| | | if (Boolean.TRUE.equals(param.getLoaded())) { |
| | | // 如果任务状态是8(已呼叫AGV),更新为9(任务完成) |
| | | if (task.getWrkSts() != null && task.getWrkSts() == 8L) { |
| | | task.setWrkSts(9L); |
| | | log.info("入库任务收到确认取货回调,完结AGV呼叫单,taskId:{}", taskId); |
| | | } |
| | | } |
| | | 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); |