zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/security/SecurityConfig.java
@@ -46,7 +46,8 @@ "/ws/**", "/openapi/**", "/views/**", "/static/**" "/static/**", "/monitor/**" }; @Resource zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/MainProcess.java
@@ -56,9 +56,9 @@ // 解析小车载货移动工作档 mainService.analyzeLadenMoveTask(); // 出库 ===>> 工作档信息写入led显示器 mainService.ledExecute(); // mainService.ledExecute(); // 其他 ===>> LED显示器复位,显示默认信息 mainService.ledReset(); // mainService.ledReset(); // 穿梭车 ===>> 小车电量检测充电 mainService.loopShuttleCharge(); // 穿梭车 ===>> 小车电量满电后回待机位 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/LedApiController.java
New file @@ -0,0 +1,99 @@ package com.zy.asrs.wcs.core.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.framework.common.Cools; import com.zy.asrs.framework.common.R; import com.zy.asrs.wcs.core.entity.BasConveyorSta; import com.zy.asrs.wcs.core.entity.BasShuttle; import com.zy.asrs.wcs.core.entity.Loc; import com.zy.asrs.wcs.core.service.BasConveyorStaService; import com.zy.asrs.wcs.core.service.BasShuttleService; import com.zy.asrs.wcs.core.service.LocService; import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; import com.zy.asrs.wcs.system.controller.BaseController; import io.swagger.models.auth.In; import lombok.Data; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.Calendar; import java.util.Date; import java.util.List; @RestController @RequestMapping("/monitor") public class LedApiController extends BaseController { private static final String[] WEEK = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"}; @Autowired private BasConveyorStaService basConveyorStaService; @Autowired private BasShuttleService basShuttleService; @Autowired private LocService locService; @GetMapping("/date") public R monitorDate() { Date now = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(now); return R.ok( Cools.add("year", calendar.get(Calendar.YEAR)) .add("month", zerofill(String.valueOf(calendar.get(Calendar.MONTH)+1), 2)) .add("day", zerofill(String.valueOf(calendar.get(Calendar.DATE)), 2)) .add("hour", zerofill(String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)), 2)) .add("minute", zerofill(String.valueOf(calendar.get(Calendar.MINUTE)), 2)) .add("second", zerofill(String.valueOf(calendar.get(Calendar.SECOND)) , 2)) .add("week", WEEK[calendar.get(Calendar.DAY_OF_WEEK)-1]) ); } @GetMapping("/other") public R monitorOtherDate() { BasShuttle shuttle1 = basShuttleService.getOne(new LambdaQueryWrapper<BasShuttle>().eq(BasShuttle::getShuttleNo, 1)); ShuttleProtocol protocol = JSON.parseObject(shuttle1.getProtocol(), ShuttleProtocol.class); BasShuttle shuttle2 = basShuttleService.getOne(new LambdaQueryWrapper<BasShuttle>().eq(BasShuttle::getShuttleNo, 2)); ShuttleProtocol protocol2 = JSON.parseObject(shuttle2.getProtocol(), ShuttleProtocol.class); Integer locStsF = locService.count(new LambdaQueryWrapper<Loc>().eq(Loc::getLocSts, 6)); Integer locStsAll = locService.count(new LambdaQueryWrapper<Loc>().eq(Loc::getLocSts, 7).or().eq(Loc::getLocSts, 6)); Integer usedPr = (int)(((double) locStsF / locStsAll) *100); return R.ok( Cools.add("power1",protocol.getBatteryPower()) .add("power2",protocol2.getBatteryPower()) .add("shuttle1Status",protocol.getProtocolStatusType()) .add("shuttle2Status",protocol2.getProtocolStatusType()) .add("shuttle1LocNo",protocol.getCurrentCode()) .add("shuttle2LocNo",protocol2.getCurrentCode()) .add("usedPr",usedPr) .add("used",locStsF) ); } public static String zerofill(String msg, Integer count) { if (msg.length() == count) { return msg; } else if (msg.length() > count) { return msg.substring(0, 16); } else { StringBuilder msgBuilder = new StringBuilder(msg); for(int i = 0; i < count - msg.length(); ++i) { msgBuilder.insert(0, "0"); } return msgBuilder.toString(); } } } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/OpenController.java
@@ -26,11 +26,13 @@ import com.zy.asrs.wcs.system.controller.BaseController; import com.zy.asrs.wcs.system.entity.Dict; import com.zy.asrs.wcs.system.service.DictService; import org.apache.poi.ss.formula.functions.T; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.text.SimpleDateFormat; import java.util.*; /** @@ -66,6 +68,11 @@ @PostMapping("/agvPickupComplete") public Map<String, Object> agvPickupComplete(@RequestBody AgvTaskParam agvTaskParam) { HashMap<String, String> mesMap = new HashMap<>(); mesMap.put("taskNo", agvTaskParam.getRobotTaskCode()); mesMap.put("contNo",agvTaskParam.getExtra().getValues().getCarrierCode()); boolean returnTask3 = toMesHttpRequest(mesMap, "172.18.231.126", "/api/wcs/wcsTaskInfo", "3",agvTaskParam.getExtra().getValues().getSlotName()); HashMap<String, Object> map = new HashMap<>(); map.put("code","0"); map.put("message","成功"); @@ -77,12 +84,87 @@ @PostMapping("/agvTaskComplete") public Map<String, Object> agvTaskComplete(@RequestBody AgvTaskParam agvTaskParam) { log.info("agv请求任务完成,wms任务号:"+JSON.toJSONString(agvTaskParam)); HashMap<String, Object> map = new HashMap<>(); Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getWmsTaskNo, agvTaskParam.getRobotTaskCode())); if (!Cools.isEmpty(task)){ if (agvTaskParam.getExtra().getValues().getSlotName().equals("06YZ0001")){ Device device = deviceService.getOne(new LambdaQueryWrapper<Device>() .eq(Device::getDeviceType, DeviceCtgType.CONVEYOR.val()) .eq(Device::getStatus, 1) .eq(Device::getDeviceNo, 1)); if (device == null) { map.put("code","1"); map.put("message","失败,设备不存在"); map.put("reqCode", ""); return map; } DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, device.getId().intValue()); if (devpThread == null) { map.put("code","1"); map.put("message","失败,输送线不在线"); map.put("reqCode", ""); return map; } boolean result = devpThread.writeWorkSta(100, Short.parseShort("9999"), (short) 101); if (!result) { map.put("code","1"); map.put("message","失败,输送线命令下发失败"); map.put("reqCode", ""); return map; } }else { if (task.getTaskSts() == 1000 || task.getMemo().equals(agvTaskParam.getExtra().getValues().getSlotName())){ task.setTaskSts(1001L); taskService.updateById(task); } } }else { HashMap<String, String> mesMap = new HashMap<>(); mesMap.put("taskNo", agvTaskParam.getRobotTaskCode()); mesMap.put("contNo",agvTaskParam.getExtra().getValues().getCarrierCode()); boolean returnTask4 = toMesHttpRequest(mesMap, "172.18.231.126", "/api/wcs/wcsTaskInfo", "4",agvTaskParam.getExtra().getValues().getSlotName()); } map.put("code","0"); map.put("message","成功"); map.put("reqCode", ""); log.info("agv请求任务完成,wms任务号:"+JSON.toJSONString(agvTaskParam)); return map; } private boolean toMesHttpRequest(Map<String,String> map, String url, String path, String code,String location){ Date now = new Date(); long time = now.getTime()/1000; ReturnWcsTaskStatisParam returnWcsTaskStatisParam = new ReturnWcsTaskStatisParam(); returnWcsTaskStatisParam.setRequestPK(map.get("taskNo")); returnWcsTaskStatisParam.setTrkId(map.get("taskNo")); returnWcsTaskStatisParam.setContNo(map.get("contNo")); returnWcsTaskStatisParam.setCode(code); returnWcsTaskStatisParam.setOperator("wcs"); returnWcsTaskStatisParam.setOperationTime(time); returnWcsTaskStatisParam.setTrkType("01"); returnWcsTaskStatisParam.setCurPos(location); String response = ""; boolean success = false; try { response = new HttpHandler.Builder() .setUri(url) .setPath(path) .setJson(JSONObject.toJSONString(returnWcsTaskStatisParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); String code1 = jsonObject.get("success").toString(); log.info("上报mes接口请求体:"+JSON.toJSONString(returnWcsTaskStatisParam) +",返回值:"+jsonObject.toJSONString()); if(code1.equals("1")){ success = true; } }catch (Exception e){ return success; } return success; } @@ -148,8 +230,9 @@ //mes下发任务 @PostMapping("/createWcsTaskParam") @PostMapping("/createWcsTask") public HashMap<String,Object> createWcsTask(@RequestBody CreateWcsTaskParam param){ log.info("mes任务下发,请求体:"+JSONObject.toJSONString(param)); HashMap<String, Object> map = new HashMap<>(); if (Cools.isEmpty(param)){ map.put("success", "0"); @@ -174,31 +257,37 @@ map.put("requestPK", param.getRequestPK()); return map; } ArrayList<String> inlist = new ArrayList<>(); inlist.add("1");inlist.add("8"); ArrayList<String> outlist = new ArrayList<>(); outlist.add("2");outlist.add("9"); if (inlist.contains(param.getTrkType())){ String sta = "06YZ"; String loc = "0601KW"; if (param.getFrmPos().substring(0,4).equals(sta) && param.getToPos().substring(0,6).equals(loc)){ if (!param.getFrmPos().equals("06YZ0001")){ try { AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam(); getInRequestParam(agvTaskCreateParam,param); boolean httpRequest = doHttpRequest(agvTaskCreateParam, "172.18.16.248:443", "/rcs/rtas/api/robot/controller/task/submit"); if (!httpRequest){ String httpRequest = doHttpRequest(agvTaskCreateParam, "172.18.16.248:443", "/rcs/rtas/api/robot/controller/task/submit"); if (!httpRequest.equals("SUCCESS")){ map.put("success", "0"); map.put("message", httpRequest); map.put("result", ""); map.put("requestPK", param.getRequestPK()); return map; } }catch (Exception e){ map.put("success", "0"); map.put("message", "转发AGV任务出错"); map.put("result", ""); map.put("requestPK", param.getRequestPK()); return map; } }catch (Exception e){ } CreateInTaskParam createInTaskParam = new CreateInTaskParam(); createInTaskParam.setTaskNo(param.getRequestPK()); createInTaskParam.setDestLoc(getWMStoWCSLocNo(param.getToPos())); createInTaskParam.setOriginSite("100"); createInTaskParam.setBarcode(param.getContNo()); createInTaskParam.setPriority(Integer.valueOf(param.getTrkPrty())); createInTaskParam.setEndSite(param.getToPos()); R inTask = null; try { inTask = createInTask(createInTaskParam); @@ -222,25 +311,7 @@ map.put("requestPK", param.getRequestPK()); } } } else if (outlist.contains(param.getTrkType())) { // try { // AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam(); // getOutRequestParam(agvTaskCreateParam,param); // boolean httpRequest = doHttpRequest(agvTaskCreateParam, "172.18.16.94:8001", "/api/robot/controller/task/submit"); // if (!httpRequest){ // map.put("success", "0"); // map.put("message", "转发AGV任务出错"); // map.put("result", ""); // map.put("requestPK", param.getRequestPK()); // return map; // } // }catch (Exception e){ // map.put("success", "0"); // map.put("message", "转发AGV任务出错"); // map.put("result", ""); // map.put("requestPK", param.getRequestPK()); // return map; // } } else if (param.getFrmPos().substring(0,6).equals(loc) && param.getToPos().substring(0,4).equals(sta)) { CreateOutTaskParam createOutTaskParam = new CreateOutTaskParam(); createOutTaskParam.setTaskNo(param.getRequestPK()); createOutTaskParam.setOriginLoc(getWMStoWCSLocNo(param.getFrmPos())); @@ -248,6 +319,7 @@ createOutTaskParam.setDestSite("100"); createOutTaskParam.setPriority(Integer.valueOf(param.getTrkPrty())); createOutTaskParam.setEndSite(param.getToPos()); createOutTaskParam.setZpallet(param.getContNo()); R outTask = null; try { outTask = createOutTask(createOutTaskParam); @@ -270,6 +342,26 @@ map.put("result", ""); map.put("requestPK", param.getRequestPK()); } } } else if (param.getFrmPos().substring(0,4).equals(sta) && param.getToPos().substring(0,4).equals(sta)) { try { AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam(); getTransmitRequestParam(agvTaskCreateParam,param); String httpRequest = doHttpRequest(agvTaskCreateParam, "172.18.16.248:443", "/rcs/rtas/api/robot/controller/task/submit"); if (!httpRequest.equals("SUCCESS")){ map.put("success", "0"); map.put("message", httpRequest); map.put("result", ""); map.put("requestPK", param.getRequestPK()); return map; } }catch (Exception e){ map.put("success", "0"); map.put("message", "转发AGV任务出错"); map.put("result", ""); map.put("requestPK", param.getRequestPK()); return map; } }else { @@ -307,9 +399,28 @@ agvTaskCreateParam.setCarrierInfo(carrierInfoParam); } private boolean doHttpRequest(AgvTaskCreateParam requestParam, String url, String path){ private void getTransmitRequestParam(AgvTaskCreateParam agvTaskCreateParam,CreateWcsTaskParam param){ List<AgvTaskCreateParam.AgvTaskParam> agvTaskParamList = Arrays.asList( //起始位 new AgvTaskCreateParam.AgvTaskParam("SITE",param.getFrmPos(),0,1), //目标位 new AgvTaskCreateParam.AgvTaskParam("SITE",param.getToPos(),1,1) ); List<AgvTaskCreateParam.carrierInfoParam> carrierInfoParam = Arrays.asList( //起始位 new AgvTaskCreateParam.carrierInfoParam() ); agvTaskCreateParam.setTaskType("F01"); agvTaskCreateParam.setInitPriority(param.getTrkPrty()); agvTaskCreateParam.setRobotTaskCode(param.getRequestPK()); agvTaskCreateParam.setTargetRoute(agvTaskParamList); agvTaskCreateParam.setCarrierInfo(carrierInfoParam); } private String doHttpRequest(AgvTaskCreateParam requestParam, String url, String path){ String response = ""; boolean success = false; String success = "error"; Map<String, Object> map = new HashMap<>(); map.put("Content-Type", "application/json;charset=UTF-8"); map.put("X-lr-request-id", requestParam.getRobotTaskCode()); @@ -328,7 +439,9 @@ String code = jsonObject.get("code").toString(); if(code.equals("SUCCESS")){ success = true; success = "SUCCESS"; }else { success = jsonObject.get("message").toString(); } log.info("转发agv任务:请求体:"+JSONObject.toJSONString(requestParam)+",返回值:"+jsonObject); }catch (Exception e){ @@ -447,6 +560,7 @@ task.setShuttleNo(null);//等待主线程分配小车 task.setRecordLoc("Y");//记录库存信息 task.setHostId(hostId);//临时控制只允许host为1 task.setMemo(param.getEndSite()); boolean result = taskService.save(task); if (!result) { @@ -582,6 +696,7 @@ task.setShuttleNo(null);//等待主线程分配小车 task.setRecordLoc("Y");//记录库存信息 task.setHostId(hostId);//临时控制只允许host为1 task.setZpallet(param.getZpallet()); boolean result = taskService.save(task); if (!result) { zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/CreateInTaskParam.java
@@ -23,4 +23,7 @@ //条码 private String barcode; //终点 private String endSite; } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/CreateOutTaskParam.java
@@ -21,5 +21,7 @@ private Integer priority; //agv放货站 private String endSite; //托盘码 private String zpallet; } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ReturnWcsTaskStatisParam.java
New file @@ -0,0 +1,19 @@ package com.zy.asrs.wcs.core.domain.param; import lombok.Data; import java.util.Date; @Data public class ReturnWcsTaskStatisParam { private String requestPK; private String trkId; private String trkType; private String contNo; private String curPos; private String isFull; private String code; private String result; private String operator; private Long operationTime; } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/TaskStsType.java
@@ -4,6 +4,9 @@ public enum TaskStsType { OUT_TASK_OVER(1001,"出库任务完成"), OUT_TASK_OVER_HAND(999,"出库任务完成"), NEW_INBOUND(1, "生成入库任务"), ANALYZE_INBOUND(2, "入库任务解析"), EXECUTE_INBOUND(3, "执行入库任务"), zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java
@@ -4,8 +4,10 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.common.utils.HttpHandler; import com.zy.asrs.framework.common.Cools; import com.zy.asrs.wcs.core.domain.param.AgvTaskCreateParam; import com.zy.asrs.wcs.core.domain.param.CreateWcsTaskParam; import com.zy.asrs.wcs.core.domain.param.ReturnWcsTaskStatisParam; import com.zy.asrs.wcs.core.entity.*; import com.zy.asrs.wcs.core.model.enums.LocStsType; import com.zy.asrs.wcs.core.model.enums.TaskStsType; @@ -35,6 +37,7 @@ @Autowired private BasConveyorStaService basConveyorStaService; //出库转发agv @Scheduled(cron = "0/1 * * * * ? ") @Transactional public synchronized void sendOutTaskToAgv() { @@ -59,6 +62,15 @@ .eq(Task::getStatus, 1) .in(Task::getTaskSts, taskSts)); for (Task task : tasks) { if (Cools.isEmpty(task.getMemo())){ task.setTaskSts(999L); taskService.updateById(task); continue; }else if (task.getMemo().equals("06YZ0001")){ task.setTaskSts(1001L); taskService.updateById(task); continue; } if (task.getTaskNo().equals(basConveyorSta.getTaskNo().toString())) { AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam(); getOutRequestParam(agvTaskCreateParam,task); @@ -128,7 +140,7 @@ public synchronized void clearCompletedTask() { ArrayList<Long> taskSts = new ArrayList<>(); taskSts.add(TaskStsType.COMPLETE_INBOUND.sts); // taskSts.add(TaskStsType.COMPLETE_OUTBOUND.sts); taskSts.add(TaskStsType.OUT_TASK_OVER.sts); taskSts.add(TaskStsType.COMPLETE_CHARGE.sts); taskSts.add(TaskStsType.COMPLETE_MOVE.sts); taskSts.add(TaskStsType.COMPLETE_MANUAL.sts); @@ -138,10 +150,40 @@ .eq(Task::getStatus, 1) .in(Task::getTaskSts, taskSts)); for (Task task : tasks) { HashMap<String, String> mesMap = new HashMap<>(); mesMap.put("taskNo", task.getWmsTaskNo()); mesMap.put("contNo",task.getZpallet()); boolean returnTask4 = toMesHttpRequest(mesMap, "172.18.231.126", "/api/wcs/wcsTaskInfo", "4",task.getMemo()); if (returnTask4){ //记录库存信息 updateRecordLoc(task); //任务转历史档 saveTaskLog(task); }else { log.error("任务完成后返回mes失败"); } } } @Scheduled(cron = "0/1 * * * * ? ") @Transactional public synchronized void clearCompletedTask999() { ArrayList<Long> taskSts = new ArrayList<>(); taskSts.add(TaskStsType.OUT_TASK_OVER_HAND.sts); List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() .eq(Task::getStatus, 1) .in(Task::getTaskSts, taskSts)); for (Task task : tasks) { //记录库存信息 updateRecordLoc(task); //任务转历史档 saveTaskLog(task); } } @@ -200,4 +242,37 @@ motionService.remove(new LambdaQueryWrapper<Motion>().eq(Motion::getTaskNo, task.getTaskNo()).eq(Motion::getHostId, task.getHostId())); } private boolean toMesHttpRequest(Map<String,String> map, String url, String path, String code,String localtion){ Date now = new Date(); long time = now.getTime()/1000; ReturnWcsTaskStatisParam returnWcsTaskStatisParam = new ReturnWcsTaskStatisParam(); returnWcsTaskStatisParam.setRequestPK(map.get("taskNo")); returnWcsTaskStatisParam.setTrkId(map.get("taskNo")); returnWcsTaskStatisParam.setContNo(map.get("contNo")); returnWcsTaskStatisParam.setCode(code); returnWcsTaskStatisParam.setOperator("wcs"); returnWcsTaskStatisParam.setOperationTime(time); returnWcsTaskStatisParam.setTrkType("01"); returnWcsTaskStatisParam.setCurPos(localtion); String response = ""; boolean success = false; try { response = new HttpHandler.Builder() .setUri(url) .setPath(path) .setJson(JSONObject.toJSONString(returnWcsTaskStatisParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); String code1 = jsonObject.get("success").toString(); if(code1.equals("1")){ success = true; } }catch (Exception e){ return success; } return success; } }