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:
+26
-1
@@ -667,7 +667,16 @@ public class StockInOrderApplicationService {
|
||||
*/
|
||||
public StockInOrderPO getInfo(Long inOrderId)
|
||||
{
|
||||
StockInOrderPO info = stockInOrderDomainService.getInfo(inOrderId);
|
||||
return getInfo(inOrderId, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取入库单详情
|
||||
* @param archive true-查询【已反审】tab 归档数据(已软删+已反审标记,明细放行软删行)
|
||||
*/
|
||||
public StockInOrderPO getInfo(Long inOrderId, boolean archive)
|
||||
{
|
||||
StockInOrderPO info = stockInOrderDomainService.getInfo(inOrderId, archive);
|
||||
String userNcCode = stockOutOrderMapper.getUserNcCode(info.getShipperId());
|
||||
info.setKhdm(userNcCode);
|
||||
List<InMaterialDetailPO> materialDetailList = info.getMaterialDetailList();
|
||||
@@ -762,6 +771,14 @@ public class StockInOrderApplicationService {
|
||||
return info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询入库单【已反审】tab 归档详情(已软删+已反审标记的数据,含软删明细/收货单/上架单)
|
||||
*/
|
||||
public StockInOrderPO getReverseAuditInfo(Long inOrderId)
|
||||
{
|
||||
return getInfo(inOrderId, true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
@@ -955,6 +972,14 @@ public class StockInOrderApplicationService {
|
||||
stockInOrderDomainService.cancelExecutionOrder(stockInOrder);
|
||||
}
|
||||
|
||||
/**
|
||||
* OMS入库业务单反审:WMS侧回退已完成单据(出库拦截 -> 回退库存 ->
|
||||
* 逻辑删除收货/上架链路 -> 写入库异常【反审记录】),已产生出库则报错拦截
|
||||
*/
|
||||
public void omsReverseInOrder(StockInOrder stockInOrder){
|
||||
stockInOrderDomainService.reverseExecutionOrder(stockInOrder);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 取消入库单
|
||||
* @author ZhouGY
|
||||
|
||||
+4
-4
@@ -53,8 +53,8 @@ public class InOrderAbnormal extends BaseVOEntity {
|
||||
@Excel(name = "上架单号")
|
||||
private String shelfOrderNumber;
|
||||
|
||||
@ApiModelProperty("类型:1-收货 2-上架")
|
||||
@Excel(name = "类型:1-收货 2-上架")
|
||||
@ApiModelProperty("类型:1-收货 2-上架 3-反审")
|
||||
@Excel(name = "类型:1-收货 2-上架 3-反审")
|
||||
private Integer type;
|
||||
|
||||
@ApiModelProperty("计划数量")
|
||||
@@ -73,8 +73,8 @@ public class InOrderAbnormal extends BaseVOEntity {
|
||||
@Excel(name = "异常数量")
|
||||
private BigDecimal abnormalActualQuantity;
|
||||
|
||||
@ApiModelProperty("异常类型: 1-上架异常 2-收货异常 3-收货异常(允许超收没超出超收比例) 4-收货异常(不允许超收)5-收货异常(允许超收但超出超收比例)")
|
||||
@Excel(name = "异常类型: 1-上架异常 2-收货异常 3-收货异常", readConverterExp = "允=许超收但不允许超出超收比例")
|
||||
@ApiModelProperty("异常类型: 1-上架异常 2-收货异常 3-收货异常(允许超收没超出超收比例) 4-收货异常(不允许超收)5-收货异常(允许超收但超出超收比例) 6-反审记录")
|
||||
@Excel(name = "异常类型: 1-上架异常 2-收货异常 6-反审记录", readConverterExp = "允=许超收但不允许超出超收比例")
|
||||
private Integer abnormalType;
|
||||
|
||||
@ApiModelProperty("异常原因")
|
||||
|
||||
+7
@@ -51,4 +51,11 @@ public interface IInOrderAbnormalService extends IService<InOrderAbnormal>
|
||||
* @return Boolean
|
||||
*/
|
||||
Boolean genInOrderAbnormal(InOrderAbnormalBaseDO inOrderAbnormalBaseDO, Integer type);
|
||||
|
||||
/**
|
||||
* 生成入库异常【反审记录】(入库业务单反审时调用,用于记录跟踪)
|
||||
* 单号自动生成(FSYC 前缀,与出库反审记录一致),固定 type=3(反审)、abnormalType=6(反审记录),
|
||||
* 其余字段(inOrderNumber/abnormalReason/quantity/remark/createBy 等)由调用方填充
|
||||
*/
|
||||
Boolean genReverseAuditAbnormal(InOrderAbnormal inOrderAbnormal);
|
||||
}
|
||||
|
||||
+19
@@ -174,6 +174,25 @@ public class InOrderAbnormalImpl extends ServiceImpl<InOrderAbnormalMapper, InOr
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成入库异常【反审记录】(入库业务单反审时调用,用于记录跟踪)
|
||||
* 与出库反审记录共用 FSYC 单号前缀;type=3(反审)、abnormalType=6(反审记录)
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean genReverseAuditAbnormal(InOrderAbnormal inOrderAbnormal) {
|
||||
if (inOrderAbnormal == null || !StringUtils.hasText(inOrderAbnormal.getInOrderNumber())) {
|
||||
throw new ServiceException("生成反审记录失败:入库单号为空");
|
||||
}
|
||||
inOrderAbnormal.setAbnormalNumber(OrderSequence.getOrderCode("FSYC"));
|
||||
inOrderAbnormal.setType(3);
|
||||
inOrderAbnormal.setAbnormalType(6);
|
||||
if (inOrderAbnormal.getCreateTime() == null) {
|
||||
inOrderAbnormal.setCreateTime(new Date());
|
||||
}
|
||||
return this.save(inOrderAbnormal);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 收货数量与计划数量不符,完成收货会生成收货异常记录
|
||||
* @author ZhouGY
|
||||
|
||||
@@ -410,4 +410,21 @@ public class StockInOrder extends BaseVOEntity {
|
||||
|
||||
@ApiModelProperty("签名备注")
|
||||
private String signatureRemark;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)")
|
||||
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
@@ -477,4 +477,21 @@ public class StockInOrderPO extends BaseVOEntity {
|
||||
|
||||
@ApiModelProperty("签名备注")
|
||||
private String signatureRemark;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)")
|
||||
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
@@ -470,6 +470,23 @@ public class StockInOrderDO extends BaseVOEntity {
|
||||
@ApiModelProperty("签名备注")
|
||||
private String signatureRemark;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)")
|
||||
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;
|
||||
|
||||
/**
|
||||
* PDA入库签名列表专用:作业任务人员模糊查询字段(与 workUserName LIKE 同义,
|
||||
* 单独提供是为了避免和现有 workUserName(精确/等值)逻辑冲突)。
|
||||
|
||||
+342
-4
@@ -30,10 +30,20 @@ import com.mhd.wms.domain.inMaterialDetail.repository.facade.IInMaterialDetailSe
|
||||
import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO;
|
||||
import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailBaseDO;
|
||||
import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO;
|
||||
import com.mhd.wms.domain.inOrderAbnormal.entity.InOrderAbnormal;
|
||||
import com.mhd.wms.domain.inOrderAbnormal.repository.facade.IInOrderAbnormalService;
|
||||
import com.mhd.wms.domain.inventoryAdjustmentRecord.entity.InventoryAdjustmentRecord;
|
||||
import com.mhd.wms.domain.inventoryAdjustmentRecord.repository.facade.IInventoryAdjustmentRecordService;
|
||||
import com.mhd.wms.domain.inventoryStandingDetail.entity.InventoryStandingDetail;
|
||||
import com.mhd.wms.domain.inventoryStandingDetail.repository.facade.IInventoryStandingDetailService;
|
||||
import com.mhd.wms.domain.materialBaseInfo.repository.facade.IMaterialBaseInfoService;
|
||||
import com.mhd.wms.domain.materialBaseInfo.repository.po.MaterialBaseInfoPO;
|
||||
import com.mhd.wms.domain.materialGoodsRule.repository.facade.IMaterialGoodsRuleService;
|
||||
import com.mhd.wms.domain.materialGoodsRule.repository.po.MaterialGoodsRulePO;
|
||||
import com.mhd.wms.domain.materialInventory.entity.MaterialInventory;
|
||||
import com.mhd.wms.domain.materialInventory.repository.facade.IMaterialInventoryService;
|
||||
import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryDO;
|
||||
import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryParentDO;
|
||||
import com.mhd.wms.domain.materialWarehouseControl.repository.facade.IMaterialWarehouseControlService;
|
||||
import com.mhd.wms.domain.materialWarehouseControl.repository.po.MaterialWarehouseControlPO;
|
||||
import com.mhd.wms.domain.qualityInspection.repository.facade.IQualityInspectionService;
|
||||
@@ -53,6 +63,10 @@ import com.mhd.wms.domain.stockInOrder.repository.po.StockInOrderPO;
|
||||
import com.mhd.wms.domain.stockInOrder.repository.todo.StockInOrderDO;
|
||||
import com.mhd.wms.domain.stockInTaskOrder.entity.StockInTaskOrder;
|
||||
import com.mhd.wms.domain.stockInTaskOrder.repository.facade.IStockInTaskOrderService;
|
||||
import com.mhd.wms.domain.taskShelfMaterialDetail.entity.TaskShelfMaterialDetail;
|
||||
import com.mhd.wms.domain.taskShelfMaterialDetail.repository.facade.ITaskShelfMaterialDetailService;
|
||||
import com.mhd.wms.domain.taskShelfMaterialDetail.entity.TaskShelfMaterialDetail;
|
||||
import com.mhd.wms.domain.taskShelfMaterialDetail.repository.facade.ITaskShelfMaterialDetailService;
|
||||
import com.mhd.wms.domain.stockReceiptOrder.entity.StockReceiptOrder;
|
||||
import com.mhd.wms.domain.stockReceiptOrder.repository.facade.IStockReceiptOrderService;
|
||||
import com.mhd.wms.domain.stockReceiptOrder.repository.po.StockReceiptOrderPO;
|
||||
@@ -127,6 +141,16 @@ public class StockInOrderDomainService {
|
||||
@Autowired
|
||||
private ITaskReceiptMaterialDetailService taskReceiptMaterialDetailService;
|
||||
@Autowired
|
||||
private ITaskShelfMaterialDetailService taskShelfMaterialDetailService;
|
||||
@Autowired
|
||||
private IInventoryAdjustmentRecordService inventoryAdjustmentRecordService;
|
||||
@Autowired
|
||||
private IInventoryStandingDetailService inventoryStandingDetailService;
|
||||
@Autowired
|
||||
private IMaterialInventoryService materialInventoryService;
|
||||
@Autowired
|
||||
private IInOrderAbnormalService inOrderAbnormalService;
|
||||
@Autowired
|
||||
private IdGenerator idGenerator;
|
||||
|
||||
/**
|
||||
@@ -521,23 +545,46 @@ public class StockInOrderDomainService {
|
||||
* 获取入库单详细信息
|
||||
*/
|
||||
public StockInOrderPO getInfo(Long inOrderId)
|
||||
{
|
||||
return getInfo(inOrderId, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取入库单详情
|
||||
* @param archive true-查询【已反审】tab 归档数据(主单须为已软删+已反审标记,收货/上架单及明细放行软删行)
|
||||
*/
|
||||
public StockInOrderPO getInfo(Long inOrderId, boolean archive)
|
||||
{
|
||||
StockInOrderPO stockInOrderPO = stockInOrderService.getInfo(inOrderId);
|
||||
if (archive && (stockInOrderPO.getDelFlag() == null || stockInOrderPO.getDelFlag() != 2
|
||||
|| !Integer.valueOf(1).equals(stockInOrderPO.getReverseAuditStatus()))) {
|
||||
throw new ServiceException("入库单非已反审归档数据,无法查看归档详情");
|
||||
}
|
||||
InMaterialDetailDO inMaterialDetailDO = new InMaterialDetailDO();
|
||||
inMaterialDetailDO.setInOrderNumber(stockInOrderPO.getInOrderNumber());
|
||||
inMaterialDetailDO.setLevel(1);
|
||||
if (archive) {
|
||||
//归档明细已随主单软删,放行软删行
|
||||
inMaterialDetailDO.setDelFlag(2);
|
||||
}
|
||||
List<InMaterialDetailPO> inMaterialDetailPOList = materialDetailService.queryList(inMaterialDetailDO);
|
||||
|
||||
|
||||
// 先通过入库单号查询收货单列表
|
||||
StockReceiptOrderDO stockReceiptOrderDO = new StockReceiptOrderDO();
|
||||
stockReceiptOrderDO.setInOrderNumber(stockInOrderPO.getInOrderNumber());
|
||||
if (archive) {
|
||||
stockReceiptOrderDO.setDelFlag(2);
|
||||
}
|
||||
List<StockReceiptOrderPO> stockReceiptOrderPOList = stockReceiptOrderDomainService.queryList(stockReceiptOrderDO);
|
||||
|
||||
|
||||
// 先通过入库单号查询上架单列表
|
||||
StockShelfOrderDO stockShelfOrderDO = new StockShelfOrderDO();
|
||||
stockShelfOrderDO.setInOrderNumber(stockInOrderPO.getInOrderNumber());
|
||||
if (archive) {
|
||||
stockShelfOrderDO.setDelFlag(2);
|
||||
}
|
||||
List<StockShelfOrderPO> stockShelfOrderPOList = stockShelfOrderDomainService.queryList(stockShelfOrderDO);
|
||||
|
||||
|
||||
// 查询收货单明细,用于填充收货数量和更新毛重、净重、面积、体积
|
||||
List<ReceiptMaterialDetailPO> receiptMaterialDetailPOList = new ArrayList<>();
|
||||
if (!CollectionUtils.isEmpty(stockReceiptOrderPOList)) {
|
||||
@@ -548,10 +595,13 @@ public class StockInOrderDomainService {
|
||||
if (!CollectionUtils.isEmpty(receiptOrderNumberList)) {
|
||||
ReceiptMaterialDetailDO receiptMaterialDetailDO = new ReceiptMaterialDetailDO();
|
||||
receiptMaterialDetailDO.setReceiptOrderNumberList(receiptOrderNumberList);
|
||||
if (archive) {
|
||||
receiptMaterialDetailDO.setDelFlag(2);
|
||||
}
|
||||
receiptMaterialDetailPOList = receiptMaterialDetailService.queryList(receiptMaterialDetailDO);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 查询上架单明细,用于填充上架数量
|
||||
List<ShelfMaterialDetailPO> shelfMaterialDetailPOList = new ArrayList<>();
|
||||
if (!CollectionUtils.isEmpty(stockShelfOrderPOList)) {
|
||||
@@ -559,6 +609,9 @@ public class StockInOrderDomainService {
|
||||
if (StringUtils.isNotBlank(stockShelfOrderPO.getShelfOrderNumber())) {
|
||||
ShelfMaterialDetailDO shelfMaterialDetailDO = new ShelfMaterialDetailDO();
|
||||
shelfMaterialDetailDO.setShelfOrderNumber(stockShelfOrderPO.getShelfOrderNumber());
|
||||
if (archive) {
|
||||
shelfMaterialDetailDO.setDelFlag(2);
|
||||
}
|
||||
List<ShelfMaterialDetailPO> shelfDetails = shelfMaterialDetailService.queryList(shelfMaterialDetailDO);
|
||||
if (!CollectionUtils.isEmpty(shelfDetails)) {
|
||||
shelfMaterialDetailPOList.addAll(shelfDetails);
|
||||
@@ -844,6 +897,291 @@ public class StockInOrderDomainService {
|
||||
.eq(StockInOrder::getDelFlag, 1));
|
||||
}
|
||||
|
||||
/**
|
||||
* OMS入库业务单反审:WMS侧一个事务内把已完成单据回退到最原始状态(供 Feign /stockInOrderApi/omsReverseInOrder 调用)。
|
||||
*
|
||||
* <p>与 {@link #cancelExecutionOrder(StockInOrder)}(取消下发,仅限未开始收货)不同,本方法处理
|
||||
* 已开始收货/上架/已入库(status>=3)的单据,回退动作与"完成收货/完成上架"链路对称:</p>
|
||||
* <ul>
|
||||
* <li>出库拦截:按"入库单号+动作(分配库存/出库)"查库存调整记录>0 即有出库记录;另校验库存冻结量
|
||||
* (入库单有出库就不能反审)</li>
|
||||
* <li>回退库存:按本单库存行整行扣回(上架时 inventory_quantity 与 allocation_quantity 同量增加、
|
||||
* 重量体积一并累加,此处对称扣回,复用统一扣减服务 GREATEST(x-n,0) 兜底);
|
||||
* 扣减前校验"库存行合计=已上架完成量",不一致说明发生过库存合并/人工调整,拦截人工核实</li>
|
||||
* <li>W入库单/W收货单/W上架单整链软删(del_flag=2)并打已反审标记(REVERSE_AUDIT_STATUS=1),
|
||||
* 各页面【已反审】tab按"已软删+已反审"(del_flag=2 and reverse_audit_status=1)查询归档数据;
|
||||
* 物料明细/作业单/任务/质检单一并软删留痕,台账节点物理删除保持与回退后库存一致</li>
|
||||
* <li>写1条入库异常【反审记录】(in_order_abnormal type=3/abnormalType=6) 用于记录跟踪</li>
|
||||
* </ul>
|
||||
* <p>WMS无该单数据时幂等返回成功(OMS未下发单反审不产生WMS数据);任何校验失败抛错经
|
||||
* Feign 返回,OMS侧整体回滚。反审可重试,本方法幂等。</p>
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void reverseExecutionOrder(StockInOrder stockInOrder) {
|
||||
String inOrderNumber = stockInOrder.getInOrderNumber();
|
||||
if (StringUtils.isEmpty(inOrderNumber)) {
|
||||
throw new ServiceException("反审失败:入库单号为空");
|
||||
}
|
||||
//反审原因/反审人由OMS经Feign传入(不依赖Feign链路的登录上下文)
|
||||
String reverseReason = stockInOrder.getRemark();
|
||||
String reverseByName = stockInOrder.getUpdateByName();
|
||||
|
||||
List<StockInOrder> stockInOrders = stockInOrderService.list(new LambdaQueryWrapper<StockInOrder>()
|
||||
.eq(StockInOrder::getInOrderNumber, inOrderNumber)
|
||||
.eq(StockInOrder::getDelFlag, 1));
|
||||
if (CollectionUtils.isEmpty(stockInOrders)) {
|
||||
//幂等:WMS无该单数据(未下发单反审或已反审过),直接成功,保证OMS反审可重试
|
||||
return;
|
||||
}
|
||||
StockInOrder wmsOrder = stockInOrders.get(0);
|
||||
|
||||
// ========== 1. 出库拦截:入库单有出库就不能反审 ==========
|
||||
//按"入库单号+动作(分配库存/出库)"查询库存调整记录:出库分配/交接出库时都会写入调整记录,
|
||||
//>0 即证明该入库单的库存已发生出库流转;取消分配时调整记录随之软删,不会误拦
|
||||
List<InventoryAdjustmentRecord> outboundRecords = inventoryAdjustmentRecordService.list(
|
||||
new LambdaQueryWrapper<InventoryAdjustmentRecord>()
|
||||
.eq(InventoryAdjustmentRecord::getInOrderNumber, inOrderNumber)
|
||||
.in(InventoryAdjustmentRecord::getAdjustAction, "分配库存", "出库")
|
||||
.eq(InventoryAdjustmentRecord::getDelFlag, 1));
|
||||
if (!CollectionUtils.isEmpty(outboundRecords)) {
|
||||
throw new ServiceException("入库单[" + inOrderNumber + "]已产生出库记录,无法反审");
|
||||
}
|
||||
//本单库存行(反审要扣回的库存)
|
||||
List<MaterialInventory> inventoryRows = materialInventoryService.list(new LambdaQueryWrapper<MaterialInventory>()
|
||||
.eq(MaterialInventory::getInOrderNumber, inOrderNumber));
|
||||
for (MaterialInventory row : inventoryRows) {
|
||||
if (row.getFreezeQuantity() != null && row.getFreezeQuantity().compareTo(BigDecimal.ZERO) > 0) {
|
||||
throw new ServiceException("入库单[" + inOrderNumber + "]库存已被出库分配,无法反审");
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 2. 回退库存(对称"完成上架"写入) ==========
|
||||
List<StockShelfOrder> shelfOrders = stockShelfOrderService.list(new LambdaQueryWrapper<StockShelfOrder>()
|
||||
.eq(StockShelfOrder::getInOrderNumber, inOrderNumber)
|
||||
.eq(StockShelfOrder::getDelFlag, 1));
|
||||
List<String> shelfOrderNumbers = shelfOrders.stream()
|
||||
.map(StockShelfOrder::getShelfOrderNumber)
|
||||
.filter(StringUtils::isNotEmpty)
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
BigDecimal inventoryTotal = inventoryRows.stream()
|
||||
.map(row -> row.getInventoryQuantity() == null ? BigDecimal.ZERO : row.getInventoryQuantity())
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
if (inventoryTotal.compareTo(BigDecimal.ZERO) > 0) {
|
||||
//扣减前校验:库存行合计必须等于"已完成上架单"的上架量,否则整行扣回会误伤合并进来的其他来源库存。
|
||||
//只统计已完成(status=3)的上架单——库存只在完成上架时写入,上架中未完成的单不产生库存
|
||||
BigDecimal shelfDoneTotal = BigDecimal.ZERO;
|
||||
List<String> doneShelfOrderNumbers = shelfOrders.stream()
|
||||
.filter(shelfOrder -> shelfOrder.getStatus() != null && shelfOrder.getStatus() == 3)
|
||||
.map(StockShelfOrder::getShelfOrderNumber)
|
||||
.filter(StringUtils::isNotEmpty)
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
if (!doneShelfOrderNumbers.isEmpty()) {
|
||||
List<ShelfMaterialDetail> shelfDetails = shelfMaterialDetailService.list(new LambdaQueryWrapper<ShelfMaterialDetail>()
|
||||
.in(ShelfMaterialDetail::getShelfOrderNumber, doneShelfOrderNumbers)
|
||||
.eq(ShelfMaterialDetail::getDelFlag, 1));
|
||||
for (ShelfMaterialDetail shelfDetail : shelfDetails) {
|
||||
BigDecimal shelved = shelfDetail.getAlreadyShelvesQuantity() != null
|
||||
? shelfDetail.getAlreadyShelvesQuantity()
|
||||
: (shelfDetail.getShelvesQuantity() != null ? shelfDetail.getShelvesQuantity() : BigDecimal.ZERO);
|
||||
shelfDoneTotal = shelfDoneTotal.add(shelved);
|
||||
}
|
||||
}
|
||||
if (shelfDoneTotal.compareTo(BigDecimal.ZERO) <= 0 || inventoryTotal.compareTo(shelfDoneTotal) != 0) {
|
||||
throw new ServiceException("入库单[" + inOrderNumber + "]库存(" + inventoryTotal.stripTrailingZeros().toPlainString()
|
||||
+ ")与上架完成量(" + shelfDoneTotal.stripTrailingZeros().toPlainString()
|
||||
+ ")不一致,可能已发生出库或库存合并,请人工核实后再反审");
|
||||
}
|
||||
List<MaterialInventoryDO> subtractList = new ArrayList<>();
|
||||
for (MaterialInventory row : inventoryRows) {
|
||||
if (row.getInventoryQuantity() == null || row.getInventoryQuantity().compareTo(BigDecimal.ZERO) <= 0) {
|
||||
continue;
|
||||
}
|
||||
MaterialInventoryDO subtractDO = new MaterialInventoryDO();
|
||||
subtractDO.setMaterialInventoryId(row.getMaterialInventoryId());
|
||||
subtractDO.setInventoryQuantity(row.getInventoryQuantity());
|
||||
//SQL按 GREATEST(x-#{item.n},0) 扣减,DM/Oracle下 GREATEST 遇 null 返回 null,数值字段一律兜底0
|
||||
subtractDO.setNetWeight(row.getNetWeight() == null ? BigDecimal.ZERO : row.getNetWeight());
|
||||
subtractDO.setGrossWeight(row.getGrossWeight() == null ? BigDecimal.ZERO : row.getGrossWeight());
|
||||
subtractDO.setVolume(row.getVolume() == null ? BigDecimal.ZERO : row.getVolume());
|
||||
subtractDO.setArea(row.getArea() == null ? BigDecimal.ZERO : row.getArea());
|
||||
subtractList.add(subtractDO);
|
||||
}
|
||||
if (!CollectionUtils.isEmpty(subtractList)) {
|
||||
//直接走统一批量扣减(GREATEST(x-n,0)兜底)并显式传更新人:不经 updateMaterialInventoryInfo,
|
||||
//其内部 subtractMaterialInventory 取 SecurityUtils 登录上下文,OMS经Feign调用时可能无登录态(会抛异常)
|
||||
MaterialInventoryParentDO subtractParent = new MaterialInventoryParentDO();
|
||||
subtractParent.setMaterialInventoryDOList(subtractList);
|
||||
subtractParent.setUpdateBy(stockInOrder.getUpdateBy() == null ? 0L : stockInOrder.getUpdateBy());
|
||||
subtractParent.setUpdateByName(StringUtils.isEmpty(reverseByName) ? "system" : reverseByName);
|
||||
subtractParent.setUpdateTime(new Date());
|
||||
materialInventoryService.batchSubtractInventoryQuantity(subtractParent);
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 3. 软删下游全链 + W入库单/W收货单/W上架单打"已反审"标记 ==========
|
||||
//三单软删(del_flag=2)并打已反审标记(REVERSE_AUDIT_STATUS=1),各页面【已反审】tab按
|
||||
//"已软删+已反审"(del_flag=2 and reverse_audit_status=1)查询归档数据;
|
||||
//物料明细/收货上架作业单/任务/质检单/台账一并软删留痕,重新下发时生成全新数据
|
||||
String reverseRemarkForWms = StringUtils.isEmpty(reverseReason) ? "入库单反审" : "入库单反审:" + reverseReason;
|
||||
Long reverseAuditUserId = stockInOrder.getUpdateBy() == null ? 0L : stockInOrder.getUpdateBy();
|
||||
String reverseAuditUserName = StringUtils.isEmpty(reverseByName) ? "system" : reverseByName;
|
||||
Date reverseAuditDate = new Date();
|
||||
//收货单(含历史重复下发产生的多张同号收货单,全部查出统一清理,避免按单号取一条漏删/报错)
|
||||
List<StockReceiptOrder> receiptOrders = stockReceiptOrderService.list(new LambdaQueryWrapper<StockReceiptOrder>()
|
||||
.eq(StockReceiptOrder::getInOrderNumber, inOrderNumber)
|
||||
.eq(StockReceiptOrder::getDelFlag, 1));
|
||||
List<String> receiptOrderNumbers = receiptOrders.stream()
|
||||
.map(StockReceiptOrder::getReceiptOrderNumber)
|
||||
.filter(StringUtils::isNotEmpty)
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
//收货/上架作业单(type=1收货 type=2上架;上架作业单兜底按上架单号再查一道防 in_order_number 为空)
|
||||
//上架单复用第2节已查出的 shelfOrders/shelfOrderNumbers
|
||||
List<StockInTaskOrder> taskOrders = stockInTaskOrderService.list(new LambdaQueryWrapper<StockInTaskOrder>()
|
||||
.eq(StockInTaskOrder::getInOrderNumber, inOrderNumber)
|
||||
.eq(StockInTaskOrder::getDelFlag, 1));
|
||||
if (!shelfOrderNumbers.isEmpty()) {
|
||||
Set<String> existTaskNumbers = taskOrders.stream()
|
||||
.map(StockInTaskOrder::getTaskNumber)
|
||||
.collect(Collectors.toSet());
|
||||
List<StockInTaskOrder> shelfTaskOrders = stockInTaskOrderService.list(new LambdaQueryWrapper<StockInTaskOrder>()
|
||||
.in(StockInTaskOrder::getShelfOrderNumber, shelfOrderNumbers)
|
||||
.eq(StockInTaskOrder::getDelFlag, 1));
|
||||
for (StockInTaskOrder shelfTaskOrder : shelfTaskOrders) {
|
||||
if (shelfTaskOrder.getTaskNumber() != null && !existTaskNumbers.contains(shelfTaskOrder.getTaskNumber())) {
|
||||
taskOrders.add(shelfTaskOrder);
|
||||
}
|
||||
}
|
||||
}
|
||||
List<String> taskNumbers = taskOrders.stream()
|
||||
.map(StockInTaskOrder::getTaskNumber)
|
||||
.filter(StringUtils::isNotEmpty)
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
//1.收货/上架作业单明细
|
||||
if (!taskNumbers.isEmpty()) {
|
||||
taskReceiptMaterialDetailService.update(new UpdateWrapper<TaskReceiptMaterialDetail>().lambda()
|
||||
.set(TaskReceiptMaterialDetail::getDelFlag, 2)
|
||||
.in(TaskReceiptMaterialDetail::getTaskNumber, taskNumbers)
|
||||
.eq(TaskReceiptMaterialDetail::getDelFlag, 1));
|
||||
taskShelfMaterialDetailService.update(new UpdateWrapper<TaskShelfMaterialDetail>().lambda()
|
||||
.set(TaskShelfMaterialDetail::getDelFlag, 2)
|
||||
.in(TaskShelfMaterialDetail::getTaskNumber, taskNumbers)
|
||||
.eq(TaskShelfMaterialDetail::getDelFlag, 1));
|
||||
}
|
||||
//2.收货/上架作业单
|
||||
if (!taskNumbers.isEmpty()) {
|
||||
stockInTaskOrderService.update(new UpdateWrapper<StockInTaskOrder>().lambda()
|
||||
.set(StockInTaskOrder::getDelFlag, 2)
|
||||
.eq(StockInTaskOrder::getInOrderNumber, inOrderNumber)
|
||||
.eq(StockInTaskOrder::getDelFlag, 1));
|
||||
if (!shelfOrderNumbers.isEmpty()) {
|
||||
stockInTaskOrderService.update(new UpdateWrapper<StockInTaskOrder>().lambda()
|
||||
.set(StockInTaskOrder::getDelFlag, 2)
|
||||
.in(StockInTaskOrder::getShelfOrderNumber, shelfOrderNumbers)
|
||||
.eq(StockInTaskOrder::getDelFlag, 1));
|
||||
}
|
||||
}
|
||||
//3.收货/上架任务(tracking_number=收货/上架单号;补"RV-"+入库单号兜底历史同号收货单)
|
||||
if (!receiptOrderNumbers.isEmpty() || !shelfOrderNumbers.isEmpty()) {
|
||||
Set<String> trackingNumbers = new HashSet<>(receiptOrderNumbers);
|
||||
trackingNumbers.addAll(shelfOrderNumbers);
|
||||
trackingNumbers.add("RV-" + inOrderNumber);
|
||||
deliveTaskService.update(new UpdateWrapper<DeliveTask>().lambda()
|
||||
.set(DeliveTask::getDelFlag, 2)
|
||||
.in(DeliveTask::getTrackingNumber, trackingNumbers)
|
||||
.in(DeliveTask::getTaskType, 1, 2)
|
||||
.eq(DeliveTask::getDelFlag, 1));
|
||||
}
|
||||
//4.质检单
|
||||
qualityInspectionService.update(new UpdateWrapper<com.mhd.wms.domain.qualityInspection.entity.QualityInspection>().lambda()
|
||||
.set(com.mhd.wms.domain.qualityInspection.entity.QualityInspection::getDelFlag, 2)
|
||||
.eq(com.mhd.wms.domain.qualityInspection.entity.QualityInspection::getInOrderNumber, inOrderNumber)
|
||||
.eq(com.mhd.wms.domain.qualityInspection.entity.QualityInspection::getDelFlag, 1));
|
||||
//5.收货单明细
|
||||
if (!receiptOrderNumbers.isEmpty()) {
|
||||
receiptMaterialDetailService.update(new UpdateWrapper<ReceiptMaterialDetail>().lambda()
|
||||
.set(ReceiptMaterialDetail::getDelFlag, 2)
|
||||
.in(ReceiptMaterialDetail::getReceiptOrderNumber, receiptOrderNumbers)
|
||||
.eq(ReceiptMaterialDetail::getDelFlag, 1));
|
||||
}
|
||||
//6.收货单(软删+打已反审标记,收货单【已反审】tab 可查归档数据)
|
||||
stockReceiptOrderService.update(new UpdateWrapper<StockReceiptOrder>().lambda()
|
||||
.set(StockReceiptOrder::getDelFlag, 2)
|
||||
.set(StockReceiptOrder::getReverseAuditStatus, 1)
|
||||
.set(StockReceiptOrder::getReverseAuditRemark, reverseRemarkForWms)
|
||||
.set(StockReceiptOrder::getReverseAuditBy, reverseAuditUserId)
|
||||
.set(StockReceiptOrder::getReverseAuditByName, reverseAuditUserName)
|
||||
.set(StockReceiptOrder::getReverseAuditTime, reverseAuditDate)
|
||||
.set(StockReceiptOrder::getUpdateBy, reverseAuditUserId)
|
||||
.set(StockReceiptOrder::getUpdateByName, reverseAuditUserName)
|
||||
.set(StockReceiptOrder::getUpdateTime, reverseAuditDate)
|
||||
.eq(StockReceiptOrder::getInOrderNumber, inOrderNumber)
|
||||
.eq(StockReceiptOrder::getDelFlag, 1));
|
||||
//7.上架单明细
|
||||
if (!shelfOrderNumbers.isEmpty()) {
|
||||
shelfMaterialDetailService.update(new UpdateWrapper<ShelfMaterialDetail>().lambda()
|
||||
.set(ShelfMaterialDetail::getDelFlag, 2)
|
||||
.in(ShelfMaterialDetail::getShelfOrderNumber, shelfOrderNumbers)
|
||||
.eq(ShelfMaterialDetail::getDelFlag, 1));
|
||||
}
|
||||
//8.上架单(软删+打已反审标记,上架单【已反审】tab 可查归档数据)
|
||||
stockShelfOrderService.update(new UpdateWrapper<StockShelfOrder>().lambda()
|
||||
.set(StockShelfOrder::getDelFlag, 2)
|
||||
.set(StockShelfOrder::getReverseAuditStatus, 1)
|
||||
.set(StockShelfOrder::getReverseAuditRemark, reverseRemarkForWms)
|
||||
.set(StockShelfOrder::getReverseAuditBy, reverseAuditUserId)
|
||||
.set(StockShelfOrder::getReverseAuditByName, reverseAuditUserName)
|
||||
.set(StockShelfOrder::getReverseAuditTime, reverseAuditDate)
|
||||
.set(StockShelfOrder::getUpdateBy, reverseAuditUserId)
|
||||
.set(StockShelfOrder::getUpdateByName, reverseAuditUserName)
|
||||
.set(StockShelfOrder::getUpdateTime, reverseAuditDate)
|
||||
.eq(StockShelfOrder::getInOrderNumber, inOrderNumber)
|
||||
.eq(StockShelfOrder::getDelFlag, 1));
|
||||
//9.收货/上架节点库存台账(trackingNumber=收货/上架单号;台账无逻辑删除标志,物理删除保持台账与回退后库存一致)
|
||||
Set<String> standingTrackingNumbers = new HashSet<>(receiptOrderNumbers);
|
||||
standingTrackingNumbers.addAll(shelfOrderNumbers);
|
||||
if (!standingTrackingNumbers.isEmpty()) {
|
||||
inventoryStandingDetailService.remove(new LambdaQueryWrapper<InventoryStandingDetail>()
|
||||
.in(InventoryStandingDetail::getTrackingNumber, standingTrackingNumbers)
|
||||
.in(InventoryStandingDetail::getNodeStatus, 1, 2));
|
||||
}
|
||||
//10.入库单明细
|
||||
materialDetailService.update(new UpdateWrapper<InMaterialDetail>().lambda()
|
||||
.set(InMaterialDetail::getDelFlag, 2)
|
||||
.eq(InMaterialDetail::getInOrderNumber, inOrderNumber)
|
||||
.eq(InMaterialDetail::getDelFlag, 1));
|
||||
//11.入库单(软删+打已反审标记,入库单【已反审】tab 可查归档数据)
|
||||
stockInOrderService.update(new UpdateWrapper<StockInOrder>().lambda()
|
||||
.set(StockInOrder::getDelFlag, 2)
|
||||
.set(StockInOrder::getReverseAuditStatus, 1)
|
||||
.set(StockInOrder::getReverseAuditRemark, reverseRemarkForWms)
|
||||
.set(StockInOrder::getReverseAuditBy, reverseAuditUserId)
|
||||
.set(StockInOrder::getReverseAuditByName, reverseAuditUserName)
|
||||
.set(StockInOrder::getReverseAuditTime, reverseAuditDate)
|
||||
.set(StockInOrder::getUpdateBy, reverseAuditUserId)
|
||||
.set(StockInOrder::getUpdateByName, reverseAuditUserName)
|
||||
.set(StockInOrder::getUpdateTime, reverseAuditDate)
|
||||
.eq(StockInOrder::getInOrderNumber, inOrderNumber)
|
||||
.eq(StockInOrder::getDelFlag, 1));
|
||||
|
||||
// ========== 4. 写1条入库异常【反审记录】用于记录跟踪 ==========
|
||||
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.setCreateBy(stockInOrder.getUpdateBy() == null ? 0L : stockInOrder.getUpdateBy());
|
||||
reverseAbnormal.setCreateByName(StringUtils.isEmpty(reverseByName) ? "system" : reverseByName);
|
||||
inOrderAbnormalService.genReverseAuditAbnormal(reverseAbnormal);
|
||||
}
|
||||
|
||||
/**
|
||||
* OMS下发入库单明细保存后自动审核通过(生成收货单并更新审核状态)
|
||||
*/
|
||||
|
||||
+17
@@ -164,5 +164,22 @@ public class StockReceiptOrder extends BaseVOEntity {
|
||||
@Excel(name = "业务单号")
|
||||
private String batchNo;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)")
|
||||
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
@@ -194,4 +194,21 @@ public class StockReceiptOrderPO extends StockInOrderBasePO {
|
||||
@ApiModelProperty("批次号")
|
||||
@Excel(name = "批次号")
|
||||
private String batchNo;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)")
|
||||
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
@@ -203,4 +203,21 @@ public class StockReceiptOrderDO extends StockInOrderBaseDO {
|
||||
@ApiModelProperty("是否需要报关")
|
||||
@Excel(name = "是否需要报关")
|
||||
private Integer needCustomsDeclaration;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)")
|
||||
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;
|
||||
}
|
||||
@@ -118,4 +118,21 @@ public class StockShelfOrder extends BaseVOEntity {
|
||||
@Excel(name = "批次号")
|
||||
private String batchNo;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)")
|
||||
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
@@ -153,4 +153,21 @@ public class StockShelfOrderPO extends StockInOrderBasePO {
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
@Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd")
|
||||
private Date completionTime;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)")
|
||||
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
@@ -173,4 +173,21 @@ public class StockShelfOrderDO extends StockInOrderBaseDO {
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date createTimeTo;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)")
|
||||
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;
|
||||
}
|
||||
@@ -468,4 +468,7 @@ public class StockInOrderDTO extends StockInOrderBaseDTO {
|
||||
*/
|
||||
@ApiModelProperty("作业任务人员(模糊查询)")
|
||||
private String workUserNameLike;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)")
|
||||
private Integer reverseAuditStatus;
|
||||
}
|
||||
+3
@@ -171,4 +171,7 @@ public class StockReceiptOrderDTO extends StockInOrderBaseDTO {
|
||||
@ApiModelProperty("业务单号")
|
||||
@Excel(name = "业务单号")
|
||||
private String batchNo;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)")
|
||||
private Integer reverseAuditStatus;
|
||||
}
|
||||
+3
@@ -162,4 +162,7 @@ public class StockShelfOrderDTO extends StockInOrderBaseDTO {
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date createTimeTo;
|
||||
|
||||
@ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)")
|
||||
private Integer reverseAuditStatus;
|
||||
}
|
||||
+21
@@ -147,6 +147,16 @@ public class StockInOrderApi 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));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入入库单
|
||||
*/
|
||||
@@ -329,6 +339,17 @@ public class StockInOrderApi extends BaseController {
|
||||
return AjaxResult.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* oms入库业务单反审:WMS侧回退已完成单据(出库拦截 -> 回退库存 ->
|
||||
* 逻辑删除收货/上架链路 -> 写入库异常【反审记录】),已产生出库则报错拦截
|
||||
*/
|
||||
@ApiOperation("oms入库单反审WMS回退")
|
||||
@PostMapping(value = "/omsReverseInOrder")
|
||||
public AjaxResult omsReverseInOrder(@RequestBody StockInOrder stockInOrder) {
|
||||
stockInOrderApplicationService.omsReverseInOrder(stockInOrder);
|
||||
return AjaxResult.success();
|
||||
}
|
||||
|
||||
@ApiOperation("查询入库信息(通过入库单号)")
|
||||
@PostMapping("/queryInStockInfo")
|
||||
public AjaxResult queryInStockInfo(@RequestBody StockInOrderDTO stockInOrderDTO) {
|
||||
|
||||
Reference in New Issue
Block a user