From 741fe220d8d68e57c16c0d6d7c3f64796c498078 Mon Sep 17 00:00:00 2001 From: lsymicc Date: Tue, 28 Apr 2026 11:17:09 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8E=B0=E5=9C=BA=E6=8E=A5=E5=8F=A3=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E5=92=8C=E5=87=BA=E5=85=A5=E5=BA=93=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/service/impl/ApiServiceImpl.java | 22 +- .../service/impl/RequestLogServiceImpl.java | 23 +- .../main/java/com/ruoyi/common/Constant.java | 3 + .../main/java/com/ruoyi/common/ConvType.java | 19 ++ .../main/java/com/ruoyi/common/GoodsType.java | 22 ++ .../java/com/ruoyi/common/TaskStatusCode.java | 24 +- .../main/java/com/ruoyi/common/TaskType.java | 4 + .../com/ruoyi/common/WmsTaskTypeCode.java | 34 ++- .../ddj/controller/MsgDdjController.java | 171 +++++++------ .../ssj/controller/DeviceSsjController.java | 20 +- .../com/ruoyi/job/mapper/MydoJobMapper.java | 2 + .../ruoyi/job/service/IMydoJobService.java | 2 + .../job/service/impl/MydoJobServiceImpl.java | 26 +- .../mapper/DdjDeviceExecutionQueueMapper.java | 10 +- .../IDdjDeviceExecutionQueueService.java | 8 + .../DdjDeviceExecutionQueueServiceImpl.java | 4 + .../schedule/plcRead/ssj/PlcSsjRead.java | 1 + .../schedule/plcRead/util/ParseUtil.java | 2 +- .../schedule/scheduleTask/TaskHandler.java | 108 ++++++++- .../schedule/scheduleTask/ddj/DdjThread.java | 182 +++++++------- .../scheduleTask/ssj/PortConvThread.java | 224 ++++++++---------- .../scheduleTask/ssj/RoadConvThread.java | 19 +- .../resources/mapper/job/MydoJobMapper.xml | 12 +- .../queue/DdjDeviceExecutionQueueMapper.xml | 4 + .../ruoyi/common/core/domain/BaseEntity.java | 8 +- 25 files changed, 604 insertions(+), 350 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/common/ConvType.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/common/GoodsType.java 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 75daa40..f3194eb 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 @@ -19,12 +19,13 @@ import com.ruoyi.api.domain.agv.genAgvSchedulingTask.PositionCodeData; import com.ruoyi.api.domain.wcs2wms.JobParam; import com.ruoyi.api.domain.wcs2wms.ReceiveJob; import com.ruoyi.api.domain.wcs2wms.ResponseResult; +import com.ruoyi.api.domain.wcs2wms.exception.TaskExceptionReceive; import com.ruoyi.api.domain.wcs2wms.exception.TaskExceptionRequest; import com.ruoyi.api.domain.wcs2wms.stockout.StockoutReceive; import com.ruoyi.api.service.IApiService; -import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService; import com.ruoyi.bas.port.domain.WcsPort; import com.ruoyi.bas.port.service.IWcsPortService; +import com.ruoyi.common.GoodsType; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.job.domain.MydoJob; @@ -43,7 +44,8 @@ import java.util.List; import java.util.Map; import static com.ruoyi.common.Constant.*; -import static com.ruoyi.common.TaskStatusCode.TASK_EP_CREATE; +import static com.ruoyi.common.ConvType.CONV_STOCKOUT; +import static com.ruoyi.common.TaskStatusCode.TASK_EP_CREATED; /** * 接口记录Service业务层处理 @@ -278,13 +280,13 @@ public class ApiServiceImpl implements IApiService { if ("1".equals(requestLog.getIsSuccessful())){ //请求获取新分配的货位 ResponseResult bean = JSONUtil.toBean(requestLog.getResponseBody(), ResponseResult.class); - MydoJob wmsMydoJob = BeanUtil.toBean(bean.getResult(), MydoJob.class); + TaskExceptionReceive taskExceptionReceive = BeanUtil.toBean(bean.getResult(), TaskExceptionReceive.class); //更新任务信息 - MydoJob mydoJob = mydoJobService.selectMydoJobByJobId(wmsMydoJob.getJobId()); - mydoJob.setCargoSpaceId(wmsMydoJob.getCargoSpaceId()); + MydoJob mydoJob = mydoJobService.selectMydoJobByWmsTaskNo(taskExceptionReceive.getTaskCode()); + mydoJob.setCargoSpaceId(taskExceptionReceive.getSiteCode()); mydoJobService.updateMydoJob(mydoJob); - return AjaxResult.success(); + return AjaxResult.success(taskExceptionReceive); } return AjaxResult.error(); } @@ -504,18 +506,16 @@ public class ApiServiceImpl implements IApiService { mydoJob.setJobId(mydoJobService.getJobId("CK")); mydoJob.setTaskNo(mydoJobService.getTaskNo("3")); mydoJob.setWmsTaskNo(stockoutReceive.getTaskCode()); - //todo 可能需要解析货位 wms参数【siteCode】 mydoJob.setCargoSpaceId(stockoutReceive.getSiteCode()); - mydoJob.setExitId("G1004"); - //todo 是否需要解析wms推送的任务类型? -// mydoJob.setInOrOut(stockoutReceive.getTaskTypeCode()); + mydoJob.setTraySize(GoodsType.TYPE_DEFAULT);//默认 + mydoJob.setExitId(CONV_STOCKOUT); mydoJob.setInOrOut("2"); mydoJob.setStatus("1"); mydoJob.setPriority(Long.valueOf(10)); //todo 可能需要查本地库存信息获取条码? // mydoJob.setTrayCode(receiveOutJob.getTrayCode()); mydoJob.setCreateTime(DateUtils.getNowDate()); - mydoJob.setExecutionPhase(TASK_EP_CREATE); + mydoJob.setExecutionPhase(TASK_EP_CREATED); // mydoJob.setTraySize(receiveOutJob.getDepartmentId()); int i = mydoJobService.insertMydoJob(mydoJob); // boolean success = mydoJobService.saveOrUpdate(mydoJob); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/RequestLogServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/RequestLogServiceImpl.java index 6924c9b..4dd8447 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/RequestLogServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/RequestLogServiceImpl.java @@ -1,11 +1,15 @@ package com.ruoyi.api.service.impl; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; +import cn.hutool.http.Header; +import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; import com.ruoyi.api.domain.InterfaceReceive; @@ -17,6 +21,8 @@ import com.ruoyi.api.mapper.RequestLogMapper; import com.ruoyi.api.domain.RequestLog; import com.ruoyi.api.service.IRequestLogService; +import static com.ruoyi.common.Constant.HEADER_TOKEN; + /** * 接口记录Service业务层处理 * @@ -129,7 +135,14 @@ public class RequestLogServiceImpl implements IRequestLogService requestLog.setRequestUrl(url); Date responseTime =new Date(); try { - String resStr = HttpUtil.post(url, param); +// String resStr = HttpUtil.post(url, param); + + String resStr = HttpRequest.post(url) + .body(param) + .header("X-Service-Secret", HEADER_TOKEN) + .execute() + .body(); + requestLog.setResponseBody(resStr); InterfaceReceive bean = JSONUtil.toBean(resStr, InterfaceReceive.class); @@ -222,8 +235,14 @@ public class RequestLogServiceImpl implements IRequestLogService requestLog.setRequestBody(param); requestLog.setRequestUrl(url); Date responseTime =new Date(); + try { - String resStr = HttpUtil.post(url, param); +// String resStr = HttpUtil.post(url, param, header, 3000); + String resStr = HttpRequest.post(url) + .body(param) + .header("X-Service-Secret", HEADER_TOKEN) + .execute() + .body(); requestLog.setResponseBody(resStr); ResponseResult bean = JSONUtil.toBean(resStr, ResponseResult.class); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java b/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java index 3f870c0..90b9daf 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/Constant.java @@ -7,6 +7,9 @@ public class Constant { public static final String WMS_BASE_URL = "http://10.88.10.69:8290/service"; public static final String RCS_BASE_URL = "http://192.168.58.101:8182/rcms/services/rest/hikRpcService/"; + public static final String HEADER_TOKEN = "fed3d1511a5a474b9e1f9c56246cb1ec"; + + //#region AGV接口url public static final String GEN_AGV_SCHEDULING_TASK = RCS_BASE_URL+"genAgvSchedulingTask"; public static final String CANCEL_TASK_URL = RCS_BASE_URL+"cancelTask"; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/ConvType.java b/ruoyi-admin/src/main/java/com/ruoyi/common/ConvType.java new file mode 100644 index 0000000..782f95e --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/ConvType.java @@ -0,0 +1,19 @@ +package com.ruoyi.common; + +public class ConvType { + + /** + * 出库输送机(到位位置) + */ + public static final String CONV_STOCKOUT = "TD1001"; + + /** + * 入库输送机(到位位置) + */ + public static final String CONV_STOCKIN = "G1004"; + + /** + * 1#巷道口输送机(到位位置) + */ + public static final String CONV_ROAD_1 = "L1001"; +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/GoodsType.java b/ruoyi-admin/src/main/java/com/ruoyi/common/GoodsType.java new file mode 100644 index 0000000..afb47c4 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/GoodsType.java @@ -0,0 +1,22 @@ +package com.ruoyi.common; + +/** + * 货物类型 + */ +public class GoodsType { + + /** + * 默认 + */ + public static final String TYPE_DEFAULT = "0"; + + /** + * 高度1 + */ + public static final String TYPE_HEIGHT_1 = "1"; + + /** + * 高度2 + */ + public static final String TYPE_HEIGHT_2 = "0"; +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/TaskStatusCode.java b/ruoyi-admin/src/main/java/com/ruoyi/common/TaskStatusCode.java index 57289d6..def6716 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/common/TaskStatusCode.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/TaskStatusCode.java @@ -10,7 +10,7 @@ public class TaskStatusCode { /** * 任务状态-待执行 */ - public static final String TASK_STATUS_CREATE = "1"; + public static final String TASK_STATUS_CREATED = "1"; /** * 任务状态-待执行 @@ -39,7 +39,7 @@ public class TaskStatusCode { /** * 任务执行阶段 任务已生成 */ - public static final String TASK_EP_CREATE = "0"; + public static final String TASK_EP_CREATED = "0"; /** * 任务执行阶段 产线输送到位 @@ -76,14 +76,30 @@ public class TaskStatusCode { */ public static final String TASK_EP_SSJ_STOCKOUT_FINISH = "6"; + /** + * 任务执行阶段 任务自动完成 + */ + public static final String TASK_EP_FINISH = "6"; + /** * 任务执行阶段 任务超时-自动结束当前任务 */ public static final String TASK_EP_DDJ_FINISH_TIMEOUT = "6_TIMEOUT_FINISH"; - public static final String TASK_EXCEPTION_PUT = "IN_FAULT"; + /** + * 入库异常 - 放货有货 + */ + public static final String TASK_EXCEPTION_PUT = "STOCKIN_FAULT"; - public static final String TASK_EXCEPTION_PICK = "OUT_FAULT"; + /** + * 出库异常 - 取货无货 + */ + public static final String TASK_EXCEPTION_PICK = "STOCKOUT_FAULT"; + + /** + * 入库异常 - 重分完成 + */ + public static final String TASK_EXCEPTION_PUT_REASSIGN = "STOCKIN_FAULT_REASSIGN"; /** * 任务执行阶段 回传wms完成 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/TaskType.java b/ruoyi-admin/src/main/java/com/ruoyi/common/TaskType.java index 60367bc..84f0d71 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/common/TaskType.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/TaskType.java @@ -5,6 +5,10 @@ package com.ruoyi.common; */ public class TaskType { + /** + * 默认类型 + */ + public static final int STACKER_TYPE_DEFAULT = 0; /** * 1-二楼入出 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/WmsTaskTypeCode.java b/ruoyi-admin/src/main/java/com/ruoyi/common/WmsTaskTypeCode.java index e229aed..22125d0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/common/WmsTaskTypeCode.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/WmsTaskTypeCode.java @@ -8,11 +8,41 @@ public class WmsTaskTypeCode { /** * 外部wms定义的入库类型 */ - public static final String WMS_TASK_TYPE_STOCKIN = "1"; + public static final String WMS_TASK_TYPE_STOCKIN = "立库入库"; /** * 外部wms定义的出库类型 */ - public static final String WMS_TASK_TYPE_STOCKOUT = "2"; + public static final String WMS_TASK_TYPE_STOCKOUT = "立库出库"; + + /** + * 外部wms定义的入库结束类型 + */ + public static final String WMS_TASK_TYPE_STOCKIN_FINISH = "立库入库任务结束"; + + /** + * 外部wms定义的出库结束类型 + */ + public static final String WMS_TASK_TYPE_STOCKOUT_FINISH = "立库出库任务结束"; + + /** + * 外部wms定义的任务结束类型 + */ + public static final String WMS_TASK_TYPE_FINISH = "立库任务结束"; + + /** + * 外部wms定义的入库异常类型 + */ + public static final String WMS_TASK_TYPE_STOCKIN_EXCEPTION = "立库入库异常任务-放货有货"; + + /** + * 外部wms定义的出库异常类型 + */ + public static final String WMS_TASK_TYPE_STOCKOUT_EXCEPTION = "立库出库异常任务-取货无货"; + + /** + * 外部wms定义的任务异常类型 + */ + public static final String WMS_TASK_TYPE_EXCEPTION = "立库异常任务"; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/ddj/controller/MsgDdjController.java b/ruoyi-admin/src/main/java/com/ruoyi/device/ddj/controller/MsgDdjController.java index 2180d9d..0eb0f44 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/ddj/controller/MsgDdjController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/ddj/controller/MsgDdjController.java @@ -39,7 +39,7 @@ import static com.ruoyi.common.Constant.LOCAL_URL; * @date 2025-09-22 */ @RestController -@RequestMapping("/device/ddj") +@RequestMapping("/device/stacker") public class MsgDdjController extends BaseController { @Autowired @@ -148,72 +148,66 @@ public class MsgDdjController extends BaseController public AjaxResult getStackerStatus(@PathVariable Long id){ //返回堆垛机部分参数的状态映射 - if (id == 1) { - MsgDdj msg = msgDdjService.selectMsgDdjById(id); -// StackerStatus status = new StackerStatus(); - - //操作模式 - String mode; - switch (msg.getCzfs()){ - case 1 -> mode = "手动"; - case 5 -> mode = "联机自动"; - default -> mode = "其他"; - } - - //设备状态 - String deviceStatus; - switch (msg.getSbzt()){ - case 0 -> deviceStatus = "待机"; - case 1 -> deviceStatus = "运行中"; - default -> deviceStatus = "运行报警"; - } - - //执行阶段 - String executionPhase; - switch (msg.getJdbz()){ - case 1 -> executionPhase = "取货途中"; - case 2 -> executionPhase = "取货中"; - case 3 -> executionPhase = "放货途中"; - case 4 -> executionPhase = "放货中"; - case 5 -> executionPhase = "放货完成"; - default -> executionPhase = "待机"; - } - - StackerStatusContent statusContent = new StackerStatusContent( - String.valueOf(id), - mode, - String.valueOf(msg.getRwh()), - deviceStatus, - msg.getHczt() > 0 ? "货叉有货" : "货叉无货", - executionPhase, - msg.getYxxf() == 1 ? "允许" : "禁止", - msg.getCurrentRow() + "排" + msg.getCurrentColumn() + "列" + msg.getCurrentFloor() + "层" - ); - - RequestLog requestLog = requestLogService.getRequestLog(String.valueOf(id), "获取指定堆垛机状态"); - requestLog.setRequestUrl(LOCAL_URL + "/device/ddj/getStackerStatus/" + id); - requestLog.setRequestMethod("get"); - requestLog.setResponseStatus("1"); - requestLog.setResponseBody(JSON.toJSONString(statusContent)); - requestLogService.insertRequestLog(requestLog); - -// status.setId(msg.getId()); -// status.setMode(msg.getCzfs()); -// status.setTaskNo(msg.getRwh()); -// status.setDeviceStatus(msg.getSbzt()); -// status.setForkStatus(msg.getHczt()); -// status.setExecutionPhase(msg.getJdbz()); -// status.setPermission(msg.getYxxf()); -// status.setCurrentRow(msg.getCurrentRow()); -// status.setCurrentColumn(msg.getCurrentColumn()); -// status.setCurrentFloor(msg.getCurrentFloor()); -// status.setCurrentRoad(msg.getId()); -// status.setCurrentPosition(msg.getCurrentRow() + "排" + msg.getCurrentColumn() + "列" + msg.getCurrentFloor() + "层"); - - return AjaxResult.success(statusContent); - }else{ - return AjaxResult.error("【查询堆垛机状态】设备编号:" + id + ",查询超出最大索引"); + MsgDdj msg = msgDdjService.selectMsgDdjById(id); + if (msg == null) { + AjaxResult.error("【查询堆垛机状态】设备编号:" + id + ",查询超出最大索引"); } + //操作模式 + String mode; + switch (msg.getCzfs()){ + case 1 -> mode = "手动"; + case 5 -> mode = "联机自动"; + default -> mode = "其他"; + } + //设备状态 + String deviceStatus; + switch (msg.getSbzt()){ + case 0 -> deviceStatus = "待机"; + case 1 -> deviceStatus = "运行中"; + default -> deviceStatus = "运行报警"; + } + //执行阶段 + String executionPhase; + switch (msg.getJdbz()){ + case 1 -> executionPhase = "取货途中"; + case 2 -> executionPhase = "取货中"; + case 3 -> executionPhase = "放货途中"; + case 4 -> executionPhase = "放货中"; + case 5 -> executionPhase = "放货完成"; + default -> executionPhase = "待机"; + } + StackerStatusContent statusContent = new StackerStatusContent( + String.valueOf(id), + mode, + String.valueOf(msg.getRwh()), + deviceStatus, + msg.getHczt() > 0 ? "货叉有货" : "货叉无货", + executionPhase, + msg.getYxxf() == 1 ? "允许" : "禁止", + msg.getCurrentRow() + "排" + msg.getCurrentColumn() + "列" + msg.getCurrentFloor() + "层" + ); + RequestLog requestLog = requestLogService.getRequestLog(String.valueOf(id), "获取指定堆垛机状态"); + requestLog.setRequestUrl(LOCAL_URL + "/device/ddj/getStackerStatus/" + id); + requestLog.setRequestMethod("get"); + requestLog.setResponseStatus("1"); + requestLog.setResponseBody(JSON.toJSONString(statusContent)); + requestLogService.insertRequestLog(requestLog); + +// status.setId(msg.getId()); +// status.setMode(msg.getCzfs()); +// status.setTaskNo(msg.getRwh()); +// status.setDeviceStatus(msg.getSbzt()); +// status.setForkStatus(msg.getHczt()); +// status.setExecutionPhase(msg.getJdbz()); +// status.setPermission(msg.getYxxf()); +// status.setCurrentRow(msg.getCurrentRow()); +// status.setCurrentColumn(msg.getCurrentColumn()); +// status.setCurrentFloor(msg.getCurrentFloor()); +// status.setCurrentRoad(msg.getId()); +// status.setCurrentPosition(msg.getCurrentRow() + "排" + msg.getCurrentColumn() + "列" + msg.getCurrentFloor() + "层"); + + return AjaxResult.success(statusContent); + } @@ -248,26 +242,29 @@ public class MsgDdjController extends BaseController public AjaxResult getStackerStatusEn(@PathVariable Long id){ //返回堆垛机部分参数的状态映射 - if (id == 1) { - MsgDdj msg = msgDdjService.selectMsgDdjById(id); - StackerStatus statusContent = new StackerStatus( - id, - msg.getCzfs(), - String.valueOf(msg.getRwh()), - msg.getSbzt(), - msg.getHczt(), - msg.getJdbz(), - msg.getYxxf(), - String.format("%02d",msg.getCurrentRow()) + String.format("%02d",msg.getCurrentColumn()) + String.format("%02d",msg.getCurrentFloor()) - ); + MsgDdj msg = msgDdjService.selectMsgDdjById(id); - RequestLog requestLog = requestLogService.getRequestLog(String.valueOf(id), "获取指定堆垛机状态"); - requestLog.setRequestUrl(LOCAL_URL + "/device/ddj/getStackerStatus/en/" + id); - requestLog.setRequestMethod("get"); - requestLog.setResponseStatus("1"); - requestLog.setResponseBody(JSON.toJSONString(statusContent)); - requestLogService.insertRequestLog(requestLog); + if (msg == null) { + AjaxResult.error("【查询堆垛机状态】设备编号:" + id + ",查询超出最大索引"); + } + + StackerStatus statusContent = new StackerStatus( + id, + msg.getCzfs(), + String.valueOf(msg.getRwh()), + msg.getSbzt(), + msg.getHczt(), + msg.getJdbz(), + msg.getYxxf(), + String.format("%02d",msg.getCurrentRow()) + String.format("%02d",msg.getCurrentColumn()) + String.format("%02d",msg.getCurrentFloor()) + ); + RequestLog requestLog = requestLogService.getRequestLog(String.valueOf(id), "获取指定堆垛机状态"); + requestLog.setRequestUrl(LOCAL_URL + "/device/ddj/getStackerStatus/en/" + id); + requestLog.setRequestMethod("get"); + requestLog.setResponseStatus("1"); + requestLog.setResponseBody(JSON.toJSONString(statusContent)); + requestLogService.insertRequestLog(requestLog); // status.setId(msg.getId()); // status.setMode(msg.getCzfs()); @@ -282,10 +279,8 @@ public class MsgDdjController extends BaseController // status.setCurrentRoad(msg.getId()); // status.setCurrentPosition(msg.getCurrentRow() + "排" + msg.getCurrentColumn() + "列" + msg.getCurrentFloor() + "层"); - return AjaxResult.success(statusContent); - }else{ - return AjaxResult.error("【查询堆垛机状态】设备编号:" + id + ",查询超出最大索引"); - } + return AjaxResult.success(statusContent); + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/controller/DeviceSsjController.java b/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/controller/DeviceSsjController.java index e6fc802..19af198 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/controller/DeviceSsjController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/device/ssj/controller/DeviceSsjController.java @@ -35,7 +35,7 @@ import static com.ruoyi.common.Constant.LOCAL_URL; * @date 2025-07-04 */ @RestController -@RequestMapping("/device/ssj") +@RequestMapping("/device/conv") public class DeviceSsjController extends BaseController { @Autowired @@ -134,6 +134,11 @@ public class DeviceSsjController extends BaseController public AjaxResult getConvStatus(@PathVariable String id){ DeviceSsj msgSsj = deviceSsjService.selectDeviceSsjByDeviceCode(id); + + if (msgSsj == null) { + return AjaxResult.error("【查询输送机状态】设备编号:" + id + ",该设备不存在!"); + } + ConvStatusContent status = new ConvStatusContent( id, msgSsj.getMode() == 1 ? "自动" : "手动", @@ -145,10 +150,6 @@ public class DeviceSsjController extends BaseController String.valueOf(msgSsj.getTaskNo()) ); - if (msgSsj == null) { - return AjaxResult.error("【查询输送机状态】设备编号:" + id + ",该设备不存在!"); - } - RequestLog requestLog = requestLogService.getRequestLog(id, "获取指定输送机状态"); requestLog.setRequestUrl(LOCAL_URL + "/device/ssj/getConvStatus/" + id); requestLog.setRequestMethod("get"); @@ -175,6 +176,11 @@ public class DeviceSsjController extends BaseController public AjaxResult getConvStatusEn(@PathVariable String id){ DeviceSsj msgSsj = deviceSsjService.selectDeviceSsjByDeviceCode(id); + + if (msgSsj == null) { + return AjaxResult.error("【查询输送机状态】设备编号:" + id + ",该设备不存在!"); + } + ConvStatus status = new ConvStatus( id, msgSsj.getMode() == 1 ? "1" : "0", @@ -183,10 +189,6 @@ public class DeviceSsjController extends BaseController msgSsj.getTaskNo() ); - if (msgSsj == null) { - return AjaxResult.error("【查询输送机状态】设备编号:" + id + ",该设备不存在!"); - } - RequestLog requestLog = requestLogService.getRequestLog(id, "获取指定输送机状态"); requestLog.setRequestUrl(LOCAL_URL + "/device/ssj/getConvStatus/en/" + id); requestLog.setRequestMethod("get"); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/mapper/MydoJobMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/job/mapper/MydoJobMapper.java index 49b1d15..7bde181 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/mapper/MydoJobMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/mapper/MydoJobMapper.java @@ -103,6 +103,8 @@ public interface MydoJobMapper MydoJob selectMydoJobByExitId(@Param("exitId") String exitId); + MydoJob selectMydoJobByWmsTaskNo(@Param("wmsTaskNo") String exitId); + /** * 获取本地生成作业号 * @param map diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/service/IMydoJobService.java b/ruoyi-admin/src/main/java/com/ruoyi/job/service/IMydoJobService.java index dd12ef0..453e18a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/service/IMydoJobService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/service/IMydoJobService.java @@ -100,6 +100,8 @@ public interface IMydoJobService MydoJob selectMydoJobByExitId(String exitId); + MydoJob selectMydoJobByWmsTaskNo(String wmsTaskNo); + /** * 获取本地生成作业号 * @param type RK-入库 CK-出库 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/service/impl/MydoJobServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/job/service/impl/MydoJobServiceImpl.java index c15f746..a2d1cbf 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/service/impl/MydoJobServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/service/impl/MydoJobServiceImpl.java @@ -10,6 +10,8 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.job.domain.JobCallBack; import com.ruoyi.job.service.IJobCallBackService; +import com.ruoyi.queue.ddj.service.IDdjDeviceExecutionQueueService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @@ -17,8 +19,7 @@ import com.ruoyi.job.mapper.MydoJobMapper; import com.ruoyi.job.domain.MydoJob; import com.ruoyi.job.service.IMydoJobService; -import static com.ruoyi.common.WmsTaskTypeCode.WMS_TASK_TYPE_STOCKIN; -import static com.ruoyi.common.WmsTaskTypeCode.WMS_TASK_TYPE_STOCKOUT; +import static com.ruoyi.common.WmsTaskTypeCode.*; /** * 作业信息Service业务层处理 @@ -27,12 +28,15 @@ import static com.ruoyi.common.WmsTaskTypeCode.WMS_TASK_TYPE_STOCKOUT; * @date 2025-09-22 */ @Service +@Slf4j public class MydoJobServiceImpl implements IMydoJobService { @Autowired private MydoJobMapper mydoJobMapper; @Autowired private IJobCallBackService jobCallBackService; + @Autowired + private IDdjDeviceExecutionQueueService ddjDeviceExecutionQueueService; /** * 查询作业信息 @@ -136,13 +140,17 @@ public class MydoJobServiceImpl implements IMydoJobService MydoJob task = selectMydoJobByTaskNo(rwh); insertHistory(task.getJobId()); deleteMydoJobByJobId(task.getJobId()); + ddjDeviceExecutionQueueService.deleteDdjDeviceExecutionQueueByTaskNo(task.getTaskNo()); + + log.info("【堆垛机入库】堆垛机:"+ task.getRoadwayId() +"任务完成,任务号:"+ rwh); + JobCallBack jobCallBack = new JobCallBack(); - jobCallBack.setType("2"); + jobCallBack.setType(Integer.valueOf(task.getInOrOut()) < 20 ? "1" : "2"); jobCallBack.setMydoJobId(task.getJobId()); jobCallBack.setStatus("0"); jobCallBack.setTaskNo(Convert.toLong(task.getTaskNo())); jobCallBack.setCreateTime(new Date()); - jobCallBack.setTaskTypeCode(Integer.valueOf(task.getInOrOut()) < 20 ? WMS_TASK_TYPE_STOCKIN : WMS_TASK_TYPE_STOCKOUT);//todo ??? + jobCallBack.setTaskTypeCode(WMS_TASK_TYPE_FINISH); jobCallBack.setReqCode(UUID.randomUUID().toString().replace("-", "")); jobCallBack.setTaskCode(task.getWmsTaskNo()); jobCallBackService.insertJobCallBack(jobCallBack); @@ -214,17 +222,16 @@ public class MydoJobServiceImpl implements IMydoJobService long jobIdNum = Long.parseLong(mydoJob.getInOrOut()); if (jobIdNum > 20){ jobCallBack.setType("2"); - jobCallBack.setTaskTypeCode(WMS_TASK_TYPE_STOCKOUT);//todo wms下发的任务类型 }else{ jobCallBack.setType("1"); - jobCallBack.setTaskTypeCode(WMS_TASK_TYPE_STOCKIN);//todo wms下发的任务类型 } - + jobCallBack.setTaskTypeCode(WMS_TASK_TYPE_FINISH);//todo wms下发的任务类型 jobCallBack.setMydoJobId(mydoJob.getJobId()); jobCallBack.setStatus("0"); jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo())); jobCallBack.setCreateTime(new Date()); jobCallBack.setTaskCode(mydoJob.getWmsTaskNo()); + jobCallBack.setRetry(0); jobCallBack.setReqCode(UUID.randomUUID().toString()); jobCallBackService.insertJobCallBack(jobCallBack); @@ -280,6 +287,11 @@ public class MydoJobServiceImpl implements IMydoJobService return mydoJobMapper.selectMydoJobByExitId(exitId); } + @Override + public MydoJob selectMydoJobByWmsTaskNo(String wmsTaskNo){ + return mydoJobMapper.selectMydoJobByWmsTaskNo(wmsTaskNo); + } + @Override public List selectMydoJobFinishList(MydoJob mydoJob) { return mydoJobMapper.selectMydoJobFinishList(mydoJob); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/ddj/mapper/DdjDeviceExecutionQueueMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/ddj/mapper/DdjDeviceExecutionQueueMapper.java index 9243a2e..2ce2774 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/ddj/mapper/DdjDeviceExecutionQueueMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/ddj/mapper/DdjDeviceExecutionQueueMapper.java @@ -51,7 +51,7 @@ public interface DdjDeviceExecutionQueueMapper * @return 结果 */ public int updateDdjDeviceExecutionQueue(DdjDeviceExecutionQueue ddjDeviceExecutionQueue); - public int updateDdjDeviceExecutionQueue1(DdjDeviceExecutionQueue ddjDeviceExecutionQueue); +// public int updateDdjDeviceExecutionQueue1(DdjDeviceExecutionQueue ddjDeviceExecutionQueue); /** * 删除堆垛机执行队列 @@ -61,6 +61,14 @@ public interface DdjDeviceExecutionQueueMapper */ public int deleteDdjDeviceExecutionQueueByUuid(String uuid); + /** + * 删除堆垛机执行队列 + * + * @param taskNo 堆垛机执行队列主键 + * @return 结果 + */ + public int deleteDdjDeviceExecutionQueueByTaskNo(String taskNo); + /** * 批量删除堆垛机执行队列 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/ddj/service/IDdjDeviceExecutionQueueService.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/ddj/service/IDdjDeviceExecutionQueueService.java index a5a1763..36ecbee 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/ddj/service/IDdjDeviceExecutionQueueService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/ddj/service/IDdjDeviceExecutionQueueService.java @@ -59,6 +59,14 @@ public interface IDdjDeviceExecutionQueueService */ public int deleteDdjDeviceExecutionQueueByUuids(String[] uuids); + /** + * 查询任务号删除堆垛机执行队列 + * + * @param taskNo 需要删除的堆垛机执行队列的任务号 + * @return 结果 + */ + public int deleteDdjDeviceExecutionQueueByTaskNo(String taskNo); + /** * 删除堆垛机执行队列信息 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/queue/ddj/service/impl/DdjDeviceExecutionQueueServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/queue/ddj/service/impl/DdjDeviceExecutionQueueServiceImpl.java index 2810c26..5321790 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/queue/ddj/service/impl/DdjDeviceExecutionQueueServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/queue/ddj/service/impl/DdjDeviceExecutionQueueServiceImpl.java @@ -93,6 +93,10 @@ public class DdjDeviceExecutionQueueServiceImpl implements IDdjDeviceExecutionQu return ddjDeviceExecutionQueueMapper.deleteDdjDeviceExecutionQueueByUuids(uuids); } + public int deleteDdjDeviceExecutionQueueByTaskNo(String taskNo){ + return ddjDeviceExecutionQueueMapper.deleteDdjDeviceExecutionQueueByTaskNo(taskNo); + } + /** * 删除堆垛机执行队列信息 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java index bea1df6..dda32f0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/ssj/PlcSsjRead.java @@ -109,6 +109,7 @@ public class PlcSsjRead implements Runnable { ssjDevice.setSszt(ParseUtil.optInt(8, ddsx1)); ssjDevice.setRkqq(ParseUtil.optInt(10, ddsx1)); ssjDevice.setHeight(ParseUtil.optInt(12, ddsx1)); + ssjDevice.setTraySize(ParseUtil.optInt(12, ddsx1)); //此处不修改device_ssj表,把托盘尺寸值当作高度使用 ssjDevice.setTrayCode(ParseUtil.optString(14, ddsx1)); ssjDevice.setMode(ParseUtil.optInt(24, ddsx1));//todo 输送机操作模式 ssjDevice.setException(ParseUtil.optInt(28, ddsx1)); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/util/ParseUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/util/ParseUtil.java index afc93d2..23c69ab 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/util/ParseUtil.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/plcRead/util/ParseUtil.java @@ -46,7 +46,7 @@ public class ParseUtil { */ public static String optString(int start, String data) { - byte[] bytes = SoftBasic.HexStringToBytes(data.substring(start * 2, (start + 7) * 2)); + byte[] bytes = SoftBasic.HexStringToBytes(data.substring(start * 2, (start + 10) * 2)); return Tools.bytetostringtool(bytes); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/TaskHandler.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/TaskHandler.java index 5399a7e..5ff536d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/TaskHandler.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/TaskHandler.java @@ -1,38 +1,53 @@ package com.ruoyi.schedule.scheduleTask; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.UUID; +import com.ruoyi.api.domain.wcs2wms.exception.TaskExceptionReceive; +import com.ruoyi.api.domain.wcs2wms.exception.TaskExceptionRequest; +import com.ruoyi.api.service.IApiService; +import com.ruoyi.bas.cargospace.domain.BasCargoSpace; import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.job.domain.MydoJob; import com.ruoyi.job.service.IJobCallBackService; import com.ruoyi.job.service.IMydoJobService; +import com.ruoyi.queue.ddj.domain.DdjDeviceExecutionQueue; +import com.ruoyi.queue.ddj.service.IDdjDeviceExecutionQueueService; +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.List; +import static com.ruoyi.common.TaskExceptionType.TASK_EXCEPTION_STOCKIN_OCCUPIED; import static com.ruoyi.common.TaskStatusCode.*; +import static com.ruoyi.common.WmsTaskTypeCode.WMS_TASK_TYPE_EXCEPTION; @Component +@Slf4j public class TaskHandler { @Autowired private IMydoJobService mydoJobService; - @Autowired private IJobCallBackService jobCallBackService; - @Autowired private IBasCargoSpaceService basCargoSpaceService; + @Autowired + private IApiService apiService; + @Autowired + private IDdjDeviceExecutionQueueService ddjDeviceExecutionQueueService; /** * 处理未正常移除的【堆垛机执行完成】或【出库到位】的遗留任务 */ - @Scheduled(fixedDelay = 3000) +// @Scheduled(fixedDelay = 3000) public void mydoJobHandler() { //此处 - 堆垛机执行完成【TASK_EP_DDJ_FINISH】和出库到位【TASK_EP_SSJ_STOCKOUT_FINISH】的常量值相同,均可表示任务【已完成】 //用任意一种状态查询所有标记为【已完成】的任务 List jobs = mydoJobService.selectMydoJobList( - new MydoJob().builder().executionPhase(TASK_EP_DDJ_FINISH).build() + new MydoJob().builder().executionPhase(TASK_EP_FINISH).build() ); if (!jobs.isEmpty()) { for (MydoJob job : jobs) { @@ -51,14 +66,45 @@ public class TaskHandler { } -// @Scheduled(fixedDelay = 3000) + /** + * 入库异常 - 【放货有货】处理方法 + */ + @Scheduled(fixedDelay = 2000) public void stockinExceptionHandler() { List jobs = mydoJobService.selectInOrOutMydoJobList( new MydoJob().builder().executionPhase(TASK_EXCEPTION_PUT).build() ); if (!jobs.isEmpty()) { for (MydoJob job : jobs) { + //上报异常 - 向wms请求重分接口 + TaskExceptionRequest taskExceptionRequest = new TaskExceptionRequest(); + taskExceptionRequest.setTaskClass(job.getInOrOut().substring(0, 1)); + taskExceptionRequest.setType(String.valueOf(TASK_EXCEPTION_STOCKIN_OCCUPIED)); + taskExceptionRequest.setTaskCode(job.getWmsTaskNo()); + taskExceptionRequest.setTaskTypeCode(WMS_TASK_TYPE_EXCEPTION);//todo 不知道填什么 + taskExceptionRequest.setReqCode(UUID.randomUUID().toString().replace("-", "")); + taskExceptionRequest.setAdverseCauses("当前位置已有货物,盘点后重新分配货位"); + AjaxResult ajaxResult = apiService.reAssign(taskExceptionRequest); + if (ajaxResult.isSuccess()){ + //获取返回的任务号和新分配的货位 + TaskExceptionReceive mydoJobReAssign = BeanUtil.toBean(ajaxResult.get("data"), TaskExceptionReceive.class); + + MydoJob wmsJob = new MydoJob(); + wmsJob.setWmsTaskNo(mydoJobReAssign.getTaskCode()); + if (mydoJobService.selectMydoJobList(wmsJob).size() == 0) { + log.warn("【响应异常】该任务不存在,任务号:{}", mydoJobReAssign.getTaskCode()); + return; + } + + //更新任务参数 + job = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(job.getTaskNo())); + job.setCargoSpaceId(mydoJobReAssign.getSiteCode()); + job.setExecutionPhase(TASK_EXCEPTION_PUT_REASSIGN); + job.setFaultFlag("2"); + mydoJobService.updateMydoJob(job); + + } } } @@ -66,8 +112,10 @@ public class TaskHandler { } - -// @Scheduled(fixedDelay = 3000) + /** + * 出库异常 - 【取货无货】处理方法 + */ + @Scheduled(fixedDelay = 2000) public void stockoutExceptionHandler() { List jobs = mydoJobService.selectInOrOutMydoJobList( new MydoJob().builder().executionPhase(TASK_EXCEPTION_PICK).build() @@ -75,12 +123,52 @@ public class TaskHandler { if (!jobs.isEmpty()) { for (MydoJob job : jobs) { - mydoJobService.InvalidMydoJob(Long.valueOf(job.getTaskNo()), Integer.valueOf(job.getRoadwayId())); + //向wms返回异常信息 + TaskExceptionRequest taskExceptionRequest = new TaskExceptionRequest(); + taskExceptionRequest.setTaskClass(job.getInOrOut().substring(0, 1)); + taskExceptionRequest.setType(String.valueOf(TASK_EXCEPTION_STOCKIN_OCCUPIED)); + taskExceptionRequest.setTaskCode(String.valueOf(job.getWmsTaskNo())); + taskExceptionRequest.setTaskTypeCode(WMS_TASK_TYPE_EXCEPTION);//todo 不知道填什么 + taskExceptionRequest.setReqCode(UUID.randomUUID().toString().replace("-", "")); + taskExceptionRequest.setAdverseCauses("取货位置空,盘点后作废该任务"); + + AjaxResult ajaxResult = apiService.reMaterial(taskExceptionRequest); + + if (ajaxResult.isSuccess()){ + mydoJobService.InvalidMydoJob(Long.valueOf(job.getTaskNo()), Integer.valueOf(job.getRoadwayId())); + //清空/重置【取货无货】的出库异常货位库存信息 + basCargoSpaceService.resetCargoSpaceByStockoutException(job.getCargoSpaceId()); + } - //清空/重置【取货无货】的出库异常货位库存信息 - basCargoSpaceService.resetCargoSpaceByStockoutException(job.getCargoSpaceId()); } } + + + } + + /** + * 入库重分完成 - 堆垛机重新下发 + */ + @Scheduled(fixedDelay = 2000) + public void sendTaskForStacker(){ + List jobs = mydoJobService.selectInOrOutMydoJobList( + new MydoJob().builder().executionPhase(TASK_EXCEPTION_PUT_REASSIGN).build() + ); + + if (!jobs.isEmpty()) { + for (MydoJob job : jobs) { + //获取重分的货位重新向堆垛机下发任务 + BasCargoSpace basCargoSpace = basCargoSpaceService.selectBasCargoSpaceByWmsCargoSpaceId(job.getCargoSpaceId()); + DdjDeviceExecutionQueue ddjDeviceExecutionQueue = + ddjDeviceExecutionQueueService.selectDdjDeviceExecutionQueueByRwh(Long.valueOf(job.getTaskNo()), Integer.valueOf(job.getRoadwayId())); + ddjDeviceExecutionQueue.setMbph(basCargoSpace.getThePlatoon()); + ddjDeviceExecutionQueue.setMblh(basCargoSpace.getTheColumn()); + ddjDeviceExecutionQueue.setMbch(basCargoSpace.getTheFloor()); + ddjDeviceExecutionQueue.setDdjxf("0"); + ddjDeviceExecutionQueueService.updateDdjDeviceExecutionQueue(ddjDeviceExecutionQueue); + } + + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ddj/DdjThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ddj/DdjThread.java index b0fbb4d..ab7f5d1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ddj/DdjThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ddj/DdjThread.java @@ -32,6 +32,7 @@ import java.util.List; import static com.ruoyi.common.TaskExceptionType.TASK_EXCEPTION_STOCKIN_OCCUPIED; import static com.ruoyi.common.TaskStatusCode.*; +import static com.ruoyi.common.WmsTaskTypeCode.WMS_TASK_TYPE_EXCEPTION; @Slf4j @@ -103,16 +104,19 @@ public class DdjThread implements Runnable { 以防存在漏处理,没处理的情况发生 */ + //非【联机自动】状态 + if (ddj.getCzfs() != 5) return; + // 检查当前堆垛机参数 - 是否有执行中的作业 // 1.联机自动【5】 2.设备状态【0】 3.执行阶段【0】【5】(无执行中的任务) - if (ddj.getCzfs() == 5 && ddj.getSbzt() == 0 && (ddj.getJdbz() == 5 || ddj.getJdbz() == 0)) { + if (ddj.getSbzt() == 0 && (ddj.getJdbz() == 5 || ddj.getJdbz() == 0)) { Long rwh = ddj.getRwh(); //完成作业 MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(rwh); DdjDeviceExecutionQueue ddjDeviceExecutionQueue = ddjDeviceExecutionQueueService.selectDdjDeviceExecutionQueueByRwh(rwh,ddj.getId()); - //满足上述条件,表示该任务已完成-执行任务回传 + //满足上述条件(【有实时任务】且【存在堆垛机执行队列】),表示该任务已完成-执行任务回传 if (mydoJob != null && ddjDeviceExecutionQueue != null) { //标记为堆垛机执行完成 mydoJob.setExecutionPhase(TASK_EP_DDJ_FINISH); @@ -126,7 +130,7 @@ public class DdjThread implements Runnable { //-------------------------------------- 【2 更新执行阶段】 -------------------------------------- // 1.联机自动【5】 2.设备状态 - 运行中【1】 3.执行阶段【2】 - if (ddj.getCzfs() == 5 && ddj.getSbzt() == 1 && ddj.getJdbz() == 2) { + if (ddj.getSbzt() == 1 && ddj.getJdbz() == 2) { //根据堆垛机上任务号,修改任务执行阶段 Long rwh = ddj.getRwh(); @@ -141,110 +145,121 @@ public class DdjThread implements Runnable { } /* -------------------------------------- 【3 放货有货,重新分配货位】-------------------------------------- */ - +// ddj.setCzfs(5); +// ddj.setSbzt(1052); +// ddj.setYxxf(1); +// ddj.setJdbz(4); +// ddj.setRwh(85015L); // 1.联机自动【5】 2.设备状态-放货有货【1052】 3.执行阶段【0】【5】(无执行中的任务) - if (ddj.getCzfs() == 5 && ddj.getSbzt() == 1052 && ddj.getJdbz() < 5 && ddj.getYxxf() == 1) { + if (ddj.getSbzt() == 1052 && ddj.getJdbz() < 5 && ddj.getYxxf() == 1) { // 判断堆垛机上任务是否已重分,若未重分,则调用接口,请求重分货位 Long rwh = ddj.getRwh(); - //查村正在执行中的【任务号】获取堆垛机队列 + //查询正在执行中的【任务号】获取堆垛机队列 MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(rwh); - DdjDeviceExecutionQueue ddjDeviceExecutionQueue = ddjDeviceExecutionQueueService.selectDdjDeviceExecutionQueueByRwh(rwh, ddj.getId()); - //更新异常类型【FaultFlag】-1 - if ("0".equals(mydoJob.getFaultFlag()) && "1".equals(ddjDeviceExecutionQueue.getSpare1())) { - mydoJob.setStatus("1"); - //把执行阶段标记为【入库放货有货】的异常 - mydoJob.setExecutionPhase(TASK_EXCEPTION_PUT); - mydoJobService.updateMydoJob(mydoJob); - - //上报异常 - 向wms请求重分接口 - TaskExceptionRequest taskExceptionRequest = new TaskExceptionRequest(); - taskExceptionRequest.setTaskClass(mydoJob.getInOrOut()); - taskExceptionRequest.setType(String.valueOf(TASK_EXCEPTION_STOCKIN_OCCUPIED)); - taskExceptionRequest.setTaskCode(mydoJob.getWmsTaskNo()); - taskExceptionRequest.setTaskTypeCode("");//todo 不知道填什么 - taskExceptionRequest.setReqCode(UUID.randomUUID().toString().replace("-", "")); - taskExceptionRequest.setAdverseCauses("当前位置已有货物,盘点后重新分配货位"); - - AjaxResult ajaxResult = apiService.reAssign(taskExceptionRequest); - if (ajaxResult.isSuccess()){ - //获取返回的任务号和新分配的货位 - TaskExceptionReceive mydoJobReAssign = BeanUtil.toBean(ajaxResult.get("result"), TaskExceptionReceive.class); - - MydoJob wmsJob = new MydoJob(); - wmsJob.setInOrOut(mydoJobReAssign.getTaskCode()); - if (mydoJobService.selectMydoJobList(wmsJob).size() == 0) { - log.warn("【响应异常】该任务不存在,任务号:{}", mydoJobReAssign.getTaskCode()); - return; - } - - //更新任务参数 - mydoJob = mydoJobService.selectMydoJobByTaskNo(rwh); - mydoJob.setCargoSpaceId(mydoJobReAssign.getSiteCode()); - mydoJob.setExecutionPhase(TASK_EP_DDJ); - mydoJob.setFaultFlag("2"); + if (mydoJob != null && mydoJob.getExecutionPhase() != TASK_EXCEPTION_PUT) { + DdjDeviceExecutionQueue ddjDeviceExecutionQueue = ddjDeviceExecutionQueueService.selectDdjDeviceExecutionQueueByRwh(rwh, ddj.getId()); + //更新异常类型【FaultFlag】-1 + if ("0".equals(mydoJob.getFaultFlag()) && "1".equals(ddjDeviceExecutionQueue.getSpare1())) { + mydoJob.setStatus("1"); + //把执行阶段标记为【入库放货有货】的异常 + mydoJob.setExecutionPhase(TASK_EXCEPTION_PUT); mydoJobService.updateMydoJob(mydoJob); + } - //获取重分的货位重新向堆垛机下发任务 - BasCargoSpace basCargoSpace = basCargoSpaceService.selectBasCargoSpaceByWmsCargoSpaceId(mydoJob.getCargoSpaceId()); - ddjDeviceExecutionQueue.setMbph(basCargoSpace.getThePlatoon()); - ddjDeviceExecutionQueue.setMblh(basCargoSpace.getTheColumn()); - ddjDeviceExecutionQueue.setMbch(basCargoSpace.getTheFloor()); - ddjDeviceExecutionQueue.setDdjxf("0"); - ddjDeviceExecutionQueueService.updateDdjDeviceExecutionQueue(ddjDeviceExecutionQueue); - } +// //上报异常 - 向wms请求重分接口 +// TaskExceptionRequest taskExceptionRequest = new TaskExceptionRequest(); +// taskExceptionRequest.setTaskClass(mydoJob.getInOrOut().substring(0, 1)); +// taskExceptionRequest.setType(String.valueOf(TASK_EXCEPTION_STOCKIN_OCCUPIED)); +// taskExceptionRequest.setTaskCode(mydoJob.getWmsTaskNo()); +// taskExceptionRequest.setTaskTypeCode(WMS_TASK_TYPE_EXCEPTION);//todo 不知道填什么 +// taskExceptionRequest.setReqCode(UUID.randomUUID().toString().replace("-", "")); +// taskExceptionRequest.setAdverseCauses("当前位置已有货物,盘点后重新分配货位"); +// +// AjaxResult ajaxResult = apiService.reAssign(taskExceptionRequest); +// if (ajaxResult.isSuccess()){ +// //获取返回的任务号和新分配的货位 +// TaskExceptionReceive mydoJobReAssign = BeanUtil.toBean(ajaxResult.get("result"), TaskExceptionReceive.class); +// +// MydoJob wmsJob = new MydoJob(); +// wmsJob.setWmsTaskNo(mydoJobReAssign.getTaskCode()); +// if (mydoJobService.selectMydoJobList(wmsJob).size() == 0) { +// log.warn("【响应异常】该任务不存在,任务号:{}", mydoJobReAssign.getTaskCode()); +// return; +// } +// +// //更新任务参数 +// mydoJob = mydoJobService.selectMydoJobByTaskNo(rwh); +// mydoJob.setCargoSpaceId(mydoJobReAssign.getSiteCode()); +// mydoJob.setExecutionPhase(TASK_EP_DDJ); +// mydoJob.setFaultFlag("2"); +// mydoJobService.updateMydoJob(mydoJob); +// +// //获取重分的货位重新向堆垛机下发任务 +// BasCargoSpace basCargoSpace = basCargoSpaceService.selectBasCargoSpaceByWmsCargoSpaceId(mydoJob.getCargoSpaceId()); +// ddjDeviceExecutionQueue.setMbph(basCargoSpace.getThePlatoon()); +// ddjDeviceExecutionQueue.setMblh(basCargoSpace.getTheColumn()); +// ddjDeviceExecutionQueue.setMbch(basCargoSpace.getTheFloor()); +// ddjDeviceExecutionQueue.setDdjxf("0"); +// ddjDeviceExecutionQueueService.updateDdjDeviceExecutionQueue(ddjDeviceExecutionQueue); +// } } } // -------------------------------------- 4 取货无货,作废当前任务,重新分配单据 -------------------------------------- + //测试数据 // ddj.setCzfs(5); // ddj.setSbzt(1053); // ddj.setYxxf(1); // ddj.setJdbz(3); -// ddj.setRwh(Long.valueOf(51217)); +// ddj.setRwh(20021L); // ddj.setId(1); // 1.联机自动【5】 2.设备状态-取货无货【1053】 3.执行阶段【<5】(任务执行中) - if (ddj.getCzfs() == 5 && ddj.getSbzt() == 1053 && ddj.getJdbz() < 5) { + if (ddj.getSbzt() == 1053 && ddj.getJdbz() < 5) { Long rwh = ddj.getRwh(); MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(rwh); - //把执行阶段标记为【出库取货无货】的异常 - mydoJob.setExecutionPhase(TASK_EXCEPTION_PICK); - mydoJobService.updateMydoJob(mydoJob); - //无货异常处理 - DdjDeviceExecutionQueue ddjDeviceExecutionQueue = ddjDeviceExecutionQueueService.selectDdjDeviceExecutionQueueByRwh(rwh,ddj.getId()); - - //找到对应任务 调用api接口 取货无货,重新分配单据 - if (ObjUtil.isNotNull(ddjDeviceExecutionQueue)) { - - //向wms返回异常信息 - TaskExceptionRequest taskExceptionRequest = new TaskExceptionRequest(); - taskExceptionRequest.setTaskClass(mydoJob.getInOrOut()); - taskExceptionRequest.setType(String.valueOf(TASK_EXCEPTION_STOCKIN_OCCUPIED)); - taskExceptionRequest.setTaskCode(String.valueOf(mydoJob)); - taskExceptionRequest.setTaskTypeCode("");//todo 不知道填什么 - taskExceptionRequest.setReqCode(UUID.randomUUID().toString().replace("-", "")); - taskExceptionRequest.setAdverseCauses("取货位置空,盘点后作废该任务"); - - AjaxResult ajaxResult = apiService.reMaterial(taskExceptionRequest); - if (ajaxResult.isSuccess()) { - //作废作业 - InvalidMydoJob(rwh, ddj.getId()); - - //清空/重置【取货无货】的出库异常货位库存信息 - basCargoSpaceService.resetCargoSpaceByStockoutException(mydoJob.getCargoSpaceId()); - } + if (mydoJob != null && mydoJob.getExecutionPhase() != TASK_EXCEPTION_PICK) { + //把执行阶段标记为【出库取货无货】的异常 + mydoJob.setExecutionPhase(TASK_EXCEPTION_PICK); + mydoJobService.updateMydoJob(mydoJob); } + + +// //无货异常处理 +// DdjDeviceExecutionQueue ddjDeviceExecutionQueue = ddjDeviceExecutionQueueService.selectDdjDeviceExecutionQueueByRwh(rwh,ddj.getId()); +// +// //找到对应任务 调用api接口 取货无货,重新分配单据 +// if (ObjUtil.isNotNull(ddjDeviceExecutionQueue)) { +// +// //向wms返回异常信息 +// TaskExceptionRequest taskExceptionRequest = new TaskExceptionRequest(); +// taskExceptionRequest.setTaskClass(mydoJob.getInOrOut().substring(0, 1)); +// taskExceptionRequest.setType(String.valueOf(TASK_EXCEPTION_STOCKIN_OCCUPIED)); +// taskExceptionRequest.setTaskCode(String.valueOf(mydoJob)); +// taskExceptionRequest.setTaskTypeCode(WMS_TASK_TYPE_EXCEPTION);//todo 不知道填什么 +// taskExceptionRequest.setReqCode(UUID.randomUUID().toString().replace("-", "")); +// taskExceptionRequest.setAdverseCauses("取货位置空,盘点后作废该任务"); +// +// AjaxResult ajaxResult = apiService.reMaterial(taskExceptionRequest); +// if (ajaxResult.isSuccess()) { +// //作废作业 +// InvalidMydoJob(rwh, ddj.getId()); +// +// //清空/重置【取货无货】的出库异常货位库存信息 +// basCargoSpaceService.resetCargoSpaceByStockoutException(mydoJob.getCargoSpaceId()); +// } +// } } // -------------------------------------- 5 下发堆垛机任务 -------------------------------------- //重分货位后重下 - if (ddj.getYxxf() == 1 && ddj.getCzfs() == 5 && ddj.getSbzt() == 1052) { + if (ddj.getYxxf() == 1 && ddj.getSbzt() == 1052) { Long rwh = ddj.getRwh(); //查询执行中的作业 @@ -266,16 +281,16 @@ public class DdjThread implements Runnable { ddjDeviceExecutionQueueService.updateDdjDeviceExecutionQueue(ddjDeviceExecutionQueue); mydoJob.setFaultFlag("0"); mydoJobService.updateMydoJob(mydoJob); - log.info("【入库异常】堆垛机放货目标有货,重分货位下发任务成功 rwh:{}", rwh); + log.info("【入库异常】堆垛机放货目标有货,重分货位下发堆垛机任务成功 rwh:{}", rwh); } else { - log.error("【出库异常】堆垛机放货目标有货,重分货位下发任务失败!!!!!!!"); + log.error("【入库异常】重分货位 - 下发堆垛机任务失败!!!!!!!"); } } } } //正常下发 - if (ddj.getYxxf() == 1 && ddj.getCzfs() == 5 && ddj.getSbzt() == 0 ) { + if (ddj.getYxxf() == 1 && ddj.getSbzt() == 0 ) { //检查是否有正在执行的堆垛机队列 Long rwh = ddj.getRwh(); DdjDeviceExecutionQueue ddjDeviceExecutionQueueRunningParam = new DdjDeviceExecutionQueue(); @@ -348,9 +363,10 @@ public class DdjThread implements Runnable { int mbch = Convert.toInt(queue.getMbch()); int mlfs = 5; int xfwc = 1; - int rwlx = Convert.toInt(queue.getSpare1()); - int jym = Tools.getJYM(taskNo, yph, ylh, ych, mbph, mblh, mbch, mlfs, rwlx); - byte[] sendData = Tools.sendDataToDevice(taskNo, null, yph, ylh, ych, mbph, mblh, mbch, mlfs, rwlx, xfwc, jym); + int hwlx = Convert.toInt(queue.getSpare1()); +// int hwlx = 0;//默认值 + int jym = Tools.getJYM(taskNo, yph, ylh, ych, mbph, mblh, mbch, mlfs, hwlx); + byte[] sendData = Tools.sendDataToDevice(taskNo, null, yph, ylh, ych, mbph, mblh, mbch, mlfs, hwlx, xfwc, jym); if (devId==1){ return PlcDdj1Read.WriteToDDJ("DB61.0", sendData); }else { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/PortConvThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/PortConvThread.java index 3521ea6..9505302 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/PortConvThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/PortConvThread.java @@ -4,15 +4,14 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.UUID; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; import com.ruoyi.api.domain.wcs2wms.stockin.StockinReceive; import com.ruoyi.api.service.IApiService; import com.ruoyi.bas.cargospace.domain.BasCargoSpace; import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService; -import com.ruoyi.common.ConvException; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.device.ssj.domain.DeviceSsj; -import com.ruoyi.job.domain.JobCallBack; import com.ruoyi.job.domain.MydoJob; import com.ruoyi.job.service.IJobCallBackService; import com.ruoyi.job.service.IMydoJobService; @@ -31,7 +30,6 @@ import java.util.regex.Pattern; import static com.ruoyi.common.TaskStatusCode.*; import static com.ruoyi.common.WmsTaskTypeCode.WMS_TASK_TYPE_STOCKIN; -import static com.ruoyi.common.WmsTaskTypeCode.WMS_TASK_TYPE_STOCKOUT; import static com.ruoyi.schedule.plcRead.ssj.PlcSsjRead.writeToSsj; /** @@ -57,7 +55,7 @@ public class PortConvThread implements Runnable { ssjCodeList = new HashMap<>(); ArrayList ssjCodes = new ArrayList<>(); ssjCodes.add("G1004"); -// ssjCodes.add("L1003"); + ssjCodes.add("TD1001"); ssjCodeList.put("portConv", ssjCodes); apiService = SpringUtils.getBean(IApiService.class); // agvQueueService = SpringUtils.getBean(IAgvQueueService.class); @@ -78,8 +76,13 @@ public class PortConvThread implements Runnable { for (String ssjCode : ssjCodeList.get(type)) { try { if (PlcSsjRead.deviceSsjMap.containsKey(ssjCode)) { - inDispatch(PlcSsjRead.deviceSsjMap.get(ssjCode)); -// inDispatch1(PlcSsjRead.deviceSsjMap.get(ssjCode)); + if (ssjCode == "G1004"){ + inDispatch(PlcSsjRead.deviceSsjMap.get(ssjCode)); + } + if (ssjCode == "TD1001"){ + outDispatch(PlcSsjRead.deviceSsjMap.get(ssjCode)); + } + } else { log.error("设备不存在 ssjCode:{}", ssjCode); } @@ -88,6 +91,7 @@ public class PortConvThread implements Runnable { } } break; + } } try { @@ -103,42 +107,42 @@ public class PortConvThread implements Runnable { public void inDispatch(DeviceSsj inSsjDevice) { // 测试数据 // inSsjDevice.setInOrOut(1); -// inSsjDevice.setTrayCode("T888888"); -// inSsjDevice.setTaskNo(85012); +// inSsjDevice.setTrayCode("T000004503"); +// inSsjDevice.setTaskNo(777778); // inSsjDevice.setKx(0); // inSsjDevice.setDw(1); -// inSsjDevice.setHeight("1"); +// inSsjDevice.setHeight(1); // inSsjDevice.setWeight("100"); // inSsjDevice.setException(0); // inSsjDevice.setRkqq(1); - //todo 是否需要校验出入库模式 - switch (inSsjDevice.getInOrOut()) { - //---------------------------入库模式--------------------------- - case 1: - //---------------------------入口取输送机(叉车取放货位置)--------------------------- - //输送机【非空闲】、【输送到位】、【入库请求?】 - if (inSsjDevice.getKx() != 1 && inSsjDevice.getDw() == 1) { - - //更新入库任务阶段 - updateMydoJob(inSsjDevice); - - //请求wms获取入库任务 - requestMydoJob(inSsjDevice); - - } - break; - //---------------------------出库模式--------------------------- - case 2: - finishStockoutMydoJob(inSsjDevice); - break; - - } - + //更新入库任务阶段 + updateMydoJob(inSsjDevice); + //请求wms获取入库任务 + requestMydoJob(inSsjDevice); } + /** + * 输送机到位判断校验 + * @param inSsjDevice + * @return + */ + private boolean convChecked(DeviceSsj inSsjDevice){ + + boolean flag = false; + //---------------------------入口取输送机(叉车取放货位置)--------------------------- + //输送机【非空闲】、【输送到位】、【入库请求?】 + if (inSsjDevice.getKx() != 0) return flag; + + if (inSsjDevice.getRkqq() != 1) return flag; + + if (inSsjDevice.getHeight() == 0) return flag; + + return true; + } + /** * 请求wms获取wcs任务参数 @@ -146,103 +150,68 @@ public class PortConvThread implements Runnable { */ private void requestMydoJob(DeviceSsj inSsjDevice){ - //校验:入库请求 - if (inSsjDevice.getRkqq() != 1) { - return; - } + if (!convChecked(inSsjDevice)) return; + + String errorMessage = ""; AjaxResult ajaxResult; - //请求参数 + //初始化请求wms参数 HashMap paramMap = new HashMap<>(); - paramMap.put("taskTypeCode", WMS_TASK_TYPE_STOCKIN);//todo wms自定义的任务类型编号 + paramMap.put("taskTypeCode", WMS_TASK_TYPE_STOCKIN);//wms自定义的任务类型编号 paramMap.put("reqCode", UUID.randomUUID().toString());//请求码 paramMap.put("cntCode", inSsjDevice.getTrayCode());//容器编号 int height = inSsjDevice.getHeight(); -// String weight = inSsjDevice.getWeight();//todo 需要直读重量或从plc读值? - paramMap.put("weight", getWeightByMoxa(MOXA_IP, MOXA_PORT, SO_TIMEOUT_MS));//重量 +// String weight = inSsjDevice.getWeight();//不需要直读重量或从plc读值,wms不需要该参数 +// paramMap.put("weight", getWeightByMoxa(MOXA_IP, MOXA_PORT, SO_TIMEOUT_MS));//重量 paramMap.put("altimetry", height);//高度 - String errorMessage = ""; + paramMap.put("adverseCauses", errorMessage); +// if (inSsjDevice.getException() > 0){ +// log.warn("【入库异常】{}",errorMessage); +// } - //-----------------校验:入库口异常上报----------------- - switch (inSsjDevice.getException()) { - - //外形检测异常 - case ConvException.CHECK_SIZE_EXCEPTION: - errorMessage = "外形检测异常-货物超高"; - break; - - //超重检测 - case ConvException.CHECK_OVERWEIGHT_EXCEPTION: - errorMessage = "外形检测异常-货物超重"; - break; - - //扫码异常 - case ConvException.CHECK_BARCODE_EXCEPTION: - if (inSsjDevice.getTrayCode() == "") { - errorMessage = "条码扫描失败:未扫到条码"; - }else{ - //todo 条码格式校验 - errorMessage = "条码扫描异常:格式错误"; - } - break; - } - - if (inSsjDevice.getException() > 0){ - paramMap.put("adverseCauses", errorMessage); - ajaxResult = apiService.createInMydoJobException(paramMap); - if (ajaxResult.isSuccess()) { - //向输送机下发退回 - int i = writeToSsj(inSsjDevice.getPlcDbWriteAddress(), "99", 99, 1); - if (i == 1) { - log.warn("【入库异常】{}",errorMessage); - } - - } - } - - - - //-----------------校验:条码已有库存----------------- + //-----------------警告校验:条码已有库存----------------- BasCargoSpace cargoSpace = new BasCargoSpace(); cargoSpace.setTrayCode(inSsjDevice.getTrayCode()); if (!basCargoSpaceService.selectBasCargoSpaceList(cargoSpace).isEmpty()) { - log.warn("【生成wcs任务异常】该托盘号已有库存,托盘条码:{}",inSsjDevice.getTrayCode()); - return; + log.warn("【警告】该托盘号已有库存,托盘条码:{}",inSsjDevice.getTrayCode()); } - //-----------------请求生成wcs任务----------------- + /*-----------------请求生成wcs任务----------------- */ ajaxResult = apiService.createMydoJobForStockin(paramMap); if (ajaxResult.isSuccess()) { - //获取wms下发的任务号和分配货位 + //解析wms下发的响应参数(任务号和货位) StockinReceive result = BeanUtil.toBean(ajaxResult.get("data"), StockinReceive.class); - MydoJob mydoJob = new MydoJob(); - mydoJob.setTrayCode(result.getCntCode()); - mydoJob.setCargoSpaceId(result.getSiteCode()); - mydoJob.setWmsTaskNo(result.getTaskCode()); - mydoJob.setJobId(mydoJobService.getJobId("RK")); - mydoJob.setTaskNo(mydoJobService.getTaskNo("1")); - // mydoJob.setTaskNo(result.getTaskCode());//需要确定是否用获取的任务号作为wcs的任务号 //校验:wms分配的货位(排列层)是否合法 if (result.getSiteCode() == null || result.getSiteCode().isEmpty()) { - log.info("【请求参数异常】分配货位:null,无法生成作业,托盘条码:{}",inSsjDevice.getTrayCode()); + errorMessage = "wms下发货位错误,任务生成失败!"; + paramMap.put("adverseCauses", errorMessage); + apiService.createInMydoJobException(paramMap); + log.info("【响应参数异常】分配货位:null,无法生成作业,托盘条码:{}",inSsjDevice.getTrayCode()); return; - }else { -// mydoJob.setRoadwayId(basCargoSpaceService.selectBasCargoSpaceByWmsCargoSpaceId(mydoJob.getCargoSpaceId()).getRoadwayId()); } - mydoJob.setStatus("1"); - mydoJob.setInOrOut("1"); - mydoJob.setRoadwayId("1"); - mydoJob.setEntranceId("G1004"); - mydoJob.setExecutionPhase(TASK_EP_CREATE); - mydoJob.setCreateTime(new Date()); -// mydoJob.setTraySize(Convert.toStr(inSsjDevice.getTraySize())); - mydoJob.setFaultFlag("0"); - mydoJob.setPriority(10L); + //初始化要生成的任务 + MydoJob mydoJob = new MydoJob().builder() + // mydoJob.setTaskNo(result.getTaskCode());//如果需要用wms下发的任务号作为wcs的任务号使用 + .trayCode(result.getCntCode()) + .cargoSpaceId(result.getSiteCode()) + .wmsTaskNo(result.getTaskCode()) + .jobId(mydoJobService.getJobId("RK")) + .taskNo(mydoJobService.getTaskNo("1")) + .traySize(String.valueOf(inSsjDevice.getHeight())) + .status(TASK_STATUS_CREATED) + .inOrOut("1") + .roadwayId(basCargoSpaceService.selectBasCargoSpaceByWmsCargoSpaceId(result.getSiteCode()).getRoadwayId())//获取货位表货位对应的巷道号 + .entranceId("G1004") + .executionPhase(TASK_EP_CREATED) + .faultFlag("0") + .priority(10L) + .build(); + //如果还没有wcs任务 - 生成一条任务 if (mydoJobService.selectInOrOutMydoJobList(mydoJob).isEmpty()) { @@ -253,10 +222,10 @@ public class PortConvThread implements Runnable { }else{ //请求生成wcs任务失败 //todo 向输送机下发退回 - int i = writeToSsj(inSsjDevice.getPlcDbWriteAddress(), "99", 99, 1); + int i = writeToSsj(inSsjDevice.getPlcDbWriteAddress(), "99", 2, 1); //todo 接口调用失败处理 - log.info("【入库请求】请求生成wcs作业失败退回,请重试,响应内容:{}", ajaxResult.get("data").toString()); + log.info("【入库请求】请求生成wcs作业失败退回,请检查网络或请求参数,请求内容:{}", JSON.toJSONString(paramMap)); } } @@ -267,39 +236,43 @@ public class PortConvThread implements Runnable { */ private void updateMydoJob(DeviceSsj inSsjDevice){ - //检查是否有已经创建成功的任务 - 更新到下一个执行阶段 - MydoJob mydoJobStockin = new MydoJob(); - mydoJobStockin.setTrayCode(inSsjDevice.getTrayCode()); - mydoJobStockin.setExecutionPhase(TASK_EP_CREATE); - if(mydoJobService.selectMydoJobList(mydoJobStockin).isEmpty()){ - //输送机扫描有条码但无任务 - log.info("【异常任务】请检查条码扫描结果与托盘实际条码是否一致,扫描条码:{}", inSsjDevice.getTrayCode()); - }else{ + if (!convChecked(inSsjDevice)) return; + + //检查是否有已经创建成功的任务(请求成功的入库任务) - 更新到下一个执行阶段 + MydoJob mydoJobStockin = new MydoJob().builder() + .trayCode(inSsjDevice.getTrayCode()) + .status(TASK_EP_CREATED) + .executionPhase(TASK_EP_CREATED) + .build(); + if(!mydoJobService.selectMydoJobList(mydoJobStockin).isEmpty()){ mydoJobStockin = mydoJobService.selectMydoJobList(mydoJobStockin).get(0); //如果已经生成入库任务 - 向输送机下发任务号 - //todo 调整输送去向值 - int i = writeToSsj(inSsjDevice.getPlcDbWriteAddress(), mydoJobStockin.getTaskNo(), Integer.parseInt(mydoJobStockin.getTraySize()), 1); + //输送去向值【1】 + int i = writeToSsj(inSsjDevice.getPlcDbWriteAddress(), mydoJobStockin.getTaskNo(), 1, 1); // int i = 1; if (i == 1) { //写入成功则更新执行阶段 + mydoJobStockin.setStatus(TASK_STATUS_RUNNING); mydoJobStockin.setExecutionPhase(TASK_EP_SSJ); mydoJobService.updateMydoJob(mydoJobStockin); log.info("【更新状态】G1004入口输送机下发任务号成功:{}", mydoJobStockin.getTaskNo()); } } + } + /** * 输送机出库到位 - 任务出库完成 - * @param inSsjDevice + * @param outSsjDevice */ - private void finishStockoutMydoJob(DeviceSsj inSsjDevice){ + private void finishStockoutMydoJob(DeviceSsj outSsjDevice){ //出库到位 - if (inSsjDevice.getDw() == 1 && inSsjDevice.getTaskNo() > 0) { + if (outSsjDevice.getDw() == 1 && outSsjDevice.getTaskNo() > 0) { //查询该出库任务 - MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Convert.toLong(inSsjDevice.getTaskNo())); + MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Convert.toLong(outSsjDevice.getTaskNo())); if (mydoJob != null && Integer.parseInt(mydoJob.getInOrOut()) > 20) { - log.info("【出库到位】设备:{},位置:{},任务号:{},出库到位", "输送线:", inSsjDevice.getDeviceCode(), mydoJob.getTaskNo()); + log.info("【出库到位】设备:{},位置:{},任务号:{},出库到位", "输送线:", outSsjDevice.getDeviceCode(), mydoJob.getTaskNo()); mydoJob.setExecutionPhase(TASK_EP_SSJ_STOCKOUT_FINISH); mydoJobService.updateMydoJob(mydoJob); mydoJobService.taskFinish(Long.valueOf(mydoJob.getTaskNo())); @@ -378,6 +351,7 @@ public class PortConvThread implements Runnable { public void inDispatch1(DeviceSsj ssjDevice) { + //有入库请求就肯定是电气的任务号的作业 if(StrUtil.isNotBlank(ssjDevice.getTrayCode()) && ssjDevice.getRkqq()==1 && ssjDevice.getTaskNo()<1000){ //,如果有正执行的出库作业退回 @@ -422,7 +396,7 @@ public class PortConvThread implements Runnable { if(ajaxResult.isSuccess()){ MydoJob mydoJob2 = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class); mydoJob2.setStatus("1"); - mydoJob2.setExecutionPhase(TASK_EP_CREATE); + mydoJob2.setExecutionPhase(TASK_EP_CREATED); mydoJob2.setCreateTime(new Date()); mydoJob2.setFaultFlag("0"); mydoJob2.setPriority(10L); @@ -446,6 +420,12 @@ public class PortConvThread implements Runnable { } + public void outDispatch(DeviceSsj ssjDevice) { + + finishStockoutMydoJob(ssjDevice); + + } + private static final Map PATTERNS = createPatterns(); private static Map createPatterns() { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/RoadConvThread.java b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/RoadConvThread.java index 5733061..ed4281c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/RoadConvThread.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/schedule/scheduleTask/ssj/RoadConvThread.java @@ -22,6 +22,8 @@ import lombok.extern.slf4j.Slf4j; import java.util.*; +import static com.ruoyi.common.ConvType.CONV_ROAD_1; +import static com.ruoyi.common.ConvType.CONV_STOCKOUT; import static com.ruoyi.common.TaskStatusCode.*; import static com.ruoyi.common.TaskType.*; @@ -54,7 +56,7 @@ public class RoadConvThread implements Runnable { ddjDeviceExecutionQueueService = SpringUtils.getBean(IDdjDeviceExecutionQueueService.class); //初始化巷道口 排 列 层 //todo 核对堆垛机取放位置的货位编码 - roadwayMap.put("L1001", Arrays.asList(2, 0, 1)); + roadwayMap.put("L1001", Arrays.asList(2, 1, 1)); // roadwayMap.put("L1004", Arrays.asList(4, 0, 1)); log.info("初始化服务 {},{}", apiService, agvQueueService); } @@ -148,14 +150,17 @@ public class RoadConvThread implements Runnable { ddjDeviceExecutionQueue.setMbch(Convert.toInt(basCargoSpace.getTheFloor())); ddjDeviceExecutionQueue.setDdjxf("0"); ddjDeviceExecutionQueue.setMlfs(5); -// ddjDeviceExecutionQueue.setSpare1(mydoJob.getTraySize()); + ddjDeviceExecutionQueue.setSpare1(mydoJob.getTraySize());//货物高度 ddjDeviceExecutionQueue.setScsj(DateUtil.formatDateTime(DateUtil.date())); ddjDeviceExecutionQueue.setRwlx(DDJ_RWLX_3); ddjDeviceExecutionQueueService.insertDdjDeviceExecutionQueue(ddjDeviceExecutionQueue); - //下发后更新任务阶段 - mydoJob.setExecutionPhase(TASK_EP_DDJ); - mydoJobService.updateMydoJob(mydoJob); + if (ddjDeviceExecutionQueueService.selectDdjDeviceExecutionQueueList(ddjDeviceExecutionQueue).size() > 0){ + //下发后更新任务阶段 + mydoJob.setExecutionPhase(TASK_EP_DDJ); + mydoJobService.updateMydoJob(mydoJob); + } + } } } @@ -172,7 +177,7 @@ public class RoadConvThread implements Runnable { if(roadSsjDevice.getKx()==1 && roadSsjDevice.getTaskNo() == 0){ //检查是否有入口是【G1004】的入库任务 - String exitId = "G1004"; + String exitId = CONV_STOCKOUT; List inList = mydoJobService.getInJobByEntranceId(exitId); if(inList.size() == 0){ @@ -204,7 +209,7 @@ public class RoadConvThread implements Runnable { ddjDeviceExecutionQueue.setMbch(pclList.get(2)); ddjDeviceExecutionQueue.setDdjxf("0"); ddjDeviceExecutionQueue.setMlfs(5); - ddjDeviceExecutionQueue.setSpare1(mydoJob.getTraySize()); + ddjDeviceExecutionQueue.setSpare1(mydoJob.getTraySize());//货物高度 ddjDeviceExecutionQueue.setScsj(DateUtil.formatDateTime(DateUtil.date())); ddjDeviceExecutionQueue.setRwlx(DDJ_RWLX_2); ddjDeviceExecutionQueueService.insertDdjDeviceExecutionQueue(ddjDeviceExecutionQueue); diff --git a/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml b/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml index ab4364e..d342f88 100644 --- a/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/job/MydoJobMapper.xml @@ -31,6 +31,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,flag,tray_code,tray_size,wms_task_no from mydo_job_wcs + + select top 1 job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,flag,tray_code,tray_size,wms_task_no from mydo_job_wcs + select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,flag,tray_code,tray_size,wms_task_no from mydo_job_wcs_finish @@ -273,13 +276,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + +