|
|
@ -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) {
|
|
|
|