| src/main/java/com/zy/api/controller/WcsApiController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/api/controller/params/ReceviceTaskParams.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/api/controller/params/WorkTaskParams.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/api/service/WcsApiService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/entity/LocDetl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/task/WorkMastScheduler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/api/controller/WcsApiController.java
@@ -79,4 +79,17 @@ } return wcsApiService.pubWrkToWcs(params); } @ManagerAuth @ApiOperation("设备执行状态回写") @PostMapping("/openapi/report") public R receviceTaskFromWcs(@RequestBody ReceviceTaskParams params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } return wcsApiService.receviceTaskFromWcs(params); } } src/main/java/com/zy/api/controller/params/ReceviceTaskParams.java
@@ -1,7 +1,9 @@ package com.zy.api.controller.params; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import io.swagger.models.auth.In; import lombok.Data; import lombok.experimental.Accessors; @@ -15,4 +17,28 @@ @ApiModelProperty("机台号") private String deviceNo; @ApiModelProperty("流水号") private Integer id; @ApiModelProperty("通知类型:task") private String notifyType; @ApiModelProperty("堆垛机号") private Integer device; @ApiModelProperty("WCS任务号") private String taskNo; @ApiModelProperty("WMS任务号") private String superTaskNo; @ApiModelProperty("消息类型:task_complete、task_cancel") private String msgType; @ApiModelProperty("消息描述") private String msgDesc; @ApiModelProperty("消息数据") private String data; } src/main/java/com/zy/api/controller/params/WorkTaskParams.java
@@ -28,7 +28,7 @@ private String barcode; @ApiModelProperty("优先级") private String taskPri; private Integer taskPri; @ApiModelProperty("出库站点") private String staNo; src/main/java/com/zy/api/service/WcsApiService.java
@@ -44,4 +44,13 @@ * @param type */ void reportLockLocs(Set<String> locs, String type); /** * 堆垛机任务完成状态上报 * @author Ryan * @date 2026/1/10 16:29 * @param params * @return com.core.common.R */ R receviceTaskFromWcs(ReceviceTaskParams params); } src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
@@ -175,4 +175,47 @@ } } /** * 堆垛机执行状态上报 * @author Ryan * @date 2026/1/10 16:30 * @param params * @return com.core.common.R */ @Override @Transactional(rollbackFor = Exception.class) public R receviceTaskFromWcs(ReceviceTaskParams params) { if (Objects.isNull(params.getDevice())) { throw new CoolException("设备号不能为空!!"); } if (Objects.isNull(params.getSuperTaskNo())) { throw new CoolException("WMS任务号不能为空!!"); } if (Objects.isNull(params.getMsgType())) { throw new CoolException("动作类型不能为空!!"); } WrkMast mast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_code", params.getSuperTaskNo())); if (Objects.isNull(mast)) { throw new CoolException("任务档不存在!!"); } if (!Objects.isNull(params.getMsgType()) && params.getMsgType().equals("task")) { throw new CoolException("消息不能为空!!"); } if (params.getMsgType().equals("task_complete")) { mast.setWrkSts(4L); if (!wrkMastService.updateById(mast)) { throw new CoolException("任务状态修改失败!!"); } } else if (params.getMsgType().equals("task_cancel")){ } // if (!wrkMastService.updateById(mast)) { // throw new CoolException("任务状态修改失败!!"); // } return R.ok(); } } src/main/java/com/zy/asrs/entity/LocDetl.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.SpringUtils; @@ -25,13 +26,12 @@ @Data @TableName("asr_loc_detl") @Accessors(chain = true) @ExcelIgnoreUnannotated public class LocDetl implements Serializable { private static final long serialVersionUID = 1L; @TableId @TableId(value = "id", type = IdType.AUTO) private Long id; @TableField("loc_id") src/main/java/com/zy/asrs/task/WorkMastScheduler.java
@@ -1,5 +1,8 @@ package com.zy.asrs.task; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.zy.api.controller.params.WorkTaskParams; import com.zy.api.service.WcsApiService; import com.zy.asrs.entity.Task; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.service.TaskService; @@ -12,6 +15,8 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; @@ -29,6 +34,8 @@ private WorkMastHandler workMastHandler; @Autowired private TaskService taskService; @Autowired private WcsApiService wcsApiService; @Scheduled(cron = "0/3 * * * * ? ") private void execute(){ @@ -49,23 +56,36 @@ } } @Scheduled(cron = "0/3 * * * * ? ") private void executeTask(){ List<Task> wrkMasts = taskService.selectToBeCompleteData(); /** * 任务自动下发 * * @author Ryan * @date 2026/1/10 14:42 */ // @Scheduled(cron = "0/15 * * * * ? ") private void autoPubTasks() { List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts", Arrays.asList(1L, 11L))); if (wrkMasts.isEmpty()) { return; } for (Task wrkMast : wrkMasts) { ReturnT<String> returnT = workMastHandler.AgvStart(wrkMast); if (!returnT.isSuccess()) { wrkMast.setUpdMk("X"); wrkMast.setErrorMemo(returnT.getMsg()); wrkMast.setErrorTime(new Date()); if (!taskService.updateById(wrkMast)) { log.error("工作档[workNo={}]标记待处理失败", wrkMast.getWrkNo()); Collections.shuffle(wrkMasts); wrkMasts.forEach(wrkMast -> { WorkTaskParams params = new WorkTaskParams(); if (wrkMast.getIoType().equals(1)) { params.setType("in"); params.setTaskNo(wrkMast.getWrkCode()) .setLocNo(wrkMast.getLocNo()) .setBarcode(wrkMast.getBarcode()) .setTaskPri(Integer.parseInt(wrkMast.getIoPri() + "")); } else { params.setType("out") .setTaskNo(wrkMast.getWrkCode()) .setLocNo(wrkMast.getLocNo()) .setStaNo(wrkMast.getStaNo()) .setTaskPri(Integer.parseInt(wrkMast.getIoPri() + "")); } wcsApiService.pubWrkToWcs(params); }); } } } } src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -138,6 +138,11 @@ } } //判断匹配编码不为空,且任务编码包含-2,确认为有上组任务 if (!Objects.isNull(wrkMast.getWrkCode()) && wrkMast.getWrkCode().contains("-2")) { //不需要更新单据信息(子任务无单据 } else { //正常单据才存存入库单,作入库单据信息更新 // 更新订单完成数量 OrderDetlPakin orderDetlPakin = orderDetlPakinService.selectItem (wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(), @@ -161,7 +166,7 @@ } } catch (Exception ignore) { } } } // 修改库位状态 S ====>> F if (locMast.getLocSts().equals("S")) { @@ -567,158 +572,6 @@ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg(e.getMessage()); } return SUCCESS; } /** * @author Ryan * @date 2025/9/23 * @description: AGV任务完成加入历史档 * @version 1.0 */ @Transactional(rollbackFor = Exception.class) public ReturnT<String> AgvStart(Task task) { // 4.入库完成 if (task.getWrkSts() == 4) { return agvDoIn(task); // 14.出库完成 } else if (task.getWrkSts() == 14) { return agvDoOut(task); } return SUCCESS; } /** * @author Ryan * @date 2025/9/25 * @description: AGV出库任务 * @version 1.0 */ public ReturnT<String> agvDoOut(Task task) { if (task.getIoType().equals(101)) { Date now = new Date(); LocCache locMast = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no" ,task.getSourceLocNo())); if (Objects.isNull(locMast)) { throw new RuntimeException("数据错误:库位信息不能为空!!"); } List<TaskDetl> wrkDetls101 = taskDetlService.selectList(new EntityWrapper<TaskDetl>().eq("wrk_no", task.getWrkNo())); if (wrkDetls101.isEmpty()) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg("全板出库 ===>> 工作明细档为空; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]"); } for (TaskDetl wrkDetl : wrkDetls101) { // 更新订单完成数量 OrderDetlPakout orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3()); if (orderDetlPakout == null) { orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3()); } try { if (!Cools.isEmpty(orderDetlPakout)) { if (!orderDetlPakoutService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), orderDetlPakout.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(), wrkDetl.getAnfme())) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg("全板出库 ===>> 更新订单完成数量失败; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]"); } } } catch (Exception ignore) { } } // 删除工作档源库位的库存明细 if (!locDetlService.delete(new EntityWrapper<LocDetl>().eq("loc_no", task.getSourceLocNo()))) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg("全板出库 ===>> 删除库存明细失败; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]"); } // 修改源库位状态 R ===>> O if (locMast.getLocSts().equals(LocStsType.LOC_STS_TYPE_R.type)) { locMast.setLocSts(LocStsType.LOC_STS_TYPE_O.type); locMast.setBarcode(""); locMast.setModiTime(now); locMast.setIoTime(now); if (!locCacheService.updateById(locMast)) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg("全板出库 ===>> 修改源库位状态失败; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]"); } } else { throw new CoolException("当前库位状态" + locMast.getLocSts() + ", 无法执行出库操作!!"); } BasStation devNo = basStationService.selectOne(new EntityWrapper<BasStation>().eq("dev_no", task.getStaNo())); if (Objects.isNull(devNo)) { throw new CoolException("站点:" + task.getSourceStaNo() + ", 不存在!!"); } devNo.setLocSts(LocStsType.LOC_STS_TYPE_F.type); devNo.setModiTime(new Date()); if (!basStationService.updateById(devNo)) { throw new CoolException("站点信息修改失败!!"); } task.setWrkSts(15L); if (!taskService.updateById(task)) { throw new CoolException("任务状态修改失败!!"); } } else { } return SUCCESS; } @Transactional(rollbackFor = Exception.class) public ReturnT<String> agvDoIn(Task wrkMast) { LocCache locCache = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", wrkMast.getLocNo())); if (Objects.isNull(locCache)) { throw new CoolException("数据错误,库位不存在!!"); } if (!locCache.getLocSts().equals(LocStsType.LOC_STS_TYPE_S.type)) { throw new CoolException("当前库位状态为:" + LocStsType.LOC_STS_TYPE_S.type + "." + LocStsType.LOC_STS_TYPE_S.desc + ",不是出库预约状态"); } List<WaitPakin> apallet = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", wrkMast.getBarcode())); if (Objects.isNull(apallet)) { throw new CoolException("数据错误:组托数据不存在!!"); } apallet.forEach(pakin -> { LocDetl detl = new LocDetl(); BeanUtils.copyProperties(pakin, detl); detl.setBarcode(pakin.getBarcode()) .setAnfme(pakin.getAnfme()) .setBrand(pakin.getBrand()) .setAppeTime(new Date()) .setSpecs(pakin.getSpecs()) .setColor(pakin.getColor()) .setLocId(locCache.getId()) .setLocNo(locCache.getLocNo()) .setAreaId(locCache.getAreaId()) .setAreaName(locCache.getAreaName()) .setUnit(pakin.getUnit()) .setBatch(pakin.getBatch()); if (!locDetlService.insert(detl)) { throw new CoolException("库位明细保存失败!!"); } }); locCache.setLocSts(LocStsType.LOC_STS_TYPE_F.type); locCache.setModiTime(new Date()); locCache.setBarcode(wrkMast.getBarcode()); locCache.setModiTime(new Date()); locCache.setIoTime(new Date()); if (!locCacheService.updateById(locCache)) { throw new CoolException("库位状态修改失败!"); } wrkMast.setWrkSts(5L); wrkMast.setModiTime(new Date()); if (!taskService.updateById(wrkMast)) { throw new CoolException("任务状态修改失败!!"); } Set<Long> list = apallet.stream().map(WaitPakin::getOrderId).collect(Collectors.toSet()); List<OrderPakin> pakins = orderPakinService.selectList(new EntityWrapper<OrderPakin>().in("id", list)); if (Objects.isNull(pakins) || pakins.isEmpty()) { throw new CoolException("单据不存在!!"); } return SUCCESS; } }