亚驰出版提交

This commit is contained in:
李宇奇 2025-03-31 10:08:22 +08:00
parent 144d22cb6f
commit 2b51c599ef
17 changed files with 380 additions and 143 deletions

View File

@ -23,7 +23,4 @@ public class WcsController {
public WcsApiResponse<InTaskResp> requireInTask(@RequestBody WcsVehicleInRequest request) { public WcsApiResponse<InTaskResp> requireInTask(@RequestBody WcsVehicleInRequest request) {
return wcsControllerService.requireInTask(request); return wcsControllerService.requireInTask(request);
} }
} }

View File

@ -44,9 +44,4 @@ public class YcwmsController {
public YcwmsResponse<List<StockResp>> stock(@RequestBody StockReq request) { public YcwmsResponse<List<StockResp>> stock(@RequestBody StockReq request) {
return ycwmsControllerService.stock(request); return ycwmsControllerService.stock(request);
} }
} }

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<OrderInGoodsDetail> goodsDetail;
}

View File

@ -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;
}

View File

@ -44,5 +44,5 @@ public interface IStackerTaskService {
* 完成堆垛机出库任务 * 完成堆垛机出库任务
* @param stackerOutTasks 已完成的出库任务 * @param stackerOutTasks 已完成的出库任务
*/ */
void finishStackerOutTasks(List<TAppTask> stackerOutTasks); void finishStackerOutTasks(List<TAppWcsTask> stackerOutTasks);
} }

View File

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.wms_main.app.AppCommon; import com.wms_main.app.AppCommon;
import com.wms_main.constant.AppConstant; 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.constant.enums.wms.*;
import com.wms_main.dao.*; import com.wms_main.dao.*;
import com.wms_main.model.po.*; import com.wms_main.model.po.*;
@ -53,6 +55,8 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
* 任务记录服务 * 任务记录服务
*/ */
private final ITAppTaskBakService appTaskBakService; private final ITAppTaskBakService appTaskBakService;
private final ITAppWcsTaskBakService appWcsTaskBakService;
/** /**
* 拣选任务服务 * 拣选任务服务
*/ */
@ -361,17 +365,20 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
} }
String location = thisOrderInList.getFirst().getDestination(); String location = thisOrderInList.getFirst().getDestination();
// 新的库存信息 // 新的库存信息
List<TAppStock> newStockList = new ArrayList<>(); List<TAppStock> newStockList = null;
// 需要删除的任务id // 需要删除的任务id
List<String> needDeleteOrderIns = new ArrayList<>(); List<String> needDeleteOrderIns = new ArrayList<>();
Map<String, TAppStock> stockMap = new HashMap<>();
for (TAppOrderIn thisOrderIn : thisOrderInList) { for (TAppOrderIn thisOrderIn : thisOrderInList) {
// 删除任务 // 删除任务
needDeleteOrderIns.add(thisOrderIn.getRecordId()); needDeleteOrderIns.add(thisOrderIn.getRecordId());
// 添加库存 // 添加库存
String validateStr = thisOrderIn.getGoodsId() + thisOrderIn.getBatch() + thisOrderIn.getGoodsType() + thisOrderIn.getSpecification();
if (!stockMap.containsKey(validateStr)) {
TAppStock newStock = new TAppStock(); TAppStock newStock = new TAppStock();
newStock.setStockId(UUIDUtils.getNewUUID()); newStock.setStockId(UUIDUtils.getNewUUID());
newStock.setVehicleId(vehicleId); newStock.setVehicleId(vehicleId);
newStock.setLocationId(thisOrderIn.getInStand()); newStock.setLocationId(thisOrderIn.getDestination());
newStock.setStockStatus(WmsStockStatusEnums.OK.getCode()); newStock.setStockStatus(WmsStockStatusEnums.OK.getCode());
newStock.setGoodsId(thisOrderIn.getGoodsId()); newStock.setGoodsId(thisOrderIn.getGoodsId());
newStock.setGoodsStatus(WmsGoodsStatusEnums.OK.getCode()); newStock.setGoodsStatus(WmsGoodsStatusEnums.OK.getCode());
@ -383,12 +390,19 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
newStock.setRemainNum(thisOrderIn.getQuantity()); newStock.setRemainNum(thisOrderIn.getQuantity());
newStock.setRealNum(thisOrderIn.getQuantity()); newStock.setRealNum(thisOrderIn.getQuantity());
newStock.setGoodsDesc(thisOrderIn.getGoodsDesc()); newStock.setGoodsDesc(thisOrderIn.getGoodsDesc());
newStock.setExpireDate(LocalDateTime.MAX.toLocalDate());
newStock.setSled(thisOrderIn.getSpecification()); newStock.setSled(thisOrderIn.getSpecification());
newStock.setMesId(thisOrderIn.getOrderId()); newStock.setMesId(thisOrderIn.getOrderId());
newStock.setBatch(thisOrderIn.getBatch()); newStock.setBatch(thisOrderIn.getBatch());
newStock.setGoodsType(thisOrderIn.getGoodsType()); newStock.setGoodsType(thisOrderIn.getGoodsType());
newStockList.add(newStock); 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<TAppLocation>() appLocationService.update(new LambdaUpdateWrapper<TAppLocation>()
@ -400,8 +414,19 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
.set(TAppStock::getStockStatus, WmsStockStatusEnums.OK.getCode()) .set(TAppStock::getStockStatus, WmsStockStatusEnums.OK.getCode())
.set(TAppStock::getLocationId, location) .set(TAppStock::getLocationId, location)
.eq(TAppStock::getVehicleId, vehicleId)); .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<TAppStock>(stockMap.values());
if (!stockMap.isEmpty()) {
appStockService.saveOrUpdateBatch(newStockList); appStockService.saveOrUpdateBatch(newStockList);
} }
// 删除已经完成的入库单 // 删除已经完成的入库单
@ -628,7 +653,7 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void finishStackerOutTasks(List<TAppTask> stackerOutTasks) { public void finishStackerOutTasks(List<TAppWcsTask> stackerOutTasks) {
// 出库完成需要完成以下事情 // 出库完成需要完成以下事情
// 1. 更新库存状态 // 1. 更新库存状态
// 2. 更新载具状态 // 2. 更新载具状态
@ -636,9 +661,9 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
// 4. 释放当前载具的拣选任务列表 // 4. 释放当前载具的拣选任务列表
// 5. 添加出库记录 // 5. 添加出库记录
// 根据载具号map一下 // 根据载具号map一下
Map<String, List<TAppTask>> vehicleIdToTaskMap = stackerOutTasks.stream() Map<String, List<TAppWcsTask>> vehicleIdToTaskMap = stackerOutTasks.stream()
.filter(outTask -> Objects.equals(outTask.getTaskType(), WmsTaskTypeEnums.OUT.getCode()) && Objects.equals(outTask.getTaskStatus(), WmsStackerTaskStatusEnums.FINISH.getCode())) .filter(outTask -> Objects.equals(outTask.getWcsTaskType(), WcsStackerTaskTypeEnums.OUT.getCode()) && Objects.equals(outTask.getWcsTaskStatus(), WcsStackerTaskStatusEnums.FINISH.getCode()))
.collect(Collectors.groupingBy(TAppTask::getVehicleId)); .collect(Collectors.groupingBy(TAppWcsTask::getVehicleId));
for (String vehicleId : vehicleIdToTaskMap.keySet()) { for (String vehicleId : vehicleIdToTaskMap.keySet()) {
// 查询当前载具的数据 // 查询当前载具的数据
TAppVehicle thisVehicle = appVehicleService.getOne(new LambdaQueryWrapper<TAppVehicle>() TAppVehicle thisVehicle = appVehicleService.getOne(new LambdaQueryWrapper<TAppVehicle>()
@ -666,47 +691,32 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
thisVehicle.setLocationId(""); thisVehicle.setLocationId("");
appVehicleService.updateById(thisVehicle); appVehicleService.updateById(thisVehicle);
// 更新当前载具对应的所有库存的状态为已出库 // 更新当前载具对应的所有库存的状态为已出库
appStockService.update(new LambdaUpdateWrapper<TAppStock>() appStockService.remove(new LambdaUpdateWrapper<TAppStock>()
.set(TAppStock::getStockStatus, WmsStockStatusEnums.OUTED.getCode())
.set(TAppStock::getLocationId, "")
.eq(TAppStock::getVehicleId, vehicleId)); .eq(TAppStock::getVehicleId, vehicleId));
// 释放当前载具对应的拣选任务
appPickTaskService.update(new LambdaUpdateWrapper<TAppPickTask>()
.set(TAppPickTask::getPickStatus, WmsPickTaskStatusEnum.WAIT.getCode())
.eq(TAppPickTask::getVehicleId, vehicleId)
.eq(TAppPickTask::getPickStatus, WmsPickTaskStatusEnum.TEMP.getCode()));
// 当前载具的任务列表 // 当前载具的任务列表
List<TAppTask> thisVehicleOutTasks = vehicleIdToTaskMap.get(vehicleId); List<TAppWcsTask> thisVehicleOutTasks = vehicleIdToTaskMap.get(vehicleId);
if (!thisVehicleOutTasks.isEmpty()) { if (!thisVehicleOutTasks.isEmpty()) {
// 存储出库记录 // 存储出库记录
List<TAppTaskBak> stockOutRecordList = thisVehicleOutTasks.stream() List<TAppWcsTaskBak> stockOutRecordList = thisVehicleOutTasks.stream()
.map(outTask -> new TAppTaskBak( .map(outTask -> new TAppWcsTaskBak(
outTask.getTaskId(), outTask.getWcsTaskId(),
outTask.getTaskType(), outTask.getWcsTaskStatus(),
outTask.getTaskStatus(), outTask.getWcsTaskType(),
outTask.getTaskPriority(), outTask.getTaskPriority(),
outTask.getVehicleId(), outTask.getVehicleId(),
outTask.getOrigin(), outTask.getOrigin(),
outTask.getDestination(), outTask.getDestination(),
outTask.getWcsTaskId(),
outTask.getCreateTime(), outTask.getCreateTime(),
outTask.getSendTime(),
outTask.getFinishTime(), outTask.getFinishTime(),
outTask.getGoodsId(), outTask.getRemark()
outTask.getOpNum(),
outTask.getStockNum(),
outTask.getOpUser(),
outTask.getRemark(),
outTask.getCallStand(),
"",
outTask.getBarCode(),
outTask.getMesId()
)).toList(); )).toList();
appTaskBakService.saveBatch(stockOutRecordList); appWcsTaskBakService.saveBatch(stockOutRecordList);
// 删除当前载具所对应的出库任务 // 删除当前载具所对应的出库任务
appTaskService.remove(new LambdaQueryWrapper<TAppTask>() appWcsTaskService.remove(new LambdaQueryWrapper<TAppWcsTask>()
.eq(TAppTask::getVehicleId, vehicleId) .eq(TAppWcsTask::getVehicleId, vehicleId)
.eq(TAppTask::getTaskType, WmsTaskTypeEnums.OUT.getCode()) .eq(TAppWcsTask::getWcsTaskType, WcsStackerTaskTypeEnums.OUT.getCode())
.in(TAppTask::getTaskId, thisVehicleOutTasks.stream().map(TAppTask::getTaskId).toList())); .in(TAppWcsTask::getWcsTaskId, thisVehicleOutTasks.stream().map(TAppWcsTask::getWcsTaskId).toList()));
} }
} }
} }

View File

@ -341,7 +341,7 @@ public class TaskControllerServiceImpl implements ITaskControllerService {
return BaseWcsApiResponse.error("反馈的任务状态值无效。"); 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任务状态 // 更新wms任务状态
appWmsTaskService.update( appWmsTaskService.update(
new LambdaUpdateWrapper<TAppTask>() new LambdaUpdateWrapper<TAppTask>()
@ -366,7 +366,7 @@ public class TaskControllerServiceImpl implements ITaskControllerService {
); );
appWcsTaskService.removeById(wcsTask.getWcsTaskId()); appWcsTaskService.removeById(wcsTask.getWcsTaskId());
appWcsTaskBakService.save(wcsTaskBak); appWcsTaskBakService.save(wcsTaskBak);
} else { } else if (Objects.equals(wcsTaskResultRequest.getTaskStatus(), WcsStackerTaskStatusEnums.FINISH.getCode()) && Objects.equals(wcsTask.getWcsTaskType(), WcsStackerTaskTypeEnums.OUT.getCode())){
// 更新wms任务状态 // 更新wms任务状态
appWmsTaskService.update( appWmsTaskService.update(
new LambdaUpdateWrapper<TAppTask>() new LambdaUpdateWrapper<TAppTask>()

View File

@ -32,7 +32,7 @@ public class YcwmsControllerServiceImpl implements IYcwmsControllerService {
@Override @Override
public YcwmsResponse<Object> orderIn(OrderInReq request) { public YcwmsResponse<Object> orderIn(OrderInReq request) {
log.info("亚驰入库单请求参数{}", JSON.toJSON(request)); log.info("入库单请求参数{}", JSON.toJSON(request));
if(request == null) return YcwmsResponse.error("参数错误", null); if(request == null) return YcwmsResponse.error("参数错误", null);
if(StringUtils.isEmpty(request.getOrderId()) || StringUtils.isEmpty(request.getClientId()) if(StringUtils.isEmpty(request.getOrderId()) || StringUtils.isEmpty(request.getClientId())
|| StringUtils.isEmpty(request.getVehicleNo()) || StringUtils.isEmpty(request.getVehicleSize()) || StringUtils.isEmpty(request.getVehicleNo()) || StringUtils.isEmpty(request.getVehicleSize())
@ -112,6 +112,7 @@ public class YcwmsControllerServiceImpl implements IYcwmsControllerService {
public YcwmsResponse<List<StockResp>> stock(StockReq request) { public YcwmsResponse<List<StockResp>> stock(StockReq request) {
log.info("亚驰库存请求参数{}", JSON.toJSON(request)); log.info("亚驰库存请求参数{}", JSON.toJSON(request));
if(request == null) return YcwmsResponse.error("参数错误", null); if(request == null) return YcwmsResponse.error("参数错误", null);
// stocks: 请求库存的当前库存
List<TAppStock> stocks = null; List<TAppStock> stocks = null;
if(request.empty()) { if(request.empty()) {
stocks = appStockService.list(); stocks = appStockService.list();
@ -127,9 +128,13 @@ public class YcwmsControllerServiceImpl implements IYcwmsControllerService {
return YcwmsResponse.error("数据服务异常,请稍后重试", null); return YcwmsResponse.error("数据服务异常,请稍后重试", null);
} }
List<StockResp> respList = new ArrayList<>(); List<StockResp> respList = new ArrayList<>();
// locations: 当前库存的对应库位
List<String> locations = stocks.stream().map(TAppStock::getLocationId).distinct().toList(); List<String> locations = stocks.stream().map(TAppStock::getLocationId).distinct().toList();
// 检查每个库存的库位location
for (var location : locations) { for (var location : locations) {
// 库存反馈
StockResp stockResp = new StockResp(); StockResp stockResp = new StockResp();
// 查询location库位上当前有多少库存locationStocks
List<TAppStock> locationStocks = stocks.stream().filter(stock -> stock.getLocationId().equals(location)).toList(); List<TAppStock> locationStocks = stocks.stream().filter(stock -> stock.getLocationId().equals(location)).toList();
if(locationStocks.isEmpty()) { if(locationStocks.isEmpty()) {
continue; continue;

View File

@ -11,13 +11,12 @@ import org.quartz.*;
@PersistJobDataAfterExecution @PersistJobDataAfterExecution
@DisallowConcurrentExecution @DisallowConcurrentExecution
@RequiredArgsConstructor @RequiredArgsConstructor
public class DataSolver implements Job { public class DataSolver {
/** /**
* 运行定时任务 * 运行定时任务
* *
* @param jobExecutionContext 定时任务执行的环境上下文 * @param jobExecutionContext 定时任务执行的环境上下文
*/ */
@Override
public void execute(JobExecutionContext jobExecutionContext) { public void execute(JobExecutionContext jobExecutionContext) {
// 获取定时配置信息 // 获取定时配置信息

View File

@ -1,11 +1,19 @@
package com.wms_main.service.quartz_job.job_executor; 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.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.ITAppOrderOutService;
import com.wms_main.dao.ITAppStockService; import com.wms_main.dao.ITAppStockService;
import com.wms_main.model.po.TAppOrderOut; import com.wms_main.dao.ITAppTaskService;
import com.wms_main.model.po.TAppStock; 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.StringUtils;
import com.wms_main.repository.utils.UUIDUtils;
import com.wms_main.service.quartz_job.IOutsExecutorService; import com.wms_main.service.quartz_job.IOutsExecutorService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -14,7 +22,12 @@ import org.quartz.Job;
import org.quartz.JobExecutionContext; import org.quartz.JobExecutionContext;
import org.quartz.PersistJobDataAfterExecution; import org.quartz.PersistJobDataAfterExecution;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List; 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 ITAppOrderOutService orderOutService;
private final ITAppStockService stockService; 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.setBatch(orderOut.getBatch());
stock.setSled(orderOut.getSpecification()); stock.setSled(orderOut.getSpecification());
List<TAppStock> stockList = stockService.getWithEntity(stock); List<TAppStock> stockList = stockService.getWithEntity(stock);
if(stockList == null || stockList.isEmpty()) { // 提取所有相关库存的载具号
List<String> vehicleIds = stockList.stream().map(TAppStock::getVehicleId).toList();
List<TAppStock> outStockList = new ArrayList<TAppStock>();
if(vehicleIds.isEmpty()) {
log.warn("缺少库存, goodsId is {}, batch is {}, specification is {}", orderOut.getGoodsId(), orderOut.getBatch(), orderOut.getSpecification());
continue; continue;
} }
for(TAppStock stockItem : stockList) { for (String vehicleId : vehicleIds) {
List<TAppStock> stockListToOut = stockService.list(new LambdaQueryWrapper<TAppStock>().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<TAppTask> 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<TAppWcsTask> 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);
}
} }
} }

View File

@ -4,21 +4,28 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.wms_main.constant.enums.wcs.WcsApiResponseCodeEnums; import com.wms_main.constant.enums.wcs.WcsApiResponseCodeEnums;
import com.wms_main.constant.enums.wcs.WcsStackerTaskStatusEnums; 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.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.ITAppTaskService;
import com.wms_main.dao.ITAppWcsTaskService; import com.wms_main.dao.ITAppWcsTaskService;
import com.wms_main.model.bo.wcs.WcsStackerTask; import com.wms_main.model.bo.wcs.WcsStackerTask;
import com.wms_main.model.dto.request.wcs.WcsStackerTaskRequest; import com.wms_main.model.dto.request.wcs.WcsStackerTaskRequest;
import com.wms_main.model.dto.response.wcs.WcsApiResponse; import com.wms_main.model.dto.response.wcs.WcsApiResponse;
import com.wms_main.model.po.TAppTask; import com.wms_main.model.po.*;
import com.wms_main.model.po.TAppWcsTask;
import com.wms_main.repository.utils.StringUtils; 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.api.IWcsApiService;
import com.wms_main.service.business.IStackerTaskService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.quartz.*; import org.quartz.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
@ -34,14 +41,18 @@ public class WcsStackerTaskSender implements Job {
* Wcs任务服务 * Wcs任务服务
*/ */
private final ITAppWcsTaskService appWcsTaskService; private final ITAppWcsTaskService appWcsTaskService;
/**
* Wms任务服务
*/
private final ITAppTaskService appTaskService;
/** /**
* Wcs接口服务 * Wcs接口服务
*/ */
private final IWcsApiService wcsApiService; private final IWcsApiService wcsApiService;
/**
* 库存服务
*/
private final ITAppStockService stockService;
/**
* 堆垛机服务
*/
private final IStackerTaskService stackerTaskService;
/** /**
* 运行定时任务 * 运行定时任务
@ -51,57 +62,119 @@ public class WcsStackerTaskSender implements Job {
*/ */
@Override @Override
public void execute(JobExecutionContext jobExecutionContext) { public void execute(JobExecutionContext jobExecutionContext) {
// 查询到所有的待下发的wcsTask List<TAppWcsTask> appWcsTasks = appWcsTaskService.list(
List<TAppWcsTask> waitSendWcsTaskList = appWcsTaskService.list(
new LambdaQueryWrapper<TAppWcsTask>() new LambdaQueryWrapper<TAppWcsTask>()
.eq(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.INIT.getCode()) .eq(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.INIT.getCode())
); .eq(TAppWcsTask::getWcsTaskType, WcsStackerTaskTypeEnums.OUT.getCode()));
// 发送任务 for (TAppWcsTask wcsTask : appWcsTasks) {
for (TAppWcsTask wcsTask : waitSendWcsTaskList) { String locationId = wcsTask.getOrigin();
// 生成请求 String[] str_lst = locationId.split("-");
WcsStackerTaskRequest request = new WcsStackerTaskRequest( int depth = Integer.parseInt(str_lst[str_lst.length - 1]);
wcsTask.getWcsTaskId(), int row = Integer.parseInt(str_lst[0].replace("A", ""));
wcsTask.getWcsTaskType(), int equipmentId = Math.round((float) (row + 1) / 2);
wcsTask.getTaskPriority(), // 深度1, 直接出库
wcsTask.getOrigin(), if (depth == 1) {
wcsTask.getDestination(), WcsStackerTaskRequest request = new WcsStackerTaskRequest();
wcsTask.getVehicleId() 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 { try {
WcsApiResponse<WcsStackerTask> wcsResponse = wcsApiService.sendWcsStackerTask(request); WcsApiResponse<WcsStackerTask> wcsResponse = wcsApiService.sendWcsStackerTask(request);
if (wcsResponse != null && WcsApiResponseCodeEnums.SUCCESS.getCode() == wcsResponse.getCode()) { if (wcsResponse != null && WcsApiResponseCodeEnums.SUCCESS.getCode() == wcsResponse.getCode()) {
// 更新当前的wcs任务状态为已发送
appWcsTaskService.update( appWcsTaskService.update(
new LambdaUpdateWrapper<TAppWcsTask>() new LambdaUpdateWrapper<TAppWcsTask>()
.set(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.WAIT.getCode())
.set(TAppWcsTask::getSendTime, LocalDateTime.now())
.eq(TAppWcsTask::getWcsTaskId, wcsTask.getWcsTaskId()) .eq(TAppWcsTask::getWcsTaskId, wcsTask.getWcsTaskId())
); .set(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.WAIT.getCode()));
// 更新当前wcs任务对应的wms任务为已发送 // TODO appOrderOutService?
appTaskService.update( }
new LambdaUpdateWrapper<TAppTask>() } catch (Exception e) {
.set(TAppTask::getTaskStatus, WmsStackerTaskStatusEnums.SEND.getCode()) log.error("堆垛机任务发送失败,任务号:{},载具号:{},起点:{},终点:{}。", request.getTaskId(), request.getVehicleNo(), request.getOrigin(), request.getDestination());
.eq(TAppTask::getWcsTaskId, wcsTask.getWcsTaskId()) }
); }
} else { // 深度2, 考虑移库
log.error("堆垛机任务发送失败,请求{},响应信息{}。", StringUtils.objectToString(request), StringUtils.objectToString(wcsResponse)); else {
// 更新当前的wcs任务状态为异常 str_lst[str_lst.length - 1] = String.format("%02d", depth - 1);
locationId = String.join("-", str_lst);
// 判断浅深度有无出库任务
List<TAppWcsTask> outTasks = appWcsTaskService.list(
new LambdaQueryWrapper<TAppWcsTask>()
.eq(TAppWcsTask::getOrigin, locationId)
.eq(TAppWcsTask::getWcsTaskType, WcsStackerTaskTypeEnums.OUT.getCode()));
if (outTasks != null && !outTasks.isEmpty()) {
continue;
}
// 判断浅深度有无入库任务
List<TAppWcsTask> inTasks = appWcsTaskService.list(
new LambdaQueryWrapper<TAppWcsTask>()
.eq(TAppWcsTask::getDestination, locationId)
.eq(TAppWcsTask::getWcsTaskType, WcsStackerTaskTypeEnums.IN.getCode()));
if (inTasks != null && !inTasks.isEmpty()) {
continue;
}
// 判断浅深度有没有库存
List<TAppStock> preStocks = stockService.list(
new LambdaQueryWrapper<TAppStock>()
.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<WcsStackerTask> wcsResponse = wcsApiService.sendWcsStackerTask(request);
if (wcsResponse != null && WcsApiResponseCodeEnums.SUCCESS.getCode() == wcsResponse.getCode()) {
stockService.update(
new LambdaUpdateWrapper<TAppStock>()
.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<WcsStackerTask> wcsResponse = wcsApiService.sendWcsStackerTask(request);
if (wcsResponse != null && WcsApiResponseCodeEnums.SUCCESS.getCode() == wcsResponse.getCode()) {
appWcsTaskService.update( appWcsTaskService.update(
new LambdaUpdateWrapper<TAppWcsTask>() new LambdaUpdateWrapper<TAppWcsTask>()
.set(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.EXCEPTION.getCode())
.set(TAppWcsTask::getSendTime, LocalDateTime.now())
.eq(TAppWcsTask::getWcsTaskId, wcsTask.getWcsTaskId()) .eq(TAppWcsTask::getWcsTaskId, wcsTask.getWcsTaskId())
); .set(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.WAIT.getCode()));
// 更新当前wcs任务对应的wms任务为异常 // TODO appOrderOutService?
appTaskService.update(
new LambdaUpdateWrapper<TAppTask>()
.set(TAppTask::getTaskStatus, WmsStackerTaskStatusEnums.EXCEPTION.getCode())
.eq(TAppTask::getWcsTaskId, wcsTask.getWcsTaskId())
);
} }
} catch (Exception e) { } catch (Exception e) {
log.error("堆垛机任务发送失败,任务号:{},载具号:{},起点:{},终点:{}。", request.getTaskId(), request.getVehicleNo(), request.getOrigin(), request.getDestination()); log.error("堆垛机任务发送失败,任务号:{},载具号:{},起点:{},终点:{}。", request.getTaskId(), request.getVehicleNo(), request.getOrigin(), request.getDestination());
} }
} }
} }
}
} }

View File

@ -29,7 +29,7 @@ import java.util.stream.Collectors;
// 以下注解用于实现fixed_delay // 以下注解用于实现fixed_delay
@DisallowConcurrentExecution @DisallowConcurrentExecution
@RequiredArgsConstructor @RequiredArgsConstructor
public class WmsTaskExecutor implements Job { public class WmsTaskExecutor {
/** /**
* Wms任务服务 * Wms任务服务
*/ */
@ -48,7 +48,6 @@ public class WmsTaskExecutor implements Job {
* *
* @param jobExecutionContext 定时任务执行的环境上下文 * @param jobExecutionContext 定时任务执行的环境上下文
*/ */
@Override
public void execute(JobExecutionContext jobExecutionContext) { public void execute(JobExecutionContext jobExecutionContext) {
// 获取到所有待下发的任务 // 获取到所有待下发的任务
List<TAppTask> waitSendWmsTaskList = appTaskService.list( List<TAppTask> waitSendWmsTaskList = appTaskService.list(

View File

@ -1,12 +1,16 @@
package com.wms_main.service.quartz_job.job_executor; package com.wms_main.service.quartz_job.job_executor;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.WmsStackerTaskStatusEnums;
import com.wms_main.constant.enums.wms.WmsTaskTypeEnums; import com.wms_main.constant.enums.wms.WmsTaskTypeEnums;
import com.wms_main.dao.ITAppOrderInService; import com.wms_main.dao.ITAppOrderInService;
import com.wms_main.dao.ITAppTaskService; 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.TAppOrderIn;
import com.wms_main.model.po.TAppTask; 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.repository.utils.StringUtils;
import com.wms_main.service.business.IStackerTaskService; import com.wms_main.service.business.IStackerTaskService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -35,6 +39,8 @@ public class WmsTaskFinisher implements Job {
private final ITAppOrderInService appOrderInService; private final ITAppOrderInService appOrderInService;
private final ITAppWcsTaskService appWcsTaskService;
/** /**
* 运行定时任务 * 运行定时任务
* 完成堆垛机任务 * 完成堆垛机任务
@ -55,12 +61,12 @@ public class WmsTaskFinisher implements Job {
log.error("堆垛机任务完成类-入库执行异常:{}", StringUtils.objectToString(e)); log.error("堆垛机任务完成类-入库执行异常:{}", StringUtils.objectToString(e));
} }
// 出库 // 出库
List<TAppTask> waitFinishWmsTaskList = appTaskService.list( List<TAppWcsTask> waitFinishWcsTaskList = appWcsTaskService.list(
new LambdaQueryWrapper<TAppTask>() new LambdaQueryWrapper<TAppWcsTask>()
.eq(TAppTask::getTaskStatus, WmsStackerTaskStatusEnums.FINISH.getCode()) .eq(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.FINISH.getCode())
); );
List<TAppTask> stackerOutTasks = waitFinishWmsTaskList.stream() List<TAppWcsTask> stackerOutTasks = waitFinishWcsTaskList.stream()
.filter(task -> Objects.equals(WmsTaskTypeEnums.OUT.getCode(), task.getTaskType())) .filter(task -> Objects.equals(WcsStackerTaskTypeEnums.OUT.getCode(), task.getWcsTaskType()))
.toList(); .toList();
if (!stackerOutTasks.isEmpty()) { if (!stackerOutTasks.isEmpty()) {
try { try {

View File

@ -1,6 +1,7 @@
import axios from 'axios' import axios from 'axios'
const request = axios.create({ const request = axios.create({
// baseURL: 'http://10.18.58.20:12315/wms',
baseURL: 'http://localhost:12315/wms', baseURL: 'http://localhost:12315/wms',
timeout: 5000 timeout: 5000
}) })

View File

@ -2,7 +2,7 @@ const { defineConfig } = require('@vue/cli-service')
const NodePolyfillPlugin = require('node-polyfill-webpack-plugin') const NodePolyfillPlugin = require('node-polyfill-webpack-plugin')
module.exports = defineConfig({ module.exports = defineConfig({
publicPath: '/wms', publicPath: '/',
transpileDependencies: true, transpileDependencies: true,
configureWebpack: { configureWebpack: {
plugins: [new NodePolyfillPlugin()] plugins: [new NodePolyfillPlugin()]