From 9640507cfd9e5aa8d98bff3f7d36bd4115c27c1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=80=A1=E8=93=89?= <377046077@qq.com> Date: Thu, 25 Sep 2025 11:17:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=A7=E7=BA=BF=E8=BE=93=E9=80=81=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/api/service/IApiService.java | 2 +- .../api/service/impl/ApiServiceImpl.java | 10 +-- .../ruoyi/device/ssj/domain/DeviceSsj.java | 3 + .../ssj/floor2/Floor2InSsjThread.java | 69 +++++++++++++++++- .../ssj/floor2/Floor2OutSsjThread.java | 73 ++++++++++++++++--- .../ssj/floor2/LineSsjThread.java | 2 + 6 files changed, 138 insertions(+), 21 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java index 04e3da7..2d4b0ea 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IApiService.java @@ -56,7 +56,7 @@ public interface IApiService * @param wmsTaskType 1-入库 2-出库 3-agv搬运 * @return */ - public AgvQueue createAgvQueue(String code1,String code2,String wmsTrayCode,String wmsTaskNo,String wmsTaskType,String traySize); + public AgvQueue createAgvQueue(String code1,String code2,String wmsTrayCode,String taskCode,String wmsTaskType,String traySize,String wmsTaskNo); /** * 取消AGV任务 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java index 75873a8..10d54a9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ApiServiceImpl.java @@ -151,8 +151,9 @@ public class ApiServiceImpl implements IApiService { String startPoint = param.get("startPoint"); String endPoint = param.get("endPoint"); String traySize = param.get("traySize"); + String wmsTaskNo = param.get("wmstaskNo"); - AgvQueue agvQueue = createAgvQueue(startPoint,endPoint, param.get("trayCode"), param.get("taskNo"), "1",traySize); + AgvQueue agvQueue = createAgvQueue(startPoint,endPoint, param.get("trayCode"), param.get("taskNo"), "1",traySize,wmsTaskNo); GenAgvSchedulingTaskResponse genAgvSchedulingTaskResponse = requestAgvQueue(agvQueue); if (genAgvSchedulingTaskResponse.getCode() == 0) { return AjaxResult.success(); @@ -327,11 +328,11 @@ public class ApiServiceImpl implements IApiService { * @return */ @Override - public AgvQueue createAgvQueue(String code1,String code2,String wmsTrayCode,String wmsTaskNo,String wmsTaskType,String traySize) { + public AgvQueue createAgvQueue(String code1,String code2,String wmsTrayCode,String taskCode,String wmsTaskType,String traySize,String wmsTaskNo) { //生成ctu执行队列 AgvQueue agvQueue = new AgvQueue(); String reqCode = IdUtil.fastSimpleUUID(); - String taskCode = IdUtil.fastSimpleUUID(); +// String taskCode = IdUtil.fastSimpleUUID(); agvQueue.setReqCode(reqCode); agvQueue.setReqTime(DateUtil.formatDateTime(DateUtil.date())); agvQueue.setAgvType("AGV"); @@ -403,10 +404,9 @@ public class ApiServiceImpl implements IApiService { genAgvSchedulingTaskRequest.setCtnrCode("0"); genAgvSchedulingTaskRequest.setCtnrNum("0"); genAgvSchedulingTaskRequest.setTaskMode("0"); - genAgvSchedulingTaskRequest.setTaskCode(agvQueue.getWmsTaskNo()); + genAgvSchedulingTaskRequest.setTaskCode(agvQueue.getTaskCode()); genAgvSchedulingTaskRequest.setAgvTyp("AGV"); genAgvSchedulingTaskRequest.setPositionSelStrategy("0"); - genAgvSchedulingTaskRequest.setTaskCode(agvQueue.getTaskCode()); List positionCodePath = new ArrayList<>(); positionCodePath.add(new PositionCodeData(agvQueue.getPositionCode1(), "0")); positionCodePath.add(new PositionCodeData(agvQueue.getPositionCode2(), "0")); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/domain/DeviceSsj.java b/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/domain/DeviceSsj.java index f054af5..2e4b9fb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/domain/DeviceSsj.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/domain/DeviceSsj.java @@ -78,6 +78,9 @@ public class DeviceSsj extends BaseEntity @Excel(name = "托盘尺寸") private int traySize; + @Excel(name="允许放货") + private int allowPut; + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/floor2/Floor2InSsjThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/floor2/Floor2InSsjThread.java index 5e62c7e..28fa84b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/floor2/Floor2InSsjThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/floor2/Floor2InSsjThread.java @@ -5,18 +5,24 @@ import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import com.ruoyi.api.domain.agv.genAgvSchedulingTask.GenAgvSchedulingTaskResponse; import com.ruoyi.api.service.IApiService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.domain.SendData; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.job.domain.MydoJob; +import com.ruoyi.job.service.IMydoJobService; import com.ruoyi.queue.agv.domain.AgvQueue; import com.ruoyi.queue.agv.service.IAgvQueueService; import com.ruoyi.device.ssj.domain.DeviceSsj; import com.ruoyi.schedule.plcRead.ssj.PlcSsjRead; +import com.ruoyi.schedule.plcRead.util.Tools; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import static com.ruoyi.common.TaskStatusCode.TASK_EP_SSJ; + /** * 二楼出入口输送线线程 */ @@ -27,6 +33,7 @@ public class Floor2InSsjThread implements Runnable { private IApiService apiService; private IAgvQueueService agvQueueService; + private IMydoJobService mydoJobService; public boolean isRun = true; @@ -39,6 +46,7 @@ public class Floor2InSsjThread implements Runnable { ssjCodeList.put("inout", ssjCodes); apiService = SpringUtils.getBean(IApiService.class); agvQueueService = SpringUtils.getBean(IAgvQueueService.class); + mydoJobService = SpringUtils.getBean(IMydoJobService.class); log.info("初始化服务 {},{}", apiService, agvQueueService); } @@ -80,17 +88,70 @@ public class Floor2InSsjThread implements Runnable { //如果输送机空闲 if (inSsjDevice.getKx() == 1) { AgvQueue agvQueue = new AgvQueue(); - agvQueue.setStatus("6"); + agvQueue.setStatus("5"); agvQueue.setPositionCode2(inSsjDevice.getDeviceCode()); List agvQueues = agvQueueService.selectAgvQueueList(agvQueue); - if(agvQueues.size()!=0){ + //不允许放货 + if(agvQueues.size()!=0 && inSsjDevice.getAllowPut()==0){ //如果有这个输送机口的agv队列并请求放货(状态为6) - - + int i = writeToSsj(inSsjDevice.getPlcDbWriteAddress(),"0",Integer.valueOf(agvQueues.get(0).getCtnrType()),1); + if(i==1){ + log.info(inSsjDevice.getDeviceCode()+"输送机下发请求放货成功"); + } + } + //允许放货 + if(agvQueues.size()!=0 && inSsjDevice.getAllowPut()==1 ){ + log.info("设备:{} 位置:{} 任务号:{} 请求放货成功", inSsjDevice.getDeviceCode(), "输送线", agvQueues.get(0).getTaskCode()); + AjaxResult ajaxResult = apiService.continueTask(agvQueues.get(0)); + if(ajaxResult.isSuccess()) { + agvQueues.get(0).setStatus("6"); + agvQueueService.updateAgvQueue(agvQueues.get(0)); + } } + } +//入库下发输送线 + if(inSsjDevice.getKx()==0 && inSsjDevice.getTaskNo()==0){ + AgvQueue agvQueue = new AgvQueue(); + agvQueue.setStatus("7"); + agvQueue.setPositionCode2(inSsjDevice.getDeviceCode()); + List agvQueues = agvQueueService.selectAgvQueueList(agvQueue); + int i=writeToSsj(inSsjDevice.getPlcDbWriteAddress(),agvQueue.getWmsTaskNo(),1,1); + if(i==1){ + log.info(inSsjDevice.getDeviceCode()+"输送机下发任务号成功"); + MydoJob mydoJob = mydoJobService.selectMydoJobByJobId(agvQueues.get(0).getTaskCode()); + mydoJob.setExecutionPhase(TASK_EP_SSJ); + mydoJobService.updateMydoJob(mydoJob); + agvQueueService.insertHistory(agvQueues.get(0).getReqCode()); + agvQueueService.deleteAgvQueueByReqCode(agvQueues.get(0).getReqCode()); + } } +//出库到位 + if(inSsjDevice.getDw()==1 && inSsjDevice.getTaskNo()>0){ + MydoJob mydoJob = new MydoJob(); + mydoJob.setInOut("2"); + mydoJob.setStatus("3"); + mydoJob.setExitId(inSsjDevice.getDeviceCode()); + List mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob); + if(mydoJobs.size()>0){ + log.info("设备:{} 位置:{} 任务号:{} 出库到位", inSsjDevice.getDeviceCode(), "输送线", mydoJobs.get(0).getTaskNo()); + mydoJobService.insertHistory(mydoJobs.get(0).getJobId()); + mydoJobService.deleteMydoJobByJobId(mydoJobs.get(0).getJobId()); + } + } + } + + private static int writeToSsj(String address,String taskNo,int qx,int completed) { + + int jym = Tools.getJYM(Integer.parseInt(taskNo), qx, 1); + SendData taskNoSendData = new SendData(Tools.INT, taskNo); + SendData qxSendData = new SendData(Tools.INT,qx); + SendData completedSendData = new SendData(Tools.INT, completed); + SendData jymSendData = new SendData(Tools.INT, jym); + byte[] bytes = Tools.sendData(taskNoSendData, qxSendData, completedSendData, jymSendData); + int i = PlcSsjRead.WriteToSSJ(address, bytes); + return i; } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/floor2/Floor2OutSsjThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/floor2/Floor2OutSsjThread.java index df40627..46ed46e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/floor2/Floor2OutSsjThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/floor2/Floor2OutSsjThread.java @@ -1,15 +1,28 @@ package com.ruoyi.schedule.scheduleTask.ssj.floor2; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjUtil; import com.ruoyi.api.service.IApiService; +import com.ruoyi.bas.cargospace.domain.BasCargoSpace; +import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService; import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.job.domain.MydoJob; +import com.ruoyi.job.service.IMydoJobService; import com.ruoyi.queue.agv.service.IAgvQueueService; import com.ruoyi.device.ssj.domain.DeviceSsj; +import com.ruoyi.queue.ddj.domain.DdjDeviceExecutionQueue; +import com.ruoyi.queue.ddj.service.IDdjDeviceExecutionQueueService; import com.ruoyi.schedule.plcRead.ssj.PlcSsjRead; import lombok.extern.slf4j.Slf4j; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.util.*; + +import static com.ruoyi.common.TaskStatusCode.*; +import static com.ruoyi.common.TaskType.DDJ_RWLX_1; +import static com.ruoyi.common.TaskType.DDJ_RWLX_3; /** * 二楼出库线程 检测当前巷道有没有入库作业,没有作业,生成堆垛机出库队列 @@ -18,10 +31,12 @@ import java.util.List; public class Floor2OutSsjThread implements Runnable { public HashMap> ssjCodeList; - + private final Map> roadwayMap = new HashMap<>(); private IApiService apiService; private IAgvQueueService agvQueueService; - + private IMydoJobService mydoJobService; + private IBasCargoSpaceService basCargoSpaceService; + private IDdjDeviceExecutionQueueService ddjDeviceExecutionQueueService; public boolean isRun = true; @@ -33,6 +48,12 @@ public class Floor2OutSsjThread implements Runnable { ssjCodeList.put("roadwayssj", ssjCodes); apiService = SpringUtils.getBean(IApiService.class); agvQueueService = SpringUtils.getBean(IAgvQueueService.class); + mydoJobService = SpringUtils.getBean(IMydoJobService.class); + basCargoSpaceService = SpringUtils.getBean(IBasCargoSpaceService.class); + ddjDeviceExecutionQueueService = SpringUtils.getBean(IDdjDeviceExecutionQueueService.class); + //初始化巷道口 排 列 层 + roadwayMap.put("L1002", Arrays.asList(1, 1, 1)); + roadwayMap.put("L1004", Arrays.asList(1, 1, 1)); log.info("初始化服务 {},{}", apiService, agvQueueService); } @@ -70,14 +91,44 @@ public class Floor2OutSsjThread implements Runnable { } - public void inDispatch(DeviceSsj inSsjDevice) { - //如果入库请求1 并且 托盘码不为空 - if (inSsjDevice.getDw() == 1 && inSsjDevice.getTaskNo() > 0 && inSsjDevice.getRkqq() == 1) { - //查询货位 排列层 + public void inDispatch(DeviceSsj roadSsjDevice) { + //如果到位,且任务号大于0 + if (roadSsjDevice.getDw()==1 && roadSsjDevice.getTaskNo()>0) { + MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(roadSsjDevice.getTaskNo())); + if (ObjUtil.isNotNull(mydoJob) && mydoJob.getExecutionPhase().equals(TASK_EP_SSJ)) { + mydoJob.setExecutionPhase(TASK_EP_ROADWAY_SSJ); + mydoJobService.updateMydoJob(mydoJob); + } + if (ObjUtil.isNotNull(mydoJob) && mydoJob.getExecutionPhase().equals(TASK_EP_ROADWAY_SSJ)) { + List ddjDeviceExecutionQueues = ddjDeviceExecutionQueueService.selectDdjDeviceExecutionQueueListByRwlx(DDJ_RWLX_1, Convert.toInt(mydoJob.getRoadwayId())); + BasCargoSpace basCargoSpace = basCargoSpaceService.selectBasCargoSpaceByWmsCargoSpaceId(mydoJob.getCargoSpaceId()); + List pclList = roadwayMap.get(roadSsjDevice.getDeviceCode()); + if (CollUtil.isEmpty(ddjDeviceExecutionQueues) && ObjUtil.isNotNull(basCargoSpace) && CollUtil.isNotEmpty(pclList)) { + DdjDeviceExecutionQueue ddjDeviceExecutionQueue = new DdjDeviceExecutionQueue(); + ddjDeviceExecutionQueue.setUuid(IdUtil.simpleUUID()); + ddjDeviceExecutionQueue.setRwh(Convert.toLong(mydoJob.getTaskNo())); + ddjDeviceExecutionQueue.setDevName(mydoJob.getRoadwayId()); + ddjDeviceExecutionQueue.setDevId(Convert.toInt(mydoJob.getRoadwayId())); + ddjDeviceExecutionQueue.setRwzt(0); + ddjDeviceExecutionQueue.setYph(pclList.get(0)); + ddjDeviceExecutionQueue.setYlh(pclList.get(1)); + ddjDeviceExecutionQueue.setYch(pclList.get(2)); + ddjDeviceExecutionQueue.setMbph(Convert.toInt(basCargoSpace.getThePlatoon())); + ddjDeviceExecutionQueue.setMblh(Convert.toInt(basCargoSpace.getTheColumn())); + ddjDeviceExecutionQueue.setMbch(Convert.toInt(basCargoSpace.getTheFloor())); + ddjDeviceExecutionQueue.setDdjxf("0"); + ddjDeviceExecutionQueue.setMlfs(5); + ddjDeviceExecutionQueue.setScsj(DateUtil.formatDateTime(DateUtil.date())); + ddjDeviceExecutionQueue.setRwlx(DDJ_RWLX_3); + ddjDeviceExecutionQueueService.insertDdjDeviceExecutionQueue(ddjDeviceExecutionQueue); + + mydoJob.setExecutionPhase(TASK_EP_DDJ); + mydoJobService.updateMydoJob(mydoJob); + } + + } - //查询入口 排列层 - //生成堆垛机队列 } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/floor2/LineSsjThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/floor2/LineSsjThread.java index 1b8980a..134aa07 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/floor2/LineSsjThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/floor2/LineSsjThread.java @@ -48,6 +48,7 @@ public class LineSsjThread implements Runnable { inSsjList.add("L1012"); apiService = SpringUtils.getBean(IApiService.class); agvQueueService = SpringUtils.getBean(IAgvQueueService.class); + mydoJobService = SpringUtils.getBean(IMydoJobService.class); log.info("初始化服务 {},{}", apiService, agvQueueService); } @@ -225,6 +226,7 @@ public class LineSsjThread implements Runnable { paramMap.put("startPoint", "G1005"); paramMap.put("endPoint", deviceCode); paramMap.put("traySize",String.valueOf(SsjDevice.getTraySize())); + paramMap.put("wmstaskNo",mydoJob.getTaskNo()); AjaxResult ajaxResult = apiService.receiveAgvMoveJob(paramMap); if (ajaxResult.isSuccess()) { mydoJob.setStatus("3");