| | |
| | | package com.zy.asrs.service.impl; |
| | | |
| | | import com.alibaba.excel.util.StringUtils; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.entity.mes.TransArrivalStation; |
| | | import com.zy.asrs.entity.mes.TransInOutStationAllow; |
| | | import com.zy.asrs.entity.mes.TransParent; |
| | | import com.zy.asrs.entity.rcs.*; |
| | | import com.zy.asrs.enums.RcsRetMethodEnum; |
| | | import com.zy.asrs.mapper.BasDevpMapper; |
| | | import com.zy.asrs.mapper.BlockStationMapper; |
| | | import com.zy.asrs.mapper.BlockTaskMapper; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.common.utils.HttpHandler; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | import java.net.URL; |
| | | import java.net.URLConnection; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | import java.util.*; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | | |
| | |
| | | @Value("${mes.defaultUserId}") |
| | | public long defaultUserId; |
| | | |
| | | // wcs地址 |
| | | @Value("${wcs.url}") |
| | | private String WCS_URL; |
| | | |
| | | |
| | | @Resource |
| | | private MesService mesService; |
| | |
| | | @Resource |
| | | private BlockTaskMapper blockTaskMapper; |
| | | @Resource |
| | | private TaskDetlServiceImpl taskDetlService; |
| | | private TaskDetlService taskDetlService; |
| | | @Resource |
| | | private WrkMastService wrkMastService; |
| | | |
| | |
| | | * @param rcsFactory 1 海康;2 华晓; |
| | | * @return |
| | | */ |
| | | public int submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory){ |
| | | public RcsReturn submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory){ |
| | | |
| | | // String response = ""; |
| | | // boolean success = false; |
| | |
| | | // } |
| | | // } |
| | | // return success ? 1 : 0; |
| | | RcsReturn rcsReturn = new RcsReturn(); |
| | | boolean success = false; |
| | | String url = rcsFactory == 2 ? HX_URL : HIK_URL + "api/robot/controller/task/submit"; |
| | | String response = ""; |
| | | try { |
| | | // 模拟返回 |
| | | // rcsReturn.setCode("SUCCESS"); |
| | | // success = true; |
| | | // log.info("呼叫agv搬运成功!url:{};request:{};response:{}", url, JSON.toJSONString(rcsTaskSubmit), response); |
| | | |
| | | String url = rcsFactory == 2 ? HX_URL :HIK_URL + "api/robot/controller/task/submit"; |
| | | String response = sendPost(url, JSONObject.toJSONString(rcsTaskSubmit)); |
| | | |
| | | if (!StringUtils.isEmpty(response) && response.contains("code")){ |
| | | RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class); |
| | | if("SUCCESS".equals(rcsReturn.getCode())) { |
| | | JSONObject data = rcsReturn.getData(); |
| | | String robotTaskCode = data.getString("robotTaskCode"); |
| | | if (robotTaskCode.equals(rcsTaskSubmit.getRobotTaskCode())){ |
| | | return 1; |
| | | response = sendPost(url, JSONObject.toJSONString(rcsTaskSubmit)); |
| | | if (!StringUtils.isEmpty(response) && response.contains("code")) { |
| | | rcsReturn = JSONObject.parseObject(response, RcsReturn.class); |
| | | if ("SUCCESS".equals(rcsReturn.getCode())) { |
| | | success = true; |
| | | log.info("呼叫agv搬运成功!url:{};request:{};response:{}", url, JSON.toJSONString(rcsTaskSubmit), response); |
| | | } else { |
| | | log.error("呼叫agv搬运失败!url:{};request:{};response:{}", url, JSON.toJSONString(rcsTaskSubmit), response); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("呼叫agv搬运异常", e); |
| | | } finally { |
| | | try { |
| | | // 保存接口日志 |
| | | apiLogService.save( |
| | | "呼叫agv搬运", |
| | | url, |
| | | null, |
| | | "127.0.0.1", |
| | | JSON.toJSONString(rcsTaskSubmit), |
| | | response, |
| | | success |
| | | ); |
| | | } catch (Exception e) { |
| | | log.error("呼叫agv搬运保存接口日志异常", e); |
| | | } |
| | | } |
| | | |
| | | return 0; |
| | | return rcsReturn; |
| | | } |
| | | |
| | | /** |
| | |
| | | public int cancelTask(RcsTaskCancel rcsTaskCancel, int rcsFactory){ |
| | | |
| | | String url = rcsFactory == 2 ? HX_URL :HIK_URL + "api/robot/controller/task/cancel"; |
| | | String response = sendPost(url, rcsTaskCancel.toString()); |
| | | String response = sendPost(url, JSONObject.toJSONString(rcsTaskCancel)); |
| | | if (!StringUtils.isEmpty(response) && response.contains("code")){ |
| | | RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class); |
| | | if("SUCCESS".equals(rcsReturn.getCode())) { |
| | |
| | | private int notifyEqpt(RcsEqptNotify rcsEqptNotify, int rcsFactory){ |
| | | |
| | | String url = rcsFactory == 2 ? HX_URL :HIK_URL + "api/wcs/robot/eqpt/notify"; |
| | | String response = sendPost(url, rcsEqptNotify.toString()); |
| | | String response = sendPost(url, JSONObject.toJSONString(rcsEqptNotify)); |
| | | if (!StringUtils.isEmpty(response) && response.contains("code")){ |
| | | RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class); |
| | | if("SUCCESS".equals(rcsReturn.getCode())) { |
| | |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | @Resource |
| | | private BasDevpMapper basDevpMapper; |
| | | |
| | | /** |
| | | * 2.2.1任务执行回馈 |
| | |
| | | |
| | | try { |
| | | // q3,q8=1 |
| | | if ("1".equals(carrierType)) { //AGV |
| | | // if ("1".equals(carrierType)) { //AGV |
| | | EntityWrapper<Task> wrapper = new EntityWrapper<>(); |
| | | wrapper.eq("task_no", robotTaskCode); |
| | | Task task = taskService.selectOne(wrapper); |
| | |
| | | // JSONObject taskMemo = JSONObject.parseObject(task.getMemo()); |
| | | // mesService.outFeedbackByTuo(taskMemo.getString("OrderNo"), task); |
| | | } break; |
| | | case APPLY_PUT: { // 放货申请 |
| | | String staNo = task.getStaNo(); |
| | | BasDevp basDevp = basDevpMapper.selectById(staNo); |
| | | if(basDevp.getAutoing().equals("Y") && basDevp.getLoading().equals("N") && basDevp.getWrkNo() == 0) { |
| | | |
| | | // 205 触发条码扫描 |
| | | if (staNo.equals("205")) { |
| | | Map<String,Object> params = new HashMap<>(); |
| | | params.put("siteId",staNo); |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(WCS_URL) |
| | | .setPath("/site/startScan") |
| | | .setParams(params) |
| | | .build() |
| | | .doPost(); |
| | | log.info("{}放货申请给wcs下发条码扫描原始返回:{}",staNo,response); |
| | | } |
| | | |
| | | // 满足放货条件,调用RCS任务继续执行 |
| | | RcsTaskContinue rcsTaskContinue = new RcsTaskContinue(); |
| | | rcsTaskContinue.setRobotTaskCode(robotTaskCode); |
| | | rcsTaskContinue.setTriggerType("TASK"); |
| | | rcsTaskContinue.setTriggerCode(robotTaskCode); |
| | | int success = continueTask(rcsTaskContinue, 1); |
| | | if(success != 1) { |
| | | rcsReturn.setCode("Err_RobotCodeNotMatch"); |
| | | rcsReturn.setMessage("继续执行失败"); |
| | | JSONObject data = new JSONObject(); |
| | | data.put("robotTaskCode", robotTaskCode); |
| | | rcsReturn.setData(data); |
| | | return rcsReturn; |
| | | } |
| | | }else { |
| | | log.warn("站点:{},不满足放货条件,自动:{},无物:{},任务号:{}",staNo,basDevp.getAutoing(),basDevp.getLoading(),basDevp.getWrkNo()); |
| | | rcsReturn.setCode("Err_RobotCodeNotMatch"); |
| | | rcsReturn.setMessage("站点不满足放货条件"); |
| | | JSONObject data = new JSONObject(); |
| | | data.put("robotTaskCode", robotTaskCode); |
| | | rcsReturn.setData(data); |
| | | return rcsReturn; |
| | | } |
| | | } break; |
| | | case APPLY_PICK: { // 取货申请 |
| | | String staNo = task.getSourceStaNo(); |
| | | BasDevp basDevp = basDevpMapper.selectById(staNo); |
| | | if(basDevp.getAutoing().equals("Y") && basDevp.getLoading().equals("Y") |
| | | && basDevp.getWrkNo() > 0 && basDevp.getWrkNo() <= 9990) { |
| | | // 满足放货条件,调用RCS任务继续执行 |
| | | RcsTaskContinue rcsTaskContinue = new RcsTaskContinue(); |
| | | rcsTaskContinue.setRobotTaskCode(robotTaskCode); |
| | | rcsTaskContinue.setTriggerType("TASK"); |
| | | rcsTaskContinue.setTriggerCode(robotTaskCode); |
| | | int success = continueTask(rcsTaskContinue, 1); |
| | | if(success != 1) { |
| | | rcsReturn.setCode("Err_RobotCodeNotMatch"); |
| | | rcsReturn.setMessage("继续执行失败"); |
| | | JSONObject data = new JSONObject(); |
| | | data.put("robotTaskCode", robotTaskCode); |
| | | rcsReturn.setData(data); |
| | | return rcsReturn; |
| | | } |
| | | }else { |
| | | log.warn("站点:{},不满足取货条件,自动:{},无物:{},任务号:{}",staNo,basDevp.getAutoing(),basDevp.getLoading(),basDevp.getWrkNo()); |
| | | rcsReturn.setCode("Err_RobotCodeNotMatch"); |
| | | rcsReturn.setMessage("站点不满足放货条件"); |
| | | JSONObject data = new JSONObject(); |
| | | data.put("robotTaskCode", robotTaskCode); |
| | | rcsReturn.setData(data); |
| | | return rcsReturn; |
| | | } |
| | | } break; |
| | | case PICK_COMPLETE: { // 取货完成 |
| | | String staNo = task.getSourceStaNo(); |
| | | |
| | | // 清除输送线任务号 |
| | | Map<String,Object> params = new HashMap<>(); |
| | | params.put("siteId",staNo); |
| | | params.put("workNo",0); |
| | | params.put("staNo", 0); |
| | | params.put("pakMk","Y"); |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(WCS_URL) |
| | | .setPath("/site/detl/update") |
| | | .setParams(params) |
| | | .build() |
| | | .doPost(); |
| | | log.info("agv反馈pickComplete给wcs发命令:{},返回:{}",JSONObject.toJSONString(params),response); |
| | | // agv继续执行 |
| | | // TransInOutStationAllow inOutStationAllow = new TransInOutStationAllow(); |
| | | // inOutStationAllow.setTaskno(robotTaskCode); |
| | | // inOutStationAllow.setStatus("Y"); |
| | | // inOutStationAllow.setAgvCode("agv001"); |
| | | // mesService.allowOutStation(inOutStationAllow); |
| | | } break; |
| | | case TASK_END: { |
| | | // 更新任务状态等内部逻辑 |
| | | task.setWrkSts(304L); // 301 任务下发、302 任务执行、303 任务中断、304 任务结束 |
| | |
| | | taskService.updateById(task); |
| | | // 任务完成 |
| | | // mesService.reporterTask(rcsReporterTask); |
| | | |
| | | // 入立库时,区分是空托还是满托,给输送线下发命令9990 空,9995满 |
| | | // 侧面205 9996空,9997满 |
| | | String transType = memo.getString("TransType"); |
| | | if("02".equals(transType) || "04".equals(transType)) { |
| | | int wrkNo = 9995; |
| | | if("02".equals(transType)) { |
| | | TaskDetl taskDetl = taskDetlService.selectOne(new EntityWrapper<TaskDetl>().eq("wrk_no", task.getWrkNo())); |
| | | if (taskDetl != null) { |
| | | if("tuopan".equals(taskDetl.getMatnr())){ |
| | | wrkNo = 9990; |
| | | } |
| | | } |
| | | } |
| | | int staNo = Integer.parseInt(task.getStaNo()); |
| | | if(staNo == 205) { // 侧面任务号转换 |
| | | wrkNo = wrkNo == 9990 ? 9996 : 9997; |
| | | } |
| | | Map<String,Object> params = new HashMap<>(); |
| | | params.put("siteId",staNo); |
| | | params.put("workNo",wrkNo); |
| | | params.put("staNo", staNo == 205 ? 205 : (staNo-1) ); |
| | | params.put("pakMk","Y"); |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(WCS_URL) |
| | | .setPath("/site/detl/update") |
| | | .setParams(params) |
| | | .build() |
| | | .doPost(); |
| | | log.info("agv反馈end给wcs发命令:{},返回:{}",JSONObject.toJSONString(params),response); |
| | | } |
| | | |
| | | // EntityWrapper<TaskDetl> wapper2 = new EntityWrapper<>(); |
| | | // wapper2.eq("wrk_no", task.getWrkNo()) |
| | |
| | | mesService.applyOutStation(apply); |
| | | } else if (RcsRetMethodEnum.ARRIVE_OFF_STATION.getCode().equals(method)) { |
| | | mesService.outStation(apply); |
| | | // agv继续执行 |
| | | |
| | | // TransInOutStationAllow inOutStationAllow = new TransInOutStationAllow(); |
| | | // inOutStationAllow.setTaskno(robotTaskCode); |
| | | // inOutStationAllow.setStatus("Y"); |
| | | // inOutStationAllow.setAgvCode("agv001"); |
| | | // mesService.allowOutStation(inOutStationAllow); |
| | | } |
| | | } break; |
| | | case ARRIVE_ON_STATION: { |
| | | // TODO: 如果产线是运输起点,则不发送到站完成,暂时调试使用lG,未实现判断 |
| | | if (rcsReporterTask.getCurrentSeq() == 0 && task.getSourceStaNo().startsWith("LG")) { |
| | | break; |
| | | } |
| | | |
| | | EntityWrapper<TaskDetl> wapper2 = new EntityWrapper<>(); |
| | | wapper2.eq("wrk_no", task.getWrkNo()) |
| | | .eq("matnr", memo.getString("Itemno")) |
| | |
| | | TransArrivalStation arrivalStation = new TransArrivalStation(); |
| | | arrivalStation.setTaskno(robotTaskCode); |
| | | arrivalStation.setTaskname(memo.getString("taskName")); |
| | | arrivalStation.setTuoPanId(taskDetl.getZpallet()); // memo.getString("TuoPanId") |
| | | arrivalStation.setTuoPanId(task.getBarcode()); // memo.getString("TuoPanId") |
| | | arrivalStation.setProductLineId(memo.getString("ProductLineId")); |
| | | String transType = memo.getString("TransType"); |
| | | arrivalStation.setDaotype(transType); |
| | |
| | | arrivalStation.setOrderNo(memo.getString("OrderNo")); |
| | | arrivalStation.setAgvCode(singleRobotCode); |
| | | arrivalStation.setItemno(memo.getString("Itemno")); |
| | | String memo2 = taskDetl.getMemo(); |
| | | List<String> itemBarCode = new ArrayList<>(); |
| | | Matcher matcher = Pattern.compile("\"([^\"]*)\"").matcher(memo2); |
| | | while (matcher.find()) { |
| | | itemBarCode.add(matcher.group(1)); |
| | | } |
| | | arrivalStation.setItemBarcode(itemBarCode); |
| | | String memo2 = taskDetl == null ? "":taskDetl.getMemo(); |
| | | String[] array = memo2.split(","); |
| | | // List<String> itemBarCode = new ArrayList<>(); |
| | | // Matcher matcher = Pattern.compile("\"([^\"]*)\"").matcher(memo2); |
| | | // while (matcher.find()) { |
| | | // itemBarCode.add(matcher.group(1)); |
| | | // } |
| | | arrivalStation.setItemBarcode(Arrays.asList(array)); |
| | | mesService.arriveOnStation(arrivalStation); |
| | | } break; |
| | | default: {} break; |
| | | } |
| | | } |
| | | // } |
| | | // else if ("CTU".equals(carrierType)) { //CTU |
| | | // EntityWrapper<WrkMast> wrapper = new EntityWrapper<>(); |
| | | // wrapper.eq("task_no", robotTaskCode); |
| | |
| | | return result.toString(); |
| | | } |
| | | |
| | | @Override |
| | | public RcsReturn siteBind(SiteBind siteBind) { |
| | | RcsReturn rcsReturn = new RcsReturn(); |
| | | String url = HIK_URL + "api/robot/controller/site/bind"; |
| | | String response = sendPost(url, JSONObject.toJSONString(siteBind)); |
| | | if (!StringUtils.isEmpty(response) && response.contains("code")){ |
| | | rcsReturn = JSONObject.parseObject(response, RcsReturn.class); |
| | | } else { |
| | | rcsReturn.setCode("ERROR"); |
| | | rcsReturn.setMessage("调用绑定接口RCS无返回"); |
| | | } |
| | | return rcsReturn; |
| | | } |
| | | |
| | | // endregion |
| | | } |