src/main/java/com/zy/asrs/controller/OpenController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/domain/param/ApplyInDevpDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/OpenService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -2,15 +2,14 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.annotations.AppAuth; import com.core.common.BaseRes; import com.core.common.Cools; import com.core.common.R; import com.core.exception.CoolException; import com.zy.asrs.domain.param.ApplyInDevpDto; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.CrnStatusParam; import com.zy.asrs.entity.param.TaskCreateParam; import com.zy.asrs.entity.param.TaskOverParam; import com.zy.asrs.entity.param.WMSAndAGVInterfaceParam; import com.zy.asrs.service.*; import com.zy.common.web.BaseController; @@ -20,11 +19,8 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Slf4j @RestController @@ -55,55 +51,6 @@ private LocMastService locMastService; @Autowired private BasCrnErrorService basCrnErrorService; public static <T> List<T> convertListMapToListObject(List<HashMap<String, Object>> listMap, Class<T> clazz) throws Exception { List<T> list = new ArrayList<>(); for (Map<String, Object> map : listMap) { T obj = clazz.getDeclaredConstructor().newInstance(); for (Map.Entry<String, Object> entry : map.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); try { Field field = clazz.getDeclaredField(key); field.setAccessible(true); setFieldValue(obj, field, value); } catch (NoSuchFieldException e) { System.out.println("No such field: " + key + " in class " + clazz.getName()); } } list.add(obj); } return list; } private static void setFieldValue(Object obj, Field field, Object value) throws IllegalAccessException { Class<?> fieldType = field.getType(); if (fieldType.isAssignableFrom(value.getClass())) { field.set(obj, value); } else if (fieldType == int.class || fieldType == Integer.class) { field.set(obj, ((Number) value).intValue()); } else if (fieldType == long.class || fieldType == Long.class) { field.set(obj, ((Number) value).longValue()); } else if (fieldType == double.class || fieldType == Double.class) { field.set(obj, ((Number) value).doubleValue()); } else if (fieldType == float.class || fieldType == Float.class) { field.set(obj, ((Number) value).floatValue()); } else if (fieldType == boolean.class || fieldType == Boolean.class) { field.set(obj, (Boolean) value); } else if (fieldType == String.class) { field.set(obj, String.valueOf(value)); } else { System.out.println("Unsupported field type: " + fieldType.getName()); } } //创建任务 @PostMapping("/taskCreate") @@ -247,45 +194,6 @@ return R.ok(crnStatusParams); } //取放货申请 @PostMapping("/pick/and/place/v1") @AppAuth(memo = "agv取放货申请") public R getAgvPickAndPlaceV1(@RequestHeader String appkey, @RequestBody TaskOverParam param, HttpServletRequest request) { auth(appkey, param, request); if (Cools.isEmpty(param)) { return R.parse(BaseRes.PARAM); } if (Cools.isEmpty(param.getStartPoint())) { return R.error("码头[staNo]不能为空"); } if (Cools.isEmpty(param.getType())) { return R.error("类型[type]不能为空"); } return openService.getAgvPickAndPlaceV1(param); } //取放货完成反馈 @PostMapping("/pick/and/place/v2") @AppAuth(memo = "agv取放货完成反馈") public R getAgvPickAndPlaceV2(@RequestHeader String appkey, @RequestBody TaskOverParam param, HttpServletRequest request) { auth(appkey, param, request); if (Cools.isEmpty(param)) { return R.parse(BaseRes.PARAM); } if (Cools.isEmpty(param.getStartPoint())) { return R.error("码头[staNo]不能为空"); } if (Cools.isEmpty(param.getType())) { return R.error("类型[type]不能为空"); } return openService.getAgvPickAndPlaceV2(param); } private void auth(String appkey, Object obj, HttpServletRequest request) { log.info("{}接口被访问;appkey:{};请求数据:{}", request.getServletPath(), appkey, JSON.toJSONString(obj)); request.setAttribute("cache", obj); @@ -314,6 +222,7 @@ @GetMapping("/queryTaskCommand") public R queryTaskCommand(@RequestHeader String appkey, @RequestParam String taskNo, HttpServletRequest request) { auth(appkey, taskNo, request); TaskWrk taskWrk = taskWrkService.selectByTaskNo(taskNo); @@ -325,188 +234,13 @@ return R.ok().add(commandInfos); } // 外置输送线wms通知输送线流动,上报时候上报站点即可 @PostMapping("/applyInDevp") public R applyInDevp(@RequestHeader String appkey, @RequestBody ApplyInDevpDto param, HttpServletRequest request) { auth(appkey, param, request); return openService.applyInDevp(param); } //任务下发接口 // @PostMapping("/outboundTaskSend") // @Transactional // public HashMap<String, Object> outboundTaskSend(@RequestBody List<CarryParam> params) { // HashMap<String, Object> map = new HashMap<>(); // for (CarryParam param : params) { // if (Cools.isEmpty(param)) { // map.put("Code", "0"); // map.put("Msg", "参数为空!"); // return map; // } else if (Cools.isEmpty(param.getTaskNo())) { // map.put("Code", "0"); // map.put("Msg", "任务号为空!"); // return map; // } else if (Cools.isEmpty(param.getStereoscopicTaskType())) { // map.put("Code", "0"); // map.put("Msg", "任务类型为空!"); // return map; // } // String fusion = Utils.Fusion(param.getOriginalRowNo(), param.getOriginalFloorNo(), param.getOriginalColumnNo()); // param.setStartPoint(fusion); // LocMast locMast = locMastService.selectByLocNo(param.getStartPoint()); // if (Cools.isEmpty(locMast)) { // map.put("Code", "0"); // map.put("Msg", "初始库位无法找到!"); // return map; // } // // HashMap<String, Object> r = new HashMap<>(); // // if (param.getStereoscopicTaskType() == 2) { // //出库任务创建 // StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() // .eq("type_no", 2) // .eq("crn_no", locMast.getCrnNo()) // .eq("stn_no", param.getTerminalNo())); // if (Cools.isEmpty(staDesc)) { // map.put("Code", "0"); // map.put("Msg", "出库路径不存在!"); // return map; // } // r = openService.taskCreate(new TaskCreateParam(param, staDesc.getCrnNo())); // if (r.get("Code").equals("0")) { // return r; // } // } else if (param.getStereoscopicTaskType() == 3) { // String fusion1 = Utils.Fusion(param.getGoalRowNo(), param.getGoalFloorNo(), param.getGoalColumnNo()); // param.setTerminalNo(fusion1); // //移库任务创建 // r = openService.taskCreate(new TaskCreateParam(param, locMast.getCrnNo())); // if (r.get("Code").equals("0")) { // return r; // } // } // apiLogService.save("Wms任务下发接口" // , request.getRemoteAddr() + request.getRequestURI() // , "" // , request.getRemoteAddr() // , JSON.toJSONString(param) // , r.toString() // , true // ); // } // map.put("Code", "1"); // map.put("Msg", "ok"); // return map; // } //AGV请求入库码头接口 // @PostMapping("/targetWharfApply") // @AppAuth(memo = "AGV请求入库码头接口") // public R targetWharfApply(@RequestHeader String appkey, // @RequestBody WMSAndAGVInterfaceParam param, // HttpServletRequest request) throws IOException { // auth(appkey, param, request); // // if (Cools.isEmpty(param)) { // return R.error("参数为空!"); // } else if (Cools.isEmpty(param.getTaskNo())) { // return R.error("工作号为空!"); // } else if (Cools.isEmpty(param.getContainerCode())) { // return R.error("托盘编码为空!"); // } else if (Cools.isEmpty(param.getWharfSource())) { // return R.error("源码头为空!"); // } else if (Cools.isEmpty(param.getFreeWharfs()) || param.getFreeWharfs().size() == 0) { // return R.error("空闲的入库码头(AGV)为空!"); // } // R r = openService.AgvToWCSToWms(param); // apiLogService.save("AGV请求入库码头接口" // , request.getRemoteAddr() + request.getRequestURI() // , appkey // , request.getRemoteAddr() // , JSON.toJSONString(param) // , r.toString() // , true // ); // return r; // } // // //AGV请求动作接口 // @PostMapping("/agvTaskRequest") // @AppAuth(memo = "AGV请求动作接口") // public R agvTaskRequest(@RequestHeader String appkey, // @RequestBody WMSAndAGVInterfaceParam param, // HttpServletRequest request) { // auth(appkey, param, request); // if (Cools.isEmpty(param)) { // return R.error("参数为空!"); // } else if (Cools.isEmpty(param.getRequestType())) { // return R.error("请求类型为空!"); // } else if (Cools.isEmpty(param.getWharfCode())) { // return R.error("码头编号为空!"); // } // // Map<String, Integer> map = new HashMap<>(); // map.put("J-1102", 102); // map.put("J-1101", 101); // map.put("J-1103", 105); // map.put("J-1104", 106); // map.put("J-1105", 109); // map.put("J-1106", 110); // map.put("J-1107", 113); // map.put("J-1108", 114); // map.put("J-1109", 117); // map.put("J-1110", 118); // map.put("J-1111", 121); // map.put("J-1112", 122); // map.put("H-1102", 300); // map.put("H-1101", 305); // map.put("G-1102", 400); // map.put("G-1101", 405); //// StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() //// .eq("stn_desc", param.getWharfCode())); //// //// if (Cools.isEmpty(staDesc)){ //// return R.error("程序报错,未查询到站点"); //// } // if (Cools.isEmpty(map.get(param.getWharfCode()))) { // return R.error("未查询到站点"); // } // BasDevp basDevp = basDevpService.selectById(map.get(param.getWharfCode())); // if (basDevp.getAutoing().equals("Y") && (basDevp.getInEnable().equals("Y") || basDevp.getOutEnable().equals("Y"))) { // apiLogService.save("AGV请求入库码头接口" // , request.getRemoteAddr() + request.getRequestURI() // , appkey // , request.getRemoteAddr() // , JSON.toJSONString(param) // , R.ok().toString() // , true // ); // return R.ok("可入"); // } else { // apiLogService.save("AGV请求入库码头接口" // , request.getRemoteAddr() + request.getRequestURI() // , appkey // , request.getRemoteAddr() // , JSON.toJSONString(param) // , R.error("站点状态不可入").toString() // , true // ); // return R.error("站点状态不可入"); // } // // // } // @PostMapping("/toAgvTaskOver") // @AppAuth(memo = "agv任务完成接口") // public R getAgvTaskOver(@RequestHeader String appkey, // @RequestBody TaskOverParam param, // HttpServletRequest request) { // auth(appkey, param, request); // if (Cools.isEmpty(param)) { // return R.parse(BaseRes.PARAM); // } // if (Cools.isEmpty(param.getStartPoint())) { // return R.error("码头[wharfCode]不能为空"); // } // if (Cools.isEmpty(param.getStatus())) { // return R.error("完成标记[status]不能为空"); // } // openService.getAgvTaskOver(param); // return R.ok(); // } } src/main/java/com/zy/asrs/domain/param/ApplyInDevpDto.java
New file @@ -0,0 +1,23 @@ package com.zy.asrs.domain.param; import lombok.Data; /** * @author pang.jiabao * @description 通知输送线流动 * @createDate 2025/5/15 14:27 */ @Data public class ApplyInDevpDto { /** * 源站点 */ private Integer sourceSite; /** * 目标站点 */ private Integer targetSite; } src/main/java/com/zy/asrs/service/OpenService.java
@@ -1,11 +1,9 @@ package com.zy.asrs.service; import com.core.common.R; import com.zy.asrs.domain.param.ApplyInDevpDto; import com.zy.asrs.entity.param.TaskCreateParam; import com.zy.asrs.entity.param.TaskOverParam; import com.zy.asrs.entity.param.WMSAndAGVInterfaceParam; import java.io.IOException; import java.util.HashMap; public interface OpenService { @@ -13,11 +11,8 @@ //创建任务 HashMap<String, Object> taskCreate(TaskCreateParam param); R AgvToWCSToWms(WMSAndAGVInterfaceParam param) throws IOException; void getAgvTaskOver(TaskOverParam param); R getAgvPickAndPlaceV1(TaskOverParam param); R getAgvPickAndPlaceV2(TaskOverParam param); /** * 外置输送线wms通知输送线流动 */ R applyInDevp(ApplyInDevpDto param); } src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -1,25 +1,22 @@ package com.zy.asrs.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.R; import com.zy.asrs.domain.enums.TaskStatusType; import com.zy.asrs.domain.enums.WorkNoType; import com.zy.asrs.entity.*; import com.zy.asrs.domain.param.ApplyInDevpDto; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.LocMast; import com.zy.asrs.entity.TaskWrk; import com.zy.asrs.entity.param.TaskCreateParam; import com.zy.asrs.entity.param.TaskOverParam; import com.zy.asrs.entity.param.WMSAndAGVInterfaceParam; import com.zy.asrs.service.*; import com.zy.asrs.utils.Utils; import com.zy.common.service.CommonService; import com.zy.common.utils.HttpHandler; import com.zy.core.DevpThread; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.SlaveType; import com.zy.core.model.DevpSlave; import com.zy.core.model.Task; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.properties.SlaveProperties; @@ -27,22 +24,12 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.IOException; import java.util.*; import java.util.Date; import java.util.HashMap; @Service public class OpenServiceImpl implements OpenService { public ArrayList<String> wharfCode1 = new ArrayList<String>() {{ add("J-1101"); add("J-1103"); add("J-1105"); add("J-1107"); add("J-1109"); add("J-1111"); add("H-1101"); add("G-1101"); }}; @Autowired private TaskWrkService taskWrkService; @Autowired @@ -131,251 +118,27 @@ } @Override public R AgvToWCSToWms(WMSAndAGVInterfaceParam param) throws IOException { ToWmsDTO toWmsDTO = new ToWmsDTO(); Map<String, Object> map = new HashMap<>(); map.put("x-api-key", "7a15b5db-29b6-552c-8cff-0cfec3756da2"); List<Integer> list = new ArrayList<>(); if (param.getWharfSource().contains("J")) { list = getInEnableRoadway(); public R applyInDevp(ApplyInDevpDto param) { Integer sourceSite = param.getSourceSite(); BasDevp basDevp = basDevpService.selectById(sourceSite); if (basDevp == null) { return R.error("源站点不存在:" + param); } DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 2); StaProtocol staProtocol = devpThread.getStation().get(sourceSite); if (staProtocol == null) { return R.parse(sourceSite + "线程为空!"); } else { list = getInEnableRoadway2(); staProtocol = staProtocol.clone(); } //TaskWrk taskWrk = taskWrkService.selectByTaskNo(param.getTaskNo()); toWmsDTO.setWarehouseId("1688469798893297665"); toWmsDTO.setContainerCode(param.getContainerCode()); toWmsDTO.setApplyType("TUNNEL"); toWmsDTO.setWharfSource(null); toWmsDTO.setCanInboundTunnels(list); String response = null; try { response = new HttpHandler.Builder() .setHeaders(map) .setUri(wmsUrl) .setPath("wcsManager/wcsInterface/inboundTaskApply") .setJson(JSON.toJSONString(toWmsDTO)) .build() .doPost(); } catch (Exception e) { return R.error("wms连接失败" + e.getMessage()); } JSONObject jsonObject = JSON.parseObject(response); apiLogService.save("wms请求入库码头接口" , wmsUrl + "wcsManager/wcsInterface/inboundTaskApply" , null , "127.0.0.1" , JSON.toJSONString(toWmsDTO) , response , true ); if (jsonObject.getInteger("code").equals(200)) { //解析 List<WMSAndAGVInterfaceParam> params = new ArrayList<>(); params.add(param); WMSAndAGVInterfaceParam data = JSONObject.parseObject(jsonObject.get("data").toString(), WMSAndAGVInterfaceParam.class); String msg = null; try { taskCreate(new TaskCreateParam(data)); } catch (Exception e) { msg = e.getMessage(); } if (msg != null) { return R.error(msg); } Map<String, String> map1 = new HashMap<>(); StaDesc staDesc = new StaDesc(); if (param.getWharfSource().contains("J")) { staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() .eq("crn_no", data.getTaskTunnel()) .eq("type_no", 1) .lt("stn_no", 200)); } else if (param.getWharfSource().contains("H")) { staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() .eq("crn_no", data.getTaskTunnel()) .eq("type_no", 1) .lt("stn_no", 400) .gt("stn_no", 200)); } else { staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() .eq("crn_no", data.getTaskTunnel()) .eq("type_no", 1) .lt("stn_no", 500) .ge("stn_no", 400)); } map1.put("taskTunnel", staDesc.getStnDesc()); //map1.put("taskTunnel", "J-1104"); return R.ok(map1); } return R.error((String) jsonObject.get("msg")); } @Override public void getAgvTaskOver(TaskOverParam param) { // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() .eq("stn_desc", param.getStartPoint())); if (Cools.isEmpty(staDesc)) { throw new RuntimeException("未查询到站点信息"); } // 获取入库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(staDesc.getStnNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } Short workNo = staProtocol.getWorkNo(); if (wharfCode1.contains(param.getStartPoint())) { if (!staProtocol.isLoading() && !staProtocol.isCar() && staProtocol.getWorkNo() > 0) { //AGV出库完成以后 staProtocol.setWorkNo((short) 0); staProtocol.setStaNo((short) 0); boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol)); if (result) { } else { throw new RuntimeException("agv返回完成后,命令下发失败"); } } } else { for (DevpSlave.Sta inSta : devp.getInSta()) { if (inSta.getBackSta().equals(staDesc.getStnNo())) { if (staProtocol.isLoading() && !staProtocol.isCar() && workNo == 0) { //AGV入库完成以后 staProtocol.setWorkNo((short) 9999); staProtocol.setStaNo(inSta.getStaNo().shortValue()); boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol)); if (result) { } else { throw new RuntimeException("agv返回完成后,命令下发失败"); } } } } } } } @Override public R getAgvPickAndPlaceV1(TaskOverParam param) { BasDevp basDevp = basDevpService.selectById(param.getStartPoint()); if (Cools.isEmpty(basDevp)) { return R.error("站点号有误" + param.getStartPoint()); } if (Cools.isEmpty(param.getHeight())) { return R.error("高度不能为空" + param.getStartPoint()); } if (param.getType() == 0 && basDevp.getAgvStartPick() == 1) { basDevp.setInreq2(param.getHeight().toString()); return R.ok(); } else if (param.getType() == 1 && basDevp.getAgvStartPlace() == 1) { return R.ok(); staProtocol.setWorkNo((short) commonService.getWorkNo(WorkNoType.PICK.type)); staProtocol.setStaNo(param.getTargetSite().shortValue()); basDevpService.updateById(basDevp); boolean result = MessageQueue.offer(SlaveType.Devp, 2, new Task(2, staProtocol)); if (result) { return R.ok("成功"); } else { return R.error("不允许"); return R.error("下发命令失败:" + param); } } @Override public R getAgvPickAndPlaceV2(TaskOverParam param) { BasDevp basDevp = basDevpService.selectById(param.getStartPoint()); if (Cools.isEmpty(basDevp)) { return R.error("站点号有误" + param.getStartPoint()); } if (param.getType() == 0) { basDevp.setAgvTargetPick(1); basDevpService.updateById(basDevp); return R.ok(); } else if (param.getType() == 1) { basDevp.setAgvTargetPlace(1); basDevpService.updateById(basDevp); return R.ok(); } else { return R.error("请求类型异常" + param.getType()); } } public List<Integer> getInEnableRoadway() { int[] roadway = null; List<Integer> list = new ArrayList<>(); Map<Integer, Integer> map = new HashMap<>(); map.put(103, 1); map.put(107, 2); map.put(111, 3); map.put(115, 4); map.put(119, 5); map.put(123, 6); //put(301,7); // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { // 遍历入库口 for (DevpSlave.Sta inSta : devp.getInSta()) { // 获取入库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(inSta.getBackSta()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } Short workNo = staProtocol.getWorkNo(); if (workNo == 0 && !staProtocol.isLoading()) { if (Cools.isEmpty(map.get(inSta.getStaNo()))) { continue; } list.add(map.get(inSta.getStaNo())); } } } //roadway = list.stream().mapToInt(Integer::intValue).toArray(); return list; } public List<Integer> getInEnableRoadway2() { int[] roadway = null; List<Integer> list = new ArrayList<>(); Map<Integer, Integer> map = new HashMap<>(); map.put(205, 1); map.put(211, 2); map.put(217, 3); map.put(223, 4); map.put(229, 5); map.put(235, 6); //put(301,7); // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { // 遍历入库口 for (DevpSlave.Sta inSta : devp.getInSta()) { // 获取入库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(inSta.getBackSta()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } Short workNo = staProtocol.getWorkNo(); if (workNo == 0 && !staProtocol.isLoading()) { if (Cools.isEmpty(map.get(inSta.getStaNo()))) { continue; } list.add(map.get(inSta.getStaNo())); } } } //roadway = list.stream().mapToInt(Integer::intValue).toArray(); return list; } }