package com.zy.asrs.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.entity.AgvBasDevp; import com.zy.asrs.entity.AgvLocMast; import com.zy.asrs.entity.AgvWrkMast; import com.zy.asrs.entity.param.AgvTaskCreateParam; import com.zy.asrs.entity.param.AgvTaskParam; import com.zy.asrs.mapper.AgvWrkMastMapper; import com.zy.asrs.service.*; import com.zy.common.service.AgvCommonService; import com.zy.common.utils.HttpHandler; import com.zy.system.entity.Config; import com.zy.system.service.ConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.IOException; import java.util.*; import java.util.concurrent.TimeUnit; @Service @Slf4j public class AgvWrkMastServiceImp extends ServiceImpl implements AgvWrkMastService { @Value("${agv.flag}") private boolean flag; @Value("${agv.url}") private String url; @Value("${agv.taskCreatePath}") private String taskCreatePath; @Value("${agv.taskCancelPath}") private String taskCancelPath; @Value("${agv.containerMoveInPath}") private String containerMoveInPath; @Value("${agv.containerMoveOutPath}") private String containerMoveOutPath; @Value("${agv.containerArrivedPath}") private String containerArrivedPath; @Autowired AgvWrkMastMapper agvWrkMastMapper; @Autowired AgvWrkDetlService agvWrkDetlService; @Autowired AgvLocMastService agvLocMastService; @Autowired ApiLogService apiLogService; @Autowired AgvBasDevpService agvBasDevpService; @Autowired private AgvCommonService agvCommonService; @Autowired private AgvWrkMastService agvWrkMastService; @Autowired private ConfigService configService; public Boolean updateWrkStsByWrkNo(int wrkNo, long wrkSts) { AgvWrkMast agvWrkMast = this.selectById(wrkNo); //判断要修改的工作档状态是否合理,如果不合理则抛出异常 checkWrkSts(agvWrkMast, wrkSts); agvWrkMast.setWrkSts(wrkSts); agvWrkMast.setModiTime(new Date()); return this.updateById(agvWrkMast); } public void updateWrkStsByWrkNo(int wrkNo, long wrkSts, String manuType, long userId) { Date now = new Date(); AgvWrkMast agvWrkMast = this.selectById(wrkNo); //判断要修改的工作档状态是否合理,如果不合理则抛出异常 checkWrkSts(agvWrkMast, wrkSts); agvWrkMast.setWrkSts(wrkSts); agvWrkMast.setManuType(manuType); agvWrkMast.setModiTime(now); agvWrkMast.setModiUser(userId); this.updateById(agvWrkMast); } // TODO 判断规则 private boolean checkWrkSts(AgvWrkMast agvWrkMast, long wrkSts) { return true; } public int startWrk(AgvWrkMast agvWrkMast) throws IOException { AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam(); //agvTaskCreateParam.setTaskType(taskType); getRequestParam(agvTaskCreateParam, agvWrkMast); return doHttpRequest(agvTaskCreateParam, "搬运任务下发", url, taskCreatePath, null, "127.0.0.1"); //return containerMoveParam; } public int startAllcationIn(AgvWrkMast agvWrkMast) throws IOException { AgvBasDevp basDevp = agvBasDevpService.selectByDevNo(agvWrkMast.getSourceLocNo()); //检索库位,选择合适的库位 AgvLocMast locMast = agvCommonService.getLocNo(basDevp.getLocType1(), basDevp.getFloor(), false, true); agvWrkMast.setLocNo(locMast.getLocNo()); agvWrkMast.setWrkSts(201L); agvWrkMast.setLogErrMemo("startAllcationIn"); agvWrkMast.setModiTime(new Date()); agvWrkMastService.updateById(agvWrkMast); // 更目标库位 locMast.setLocSts("S"); agvLocMastService.updateById(locMast); return 0; } //货架入场 public int containerMoveIn(List agvWrkMastList) throws IOException { //调用货架入场时所需要参数 Map>> containerMoveParam = new HashMap<>(); List> positionCodeMapList = new ArrayList<>(); containerMoveParam.put("containerMoveIns", positionCodeMapList); getContainerMoveParam(agvWrkMastList, positionCodeMapList); if (Cools.isEmpty(positionCodeMapList)) { return 0; } return doHttpRequest(containerMoveParam, "货架入场任务下发", url, containerMoveInPath, null, "127.0.0.1"); } //货架离场 public int containerMoveOut(List agvWrkMastList) { Map>> containerMoveParam = new HashMap<>(); List> positionCodeMapList = new ArrayList<>(); containerMoveParam.put("containerMoveOuts", positionCodeMapList); for (AgvWrkMast agvWrkMast : agvWrkMastList) { Map positionCodeMap = new HashMap<>(); positionCodeMap.put("positionCode", agvWrkMast.getLocNo()); positionCodeMapList.add(positionCodeMap); } return doHttpRequest(containerMoveParam, "货架离场任务下发", url, containerMoveOutPath, null, "127.0.0.1"); } public boolean insertByIncrease(AgvWrkMast agvWrkMast) { int index = this.baseMapper.insertByIncrease(agvWrkMast); return index > 0; } @Override public boolean deleteByWrkNo(int wrkNo) { return this.delete(new EntityWrapper().eq("wrk_no", wrkNo)); } //货架到达通知 public int containerArrived(AgvWrkMast agvWrkMast) { Map containerArrivedParam = new HashMap<>(); containerArrivedParam.put("slotCode", agvWrkMast.getSourceLocNo()); containerArrivedParam.put("containerCode", agvWrkMast.getBarcode()); return doHttpRequest(containerArrivedParam, "货架达到通知", url, containerArrivedPath, null, "127.0.0.1"); } @Override public List selectReadyAgvWrkMast() { List stationCodes = agvBasDevpService.selectAllStationCode(); Wrapper wrapper = new EntityWrapper().eq("wrk_sts", 21L).like(false, "loc_no", "@"); wrapper.in("loc_no", stationCodes); return this.selectList(wrapper); //return this.baseMapper.selectReadyAgvWrkMast(); } @Override public AgvWrkMast selectByContainerCode(String containerCode) { return this.selectOne(new EntityWrapper().eq("barcode", containerCode)); } @Override public int callCancelTask(int wrkNo) { AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam(); agvTaskCreateParam.setTaskCode(wrkNo + ""); return doHttpRequest(agvTaskCreateParam, "取消任务下发", url, taskCancelPath, null, "127.0.0.1"); } private void getContainerMoveParam(List agvWrkMastList, List> positionCodeMapList) { //往货架入场参数中放入源站点位置 for (AgvWrkMast agvWrkMast : agvWrkMastList) { //判断是否为输送线入库,是则不需要货架进场请求 if ("Y".equals(agvWrkMast.getMk())) { continue; } Map positionCodeMap = new HashMap<>(); positionCodeMap.put("positionCode", agvWrkMast.getSourceLocNo()); positionCodeMapList.add(positionCodeMap); } } private void getRequestParam(AgvTaskCreateParam agvTaskCreateParam, AgvWrkMast agvWrkMast) { List agvTaskParamList = Arrays.asList( //起始位 new AgvTaskParam(agvWrkMast.getSourceLocNo()), //目标位 new AgvTaskParam(agvWrkMast.getLocNo())); // //起始位 // agvTaskParamList.add(new AgvTaskParam(agvWrkMast.getSourceLocNo())); // //目标位 // agvTaskParamList.add(new AgvTaskParam(agvWrkMast.getLocNo())); if (agvWrkMast.getIoType() == 53 || agvWrkMast.getIoType() == 57) { agvWrkMast.setWrkNo(-agvWrkMast.getWrkNo()); } agvTaskCreateParam.setTaskCode(agvWrkMast.getWrkNo().toString()); switch (agvWrkMast.getIoType()) { case 114: case 108: case 12: agvTaskCreateParam.setTaskTyp("F06"); break; case 109: if (agvWrkMast.getWrkSts() == 201) { agvTaskCreateParam.setTaskTyp("F06"); } else { agvTaskCreateParam.setTaskTyp("F01"); } break; case 1: case 57: // 入库任务是只有 接驳位 -- > 库位 AgvLocMast loc = agvLocMastService.selectOne(new EntityWrapper().eq("loc_no", agvWrkMast.getLocNo())); String locSub = loc.getLocNo().substring(loc.getLocNo().length() - 4).substring(0, 2).substring(0, 2); AgvBasDevp agvBasDevp = agvBasDevpService.selectByDevNo(agvWrkMast.getSourceLocNo()); if ("02".equals(locSub)) { if (agvBasDevp.getFloor() == 4) { agvTaskCreateParam.setTaskTyp("F01"); } else { agvTaskCreateParam.setTaskTyp("F06"); } } else { // 目标楼层位1楼 但源库位(接驳位)在吸塑二楼 if (agvBasDevp.getFloor() == 4) { agvTaskCreateParam.setTaskTyp("F06"); } else { agvTaskCreateParam.setTaskTyp("F01"); } } break; default: if (processUseTiShengJi(agvWrkMast.getSourceLocNo(), agvWrkMast.getLocNo())) { agvTaskCreateParam.setTaskTyp("F06"); } else { agvTaskCreateParam.setTaskTyp("F01"); } break; } agvTaskCreateParam.setPositionCodePath(agvTaskParamList); } // TODO 四期 private boolean processUseTiShengJi(String sourceLocNo, String locNo) { // 判断是否是提升机 if (sourceLocNo.startsWith("YZ")) { if (sourceLocNo.endsWith("01F2") && !locNo.startsWith("YZ") && locNo.endsWith("F4")) { // 从生产二厂的库位到吸塑二厂的点位上 return true; } else if (sourceLocNo.endsWith("01F2") && locNo.startsWith("YZ") && locNo.endsWith("02F1")) { // 从生产二厂的库位到吸塑二厂的库位 return true; } else if (sourceLocNo.endsWith("02F1") && locNo.startsWith("YZ") && locNo.endsWith("01F2")) { // 吸塑二楼的库位到生产二厂的库位 return true; } else if (sourceLocNo.endsWith("02F1") && !locNo.startsWith("YZ") && locNo.endsWith("F2")) { // 吸塑二楼的库位到生产二厂的点位 return true; } else if (sourceLocNo.endsWith("01F1") && !locNo.startsWith("YZ") && locNo.endsWith("F4")) { // 从吸塑一楼的库位到吸塑二楼的点位上 return true; }else if (sourceLocNo.endsWith("02F1") && !locNo.startsWith("YZ") && locNo.endsWith("F1")) { // 从吸塑er楼的kuwei到吸塑一楼的dianwei return true; } } else { if (sourceLocNo.endsWith("F4") && locNo.startsWith("YZ") && locNo.endsWith("01F2")) { // 从吸塑二楼的点位到生产二厂的库位 return true; } else if (sourceLocNo.endsWith("F2") && locNo.startsWith("YZ") && locNo.endsWith("02F1")) { // 从生产二厂的点位到吸塑二楼的库位 return true; } else if (sourceLocNo.endsWith("F4") && locNo.startsWith("YZ") && locNo.endsWith("01F1")) { // 从吸塑二楼的点位到吸塑一楼的库位 return true; }else if (sourceLocNo.endsWith("F1") && locNo.startsWith("YZ") && locNo.endsWith("02F1")) { // 从吸塑二楼的点位到吸塑一楼的库位 return true; } } return false; } private int doHttpRequest(Object requestParam, String namespace, String url, String path, String appkey, String ip) { if (!flag) { return 1; } String response = ""; boolean success = false; int code = 0; try { response = new HttpHandler.Builder() .setUri(url) .setPath(path) .setTimeout(30, TimeUnit.SECONDS) .setJson(JSONObject.toJSONString(requestParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); code = Integer.parseInt(jsonObject.get("code").toString()); if (code != 0) { if (code == 6) { log.info("AGV任务单号已上报:{}", response); String message = jsonObject.getString("message"); if (!Cools.isEmpty(message) && message.contains("已存在任务单头为")) { success = true; return 0; } } throw new CoolException("调用AGV响应错误"); //return code; } success = true; return code; } catch (Exception e) { log.error(e.getMessage()); throw new CoolException("调用AGV响应错误"); //return 1; } finally { if (code != 6) { apiLogService.save( namespace, url + path, appkey, ip, JSON.toJSONString(JSONObject.toJSONString(requestParam)), response, success ); } } } }