feat(oms,wms): 入库业务单反审——业务单改已驳回+已反审tab,执行单/W入库/收货/上架软删打标归档,库存还原扣减,W入库异常反审记录
【需求】已入库/已出库的单子客户通知需要回退的场景,单子回退到最原始状态。反审入口在 OMS-入库业务单页面【反審單據】按钮,一次操作全链路回退。
【反审规则】
1. 按页面状态 issueStatus 判断:进行中(1)/已审核(2)/已入库(4)/部分完成(5) 可反审;已创建(0)无需反审、已驳回(3)可直接编辑;已取消/已关闭(status 6/7)兜底拦截
2. 已推送关务/NC(pushStatus=3)直接拦截,避免关务与仓内数据不一致
3. W入库单有出库记录就不能反审:按入库单号+动作(分配库存/出库)查询库存调整记录>0 即拦截,另校验库存冻结量>0
4. WMS无该单数据时幂等成功(未下发单反审),反审失败可安全重试
【反审动作】
1. 入库业务单:状态改为已驳回(issueStatus=3,与审核不通过同语义,可编辑→重新审核→重新下发),打已反审标记落入【已反审】tab;清空入库数量/入库时间/执行单号,明细 INBOUND_ITEMS/TOTAL_NET_WEIGHT 归零
2. 入库执行单+物料明细:软删(del_flag=2)+打已反审标记,【已反审】tab 按「已软删+已反审」查询归档数据,避免归档单被误审核/下发
3. WMS侧(逐执行单Feign omsReverseInOrder):库存还原扣减(校验库存行合计=已完成上架量后整行对称扣回,GREATEST(x-n,0)兜底)→ W入库单/W收货单/W上架单及明细、收货/上架作业单/任务/质检单整链软删+打已反审标记 → 写1条入库异常【反审记录】(type=3/abnormalType=6,FSYC单号)用于记录跟踪
【接口】
- POST /reservationStockInOrderApi/reverseAudit 反审(inOrderIds + reverseAuditRemark,支持批量)
- 已反审tab:/reservationStockInOrderApi/list?reverseAuditStatus=1(执行单/W入库单/W收货单/W上架单同参数,后端固定限定 del_flag=2+标记=1 归档数据)
- 归档详情:/executionStockInOrderApi、/stockInOrderApi、/stockReceiptOrderApi、/stockShelfOrderApi 各增 getReverseAuditInfo/{id}(原 getInfo 行为不变)
- 反审记录筛选:/inOrderAbnormalApi/list?abnormalType=6
【DDL】sql/20260908_oms_inbound_reverse_audit.sql:RESERVATION_STOCK_IN_ORDER / EXECUTION_STOCK_IN_ORDER / STOCK_IN_ORDER / STOCK_RECEIPT_ORDER / STOCK_SHELF_ORDER 各新增 REVERSE_AUDIT_STATUS/REMARK/BY/BY_NAME/TIME 五列,发服务前先执行
【其他】
- 库存扣减走 batchSubtractInventoryQuantity 并显式传更新人,规避 Feign 链路无登录态时 SecurityUtils 抛异常
- omsReverseInOrder 的 Feign 方法与降级已随出库反审提交(715883f1)入库,本次不再重复提交
- 归档行只读,详情走 getReverseAuditInfo;正常数据与归档数据互不干扰
This commit is contained in:
+17
@@ -459,4 +459,21 @@ public class ExecutionStockInOrder extends BaseVOEntity {
|
||||
|
||||
@ApiModelProperty("通知单备注")
|
||||
private String noticeRemark;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审")
|
||||
private Integer reverseAuditStatus;
|
||||
|
||||
@ApiModelProperty("反审原因")
|
||||
private String reverseAuditRemark;
|
||||
|
||||
@ApiModelProperty("反审人id")
|
||||
private Long reverseAuditBy;
|
||||
|
||||
@ApiModelProperty("反审人姓名")
|
||||
private String reverseAuditByName;
|
||||
|
||||
@ApiModelProperty("反审时间")
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date reverseAuditTime;
|
||||
}
|
||||
+17
@@ -482,4 +482,21 @@ public class ExecutionStockInOrderPO extends BaseVOEntity {
|
||||
private String khdm;
|
||||
@ApiModelProperty("通知单备注")
|
||||
private String noticeRemark;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审")
|
||||
private Integer reverseAuditStatus;
|
||||
|
||||
@ApiModelProperty("反审原因")
|
||||
private String reverseAuditRemark;
|
||||
|
||||
@ApiModelProperty("反审人id")
|
||||
private Long reverseAuditBy;
|
||||
|
||||
@ApiModelProperty("反审人姓名")
|
||||
private String reverseAuditByName;
|
||||
|
||||
@ApiModelProperty("反审时间")
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date reverseAuditTime;
|
||||
}
|
||||
+17
@@ -513,4 +513,21 @@ public class ExecutionStockInOrderDO extends BaseVOEntity {
|
||||
private String businessPriceWay;
|
||||
@ApiModelProperty("通知单备注")
|
||||
private String noticeRemark;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审")
|
||||
private Integer reverseAuditStatus;
|
||||
|
||||
@ApiModelProperty("反审原因")
|
||||
private String reverseAuditRemark;
|
||||
|
||||
@ApiModelProperty("反审人id")
|
||||
private Long reverseAuditBy;
|
||||
|
||||
@ApiModelProperty("反审人姓名")
|
||||
private String reverseAuditByName;
|
||||
|
||||
@ApiModelProperty("反审时间")
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date reverseAuditTime;
|
||||
}
|
||||
+17
@@ -510,4 +510,21 @@ public class ExecutionStockInOrderDTO extends ExecutionStockInOrderBaseDTO {
|
||||
private String businessPriceWay;
|
||||
@ApiModelProperty("通知单备注")
|
||||
private String noticeRemark;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审")
|
||||
private Integer reverseAuditStatus;
|
||||
|
||||
@ApiModelProperty("反审原因")
|
||||
private String reverseAuditRemark;
|
||||
|
||||
@ApiModelProperty("反审人id")
|
||||
private Long reverseAuditBy;
|
||||
|
||||
@ApiModelProperty("反审人姓名")
|
||||
private String reverseAuditByName;
|
||||
|
||||
@ApiModelProperty("反审时间")
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date reverseAuditTime;
|
||||
}
|
||||
+18
-1
@@ -263,7 +263,16 @@ public class ExecutionStockInOrderApplicationService {
|
||||
*/
|
||||
public ExecutionStockInOrderPO getInfo(Long inOrderId)
|
||||
{
|
||||
ExecutionStockInOrderPO info = stockInOrderDomainService.getInfo(inOrderId);
|
||||
return getInfo(inOrderId, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取入库执行单详情(getReverseAuditInfo 归档详情复用)
|
||||
* @param archive true-查询【已反审】tab 归档数据
|
||||
*/
|
||||
public ExecutionStockInOrderPO getInfo(Long inOrderId, boolean archive)
|
||||
{
|
||||
ExecutionStockInOrderPO info = stockInOrderDomainService.getInfo(inOrderId, archive);
|
||||
String userNcCode = reservationStockInOrderMapper.getUserNcCode(info.getShipperId());
|
||||
info.setKhdm(userNcCode);
|
||||
List<ExecutionInMaterialDetailPO> materialDetailList = info.getMaterialDetailList();
|
||||
@@ -276,6 +285,14 @@ public class ExecutionStockInOrderApplicationService {
|
||||
return info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询入库执行单【已反审】tab 归档详情(已软删+已反审标记的数据,含软删明细)
|
||||
*/
|
||||
public ExecutionStockInOrderPO getReverseAuditInfo(Long inOrderId)
|
||||
{
|
||||
return getInfo(inOrderId, true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
||||
+17
@@ -314,14 +314,31 @@ public class ExecutionStockInOrderDomainService {
|
||||
* 获取入库单详细信息
|
||||
*/
|
||||
public ExecutionStockInOrderPO getInfo(Long inOrderId)
|
||||
{
|
||||
return getInfo(inOrderId, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取入库执行单详情
|
||||
* @param archive true-查询【已反审】tab 归档数据(主单须为已软删+已反审标记,明细放行软删行)
|
||||
*/
|
||||
public ExecutionStockInOrderPO getInfo(Long inOrderId, boolean archive)
|
||||
{
|
||||
ExecutionStockInOrderPO stockInOrderPO = stockInOrderService.getInfo(inOrderId);
|
||||
if (archive && (stockInOrderPO.getDelFlag() == null || stockInOrderPO.getDelFlag() != 2
|
||||
|| !Integer.valueOf(1).equals(stockInOrderPO.getReverseAuditStatus()))) {
|
||||
throw new ServiceException("入库执行单非已反审归档数据,无法查看归档详情");
|
||||
}
|
||||
ExecutionInMaterialDetailDO inMaterialDetailDO = new ExecutionInMaterialDetailDO();
|
||||
String inOrderNumber = stockInOrderPO.getInOrderNumber();
|
||||
List<BusinessDocumentOrder> businessDocumentOrders = businessDocumentOrderMapper.selectList(new LambdaQueryWrapper<BusinessDocumentOrder>().eq(BusinessDocumentOrder::getInOrderNumber, inOrderNumber).notIn(BusinessDocumentOrder::getOrderStatus,4,5));
|
||||
stockInOrderPO.setBusinessDocumentOrderDOList(businessDocumentOrders);
|
||||
inMaterialDetailDO.setInOrderNumber(inOrderNumber);
|
||||
inMaterialDetailDO.setLevel(1);
|
||||
if (archive) {
|
||||
//归档明细已随主单软删(del_flag=2),放行软删明细行
|
||||
inMaterialDetailDO.setDelFlag(2);
|
||||
}
|
||||
List<ExecutionInMaterialDetailPO> inMaterialDetailPOList = materialDetailService.queryList(inMaterialDetailDO);
|
||||
|
||||
// 先通过入库单号查询收货单列表
|
||||
|
||||
+17
@@ -456,4 +456,21 @@ public class ReservationStockInOrder extends BaseVOEntity {
|
||||
|
||||
@ApiModelProperty("业务计价方式")
|
||||
private String businessPriceWay;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审")
|
||||
private Integer reverseAuditStatus;
|
||||
|
||||
@ApiModelProperty("反审原因")
|
||||
private String reverseAuditRemark;
|
||||
|
||||
@ApiModelProperty("反审人id")
|
||||
private Long reverseAuditBy;
|
||||
|
||||
@ApiModelProperty("反审人姓名")
|
||||
private String reverseAuditByName;
|
||||
|
||||
@ApiModelProperty("反审时间")
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date reverseAuditTime;
|
||||
}
|
||||
+17
@@ -502,4 +502,21 @@ public class ReservationStockInOrderPO extends BaseVOEntity {
|
||||
@ApiModelProperty("业务计价方式")
|
||||
private String businessPriceWay;
|
||||
private String khdm;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审")
|
||||
private Integer reverseAuditStatus;
|
||||
|
||||
@ApiModelProperty("反审原因")
|
||||
private String reverseAuditRemark;
|
||||
|
||||
@ApiModelProperty("反审人id")
|
||||
private Long reverseAuditBy;
|
||||
|
||||
@ApiModelProperty("反审人姓名")
|
||||
private String reverseAuditByName;
|
||||
|
||||
@ApiModelProperty("反审时间")
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date reverseAuditTime;
|
||||
}
|
||||
+17
@@ -513,4 +513,21 @@ public class ReservationStockInOrderDO extends BaseVOEntity {
|
||||
|
||||
@ApiModelProperty("业务计价方式")
|
||||
private String businessPriceWay;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审")
|
||||
private Integer reverseAuditStatus;
|
||||
|
||||
@ApiModelProperty("反审原因")
|
||||
private String reverseAuditRemark;
|
||||
|
||||
@ApiModelProperty("反审人id")
|
||||
private Long reverseAuditBy;
|
||||
|
||||
@ApiModelProperty("反审人姓名")
|
||||
private String reverseAuditByName;
|
||||
|
||||
@ApiModelProperty("反审时间")
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date reverseAuditTime;
|
||||
}
|
||||
+17
@@ -507,4 +507,21 @@ public class ReservationStockInOrderDTO extends ReservationStockInOrderBaseDTO {
|
||||
|
||||
@ApiModelProperty("业务计价方式")
|
||||
private String businessPriceWay;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审")
|
||||
private Integer reverseAuditStatus;
|
||||
|
||||
@ApiModelProperty("反审原因")
|
||||
private String reverseAuditRemark;
|
||||
|
||||
@ApiModelProperty("反审人id")
|
||||
private Long reverseAuditBy;
|
||||
|
||||
@ApiModelProperty("反审人姓名")
|
||||
private String reverseAuditByName;
|
||||
|
||||
@ApiModelProperty("反审时间")
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date reverseAuditTime;
|
||||
}
|
||||
+10
-2
@@ -282,8 +282,7 @@ public class ReservationStockInOrderApplicationService {
|
||||
* @return Boolean
|
||||
*/
|
||||
public Boolean auditState(ReservationStockInOrderDO stockInOrderDO){
|
||||
Boolean b = stockInOrderDomainService.auditState(stockInOrderDO);
|
||||
// List<Long> inOrderIds = stockInOrderDO.getInOrderIds();
|
||||
Boolean b = stockInOrderDomainService.auditState(stockInOrderDO);// List<Long> inOrderIds = stockInOrderDO.getInOrderIds();
|
||||
// if (inOrderIds != null && !inOrderIds.isEmpty()) {
|
||||
// ReservationStockInOrder stockInOrder = reservationStockInOrderMapper.selectById(inOrderIds.get(0));
|
||||
// Integer needCustomsDeclaration = stockInOrder.getNeedCustomsDeclaration();
|
||||
@@ -302,6 +301,15 @@ public class ReservationStockInOrderApplicationService {
|
||||
return b;
|
||||
}
|
||||
|
||||
/**
|
||||
* 反审入库业务单:业务单状态改为已驳回(issueStatus=3)并打已反审标记落入【已反审】tab,
|
||||
* 入库执行单+明细逻辑删除,WMS侧整链回退(库存扣减+单据清理+反审异常记录),
|
||||
* W入库单有出库记录时WMS侧拦截,已推送关务直接拦截
|
||||
*/
|
||||
public Boolean reverseAudit(ReservationStockInOrderDO stockInOrderDO){
|
||||
return stockInOrderDomainService.reverseAudit(stockInOrderDO);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 下发入库单
|
||||
* @author ZhouGY
|
||||
|
||||
+162
@@ -13,6 +13,9 @@ import com.mhd.common.core.web.domain.AjaxResult;
|
||||
import com.mhd.common.security.utils.SecurityUtils;
|
||||
import com.mhd.oms.domain.businessDocumentOrder.entity.BusinessDocumentOrder;
|
||||
import com.mhd.oms.domain.businessDocumentOrder.repository.mapper.BusinessDocumentOrderMapper;
|
||||
import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignature;
|
||||
import com.mhd.oms.domain.electronicSignature.repository.facade.IElectronicSignatureMaterialDetailService;
|
||||
import com.mhd.oms.domain.electronicSignature.repository.facade.IElectronicSignatureService;
|
||||
import com.mhd.oms.domain.executionInMaterialDetail.entity.ExecutionInMaterialDetail;
|
||||
import com.mhd.oms.domain.executionInMaterialDetail.repository.facade.IExecutionInMaterialDetailService;
|
||||
import com.mhd.oms.domain.executionStockInOrder.entity.ExecutionStockInOrder;
|
||||
@@ -91,6 +94,10 @@ public class ReservationStockInOrderDomainService {
|
||||
private ExecutionStockInOrderMapper executionStockInOrderMapper;
|
||||
@Autowired
|
||||
private ReserveStockInOrderMapper reserveStockInOrderMapper;
|
||||
@Autowired
|
||||
private IElectronicSignatureService electronicSignatureService;
|
||||
@Autowired
|
||||
private IElectronicSignatureMaterialDetailService electronicSignatureMaterialDetailService;
|
||||
|
||||
/**
|
||||
* 分页查询入库单列表
|
||||
@@ -767,6 +774,161 @@ public class ReservationStockInOrderDomainService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 反审入库业务单(需求:已入库/已出库的单子客户通知需要回退的场景,单子回退到最原始状态):
|
||||
* 页面状态列按 issueStatus(0-已创建 1-进行中 2-已审核 3-已驳回 4-已入库 5-部分完成)展示,
|
||||
* 反审条件按 issueStatus 判断——进行中(1)/已审核(2)/已入库(4)/部分完成(5)可反审,
|
||||
* 已创建(0)无需反审、已驳回(3)可直接编辑;已取消/已关闭(status 6/7)兜底拦截。
|
||||
* 反审动作("审核不通过"同语义 + 全链路回退,补齐 auditState 审核不通过缺失的下游联动):
|
||||
* <ul>
|
||||
* <li>业务单状态改为"已驳回"(issueStatus=3),打已反审标记(REVERSE_AUDIT_STATUS=1)落入【已反审】tab,
|
||||
* 之后可「编辑」→重新「审核」→重新「下发」生成全新执行单</li>
|
||||
* <li>入库执行单+物料明细软删(del_flag=2)并打已反审标记——执行单【已反审】tab按
|
||||
* "已软删+已反审"查询归档数据;软删后不出现在正常tab,避免归档单被误「审核/下发」</li>
|
||||
* <li>清空WMS完成上架跨库回写的完成数据(业务单 IN_QUANTITY/STORAGE_TIME、明细 INBOUND_ITEMS/TOTAL_NET_WEIGHT)</li>
|
||||
* <li>WMS侧逐执行单回退(omsReverseInOrder):W入库单有出库记录则拦截(按入库单号+动作"分配库存/出库"
|
||||
* 查库存调整记录>0)→ 库存还原扣减 → W入库单/W收货单/W上架单整链软删并打已反审标记
|
||||
* (数据划归W入库单/W收货单/W上架单【已反审】tab归档)→
|
||||
* 写1条W入库异常【反审记录】用于记录跟踪</li>
|
||||
* </ul>
|
||||
* 已推送关务(pushStatus=3)直接拦截。WMS回退幂等,反审失败可安全重试。
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean reverseAudit(ReservationStockInOrderDO stockInOrderDO) {
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
// 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底)
|
||||
String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null
|
||||
? loginUser.getUserPo().getUserName()
|
||||
: (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername());
|
||||
|
||||
List<Long> inOrderIds = stockInOrderDO.getInOrderIds();
|
||||
if (inOrderIds == null || inOrderIds.isEmpty()) {
|
||||
throw new ServiceException("未选择反审的入库业务单");
|
||||
}
|
||||
Date now = new Date();
|
||||
for (Long inOrderId : inOrderIds) {
|
||||
ReservationStockInOrder businessOrder = stockInOrderService.getById(inOrderId);
|
||||
if (businessOrder == null
|
||||
|| (businessOrder.getDelFlag() != null && businessOrder.getDelFlag() != 1)) {
|
||||
throw new ServiceException("入库业务单不存在或已被删除,无法反审");
|
||||
}
|
||||
String businessNumber = businessOrder.getInOrderNumber();
|
||||
Integer issueStatus = businessOrder.getIssueStatus();
|
||||
if (issueStatus == null || issueStatus == 0) {
|
||||
throw new ServiceException("入库业务单[" + businessNumber + "]为已创建状态,无需反审");
|
||||
}
|
||||
if (issueStatus == 3) {
|
||||
throw new ServiceException("入库业务单[" + businessNumber + "]已驳回,无需反审,可直接编辑后重新提交审核");
|
||||
}
|
||||
if (issueStatus != 1 && issueStatus != 2 && issueStatus != 4 && issueStatus != 5) {
|
||||
throw new ServiceException("入库业务单[" + businessNumber + "]仅进行中/已审核/已入库状态可反审,当前状态值:" + issueStatus);
|
||||
}
|
||||
if (businessOrder.getStatus() != null && (businessOrder.getStatus() == 6 || businessOrder.getStatus() == 7)) {
|
||||
throw new ServiceException("入库业务单[" + businessNumber + "]已取消/已关闭,无法反审");
|
||||
}
|
||||
if (businessOrder.getPushStatus() != null && businessOrder.getPushStatus() == 3) {
|
||||
throw new ServiceException("入库业务单[" + businessNumber + "]已推送关务/NC,无法反审,请先在关务侧处理");
|
||||
}
|
||||
|
||||
//该业务单下全部有效执行单:逐张调WMS回退后软删并打已反审标记
|
||||
List<ExecutionStockInOrder> executionOrders = executionStockInOrderService.list(
|
||||
new LambdaQueryWrapper<ExecutionStockInOrder>()
|
||||
.eq(ExecutionStockInOrder::getBusinessInOrderNumber, businessNumber)
|
||||
.eq(ExecutionStockInOrder::getDelFlag, 1));
|
||||
for (ExecutionStockInOrder executionOrder : executionOrders) {
|
||||
String executionNumber = executionOrder.getInOrderNumber();
|
||||
if (executionOrder.getPushStatus() != null && executionOrder.getPushStatus() == 3) {
|
||||
throw new ServiceException("执行入库单[" + executionNumber + "]已推送关务/NC,无法反审,请先在关务侧处理");
|
||||
}
|
||||
//WMS侧回退(对称收货/上架完成链路,见 WMS StockInOrderDomainService.reverseExecutionOrder):
|
||||
//有出库/库存已被分配时WMS报错,此处抛错整体回滚;WMS无数据时幂等成功(未下发执行单反审)
|
||||
StockInOrder reverseParam = new StockInOrder();
|
||||
reverseParam.setInOrderNumber(executionNumber);
|
||||
reverseParam.setRemark("业务单号:" + businessNumber
|
||||
+ (StringUtils.isNotEmpty(stockInOrderDO.getReverseAuditRemark())
|
||||
? ",反审原因:" + stockInOrderDO.getReverseAuditRemark() : ""));
|
||||
reverseParam.setUpdateBy(loginUser.getUserid());
|
||||
reverseParam.setUpdateByName(userRealName);
|
||||
AjaxResult reverseResult = wmsServiceFeign.omsReverseInOrder(reverseParam);
|
||||
if (reverseResult == null || !"200".equals(String.valueOf(reverseResult.get("code")))) {
|
||||
throw new ServiceException("反审失败:执行入库单[" + executionNumber + "]WMS回退失败:"
|
||||
+ (reverseResult == null ? "WMS服务不可用或已降级" : reverseResult.get("msg")));
|
||||
}
|
||||
//清理下发自动审核生成的待签名电子签名记录(signatureStatus=1,已签名记录保留作凭证)
|
||||
cancelPendingSignature(executionNumber);
|
||||
//执行单+物料明细软删(del_flag=2)并打已反审标记:
|
||||
//执行单【已反审】tab按"已软删+已反审"(del_flag=2 and REVERSE_AUDIT_STATUS=1)查询归档数据;
|
||||
//软删后不出现在正常tab,避免归档单被误「审核/下发」;业务单重新下发时生成全新执行单
|
||||
executionInMaterialDetailService.update(new UpdateWrapper<ExecutionInMaterialDetail>().lambda()
|
||||
.set(ExecutionInMaterialDetail::getDelFlag, 2)
|
||||
.set(ExecutionInMaterialDetail::getUpdateBy, loginUser.getUserid())
|
||||
.set(ExecutionInMaterialDetail::getUpdateByName, userRealName)
|
||||
.set(ExecutionInMaterialDetail::getUpdateTime, now)
|
||||
.eq(ExecutionInMaterialDetail::getInOrderNumber, executionNumber)
|
||||
.eq(ExecutionInMaterialDetail::getDelFlag, 1));
|
||||
executionStockInOrderService.update(new UpdateWrapper<ExecutionStockInOrder>().lambda()
|
||||
.set(ExecutionStockInOrder::getDelFlag, 2)
|
||||
.set(ExecutionStockInOrder::getReverseAuditStatus, 1)
|
||||
.set(ExecutionStockInOrder::getReverseAuditRemark, stockInOrderDO.getReverseAuditRemark())
|
||||
.set(ExecutionStockInOrder::getReverseAuditBy, loginUser.getUserid())
|
||||
.set(ExecutionStockInOrder::getReverseAuditByName, userRealName)
|
||||
.set(ExecutionStockInOrder::getReverseAuditTime, now)
|
||||
.set(ExecutionStockInOrder::getUpdateBy, loginUser.getUserid())
|
||||
.set(ExecutionStockInOrder::getUpdateByName, userRealName)
|
||||
.set(ExecutionStockInOrder::getUpdateTime, now)
|
||||
.eq(ExecutionStockInOrder::getInOrderId, executionOrder.getInOrderId())
|
||||
.eq(ExecutionStockInOrder::getDelFlag, 1));
|
||||
}
|
||||
|
||||
//清空WMS完成上架跨库回写的业务单明细入库数量(INBOUND_ITEMS/TOTAL_NET_WEIGHT 上架时按上架量覆写过)
|
||||
materialDetailService.update(new UpdateWrapper<ReservationInMaterialDetail>().lambda()
|
||||
.set(ReservationInMaterialDetail::getInboundQuantity, BigDecimal.ZERO)
|
||||
.set(ReservationInMaterialDetail::getTotalNetWeight, BigDecimal.ZERO)
|
||||
.eq(ReservationInMaterialDetail::getInOrderNumber, businessNumber)
|
||||
.eq(ReservationInMaterialDetail::getDelFlag, 1));
|
||||
}
|
||||
|
||||
//业务单状态改为"已驳回"(与审核不通过同语义)+ 已反审标记落入【已反审】tab + 清空完成回写数据
|
||||
return stockInOrderService.update(null, new UpdateWrapper<ReservationStockInOrder>().lambda()
|
||||
.set(ReservationStockInOrder::getIssueStatus, 3)
|
||||
.set(ReservationStockInOrder::getInQuantity, BigDecimal.ZERO)
|
||||
.set(ReservationStockInOrder::getStorageTime, null)
|
||||
.set(ReservationStockInOrder::getExecutionInOrderNumber, null)
|
||||
//反审标记与反审痕迹(【已反审】tab 按 reverseAuditStatus=1 过滤;业务单本身不软删,保持可编辑重新下发)
|
||||
.set(ReservationStockInOrder::getReverseAuditStatus, 1)
|
||||
.set(ReservationStockInOrder::getReverseAuditRemark, stockInOrderDO.getReverseAuditRemark())
|
||||
.set(ReservationStockInOrder::getReverseAuditBy, loginUser.getUserid())
|
||||
.set(ReservationStockInOrder::getReverseAuditByName, userRealName)
|
||||
.set(ReservationStockInOrder::getReverseAuditTime, now)
|
||||
.set(ReservationStockInOrder::getUpdateBy, loginUser.getUserid())
|
||||
.set(ReservationStockInOrder::getUpdateByName, userRealName)
|
||||
.set(ReservationStockInOrder::getUpdateTime, now)
|
||||
.in(ReservationStockInOrder::getInOrderId, inOrderIds));
|
||||
}
|
||||
|
||||
/**
|
||||
* 反审时清理下发自动审核生成的待签名电子签名记录(signatureStatus=1)及其明细,
|
||||
* 已签名记录保留作凭证;清理失败仅记日志不阻断反审主流程(同取消下发)
|
||||
*/
|
||||
private void cancelPendingSignature(String inOrderNumber) {
|
||||
try {
|
||||
List<ElectronicSignature> signatures = electronicSignatureService.list(
|
||||
new LambdaQueryWrapper<ElectronicSignature>()
|
||||
.eq(ElectronicSignature::getOrderNumber, inOrderNumber)
|
||||
.eq(ElectronicSignature::getOrderType, "IN")
|
||||
.eq(ElectronicSignature::getSignatureStatus, 1)
|
||||
.eq(ElectronicSignature::getDelFlag, 1));
|
||||
for (ElectronicSignature signature : signatures) {
|
||||
electronicSignatureMaterialDetailService.deleteBySignatureId(signature.getSignatureId());
|
||||
electronicSignatureService.update(new UpdateWrapper<ElectronicSignature>().lambda()
|
||||
.set(ElectronicSignature::getDelFlag, 2)
|
||||
.eq(ElectronicSignature::getSignatureId, signature.getSignatureId()));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("反审清理电子签名记录失败,入库单号:{}", inOrderNumber, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean executeAndIssue(ReservationStockInOrderDO stockInOrderDO) {
|
||||
// 防重复执行校验(与 issueOrder 的防重逻辑对齐):issueTime 有值表示已下发/执行过。
|
||||
|
||||
+10
@@ -93,6 +93,16 @@ public class ExecutionStockInOrderApi extends BaseController {
|
||||
return AjaxResult.success(stockInOrderApplicationService.getInfo(inOrderId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询入库执行单【已反审】tab 归档详情(已软删+已反审标记的数据,含软删明细)
|
||||
*/
|
||||
@ApiOperation("查询入库执行单已反审归档详情")
|
||||
@GetMapping(value = "/getReverseAuditInfo/{inOrderId}")
|
||||
public AjaxResult getReverseAuditInfo(@PathVariable("inOrderId") Long inOrderId)
|
||||
{
|
||||
return AjaxResult.success(stockInOrderApplicationService.getReverseAuditInfo(inOrderId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入入库单
|
||||
*/
|
||||
|
||||
+13
@@ -122,6 +122,19 @@ public class ReservationStockInOrderApi extends BaseController {
|
||||
return AjaxResult.success(stockInOrderApplicationService.auditState(stockInOrderDO));
|
||||
}
|
||||
|
||||
/**
|
||||
* 反审入库业务单:已入库/已出库的单子客户通知需要回退的场景,单子回退到最原始状态——
|
||||
* 业务单状态改为"已驳回"(issueStatus=3,与审核不通过同语义,可编辑→重新审核→重新下发)
|
||||
* 并打已反审标记落入【已反审】tab;入库执行单+明细软删并打已反审标记;
|
||||
* W入库单有出库记录时WMS侧拦截不允许反审;已推送关务(pushStatus=3)直接拦截
|
||||
*/
|
||||
@ApiOperation("反审入库业务单")
|
||||
@PostMapping(value = "/reverseAudit")
|
||||
public AjaxResult reverseAudit(@RequestBody ReservationStockInOrderDTO stockInOrderDTO) {
|
||||
ReservationStockInOrderDO stockInOrderDO = stockInOrderAssembler.toDO(stockInOrderDTO);
|
||||
return AjaxResult.success(stockInOrderApplicationService.reverseAudit(stockInOrderDO));
|
||||
}
|
||||
|
||||
/**
|
||||
* 下发入库单
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user