diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/controller/wcs/WcsController.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/controller/wcs/WcsController.java index 5da8bc0..1404501 100644 --- a/wms_serve_nantong_yachi/src/main/java/com/wms_main/controller/wcs/WcsController.java +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/controller/wcs/WcsController.java @@ -23,7 +23,4 @@ public class WcsController { public WcsApiResponse requireInTask(@RequestBody WcsVehicleInRequest request) { return wcsControllerService.requireInTask(request); } - - - } diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/controller/ycwms/YcwmsController.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/controller/ycwms/YcwmsController.java index e803d76..af0aa68 100644 --- a/wms_serve_nantong_yachi/src/main/java/com/wms_main/controller/ycwms/YcwmsController.java +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/controller/ycwms/YcwmsController.java @@ -44,9 +44,4 @@ public class YcwmsController { public YcwmsResponse> stock(@RequestBody StockReq request) { return ycwmsControllerService.stock(request); } - - - - - } diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/model/dto/query/OrderInQuery.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/model/dto/query/OrderInQuery.java new file mode 100644 index 0000000..61ef72c --- /dev/null +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/model/dto/query/OrderInQuery.java @@ -0,0 +1,19 @@ +package com.wms_main.model.dto.query; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +public class OrderInQuery { + @JsonProperty("vehicleNo") + private String vehicleNo; + + @JsonProperty("vehicleSize") + private String vehicleSize; + + @JsonProperty("inStand") + private String inStand; + + @JsonProperty("orderStatus") + private Integer orderStatus; +} diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/model/dto/request/wms/OrderInGoodsDetail.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/model/dto/request/wms/OrderInGoodsDetail.java new file mode 100644 index 0000000..0170cf0 --- /dev/null +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/model/dto/request/wms/OrderInGoodsDetail.java @@ -0,0 +1,30 @@ +package com.wms_main.model.dto.request.wms; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class OrderInGoodsDetail { + @JsonProperty("goodsId") + String goodsId; + + @JsonProperty("goodsName") + private String goodsName; + + @JsonProperty("batch") + private String batch; + + @JsonProperty("goodsType") + private String goodsType; + + @JsonProperty("specification") + private Integer specification; + + @JsonProperty("quantity") + private Integer quantity; + + @JsonProperty("goodsDesc") + private String goodsDesc; +} diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/model/dto/request/wms/OrderInRequest.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/model/dto/request/wms/OrderInRequest.java new file mode 100644 index 0000000..60d59c8 --- /dev/null +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/model/dto/request/wms/OrderInRequest.java @@ -0,0 +1,21 @@ +package com.wms_main.model.dto.request.wms; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class OrderInRequest { + @JsonProperty("vehicleNo") + private String vehicleNo; + + @JsonProperty("vehicleSize") + private String vehicleSize; + + @JsonProperty("inStand") + private String inStand; + + @JsonProperty("goodsDetail") + private List goodsDetail; +} diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/model/dto/request/wms/OrderOutRequest.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/model/dto/request/wms/OrderOutRequest.java new file mode 100644 index 0000000..a101efd --- /dev/null +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/model/dto/request/wms/OrderOutRequest.java @@ -0,0 +1,19 @@ +package com.wms_main.model.dto.request.wms; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +public class OrderOutRequest { + @JsonProperty("goodsId") + private String goodsId; + + @JsonProperty("batch") + private String batch; + + @JsonProperty("specification") + private Integer specification; + + @JsonProperty("quantity") + private Integer quantity; +} diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/business/IStackerTaskService.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/business/IStackerTaskService.java index 08e447d..14b787b 100644 --- a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/business/IStackerTaskService.java +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/business/IStackerTaskService.java @@ -44,5 +44,5 @@ public interface IStackerTaskService { * 完成堆垛机出库任务 * @param stackerOutTasks 已完成的出库任务 */ - void finishStackerOutTasks(List stackerOutTasks); + void finishStackerOutTasks(List stackerOutTasks); } diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/business/serviceImpl/StackerTaskServiceImpl.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/business/serviceImpl/StackerTaskServiceImpl.java index 4aa479a..f41a946 100644 --- a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/business/serviceImpl/StackerTaskServiceImpl.java +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/business/serviceImpl/StackerTaskServiceImpl.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.wms_main.app.AppCommon; import com.wms_main.constant.AppConstant; +import com.wms_main.constant.enums.wcs.WcsStackerTaskStatusEnums; +import com.wms_main.constant.enums.wcs.WcsStackerTaskTypeEnums; import com.wms_main.constant.enums.wms.*; import com.wms_main.dao.*; import com.wms_main.model.po.*; @@ -53,6 +55,8 @@ public class StackerTaskServiceImpl implements IStackerTaskService { * 任务记录服务 */ private final ITAppTaskBakService appTaskBakService; + + private final ITAppWcsTaskBakService appWcsTaskBakService; /** * 拣选任务服务 */ @@ -361,34 +365,44 @@ public class StackerTaskServiceImpl implements IStackerTaskService { } String location = thisOrderInList.getFirst().getDestination(); // 新的库存信息 - List newStockList = new ArrayList<>(); + List newStockList = null; // 需要删除的任务id List needDeleteOrderIns = new ArrayList<>(); + Map stockMap = new HashMap<>(); for (TAppOrderIn thisOrderIn : thisOrderInList) { // 删除任务 needDeleteOrderIns.add(thisOrderIn.getRecordId()); // 添加库存 - TAppStock newStock = new TAppStock(); - newStock.setStockId(UUIDUtils.getNewUUID()); - newStock.setVehicleId(vehicleId); - newStock.setLocationId(thisOrderIn.getInStand()); - newStock.setStockStatus(WmsStockStatusEnums.OK.getCode()); - newStock.setGoodsId(thisOrderIn.getGoodsId()); - newStock.setGoodsStatus(WmsGoodsStatusEnums.OK.getCode()); - newStock.setFirstInTime(thisOrderIn.getCreateTime()); - newStock.setFirstInUser("WMS"); - newStock.setLastUpdateTime(LocalDateTime.now()); - newStock.setLastUpdateUser("WMS"); - newStock.setTotalNum(thisOrderIn.getQuantity()); - newStock.setRemainNum(thisOrderIn.getQuantity()); - newStock.setRealNum(thisOrderIn.getQuantity()); - newStock.setGoodsDesc(thisOrderIn.getGoodsDesc()); - newStock.setExpireDate(LocalDateTime.MAX.toLocalDate()); - newStock.setSled(thisOrderIn.getSpecification()); - newStock.setMesId(thisOrderIn.getOrderId()); - newStock.setBatch(thisOrderIn.getBatch()); - newStock.setGoodsType(thisOrderIn.getGoodsType()); - newStockList.add(newStock); + String validateStr = thisOrderIn.getGoodsId() + thisOrderIn.getBatch() + thisOrderIn.getGoodsType() + thisOrderIn.getSpecification(); + if (!stockMap.containsKey(validateStr)) { + TAppStock newStock = new TAppStock(); + newStock.setStockId(UUIDUtils.getNewUUID()); + newStock.setVehicleId(vehicleId); + newStock.setLocationId(thisOrderIn.getDestination()); + newStock.setStockStatus(WmsStockStatusEnums.OK.getCode()); + newStock.setGoodsId(thisOrderIn.getGoodsId()); + newStock.setGoodsStatus(WmsGoodsStatusEnums.OK.getCode()); + newStock.setFirstInTime(thisOrderIn.getCreateTime()); + newStock.setFirstInUser("WMS"); + newStock.setLastUpdateTime(LocalDateTime.now()); + newStock.setLastUpdateUser("WMS"); + newStock.setTotalNum(thisOrderIn.getQuantity()); + newStock.setRemainNum(thisOrderIn.getQuantity()); + newStock.setRealNum(thisOrderIn.getQuantity()); + newStock.setGoodsDesc(thisOrderIn.getGoodsDesc()); + newStock.setSled(thisOrderIn.getSpecification()); + newStock.setMesId(thisOrderIn.getOrderId()); + newStock.setBatch(thisOrderIn.getBatch()); + newStock.setGoodsType(thisOrderIn.getGoodsType()); + newStock.setBarCode(thisOrderIn.getInStand()); +// newStockList.add(newStock); + stockMap.put(validateStr, newStock); + } else { + TAppStock newStock = stockMap.get(validateStr); + newStock.setTotalNum(newStock.getTotalNum() + thisOrderIn.getQuantity()); + newStock.setRemainNum(newStock.getRemainNum() + thisOrderIn.getQuantity()); + newStock.setRealNum(newStock.getRealNum() + thisOrderIn.getQuantity()); + } } // 将目标库位的工作状态设置为未工作 appLocationService.update(new LambdaUpdateWrapper() @@ -400,8 +414,19 @@ public class StackerTaskServiceImpl implements IStackerTaskService { .set(TAppStock::getStockStatus, WmsStockStatusEnums.OK.getCode()) .set(TAppStock::getLocationId, location) .eq(TAppStock::getVehicleId, vehicleId)); + // 保存载具表 + TAppVehicle vehicle = new TAppVehicle(); + vehicle.setVehicleId(vehicleId); + vehicle.setIsEmpty(0); + vehicle.setVehicleStatus(WmsVehicleStatusEnums.ON.getCode()); + vehicle.setIsLock(0); + vehicle.setVehicleType("1"); + vehicle.setLocationId(location); + vehicle.setLastInTime(LocalDateTime.now()); + appVehicleService.save(vehicle); // 保存库存信息 - if (!newStockList.isEmpty()) { + newStockList = new ArrayList(stockMap.values()); + if (!stockMap.isEmpty()) { appStockService.saveOrUpdateBatch(newStockList); } // 删除已经完成的入库单 @@ -628,7 +653,7 @@ public class StackerTaskServiceImpl implements IStackerTaskService { */ @Override @Transactional(rollbackFor = Exception.class) - public void finishStackerOutTasks(List stackerOutTasks) { + public void finishStackerOutTasks(List stackerOutTasks) { // 出库完成需要完成以下事情: // 1. 更新库存状态 // 2. 更新载具状态 @@ -636,9 +661,9 @@ public class StackerTaskServiceImpl implements IStackerTaskService { // 4. 释放当前载具的拣选任务列表 // 5. 添加出库记录 // 根据载具号map一下 - Map> vehicleIdToTaskMap = stackerOutTasks.stream() - .filter(outTask -> Objects.equals(outTask.getTaskType(), WmsTaskTypeEnums.OUT.getCode()) && Objects.equals(outTask.getTaskStatus(), WmsStackerTaskStatusEnums.FINISH.getCode())) - .collect(Collectors.groupingBy(TAppTask::getVehicleId)); + Map> vehicleIdToTaskMap = stackerOutTasks.stream() + .filter(outTask -> Objects.equals(outTask.getWcsTaskType(), WcsStackerTaskTypeEnums.OUT.getCode()) && Objects.equals(outTask.getWcsTaskStatus(), WcsStackerTaskStatusEnums.FINISH.getCode())) + .collect(Collectors.groupingBy(TAppWcsTask::getVehicleId)); for (String vehicleId : vehicleIdToTaskMap.keySet()) { // 查询当前载具的数据 TAppVehicle thisVehicle = appVehicleService.getOne(new LambdaQueryWrapper() @@ -666,47 +691,32 @@ public class StackerTaskServiceImpl implements IStackerTaskService { thisVehicle.setLocationId(""); appVehicleService.updateById(thisVehicle); // 更新当前载具对应的所有库存的状态为已出库 - appStockService.update(new LambdaUpdateWrapper() - .set(TAppStock::getStockStatus, WmsStockStatusEnums.OUTED.getCode()) - .set(TAppStock::getLocationId, "") + appStockService.remove(new LambdaUpdateWrapper() .eq(TAppStock::getVehicleId, vehicleId)); - // 释放当前载具对应的拣选任务 - appPickTaskService.update(new LambdaUpdateWrapper() - .set(TAppPickTask::getPickStatus, WmsPickTaskStatusEnum.WAIT.getCode()) - .eq(TAppPickTask::getVehicleId, vehicleId) - .eq(TAppPickTask::getPickStatus, WmsPickTaskStatusEnum.TEMP.getCode())); // 当前载具的任务列表 - List thisVehicleOutTasks = vehicleIdToTaskMap.get(vehicleId); + List thisVehicleOutTasks = vehicleIdToTaskMap.get(vehicleId); if (!thisVehicleOutTasks.isEmpty()) { // 存储出库记录 - List stockOutRecordList = thisVehicleOutTasks.stream() - .map(outTask -> new TAppTaskBak( - outTask.getTaskId(), - outTask.getTaskType(), - outTask.getTaskStatus(), + List stockOutRecordList = thisVehicleOutTasks.stream() + .map(outTask -> new TAppWcsTaskBak( + outTask.getWcsTaskId(), + outTask.getWcsTaskStatus(), + outTask.getWcsTaskType(), outTask.getTaskPriority(), outTask.getVehicleId(), outTask.getOrigin(), outTask.getDestination(), - outTask.getWcsTaskId(), outTask.getCreateTime(), + outTask.getSendTime(), outTask.getFinishTime(), - outTask.getGoodsId(), - outTask.getOpNum(), - outTask.getStockNum(), - outTask.getOpUser(), - outTask.getRemark(), - outTask.getCallStand(), - "", - outTask.getBarCode(), - outTask.getMesId() + outTask.getRemark() )).toList(); - appTaskBakService.saveBatch(stockOutRecordList); + appWcsTaskBakService.saveBatch(stockOutRecordList); // 删除当前载具所对应的出库任务 - appTaskService.remove(new LambdaQueryWrapper() - .eq(TAppTask::getVehicleId, vehicleId) - .eq(TAppTask::getTaskType, WmsTaskTypeEnums.OUT.getCode()) - .in(TAppTask::getTaskId, thisVehicleOutTasks.stream().map(TAppTask::getTaskId).toList())); + appWcsTaskService.remove(new LambdaQueryWrapper() + .eq(TAppWcsTask::getVehicleId, vehicleId) + .eq(TAppWcsTask::getWcsTaskType, WcsStackerTaskTypeEnums.OUT.getCode()) + .in(TAppWcsTask::getWcsTaskId, thisVehicleOutTasks.stream().map(TAppWcsTask::getWcsTaskId).toList())); } } } diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/controller/serviceImpl/TaskControllerServiceImpl.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/controller/serviceImpl/TaskControllerServiceImpl.java index b70a569..adb3dba 100644 --- a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/controller/serviceImpl/TaskControllerServiceImpl.java +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/controller/serviceImpl/TaskControllerServiceImpl.java @@ -341,7 +341,7 @@ public class TaskControllerServiceImpl implements ITaskControllerService { return BaseWcsApiResponse.error("反馈的任务状态值无效。"); } // 判断反馈的任务状态是否是「已完成」 - if (Objects.equals(wcsTaskResultRequest.getTaskStatus(), WcsStackerTaskStatusEnums.FINISH.getCode())) { + if (Objects.equals(wcsTaskResultRequest.getTaskStatus(), WcsStackerTaskStatusEnums.FINISH.getCode()) && Objects.equals(wcsTask.getWcsTaskType(), WcsStackerTaskTypeEnums.IN.getCode())) { // 更新wms任务状态 appWmsTaskService.update( new LambdaUpdateWrapper() @@ -366,7 +366,7 @@ public class TaskControllerServiceImpl implements ITaskControllerService { ); appWcsTaskService.removeById(wcsTask.getWcsTaskId()); appWcsTaskBakService.save(wcsTaskBak); - } else { + } else if (Objects.equals(wcsTaskResultRequest.getTaskStatus(), WcsStackerTaskStatusEnums.FINISH.getCode()) && Objects.equals(wcsTask.getWcsTaskType(), WcsStackerTaskTypeEnums.OUT.getCode())){ // 更新wms任务状态 appWmsTaskService.update( new LambdaUpdateWrapper() diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/controller/serviceImpl/YcwmsControllerServiceImpl.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/controller/serviceImpl/YcwmsControllerServiceImpl.java index 518ac3b..173e753 100644 --- a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/controller/serviceImpl/YcwmsControllerServiceImpl.java +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/controller/serviceImpl/YcwmsControllerServiceImpl.java @@ -32,7 +32,7 @@ public class YcwmsControllerServiceImpl implements IYcwmsControllerService { @Override public YcwmsResponse orderIn(OrderInReq request) { - log.info("亚驰入库单请求参数{}", JSON.toJSON(request)); + log.info("入库单请求参数{}", JSON.toJSON(request)); if(request == null) return YcwmsResponse.error("参数错误", null); if(StringUtils.isEmpty(request.getOrderId()) || StringUtils.isEmpty(request.getClientId()) || StringUtils.isEmpty(request.getVehicleNo()) || StringUtils.isEmpty(request.getVehicleSize()) @@ -112,6 +112,7 @@ public class YcwmsControllerServiceImpl implements IYcwmsControllerService { public YcwmsResponse> stock(StockReq request) { log.info("亚驰库存请求参数{}", JSON.toJSON(request)); if(request == null) return YcwmsResponse.error("参数错误", null); + // stocks: 请求库存的当前库存 List stocks = null; if(request.empty()) { stocks = appStockService.list(); @@ -127,9 +128,13 @@ public class YcwmsControllerServiceImpl implements IYcwmsControllerService { return YcwmsResponse.error("数据服务异常,请稍后重试", null); } List respList = new ArrayList<>(); + // locations: 当前库存的对应库位 List locations = stocks.stream().map(TAppStock::getLocationId).distinct().toList(); + // 检查每个库存的库位location for (var location : locations) { + // 库存反馈 StockResp stockResp = new StockResp(); + // 查询location库位上当前有多少库存locationStocks List locationStocks = stocks.stream().filter(stock -> stock.getLocationId().equals(location)).toList(); if(locationStocks.isEmpty()) { continue; diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/DataSolver.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/DataSolver.java index 7240a60..c49d883 100644 --- a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/DataSolver.java +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/DataSolver.java @@ -11,13 +11,12 @@ import org.quartz.*; @PersistJobDataAfterExecution @DisallowConcurrentExecution @RequiredArgsConstructor -public class DataSolver implements Job { +public class DataSolver { /** * 运行定时任务 * * @param jobExecutionContext 定时任务执行的环境(上下文) */ - @Override public void execute(JobExecutionContext jobExecutionContext) { // 获取定时配置信息 diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/OutsExecutor.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/OutsExecutor.java index e972eff..15fb703 100644 --- a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/OutsExecutor.java +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/OutsExecutor.java @@ -1,11 +1,19 @@ package com.wms_main.service.quartz_job.job_executor; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.wms_main.constant.enums.wcs.WcsStackerTaskStatusEnums; import com.wms_main.constant.enums.wms.OrderStatusEnum; +import com.wms_main.constant.enums.wms.WmsStackerTaskStatusEnums; +import com.wms_main.constant.enums.wms.WmsStockStatusEnums; +import com.wms_main.constant.enums.wms.WmsTaskTypeEnums; import com.wms_main.dao.ITAppOrderOutService; import com.wms_main.dao.ITAppStockService; -import com.wms_main.model.po.TAppOrderOut; -import com.wms_main.model.po.TAppStock; +import com.wms_main.dao.ITAppTaskService; +import com.wms_main.dao.ITAppWcsTaskService; +import com.wms_main.model.po.*; import com.wms_main.repository.utils.StringUtils; +import com.wms_main.repository.utils.UUIDUtils; import com.wms_main.service.quartz_job.IOutsExecutorService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -14,7 +22,12 @@ import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.PersistJobDataAfterExecution; +import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; /** * 定时任务定义类---出库单解析类 @@ -28,6 +41,8 @@ public class OutsExecutor implements Job { private final ITAppOrderOutService orderOutService; private final ITAppStockService stockService; + private final ITAppTaskService taskService; + private final ITAppWcsTaskService wcsTaskService; /** * 运行定时任务 @@ -62,21 +77,69 @@ public class OutsExecutor implements Job { stock.setBatch(orderOut.getBatch()); stock.setSled(orderOut.getSpecification()); List stockList = stockService.getWithEntity(stock); - if(stockList == null || stockList.isEmpty()) { + // 提取所有相关库存的载具号 + List vehicleIds = stockList.stream().map(TAppStock::getVehicleId).toList(); + List outStockList = new ArrayList(); + if(vehicleIds.isEmpty()) { + log.warn("缺少库存, goodsId is {}, batch is {}, specification is {}", orderOut.getGoodsId(), orderOut.getBatch(), orderOut.getSpecification()); continue; } - for(TAppStock stockItem : stockList) { - - - - + for (String vehicleId : vehicleIds) { + List stockListToOut = stockService.list(new LambdaQueryWrapper().eq(TAppStock::getVehicleId, vehicleId)); + for (TAppStock stockItem : stockListToOut) { + if (needQuantity <= 0) break; + if (stockItem == null) { + continue; + } + if (stockItem.getGoodsId().equals(orderOut.getGoodsId()) && stockItem.getStockStatus().equals(WmsStockStatusEnums.OK.getCode())) { + needQuantity -= stockItem.getRemainNum(); + } + stockItem.setStockStatus(WmsStockStatusEnums.OUTING.getCode()); + stockItem.setRemainNum(0); + stockItem.setRealNum(0); + outStockList.add(stockItem); + } } + List appTaskList = new ArrayList<>(); + for (TAppStock stockItem : outStockList) { + TAppTask appTask = new TAppTask(); + appTask.setTaskId(UUIDUtils.getNewUUID()); + appTask.setTaskType(WmsTaskTypeEnums.OUT.getCode()); + appTask.setTaskStatus(WmsStackerTaskStatusEnums.WAIT.getCode()); + appTask.setTaskPriority(1); + appTask.setVehicleId(stockItem.getVehicleId()); + appTask.setOrigin(stockItem.getLocationId()); + appTask.setDestination(stockItem.getBarCode()); + appTask.setGoodsId(stockItem.getGoodsId()); + appTask.setBatch(stockItem.getBatch()); + appTask.setCreateTime(LocalDateTime.now()); + appTask.setOpNum(stockItem.getRealNum()); + appTask.setStockNum(0); + appTask.setOpUser("wms_order_out"); + appTask.setBatch(orderOut.getBatch()); + appTask.setCallStand(stockItem.getBarCode()); + appTaskList.add(appTask); + } + List wcsTasks = new ArrayList<>(); + for (TAppStock stockItem : outStockList) { + TAppWcsTask wcsTask = new TAppWcsTask(); + wcsTask.setWcsTaskId(UUIDUtils.getNewUUID()); + wcsTask.setWcsTaskType(WmsTaskTypeEnums.OUT.getCode()); + wcsTask.setWcsTaskStatus(WcsStackerTaskStatusEnums.INIT.getCode()); + wcsTask.setTaskPriority(1); + wcsTask.setVehicleId(stockItem.getVehicleId()); + wcsTask.setCreateTime(LocalDateTime.now()); + wcsTask.setOrigin(stockItem.getLocationId()); + wcsTask.setDestination(stockItem.getBarCode()); + wcsTasks.add(wcsTask); + } - - + orderOut.setOrderStatus(OrderStatusEnum.RUNNING.getCode()); + orderOutService.updateById(orderOut); + taskService.saveBatch(appTaskList); + wcsTaskService.saveBatch(wcsTasks); + stockService.updateBatchById(outStockList); } - - } } diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/WcsStackerTaskSender.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/WcsStackerTaskSender.java index 9dbcc86..a6836bc 100644 --- a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/WcsStackerTaskSender.java +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/WcsStackerTaskSender.java @@ -4,21 +4,28 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.wms_main.constant.enums.wcs.WcsApiResponseCodeEnums; import com.wms_main.constant.enums.wcs.WcsStackerTaskStatusEnums; +import com.wms_main.constant.enums.wcs.WcsStackerTaskTypeEnums; +import com.wms_main.constant.enums.wms.OrderStatusEnum; import com.wms_main.constant.enums.wms.WmsStackerTaskStatusEnums; +import com.wms_main.constant.enums.wms.WmsStockStatusEnums; +import com.wms_main.dao.ITAppOrderOutService; +import com.wms_main.dao.ITAppStockService; import com.wms_main.dao.ITAppTaskService; import com.wms_main.dao.ITAppWcsTaskService; import com.wms_main.model.bo.wcs.WcsStackerTask; import com.wms_main.model.dto.request.wcs.WcsStackerTaskRequest; import com.wms_main.model.dto.response.wcs.WcsApiResponse; -import com.wms_main.model.po.TAppTask; -import com.wms_main.model.po.TAppWcsTask; +import com.wms_main.model.po.*; import com.wms_main.repository.utils.StringUtils; +import com.wms_main.repository.utils.UUIDUtils; import com.wms_main.service.api.IWcsApiService; +import com.wms_main.service.business.IStackerTaskService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.quartz.*; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; /** @@ -34,14 +41,18 @@ public class WcsStackerTaskSender implements Job { * Wcs任务服务 */ private final ITAppWcsTaskService appWcsTaskService; - /** - * Wms任务服务 - */ - private final ITAppTaskService appTaskService; /** * Wcs接口服务 */ private final IWcsApiService wcsApiService; + /** + * 库存服务 + */ + private final ITAppStockService stockService; + /** + * 堆垛机服务 + */ + private final IStackerTaskService stackerTaskService; /** * 运行定时任务 @@ -51,56 +62,118 @@ public class WcsStackerTaskSender implements Job { */ @Override public void execute(JobExecutionContext jobExecutionContext) { - // 查询到所有的待下发的wcsTask - List waitSendWcsTaskList = appWcsTaskService.list( + List appWcsTasks = appWcsTaskService.list( new LambdaQueryWrapper() .eq(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.INIT.getCode()) - ); - // 发送任务 - for (TAppWcsTask wcsTask : waitSendWcsTaskList) { - // 生成请求 - WcsStackerTaskRequest request = new WcsStackerTaskRequest( - wcsTask.getWcsTaskId(), - wcsTask.getWcsTaskType(), - wcsTask.getTaskPriority(), - wcsTask.getOrigin(), - wcsTask.getDestination(), - wcsTask.getVehicleId() - ); - try { - WcsApiResponse wcsResponse = wcsApiService.sendWcsStackerTask(request); - if (wcsResponse != null && WcsApiResponseCodeEnums.SUCCESS.getCode() == wcsResponse.getCode()) { - // 更新当前的wcs任务状态为已发送 - appWcsTaskService.update( - new LambdaUpdateWrapper() - .set(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.WAIT.getCode()) - .set(TAppWcsTask::getSendTime, LocalDateTime.now()) - .eq(TAppWcsTask::getWcsTaskId, wcsTask.getWcsTaskId()) - ); - // 更新当前wcs任务对应的wms任务为已发送 - appTaskService.update( - new LambdaUpdateWrapper() - .set(TAppTask::getTaskStatus, WmsStackerTaskStatusEnums.SEND.getCode()) - .eq(TAppTask::getWcsTaskId, wcsTask.getWcsTaskId()) - ); - } else { - log.error("堆垛机任务发送失败,请求{},响应信息{}。", StringUtils.objectToString(request), StringUtils.objectToString(wcsResponse)); - // 更新当前的wcs任务状态为异常 - appWcsTaskService.update( - new LambdaUpdateWrapper() - .set(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.EXCEPTION.getCode()) - .set(TAppWcsTask::getSendTime, LocalDateTime.now()) - .eq(TAppWcsTask::getWcsTaskId, wcsTask.getWcsTaskId()) - ); - // 更新当前wcs任务对应的wms任务为异常 - appTaskService.update( - new LambdaUpdateWrapper() - .set(TAppTask::getTaskStatus, WmsStackerTaskStatusEnums.EXCEPTION.getCode()) - .eq(TAppTask::getWcsTaskId, wcsTask.getWcsTaskId()) - ); + .eq(TAppWcsTask::getWcsTaskType, WcsStackerTaskTypeEnums.OUT.getCode())); + for (TAppWcsTask wcsTask : appWcsTasks) { + String locationId = wcsTask.getOrigin(); + String[] str_lst = locationId.split("-"); + int depth = Integer.parseInt(str_lst[str_lst.length - 1]); + int row = Integer.parseInt(str_lst[0].replace("A", "")); + int equipmentId = Math.round((float) (row + 1) / 2); + // 深度1, 直接出库 + if (depth == 1) { + WcsStackerTaskRequest request = new WcsStackerTaskRequest(); + request.setTaskId(wcsTask.getWcsTaskId()); + request.setTaskType(WcsStackerTaskTypeEnums.OUT.getCode()); + request.setPriority(1); + request.setOrigin(wcsTask.getOrigin()); + request.setDestination(wcsTask.getDestination()); + request.setVehicleNo(wcsTask.getVehicleId()); + try { + WcsApiResponse wcsResponse = wcsApiService.sendWcsStackerTask(request); + if (wcsResponse != null && WcsApiResponseCodeEnums.SUCCESS.getCode() == wcsResponse.getCode()) { + appWcsTaskService.update( + new LambdaUpdateWrapper() + .eq(TAppWcsTask::getWcsTaskId, wcsTask.getWcsTaskId()) + .set(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.WAIT.getCode())); + // TODO appOrderOutService? + } + } catch (Exception e) { + log.error("堆垛机任务发送失败,任务号:{},载具号:{},起点:{},终点:{}。", request.getTaskId(), request.getVehicleNo(), request.getOrigin(), request.getDestination()); + } + } + // 深度2, 考虑移库 + else { + str_lst[str_lst.length - 1] = String.format("%02d", depth - 1); + locationId = String.join("-", str_lst); + // 判断浅深度有无出库任务 + List outTasks = appWcsTaskService.list( + new LambdaQueryWrapper() + .eq(TAppWcsTask::getOrigin, locationId) + .eq(TAppWcsTask::getWcsTaskType, WcsStackerTaskTypeEnums.OUT.getCode())); + if (outTasks != null && !outTasks.isEmpty()) { + continue; + } + // 判断浅深度有无入库任务 + List inTasks = appWcsTaskService.list( + new LambdaQueryWrapper() + .eq(TAppWcsTask::getDestination, locationId) + .eq(TAppWcsTask::getWcsTaskType, WcsStackerTaskTypeEnums.IN.getCode())); + if (inTasks != null && !inTasks.isEmpty()) { + continue; + } + // 判断浅深度有没有库存 + List preStocks = stockService.list( + new LambdaQueryWrapper() + .eq(TAppStock::getLocationId, locationId) + .eq(TAppStock::getStockStatus, WmsStockStatusEnums.OK.getCode())); + // 若有库存 + if (preStocks != null && !preStocks.isEmpty()) { + TAppLocation preLocation = stackerTaskService.getEmptyLocation(equipmentId, null); +// TAppWcsTask preTask = new TAppWcsTask(); +// preTask.setWcsTaskId(UUIDUtils.getNewUUID()); +// preTask.setWcsTaskType(WcsStackerTaskTypeEnums.IN.getCode()); +// preTask.setWcsTaskStatus(WcsStackerTaskStatusEnums.WAIT.getCode()); +// preTask.setOrigin(locationId); +// preTask.setDestination(preLocation.getLocationId()); +// preTask.setVehicleId(preLocation.getVehicleId()); +// preTask.setTaskPriority(2); +// preTask.setCreateTime(LocalDateTime.now()); + + WcsStackerTaskRequest request = new WcsStackerTaskRequest(); + request.setTaskId(UUIDUtils.getNewUUID()); + request.setTaskType(WcsStackerTaskTypeEnums.IN.getCode()); + request.setPriority(2); + request.setOrigin(locationId); + request.setDestination(preLocation.getLocationId()); + request.setVehicleNo(preStocks.getFirst().getVehicleId()); + + try { + WcsApiResponse wcsResponse = wcsApiService.sendWcsStackerTask(request); + if (wcsResponse != null && WcsApiResponseCodeEnums.SUCCESS.getCode() == wcsResponse.getCode()) { + stockService.update( + new LambdaUpdateWrapper() + .eq(TAppStock::getLocationId, locationId) + .eq(TAppStock::getStockStatus, WmsStockStatusEnums.OK.getCode()) + .set(TAppStock::getLocationId, preLocation.getLocationId())); + } + } catch (Exception e) { + log.error("堆垛机任务发送失败,任务号:{},载具号:{},起点:{},终点:{}。", request.getTaskId(), request.getVehicleNo(), request.getOrigin(), request.getDestination()); + } + } + + // 若浅深度无任务, 无库存 + WcsStackerTaskRequest request = new WcsStackerTaskRequest(); + request.setTaskId(wcsTask.getWcsTaskId()); + request.setTaskType(WcsStackerTaskTypeEnums.OUT.getCode()); + request.setPriority(1); + request.setOrigin(wcsTask.getOrigin()); + request.setDestination(wcsTask.getDestination()); + request.setVehicleNo(wcsTask.getVehicleId()); + try { + WcsApiResponse wcsResponse = wcsApiService.sendWcsStackerTask(request); + if (wcsResponse != null && WcsApiResponseCodeEnums.SUCCESS.getCode() == wcsResponse.getCode()) { + appWcsTaskService.update( + new LambdaUpdateWrapper() + .eq(TAppWcsTask::getWcsTaskId, wcsTask.getWcsTaskId()) + .set(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.WAIT.getCode())); + // TODO appOrderOutService? + } + } catch (Exception e) { + log.error("堆垛机任务发送失败,任务号:{},载具号:{},起点:{},终点:{}。", request.getTaskId(), request.getVehicleNo(), request.getOrigin(), request.getDestination()); } - } catch (Exception e) { - log.error("堆垛机任务发送失败,任务号:{},载具号:{},起点:{},终点:{}。", request.getTaskId(), request.getVehicleNo(), request.getOrigin(), request.getDestination()); } } } diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/WmsTaskExecutor.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/WmsTaskExecutor.java index 8aaa5d2..5d5daa9 100644 --- a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/WmsTaskExecutor.java +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/WmsTaskExecutor.java @@ -29,7 +29,7 @@ import java.util.stream.Collectors; // 以下注解用于实现fixed_delay @DisallowConcurrentExecution @RequiredArgsConstructor -public class WmsTaskExecutor implements Job { +public class WmsTaskExecutor { /** * Wms任务服务 */ @@ -48,7 +48,6 @@ public class WmsTaskExecutor implements Job { * * @param jobExecutionContext 定时任务执行的环境(上下文) */ - @Override public void execute(JobExecutionContext jobExecutionContext) { // 获取到所有待下发的任务 List waitSendWmsTaskList = appTaskService.list( diff --git a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/WmsTaskFinisher.java b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/WmsTaskFinisher.java index eddf1ad..69e67b9 100644 --- a/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/WmsTaskFinisher.java +++ b/wms_serve_nantong_yachi/src/main/java/com/wms_main/service/quartz_job/job_executor/WmsTaskFinisher.java @@ -1,12 +1,16 @@ package com.wms_main.service.quartz_job.job_executor; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wms_main.constant.enums.wcs.WcsStackerTaskStatusEnums; +import com.wms_main.constant.enums.wcs.WcsStackerTaskTypeEnums; import com.wms_main.constant.enums.wms.WmsStackerTaskStatusEnums; import com.wms_main.constant.enums.wms.WmsTaskTypeEnums; import com.wms_main.dao.ITAppOrderInService; import com.wms_main.dao.ITAppTaskService; +import com.wms_main.dao.ITAppWcsTaskService; import com.wms_main.model.po.TAppOrderIn; import com.wms_main.model.po.TAppTask; +import com.wms_main.model.po.TAppWcsTask; import com.wms_main.repository.utils.StringUtils; import com.wms_main.service.business.IStackerTaskService; import lombok.RequiredArgsConstructor; @@ -35,6 +39,8 @@ public class WmsTaskFinisher implements Job { private final ITAppOrderInService appOrderInService; + private final ITAppWcsTaskService appWcsTaskService; + /** * 运行定时任务 * 完成堆垛机任务 @@ -55,12 +61,12 @@ public class WmsTaskFinisher implements Job { log.error("堆垛机任务完成类-入库执行异常:{}", StringUtils.objectToString(e)); } // 出库 - List waitFinishWmsTaskList = appTaskService.list( - new LambdaQueryWrapper() - .eq(TAppTask::getTaskStatus, WmsStackerTaskStatusEnums.FINISH.getCode()) + List waitFinishWcsTaskList = appWcsTaskService.list( + new LambdaQueryWrapper() + .eq(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.FINISH.getCode()) ); - List stackerOutTasks = waitFinishWmsTaskList.stream() - .filter(task -> Objects.equals(WmsTaskTypeEnums.OUT.getCode(), task.getTaskType())) + List stackerOutTasks = waitFinishWcsTaskList.stream() + .filter(task -> Objects.equals(WcsStackerTaskTypeEnums.OUT.getCode(), task.getWcsTaskType())) .toList(); if (!stackerOutTasks.isEmpty()) { try { diff --git a/wms_web_nantong_yachi/src/http/request.js b/wms_web_nantong_yachi/src/http/request.js index 34660aa..1db6397 100644 --- a/wms_web_nantong_yachi/src/http/request.js +++ b/wms_web_nantong_yachi/src/http/request.js @@ -1,6 +1,7 @@ import axios from 'axios' const request = axios.create({ + // baseURL: 'http://10.18.58.20:12315/wms', baseURL: 'http://localhost:12315/wms', timeout: 5000 }) diff --git a/wms_web_nantong_yachi/vue.config.js b/wms_web_nantong_yachi/vue.config.js index 797a794..3846679 100644 --- a/wms_web_nantong_yachi/vue.config.js +++ b/wms_web_nantong_yachi/vue.config.js @@ -2,7 +2,7 @@ const { defineConfig } = require('@vue/cli-service') const NodePolyfillPlugin = require('node-polyfill-webpack-plugin') module.exports = defineConfig({ - publicPath: '/wms', + publicPath: '/', transpileDependencies: true, configureWebpack: { plugins: [new NodePolyfillPlugin()]