package com.zy.api.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.R; import com.core.exception.CoolException; import com.zy.api.controller.params.AgvCallBackParam; import com.zy.api.controller.params.AgvCarriesParam; import com.zy.api.controller.params.AgvRequestParam; import com.zy.api.entity.CallAgvParams; import com.zy.api.enums.OrderType; import com.zy.api.service.AgvScheduleService; import com.zy.asrs.entity.LocCache; import com.zy.asrs.entity.Task; import com.zy.asrs.entity.result.ForwardAGVTaskDTO; import com.zy.asrs.entity.result.HIKApiDTO; import com.zy.asrs.entity.result.HIKResultDTO; import com.zy.asrs.enums.LocStsType; import com.zy.asrs.enums.TaskIOType; import com.zy.asrs.enums.TaskStatusType; import com.zy.asrs.service.ApiLogService; import com.zy.asrs.service.LocCacheService; import com.zy.asrs.service.TaskService; import com.zy.asrs.service.impl.LocCacheServiceImpl; import com.zy.common.constant.HIKApiConstant; import com.zy.common.utils.HttpHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; @Slf4j @Service public class AgvScheduleServiceImpl implements AgvScheduleService { @Autowired private ApiLogService apiLogService; @Autowired private TaskService taskService; @Autowired private LocCacheService locCacheService; /** * @author Ryan * @date 2025/11/3 * @description: 呼叫AGV搬运 * @version 1.0 */ @Override @Transactional(rollbackFor = Exception.class) public R callAgvCarry(CallAgvParams params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } if (Objects.isNull(params.getWrkNo())) { return R.error("任务号不能为空!!"); } Task task = taskService.selectOne(new EntityWrapper().eq("wrk_no", params.getWrkNo())); if (Objects.isNull(task)) { return R.error("任务信息不存在!!"); } if (Arrays.asList(TaskIOType.ALL_IN.type, TaskIOType.PICK_IN.type, TaskIOType.MERGE_IN.type) .contains(task.getIoType())) { // 入库 task.setWrkSts(TaskStatusType.AGV_TASK_ISSUED_IN.type); } else if (Arrays.asList(TaskIOType.ALL_OUT.type, TaskIOType.PICK_OUT.type, TaskIOType.MERGE_OUT.type, TaskIOType.EMPTY_OUT.type) .contains(task.getIoType())) { // 出库 task.setWrkSts(TaskStatusType.AGV_TASK_ISSUED_OUT.type); } HIKResultDTO hikResultDTO = sendAgvTask(params, HIKApiConstant.TASK_SUBMIT); if (hikResultDTO.isSuccess()) { if (!taskService.updateById(task)) { throw new CoolException("任务状态更新失败!!"); } } return R.ok(); } /** * 获取自定义请求头 * * @return java.util.Map * @author Ryan * @date 2025/12/29 9:11 */ private Map getHeaderParam() { Map headerParam = new HashMap<>(); //设置请求连接的Token headerParam.put("X-LR-REQUEST-ID", new Date().getTime() + ""); return headerParam; } @Override @Transactional(rollbackFor = Exception.class) public R callback(AgvCallBackParam params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } if (Objects.isNull(params.getRobotTaskCode())) { return R.error("任务号不能为空!!"); } Task task = taskService.selectOne(new EntityWrapper().eq("wrk_no", params.getRobotTaskCode())); if (Objects.isNull(task)) { return R.error("任务信息不存在!!"); } if (Arrays.asList(TaskIOType.ALL_IN.type, TaskIOType.PICK_IN.type, TaskIOType.MERGE_IN.type) .contains(task.getIoType())) { // 入库 if (params.getExtra().getValues().getMethod().equals("start")) { task.setWrkSts(TaskStatusType.AGV_TASK_RUNNING_IN.type); } else if (params.getExtra().getValues().getMethod().equals("end")){ task.setWrkSts(TaskStatusType.AGV_TASK_FINISHED_IN.type); } } else if (Arrays.asList(TaskIOType.ALL_OUT.type, TaskIOType.PICK_OUT.type, TaskIOType.MERGE_OUT.type, TaskIOType.EMPTY_OUT.type) .contains(task.getIoType())) { // 出库p if (params.getExtra().getValues().getMethod().equals("start")) { task.setWrkSts(TaskStatusType.AGV_TASK_RUNNING_OUT.type); } else if (params.getExtra().getValues().getMethod().equals("end")){ task.setWrkSts(TaskStatusType.AGV_TASK_FINISHED_OUT.type); } } if (!taskService.updateById(task)) { throw new CoolException("状态修改失败!!"); } return R.ok("执行完成 !!"); } public HIKResultDTO sendAgvTask(CallAgvParams param, String path) { HIKResultDTO result = new HIKResultDTO(); AgvRequestParam requestParam = new AgvRequestParam(); requestParam.setTaskType(param.getTaskType()); List agvCarriesParams = new ArrayList<>(); AgvCarriesParam carriesParam = new AgvCarriesParam(); carriesParam.setSeq(0); carriesParam.setCode(param.getOrgSite()); agvCarriesParams.add(carriesParam); AgvCarriesParam carriesParam2 = new AgvCarriesParam(); carriesParam2.setSeq(1); carriesParam2.setCode(param.getTarSite()); agvCarriesParams.add(carriesParam2); requestParam.setRobotTaskCode(param.getWrkNo()); requestParam.setTargetRoute(agvCarriesParams); String body = JSON.toJSONString(requestParam); String response = ""; try { response = new HttpHandler.Builder() .setUri(HIKApiConstant.AGV_IP) .setPath(path) .setHeaders(getHeaderParam()) .setJson(body) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.getString("code").equals("SUCCESS")) { result.setSuccess(true); } else { result.setMessage(jsonObject.getString("message")); log.error("发送agv任务失败!!!url:{};request:{};response:{}", HIKApiConstant.AGV_IP + path, body, response); } // {"code":"1","data":"","interrupt":false,"message":"重复提交","msgErrCode":"0x3a80D012","reqCode":"fa92b49481a44627ae4d80c1400f28f6"} } catch (Exception e) { result.setMessage(e.getMessage()); log.error("发送agv任务异常", e); } finally { try { // 保存接口日志 apiLogService.save( "发送agv任务", HIKApiConstant.AGV_IP + path, null, "127.0.0.1", body, response, result.isSuccess()); } catch (Exception e) { log.error("", e); } } return result; } }