| | |
| | | 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.entity.param.AgvTaskkDescribeParam; |
| | | import com.zy.asrs.mapper.AgvWrkMastMapper; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.common.service.AgvCommonService; |
| | | import com.zy.common.utils.HttpHandler; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | import java.util.*; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | @Service |
| | | @Slf4j |
| | | public class AgvWrkMastServiceImp extends ServiceImpl<AgvWrkMastMapper, AgvWrkMast> 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.containerArrivedPath}") |
| | | private String containerArrivedPath; |
| | | |
| | | @Value("${agvBasDev.maxWorkNum}") |
| | | private int maxWrokNum; |
| | | |
| | | @Autowired |
| | | AgvWrkMastMapper agvWrkMastMapper; |
| | |
| | | ApiLogService apiLogService; |
| | | @Autowired |
| | | AgvBasDevpService agvBasDevpService; |
| | | @Autowired |
| | | private AgvCommonService agvCommonService; |
| | | @Autowired |
| | | private AgvWrkMastService agvWrkMastService; |
| | | |
| | | public void updateWrkStsByWrkNo(int wrkNo, long wrkSts) { |
| | | |
| | | public Boolean updateWrkStsByWrkNo(int wrkNo, long wrkSts) { |
| | | AgvWrkMast agvWrkMast = this.selectById(wrkNo); |
| | | //判断要修改的工作档状态是否合理,如果不合理则抛出异常 |
| | | checkWrkSts(agvWrkMast,wrkSts); |
| | | 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){ |
| | | |
| | | private boolean checkWrkSts(AgvWrkMast agvWrkMast, long wrkSts) { |
| | | |
| | | |
| | | return true; |
| | | } |
| | | |
| | | public int startWrk(List<AgvWrkMast> agvWrkMastList, String taskType) throws IOException { |
| | | |
| | | //任务过滤,过滤掉已存在相同目标库位的工作档 |
| | | agvWrkMastList = filter(agvWrkMastList); |
| | | public int startWrk(AgvWrkMast agvWrkMast) throws IOException { |
| | | |
| | | AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam(); |
| | | agvTaskCreateParam.setTaskType(taskType); |
| | | //agvTaskCreateParam.setTaskType(taskType); |
| | | |
| | | getRequestParam(agvTaskCreateParam,agvWrkMastList); |
| | | getRequestParam(agvTaskCreateParam, agvWrkMast); |
| | | |
| | | return doHttpRequest(agvTaskCreateParam,"搬运任务下发",url, taskCreatePath,null,"127.0.0.1"); |
| | | return doHttpRequest(agvTaskCreateParam, "搬运任务下发", url, taskCreatePath, null, "127.0.0.1"); |
| | | |
| | | //return containerMoveParam; |
| | | } |
| | | |
| | | //容器入场 |
| | | public int containerMoveIn(List<AgvWrkMast> agvWrkMastList) throws IOException { |
| | | //调用容器入场时所需要参数 |
| | | Map<String,List<Map<String,String>>> containerMoveParam = new HashMap<>(); |
| | | List<Map<String,String>> 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 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 containerMoveOut(List<AgvWrkMast> agvWrkMastList){ |
| | | Map<String,List<Map<String,String>>> containerMoveParam = new HashMap<>(); |
| | | List<Map<String,String>> positionCodeMapList = new ArrayList<>(); |
| | | containerMoveParam.put("containerMoveOuts",positionCodeMapList); |
| | | for(AgvWrkMast agvWrkMast : agvWrkMastList){ |
| | | Map<String,String> positionCodeMap = new HashMap<>(); |
| | | positionCodeMap.put("positionCode",agvWrkMast.getLocNo()); |
| | | //货架入场 |
| | | public int containerMoveIn(List<AgvWrkMast> agvWrkMastList) throws IOException { |
| | | //调用货架入场时所需要参数 |
| | | Map<String, List<Map<String, String>>> containerMoveParam = new HashMap<>(); |
| | | List<Map<String, String>> 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<AgvWrkMast> agvWrkMastList) { |
| | | Map<String, List<Map<String, String>>> containerMoveParam = new HashMap<>(); |
| | | List<Map<String, String>> positionCodeMapList = new ArrayList<>(); |
| | | containerMoveParam.put("containerMoveOuts", positionCodeMapList); |
| | | for (AgvWrkMast agvWrkMast : agvWrkMastList) { |
| | | Map<String, String> positionCodeMap = new HashMap<>(); |
| | | positionCodeMap.put("positionCode", agvWrkMast.getLocNo()); |
| | | positionCodeMapList.add(positionCodeMap); |
| | | } |
| | | return doHttpRequest(containerMoveParam,"容器离场任务下发",url, containerMoveOutPath,null,"127.0.0.1"); |
| | | return doHttpRequest(containerMoveParam, "货架离场任务下发", url, containerMoveOutPath, null, "127.0.0.1"); |
| | | } |
| | | |
| | | public boolean insertByIncrease(AgvWrkMast agvWrkMast) { |
| | |
| | | return this.delete(new EntityWrapper<AgvWrkMast>().eq("wrk_no", wrkNo)); |
| | | } |
| | | |
| | | //容器到达通知 |
| | | //货架到达通知 |
| | | public int containerArrived(AgvWrkMast agvWrkMast) { |
| | | |
| | | Map<String,String> containerArrivedParam = new HashMap<>(); |
| | | containerArrivedParam.put("slotCode",agvWrkMast.getSourceLocNo()); |
| | | containerArrivedParam.put("containerCode",agvWrkMast.getBarcode()); |
| | | Map<String, String> containerArrivedParam = new HashMap<>(); |
| | | containerArrivedParam.put("slotCode", agvWrkMast.getSourceLocNo()); |
| | | containerArrivedParam.put("containerCode", agvWrkMast.getBarcode()); |
| | | |
| | | return doHttpRequest(containerArrivedParam,"容器达到通知",url, containerArrivedPath,null,"127.0.0.1"); |
| | | return doHttpRequest(containerArrivedParam, "货架达到通知", url, containerArrivedPath, null, "127.0.0.1"); |
| | | } |
| | | |
| | | @Override |
| | | public List<AgvWrkMast> selectReadyAgvWrkMast() { |
| | | List<String> stationCodes = agvBasDevpService.selectAllStationCode(); |
| | | Wrapper<AgvWrkMast> wrapper = new EntityWrapper<AgvWrkMast>().eq("wrk_sts", 21L).like(false, "loc_no", "@"); |
| | | wrapper.in("loc_no",stationCodes); |
| | | wrapper.in("loc_no", stationCodes); |
| | | return this.selectList(wrapper); |
| | | //return this.baseMapper.selectReadyAgvWrkMast(); |
| | | } |
| | | |
| | | @Override |
| | | public AgvWrkMast selectByContainerCode(String containerCode) { |
| | | return this.selectOne(new EntityWrapper<AgvWrkMast>().eq("barcode",containerCode)); |
| | | return this.selectOne(new EntityWrapper<AgvWrkMast>().eq("barcode", containerCode)); |
| | | } |
| | | |
| | | private List<AgvWrkMast> filter(List<AgvWrkMast> agvWrkMastList){ |
| | | return agvWrkMastList.stream().filter(agvWrkMast -> { |
| | | int num = this.selectCount(new EntityWrapper<AgvWrkMast>().eq("loc_no", agvWrkMast.getLocNo())); |
| | | return num <= maxWrokNum; |
| | | }).collect(Collectors.toList()); |
| | | @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<AgvWrkMast> agvWrkMastList,List<Map<String,String>> positionCodeMapList){ |
| | | //往容器入场参数中放入源站点位置 |
| | | for(AgvWrkMast agvWrkMast : agvWrkMastList){ |
| | | //判断是否为输送线入库,是则不需要容器进场请求 |
| | | if("Y".equals(agvWrkMast.getMk())){ |
| | | |
| | | private void getContainerMoveParam(List<AgvWrkMast> agvWrkMastList, List<Map<String, String>> positionCodeMapList) { |
| | | //往货架入场参数中放入源站点位置 |
| | | for (AgvWrkMast agvWrkMast : agvWrkMastList) { |
| | | //判断是否为输送线入库,是则不需要货架进场请求 |
| | | if ("Y".equals(agvWrkMast.getMk())) { |
| | | continue; |
| | | } |
| | | Map<String,String> positionCodeMap = new HashMap<>(); |
| | | positionCodeMap.put("positionCode",agvWrkMast.getSourceLocNo()); |
| | | Map<String, String> positionCodeMap = new HashMap<>(); |
| | | positionCodeMap.put("positionCode", agvWrkMast.getSourceLocNo()); |
| | | positionCodeMapList.add(positionCodeMap); |
| | | } |
| | | } |
| | | |
| | | private void getRequestParam(AgvTaskCreateParam agvTaskCreateParam,List<AgvWrkMast> agvWrkMastList){ |
| | | List<AgvTaskParam> agvTaskParamList = agvWrkMastList.stream().map(agvWrkMast -> { |
| | | AgvTaskParam agvTaskParam = new AgvTaskParam(); |
| | | AgvTaskkDescribeParam agvTaskkDescribeParam = new AgvTaskkDescribeParam(); |
| | | agvTaskParam.setTaskDescribe(agvTaskkDescribeParam); |
| | | //AgvTaskParam |
| | | if(agvWrkMast.getIoType() == 53 || agvWrkMast.getIoType() == 57){ |
| | | agvTaskParam.setTaskCode(-agvWrkMast.getWrkNo() + ""); |
| | | }else{ |
| | | agvTaskParam.setTaskCode(agvWrkMast.getWrkNo() + ""); |
| | | } |
| | | private void getRequestParam(AgvTaskCreateParam agvTaskCreateParam, AgvWrkMast agvWrkMast) { |
| | | |
| | | agvTaskParam.setTaskPriority(agvWrkMast.getIoPri().intValue()); |
| | | List<AgvTaskParam> agvTaskParamList = Arrays.asList( |
| | | //起始位 |
| | | new AgvTaskParam(agvWrkMast.getSourceLocNo()), |
| | | //目标位 |
| | | new AgvTaskParam(agvWrkMast.getLocNo())); |
| | | |
| | | //AgvTaskkDescribeParam |
| | | if(agvWrkMast.getSourceLocNo().contains("CS") || agvWrkMast.getSourceLocNo().contains("SK")){ |
| | | agvTaskkDescribeParam.setFromLocationCode(agvWrkMast.getSourceLocNo()); |
| | | } |
| | | agvTaskkDescribeParam.setToLocationCode(agvWrkMast.getLocNo()); |
| | | agvTaskkDescribeParam.setContainerCode(agvWrkMast.getBarcode()); |
| | | return agvTaskParam; |
| | | }).collect(Collectors.toList()); |
| | | // //起始位 |
| | | // agvTaskParamList.add(new AgvTaskParam(agvWrkMast.getSourceLocNo())); |
| | | // //目标位 |
| | | // agvTaskParamList.add(new AgvTaskParam(agvWrkMast.getLocNo())); |
| | | |
| | | agvTaskCreateParam.setTasks(agvTaskParamList); |
| | | 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<AgvLocMast>().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: |
| | | agvTaskCreateParam.setTaskTyp("F01"); |
| | | break; |
| | | } |
| | | |
| | | agvTaskCreateParam.setPositionCodePath(agvTaskParamList); |
| | | |
| | | } |
| | | |
| | | private int doHttpRequest(Object requestParam, String namespace, String url, String path, String appkey, String ip){ |
| | | 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); |
| | | |
| | | int code = (int) jsonObject.get("code"); |
| | | if(code != 0){ |
| | | 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){ |
| | | } catch (Exception e) { |
| | | log.error(e.getMessage()); |
| | | throw new CoolException("调用AGV响应错误"); |
| | | }finally { |
| | | apiLogService.save( |
| | | namespace, |
| | | url + path, |
| | | appkey, |
| | | ip, |
| | | JSON.toJSONString(JSONObject.toJSONString(requestParam)), |
| | | response, |
| | | success |
| | | ); |
| | | //return 1; |
| | | } finally { |
| | | if (code != 6) { |
| | | apiLogService.save( |
| | | namespace, |
| | | url + path, |
| | | appkey, |
| | | ip, |
| | | JSON.toJSONString(JSONObject.toJSONString(requestParam)), |
| | | response, |
| | | success |
| | | ); |
| | | } |
| | | } |
| | | |
| | | } |