fix(oms,wms): 入库反审修复:已反审tab列表查不到数据、未下发单反审补写反审记录

1. W收货单/W上架单【已反审】tab查不到数据:queryList 的 LEFT JOIN stock_in_order 固定带 a/b.DEL_FLAG=1,归档数据(反审后双方均已软删del_flag=2)关联不上b表,仓库/货主等基于b表的过滤条件把行全部过滤掉;改为按是否查反审归档动态切换关联条件(归档按del_flag=2关联,正常列表行为不变)

2. 未下发WMS的执行单反审不产生反审记录:reverseExecutionOrder 幂等跳过分支直接return导致入库异常无留痕;现补写1条反审记录(abnormalType=6,回退库存0,备注未下发WMS),同单号已有有效记录时防重,重试/重复反审幂等

3. OMS反审Feign参数透传组织三字段(organizationId/organizationName/topOrganizationId),供WMS跳过分支写反审记录使用(该场景无W入库单可取组织信息)
This commit is contained in:
rcx
2026-09-10 17:25:07 +08:00
parent e2da7177f0
commit cae62e83a5
4 changed files with 68 additions and 14 deletions
@@ -847,6 +847,10 @@ public class ReservationStockInOrderDomainService {
reverseParam.setRemark("业务单号:" + businessNumber
+ (StringUtils.isNotEmpty(stockInOrderDO.getReverseAuditRemark())
? ",反审原因:" + stockInOrderDO.getReverseAuditRemark() : ""));
//组织三字段:WMS幂等跳过分支(未下发单反审)写反审记录时取不到W入库单,需经Feign透传
reverseParam.setOrganizationId(executionOrder.getOrganizationId());
reverseParam.setOrganizationName(executionOrder.getOrganizationName());
reverseParam.setTopOrganizationId(executionOrder.getTopOrganizationId());
reverseParam.setUpdateBy(loginUser.getUserid());
reverseParam.setUpdateByName(userRealName);
AjaxResult reverseResult = wmsServiceFeign.omsReverseInOrder(reverseParam);
@@ -913,7 +913,7 @@ public class StockInOrderDomainService {
* 物料明细/作业单/任务/质检单一并软删留痕,台账节点物理删除保持与回退后库存一致</li>
* <li>写1条入库异常【反审记录】(in_order_abnormal type=3/abnormalType=6) 用于记录跟踪</li>
* </ul>
* <p>WMS无该单数据时幂等返回成功(OMS未下发单反审不产生WMS数据);任何校验失败抛错经
* <p>WMS无该单数据时幂等返回成功(OMS未下发单反审仅落1条反审记录留痕,不产生其他WMS数据);任何校验失败抛错经
* Feign 返回,OMS侧整体回滚。反审可重试,本方法幂等。</p>
*/
@Transactional(rollbackFor = Exception.class)
@@ -930,7 +930,9 @@ public class StockInOrderDomainService {
.eq(StockInOrder::getInOrderNumber, inOrderNumber)
.eq(StockInOrder::getDelFlag, 1));
if (CollectionUtils.isEmpty(stockInOrders)) {
//幂等:WMS无该单数据(未下发单反审或已反审过),直接成功,保证OMS反审可重试
//幂等:WMS无该单数据(未下发单反审或已反审过/重试),直接成功,保证OMS反审可重试
//反审记录仍落一条留痕(入库异常页面可查),同单号已有反审记录时不再重复写(重试幂等)
saveReverseAuditAbnormalIfAbsent(stockInOrder, BigDecimal.ZERO, "未下发WMS,无WMS链路数据需回退");
return;
}
StockInOrder wmsOrder = stockInOrders.get(0);
@@ -1167,18 +1169,46 @@ public class StockInOrderDomainService {
.eq(StockInOrder::getInOrderNumber, inOrderNumber)
.eq(StockInOrder::getDelFlag, 1));
// ========== 4. 写1条入库异常【反审记录】用于记录跟踪 ==========
// ========== 4. 写1条入库异常【反审记录】用于记录跟踪(组织信息取自W入库单) ==========
StockInOrder abnormalParam = new StockInOrder();
abnormalParam.setInOrderNumber(inOrderNumber);
abnormalParam.setOrganizationId(wmsOrder.getOrganizationId());
abnormalParam.setOrganizationName(wmsOrder.getOrganizationName());
abnormalParam.setTopOrganizationId(wmsOrder.getTopOrganizationId());
abnormalParam.setRemark(reverseReason);
abnormalParam.setUpdateBy(stockInOrder.getUpdateBy());
abnormalParam.setUpdateByName(reverseByName);
saveReverseAuditAbnormalIfAbsent(abnormalParam, inventoryTotal,
"回退库存" + inventoryTotal.stripTrailingZeros().toPlainString() + ",清理收货/上架链路数据");
}
/**
* 写入库异常【反审记录】(type=3/abnormalType=6FSYC单号)。
* 同单号已存在有效反审记录时跳过,保证"OMS重试/重复反审"不产生重复记录(幂等)。
*
* @param stockInOrder 载荷:入库单号/反审原因(remark)/操作人(updateBy,updateByName)/组织三字段
* @param quantity 本次反审回退的库存量(未下发WMS无库存回退时传0)
* @param sceneRemark 场景补充说明,拼入记录备注
*/
private void saveReverseAuditAbnormalIfAbsent(StockInOrder stockInOrder, BigDecimal quantity, String sceneRemark) {
long existing = inOrderAbnormalService.count(new LambdaQueryWrapper<InOrderAbnormal>()
.eq(InOrderAbnormal::getInOrderNumber, stockInOrder.getInOrderNumber())
.eq(InOrderAbnormal::getAbnormalType, 6)
.eq(InOrderAbnormal::getDelFlag, 1));
if (existing > 0) {
return;
}
InOrderAbnormal reverseAbnormal = new InOrderAbnormal();
reverseAbnormal.setOrganizationId(wmsOrder.getOrganizationId());
reverseAbnormal.setOrganizationName(wmsOrder.getOrganizationName());
reverseAbnormal.setTopOrganizationId(wmsOrder.getTopOrganizationId());
reverseAbnormal.setInOrderNumber(inOrderNumber);
reverseAbnormal.setAbnormalReason(StringUtils.isEmpty(reverseReason) ? "入库业务单反审" : "入库业务单反审:" + reverseReason);
reverseAbnormal.setQuantity(inventoryTotal);
reverseAbnormal.setRemark("入库业务单反审:回退库存" + inventoryTotal.stripTrailingZeros().toPlainString()
+ ",清理收货/上架链路数据");
reverseAbnormal.setOrganizationId(stockInOrder.getOrganizationId());
reverseAbnormal.setOrganizationName(stockInOrder.getOrganizationName());
reverseAbnormal.setTopOrganizationId(stockInOrder.getTopOrganizationId());
reverseAbnormal.setInOrderNumber(stockInOrder.getInOrderNumber());
reverseAbnormal.setAbnormalReason(StringUtils.isEmpty(stockInOrder.getRemark())
? "入库业务单反审" : "入库业务单反审:" + stockInOrder.getRemark());
reverseAbnormal.setQuantity(quantity == null ? BigDecimal.ZERO : quantity);
reverseAbnormal.setRemark("入库业务单反审:" + (StringUtils.isEmpty(sceneRemark) ? "" : sceneRemark));
reverseAbnormal.setCreateBy(stockInOrder.getUpdateBy() == null ? 0L : stockInOrder.getUpdateBy());
reverseAbnormal.setCreateByName(StringUtils.isEmpty(reverseByName) ? "system" : reverseByName);
reverseAbnormal.setCreateByName(StringUtils.isEmpty(stockInOrder.getUpdateByName()) ? "system" : stockInOrder.getUpdateByName());
inOrderAbnormalService.genReverseAuditAbnormal(reverseAbnormal);
}
@@ -167,7 +167,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectStockReceiptOrderPo"/>
<include refid="com.mhd.wms.domain.stockInOrder.repository.mapper.StockInOrderMapper.joinStockInOrderPo"/>
from stock_receipt_order a
LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number and a.DEL_FLAG = 1 and b.DEL_FLAG = 1
<!-- 已反审tab查归档数据: a/b 均已软删(del_flag=2), 仍按 del_flag=1 关联会导致 b 全为 NULL,
基于 b 的过滤条件(仓库/货主等)随之失效为 false, 列表恒为空; 故按是否查反审归档切换关联条件 -->
LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number
<choose>
<when test="reverseAuditStatus != null">
and a.DEL_FLAG = 2 and b.DEL_FLAG = 2
</when>
<otherwise>
and a.DEL_FLAG = 1 and b.DEL_FLAG = 1
</otherwise>
</choose>
<where>
<include refid="selectStockReceiptOrderPo1"/>
<include refid="com.mhd.wms.domain.stockInOrder.repository.mapper.StockInOrderMapper.joinStockInOrderPoWhere"/>
@@ -158,7 +158,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectStockShelfOrderPo"/>
<include refid="com.mhd.wms.domain.stockInOrder.repository.mapper.StockInOrderMapper.joinStockInOrderPo"/>
from stock_shelf_order a
LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number and a.DEL_FLAG = 1 and b.DEL_FLAG = 1
<!-- 已反审tab查归档数据: a/b 均已软删(del_flag=2), 仍按 del_flag=1 关联会导致 b 全为 NULL,
基于 b 的过滤条件(仓库/货主等)随之失效为 false, 列表恒为空; 故按是否查反审归档切换关联条件 -->
LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number
<choose>
<when test="reverseAuditStatus != null">
and a.DEL_FLAG = 2 and b.DEL_FLAG = 2
</when>
<otherwise>
and a.DEL_FLAG = 1 and b.DEL_FLAG = 1
</otherwise>
</choose>
<where>
<include refid="selectStockShelfOrderPo1"/>
<include refid="com.mhd.wms.domain.stockInOrder.repository.mapper.StockInOrderMapper.joinStockInOrderPoWhere"/>