src/main/java/com/zy/asrs/controller/OpenController.java
@@ -7,6 +7,7 @@ import com.core.common.Cools; import com.core.common.R; import com.core.exception.CoolException; import com.zy.asrs.domain.enums.TaskStatusType; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.*; import com.zy.asrs.service.*; @@ -53,14 +54,33 @@ add("ea1f0459efc02a79f046f982767939ae"); }}; //agv上报 //AGV上报 @PostMapping("/agvReport") public R agvReport(@RequestBody HashMap<String, Object> param) { String taskCode = param.get("taskCode").toString(); System.out.println(JSON.toJSONString(param)); TaskWrk taskWrk = taskWrkService.selectByTaskNo(taskCode); if(taskWrk == null) { return R.error("任务不存在"); } taskWrk.setStatus(TaskStatusType.COMPLETE.id); taskWrk.setModiTime(new Date()); taskWrkService.updateById(taskWrk); return R.ok(); } //生成AGV任务 @PostMapping("/generateAgvTask") public R generateAgvTask(@RequestBody GenerateAgvTaskParam param) { boolean generated = openService.generateAgvTask(param); if(generated) { return R.ok(); } return R.error(); } //创建任务 @PostMapping("/taskCreate") @Transactional src/main/java/com/zy/asrs/domain/enums/WorkNoType.java
@@ -11,38 +11,13 @@ PICK(1), PAKOUT(2), OTHER(3), AGV(4), ; public Integer type; WorkNoType(Integer type) { this.type = type; } public static Integer getWorkNoType(Integer ioType) { switch (ioType) { case 1: return PAKIN.type; case 10: return PAKIN.type; case 11: return PICK.type; case 53: case 54: case 57: return PICK.type; case 101: return PAKOUT.type; case 103: case 104: case 107: return PICK.type; case 110: return PAKOUT.type; default: break; } throw new CoolException(ioType + "的任务类型无法生成工作号"); } } src/main/java/com/zy/asrs/entity/param/GenerateAgvTaskParam.java
New file @@ -0,0 +1,14 @@ package com.zy.asrs.entity.param; import lombok.Data; @Data public class GenerateAgvTaskParam { //取货点 private String originPoint; //放货点 private String targetPoint; } src/main/java/com/zy/asrs/entity/param/TaskCreateParam.java
@@ -1,6 +1,5 @@ package com.zy.asrs.entity.param; import io.swagger.models.auth.In; import lombok.Data; @Data src/main/java/com/zy/asrs/service/OpenService.java
@@ -1,5 +1,6 @@ package com.zy.asrs.service; import com.zy.asrs.entity.param.GenerateAgvTaskParam; import com.zy.asrs.entity.param.TaskCreateParam; import java.util.HashMap; @@ -9,4 +10,6 @@ //创建任务 HashMap<String,Object> taskCreate(TaskCreateParam param); boolean generateAgvTask(GenerateAgvTaskParam param); } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -6,6 +6,7 @@ import com.core.exception.CoolException; import com.zy.asrs.domain.enums.TaskStatusType; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.GenerateAgvTaskParam; import com.zy.asrs.mapper.*; import com.zy.asrs.service.*; import com.zy.common.utils.HttpHandler; @@ -57,11 +58,104 @@ private CommandInfoService commandInfoService; @Autowired private ApiLogService apiLogService; @Autowired private OpenService openService; @Value("${wcs.urlWcs}") private String wcsUrl; @Value("${wcs.inboundTaskApplyPathWcs}") private String wcsInboundTaskApplyPath; public synchronized void demo() { boolean demoEnable = false; Config demoEnableConfig = configService.selectByCode("demoEnable"); if(demoEnableConfig != null) { demoEnable = Boolean.parseBoolean(demoEnableConfig.getValue()); } if (!demoEnable) { return; } //演示模式-AGV出库 demoAgvOut(); //演示模式-AGV入库 demoAgvIn(); //演示模式-四向库出库 demoShuttleOut(); //演示模式-四向库入库 demoShuttleIn(); } //演示模式-AGV出库 private synchronized void demoAgvOut() { LocMast locMast = locMastService.selectByLocNo("1100601"); if(locMast == null) { return; } if (!locMast.getLocSts().equals("O")) { return; } List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>() .eq("mk", "agv") .eq("loc_sts", "F") .notIn("loc_no", "0900601") ); if (locMasts.isEmpty()) { return; } LocMast originLocMast = locMasts.get(0); //生成AGV出库任务 GenerateAgvTaskParam param = new GenerateAgvTaskParam(); param.setOriginPoint(originLocMast.getLocNo()); param.setTargetPoint(locMast.getLocNo()); openService.generateAgvTask(param); } //演示模式-AGV入库 private synchronized void demoAgvIn() { LocMast locMast = locMastService.selectByLocNo("0900601"); if(locMast == null) { return; } if (!locMast.getLocSts().equals("F")) { return; } List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>() .eq("mk", "agv") .eq("loc_sts", "O") .notIn("loc_no", "1100601") ); if (locMasts.isEmpty()) { return; } LocMast targetLocMast = locMasts.get(0); //生成AGV出库任务 GenerateAgvTaskParam param = new GenerateAgvTaskParam(); param.setOriginPoint(locMast.getLocNo()); param.setTargetPoint(targetLocMast.getLocNo()); openService.generateAgvTask(param); } //演示模式-四向库出库 private synchronized void demoShuttleOut() { } //演示模式-四向库入库 private synchronized void demoShuttleIn() { } /** * 堆垛机站出库到出库站 */ src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -2,9 +2,11 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.domain.enums.TaskStatusType; import com.zy.asrs.domain.enums.WorkNoType; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.GenerateAgvTaskParam; import com.zy.asrs.entity.param.TaskCreateParam; import com.zy.asrs.service.*; import com.zy.asrs.utils.Utils; @@ -91,4 +93,54 @@ return map; } @Override public boolean generateAgvTask(GenerateAgvTaskParam param) { Date now = new Date(); String originPoint = param.getOriginPoint(); String targetPoint = param.getTargetPoint(); LocMast startLocMast = locMastService.selectByLocNo(originPoint); if(startLocMast == null){ throw new CoolException("取货点库位不存在"); } if (!startLocMast.getLocSts().equals("F")) { throw new CoolException("取货点不处于在库"); } LocMast targetLocMast = locMastService.selectByLocNo(targetPoint); if(targetLocMast == null){ throw new CoolException("放货点库位不存在"); } if (!targetLocMast.getLocSts().equals("O")) { throw new CoolException("放货点不处于空库"); } TaskWrk taskWrk = new TaskWrk(); int workNo1 = commonService.getWorkNo(WorkNoType.AGV.type);//获取AGV工作号 taskWrk.setTaskNo(String.valueOf(workNo1));//任务号 taskWrk.setWrkNo(workNo1); taskWrk.setStatus(TaskStatusType.RECEIVE.id);//任务状态:接收 taskWrk.setCreateTime(now); taskWrk.setWrkSts(11); taskWrk.setIoType(4);//AGV搬运 taskWrk.setStartPoint(param.getOriginPoint());//取货点 taskWrk.setTargetPoint(param.getTargetPoint());//放货点 boolean insert = taskWrkService.insert(taskWrk); if (!insert) { throw new CoolException("任务生成失败"); } startLocMast.setLocSts("R"); startLocMast.setModiTime(now); locMastService.updateById(startLocMast); targetLocMast.setLocSts("S"); targetLocMast.setModiTime(now); locMastService.updateById(targetLocMast); return true; } } src/main/java/com/zy/asrs/task/AgvTaskLogScheduler.java
New file @@ -0,0 +1,77 @@ package com.zy.asrs.task; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.exception.CoolException; import com.zy.asrs.domain.enums.TaskStatusType; import com.zy.asrs.entity.LocMast; import com.zy.asrs.entity.TaskWrk; import com.zy.asrs.entity.TaskWrkLog; import com.zy.asrs.service.LocMastService; import com.zy.asrs.service.TaskWrkLogService; import com.zy.asrs.service.TaskWrkService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; @Slf4j @Component public class AgvTaskLogScheduler { @Autowired private TaskWrkService taskWrkService; @Autowired private TaskWrkLogService taskWrkLogService; @Autowired private LocMastService locMastService; /** * AGV任务转历史 */ @Scheduled(cron = "0/3 * * * * ? ") public void execute() { List<TaskWrk> taskWrkList = taskWrkService.selectList(new EntityWrapper<TaskWrk>() .eq("status", TaskStatusType.COMPLETE.id)); for (TaskWrk taskWrk : taskWrkList) { Date now = new Date(); String originPoint = taskWrk.getStartPoint(); String targetPoint = taskWrk.getTargetPoint(); LocMast startLocMast = locMastService.selectByLocNo(originPoint); if(startLocMast == null){ throw new CoolException("取货点库位不存在"); } if (!startLocMast.getLocSts().equals("R")) { throw new CoolException("取货点不处于出库预约"); } LocMast targetLocMast = locMastService.selectByLocNo(targetPoint); if(targetLocMast == null){ throw new CoolException("放货点库位不存在"); } if (!targetLocMast.getLocSts().equals("S")) { throw new CoolException("放货点不处于入库预约"); } startLocMast.setLocSts("O"); startLocMast.setModiTime(now); locMastService.updateById(startLocMast); targetLocMast.setLocSts("F"); targetLocMast.setModiTime(now); locMastService.updateById(targetLocMast); TaskWrkLog taskWrkLog = new TaskWrkLog(taskWrk); if (!taskWrkLogService.insert(taskWrkLog)) { throw new CoolException("转历史档失败" + taskWrkLog); } if (!taskWrkService.deleteById(taskWrk)) { throw new CoolException("任务档删除失败" + taskWrkLog); } } } } src/main/java/com/zy/asrs/task/AssignAgvTaskScheduler.java
New file @@ -0,0 +1,115 @@ package com.zy.asrs.task; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.zy.asrs.domain.enums.TaskStatusType; import com.zy.asrs.entity.LocMast; import com.zy.asrs.entity.TaskWrk; import com.zy.asrs.service.ApiLogService; import com.zy.asrs.service.LocMastService; import com.zy.asrs.service.TaskWrkService; import com.zy.common.utils.HttpHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @Slf4j @Component public class AssignAgvTaskScheduler { @Autowired private TaskWrkService taskWrkService; @Autowired private ApiLogService apiLogService; @Autowired private LocMastService locMastService; @Value("${agv.url}") private String agvUrl; @Value("${agv.applyTask}") private String agvApplyTask; /** * 自动派发AGV搬运任务 */ @Scheduled(cron = "0/3 * * * * ? ") public void execute() { List<TaskWrk> taskWrks = taskWrkService.selectList(new EntityWrapper<TaskWrk>() .eq("status", TaskStatusType.RECEIVE.id).eq("io_type", 4)); for (TaskWrk taskWrk : taskWrks) { String startPoint = taskWrk.getStartPoint(); String targetPoint = taskWrk.getTargetPoint(); LocMast startLocMast = locMastService.selectByLocNo(startPoint); if(startLocMast == null){ continue; } if (!startLocMast.getLocSts().equals("R")) { continue; } LocMast targetLocMast = locMastService.selectByLocNo(targetPoint); if(targetLocMast == null){ continue; } if (!targetLocMast.getLocSts().equals("S")) { continue; } HashMap<String, Object> requestParam = new HashMap<>(); requestParam.put("reqCode", taskWrk.getTaskNo()); requestParam.put("taskCode", taskWrk.getTaskNo()); requestParam.put("taskTyp", "YK"); ArrayList<HashMap<String, Object>> positionCodePathList = new ArrayList<>(); HashMap<String, Object> startPointParam = new HashMap<>(); startPointParam.put("positionCode", taskWrk.getStartPoint()); startPointParam.put("type", "00"); HashMap<String, Object> targetPointParam = new HashMap<>(); targetPointParam.put("positionCode", taskWrk.getTargetPoint()); targetPointParam.put("type", "00"); positionCodePathList.add(startPointParam); positionCodePathList.add(targetPointParam); requestParam.put("positionCodePath", positionCodePathList); String response = null; boolean requestStatus = false; try { log.info("WCS派发任务给AGV={}", taskWrk); response = new HttpHandler.Builder() .setUri(agvUrl) .setPath(agvApplyTask) .setJson(JSON.toJSONString(requestParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.get("code").equals("0")) { taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id); taskWrkService.updateById(taskWrk); requestStatus = true; } } catch (Exception e) { log.error("WCS派发任务给AGV失败{},返回值={}", taskWrk, response); } finally { apiLogService.save("WCS派发任务给AGV" , agvUrl + agvApplyTask , null , "127.0.0.1" , JSON.toJSONString(requestParam) , response , requestStatus ); } } } } src/main/java/com/zy/core/MainProcess.java
@@ -48,6 +48,9 @@ // 出库 ===>> 堆垛机出库站到出库站 mainService.crnStnToOutStn(); //演示模式 mainService.demo(); //自动派发任务 // mainService.autoDistribute(); //自动完成任务 src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -322,15 +322,17 @@ //外形检测 OperateResultExOne<byte[]> resultErr1 = siemensS7Net.Read("DB101.810.0", (short) (barcodeSize*1)); StaProtocol staProtocol1 = station.get(116); boolean[] status1 = siemensS7Net.getByteTransform().TransBool(resultErr1.Content, 0, 1); staProtocol1.setFrontErr(status1[0]); staProtocol1.setBackErr(status1[1]); staProtocol1.setHighErr(status1[2]); staProtocol1.setLeftErr(status1[3]); staProtocol1.setRightErr(status1[4]); staProtocol1.setWeightErr(status1[5]); staProtocol1.setBarcodeErr(status1[6]); if (resultErr1.IsSuccess) { StaProtocol staProtocol1 = station.get(116); boolean[] status1 = siemensS7Net.getByteTransform().TransBool(resultErr1.Content, 0, 1); staProtocol1.setFrontErr(status1[0]); staProtocol1.setBackErr(status1[1]); staProtocol1.setHighErr(status1[2]); staProtocol1.setLeftErr(status1[3]); staProtocol1.setRightErr(status1[4]); staProtocol1.setWeightErr(status1[5]); staProtocol1.setBarcodeErr(status1[6]); } OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.922.0", (short) (staNoSize * 4)); if (resultErr.IsSuccess) { src/main/resources/application.yml
@@ -69,3 +69,7 @@ outboundTaskRequest : openapi/createOutTask # 移库申请接口 movePathWcs: openapi/createLocMoveTask agv: url: 10.10.20.160:8181 applyTask: /rcms/services/rest/hikRpcService/genAgvSchedulingTask