fix(oms): 预约单下发不再推送WMS,修复执行单下发后WMS出现预约单+执行单两张单;三个下发入口补充软删单拦截

This commit is contained in:
rcx
2026-09-07 15:44:44 +08:00
parent 98b5ce81cc
commit 9e1c5d8570
2 changed files with 24 additions and 46 deletions
@@ -613,9 +613,15 @@ public class ExecutionStockInOrderDomainService {
}
// 入参去重:同一请求内重复ID会导致同一执行单被多次推送WMS
List<Long> distinctInOrderIds = inOrderIds.stream().distinct().collect(Collectors.toList());
// 只校验有效单据:已删除(软删)执行单混入ID(过期页面提交)时在此拦截,
// 此前list/getById均不过滤del_flag,软删单照样被推到WMS形成"幽灵单"
List<ExecutionStockInOrder> checkOrders = stockInOrderService.list(
new QueryWrapper<ExecutionStockInOrder>().lambda()
.in(ExecutionStockInOrder::getInOrderId, distinctInOrderIds));
.in(ExecutionStockInOrder::getInOrderId, distinctInOrderIds)
.eq(ExecutionStockInOrder::getDelFlag, 1));
if (checkOrders.size() != distinctInOrderIds.size()) {
throw new ServiceException("下发失败:存在已删除的单据,请刷新后重新选择");
}
for (ExecutionStockInOrder order : checkOrders) {
if (order.getIssueTime() != null) {
throw new ServiceException("下发失败:单据[" + order.getInOrderNumber() + "]已下发,不可重复下发;如需重新下发请先取消下发");
@@ -525,9 +525,14 @@ public class ReservationStockInOrderDomainService {
if (inOrderIds == null || inOrderIds.isEmpty()) {
throw new ServiceException("下发失败:未选择单据");
}
// 只校验有效单据:软删单混入ID(过期页面提交)时在此拦截
List<ReservationStockInOrder> checkOrders = stockInOrderService.list(
new QueryWrapper<ReservationStockInOrder>().lambda()
.in(ReservationStockInOrder::getInOrderId, inOrderIds));
.in(ReservationStockInOrder::getInOrderId, inOrderIds)
.eq(ReservationStockInOrder::getDelFlag, 1));
if (checkOrders.size() != inOrderIds.stream().distinct().count()) {
throw new ServiceException("下发失败:存在已删除的单据,请刷新后重新选择");
}
for (ReservationStockInOrder order : checkOrders) {
// 校验1:必须已审核(issueStatus==2 表示审核成功)
if (order.getIssueStatus() == null || order.getIssueStatus() != 2) {
@@ -560,50 +565,12 @@ public class ReservationStockInOrderDomainService {
.set(ReservationStockInOrder::getUpdateTime, new Date())
.in(ReservationStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds()));
//todo下发推送到wms
for (Long inOrderId : inOrderIds) {
ReservationStockInOrder byId = stockInOrderService.getById(inOrderId);
StockInOrder stockInOrder = new StockInOrder();
BeanUtils.copyProperties(byId, stockInOrder, "inOrderId");
stockInOrder.setOmsStockInOrderId(String.valueOf(byId.getInOrderId()));
// 业务链路(2026-09与业务确认,生产验证):预约单下发→生成执行单→执行单下发时才推送WMS。
// 预约单下发此前会先把预约单自身推到WMSomsInOrderAdd/omsInOrderAddDetail),执行单下发又推一次,
// 导致WMS入库管理出现预约单号(R260907001)+执行单号(RK260907001)两张单、仓库收两道货。
// 已移除预约单的WMS推送,WMS推送唯一入口收敛到 ExecutionStockInOrderDomainService.issueOrder。
// 历史已推送的预约单数据由"取消下发"cancelIssueOrder→omsCancelInOrder,幂等)负责清理。
try {
//WMS保存结果必须校验:此前接口返回void、Feign降级被静默吞掉,OMS标记已下发但WMS无数据/缺明细,
//收货流程无从进行(流程阻断);失败抛错回滚下发标记,WMS侧幂等(主单/明细判重),重下发安全
AjaxResult addResult = wmsServiceFeign.omsInOrderAdd(stockInOrder); // 推主单
if (addResult == null || !"200".equals(String.valueOf(addResult.get("code")))) {
throw new ServiceException("下发到WMS失败:入库单[" + stockInOrder.getInOrderNumber() + "]保存主单失败:"
+ (addResult == null ? "WMS服务不可用或已降级" : addResult.get("msg")));
}
String inOrderNumber = stockInOrder.getInOrderNumber();
List<ReservationInMaterialDetail> materialDetailList = materialDetailService.list(
new QueryWrapper<ReservationInMaterialDetail>().lambda()
.eq(ReservationInMaterialDetail::getInOrderNumber, inOrderNumber)
.eq(ReservationInMaterialDetail::getDelFlag, 1));
List<InMaterialDetail> inMaterialDetailList = new ArrayList<>();
for (ReservationInMaterialDetail reservationInMaterialDetail : materialDetailList) {
InMaterialDetail inMaterialDetail = new InMaterialDetail();
BeanUtils.copyProperties(reservationInMaterialDetail, inMaterialDetail, "materialDetailId");
inMaterialDetail.setOmsInMaterialDetail(String.valueOf(reservationInMaterialDetail.getMaterialDetailId()));
// 过期日期为空且饮用日期有值时,用饮用日期补齐过期日期(食品业务饮用日期即效期),
// 确保下发WMS后入库/收货/库存链路的过期日期能正常回显
if (inMaterialDetail.getExpiryDate() == null && inMaterialDetail.getDrinkDate() != null) {
inMaterialDetail.setExpiryDate(inMaterialDetail.getDrinkDate());
}
inMaterialDetailList.add(inMaterialDetail);
}
AjaxResult detailResult = wmsServiceFeign.omsInOrderAddDetail(inMaterialDetailList); // 推明细(会触发WMS自动审核)
if (detailResult == null || !"200".equals(String.valueOf(detailResult.get("code")))) {
throw new ServiceException("下发到WMS失败:入库单[" + inOrderNumber + "]保存明细失败:"
+ (detailResult == null ? "WMS服务不可用或已降级" : detailResult.get("msg")));
}
log.info("下发到WMS成功,单据号:{}", byId.getInOrderNumber());
} catch (Exception e) {
log.error("下发到WMS失败,单据号:{}", byId.getInOrderNumber(), e);
throw new ServiceException("下发到WMS失败:" + e.getMessage());
}
}
//todo下发推送到入库业务单
for (Long inOrderId : inOrderIds) {
// Long inOrderId = stockInOrderDO.getInOrderId();
@@ -801,9 +768,14 @@ public class ReservationStockInOrderDomainService {
if (inOrderIds == null || inOrderIds.isEmpty()) {
throw new ServiceException("执行失败:未选择单据");
}
// 只校验有效单据:软删单混入ID(过期页面提交)时在此拦截(与 issueOrder 校验口径一致)
List<ReservationStockInOrder> checkOrders = stockInOrderService.list(
new QueryWrapper<ReservationStockInOrder>().lambda()
.in(ReservationStockInOrder::getInOrderId, inOrderIds));
.in(ReservationStockInOrder::getInOrderId, inOrderIds)
.eq(ReservationStockInOrder::getDelFlag, 1));
if (checkOrders.size() != inOrderIds.stream().distinct().count()) {
throw new ServiceException("执行失败:存在已删除的单据,请刷新后重新选择");
}
for (ReservationStockInOrder order : checkOrders) {
if (order.getIssueTime() != null) {
throw new ServiceException("执行失败:单据[" + order.getInOrderNumber() + "]已下发,不可重复执行;如需重新下发请先取消下发");