【bug】直接发货增加超额校验

pull/3/head
zengchenxi 9 months ago
parent 707536f990
commit a039fd30ca

@ -62,6 +62,10 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createDeliverOrder(DeliverOrderSaveReqVO createReqVO) { public Long createDeliverOrder(DeliverOrderSaveReqVO createReqVO) {
// 超额校验
overageDeliverValidate(createReqVO.getSaleOrderIds(), createReqVO.getDeliverOrderSubs());
// 插入 // 插入
DeliverOrderDO deliverOrder = BeanUtils.toBean(createReqVO, DeliverOrderDO.class); DeliverOrderDO deliverOrder = BeanUtils.toBean(createReqVO, DeliverOrderDO.class);
// 月度流水号 // 月度流水号
@ -100,51 +104,8 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
if(!oldDO.canOperate(operateTypeEnum)){ if(!oldDO.canOperate(operateTypeEnum)){
throw exception(INVALID_OPERATE); throw exception(INVALID_OPERATE);
} }
// 校验数据 不容许超额发货 // 超额校验
if(operateTypeEnum == OperateTypeEnum.DELIVER){ overageDeliverValidate(updateReqVO.getSaleOrderIds(), updateReqVO.getDeliverOrderSubs());
List<DeliverOrderSubDO> thisTimeSubs = updateReqVO.getDeliverOrderSubs();
List<DeliverOrderSubDO> thisTimeRelaSubList = thisTimeSubs.stream().filter(deliverOrderSubDO -> deliverOrderSubDO.getSaleOrderSubId() != null).collect(Collectors.toList());
if(!thisTimeRelaSubList.isEmpty()){
// 锁定订单
LambdaQueryWrapper<ProjectOrderDO> projectQuery = new LambdaQueryWrapper<>();
projectQuery.in(ProjectOrderDO::getId, updateReqVO.getSaleOrderIds().split(",")).last("FOR UPDATE");
List<ProjectOrderDO> projectOrderDOList = projectOrderMapper.selectList(projectQuery);
// 状态判断 已发货不容许操作
boolean anyoneDone = projectOrderDOList.stream().anyMatch(projectOrderDO -> {
return projectOrderDO.getOrderStatus().intValue() == ProjectOrderDeliverStatusEnum.ALL.getCode();
});
if(anyoneDone){
throw exception(RELATION_PROJECT_ORDER_HAS_DONE);
}
// 查询关联子项目信息判断额度
Map<Long, List<DeliverOrderSubDO>> thisTimeSubsGroupBySaleSubId = thisTimeRelaSubList.stream().collect(Collectors.groupingBy(DeliverOrderSubDO::getSaleOrderSubId));
List<ProjectOrderSubDO> relaProjectOrderSubList = projectOrderSubMapper.selectBatchIds(thisTimeSubsGroupBySaleSubId.keySet());
// 查询历史发货信息
MPJLambdaWrapper<DeliverOrderSubDO> historyDeliveredSubQuery = new MPJLambdaWrapper<>();
historyDeliveredSubQuery.selectAll(DeliverOrderSubDO.class)
.leftJoin(DeliverOrderDO.class, DeliverOrderDO::getId, DeliverOrderSubDO::getDeliveryOrderId)
.eq(DeliverOrderDO::getDeliverStatus, DeliverOrderStatusEnum.DELIVER.getCode())
.in(DeliverOrderSubDO::getSaleOrderSubId, thisTimeSubsGroupBySaleSubId.keySet());
List<DeliverOrderSubDO> historyDeliveredSubList = deliverOrderSubMapper.selectList(historyDeliveredSubQuery);
Map<Long, List<DeliverOrderSubDO>> historyDeliveredSubsGroupBySaleSubId = historyDeliveredSubList.stream().collect(Collectors.groupingBy(DeliverOrderSubDO::getSaleOrderSubId));
// 关联额度-历史发货额度-本次发货额度 >= 0 则可通过
boolean allDeliverable = relaProjectOrderSubList.stream().allMatch(relaSub -> {
int relaAmount = relaSub.getAmount();
List<DeliverOrderSubDO> historySubList = historyDeliveredSubsGroupBySaleSubId.get(relaSub.getId());
int historyDeliveredAmount = historySubList == null || historySubList.isEmpty() ? 0 : historySubList.stream().mapToInt(DeliverOrderSubDO::getAmount).sum();
int thisTimeAmount = thisTimeSubsGroupBySaleSubId.get(relaSub.getId()).get(0).getAmount();
return relaAmount-historyDeliveredAmount-thisTimeAmount >= 0;
});
if(!allDeliverable){
throw exception(DELIVER_AMOUNT_OVERFLOW);
}
}
}
// 更新 // 更新
DeliverOrderDO updateObj = BeanUtils.toBean(updateReqVO, DeliverOrderDO.class); DeliverOrderDO updateObj = BeanUtils.toBean(updateReqVO, DeliverOrderDO.class);
@ -157,11 +118,54 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
if(updateObj.getDeliverStatus().intValue() == DeliverOrderStatusEnum.DELIVER.getCode()) { if(updateObj.getDeliverStatus().intValue() == DeliverOrderStatusEnum.DELIVER.getCode()) {
crossOrderManager.refreshProjectOrderDeliverStatus(updateReqVO.getSaleOrderIds().split(",")); crossOrderManager.refreshProjectOrderDeliverStatus(updateReqVO.getSaleOrderIds().split(","));
crossOrderManager.generateStockOutOrder(updateReqVO); crossOrderManager.generateStockOutOrder(updateReqVO);
} }
} }
private void overageDeliverValidate(String saleOrderIds, List<DeliverOrderSubDO> thisTimeSubs) {
List<DeliverOrderSubDO> thisTimeRelaSubList = thisTimeSubs.stream().filter(deliverOrderSubDO -> deliverOrderSubDO.getSaleOrderSubId() != null).collect(Collectors.toList());
if(!thisTimeRelaSubList.isEmpty()){
// 锁定订单
LambdaQueryWrapper<ProjectOrderDO> projectQuery = new LambdaQueryWrapper<>();
projectQuery.in(ProjectOrderDO::getId, saleOrderIds.split(",")).last("FOR UPDATE");
List<ProjectOrderDO> projectOrderDOList = projectOrderMapper.selectList(projectQuery);
// 状态判断 已发货不容许操作
boolean anyoneDone = projectOrderDOList.stream().anyMatch(projectOrderDO -> {
return projectOrderDO.getOrderStatus().intValue() == ProjectOrderDeliverStatusEnum.ALL.getCode();
});
if(anyoneDone){
throw exception(RELATION_PROJECT_ORDER_HAS_DONE);
}
// 查询关联子项目信息判断额度
Map<Long, List<DeliverOrderSubDO>> thisTimeSubsGroupBySaleSubId = thisTimeRelaSubList.stream().collect(Collectors.groupingBy(DeliverOrderSubDO::getSaleOrderSubId));
List<ProjectOrderSubDO> relaProjectOrderSubList = projectOrderSubMapper.selectBatchIds(thisTimeSubsGroupBySaleSubId.keySet());
// 查询历史发货信息
MPJLambdaWrapper<DeliverOrderSubDO> historyDeliveredSubQuery = new MPJLambdaWrapper<>();
historyDeliveredSubQuery.selectAll(DeliverOrderSubDO.class)
.leftJoin(DeliverOrderDO.class, DeliverOrderDO::getId, DeliverOrderSubDO::getDeliveryOrderId)
.eq(DeliverOrderDO::getDeliverStatus, DeliverOrderStatusEnum.DELIVER.getCode())
.in(DeliverOrderSubDO::getSaleOrderSubId, thisTimeSubsGroupBySaleSubId.keySet());
List<DeliverOrderSubDO> historyDeliveredSubList = deliverOrderSubMapper.selectList(historyDeliveredSubQuery);
Map<Long, List<DeliverOrderSubDO>> historyDeliveredSubsGroupBySaleSubId = historyDeliveredSubList.stream().collect(Collectors.groupingBy(DeliverOrderSubDO::getSaleOrderSubId));
// 关联额度-历史发货额度-本次发货额度 >= 0 则可通过
boolean allDeliverable = relaProjectOrderSubList.stream().allMatch(relaSub -> {
int relaAmount = relaSub.getAmount();
List<DeliverOrderSubDO> historySubList = historyDeliveredSubsGroupBySaleSubId.get(relaSub.getId());
int historyDeliveredAmount = historySubList == null || historySubList.isEmpty() ? 0 : historySubList.stream().mapToInt(DeliverOrderSubDO::getAmount).sum();
int thisTimeAmount = thisTimeSubsGroupBySaleSubId.get(relaSub.getId()).get(0).getAmount();
return relaAmount-historyDeliveredAmount-thisTimeAmount >= 0;
});
if(!allDeliverable){
throw exception(DELIVER_AMOUNT_OVERFLOW);
}
}
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteDeliverOrder(Long id) { public void deleteDeliverOrder(Long id) {

Loading…
Cancel
Save