feat(oms,wms): 出库业务单反审——已出库/已审核单据回退已创建

- 新增 POST /reservationStockOutOrderApi/reverseAudit,按issueStatus(2-已审核/4-已出库)判断可反审
- 主单回退已创建并打reverseStatus标记,进【已反审】tab(list status=-2),重新审核通过自动复位
- 执行单/明细软删+reverseFlag=1,预约库存调整记录软删
- WMS新增/stockOutOrderApi/omsReverseExecutionOrder:已出库还原实物库存+推OMS,未出库仅还原分配占用,WMS无数据幂等成功
- W出库/拣货/复核/交接单软删+reverseFlag=1,列表支持delFlag=2&reverseFlag=1【已反审】tab
- 四页面新增归档详情接口getReverseInfo*
- 生成出库异常记录【反审记录】(abnormalType=3,前缀FSYC)
- 需先执行SQL: 20260908两个反审脚本(OMS库+WMS库)
This commit is contained in:
rcx
2026-09-09 15:20:13 +08:00
parent 139a3a82da
commit 715883f1d4
56 changed files with 970 additions and 44 deletions
@@ -21,7 +21,7 @@ import java.util.Map;
* @description: TODO * @description: TODO
* @date 2024/5/10 8:58 * @date 2024/5/10 8:58
**/ **/
@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE,url = "http://10.33.0.109:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) @FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE,fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class)
public interface WmsServiceFeign { public interface WmsServiceFeign {
/** /**
@@ -133,6 +133,27 @@ public interface WmsServiceFeign {
@PostMapping(value = "/stockInOrderApi/omsCancelInOrder") @PostMapping(value = "/stockInOrderApi/omsCancelInOrder")
public AjaxResult omsCancelInOrder(@RequestBody StockInOrder stockInOrder); public AjaxResult omsCancelInOrder(@RequestBody StockInOrder stockInOrder);
/**
* oms出库执行单反审(已出库/已复核单据客户通知回退场景):WMS侧还原实物库存并推送OMS库存、
* 逻辑删除出库链路单据、生成1条出库异常【反审记录】;反审原因经 remark 透传。
* 已产生下游不可逆数据时返回错误,OMS据此整体回滚。
*/
@ApiOperation("oms出库执行单反审WMS回退")
@PostMapping(value = "/stockOutOrderApi/omsReverseExecutionOrder")
public AjaxResult omsReverseExecutionOrder(@RequestBody StockOutOrder stockOutOrder);
/**
* oms入库业务单反审:WMS侧一个事务内回退已入库/收货中/上架中单据——
* 校验未产生出库(按入库单号+动作"分配库存/出库"查库存调整记录>0即有出库) ->
* 按库存行整行回退库存扣减 -> 软删W入库单/W收货单/W上架单全链并打已反审标记
* (各页面【已反审】tab按"已软删+已反审"查询归档数据)-> 写1条入库异常【反审记录】(type=3)。
* 入参: inOrderNumber=执行入库单号, remark=业务单号+反审原因, updateBy/updateByName=反审人;
* WMS无该单数据时幂等返回成功(未下发单反审不产生WMS数据)。
*/
@ApiOperation("oms入库单反审WMS回退")
@PostMapping(value = "/stockInOrderApi/omsReverseInOrder")
public AjaxResult omsReverseInOrder(@RequestBody StockInOrder stockInOrder);
@ApiOperation("oms查询物料列表") @ApiOperation("oms查询物料列表")
@GetMapping("/materialBaseInfoApi/queryList") @GetMapping("/materialBaseInfoApi/queryList")
public TableDataInfo getMaterialBaseInfoList(MaterialInfoDTO materialInfoDTO); public TableDataInfo getMaterialBaseInfoList(MaterialInfoDTO materialInfoDTO);
@@ -82,6 +82,12 @@ public class RemoteWmsFallbackFactory implements FallbackFactory<WmsServiceFeign
return AjaxResult.error("WMS取消下发清理失败:" + cause.getMessage()); return AjaxResult.error("WMS取消下发清理失败:" + cause.getMessage());
} }
@Override
public AjaxResult omsReverseExecutionOrder(StockOutOrder stockOutOrder) {
//返回错误而非静默成功,让OMS反审事务能感知失败并整体回滚
return AjaxResult.error("WMS出库执行单反审失败(服务降级):" + cause.getMessage());
}
@Override @Override
public void omsAutoAssign(StockOutOrderDTO stockOutOrderDTO) { public void omsAutoAssign(StockOutOrderDTO stockOutOrderDTO) {
@@ -110,6 +116,12 @@ public class RemoteWmsFallbackFactory implements FallbackFactory<WmsServiceFeign
return AjaxResult.error("WMS取消下发清理失败:" + cause.getMessage()); return AjaxResult.error("WMS取消下发清理失败:" + cause.getMessage());
} }
@Override
public AjaxResult omsReverseInOrder(StockInOrder stockInOrder) {
//返回错误而非静默成功,让OMS侧反审能感知回退失败并整体回滚(反审可重试,WMS回退幂等)
return AjaxResult.error("WMS入库单反审回退失败(服务降级):" + cause.getMessage());
}
@Override @Override
public TableDataInfo getMaterialBaseInfoList(MaterialInfoDTO materialInfoDTO) { public TableDataInfo getMaterialBaseInfoList(MaterialInfoDTO materialInfoDTO) {
TableDataInfo tableDataInfo = new TableDataInfo(); TableDataInfo tableDataInfo = new TableDataInfo();
@@ -518,4 +518,7 @@ public class ExecutionOutMaterialDetail extends BaseVOEntity {
private String inLineNumGw; private String inLineNumGw;
private String opWhLocGw; private String opWhLocGw;
private String warehouseGw; private String warehouseGw;
@ApiModelProperty("反审标记: 0-无 1-已反审(业务单反审时软删del_flag=2并打标记)")
private Integer reverseFlag;
} }
@@ -516,4 +516,7 @@ public class ExecutionStockOutOrder extends BaseVOEntity {
@ApiModelProperty("折扣") @ApiModelProperty("折扣")
private BigDecimal discount; private BigDecimal discount;
@ApiModelProperty("反审标记: 0-无 1-已反审(业务单反审时软删del_flag=2并打标记)")
private Integer reverseFlag;
} }
@@ -515,4 +515,21 @@ public class ReservationStockOutOrder extends BaseVOEntity {
@ApiModelProperty("折扣") @ApiModelProperty("折扣")
private BigDecimal discount; private BigDecimal discount;
@ApiModelProperty("反审状态: 0-无 1-已反审(反审后status回退为1-已创建,重新审核通过自动复位0)")
private Integer reverseStatus;
@ApiModelProperty("反审人id")
private Long reverseBy;
@ApiModelProperty("反审人姓名")
private String reverseByName;
@ApiModelProperty("反审时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date reverseTime;
@ApiModelProperty("反审原因")
private String reverseRemark;
} }
@@ -538,4 +538,21 @@ public class ReservationStockOutOrderPO extends BaseVOEntity {
@ApiModelProperty("折扣") @ApiModelProperty("折扣")
private BigDecimal discount; private BigDecimal discount;
@ApiModelProperty("反审状态: 0-无 1-已反审(反审后status回退为1-已创建,重新审核通过自动复位0)")
private Integer reverseStatus;
@ApiModelProperty("反审人id")
private Long reverseBy;
@ApiModelProperty("反审人姓名")
private String reverseByName;
@ApiModelProperty("反审时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date reverseTime;
@ApiModelProperty("反审原因")
private String reverseRemark;
} }
@@ -591,4 +591,19 @@ public class ReservationStockOutOrderDO extends BaseVOEntity {
@ApiModelProperty("折扣") @ApiModelProperty("折扣")
private BigDecimal discount; private BigDecimal discount;
@ApiModelProperty("反审状态: 0-无 1-已反审(反审后status回退为1-已创建,重新审核通过自动复位0)")
private Integer reverseStatus;
@ApiModelProperty("反审人id")
private Long reverseBy;
@ApiModelProperty("反审人姓名")
private String reverseByName;
@ApiModelProperty("反审时间")
private Date reverseTime;
@ApiModelProperty("反审原因")
private String reverseRemark;
} }
@@ -580,4 +580,21 @@ public class ReservationStockOutOrderDTO extends ReservationStockOutOrderBaseDTO
@ApiModelProperty("折扣") @ApiModelProperty("折扣")
private BigDecimal discount; private BigDecimal discount;
@ApiModelProperty("反审状态: 0-无 1-已反审(反审后status回退为1-已创建,重新审核通过自动复位0)")
private Integer reverseStatus;
@ApiModelProperty("反审人id")
private Long reverseBy;
@ApiModelProperty("反审人姓名")
private String reverseByName;
@ApiModelProperty("反审时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date reverseTime;
@ApiModelProperty("反审原因")
private String reverseRemark;
} }
@@ -881,6 +881,14 @@ public class ReservationStockOutOrderApplicationService {
return stockOutOrderDomainService.cancelIssueOrder(stockOutOrderDO); return stockOutOrderDomainService.cancelIssueOrder(stockOutOrderDO);
} }
/**
* @description 反审出库业务单(已出库/已复核单据回退到已创建, WMS库存还原并生成反审异常记录)
* @date 2026/9/8
*/
public Boolean reverseAudit(ReservationStockOutOrderDO stockOutOrderDO){
return stockOutOrderDomainService.reverseAudit(stockOutOrderDO);
}
public Boolean executeAndIssue(ReservationStockOutOrderDO stockOutOrderDO){ public Boolean executeAndIssue(ReservationStockOutOrderDO stockOutOrderDO){
return stockOutOrderDomainService.executeAndIssue(stockOutOrderDO); return stockOutOrderDomainService.executeAndIssue(stockOutOrderDO);
} }
@@ -48,6 +48,8 @@ import com.mhd.oms.domain.reservationStockInOrder.repository.mapper.ReservationS
import com.mhd.oms.domain.reservationStockInOrder.repository.po.MaterialBaseInfoPO; import com.mhd.oms.domain.reservationStockInOrder.repository.po.MaterialBaseInfoPO;
import com.mhd.oms.domain.reservationStockInOrder.repository.todo.ReservationStockInOrderDO; import com.mhd.oms.domain.reservationStockInOrder.repository.todo.ReservationStockInOrderDO;
import com.mhd.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrder; import com.mhd.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrder;
import com.mhd.oms.domain.reservationInventoryAdjustmentRecord.entity.ReservationInventoryAdjustmentRecord;
import com.mhd.oms.domain.reservationInventoryAdjustmentRecord.repository.mapper.ReservationInventoryAdjustmentRecordMapper;
import com.mhd.oms.domain.reservationStockOutOrder.repository.facade.IReservationStockOutOrderService; import com.mhd.oms.domain.reservationStockOutOrder.repository.facade.IReservationStockOutOrderService;
import com.mhd.oms.domain.reservationStockOutOrder.repository.mapper.ReservationStockOutOrderMapper; import com.mhd.oms.domain.reservationStockOutOrder.repository.mapper.ReservationStockOutOrderMapper;
import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderPO; import com.mhd.oms.domain.reservationStockOutOrder.repository.po.ReservationStockOutOrderPO;
@@ -118,6 +120,8 @@ public class ReservationStockOutOrderDomainService {
private ReserveStockOutOrderMapper reserveStockOutOrderMapper; private ReserveStockOutOrderMapper reserveStockOutOrderMapper;
@Autowired @Autowired
private MaterialBaseInfoResolveService materialBaseInfoResolveService; private MaterialBaseInfoResolveService materialBaseInfoResolveService;
@Resource
private ReservationInventoryAdjustmentRecordMapper inventoryAdjustmentRecordMapper;
/** /**
* 分页查询出库单列表 * 分页查询出库单列表
@@ -409,7 +413,8 @@ public class ReservationStockOutOrderDomainService {
String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null
? loginUser.getUserPo().getUserName() ? loginUser.getUserPo().getUserName()
: (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername());
boolean updateResult = stockOutOrderService.update(null, new UpdateWrapper<ReservationStockOutOrder>().lambda() boolean updateResult;
LambdaUpdateWrapper<ReservationStockOutOrder> auditUpdateWrapper = new UpdateWrapper<ReservationStockOutOrder>().lambda()
.set(ReservationStockOutOrder::getReservationAuditId, loginUser.getUserid()) .set(ReservationStockOutOrder::getReservationAuditId, loginUser.getUserid())
.set(ReservationStockOutOrder::getReservationAuditName, userRealName) .set(ReservationStockOutOrder::getReservationAuditName, userRealName)
.set(ReservationStockOutOrder::getReservationAuditTime, new Date()) .set(ReservationStockOutOrder::getReservationAuditTime, new Date())
@@ -417,7 +422,12 @@ public class ReservationStockOutOrderDomainService {
.set(ReservationStockOutOrder::getUpdateByName, userRealName) .set(ReservationStockOutOrder::getUpdateByName, userRealName)
.set(ReservationStockOutOrder::getUpdateTime, new Date()) .set(ReservationStockOutOrder::getUpdateTime, new Date())
.set(ReservationStockOutOrder::getIssueStatus, issueStatus) .set(ReservationStockOutOrder::getIssueStatus, issueStatus)
.in(ReservationStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds())); .in(ReservationStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds());
// 重新审核通过时复位反审标记: 单据离开【已反审】页签回到正常流转
if (issueStatus == 2) {
auditUpdateWrapper.set(ReservationStockOutOrder::getReverseStatus, 0);
}
updateResult = stockOutOrderService.update(null, auditUpdateWrapper);
//审核通过时同步线路/车次到关联的运输业务单 //审核通过时同步线路/车次到关联的运输业务单
if (issueStatus == 2) { if (issueStatus == 2) {
@@ -662,6 +672,118 @@ public class ReservationStockOutOrderDomainService {
return update; return update;
} }
/**
* @description 反审出库业务单(按前端展示字段 issueStatus 判断可反审范围: 2-已审核(未出库) / 4-已出库 均可反审;
* 0-已创建无需反审、3-已驳回可直接编辑; status 字段在出库完成后不一定同步为9, 故不作为判断依据,
* 仅兜底排除 10-已取消/11-已关闭)。
* 反审将单据回退到最原始状态(1-已创建, issueStatus=0)并打上反审标记:
* WMS 侧按出库单实际状态分支还原库存(已出库: 实物库存还原+推OMS; 未出库: 仅还原分配/冻结占用)、
* 清理执行单据(出库单/明细/拣货/复核/交接/配送, 软删+reverseFlag=1 划归【已反审】tab)、
* 每个执行出库单生成1条出库异常记录【反审记录】(out_order_abnormal, abnormalType=3);
* OMS 侧软删执行出库单及明细、软删预约库存调整记录。
* 反审后单据进入【已反审】页签(status=1 且 reverse_status=1), 可继续编辑/审核/撤销;
* 重新审核通过时 reverse_status 自动复位 0(见 auditState)。
* @date 2026/9/8
*/
@Transactional(rollbackFor = Exception.class)
public Boolean reverseAudit(ReservationStockOutOrderDO stockOutOrderDO) {
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> outOrderIds = stockOutOrderDO.getOutOrderIds();
if (outOrderIds == null || outOrderIds.isEmpty()) {
throw new ServiceException("请选择需要反审的出库单");
}
String reverseRemark = stockOutOrderDO.getReverseRemark();
for (Long outOrderId : outOrderIds) {
ReservationStockOutOrder byId = stockOutOrderService.getById(outOrderId);
if (byId == null) {
throw new ServiceException("出库单不存在, outOrderId=" + outOrderId);
}
Integer status = byId.getStatus();
if (status != null && (status == 10 || status == 11)) {
throw new ServiceException("出库单[" + byId.getOutOrderNumber() + "]已取消/已关闭, 不能反审");
}
// 反审条件按前端展示字段 issueStatus 判断: 2-已审核(未出库) / 4-已出库 均可反审
Integer issueStatus = byId.getIssueStatus();
if (!Integer.valueOf(2).equals(issueStatus) && !Integer.valueOf(4).equals(issueStatus)) {
throw new ServiceException("出库单[" + byId.getOutOrderNumber() + "]当前状态(issueStatus=" + issueStatus
+ ")不支持反审, 仅已审核/已出库状态可反审");
}
// 逐个执行出库单调 WMS 反审: 还原实物库存+推送OMS库存、清理WMS单据、生成反审异常记录;
// 任一失败抛异常整体回滚, 避免单边反审
List<ExecutionStockOutOrder> executionOrders = executionStockOutOrderService.list(new QueryWrapper<ExecutionStockOutOrder>().lambda()
.eq(ExecutionStockOutOrder::getBusinessOutOrderNumber, byId.getOutOrderNumber())
.eq(ExecutionStockOutOrder::getDelFlag, 1));
for (ExecutionStockOutOrder executionStockOutOrder : executionOrders) {
String executionOutOrderNumber = executionStockOutOrder.getOutOrderNumber();
StockOutOrder wmsOutOrder = new StockOutOrder();
wmsOutOrder.setOutOrderNumber(executionOutOrderNumber);
// 反审原因经 remark 透传 WMS, 记入反审异常记录备注
wmsOutOrder.setRemark("业务单号:" + byId.getOutOrderNumber()
+ (reverseRemark != null && !reverseRemark.isEmpty() ? ",反审原因:" + reverseRemark : ""));
AjaxResult wmsResult = wmsServiceFeign.omsReverseExecutionOrder(wmsOutOrder);
if (wmsResult == null || !"200".equals(String.valueOf(wmsResult.get("code")))) {
throw new ServiceException("执行出库单[" + executionOutOrderNumber + "]WMS反审失败:"
+ (wmsResult == null ? "WMS服务不可用" : wmsResult.get("msg")));
}
// 软删执行出库单明细 + 执行出库单(与取消下发 cancelIssueOrder 一致)
List<ExecutionOutMaterialDetail> materialDetails = executionOutMaterialDetailService.list(new QueryWrapper<ExecutionOutMaterialDetail>().lambda()
.eq(ExecutionOutMaterialDetail::getOutOrderNumber, executionOutOrderNumber)
.eq(ExecutionOutMaterialDetail::getDelFlag, 1));
materialDetails.forEach(executionOutMaterialDetail -> {
executionOutMaterialDetailService.update(null, new UpdateWrapper<ExecutionOutMaterialDetail>().lambda()
.set(ExecutionOutMaterialDetail::getDelFlag, 2)
.set(ExecutionOutMaterialDetail::getReverseFlag, 1)
.eq(ExecutionOutMaterialDetail::getMaterialDetailId, executionOutMaterialDetail.getMaterialDetailId()));
});
executionStockOutOrderService.update(null, new UpdateWrapper<ExecutionStockOutOrder>().lambda()
.set(ExecutionStockOutOrder::getDelFlag, 2)
.set(ExecutionStockOutOrder::getReverseFlag, 1)
.eq(ExecutionStockOutOrder::getOutOrderNumber, executionOutOrderNumber));
// 软删预约库存调整记录(下发分配时生成): 仅软删留痕, 库存数量由 WMS omsEdit 推送还原
inventoryAdjustmentRecordMapper.update(null, new UpdateWrapper<ReservationInventoryAdjustmentRecord>().lambda()
.set(ReservationInventoryAdjustmentRecord::getDelFlag, 2)
.eq(ReservationInventoryAdjustmentRecord::getExecutionOrderNumber, executionOutOrderNumber)
.eq(ReservationInventoryAdjustmentRecord::getDelFlag, 1));
}
}
// 主单回退到已创建并打反审标记; 更新条件带 issueStatus in (2,4) + 排除已取消/已关闭 兜底防并发重复反审
// issueStatus 回退到 0-已创建(前端展示映射: 0-已创建 2-已审核 3-已驳回 4-已出库)
return stockOutOrderService.update(null, new UpdateWrapper<ReservationStockOutOrder>().lambda()
.set(ReservationStockOutOrder::getStatus, 1)
.set(ReservationStockOutOrder::getIssueStatus, 0)
.set(ReservationStockOutOrder::getIssueId, null)
.set(ReservationStockOutOrder::getIssueName, null)
.set(ReservationStockOutOrder::getIssueTime, null)
.set(ReservationStockOutOrder::getReservationAuditId, null)
.set(ReservationStockOutOrder::getReservationAuditName, null)
.set(ReservationStockOutOrder::getReservationAuditTime, null)
.set(ReservationStockOutOrder::getAllocationQuantity, BigDecimal.ZERO)
.set(ReservationStockOutOrder::getAlreadyAllocationQuantity, BigDecimal.ZERO)
.set(ReservationStockOutOrder::getPickingQuantity, BigDecimal.ZERO)
.set(ReservationStockOutOrder::getCheckQuantity, BigDecimal.ZERO)
.set(ReservationStockOutOrder::getCheckStatus, 1)
.set(ReservationStockOutOrder::getCheckTaskDistribution, 2)
.set(ReservationStockOutOrder::getCompleteTime, null)
.set(ReservationStockOutOrder::getOutboundTime, null)
.set(ReservationStockOutOrder::getReverseStatus, 1)
.set(ReservationStockOutOrder::getReverseBy, loginUser.getUserid())
.set(ReservationStockOutOrder::getReverseByName, userRealName)
.set(ReservationStockOutOrder::getReverseTime, new Date())
.set(ReservationStockOutOrder::getReverseRemark, reverseRemark)
.set(ReservationStockOutOrder::getUpdateBy, loginUser.getUserid())
.set(ReservationStockOutOrder::getUpdateByName, userRealName)
.set(ReservationStockOutOrder::getUpdateTime, new Date())
.in(ReservationStockOutOrder::getOutOrderId, outOrderIds)
.in(ReservationStockOutOrder::getIssueStatus, 2, 4)
.notIn(ReservationStockOutOrder::getStatus, 10, 11));
}
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean executeAndIssue(ReservationStockOutOrderDO stockOutOrderDO) { public Boolean executeAndIssue(ReservationStockOutOrderDO stockOutOrderDO) {
LoginUser loginUser = SecurityUtils.getLoginUser(); LoginUser loginUser = SecurityUtils.getLoginUser();
@@ -159,6 +159,17 @@ public class ReservationStockOutOrderApi extends BaseController {
return AjaxResult.success(stockOutOrderApplicationService.cancelIssueOrder(stockOutOrderDO)); return AjaxResult.success(stockOutOrderApplicationService.cancelIssueOrder(stockOutOrderDO));
} }
/**
* 反审出库单: 已出库/已复核(issueStatus=2已审核)的单据回退到已创建并打反审标记,
* WMS还原实物库存并生成出库异常记录反审记录, 单据划归已反审页签
*/
@ApiOperation("反审出库单")
@PostMapping(value = "/reverseAudit")
public AjaxResult reverseAudit(@RequestBody ReservationStockOutOrderDTO stockOutOrderDTO) {
ReservationStockOutOrderDO stockOutOrderDO = stockOutOrderAssembler.toDO(stockOutOrderDTO);
return AjaxResult.success(stockOutOrderApplicationService.reverseAudit(stockOutOrderDO));
}
@ApiOperation("下发出库单") @ApiOperation("下发出库单")
@PostMapping(value = "/executeAndIssue") @PostMapping(value = "/executeAndIssue")
public AjaxResult executeAndIssue(@RequestBody ReservationStockOutOrderDTO stockOutOrderDTO) { public AjaxResult executeAndIssue(@RequestBody ReservationStockOutOrderDTO stockOutOrderDTO) {
@@ -117,6 +117,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="businessPriceWay" column="BUSINESS_PRICE_WAY" /> <result property="businessPriceWay" column="BUSINESS_PRICE_WAY" />
<result property="discount" column="DISCOUNT" /> <result property="discount" column="DISCOUNT" />
<result property="totalOutboundQuantity" column="TOTAL_OUTBOUND_QUANTITY" /> <result property="totalOutboundQuantity" column="TOTAL_OUTBOUND_QUANTITY" />
<result property="reverseStatus" column="REVERSE_STATUS" />
<result property="reverseBy" column="REVERSE_BY" />
<result property="reverseByName" column="REVERSE_BY_NAME" />
<result property="reverseTime" column="REVERSE_TIME" />
<result property="reverseRemark" column="REVERSE_REMARK" />
</resultMap> </resultMap>
@@ -136,7 +141,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
,a.reservation_audit_id,a.issue_name,a.issue_id,a.issue_time,a.issue_status,a.tms_order_number, ,a.reservation_audit_id,a.issue_name,a.issue_id,a.issue_time,a.issue_status,a.tms_order_number,
a.DIRECTOR_NAME ,a.DIRECTOR_PHONE,a.DIRECTOR_ID,a.RESERVATION_ORDER_SOURCE,a.OUTBOUND_TIME,a.RETURN_QUANTITY,a.DELIVERY_NAME,a.CUSTOMER_NUMBER,a.INVOICE_NUMBER,a.RETURN_ORDER_NUMBER,a.TOTAL_AMOUNT, a.DIRECTOR_NAME ,a.DIRECTOR_PHONE,a.DIRECTOR_ID,a.RESERVATION_ORDER_SOURCE,a.OUTBOUND_TIME,a.RETURN_QUANTITY,a.DELIVERY_NAME,a.CUSTOMER_NUMBER,a.INVOICE_NUMBER,a.RETURN_ORDER_NUMBER,a.TOTAL_AMOUNT,
a.ROUTE,a.PUSH_TIME,a.PUSH_STATUS,a.PUSH_BY,a.PUSH_BY_NAME,a.execution_out_order_number,a.LINE_CODE,a.LINE_NAME,a.SHUTTLE_NO, a.ROUTE,a.PUSH_TIME,a.PUSH_STATUS,a.PUSH_BY,a.PUSH_BY_NAME,a.execution_out_order_number,a.LINE_CODE,a.LINE_NAME,a.SHUTTLE_NO,
a.TOTAL_WAREHOUSE_RENT,a.BUSINESS_CHARGE_TYPE,a.BUSINESS_PRICE_WAY,a.DISCOUNT a.TOTAL_WAREHOUSE_RENT,a.BUSINESS_CHARGE_TYPE,a.BUSINESS_PRICE_WAY,a.DISCOUNT,
a.REVERSE_STATUS,a.REVERSE_BY,a.REVERSE_BY_NAME,a.REVERSE_TIME,a.REVERSE_REMARK
</sql> </sql>
@@ -178,11 +184,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!-- 出库状态: 3-部分分配 4-已分配 5-拣货中 6-波次中 7-拣货完成 8-复核中--> <!-- 出库状态: 3-部分分配 4-已分配 5-拣货中 6-波次中 7-拣货完成 8-复核中-->
and a.status IN (3, 4, 5, 6, 7, 8) and a.status IN (3, 4, 5, 6, 7, 8)
</when> </when>
<when test="status == -2 "> <!-- 已反审 -->
<!-- 反审后单据回退为 1-已创建 且打上反审标记, 与【已创建】页签互斥 -->
and a.status = 1 and a.reverse_status = 1
</when>
<when test="status == 1 "> <!-- 已创建: 排除已反审的单据(已划归【已反审】页签) -->
and a.status = 1 and (a.reverse_status is null or a.reverse_status = 0)
</when>
<otherwise> <otherwise>
and a.status = #{status} and a.status = #{status}
</otherwise> </otherwise>
</choose> </choose>
</if> </if>
<if test="reverseStatus != null ">
and a.reverse_status = #{reverseStatus}
</if>
<!-- 出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-拣货中 6-波次中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 --> <!-- 出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-拣货中 6-波次中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 -->
<if test="gtStatus != null "> <if test="gtStatus != null ">
and a.status &gt; #{gtStatus} and a.status &gt; #{gtStatus}
@@ -157,6 +157,14 @@ public class HandoverTaskOrderApplicationService {
return handoverTaskOrderDomainService.getInfo(outTaskOrderId); return handoverTaskOrderDomainService.getInfo(outTaskOrderId);
} }
/**
* 获取交接作业单归档详情(已反审): 反审时交接单已软删, 已反审tab 查看归档详情
*/
public HandoverTaskOrderPO getReverseInfo(Long outTaskOrderId)
{
return handoverTaskOrderDomainService.getReverseInfo(outTaskOrderId);
}
/** /**
* 按作业单号获取交接作业单详细信息PDA * 按作业单号获取交接作业单详细信息PDA
* 用于下发任务(taskType=7) trackingNumber 对应交接作业单的 taskNumber * 用于下发任务(taskType=7) trackingNumber 对应交接作业单的 taskNumber
@@ -288,6 +288,13 @@ public class PickingOrderApplicationService {
return pickingOrderPO; return pickingOrderPO;
} }
/**
* 获取拣货单归档详情(已反审): 反审时拣货单已软删(del_flag=2), 已反审tab 查看归档详情
*/
public PickingOrderPO getReverseInfoByIdAndType(Long pickingOrderId, Integer type) {
return pickingOrderDomainService.getReverseInfoByIdAndType(pickingOrderId, type);
}
/** /**
* 递归为物料明细设置更多属性 * 递归为物料明细设置更多属性
* @param pickingMaterialDetailPOList 物料明细列表 * @param pickingMaterialDetailPOList 物料明细列表
@@ -187,6 +187,27 @@ public class ReviewOrderApplicationService {
return header; return header;
} }
/**
* 获取复核单归档详情(已反审): 反审时复核单/明细均已软删(del_flag=2), 已反审tab 查看归档详情
*/
public ReviewOrderPO getReverseDetailByReviewOrderId(Long reviewOrderId) {
if (reviewOrderId == null) {
throw new ServiceException("复核单ID不能为空");
}
ReviewOrderPO header = reviewOrderMapper.selectHeaderByReviewOrderIdReverse(reviewOrderId);
if (header == null) {
throw new ServiceException("复核单不存在");
}
List<ReviewMaterialDetailPO> details = reviewOrderMapper.queryDetailByReviewOrderIdReverse(reviewOrderId);
fillDisplayQtyFields(details);
Map<Long, List<BatchDetailFeignPO>> batchDetailMap = loadDisplayBatchDetailMap(details);
fillDynamicBatchDisplayFields(details, batchDetailMap);
buildReviewMaterialMoreDetailListLikeShelf(details, batchDetailMap);
fillHeaderSummary(header, details);
header.setMaterialDetailList(details);
return header;
}
public ReviewOrderPO getDetailByReviewOrderNumber(String reviewOrderNumber) { public ReviewOrderPO getDetailByReviewOrderNumber(String reviewOrderNumber) {
if (StringUtils.isEmpty(reviewOrderNumber)) { if (StringUtils.isEmpty(reviewOrderNumber)) {
@@ -501,6 +501,14 @@ public class StockOutOrderApplicationService {
return stockOutOrderPO; return stockOutOrderPO;
} }
/**
* 获取出库单归档详情(已反审): 反审时单据已软删, 已反审tab 查看归档详情
*/
public StockOutOrderPO getReverseInfoChildren(Long outOrderId)
{
return stockOutOrderDomainService.getReverseInfoChildren(outOrderId);
}
/** /**
* 出库交接场景递归过滤 pickingQuantity 0 的明细与交接详情一致 * 出库交接场景递归过滤 pickingQuantity 0 的明细与交接详情一致
* @param detailList 物料明细树 * @param detailList 物料明细树
@@ -1950,6 +1958,13 @@ public class StockOutOrderApplicationService {
stockOutOrderDomainService.cancelExecutionOrder(stockOutOrder); stockOutOrderDomainService.cancelExecutionOrder(stockOutOrder);
} }
/**
* oms出库执行单反审(已出库单据回退): 还原实物库存并推送OMS清理单据生成反审异常记录
*/
public void reverseExecutionOrder(StockOutOrder stockOutOrder){
stockOutOrderDomainService.reverseExecutionOrder(stockOutOrder);
}
public void omsOrderAddDetail(List<OutMaterialDetail> outMaterialDetails){ public void omsOrderAddDetail(List<OutMaterialDetail> outMaterialDetails){
stockOutOrderDomainService.omsOrderAddDetail(outMaterialDetails); stockOutOrderDomainService.omsOrderAddDetail(outMaterialDetails);
} }
@@ -144,4 +144,7 @@ public class HandoverTaskOrder extends BaseVOEntity {
private String operatorsName; private String operatorsName;
@ApiModelProperty("计费信息") @ApiModelProperty("计费信息")
private String billingJson; private String billingJson;
@ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)")
private Integer reverseFlag;
} }
@@ -146,4 +146,7 @@ public class HandoverTaskOrderPO extends BaseVOEntity {
private List<TaskHandoverMaterialDetailPO> materialDetailList; private List<TaskHandoverMaterialDetailPO> materialDetailList;
@ApiModelProperty("计费信息") @ApiModelProperty("计费信息")
private String billingJson; private String billingJson;
@ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)")
private Integer reverseFlag;
} }
@@ -146,4 +146,7 @@ public class HandoverTaskOrderDO extends BaseVOEntity {
private String pictureApp; private String pictureApp;
private String billingJson; private String billingJson;
@ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)")
private Integer reverseFlag;
} }
@@ -44,6 +44,7 @@ import com.mhd.wms.domain.materialInventory.repository.mapper.MaterialInventoryM
import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryParamDO; import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryParamDO;
import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail; import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail;
import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper; import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper;
import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail;
import com.mhd.wms.domain.pickingMaterialDetail.repository.mapper.PickingMaterialDetailMapper; import com.mhd.wms.domain.pickingMaterialDetail.repository.mapper.PickingMaterialDetailMapper;
import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO; import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO;
import com.mhd.wms.domain.shelfMaterialDetail.repository.todo.ShelfMaterialDetailDO; import com.mhd.wms.domain.shelfMaterialDetail.repository.todo.ShelfMaterialDetailDO;
@@ -242,6 +243,90 @@ public class HandoverTaskOrderDomainService {
return handoverTaskOrderPO; return handoverTaskOrderPO;
} }
/**
* 获取交接作业单归档详情(已反审): 出库单反审时交接单及关联出库明细均已软删(del_flag=2),
* 本方法镜像 getInfo del_flag=2 查归档数据, 供交接单已反审tab 查看详情
*/
public HandoverTaskOrderPO getReverseInfo(Long outTaskOrderId)
{
HandoverTaskOrderPO handoverTaskOrderPO = handoverTaskOrderService.getInfo(outTaskOrderId);
if (handoverTaskOrderPO == null) {
return null;
}
String orderNumber = handoverTaskOrderPO.getOrderNumber();
if (orderNumber != null && !orderNumber.trim().isEmpty()) {
StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper<StockOutOrder>().lambda()
.eq(StockOutOrder::getOutOrderNumber, orderNumber)
.eq(StockOutOrder::getDelFlag, 2));
Integer review = stockOutOrder != null ? stockOutOrder.getReview() : null;
// 归档明细: 出库明细已随反审软删, del_flag=2
LambdaQueryWrapper<OutMaterialDetail> omdQuery = new QueryWrapper<OutMaterialDetail>().lambda()
.eq(OutMaterialDetail::getOutOrderNumber, orderNumber)
.eq(OutMaterialDetail::getDelFlag, 2);
List<OutMaterialDetail> outMaterialDetailList = outMaterialDetailMapper.selectList(omdQuery);
List<TaskHandoverMaterialDetailPO> materialDetailList = new ArrayList<>();
for (OutMaterialDetail omd : outMaterialDetailList) {
BigDecimal handoverQuantity;
BigDecimal pickQty;
if (Integer.valueOf(1).equals(review)) {
// 需要复核时仅限复核单上的明细picking_material_detail 有拣货的 unique_id
List<PickingMaterialDetail> pmdList = pickingMaterialDetailMapper.selectList(new QueryWrapper<PickingMaterialDetail>().lambda()
.eq(PickingMaterialDetail::getOutUniqueId, omd.getUniqueId())
.eq(PickingMaterialDetail::getDelFlag, 2)
.gt(PickingMaterialDetail::getPickingQuantity, BigDecimal.ZERO));
if (pmdList == null || pmdList.isEmpty()) {
continue;
}
if (omd.getCheckQuantity() == null || omd.getCheckQuantity().compareTo(BigDecimal.ZERO) <= 0) {
continue;
}
PickingMaterialDetailPO pickingSummary = pickingMaterialDetailMapper.queryTotalsByOutNumberAndBaseId(omd.getUniqueId());
pickQty = (pickingSummary != null && pickingSummary.getPickingQuantity() != null) ? pickingSummary.getPickingQuantity() : BigDecimal.ZERO;
if (pickQty.compareTo(BigDecimal.ZERO) <= 0) {
continue;
}
handoverQuantity = omd.getCheckQuantity();
} else {
BigDecimal qty = omd.getPickingQuantity() != null ? omd.getPickingQuantity() : omd.getQuantity();
if (qty == null || qty.compareTo(BigDecimal.ZERO) <= 0) {
continue;
}
pickQty = qty;
handoverQuantity = qty;
}
TaskHandoverMaterialDetailPO detail = new TaskHandoverMaterialDetailPO();
detail.setMaterialDetailId(omd.getMaterialDetailId());
detail.setUniqueId(omd.getUniqueId());
detail.setTaskNumber(handoverTaskOrderPO.getTaskNumber());
detail.setOrganizationId(omd.getOrganizationId());
detail.setOrganizationName(omd.getOrganizationName());
detail.setTopOrganizationId(omd.getTopOrganizationId());
detail.setMaterialBaseInfoId(omd.getMaterialBaseInfoId());
detail.setMaterialCode(omd.getMaterialCode() != null ? omd.getMaterialCode() : omd.getMaterialNo());
detail.setMaterialName(omd.getMaterialName() != null ? omd.getMaterialName() : omd.getCommodityName());
detail.setBarCode(omd.getBarCode());
detail.setWeightLimit(omd.getWeightLimit());
detail.setVolumeLimit(omd.getVolumeLimit());
detail.setQuantity(omd.getQuantity());
detail.setPickingQuantity(pickQty);
detail.setCheckQuantity(handoverQuantity);
detail.setPackId(omd.getPackId());
detail.setPackCode(omd.getPackCode());
detail.setPackName(omd.getPackName());
detail.setPackDetailId(omd.getPackDetailId() != null ? String.valueOf(omd.getPackDetailId()) : null);
detail.setUnitCode(omd.getUnitCode());
detail.setUnitName(omd.getUnitName());
detail.setUnitNumber(omd.getUnitNumber());
detail.setMaterialWarehouseControlId(omd.getMaterialWarehouseControlId());
detail.setSerialNumberManage(omd.getSerialNumberManage());
detail.setRemark(omd.getRemark());
materialDetailList.add(detail);
}
handoverTaskOrderPO.setMaterialDetailList(materialDetailList);
}
return handoverTaskOrderPO;
}
/** /**
* @description 分配月台 * @description 分配月台
@@ -541,4 +541,7 @@ public class OutMaterialDetail extends BaseVOEntity {
@ApiModelProperty("出库数量") @ApiModelProperty("出库数量")
@Excel(name = "出库数量") @Excel(name = "出库数量")
private BigDecimal outQuantity; private BigDecimal outQuantity;
@ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)")
private Integer reverseFlag;
} }
@@ -53,8 +53,8 @@ public class OutOrderAbnormal extends BaseVOEntity {
@Excel(name = "拣货作业单号") @Excel(name = "拣货作业单号")
private String outTaskOrderNumber; private String outTaskOrderNumber;
@ApiModelProperty("类型:1-拣货 2-复核") @ApiModelProperty("类型:1-拣货 2-复核 3-反审记录")
@Excel(name = "类型:1-拣货 2-复核") @Excel(name = "类型:1-拣货 2-复核 3-反审记录")
private Integer type; private Integer type;
@ApiModelProperty("计划数量") @ApiModelProperty("计划数量")
@@ -69,8 +69,8 @@ public class OutOrderAbnormal extends BaseVOEntity {
@Excel(name = "异常数量 = 作业数量 - 计划数量") @Excel(name = "异常数量 = 作业数量 - 计划数量")
private BigDecimal abnormalActualQuantity; private BigDecimal abnormalActualQuantity;
@ApiModelProperty("异常类型: 1-拣货异常 2-复核异常") @ApiModelProperty("异常类型: 1-拣货异常 2-复核异常 3-反审记录")
@Excel(name = "异常类型: 1-拣货异常 2-复核异常") @Excel(name = "异常类型: 1-拣货异常 2-复核异常 3-反审记录")
private Integer abnormalType; private Integer abnormalType;
@ApiModelProperty("异常原因") @ApiModelProperty("异常原因")
@@ -53,8 +53,8 @@ public class OutOrderAbnormalPO extends BaseVOEntity {
@Excel(name = "拣货作业单号") @Excel(name = "拣货作业单号")
private String outTaskOrderNumber; private String outTaskOrderNumber;
@ApiModelProperty("类型:1-拣货 2-复核") @ApiModelProperty("类型:1-拣货 2-复核 3-反审记录")
@Excel(name = "类型:1-拣货 2-复核") @Excel(name = "类型:1-拣货 2-复核 3-反审记录")
private Integer type; private Integer type;
@ApiModelProperty("计划数量:拣货异常=分配数量;复核异常=拣货数量") @ApiModelProperty("计划数量:拣货异常=分配数量;复核异常=拣货数量")
@@ -69,8 +69,8 @@ public class OutOrderAbnormalPO extends BaseVOEntity {
@Excel(name = "异常数量 = 作业数量 - 计划数量") @Excel(name = "异常数量 = 作业数量 - 计划数量")
private BigDecimal abnormalActualQuantity; private BigDecimal abnormalActualQuantity;
@ApiModelProperty("异常类型: 1-拣货异常 2-复核异常") @ApiModelProperty("异常类型: 1-拣货异常 2-复核异常 3-反审记录")
@Excel(name = "异常类型: 1-拣货异常 2-复核异常") @Excel(name = "异常类型: 1-拣货异常 2-复核异常 3-反审记录")
private Integer abnormalType; private Integer abnormalType;
@ApiModelProperty("异常原因") @ApiModelProperty("异常原因")
@@ -51,8 +51,8 @@ public class OutOrderAbnormalDO extends BaseVOEntity {
@Excel(name = "拣货作业单号") @Excel(name = "拣货作业单号")
private String outTaskOrderNumber; private String outTaskOrderNumber;
@ApiModelProperty("类型:1-拣货 2-复核") @ApiModelProperty("类型:1-拣货 2-复核 3-反审记录")
@Excel(name = "类型:1-拣货 2-复核") @Excel(name = "类型:1-拣货 2-复核 3-反审记录")
private Integer type; private Integer type;
@ApiModelProperty("计划数量") @ApiModelProperty("计划数量")
@@ -67,8 +67,8 @@ public class OutOrderAbnormalDO extends BaseVOEntity {
@Excel(name = "异常数量 = 作业数量 - 计划数量") @Excel(name = "异常数量 = 作业数量 - 计划数量")
private BigDecimal abnormalActualQuantity; private BigDecimal abnormalActualQuantity;
@ApiModelProperty("异常类型: 1-拣货异常 2-复核异常") @ApiModelProperty("异常类型: 1-拣货异常 2-复核异常 3-反审记录")
@Excel(name = "异常类型: 1-拣货异常 2-复核异常") @Excel(name = "异常类型: 1-拣货异常 2-复核异常 3-反审记录")
private Integer abnormalType; private Integer abnormalType;
@ApiModelProperty("异常原因") @ApiModelProperty("异常原因")
@@ -321,4 +321,7 @@ public class PickingMaterialDetail extends BaseVOEntity {
private String bondInvtNoGw; private String bondInvtNoGw;
private String whNoGw; private String whNoGw;
private String seatNoGw; private String seatNoGw;
@ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)")
private Integer reverseFlag;
} }
@@ -133,4 +133,7 @@ public class PickingOrder extends BaseVOEntity {
private String pushByName; private String pushByName;
@ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)")
private Integer reverseFlag;
} }
@@ -58,6 +58,11 @@ public interface IPickingOrderService extends IService<PickingOrder>
*/ */
public PickingOrderPO getInfoByIdAndType(Long pickingOrderId, Integer type); public PickingOrderPO getInfoByIdAndType(Long pickingOrderId, Integer type);
/**
* @description 根据id和类型获取指定拣货单信息(归档: 已反审软删 del_flag=2, 已反审tab 详情)
*/
public PickingOrderPO getInfoByIdAndTypeReverse(Long pickingOrderId, Integer type);
/** /**
* @description 根据单号和类型获取指定拣货单信息 * @description 根据单号和类型获取指定拣货单信息
@@ -25,12 +25,22 @@ public interface PickingOrderMapper extends BaseMapper<PickingOrder>
*/ */
public PickingOrderPO queryOutOrderById(Long pickingOrderId); public PickingOrderPO queryOutOrderById(Long pickingOrderId);
/**
* 根据Id关联出库单查询(归档: 已反审软删 del_flag=2, 已反审tab 详情)
*/
public PickingOrderPO queryOutOrderByIdReverse(Long pickingOrderId);
/** /**
* 根据Id关联波次单查询 * 根据Id关联波次单查询
*/ */
public PickingOrderPO queryWaveOrderById(Long pickingOrderId); public PickingOrderPO queryWaveOrderById(Long pickingOrderId);
/**
* 根据Id关联波次单查询(归档: 已反审软删 del_flag=2)
*/
public PickingOrderPO queryWaveOrderByIdReverse(Long pickingOrderId);
/** /**
* 根据单号关联出库单查询 * 根据单号关联出库单查询
*/ */
@@ -146,6 +146,23 @@ public class PickingOrderImpl extends ServiceImpl<PickingOrderMapper, PickingOrd
return pickingOrderPO; return pickingOrderPO;
} }
/**
* 归档(已反审): del_flag=2 查软删的拣货单, 已反审tab 详情
*/
@Override
public PickingOrderPO getInfoByIdAndTypeReverse(Long pickingOrderId, Integer type) {
PickingOrderPO pickingOrderPO = null;
if (type == 1){
pickingOrderPO = pickingOrderMapper.queryOutOrderByIdReverse(pickingOrderId);
}else {
pickingOrderPO = pickingOrderMapper.queryWaveOrderByIdReverse(pickingOrderId);
}
if (pickingOrderPO == null){
throw new ServiceException("拣货单不存在");
}
return pickingOrderPO;
}
/** /**
* @description 根据单号和类型获取指定拣货单信息 * @description 根据单号和类型获取指定拣货单信息
* @author ZhouGY * @author ZhouGY
@@ -171,4 +171,7 @@ public class PickingOrderPO extends StockOutOrderBasePO {
private String specificationModel; private String specificationModel;
@ApiModelProperty("货物类型 0-物料 1-半成品 2-成品") @ApiModelProperty("货物类型 0-物料 1-半成品 2-成品")
private Integer goodsType; private Integer goodsType;
@ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)")
private Integer reverseFlag;
} }
@@ -228,4 +228,7 @@ public class PickingOrderDO extends BaseVOEntity {
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTimeTo; private Date createTimeTo;
@ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)")
private Integer reverseFlag;
} }
@@ -312,6 +312,34 @@ public class PickingOrderDomainService {
return pickingOrderPO; return pickingOrderPO;
} }
/**
* 获取拣货单归档详情(已反审): 反审时拣货单/拣货明细均已软删(del_flag=2),
* 主表走 Reverse 查询(del_flag=2), 明细通过 DO.delFlag=2 查归档数据,
* 供拣货单已反审tab 查看详情
*/
public PickingOrderPO getReverseInfoByIdAndType(Long pickingOrderId, Integer type) {
PickingOrderPO pickingOrderPO = pickingOrderService.getInfoByIdAndTypeReverse(pickingOrderId, type);
if (pickingOrderPO == null) {
throw new ServiceException("拣货单不存在");
}
PickingMaterialDetailDO pickingMaterialDetailDO = new PickingMaterialDetailDO();
pickingMaterialDetailDO.setPickingOrderNumber(pickingOrderPO.getPickingOrderNumber());
pickingMaterialDetailDO.setDelFlag(2);
List<PickingMaterialDetailPO> pickingMaterialDetailPOList = pickingMaterialDetailService.queryList(pickingMaterialDetailDO);
for (PickingMaterialDetailPO pickingMaterialDetailPO : pickingMaterialDetailPOList) {
Long materialBaseInfoId = pickingMaterialDetailPO.getMaterialBaseInfoId();
MaterialBaseInfo materialBaseInfo = materialBaseInfoMapper.selectById(materialBaseInfoId);
if(materialBaseInfo!=null){
pickingMaterialDetailPO.setMaterialCode(materialBaseInfo.getMaterialCode());
pickingMaterialDetailPO.setMaterialName(materialBaseInfo.getMaterialName());
pickingMaterialDetailPO.setCopyCode(materialBaseInfo.getCopyCode());
}
}
copyCodeReferenceDomainService.fillWeightListOnPickingMaterialDetails(pickingMaterialDetailPOList);
pickingOrderPO.setMaterialDetailList(pickingMaterialDetailPOList);
return pickingOrderPO;
}
/** /**
* @description 整单下发 * @description 整单下发
* @author ZhouGY * @author ZhouGY
@@ -120,4 +120,7 @@ public class ReviewMaterialDetail extends BaseVOEntity {
@ApiModelProperty("包装详情id") @ApiModelProperty("包装详情id")
@Excel(name = "包装详情id") @Excel(name = "包装详情id")
private String packDetailId; private String packDetailId;
@ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)")
private Integer reverseFlag;
} }
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.mhd.common.core.web.domain.BaseVOEntity; import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.util.Date; import java.util.Date;
@@ -58,4 +59,7 @@ public class ReviewOrder extends BaseVOEntity {
private Date receiveTime; private Date receiveTime;
private String remark; private String remark;
@ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)")
private Integer reverseFlag;
} }
@@ -24,6 +24,16 @@ public interface ReviewOrderMapper extends BaseMapper<ReviewOrder> {
*/ */
ReviewOrderPO selectHeaderByReviewOrderId(@Param("reviewOrderId") Long reviewOrderId); ReviewOrderPO selectHeaderByReviewOrderId(@Param("reviewOrderId") Long reviewOrderId);
/**
* 详情-主表按主键归档: 已反审软删 del_flag=2已反审tab 详情
*/
ReviewOrderPO selectHeaderByReviewOrderIdReverse(@Param("reviewOrderId") Long reviewOrderId);
/**
* 详情-明细行按复核单主键归档: 已反审软删 del_flag=2
*/
List<ReviewMaterialDetailPO> queryDetailByReviewOrderIdReverse(@Param("reviewOrderId") Long reviewOrderId);
/** /**
* 详情-主表按复核单号 * 详情-主表按复核单号
*/ */
@@ -106,4 +106,7 @@ public class ReviewOrderPO extends BaseVOEntity {
/** 详情与上架单一致:头字段扁平 + 明细列表 */ /** 详情与上架单一致:头字段扁平 + 明细列表 */
@ApiModelProperty("复核明细") @ApiModelProperty("复核明细")
private List<ReviewMaterialDetailPO> materialDetailList; private List<ReviewMaterialDetailPO> materialDetailList;
@ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)")
private Integer reverseFlag;
} }
@@ -86,4 +86,7 @@ public class ReviewOrderDO extends BaseVOEntity {
*/ */
@ApiModelProperty("仅已接收:1-是(receive_time 非空)") @ApiModelProperty("仅已接收:1-是(receive_time 非空)")
private Integer onlyReceived; private Integer onlyReceived;
@ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)")
private Integer reverseFlag;
} }
@@ -461,4 +461,7 @@ public class StockOutOrder extends BaseVOEntity {
@ApiModelProperty("签名备注") @ApiModelProperty("签名备注")
private String signatureRemark; private String signatureRemark;
@ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)")
private Integer reverseFlag;
} }
@@ -497,4 +497,7 @@ public class StockOutOrderPO extends BaseVOEntity {
@ApiModelProperty("签名备注") @ApiModelProperty("签名备注")
private String signatureRemark; private String signatureRemark;
@ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)")
private Integer reverseFlag;
} }
@@ -538,4 +538,7 @@ public class StockOutOrderDO extends BaseVOEntity {
/** PDA出库签名列表专用:作业任务人员模糊查询字段 */ /** PDA出库签名列表专用:作业任务人员模糊查询字段 */
@ApiModelProperty("作业任务人员模糊查询") @ApiModelProperty("作业任务人员模糊查询")
private String workUserNameLike; private String workUserNameLike;
@ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)")
private Integer reverseFlag;
} }
@@ -48,6 +48,7 @@ import com.mhd.wms.domain.materialInventory.entity.MaterialInventory;
import com.mhd.wms.domain.materialInventory.repository.facade.IMaterialInventoryService; import com.mhd.wms.domain.materialInventory.repository.facade.IMaterialInventoryService;
import com.mhd.wms.domain.materialInventory.repository.mapper.MaterialInventoryMapper; import com.mhd.wms.domain.materialInventory.repository.mapper.MaterialInventoryMapper;
import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryPO; import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryPO;
import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryParamDO;
import com.mhd.wms.domain.materialMoreDetail.repository.po.MaterialMoreDetailPO; import com.mhd.wms.domain.materialMoreDetail.repository.po.MaterialMoreDetailPO;
import com.mhd.wms.domain.materialWarehouseControl.repository.facade.IMaterialWarehouseControlService; import com.mhd.wms.domain.materialWarehouseControl.repository.facade.IMaterialWarehouseControlService;
import com.mhd.wms.domain.materialWarehouseControl.repository.po.MaterialWarehouseControlPO; import com.mhd.wms.domain.materialWarehouseControl.repository.po.MaterialWarehouseControlPO;
@@ -63,6 +64,7 @@ import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO;
import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailBaseDO; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailBaseDO;
import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO;
import com.mhd.wms.domain.outOrderAbnormal.repository.facade.IOutOrderAbnormalService; import com.mhd.wms.domain.outOrderAbnormal.repository.facade.IOutOrderAbnormalService;
import com.mhd.wms.domain.outOrderAbnormal.entity.OutOrderAbnormal;
import com.mhd.wms.domain.outOrderAbnormal.repository.todo.OutOrderAbnormalBaseDO; import com.mhd.wms.domain.outOrderAbnormal.repository.todo.OutOrderAbnormalBaseDO;
import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail; import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail;
import com.mhd.wms.domain.pickingMaterialDetail.repository.facade.IPickingMaterialDetailService; import com.mhd.wms.domain.pickingMaterialDetail.repository.facade.IPickingMaterialDetailService;
@@ -888,6 +890,34 @@ public class StockOutOrderDomainService {
return stockOutOrderPO; return stockOutOrderPO;
} }
/**
* 获取出库单归档详情(已反审): 出库单反审时主表/明细均已软删(del_flag=2),
* 主表 getInfo getById 不滤 del_flag, 明细通过 DO.delFlag=2 查归档数据
* (out_material_detail queryList XML 支持 delFlag 参数), 已反审tab 查看详情
*/
public StockOutOrderPO getReverseInfoChildren(Long outOrderId) {
StockOutOrderPO stockOutOrderPO = stockOutOrderService.getInfo(outOrderId);
if (stockOutOrderPO == null || stockOutOrderPO.getOutOrderNumber() == null) {
throw new ServiceException("出库单不存在");
}
OutMaterialDetailDO outMaterialDetailDO = new OutMaterialDetailDO();
outMaterialDetailDO.setOutOrderNumber(stockOutOrderPO.getOutOrderNumber());
outMaterialDetailDO.setDelFlag(2);
List<OutMaterialDetailPO> materialDetailPOList = outMaterialDetailService.queryListChildren(outMaterialDetailDO);
for (OutMaterialDetailPO outMaterialDetailPO : materialDetailPOList) {
String materialNo = outMaterialDetailPO.getMaterialNo();
List<MaterialBaseInfo> materialBaseInfos = materialBaseInfoMapper.selectList(new QueryWrapper<MaterialBaseInfo>().lambda().eq(MaterialBaseInfo::getMaterialCode, materialNo));
if (!CollectionUtils.isEmpty(materialBaseInfos) && materialBaseInfos.size() > 0) {
outMaterialDetailPO.setCommodityName(materialBaseInfos.get(0).getMaterialName());
outMaterialDetailPO.setMaterialCode(materialBaseInfos.get(0).getMaterialCode());
outMaterialDetailPO.setMaterialName(materialBaseInfos.get(0).getMaterialName());
outMaterialDetailPO.setCopyCode(materialBaseInfos.get(0).getCopyCode());
}
}
stockOutOrderPO.setMaterialDetailList(materialDetailPOList);
return stockOutOrderPO;
}
/** /**
* 获取出库单详细信息PDA复核管理查询详情 * 获取出库单详细信息PDA复核管理查询详情
* 复核场景下与PC端getCheckInfo保持一致返回拣货下发时的完整数据树形结构拣货汇总批次属性等 * 复核场景下与PC端getCheckInfo保持一致返回拣货下发时的完整数据树形结构拣货汇总批次属性等
@@ -2625,6 +2655,191 @@ public class StockOutOrderDomainService {
} }
} }
/**
* @description oms出库执行单反审(业务单反审时逐执行单调用; 业务单侧仅允许"已审核未出库"单据反审):
* 按WMS出库单状态分支还原库存:
* 1.未出库(状态非9, 常规场景): 还原分配占用(可用+冻结-, cancelExecutionOrder 取消分配同口径),
* 不动实物库存不推OMS实物未被扣减, 加回会虚增库存; 软删库存调整记录
* 2.已出库(状态9, 防御分支, 业务单侧已拦截): 镜像交接扣减 doStockOutDeduct(实物/可用加回, 冻结不动),
* 生成库存调整记录出库反审 omsEdit 推送还原OMS预约库存
* 3.逻辑删除出库链路单据(软删+reverseFlag=1, 划归已反审tab): 配送明细/出库明细/出库单/拣货单及明细/复核单及明细/交接作业单
* 4.生成1条出库异常记录反审记录(abnormalType=3), 单号前缀 FSYC, 供记录跟踪
* 反审原因经入参 remark 透传(OMS侧拼接业务单号+反审原因)
* @date 2026/9/8
*/
@Transactional(rollbackFor = Exception.class)
public void reverseExecutionOrder(StockOutOrder stockOutOrder) {
String outOrderNumber = stockOutOrder.getOutOrderNumber();
StockOutOrder stockOutOrderDB = stockOutOrderService.getOne(new LambdaQueryWrapper<StockOutOrder>()
.eq(StockOutOrder::getOutOrderNumber, outOrderNumber)
.eq(StockOutOrder::getDelFlag, 1));
if (stockOutOrderDB == null) {
// 幂等: OMS普通下发生成的执行单不推WMS(执行并下发才推), WMS无此单属正常场景,
// 直接返回成功(无数据可清), 由OMS侧完成OMS侧清理与入库侧反审"WMS无数据时幂等成功"同口径
log.info("出库反审幂等:WMS无活动出库单[{}],无需清理", outOrderNumber);
return;
}
// OMS经Feign调用时可能无登录上下文(SecurityUtils会抛异常), 容错获取, 兜底用出库单创建人
LoginUser loginUser;
try {
loginUser = SecurityUtils.getLoginUser();
} catch (Exception e) {
loginUser = new LoginUser();
loginUser.setUserid(stockOutOrderDB.getCreateBy() != null ? stockOutOrderDB.getCreateBy() : 0L);
loginUser.setUsername(stockOutOrderDB.getCreateByName() != null ? stockOutOrderDB.getCreateByName() : "system");
}
String reverseRemark = stockOutOrder.getRemark();
//逻辑删除配送明细(所有清理路径统一先清, cancelExecutionOrder 一致)
deliveryDetailsLinkService.update(new UpdateWrapper<com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink>().lambda()
.set(com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink::getDelFlag, 2)
.eq(com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink::getOrderNumber, outOrderNumber)
.eq(com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink::getDelFlag, 1));
List<OutMaterialDetail> materialDetails = outMaterialDetailService.list(new LambdaQueryWrapper<OutMaterialDetail>()
.eq(OutMaterialDetail::getOutOrderNumber, outOrderNumber)
.eq(OutMaterialDetail::getDelFlag, 1));
// 出库/未出库分支: 未出库单据(WMS状态非9)实物库存未被扣减, 只还原分配占用(可用+冻结-),
// 不做实物还原也不推OMS否则会虚增库存; 已出库(9)分支还原实物并推OMS(防御保留, 业务单反审已拦截已出库单)
boolean shipped = stockOutOrderDB.getStatus() != null && stockOutOrderDB.getStatus() == 9;
for (OutMaterialDetail materialDetail : materialDetails) {
MaterialInventory materialInventory = materialInventoryMapper.selectById(materialDetail.getMaterialInventoryId());
if (!shipped) {
// ===== 未出库: 还原分配占用( cancelExecutionOrder 的取消分配同口径) =====
BigDecimal allocationQuantity = materialDetail.getAllocationQuantity();
if (materialInventory != null && allocationQuantity != null && allocationQuantity.compareTo(BigDecimal.ZERO) > 0) {
materialInventory.setAllocationQuantity((materialInventory.getAllocationQuantity() == null ? BigDecimal.ZERO : materialInventory.getAllocationQuantity()).add(allocationQuantity));
materialInventory.setFreezeQuantity((materialInventory.getFreezeQuantity() == null ? BigDecimal.ZERO : materialInventory.getFreezeQuantity()).subtract(allocationQuantity));
materialInventory.setUpdateTime(new Date());
materialInventoryMapper.updateById(materialInventory);
}
//逻辑删除库存调整记录
Long uniqueId = materialDetail.getUniqueId();
String relateNo = outOrderNumber + "#" + uniqueId;
inventoryAdjustmentRecordService.update(new InventoryAdjustmentRecord(), new LambdaUpdateWrapper<InventoryAdjustmentRecord>()
.set(InventoryAdjustmentRecord::getDelFlag, 2)
.eq(InventoryAdjustmentRecord::getRelateNo, relateNo));
} else {
// ===== 已出库: 还原实物库存并推送OMS(防御分支) =====
//还原数量与交接扣减一致: 需复核取复核数量, 否则取拣货数量(为空取计划数量), doStockOutDeduct
BigDecimal effectiveQuantity = Integer.valueOf(1).equals(stockOutOrderDB.getReview())
? materialDetail.getCheckQuantity()
: (materialDetail.getPickingQuantity() != null ? materialDetail.getPickingQuantity() : materialDetail.getQuantity());
Long materialInventoryId = materialDetail.getMaterialInventoryId();
if (materialInventoryId == null || effectiveQuantity == null || effectiveQuantity.compareTo(BigDecimal.ZERO) <= 0) {
//无可还原库存(未交接或漏传), 仍继续清理单据
materialDetail.setDelFlag(2);
materialDetail.setReverseFlag(1);
outMaterialDetailService.updateById(materialDetail);
continue;
}
if (materialInventory != null && !"yang_pin_chu_ku".equals(stockOutOrderDB.getBusinessType())) {
//样品出库交接不扣库存( doStockOutDeduct 一致), 反审同样跳过还原
BigDecimal area = materialDetail.getCheckArea() != null ? materialDetail.getCheckArea() : BigDecimal.ZERO;
BigDecimal volume = materialDetail.getCheckVolume() != null ? materialDetail.getCheckVolume() : BigDecimal.ZERO;
BigDecimal grossWeight = materialDetail.getCheckGrossWeight() != null ? materialDetail.getCheckGrossWeight() : BigDecimal.ZERO;
BigDecimal netWeight = materialDetail.getCheckNetWeight() != null ? materialDetail.getCheckNetWeight() : BigDecimal.ZERO;
MaterialInventoryParamDO restoreParam = new MaterialInventoryParamDO();
restoreParam.setMaterialInventoryId(materialInventoryId);
restoreParam.setMaterialBaseInfoId(materialInventory.getMaterialBaseInfoId());
restoreParam.setOrganizationId(materialInventory.getOrganizationId());
restoreParam.setOrganizationName(materialInventory.getOrganizationName());
restoreParam.setTopOrganizationId(materialInventory.getTopOrganizationId());
restoreParam.setWarehouseId(materialInventory.getWarehouseId());
restoreParam.setWarehouseCode(materialInventory.getWarehouseCode());
restoreParam.setWarehouseName(materialInventory.getWarehouseName());
restoreParam.setQuantity(effectiveQuantity);
restoreParam.setArea(area);
restoreParam.setVolume(volume);
restoreParam.setGrossWeight(grossWeight);
restoreParam.setNetWeight(netWeight);
restoreParam.setLotNumber(materialInventory.getLotNumber());
restoreParam.setBatchNumber(materialInventory.getBatchNumber());
restoreParam.setInOrderNumber(materialInventory.getInOrderNumber());
restoreParam.setProductionDate(materialInventory.getProductionDate());
restoreParam.setExpiryDate(materialInventory.getExpiryDate());
//库存调整记录出库反审(kctzjl 内部取调整前快照, 与交接扣减先记录后改库存的顺序一致)
restoreParam.setRelateNo(outOrderNumber + "#" + materialDetail.getUniqueId());
materialInventoryService.kctzjl(restoreParam, "出库反审", loginUser);
//type=1 上架还原: 实物库存/可用数量加回, 冻结数量不动
restoreParam.setType("1");
materialInventoryService.xgkc(restoreParam);
//推送OMS还原预约库存(type=1: OMS侧实物/可用加回, 与交接 omsEdit 扣减互逆)
MaterialInventoryOmsParamDO omsParam = new MaterialInventoryOmsParamDO();
BeanUtils.copyProperties(restoreParam, omsParam);
omsParam.setKctzType("出库反审");
omsParam.setLoginUser(loginUser);
omsServiceFeign.omsEdit(omsParam);
}
}
//逻辑删除出库单明细
materialDetail.setDelFlag(2);
materialDetail.setReverseFlag(1);
outMaterialDetailService.updateById(materialDetail);
}
//逻辑删除出库单(用按单号查出的DB对象更新: 传入对象无主键, 直接updateById不生效, cancelExecutionOrder 一致)
stockOutOrderDB.setDelFlag(2);
stockOutOrderDB.setReverseFlag(1);
stockOutOrderService.updateById(stockOutOrderDB);
//逻辑删除拣货单及拣货明细
PickingOrder pickingOrder = pickingOrderService.getOne(new LambdaQueryWrapper<PickingOrder>()
.eq(PickingOrder::getDelFlag, 1)
.eq(PickingOrder::getOrderNumber, outOrderNumber));
if (pickingOrder != null) {
String pickingOrderNumber = pickingOrder.getPickingOrderNumber();
List<PickingMaterialDetail> pickingDetails = pickingMaterialDetailService.list(new LambdaQueryWrapper<PickingMaterialDetail>()
.eq(PickingMaterialDetail::getPickingOrderNumber, pickingOrderNumber)
.eq(PickingMaterialDetail::getDelFlag, 1));
for (PickingMaterialDetail pickingMaterialDetail : pickingDetails) {
pickingMaterialDetail.setDelFlag(2);
pickingMaterialDetail.setReverseFlag(1);
pickingMaterialDetailService.updateById(pickingMaterialDetail);
}
pickingOrder.setDelFlag(2);
pickingOrder.setReverseFlag(1);
pickingOrderService.updateById(pickingOrder);
}
//逻辑删除复核单及复核明细(已复核单据反审时存在)
List<ReviewOrder> reviewOrders = reviewOrderMapper.selectList(new LambdaQueryWrapper<ReviewOrder>()
.eq(ReviewOrder::getDelFlag, 1)
.eq(ReviewOrder::getOutOrderNumber, outOrderNumber));
for (ReviewOrder reviewOrder : reviewOrders) {
reviewMaterialDetailMapper.update(null, new LambdaUpdateWrapper<ReviewMaterialDetail>()
.set(ReviewMaterialDetail::getDelFlag, 2)
.set(ReviewMaterialDetail::getReverseFlag, 1)
.eq(ReviewMaterialDetail::getReviewOrderId, reviewOrder.getReviewOrderId())
.eq(ReviewMaterialDetail::getDelFlag, 1));
reviewOrder.setDelFlag(2);
reviewOrder.setReverseFlag(1);
reviewOrderMapper.updateById(reviewOrder);
}
//逻辑删除交接作业单(不需复核单据出库完成时生成)
List<HandoverTaskOrder> handoverTaskOrders = handoverTaskOrderService.list(new LambdaQueryWrapper<HandoverTaskOrder>()
.eq(HandoverTaskOrder::getDelFlag, 1)
.eq(HandoverTaskOrder::getOrderNumber, outOrderNumber));
for (HandoverTaskOrder handoverTaskOrder : handoverTaskOrders) {
handoverTaskOrder.setDelFlag(2);
handoverTaskOrder.setReverseFlag(1);
handoverTaskOrderService.updateById(handoverTaskOrder);
}
//生成1条出库异常记录反审记录, 供记录跟踪
OutOrderAbnormal reverseAbnormal = new OutOrderAbnormal();
reverseAbnormal.setOrganizationId(stockOutOrderDB.getOrganizationId());
reverseAbnormal.setOrganizationName(stockOutOrderDB.getOrganizationName());
reverseAbnormal.setTopOrganizationId(stockOutOrderDB.getTopOrganizationId());
reverseAbnormal.setAbnormalNumber(OrderSequence.getOrderCode("FSYC"));
reverseAbnormal.setOutOrderNumber(outOrderNumber);
reverseAbnormal.setType(3);
reverseAbnormal.setAbnormalType(3);
reverseAbnormal.setQuantity(stockOutOrderDB.getQuantity());
reverseAbnormal.setActualQuantity(stockOutOrderDB.getPickingQuantity());
reverseAbnormal.setAbnormalActualQuantity(BigDecimal.ZERO);
reverseAbnormal.setAbnormalReason("出库单反审");
reverseAbnormal.setRemark(reverseRemark);
reverseAbnormal.setCreateBy(loginUser.getUserid());
reverseAbnormal.setCreateByName(loginUser.getUsername());
reverseAbnormal.setCreateTime(new Date());
outOrderAbnormalService.save(reverseAbnormal);
}
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void omsOrderAddDetail(List<OutMaterialDetail> outMaterialDetails) { public void omsOrderAddDetail(List<OutMaterialDetail> outMaterialDetails) {
if (CollectionUtils.isEmpty(outMaterialDetails)) { if (CollectionUtils.isEmpty(outMaterialDetails)) {
@@ -174,4 +174,7 @@ public class HandoverTaskOrderDTO extends BaseVOEntity {
private String pictureApp; private String pictureApp;
private String billingJson; private String billingJson;
@ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)")
private Integer reverseFlag;
} }
@@ -50,8 +50,8 @@ public class OutOrderAbnormalDTO extends BaseVOEntity {
@Excel(name = "拣货作业单号") @Excel(name = "拣货作业单号")
private String outTaskOrderNumber; private String outTaskOrderNumber;
@ApiModelProperty("类型:1-拣货 2-复核") @ApiModelProperty("类型:1-拣货 2-复核 3-反审记录")
@Excel(name = "类型:1-拣货 2-复核") @Excel(name = "类型:1-拣货 2-复核 3-反审记录")
private Integer type; private Integer type;
@ApiModelProperty("计划数量") @ApiModelProperty("计划数量")
@@ -66,8 +66,8 @@ public class OutOrderAbnormalDTO extends BaseVOEntity {
@Excel(name = "异常数量 = 作业数量 - 计划数量") @Excel(name = "异常数量 = 作业数量 - 计划数量")
private BigDecimal abnormalActualQuantity; private BigDecimal abnormalActualQuantity;
@ApiModelProperty("异常类型: 1-拣货异常 2-复核异常") @ApiModelProperty("异常类型: 1-拣货异常 2-复核异常 3-反审记录")
@Excel(name = "异常类型: 1-拣货异常 2-复核异常") @Excel(name = "异常类型: 1-拣货异常 2-复核异常 3-反审记录")
private Integer abnormalType; private Integer abnormalType;
@ApiModelProperty("异常原因") @ApiModelProperty("异常原因")
@@ -196,4 +196,7 @@ public class PickingOrderDTO extends BaseVOEntity {
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTimeTo; private Date createTimeTo;
@ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)")
private Integer reverseFlag;
} }
@@ -86,4 +86,7 @@ public class ReviewOrderDTO extends BaseVOEntity {
private Integer tabType; private Integer tabType;
@ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)")
private Integer reverseFlag;
} }
@@ -513,4 +513,7 @@ public class StockOutOrderDTO extends StockOutOrderBaseDTO {
/** PDA出库签名列表专用:作业任务人员模糊查询字段 */ /** PDA出库签名列表专用:作业任务人员模糊查询字段 */
@ApiModelProperty("作业任务人员(模糊查询)") @ApiModelProperty("作业任务人员(模糊查询)")
private String workUserNameLike; private String workUserNameLike;
@ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)")
private Integer reverseFlag;
} }
@@ -92,6 +92,16 @@ public class HandoverTaskOrderApi extends BaseController {
return AjaxResult.success(handoverTaskOrderApplicationService.getInfo(outTaskOrderId)); return AjaxResult.success(handoverTaskOrderApplicationService.getInfo(outTaskOrderId));
} }
/**
* 获取交接作业单归档详情(已反审): 反审时交接单已软删(del_flag=2), 已反审tab 查看归档详情
*/
@ApiOperation("获取交接作业单归档详情(已反审)")
@GetMapping(value = "/getReverseInfo/{outTaskOrderId}")
public AjaxResult getReverseInfo(@PathVariable("outTaskOrderId") Long outTaskOrderId)
{
return AjaxResult.success(handoverTaskOrderApplicationService.getReverseInfo(outTaskOrderId));
}
@ApiOperation("分配月台") @ApiOperation("分配月台")
@PostMapping("/allocationPlatform") @PostMapping("/allocationPlatform")
@@ -80,6 +80,15 @@ public class PickingOrderApi extends BaseController {
return AjaxResult.success(pickingOrderApplicationService.getInfoByIdAndType(pickingOrderId, type)); return AjaxResult.success(pickingOrderApplicationService.getInfoByIdAndType(pickingOrderId, type));
} }
/**
* 获取拣货单归档详情(已反审): 反审时拣货单已软删(del_flag=2), 已反审tab 查看归档详情
*/
@ApiOperation("获取拣货单归档详情(已反审)")
@GetMapping(value = "/getReverseInfoByIdAndType/{pickingOrderId}/{type}")
public AjaxResult getReverseInfoByIdAndType(@PathVariable("pickingOrderId") Long pickingOrderId, @PathVariable("type") Integer type) {
return AjaxResult.success(pickingOrderApplicationService.getReverseInfoByIdAndType(pickingOrderId, type));
}
@ApiOperation("整单下发") @ApiOperation("整单下发")
@PostMapping("/allDistribution") @PostMapping("/allDistribution")
@@ -52,6 +52,15 @@ public class ReviewOrderApi extends BaseController {
return AjaxResult.success(reviewOrderApplicationService.getDetailByReviewOrderId(reviewOrderId)); return AjaxResult.success(reviewOrderApplicationService.getDetailByReviewOrderId(reviewOrderId));
} }
/**
* 获取复核单归档详情(已反审): 反审时复核单已软删(del_flag=2), 已反审tab 查看归档详情
*/
@ApiOperation("获取复核单归档详情(已反审)")
@GetMapping(value = "/getReverseInfo/{reviewOrderId}")
public AjaxResult getReverseInfo(@PathVariable("reviewOrderId") Long reviewOrderId) {
return AjaxResult.success(reviewOrderApplicationService.getReverseDetailByReviewOrderId(reviewOrderId));
}
@ApiOperation("根据复核单号获取复核单详情") @ApiOperation("根据复核单号获取复核单详情")
@GetMapping(value = "/getInfoReviewOrderNumber") @GetMapping(value = "/getInfoReviewOrderNumber")
public AjaxResult getInfoReviewOrderNumber(@RequestParam("reviewOrderNumber") String reviewOrderNumber) { public AjaxResult getInfoReviewOrderNumber(@RequestParam("reviewOrderNumber") String reviewOrderNumber) {
@@ -200,6 +200,16 @@ public class StockOutOrderApi extends BaseController {
return AjaxResult.success(stockOutOrderApplicationService.getInfoChildren(outOrderId)); return AjaxResult.success(stockOutOrderApplicationService.getInfoChildren(outOrderId));
} }
/**
* 获取出库单归档详情(已反审): 反审时单据已软删(del_flag=2), 常规详情查不到,
* 本接口不滤主表 del_flag 且明细查 del_flag=2 归档数据, 已反审tab 使用
*/
@ApiOperation("获取出库单归档详情(已反审)")
@GetMapping(value = "/getReverseInfo/{outOrderId}")
public AjaxResult getReverseInfo(@PathVariable("outOrderId") Long outOrderId) {
return AjaxResult.success(stockOutOrderApplicationService.getReverseInfoChildren(outOrderId));
}
/** /**
* 根据出库单号获取出库单详细信息 * 根据出库单号获取出库单详细信息
*/ */
@@ -561,6 +571,17 @@ public class StockOutOrderApi extends BaseController {
return AjaxResult.success(); return AjaxResult.success();
} }
/**
* oms出库执行单反审(已出库单据回退): 还原实物库存并推送OMS
* 逻辑删除出库单/明细/拣货/复核/交接/配送链路数据生成出库异常记录反审记录
*/
@ApiOperation("oms出库执行单反审")
@PostMapping(value = "/omsReverseExecutionOrder")
public AjaxResult omsReverseExecutionOrder(@RequestBody StockOutOrder stockOutOrder) {
stockOutOrderApplicationService.reverseExecutionOrder(stockOutOrder);
return AjaxResult.success();
}
/** /**
* oms下发单配送明细保存 * oms下发单配送明细保存
*/ */
@@ -39,6 +39,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="updateBy" column="update_by" /> <result property="updateBy" column="update_by" />
<result property="updateByName" column="update_by_name" /> <result property="updateByName" column="update_by_name" />
<result property="delFlag" column="del_flag" /> <result property="delFlag" column="del_flag" />
<result property="reverseFlag" column="reverse_flag" />
<result property="pictureApp" column="picture_app" /> <result property="pictureApp" column="picture_app" />
<result property="billingJson" column="billing_json" /> <result property="billingJson" column="billing_json" />
</resultMap> </resultMap>
@@ -49,7 +50,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
a.platform_code, a.platform_name, a.platform_use_time_id, a.platform_use_start_time, a.platform_use_end_time, a.platform_use_status, a.platform_code, a.platform_name, a.platform_use_time_id, a.platform_use_start_time, a.platform_use_end_time, a.platform_use_status,
a.order_type_code, a.order_type_name, a.expect_time, a.warehouse_id, a.warehouse_code, a.warehouse_name, a.shipper_id, a.order_type_code, a.order_type_name, a.expect_time, a.warehouse_id, a.warehouse_code, a.warehouse_name, a.shipper_id,
a.shipper_name, a.order_number, a.picking_order_number, a.remark, a.task_distribution, a.task_distribution_time, a.create_time, a.create_by, a.create_by_name, a.update_time, a.shipper_name, a.order_number, a.picking_order_number, a.remark, a.task_distribution, a.task_distribution_time, a.create_time, a.create_by, a.create_by_name, a.update_time,
a.update_by, a.update_by_name, a.del_flag, a.picture_app,a.billing_json a.update_by, a.update_by_name, a.del_flag, a.reverse_flag, a.picture_app,a.billing_json
</sql> </sql>
<sql id="selectHandoverTaskOrderPo1"> <sql id="selectHandoverTaskOrderPo1">
@@ -138,6 +139,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<when test="delFlag != null"> and a.del_flag = #{delFlag} </when> <when test="delFlag != null"> and a.del_flag = #{delFlag} </when>
<otherwise> and a.del_flag = 1 </otherwise> <otherwise> and a.del_flag = 1 </otherwise>
</choose> </choose>
<!-- 反审标记查询: 【已反审】tab 前端传 delFlag=2 + reverseFlag=1 -->
<if test="reverseFlag != null"> and a.reverse_flag = #{reverseFlag} </if>
</sql> </sql>
<select id="queryList" parameterType="com.mhd.wms.domain.handoverTaskOrder.repository.todo.HandoverTaskOrderDO" resultMap="HandoverTaskOrderResult"> <select id="queryList" parameterType="com.mhd.wms.domain.handoverTaskOrder.repository.todo.HandoverTaskOrderDO" resultMap="HandoverTaskOrderResult">
@@ -26,6 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="updateBy" column="update_by" /> <result property="updateBy" column="update_by" />
<result property="updateByName" column="update_by_name" /> <result property="updateByName" column="update_by_name" />
<result property="delFlag" column="del_flag" /> <result property="delFlag" column="del_flag" />
<result property="reverseFlag" column="reverse_flag" />
<result property="outOrderNumber" column="out_order_number" /> <result property="outOrderNumber" column="out_order_number" />
<result property="businessOrderNo" column="business_order_no" /> <result property="businessOrderNo" column="business_order_no" />
<result property="orderTypeCode" column="order_type_code" /> <result property="orderTypeCode" column="order_type_code" />
@@ -47,7 +48,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
a.status, a.type, a.warehouse_id, a.warehouse_code, a.warehouse_name, a.shipper_id, a.shipper_name, a.quantity, a.weight_limit, a.volume_limit, a.material_quantity, a.status, a.type, a.warehouse_id, a.warehouse_code, a.warehouse_name, a.shipper_id, a.shipper_name, a.quantity, a.weight_limit, a.volume_limit, a.material_quantity,
IFNULL((SELECT SUM(b.picking_quantity) FROM picking_material_detail b WHERE b.picking_order_number = a.picking_order_number AND b.del_flag = 1), 0) AS picking_quantity, IFNULL((SELECT SUM(b.picking_quantity) FROM picking_material_detail b WHERE b.picking_order_number = a.picking_order_number AND b.del_flag = 1), 0) AS picking_quantity,
a.picking_material_quantity, a.abnormal, a.task_distribution, a.remark, a.create_time, a.create_by, a.create_by_name, a.update_time,b.out_order_id, a.picking_material_quantity, a.abnormal, a.task_distribution, a.remark, a.create_time, a.create_by, a.create_by_name, a.update_time,b.out_order_id,
a.update_by, a.update_by_name, a.del_flag,a.out_order_number, a.business_order_no, a.order_type_code, a.order_type_name, a.priority_level_code, a.priority_level_name a.update_by, a.update_by_name, a.del_flag, a.reverse_flag, a.out_order_number, a.business_order_no, a.order_type_code, a.order_type_name, a.priority_level_code, a.priority_level_name
,a.push_status,a.push_time,a.push_by,a.push_by_name, ,a.push_status,a.push_time,a.push_by,a.push_by_name,
(SELECT m.goods_type FROM PICKING_MATERIAL_DETAIL d (SELECT m.goods_type FROM PICKING_MATERIAL_DETAIL d
JOIN material_base_info m ON d.material_base_info_id = m.material_base_info_id JOIN material_base_info m ON d.material_base_info_id = m.material_base_info_id
@@ -120,6 +121,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<when test="delFlag != null"> and a.del_flag = #{delFlag} </when> <when test="delFlag != null"> and a.del_flag = #{delFlag} </when>
<otherwise> and a.del_flag = 1 </otherwise> <otherwise> and a.del_flag = 1 </otherwise>
</choose> </choose>
<!-- 反审标记查询: 【已反审】tab 前端传 delFlag=2 + reverseFlag=1 -->
<if test="reverseFlag != null"> and a.reverse_flag = #{reverseFlag} </if>
<if test="needDeclareFlag != null and needDeclareFlag != ''"> <if test="needDeclareFlag != null and needDeclareFlag != ''">
and b.need_declare_flag = #{needDeclareFlag} and b.need_declare_flag = #{needDeclareFlag}
</if> </if>
@@ -170,6 +173,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
WHERE a.picking_order_id = #{pickingOrderId} WHERE a.picking_order_id = #{pickingOrderId}
</select> </select>
<!-- 归档详情(已反审): 反审时拣货单/出库单均已软删, 按 del_flag=2 查归档数据 -->
<select id="queryOutOrderByIdReverse" parameterType="java.lang.Long" resultType="com.mhd.wms.domain.pickingOrder.repository.po.PickingOrderPO">
select
<include refid="selectPickingOrderPo"/>
<include refid="com.mhd.wms.domain.stockOutOrder.repository.mapper.StockOutOrderMapper.joinStockOutOrderPo"/>
from picking_order a
left join stock_out_order b on a.order_number = b.out_order_number and b.del_flag = 2 and a.del_flag = 2
WHERE a.picking_order_id = #{pickingOrderId}
</select>
<select id="queryWaveOrderByIdReverse" parameterType="java.lang.Long" resultType="com.mhd.wms.domain.pickingOrder.repository.po.PickingOrderPO">
select
<include refid="selectPickingOrderPo"/>
<include refid="com.mhd.wms.domain.waveOrder.repository.mapper.WaveOrderMapper.joinWaveOrderPo"/>
from picking_order a
left join wave_order b on a.order_number = b.wave_order_number and a.del_flag = 2
WHERE a.picking_order_id = #{pickingOrderId}
</select>
<select id="queryOutOrderByOrderNumber" parameterType="java.lang.String" resultType="com.mhd.wms.domain.pickingOrder.repository.po.PickingOrderPO"> <select id="queryOutOrderByOrderNumber" parameterType="java.lang.String" resultType="com.mhd.wms.domain.pickingOrder.repository.po.PickingOrderPO">
select select
<include refid="selectPickingOrderPo"/> <include refid="selectPickingOrderPo"/>
@@ -32,6 +32,7 @@
<result property="updateByName" column="update_by_name"/> <result property="updateByName" column="update_by_name"/>
<result property="updateTime" column="update_time"/> <result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/> <result property="delFlag" column="del_flag"/>
<result property="reverseFlag" column="reverse_flag"/>
<result property="materialKindCount" column="material_kind_count"/> <result property="materialKindCount" column="material_kind_count"/>
<result property="totalPlanQty" column="total_plan_qty"/> <result property="totalPlanQty" column="total_plan_qty"/>
<result property="totalReviewedQty" column="total_reviewed_qty"/> <result property="totalReviewedQty" column="total_reviewed_qty"/>
@@ -81,6 +82,7 @@
<result property="updateByName" column="update_by_name"/> <result property="updateByName" column="update_by_name"/>
<result property="updateTime" column="update_time"/> <result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/> <result property="delFlag" column="del_flag"/>
<result property="reverseFlag" column="reverse_flag"/>
</resultMap> </resultMap>
<sql id="reviewOrderSelectColumns"> <sql id="reviewOrderSelectColumns">
@@ -111,7 +113,7 @@
a.update_by, a.update_by,
a.update_by_name, a.update_by_name,
a.update_time, a.update_time,
a.del_flag a.del_flag, a.reverse_flag
</sql> </sql>
<sql id="reviewOrderWhere"> <sql id="reviewOrderWhere">
@@ -180,6 +182,10 @@
and a.del_flag = 1 and a.del_flag = 1
</otherwise> </otherwise>
</choose> </choose>
<!-- 反审标记查询: 【已反审】tab 前端传 delFlag=2 + reverseFlag=1 -->
<if test="reverseFlag != null">
and a.reverse_flag = #{reverseFlag}
</if>
</sql> </sql>
<!-- 复核单列表查询(头表 + 明细聚合:种类数、计划总量、已复核总量) --> <!-- 复核单列表查询(头表 + 明细聚合:种类数、计划总量、已复核总量) -->
@@ -216,6 +222,15 @@
and a.del_flag = 1 and a.del_flag = 1
</select> </select>
<!-- 详情:主表 by id(归档: 已反审软删 del_flag=2,供【已反审】tab 详情) -->
<select id="selectHeaderByReviewOrderIdReverse" resultMap="ReviewOrderResult">
select
<include refid="reviewOrderSelectColumns"/>
from review_order a
where a.review_order_id = #{reviewOrderId}
and a.del_flag = 2
</select>
<!-- 详情:主表 by 复核单号 --> <!-- 详情:主表 by 复核单号 -->
<select id="selectHeaderByReviewOrderNumber" resultMap="ReviewOrderResult"> <select id="selectHeaderByReviewOrderNumber" resultMap="ReviewOrderResult">
select select
@@ -282,6 +297,16 @@
order by d.review_material_detail_id asc order by d.review_material_detail_id asc
</select> </select>
<!-- 详情:明细 by 复核单主键(归档: 已反审软删 del_flag=2 -->
<select id="queryDetailByReviewOrderIdReverse" resultMap="ReviewMaterialDetailResult">
select
<include refid="reviewMaterialDetailColumns"/>
from review_material_detail d
where d.review_order_id = #{reviewOrderId}
and d.del_flag = 2
order by d.review_material_detail_id asc
</select>
<!-- 详情:明细 by 复核单号 --> <!-- 详情:明细 by 复核单号 -->
<select id="queryDetailByReviewOrderNumber" resultMap="ReviewMaterialDetailResult"> <select id="queryDetailByReviewOrderNumber" resultMap="ReviewMaterialDetailResult">
select select
@@ -59,6 +59,7 @@
<result property="updateBy" column="update_by"/> <result property="updateBy" column="update_by"/>
<result property="updateByName" column="update_by_name"/> <result property="updateByName" column="update_by_name"/>
<result property="delFlag" column="del_flag"/> <result property="delFlag" column="del_flag"/>
<result property="reverseFlag" column="reverse_flag"/>
<result property="overStockId" column="over_stock_id"/> <result property="overStockId" column="over_stock_id"/>
<result property="overStockStatus" column="over_stock_status"/> <result property="overStockStatus" column="over_stock_status"/>
<result property="overStockType" column="over_stock_type"/> <result property="overStockType" column="over_stock_type"/>
@@ -127,7 +128,7 @@
a.cancel_time, a.close_order, a.close_remark, a.close_by, a.close_by_name, a.close_time, a.check_status, a.cancel_time, a.close_order, a.close_remark, a.close_by, a.close_by_name, a.close_time, a.check_status,
a.check_task_distribution, a.check_task_distribution_time, a.check_operators_by, a.check_operators_name, a.mobilize_code, a.check_task_distribution, a.check_task_distribution_time, a.check_operators_by, a.check_operators_name, a.mobilize_code,
a.remark, a.create_time, a.create_by, a.create_by_name,a.train_no,a.PUSH_TIME,a.PUSH_BY,a.PUSH_BY_NAME,a.PUSH_STATUS, a.remark, a.create_time, a.create_by, a.create_by_name,a.train_no,a.PUSH_TIME,a.PUSH_BY,a.PUSH_BY_NAME,a.PUSH_STATUS,
a.update_time, a.update_by, a.update_by_name, a.del_flag, a.over_stock_id, a.over_stock_status, a.over_stock_type,a."TO", a.update_time, a.update_by, a.update_by_name, a.del_flag, a.reverse_flag, a.over_stock_id, a.over_stock_status, a.over_stock_type,a."TO",
a.CONTACT_PERSON,a.VEHICLE_MODEL_PLATE,a.ENTRUST_NO,a.TEL,a.DRIVER_SIGN,a.FAX,a.DECLARE_CUSTOMS,a.MANUFACTURER, a.CONTACT_PERSON,a.VEHICLE_MODEL_PLATE,a.ENTRUST_NO,a.TEL,a.DRIVER_SIGN,a.FAX,a.DECLARE_CUSTOMS,a.MANUFACTURER,
a.CUSTOMS_DECLARER_INFO,a.DELIVERY_ADDR,a.ENTRY_EXIT_CUSTOMS,a.DEPARTURE_ARRIVAL_COUNTRY,a.CARRIER,a.CONTAINER_NO,a.CONTAINER_NO_NAME,a.OUTBOUND_DATE, a.CUSTOMS_DECLARER_INFO,a.DELIVERY_ADDR,a.ENTRY_EXIT_CUSTOMS,a.DEPARTURE_ARRIVAL_COUNTRY,a.CARRIER,a.CONTAINER_NO,a.CONTAINER_NO_NAME,a.OUTBOUND_DATE,
a.COMPLETE_TIME,a.ORDER_DATE,a.TRANSPORT_MODE_CODE,a.TRANSPORT_MODE_NAME,a.SUPERVISION_MODE_CODE,a.SUPERVISION_MODE_NAME, a.COMPLETE_TIME,a.ORDER_DATE,a.TRANSPORT_MODE_CODE,a.TRANSPORT_MODE_NAME,a.SUPERVISION_MODE_CODE,a.SUPERVISION_MODE_NAME,
@@ -384,6 +385,8 @@
<when test="delFlag != null">and a.del_flag = #{delFlag}</when> <when test="delFlag != null">and a.del_flag = #{delFlag}</when>
<otherwise>and a.del_flag = 1</otherwise> <otherwise>and a.del_flag = 1</otherwise>
</choose> </choose>
<!-- 反审标记查询: 【已反审】tab 前端传 delFlag=2 + reverseFlag=1 -->
<if test="reverseFlag != null">and a.reverse_flag = #{reverseFlag}</if>
</sql> </sql>
<select id="queryList" parameterType="com.mhd.wms.domain.stockOutOrder.repository.todo.StockOutOrderDO" <select id="queryList" parameterType="com.mhd.wms.domain.stockOutOrder.repository.todo.StockOutOrderDO"
@@ -0,0 +1,28 @@
-- =====================================================================
-- 出库业务单反审功能 —— OMS 出库业务单加反审字段
-- 日期: 2026-09-08
-- 数据库: 达梦(DM), 兼容 Oracle 语法
-- 背景:
-- 已出库/已复核的出库业务单客户通知需要回退时, 点击【反审单据】回退到已创建,
-- 数据划归到出库单【已反审】tab; WMS 还原实物库存并生成出库异常记录【反审记录】。
-- 设计说明:
-- REVERSE_STATUS 反审状态: 0-无(默认) 1-已反审。
-- 反审后主单 status 回退为 1(已创建) 且 REVERSE_STATUS=1,
-- 【已反审】页签查询: 前端传 status=-2 (后端解析为 status=1 and reverse_status=1);
-- 【已创建】页签排除 REVERSE_STATUS=1, 保证页签互斥;
-- 重新审核通过时后端自动将 REVERSE_STATUS 复位为 0, 单据回到正常流转。
-- 反审校验: status in (9,12) 且 issueStatus in (2-已审核,4-已出库)。
-- 关联脚本: 20260908_reverse_flag_out_order_reverse_audit.sql(执行单/WMS单据反审标记)
-- =====================================================================
-- ============ 一、OMS 业务单 RESERVATION_STOCK_OUT_ORDER ============
ALTER TABLE "NGWL_TEST_OMS"."RESERVATION_STOCK_OUT_ORDER" ADD COLUMN REVERSE_STATUS NUMBER(1) DEFAULT 0;
COMMENT ON COLUMN "NGWL_TEST_OMS"."RESERVATION_STOCK_OUT_ORDER".REVERSE_STATUS IS '反审状态: 0-无 1-已反审(已反审tab过滤,重新审核通过自动复位0)';
ALTER TABLE "NGWL_TEST_OMS"."RESERVATION_STOCK_OUT_ORDER" ADD COLUMN REVERSE_REMARK VARCHAR2(500);
COMMENT ON COLUMN "NGWL_TEST_OMS"."RESERVATION_STOCK_OUT_ORDER".REVERSE_REMARK IS '反审原因';
ALTER TABLE "NGWL_TEST_OMS"."RESERVATION_STOCK_OUT_ORDER" ADD COLUMN REVERSE_BY NUMBER(20);
COMMENT ON COLUMN "NGWL_TEST_OMS"."RESERVATION_STOCK_OUT_ORDER".REVERSE_BY IS '反审人id';
ALTER TABLE "NGWL_TEST_OMS"."RESERVATION_STOCK_OUT_ORDER" ADD COLUMN REVERSE_BY_NAME VARCHAR2(64);
COMMENT ON COLUMN "NGWL_TEST_OMS"."RESERVATION_STOCK_OUT_ORDER".REVERSE_BY_NAME IS '反审人姓名';
ALTER TABLE "NGWL_TEST_OMS"."RESERVATION_STOCK_OUT_ORDER" ADD COLUMN REVERSE_TIME DATE;
COMMENT ON COLUMN "NGWL_TEST_OMS"."RESERVATION_STOCK_OUT_ORDER".REVERSE_TIME IS '反审时间';
@@ -0,0 +1,55 @@
-- =====================================================================
-- 出库业务单反审功能 —— 下游单据反审标记(软删留痕, 已反审tab过滤)
-- 日期: 2026-09-08
-- 数据库: 达梦(DM), 兼容 Oracle 语法
-- 背景:
-- 出库业务单反审时, 下游单据(OMS执行出库单/明细、WMS出库单/明细、WMS拣货单/明细、
-- WMS复核单/明细、WMS出库交接单)"软删+打已反审标记",
-- 数据划归到 W出库单/W拣货单/W复核单/W出库交接单 各列表【已反审】tab
-- (查询条件 delFlag=2 and reverseFlag=1)作记录跟踪;
-- 业务单重新下发时生成全新的执行单+WMS单(旧单保留在已反审tab)。
-- 设计说明:
-- REVERSE_FLAG 反审标记: 0-无(默认) 1-已反审。
-- 反审即软删(del_flag=2), 各列表常规查询 del_flag=1 天然排除已反审单据;
-- 【已反审】tab 显式传 delFlag=2 + reverseFlag=1, 与真删数据互斥。
-- 反审同时生成 WMS 出库异常记录【反审记录】(out_order_abnormal.ABNORMAL_TYPE=3)。
-- 关联脚本: 20260908_alter_table_szwl_oms_reservation_stock_out_order_reverse.sql(业务单反审字段)
-- 注意: 列名与入库侧 REVERSE_AUDIT_* 不同(出库后端代码已按 REVERSE_FLAG 落地),
-- 如需统一命名需联动改出库后端约30个文件。
-- =====================================================================
-- ============ 一、OMS 执行出库单 EXECUTION_STOCK_OUT_ORDER ============
ALTER TABLE "NGWL_TEST_OMS"."EXECUTION_STOCK_OUT_ORDER" ADD COLUMN REVERSE_FLAG NUMBER(1) DEFAULT 0;
COMMENT ON COLUMN "NGWL_TEST_OMS"."EXECUTION_STOCK_OUT_ORDER".REVERSE_FLAG IS '反审标记: 0-无 1-已反审(业务单反审时软删del_flag=2并打标记)';
-- ============ 二、OMS 执行出库明细 EXECUTION_OUT_MATERIAL_DETAIL ============
ALTER TABLE "NGWL_TEST_OMS"."EXECUTION_OUT_MATERIAL_DETAIL" ADD COLUMN REVERSE_FLAG NUMBER(1) DEFAULT 0;
COMMENT ON COLUMN "NGWL_TEST_OMS"."EXECUTION_OUT_MATERIAL_DETAIL".REVERSE_FLAG IS '反审标记: 0-无 1-已反审(随执行单反审软删时打标记)';
-- ============ 三、WMS 出库单 STOCK_OUT_ORDER ============
ALTER TABLE "NGWL_TEST_WMS"."STOCK_OUT_ORDER" ADD COLUMN REVERSE_FLAG NUMBER(1) DEFAULT 0;
COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_OUT_ORDER".REVERSE_FLAG IS '反审标记: 0-无 1-已反审(已反审tab过滤: del_flag=2 and reverse_flag=1)';
-- ============ 四、WMS 出库明细 OUT_MATERIAL_DETAIL ============
ALTER TABLE "NGWL_TEST_WMS"."OUT_MATERIAL_DETAIL" ADD COLUMN REVERSE_FLAG NUMBER(1) DEFAULT 0;
COMMENT ON COLUMN "NGWL_TEST_WMS"."OUT_MATERIAL_DETAIL".REVERSE_FLAG IS '反审标记: 0-无 1-已反审(随出库单反审软删时打标记)';
-- ============ 五、WMS 拣货单 PICKING_ORDER ============
ALTER TABLE "NGWL_TEST_WMS"."PICKING_ORDER" ADD COLUMN REVERSE_FLAG NUMBER(1) DEFAULT 0;
COMMENT ON COLUMN "NGWL_TEST_WMS"."PICKING_ORDER".REVERSE_FLAG IS '反审标记: 0-无 1-已反审(已反审tab过滤: del_flag=2 and reverse_flag=1)';
-- ============ 六、WMS 拣货明细 PICKING_MATERIAL_DETAIL ============
ALTER TABLE "NGWL_TEST_WMS"."PICKING_MATERIAL_DETAIL" ADD COLUMN REVERSE_FLAG NUMBER(1) DEFAULT 0;
COMMENT ON COLUMN "NGWL_TEST_WMS"."PICKING_MATERIAL_DETAIL".REVERSE_FLAG IS '反审标记: 0-无 1-已反审(随拣货单反审软删时打标记)';
-- ============ 七、WMS 复核单 REVIEW_ORDER ============
ALTER TABLE "NGWL_TEST_WMS"."REVIEW_ORDER" ADD COLUMN REVERSE_FLAG NUMBER(1) DEFAULT 0;
COMMENT ON COLUMN "NGWL_TEST_WMS"."REVIEW_ORDER".REVERSE_FLAG IS '反审标记: 0-无 1-已反审(已反审tab过滤: del_flag=2 and reverse_flag=1)';
-- ============ 八、WMS 复核明细 REVIEW_MATERIAL_DETAIL ============
ALTER TABLE "NGWL_TEST_WMS"."REVIEW_MATERIAL_DETAIL" ADD COLUMN REVERSE_FLAG NUMBER(1) DEFAULT 0;
COMMENT ON COLUMN "NGWL_TEST_WMS"."REVIEW_MATERIAL_DETAIL".REVERSE_FLAG IS '反审标记: 0-无 1-已反审(随复核单反审软删时打标记)';
-- ============ 九、WMS 出库交接单 HANDOVER_TASK_ORDER ============
ALTER TABLE "NGWL_TEST_WMS"."HANDOVER_TASK_ORDER" ADD COLUMN REVERSE_FLAG NUMBER(1) DEFAULT 0;
COMMENT ON COLUMN "NGWL_TEST_WMS"."HANDOVER_TASK_ORDER".REVERSE_FLAG IS '反审标记: 0-无 1-已反审(已反审tab过滤: del_flag=2 and reverse_flag=1)';