亚驰出版提交

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) {
return wcsControllerService.requireInTask(request);
}
}

View File

@ -44,9 +44,4 @@ public class YcwmsController {
public YcwmsResponse<List<StockResp>> stock(@RequestBody StockReq 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 已完成的出库任务
*/
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.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<TAppStock> newStockList = new ArrayList<>();
List<TAppStock> newStockList = null;
// 需要删除的任务id
List<String> needDeleteOrderIns = new ArrayList<>();
Map<String, TAppStock> 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<TAppLocation>()
@ -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<TAppStock>(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<TAppTask> stackerOutTasks) {
public void finishStackerOutTasks(List<TAppWcsTask> stackerOutTasks) {
// 出库完成需要完成以下事情
// 1. 更新库存状态
// 2. 更新载具状态
@ -636,9 +661,9 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
// 4. 释放当前载具的拣选任务列表
// 5. 添加出库记录
// 根据载具号map一下
Map<String, List<TAppTask>> 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<String, List<TAppWcsTask>> 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<TAppVehicle>()
@ -666,47 +691,32 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
thisVehicle.setLocationId("");
appVehicleService.updateById(thisVehicle);
// 更新当前载具对应的所有库存的状态为已出库
appStockService.update(new LambdaUpdateWrapper<TAppStock>()
.set(TAppStock::getStockStatus, WmsStockStatusEnums.OUTED.getCode())
.set(TAppStock::getLocationId, "")
appStockService.remove(new LambdaUpdateWrapper<TAppStock>()
.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()) {
// 存储出库记录
List<TAppTaskBak> stockOutRecordList = thisVehicleOutTasks.stream()
.map(outTask -> new TAppTaskBak(
outTask.getTaskId(),
outTask.getTaskType(),
outTask.getTaskStatus(),
List<TAppWcsTaskBak> 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<TAppTask>()
.eq(TAppTask::getVehicleId, vehicleId)
.eq(TAppTask::getTaskType, WmsTaskTypeEnums.OUT.getCode())
.in(TAppTask::getTaskId, thisVehicleOutTasks.stream().map(TAppTask::getTaskId).toList()));
appWcsTaskService.remove(new LambdaQueryWrapper<TAppWcsTask>()
.eq(TAppWcsTask::getVehicleId, vehicleId)
.eq(TAppWcsTask::getWcsTaskType, WcsStackerTaskTypeEnums.OUT.getCode())
.in(TAppWcsTask::getWcsTaskId, thisVehicleOutTasks.stream().map(TAppWcsTask::getWcsTaskId).toList()));
}
}
}

View File

@ -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<TAppTask>()
@ -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<TAppTask>()

View File

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

View File

@ -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) {
// 获取定时配置信息

View File

@ -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<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;
}
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.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<TAppWcsTask> waitSendWcsTaskList = appWcsTaskService.list(
List<TAppWcsTask> appWcsTasks = appWcsTaskService.list(
new LambdaQueryWrapper<TAppWcsTask>()
.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<WcsStackerTask> wcsResponse = wcsApiService.sendWcsStackerTask(request);
if (wcsResponse != null && WcsApiResponseCodeEnums.SUCCESS.getCode() == wcsResponse.getCode()) {
// 更新当前的wcs任务状态为已发送
appWcsTaskService.update(
new LambdaUpdateWrapper<TAppWcsTask>()
.set(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.WAIT.getCode())
.set(TAppWcsTask::getSendTime, LocalDateTime.now())
.eq(TAppWcsTask::getWcsTaskId, wcsTask.getWcsTaskId())
);
// 更新当前wcs任务对应的wms任务为已发送
appTaskService.update(
new LambdaUpdateWrapper<TAppTask>()
.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<TAppWcsTask>()
.set(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.EXCEPTION.getCode())
.set(TAppWcsTask::getSendTime, LocalDateTime.now())
.eq(TAppWcsTask::getWcsTaskId, wcsTask.getWcsTaskId())
);
// 更新当前wcs任务对应的wms任务为异常
appTaskService.update(
new LambdaUpdateWrapper<TAppTask>()
.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<WcsStackerTask> wcsResponse = wcsApiService.sendWcsStackerTask(request);
if (wcsResponse != null && WcsApiResponseCodeEnums.SUCCESS.getCode() == wcsResponse.getCode()) {
appWcsTaskService.update(
new LambdaUpdateWrapper<TAppWcsTask>()
.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<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(
new LambdaUpdateWrapper<TAppWcsTask>()
.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());
}
}
}

View File

@ -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<TAppTask> waitSendWmsTaskList = appTaskService.list(

View File

@ -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<TAppTask> waitFinishWmsTaskList = appTaskService.list(
new LambdaQueryWrapper<TAppTask>()
.eq(TAppTask::getTaskStatus, WmsStackerTaskStatusEnums.FINISH.getCode())
List<TAppWcsTask> waitFinishWcsTaskList = appWcsTaskService.list(
new LambdaQueryWrapper<TAppWcsTask>()
.eq(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.FINISH.getCode())
);
List<TAppTask> stackerOutTasks = waitFinishWmsTaskList.stream()
.filter(task -> Objects.equals(WmsTaskTypeEnums.OUT.getCode(), task.getTaskType()))
List<TAppWcsTask> stackerOutTasks = waitFinishWcsTaskList.stream()
.filter(task -> Objects.equals(WcsStackerTaskTypeEnums.OUT.getCode(), task.getWcsTaskType()))
.toList();
if (!stackerOutTasks.isEmpty()) {
try {

View File

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

View File

@ -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()]