1. 删除OrderInCheckor定时任务, 将MES与ERP的校验转移到创建任务时处理

2. 添加xsfbillno, xsfseq, neibubianhao, goodsBarcode字段
This commit is contained in:
李宇奇 2025-04-08 19:43:28 +08:00
parent e7436bcf46
commit 7ab3096b94
11 changed files with 123 additions and 23 deletions

View File

@ -11,7 +11,7 @@
Target Server Version : 80034 (8.0.34)
File Encoding : 65001
Date: 07/04/2025 16:52:04
Date: 08/04/2025 19:42:54
*/
SET NAMES utf8mb4;
@ -2223,7 +2223,6 @@ CREATE TABLE `t_app_jobs` (
-- ----------------------------
-- Records of t_app_jobs
-- ----------------------------
INSERT INTO `t_app_jobs` VALUES ('OrderInCheckor', 'com.wms_main.service.quartz_job.job_executor.OrderInCheckor', '0/2 * * * * ? *', 2000, 1, 1);
INSERT INTO `t_app_jobs` VALUES ('OutsExecutor', 'com.wms_main.service.quartz_job.job_executor.OutsExecutor', '0/2 * * * * ? *', 2000, 1, 1);
INSERT INTO `t_app_jobs` VALUES ('WcsStackerTaskSender', 'com.wms_main.service.quartz_job.job_executor.WcsStackerTaskSender', '0/2 * * * * ? *', 2000, 1, 1);
INSERT INTO `t_app_jobs` VALUES ('WmsTaskFinisher', 'com.wms_main.service.quartz_job.job_executor.WmsTaskFinisher', '0/2 * * * * ? *', 2000, 1, 1);
@ -4999,11 +4998,15 @@ CREATE TABLE `t_app_order_in` (
`goods_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`specification` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`quantity` double NOT NULL,
`goods_bar_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`goods_desc` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`order_status` int NOT NULL,
`create_time` datetime NOT NULL,
`update_time` datetime NULL DEFAULT NULL,
`complete_time` datetime NULL DEFAULT NULL,
`xsfbillno` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`xsfseq` int NULL DEFAULT NULL,
`neibubianhao` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`record_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
@ -5498,6 +5501,10 @@ CREATE TABLE `t_app_stock` (
`mes_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'mes单号',
`batch` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`goods_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`xsfbillno` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`xsfseq` int NULL DEFAULT NULL,
`neibubianhao` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`goods_bar_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`stock_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;
@ -5613,8 +5620,8 @@ CREATE TABLE `t_app_vehicle` (
-- Records of t_app_vehicle
-- ----------------------------
INSERT INTO `t_app_vehicle` VALUES ('0401', 0, 3, '1', 0, '', '2025-04-01 13:11:48');
INSERT INTO `t_app_vehicle` VALUES ('0402', 0, 2, '1', 0, 'A04-19-06-01', '2025-04-01 13:11:56');
INSERT INTO `t_app_vehicle` VALUES ('20250401150031', 0, 3, '1', 0, '', '2025-04-07 16:20:15');
INSERT INTO `t_app_vehicle` VALUES ('0402', 0, 2, '1', 0, '', '2025-04-01 13:11:56');
INSERT INTO `t_app_vehicle` VALUES ('20250401150031', 0, 3, '1', 0, '', '2025-04-08 19:30:11');
-- ----------------------------
-- Table structure for t_app_wcs_task
@ -5713,6 +5720,19 @@ INSERT INTO `t_app_wcs_task_bak` VALUES ('1744013622086010000', 2, 1, 0, '202504
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744013869045010000', 100, 2, 1, '20250401150031', 'A04-20-05-02', '103', '2025-04-07 16:17:49', NULL, NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744013987278010000', 2, 1, 0, '20250401150031', '103', 'A04-20-05-02', '2025-04-07 16:19:47', '2025-04-07 16:19:47', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744014051040010000', 100, 2, 1, '20250401150031', 'A04-20-05-02', '103', '2025-04-07 16:20:51', NULL, NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744101715450010000', 2, 1, 0, '20250401150031', '103', 'A04-20-05-02', '2025-04-08 16:41:55', '2025-04-08 16:41:55', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744103504534010000', 100, 2, 1, '20250401150031', 'A04-20-05-02', '272399-343153-97', '2025-04-08 17:11:45', NULL, NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744104108494010000', 2, 1, 0, '20250401150031', '103', 'A04-20-05-02', '2025-04-08 17:21:48', '2025-04-08 17:21:48', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744104795372010000', 2, 1, 0, '20250401150031', '103', 'A04-20-05-02', '2025-04-08 17:33:15', '2025-04-08 17:33:15', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744107367237010000', 2, 1, 0, '20250401150031', '103', 'A04-20-05-02', '2025-04-08 18:16:07', '2025-04-08 18:16:07', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744108481848010000', 2, 1, 0, '20250401150031', '103', 'A04-20-05-02', '2025-04-08 18:34:42', '2025-04-08 18:34:42', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744110229130010000', 2, 1, 0, '20250401150031', '103', 'A04-20-05-01', '2025-04-08 19:03:49', '2025-04-08 19:03:49', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744110590961010000', 2, 1, 0, '20250401150031', '103', 'A04-20-05-01', '2025-04-08 19:09:51', '2025-04-08 19:09:51', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744110928097010000', 2, 1, 0, '20250401150031', '103', 'A04-20-05-02', '2025-04-08 19:15:28', '2025-04-08 19:15:28', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744110975061010000', 100, 2, 1, '20250401150031', 'A04-20-05-02', '103', '2025-04-08 19:16:15', NULL, NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744111374581010000', 2, 1, 0, '20250401150031', '103', 'A04-20-05-02', '2025-04-08 19:22:55', '2025-04-08 19:22:55', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744111790731010000', 2, 1, 0, '20250401150031', '103', 'A04-20-05-02', '2025-04-08 19:29:51', '2025-04-08 19:29:51', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744111948895010000', 100, 2, 1, '20250401150031', 'A04-20-05-02', '103', '2025-04-08 19:32:29', NULL, NULL, NULL);
-- ----------------------------
-- Table structure for t_app_work

View File

@ -20,6 +20,6 @@ public class ErpGoodsDetail {
private String goodsDesc;
private String goodsBarcode;
private String xsfbillno;
private String xsfseq;
private Integer xsfseq;
private String neibubianhao;
}

View File

@ -59,6 +59,9 @@ public class TAppOrderIn {
@TableField(value = "order_status")
private Integer orderStatus;
@TableField(value = "goods_bar_code")
private String goodsBarcode;
@TableField(value = "create_time")
private LocalDateTime createTime;
@ -68,6 +71,15 @@ public class TAppOrderIn {
@TableField(value = "complete_time")
private LocalDateTime completeTime;
@TableField(value = "xsfbillno")
private String xsfbillno;
@TableField(value = "xsfseq")
private Integer xsfseq;
@TableField(value = "neibubianhao")
private String neibubianhao;
@TableField(value = "remark")
private String remark;

View File

@ -117,4 +117,16 @@ public class TAppStock {
@TableField(value = "goods_type")
private String goodsType;
@TableField(value = "xsfbillno")
private String xsfbillno;
@TableField(value = "xsfseq")
private Integer xsfseq;
@TableField(value = "neibubianhao")
private String neibubianhao;
@TableField(value = "goods_bar_code")
private String goodsBarCode;
}

View File

@ -72,7 +72,7 @@ public class ExternalApiServiceImpl implements IExternalApiService {
goodsDetail.setQuantity(Double.parseDouble(detail.get("quantity").toString()));
goodsDetail.setGoodsDesc((String) detail.get("goodsDesc"));
goodsDetail.setXsfbillno((String) detail.get("xsfbillno"));
goodsDetail.setXsfseq((String) detail.get("xsfseq"));
goodsDetail.setXsfseq(Integer.parseInt(detail.get("xsfseq").toString()));
goodsDetail.setNeibubianhao((String) detail.get("neibubianhao"));
goodsDetail.setGoodsBarcode((String) detail.get("goodsBarcode"));
erpsGoodsDetails.add(goodsDetail);

View File

@ -383,7 +383,7 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
needDeleteOrderIns.add(thisOrderIn.getRecordId());
orderCBIds.add(thisOrderIn.getOrderId());
// 添加库存
String validateStr = thisOrderIn.getGoodsId() + thisOrderIn.getBatch() + thisOrderIn.getGoodsType() + thisOrderIn.getSpecification();
String validateStr = thisOrderIn.getGoodsId() + thisOrderIn.getGoodsBarcode() + thisOrderIn.getGoodsType() + thisOrderIn.getSpecification() + thisOrderIn.getXsfbillno() + thisOrderIn.getXsfseq().toString() + thisOrderIn.getNeibubianhao();
if (!stockMap.containsKey(validateStr)) {
TAppStock newStock = new TAppStock();
newStock.setStockId(UUIDUtils.getNewUUID());
@ -405,7 +405,10 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
newStock.setBatch(thisOrderIn.getBatch());
newStock.setGoodsType(thisOrderIn.getGoodsType());
newStock.setBarCode(thisOrderIn.getInStand());
// newStockList.add(newStock);
newStock.setGoodsBarCode(thisOrderIn.getGoodsBarcode());
newStock.setXsfbillno(thisOrderIn.getXsfbillno());
newStock.setXsfseq(thisOrderIn.getXsfseq());
newStock.setNeibubianhao(thisOrderIn.getNeibubianhao());
stockMap.put(validateStr, newStock);
} else {
TAppStock newStock = stockMap.get(validateStr);
@ -572,6 +575,10 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
thisVehicleInTask.getBarCode(),
thisVehicleInTask.getMesId(),
"",
"",
"",
0,
"",
""
));
} else {
@ -605,7 +612,12 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
thisVehicleInTask.getBarCode(),
thisVehicleInTask.getMesId(),
"",
"",
"",
0,
"",
""
));
needDeleteStockIds.addAll(oldStockList.stream()
.map(TAppStock::getStockId)

View File

@ -2,9 +2,12 @@ package com.wms_main.service.controller.serviceImpl;
import com.alibaba.fastjson.JSON;
import com.wms_main.constant.enums.wms.OrderStatusEnum;
import com.wms_main.constant.enums.wms.WmsApiResponseCodeEnums;
import com.wms_main.dao.ITAppOrderInService;
import com.wms_main.dao.ITAppOrderOutService;
import com.wms_main.dao.ITAppStockService;
import com.wms_main.model.bo.erp.ErpGoodsDetail;
import com.wms_main.model.bo.erp.ErpVehicleNoResp;
import com.wms_main.model.dto.request.ycwms.*;
import com.wms_main.model.dto.response.ycwms.YcwmsResponse;
import com.wms_main.model.po.TAppOrderIn;
@ -12,6 +15,7 @@ import com.wms_main.model.po.TAppOrderOut;
import com.wms_main.model.po.TAppStock;
import com.wms_main.repository.utils.StringUtils;
import com.wms_main.repository.utils.UUIDUtils;
import com.wms_main.service.api.IExternalApiService;
import com.wms_main.service.controller.IYcwmsControllerService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -19,7 +23,9 @@ import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
@Service
@Slf4j
@ -29,6 +35,7 @@ public class YcwmsControllerServiceImpl implements IYcwmsControllerService {
private final ITAppOrderInService appOrderInService;
private final ITAppOrderOutService appOrderOutService;
private final ITAppStockService appStockService;
private final IExternalApiService externalApiService;
@Override
public YcwmsResponse<Object> orderIn(OrderInReq request) {
@ -47,8 +54,40 @@ public class YcwmsControllerServiceImpl implements IYcwmsControllerService {
if(!withOrderId.isEmpty()) {
return YcwmsResponse.error("入库单已存在,请勿重复推送", null);
}
String vehicleNo = request.getVehicleNo();
List<ErpGoodsDetail> erpGoodsDetails = new ArrayList<>();
try {
YcwmsResponse<ErpVehicleNoResp> erpResp = externalApiService.getVehicleNoData(vehicleNo);
if (erpResp != null && WmsApiResponseCodeEnums.SUCCESS.getCode() == erpResp.getCode() && !erpResp.getReturnData().getGoodsDetail().isEmpty()) {
erpGoodsDetails = erpResp.getReturnData().getGoodsDetail();
} else {
log.warn("获取载具[{}]数据失败,响应:{}", vehicleNo, erpResp);
}
} catch (Exception e) {
log.error("处理载具[{}]数据时发生异常:", vehicleNo, e);
}
List<OrderInGoodsDetail> mesGoodsDetails = request.getGoodsDetail();
// 对比inTasks和goodsDetails
Iterator<OrderInGoodsDetail> iterator = mesGoodsDetails.iterator();
while (iterator.hasNext()) {
OrderInGoodsDetail goodsDetail = iterator.next();
boolean matchFound = erpGoodsDetails.stream().anyMatch(erpGoodsDetail ->
erpGoodsDetail.getGoodsId().equals(goodsDetail.getGoodsId()) &&
erpGoodsDetail.getGoodsBarcode().equals(goodsDetail.getGoodsBarcode()) &&
Objects.equals(erpGoodsDetail.getQuantity(), goodsDetail.getQuantity()) &&
erpGoodsDetail.getGoodsType().equals(goodsDetail.getGoodsType()) &&
Objects.equals(erpGoodsDetail.getSpecification(), goodsDetail.getSpecification())
);
if (matchFound) {
// 找到匹配的任务删除该 goodsDetail
iterator.remove();
}
}
if (!mesGoodsDetails.isEmpty()) {
return YcwmsResponse.error("MES与ERP校验失败", null);
}
List<TAppOrderIn> orderInList = new ArrayList<>();
for (var goodsDetail : request.getGoodsDetail()) {
for (ErpGoodsDetail goodsDetail : erpGoodsDetails) {
if(goodsDetail == null || StringUtils.isEmpty(goodsDetail.getGoodsId()) || goodsDetail.getQuantity() == null) {
return YcwmsResponse.error("参数错误", null);
}
@ -66,7 +105,11 @@ public class YcwmsControllerServiceImpl implements IYcwmsControllerService {
orderIn.setSpecification(goodsDetail.getSpecification());
orderIn.setQuantity(goodsDetail.getQuantity());
orderIn.setGoodsDesc(goodsDetail.getGoodsDesc());
orderIn.setGoodsBarcode(goodsDetail.getGoodsBarcode());
orderIn.setOrderStatus(OrderStatusEnum.CREATE.getCode());
orderIn.setXsfbillno(goodsDetail.getXsfbillno());
orderIn.setXsfseq(goodsDetail.getXsfseq());
orderIn.setNeibubianhao(goodsDetail.getNeibubianhao());
orderIn.setCreateTime(LocalDateTime.now());
orderIn.setUpdateTime(LocalDateTime.now());
orderInList.add(orderIn);

View File

@ -26,12 +26,11 @@ import java.util.stream.Collectors;
// 以下注解用于实现fixed_delay
@DisallowConcurrentExecution
@RequiredArgsConstructor
public class OrderInCheckor implements Job {
public class OrderInCheckor {
private final ITAppOrderInService orderInService;
private final ITAppWcsTaskService wcsTaskService;
private final IExternalApiService externalApiService;
@Override
public void execute(JobExecutionContext jobExecutionContext) {
List<TAppOrderIn> inOrdersToCheck = orderInService.list(
new LambdaQueryWrapper<TAppOrderIn>()
@ -69,6 +68,7 @@ public class OrderInCheckor implements Job {
ErpGoodsDetail goodsDetail = iterator.next();
boolean matchFound = inTasks.stream().anyMatch(task ->
task.getGoodsId().equals(goodsDetail.getGoodsId()) &&
task.getGoodsBarcode().equals(goodsDetail.getGoodsBarcode()) &&
Objects.equals(task.getQuantity(), goodsDetail.getQuantity()) &&
task.getGoodsType().equals(goodsDetail.getGoodsType()) &&
Objects.equals(task.getSpecification(), goodsDetail.getSpecification())

View File

@ -74,11 +74,10 @@ public class OutsExecutor implements Job {
}
TAppStock stock = new TAppStock();
stock.setGoodsId(orderOut.getGoodsId());
stock.setBatch(orderOut.getBatch());
stock.setSled(orderOut.getSpecification());
List<TAppStock> stockList = stockService.getWithEntity(stock);
// 提取所有相关库存的载具号
List<String> vehicleIds = stockList.stream().map(TAppStock::getVehicleId).toList();
List<String> vehicleIds = stockList.stream().map(TAppStock::getVehicleId).distinct().toList();
List<TAppStock> outStockList = new ArrayList<TAppStock>();
if(vehicleIds.isEmpty()) {
log.warn("缺少库存, goodsId is {}, batch is {}, specification is {}", orderOut.getGoodsId(), orderOut.getBatch(), orderOut.getSpecification());
@ -92,11 +91,9 @@ public class OutsExecutor implements Job {
continue;
}
if (stockItem.getGoodsId().equals(orderOut.getGoodsId()) && stockItem.getStockStatus().equals(WmsStockStatusEnums.OK.getCode())) {
needQuantity -= stockItem.getRemainNum();
needQuantity -= stockItem.getTotalNum();
}
stockItem.setStockStatus(WmsStockStatusEnums.OUTING.getCode());
stockItem.setRemainNum(0.0);
stockItem.setRealNum(0.0);
outStockList.add(stockItem);
}
}
@ -122,23 +119,27 @@ public class OutsExecutor implements Job {
// appTaskList.add(appTask);
// }
List<TAppWcsTask> wcsTasks = new ArrayList<>();
for (TAppStock stockItem : outStockList) {
Map<String, List<TAppStock>> vehicleIdToStockMap = outStockList.stream()
.filter(stockMap -> Objects.equals(stockMap.getStockStatus(), WmsStockStatusEnums.OUTING.getCode()))
.collect(Collectors.groupingBy(TAppStock::getVehicleId));
for (String vehicleId : vehicleIdToStockMap.keySet()) {
List<TAppStock> stocks = vehicleIdToStockMap.get(vehicleId);
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.setVehicleId(stocks.getFirst().getVehicleId());
wcsTask.setOrderId(orderOut.getOrderId());
wcsTask.setCreateTime(LocalDateTime.now());
wcsTask.setOrigin(stockItem.getLocationId());
wcsTask.setDestination(stockItem.getBarCode());
wcsTask.setOrigin(stocks.getFirst().getLocationId());
wcsTask.setDestination(stocks.getFirst().getBarCode());
wcsTasks.add(wcsTask);
}
orderOut.setOrderStatus(OrderStatusEnum.RUNNING.getCode());
orderOutService.updateById(orderOut);
// taskService.saveBatch(appTaskList);
wcsTaskService.saveBatch(wcsTasks);
stockService.updateBatchById(outStockList);
}

View File

@ -7,7 +7,7 @@ import axios from "axios";
const _request = axios.create({
// baseURL: 'http://10.18.58.20:12315/wms',
baseURL: 'http://10.18.58.20:12315',
baseURL: 'http://10.18.58.21:12315',
timeout: 5000
})

View File

@ -7,7 +7,7 @@ import axios from "axios";
const _request = axios.create({
// baseURL: 'http://10.18.58.20:12315/wms',
baseURL: 'http://10.18.58.20:12315',
baseURL: 'http://10.18.58.21:12315',
timeout: 5000
})