fix(oms): 预约单下发不再推送WMS,修复执行单下发后WMS出现预约单+执行单两张单;三个下发入口补充软删单拦截
This commit is contained in:
+7
-1
@@ -613,9 +613,15 @@ public class ExecutionStockInOrderDomainService {
|
|||||||
}
|
}
|
||||||
// 入参去重:同一请求内重复ID会导致同一执行单被多次推送WMS
|
// 入参去重:同一请求内重复ID会导致同一执行单被多次推送WMS
|
||||||
List<Long> distinctInOrderIds = inOrderIds.stream().distinct().collect(Collectors.toList());
|
List<Long> distinctInOrderIds = inOrderIds.stream().distinct().collect(Collectors.toList());
|
||||||
|
// 只校验有效单据:已删除(软删)执行单混入ID(过期页面提交)时在此拦截,
|
||||||
|
// 此前list/getById均不过滤del_flag,软删单照样被推到WMS形成"幽灵单"
|
||||||
List<ExecutionStockInOrder> checkOrders = stockInOrderService.list(
|
List<ExecutionStockInOrder> checkOrders = stockInOrderService.list(
|
||||||
new QueryWrapper<ExecutionStockInOrder>().lambda()
|
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) {
|
for (ExecutionStockInOrder order : checkOrders) {
|
||||||
if (order.getIssueTime() != null) {
|
if (order.getIssueTime() != null) {
|
||||||
throw new ServiceException("下发失败:单据[" + order.getInOrderNumber() + "]已下发,不可重复下发;如需重新下发请先取消下发");
|
throw new ServiceException("下发失败:单据[" + order.getInOrderNumber() + "]已下发,不可重复下发;如需重新下发请先取消下发");
|
||||||
|
|||||||
+17
-45
@@ -525,9 +525,14 @@ public class ReservationStockInOrderDomainService {
|
|||||||
if (inOrderIds == null || inOrderIds.isEmpty()) {
|
if (inOrderIds == null || inOrderIds.isEmpty()) {
|
||||||
throw new ServiceException("下发失败:未选择单据");
|
throw new ServiceException("下发失败:未选择单据");
|
||||||
}
|
}
|
||||||
|
// 只校验有效单据:软删单混入ID(过期页面提交)时在此拦截
|
||||||
List<ReservationStockInOrder> checkOrders = stockInOrderService.list(
|
List<ReservationStockInOrder> checkOrders = stockInOrderService.list(
|
||||||
new QueryWrapper<ReservationStockInOrder>().lambda()
|
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) {
|
for (ReservationStockInOrder order : checkOrders) {
|
||||||
// 校验1:必须已审核(issueStatus==2 表示审核成功)
|
// 校验1:必须已审核(issueStatus==2 表示审核成功)
|
||||||
if (order.getIssueStatus() == null || order.getIssueStatus() != 2) {
|
if (order.getIssueStatus() == null || order.getIssueStatus() != 2) {
|
||||||
@@ -560,50 +565,12 @@ public class ReservationStockInOrderDomainService {
|
|||||||
.set(ReservationStockInOrder::getUpdateTime, new Date())
|
.set(ReservationStockInOrder::getUpdateTime, new Date())
|
||||||
.in(ReservationStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds()));
|
.in(ReservationStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds()));
|
||||||
|
|
||||||
//todo下发推送到wms
|
// 业务链路(2026-09与业务确认,生产验证):预约单下发→生成执行单→执行单下发时才推送WMS。
|
||||||
for (Long inOrderId : inOrderIds) {
|
// 预约单下发此前会先把预约单自身推到WMS(omsInOrderAdd/omsInOrderAddDetail),执行单下发又推一次,
|
||||||
ReservationStockInOrder byId = stockInOrderService.getById(inOrderId);
|
// 导致WMS入库管理出现预约单号(R260907001)+执行单号(RK260907001)两张单、仓库收两道货。
|
||||||
StockInOrder stockInOrder = new StockInOrder();
|
// 已移除预约单的WMS推送,WMS推送唯一入口收敛到 ExecutionStockInOrderDomainService.issueOrder。
|
||||||
BeanUtils.copyProperties(byId, stockInOrder, "inOrderId");
|
// 历史已推送的预约单数据由"取消下发"(cancelIssueOrder→omsCancelInOrder,幂等)负责清理。
|
||||||
stockInOrder.setOmsStockInOrderId(String.valueOf(byId.getInOrderId()));
|
|
||||||
|
|
||||||
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下发推送到入库业务单
|
//todo下发推送到入库业务单
|
||||||
for (Long inOrderId : inOrderIds) {
|
for (Long inOrderId : inOrderIds) {
|
||||||
// Long inOrderId = stockInOrderDO.getInOrderId();
|
// Long inOrderId = stockInOrderDO.getInOrderId();
|
||||||
@@ -801,9 +768,14 @@ public class ReservationStockInOrderDomainService {
|
|||||||
if (inOrderIds == null || inOrderIds.isEmpty()) {
|
if (inOrderIds == null || inOrderIds.isEmpty()) {
|
||||||
throw new ServiceException("执行失败:未选择单据");
|
throw new ServiceException("执行失败:未选择单据");
|
||||||
}
|
}
|
||||||
|
// 只校验有效单据:软删单混入ID(过期页面提交)时在此拦截(与 issueOrder 校验口径一致)
|
||||||
List<ReservationStockInOrder> checkOrders = stockInOrderService.list(
|
List<ReservationStockInOrder> checkOrders = stockInOrderService.list(
|
||||||
new QueryWrapper<ReservationStockInOrder>().lambda()
|
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) {
|
for (ReservationStockInOrder order : checkOrders) {
|
||||||
if (order.getIssueTime() != null) {
|
if (order.getIssueTime() != null) {
|
||||||
throw new ServiceException("执行失败:单据[" + order.getInOrderNumber() + "]已下发,不可重复执行;如需重新下发请先取消下发");
|
throw new ServiceException("执行失败:单据[" + order.getInOrderNumber() + "]已下发,不可重复执行;如需重新下发请先取消下发");
|
||||||
|
|||||||
Reference in New Issue
Block a user