|
@@ -116,7 +116,7 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void edit(OrderDTO orderDTO) {
|
|
|
- synchronized (orderDTO.getId().toString().intern()) {
|
|
|
+ synchronized (OrderManagerImpl.class) {
|
|
|
//修改把原先订单所有的东西都置空在新增
|
|
|
orderSendManager.remove(new LambdaQueryWrapper<OrderSendDO>().eq(OrderSendDO::getOrderId, orderDTO.getId()));
|
|
|
|
|
@@ -337,166 +337,168 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void orderSend(Long sendOrderId, PreOrderModelDTO orderSendDO) {
|
|
|
- OrderSendDO aDo = orderSendManager.getById(sendOrderId);
|
|
|
- OrderDO orderDO = getById(aDo.getOrderId());
|
|
|
- converter.copyProperties(aDo, orderSendDO, orderSendDO.getReceiver(), orderSendDO.getSender());
|
|
|
- //根据订单查找到这个订单的所有货物扣减库存
|
|
|
- List<OrderSendItemVO> list = orderSendDO.getOrderItemVOS();
|
|
|
- List<OrderSendItemDO> selectList = orderSendItemManager.list(new LambdaQueryWrapper<OrderSendItemDO>().eq(OrderSendItemDO::getSendOrderId, sendOrderId));
|
|
|
- if (list.size() != selectList.size()) {
|
|
|
- throw new ServiceException("发货商品不能修改");
|
|
|
- }
|
|
|
- for (OrderSendItemDO itemDO : selectList) {
|
|
|
- Optional<OrderSendItemVO> first = list.stream().filter(item -> item.getProductId().equals(itemDO.getProductId())).findFirst();
|
|
|
- if (!first.isPresent()) {
|
|
|
+ synchronized (OrderManagerImpl.class) {
|
|
|
+ OrderSendDO aDo = orderSendManager.getById(sendOrderId);
|
|
|
+ OrderDO orderDO = getById(aDo.getOrderId());
|
|
|
+ converter.copyProperties(aDo, orderSendDO, orderSendDO.getReceiver(), orderSendDO.getSender());
|
|
|
+ //根据订单查找到这个订单的所有货物扣减库存
|
|
|
+ List<OrderSendItemVO> list = orderSendDO.getOrderItemVOS();
|
|
|
+ List<OrderSendItemDO> selectList = orderSendItemManager.list(new LambdaQueryWrapper<OrderSendItemDO>().eq(OrderSendItemDO::getSendOrderId, sendOrderId));
|
|
|
+ if (list.size() != selectList.size()) {
|
|
|
throw new ServiceException("发货商品不能修改");
|
|
|
}
|
|
|
- if (first.get().getNum() != itemDO.getNum()) {
|
|
|
- throw new ServiceException("发货数量不能修改");
|
|
|
+ for (OrderSendItemDO itemDO : selectList) {
|
|
|
+ Optional<OrderSendItemVO> first = list.stream().filter(item -> item.getProductId().equals(itemDO.getProductId())).findFirst();
|
|
|
+ if (!first.isPresent()) {
|
|
|
+ throw new ServiceException("发货商品不能修改");
|
|
|
+ }
|
|
|
+ if (first.get().getNum() != itemDO.getNum()) {
|
|
|
+ throw new ServiceException("发货数量不能修改");
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- List<Long> productId = selectList.stream().map(OrderSendItemDO::getProductId).collect(Collectors.toList());
|
|
|
- //查找这些商品在指定仓库的库存,减去对应数量
|
|
|
- List<ProductStockDO> stockDOList = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
|
|
|
- .eq(ProductStockDO::getWarehouseId, aDo.getWarehouseId()).in(ProductStockDO::getProductId, productId));
|
|
|
- List<StockDTO> arrayList = new ArrayList<>();
|
|
|
- for (ProductStockDO stockDO : stockDOList) {
|
|
|
- Integer num = list.stream().filter(item -> item.getProductId().equals(stockDO.getProductId())).findFirst().get().getNum();
|
|
|
- StockDTO dto = new StockDTO();
|
|
|
- dto.setId(stockDO.getId());
|
|
|
- dto.setNum(-num);
|
|
|
- arrayList.add(dto);
|
|
|
- }
|
|
|
- //更爱可用库存实际库存冻结库存
|
|
|
- List<ProductStockDO> list1 = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, arrayList.stream().map(StockDTO::getId).collect(Collectors.toList())));
|
|
|
- for (ProductStockDO stockDO : list1) {
|
|
|
- StockDTO dto = arrayList.stream().filter(item -> item.getId().equals(stockDO.getId())).findFirst().get();
|
|
|
- stockDO.setActualStock(stockDO.getActualStock() + dto.getNum());
|
|
|
- stockDO.setLockedStock(stockDO.getLockedStock() + dto.getNum());
|
|
|
- stockDO.setUsableStock(stockDO.getActualStock() - stockDO.getLockedStock());
|
|
|
- if (OrderTypeEnum.TO_C.equals(aDo.getOrderType())) {
|
|
|
- stockDO.setTransitStock(stockDO.getTransitStock() - dto.getNum());
|
|
|
+ List<Long> productId = selectList.stream().map(OrderSendItemDO::getProductId).collect(Collectors.toList());
|
|
|
+ //查找这些商品在指定仓库的库存,减去对应数量
|
|
|
+ List<ProductStockDO> stockDOList = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
|
|
|
+ .eq(ProductStockDO::getWarehouseId, aDo.getWarehouseId()).in(ProductStockDO::getProductId, productId));
|
|
|
+ List<StockDTO> arrayList = new ArrayList<>();
|
|
|
+ for (ProductStockDO stockDO : stockDOList) {
|
|
|
+ Integer num = list.stream().filter(item -> item.getProductId().equals(stockDO.getProductId())).findFirst().get().getNum();
|
|
|
+ StockDTO dto = new StockDTO();
|
|
|
+ dto.setId(stockDO.getId());
|
|
|
+ dto.setNum(-num);
|
|
|
+ arrayList.add(dto);
|
|
|
}
|
|
|
- }
|
|
|
- if (OrderTypeEnum.TO_C.equals(aDo.getOrderType())) {
|
|
|
- List<OrderItemDO> list2 = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderDO.getId()));
|
|
|
- list2.forEach(item -> {
|
|
|
- item.setHasReturn(0);
|
|
|
- item.setStockNum(item.getNum());
|
|
|
- });
|
|
|
- orderItemManager.updateBatchById(list2);
|
|
|
- }
|
|
|
- productStockManager.updateBatchById(list1);
|
|
|
- //生成出库单
|
|
|
- WarehouseOutDO outDO = new WarehouseOutDO();
|
|
|
- if (OrderTypeEnum.TO_C.equals(orderDO.getType())) {
|
|
|
- outDO.setType(WarehouseOutTypeEnum.HAIL_OUT);
|
|
|
- //生成入库单
|
|
|
- createEntryWarehouse(orderDO);
|
|
|
- } else if (OrderTypeEnum.TO_B.equals(orderDO.getType())) {
|
|
|
- outDO.setType(WarehouseOutTypeEnum.SALE_OUT);
|
|
|
- }
|
|
|
- outDO.setOrderIdList(sendOrderId);
|
|
|
- outDO.setOrderId(aDo.getOrderId());
|
|
|
- outDO.setHasSubmit("Y");
|
|
|
- outDO.setWarehouseId(aDo.getWarehouseId());
|
|
|
- outDO.setNotes("发货单生成的出库单");
|
|
|
- outDO.setSn(noGenerateManager.generate(NoBusinessTypeEnum.WarehouseOut, 66L));
|
|
|
- warehouseOutMapper.insert(outDO);
|
|
|
- List<ItemSnCodeDO> itemSnCodeDOS = new ArrayList<>();
|
|
|
- //保存出库单明细
|
|
|
- List<WarehouseOutItemDO> beanList = BeanUtils.toBean(list, WarehouseOutItemDO.class);
|
|
|
- beanList.forEach(item ->{
|
|
|
- item.setId(null);
|
|
|
- item.setWarehouseOutId(outDO.getId());
|
|
|
- Integer num = list.stream().filter(it -> it.getProductId().equals(item.getProductId())).findFirst().get().getNum();
|
|
|
- item.setOutNum(num);
|
|
|
- });
|
|
|
- warehouseOutItemManager.saveBatch(beanList);
|
|
|
- //保存发货单明细和序列号的关系
|
|
|
- List<GoodsSnDO> snDOS = new ArrayList<>();
|
|
|
- List<LockedStockDetailDO> detailDOS = new ArrayList<>();
|
|
|
- for (OrderSendItemVO sendItemVO : list) {
|
|
|
- LockedStockDetailDO one = lockedStockDetailManager.getOne(new LambdaQueryWrapper<LockedStockDetailDO>()
|
|
|
- .eq(LockedStockDetailDO::getOrderId, orderDO.getId())
|
|
|
- .eq(LockedStockDetailDO::getOrderItemId, sendItemVO.getOrderItemId())
|
|
|
- .last("limit 1"));
|
|
|
- if (ObjectUtil.isNull(one)) {
|
|
|
- throw new ServiceException("未找到冻结记录");
|
|
|
+ //更爱可用库存实际库存冻结库存
|
|
|
+ List<ProductStockDO> list1 = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, arrayList.stream().map(StockDTO::getId).collect(Collectors.toList())));
|
|
|
+ for (ProductStockDO stockDO : list1) {
|
|
|
+ StockDTO dto = arrayList.stream().filter(item -> item.getId().equals(stockDO.getId())).findFirst().get();
|
|
|
+ stockDO.setActualStock(stockDO.getActualStock() + dto.getNum());
|
|
|
+ stockDO.setLockedStock(stockDO.getLockedStock() + dto.getNum());
|
|
|
+ stockDO.setUsableStock(stockDO.getActualStock() - stockDO.getLockedStock());
|
|
|
+ if (OrderTypeEnum.TO_C.equals(aDo.getOrderType())) {
|
|
|
+ stockDO.setTransitStock(stockDO.getTransitStock() - dto.getNum());
|
|
|
+ }
|
|
|
}
|
|
|
- one.setUnLockedTime(new Date());
|
|
|
- if (one.getLockedNum() == (sendItemVO.getNum() + one.getUnLockedNum())) {
|
|
|
- one.setStatus(true);
|
|
|
+ if (OrderTypeEnum.TO_C.equals(aDo.getOrderType())) {
|
|
|
+ List<OrderItemDO> list2 = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderDO.getId()));
|
|
|
+ list2.forEach(item -> {
|
|
|
+ item.setHasReturn(0);
|
|
|
+ item.setStockNum(item.getNum());
|
|
|
+ });
|
|
|
+ orderItemManager.updateBatchById(list2);
|
|
|
+ }
|
|
|
+ productStockManager.updateBatchById(list1);
|
|
|
+ //生成出库单
|
|
|
+ WarehouseOutDO outDO = new WarehouseOutDO();
|
|
|
+ if (OrderTypeEnum.TO_C.equals(orderDO.getType())) {
|
|
|
+ outDO.setType(WarehouseOutTypeEnum.HAIL_OUT);
|
|
|
+ //生成入库单
|
|
|
+ createEntryWarehouse(orderDO);
|
|
|
+ } else if (OrderTypeEnum.TO_B.equals(orderDO.getType())) {
|
|
|
+ outDO.setType(WarehouseOutTypeEnum.SALE_OUT);
|
|
|
}
|
|
|
- one.setUnLockedNum(one.getUnLockedNum() + sendItemVO.getNum());
|
|
|
- detailDOS.add(one);
|
|
|
- //判断发货数量是不是和明细数量一致,不一样不让保存
|
|
|
- ProductDO byId = productManager.getById(sendItemVO.getProductId());
|
|
|
- if (byId.getHaveSn()) {
|
|
|
- if (CollUtil.isEmpty(sendItemVO.getSnCodeList())) {
|
|
|
- throw new ServiceException("有序列号的商品出库必须录入序列号");
|
|
|
+ outDO.setOrderIdList(sendOrderId);
|
|
|
+ outDO.setOrderId(aDo.getOrderId());
|
|
|
+ outDO.setHasSubmit("Y");
|
|
|
+ outDO.setWarehouseId(aDo.getWarehouseId());
|
|
|
+ outDO.setNotes("发货单生成的出库单");
|
|
|
+ outDO.setSn(noGenerateManager.generate(NoBusinessTypeEnum.WarehouseOut, 66L));
|
|
|
+ warehouseOutMapper.insert(outDO);
|
|
|
+ List<ItemSnCodeDO> itemSnCodeDOS = new ArrayList<>();
|
|
|
+ //保存出库单明细
|
|
|
+ List<WarehouseOutItemDO> beanList = BeanUtils.toBean(list, WarehouseOutItemDO.class);
|
|
|
+ beanList.forEach(item ->{
|
|
|
+ item.setId(null);
|
|
|
+ item.setWarehouseOutId(outDO.getId());
|
|
|
+ Integer num = list.stream().filter(it -> it.getProductId().equals(item.getProductId())).findFirst().get().getNum();
|
|
|
+ item.setOutNum(num);
|
|
|
+ });
|
|
|
+ warehouseOutItemManager.saveBatch(beanList);
|
|
|
+ //保存发货单明细和序列号的关系
|
|
|
+ List<GoodsSnDO> snDOS = new ArrayList<>();
|
|
|
+ List<LockedStockDetailDO> detailDOS = new ArrayList<>();
|
|
|
+ for (OrderSendItemVO sendItemVO : list) {
|
|
|
+ LockedStockDetailDO one = lockedStockDetailManager.getOne(new LambdaQueryWrapper<LockedStockDetailDO>()
|
|
|
+ .eq(LockedStockDetailDO::getOrderId, orderDO.getId())
|
|
|
+ .eq(LockedStockDetailDO::getOrderItemId, sendItemVO.getOrderItemId())
|
|
|
+ .last("limit 1"));
|
|
|
+ if (ObjectUtil.isNull(one)) {
|
|
|
+ throw new ServiceException("未找到冻结记录");
|
|
|
}
|
|
|
- if (sendItemVO.getSnCodeList().size() != sendItemVO.getNum()) {
|
|
|
- throw new ServiceException("录入的序列号数量和发货数量必须一样多");
|
|
|
+ one.setUnLockedTime(new Date());
|
|
|
+ if (one.getLockedNum() == (sendItemVO.getNum() + one.getUnLockedNum())) {
|
|
|
+ one.setStatus(true);
|
|
|
+ }
|
|
|
+ one.setUnLockedNum(one.getUnLockedNum() + sendItemVO.getNum());
|
|
|
+ detailDOS.add(one);
|
|
|
+ //判断发货数量是不是和明细数量一致,不一样不让保存
|
|
|
+ ProductDO byId = productManager.getById(sendItemVO.getProductId());
|
|
|
+ if (byId.getHaveSn()) {
|
|
|
+ if (CollUtil.isEmpty(sendItemVO.getSnCodeList())) {
|
|
|
+ throw new ServiceException("有序列号的商品出库必须录入序列号");
|
|
|
+ }
|
|
|
+ if (sendItemVO.getSnCodeList().size() != sendItemVO.getNum()) {
|
|
|
+ throw new ServiceException("录入的序列号数量和发货数量必须一样多");
|
|
|
+ }
|
|
|
+ Set<Long> set = sendItemVO.getSnCodeList().stream().map(GoodsSnDO::getId).collect(Collectors.toSet());
|
|
|
+ if (set.size() != sendItemVO.getSnCodeList().size()){
|
|
|
+ throw new ServiceException("序列号重复");
|
|
|
+ }
|
|
|
}
|
|
|
- Set<Long> set = sendItemVO.getSnCodeList().stream().map(GoodsSnDO::getId).collect(Collectors.toSet());
|
|
|
- if (set.size() != sendItemVO.getSnCodeList().size()){
|
|
|
- throw new ServiceException("序列号重复");
|
|
|
+ if (CollUtil.isNotEmpty(sendItemVO.getSnCodeList())) {
|
|
|
+ snDOS.addAll(sendItemVO.getSnCodeList());
|
|
|
+ for (GoodsSnDO snDO : sendItemVO.getSnCodeList()) {
|
|
|
+ //出库明细和序列号的关系
|
|
|
+ ItemSnCodeDO itemSnCodeDO = new ItemSnCodeDO();
|
|
|
+ itemSnCodeDO.setItemId(sendItemVO.getId());
|
|
|
+ itemSnCodeDO.setEntryOutHouseId(sendOrderId);
|
|
|
+ itemSnCodeDO.setType("send");
|
|
|
+ itemSnCodeDO.setSnCodeId(snDO.getId());
|
|
|
+ itemSnCodeDOS.add(itemSnCodeDO);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- if (CollUtil.isNotEmpty(sendItemVO.getSnCodeList())) {
|
|
|
- snDOS.addAll(sendItemVO.getSnCodeList());
|
|
|
- for (GoodsSnDO snDO : sendItemVO.getSnCodeList()) {
|
|
|
- //出库明细和序列号的关系
|
|
|
- ItemSnCodeDO itemSnCodeDO = new ItemSnCodeDO();
|
|
|
- itemSnCodeDO.setItemId(sendItemVO.getId());
|
|
|
- itemSnCodeDO.setEntryOutHouseId(sendOrderId);
|
|
|
- itemSnCodeDO.setType("send");
|
|
|
- itemSnCodeDO.setSnCodeId(snDO.getId());
|
|
|
- itemSnCodeDOS.add(itemSnCodeDO);
|
|
|
+ //更改冻结库存状态
|
|
|
+ lockedStockDetailManager.updateBatchById(detailDOS);
|
|
|
+ //更改序列号的状态
|
|
|
+ if (CollUtil.isNotEmpty(snDOS)) {
|
|
|
+ //更爱序列号状态
|
|
|
+ for (GoodsSnDO snDO : snDOS) {
|
|
|
+ snDO.setStatus(SnCodeStatusEnum.OUT_WAREHOUSE);
|
|
|
+ snDO.setOutHouseId(outDO.getId());
|
|
|
}
|
|
|
+ goodsSnManager.updateBatchById(snDOS);
|
|
|
}
|
|
|
- }
|
|
|
- //更改冻结库存状态
|
|
|
- lockedStockDetailManager.updateBatchById(detailDOS);
|
|
|
- //更改序列号的状态
|
|
|
- if (CollUtil.isNotEmpty(snDOS)) {
|
|
|
- //更爱序列号状态
|
|
|
- for (GoodsSnDO snDO : snDOS) {
|
|
|
- snDO.setStatus(SnCodeStatusEnum.OUT_WAREHOUSE);
|
|
|
- snDO.setOutHouseId(outDO.getId());
|
|
|
- }
|
|
|
- goodsSnManager.updateBatchById(snDOS);
|
|
|
- }
|
|
|
- //保存出库单明细和序列号的关系
|
|
|
- beanList.forEach(item -> {
|
|
|
- //发货明细和sncode做关联
|
|
|
- if (CollUtil.isNotEmpty(item.getSnCodeList())) {
|
|
|
- for (GoodsSnDO snDO : item.getSnCodeList()) {
|
|
|
- //出库明细和序列号的关系
|
|
|
- ItemSnCodeDO itemSnCodeDO = new ItemSnCodeDO();
|
|
|
- itemSnCodeDO.setItemId(item.getId());
|
|
|
- itemSnCodeDO.setEntryOutHouseId(outDO.getId());
|
|
|
- itemSnCodeDO.setType("out");
|
|
|
- itemSnCodeDO.setSnCodeId(snDO.getId());
|
|
|
- itemSnCodeDOS.add(itemSnCodeDO);
|
|
|
+ //保存出库单明细和序列号的关系
|
|
|
+ beanList.forEach(item -> {
|
|
|
+ //发货明细和sncode做关联
|
|
|
+ if (CollUtil.isNotEmpty(item.getSnCodeList())) {
|
|
|
+ for (GoodsSnDO snDO : item.getSnCodeList()) {
|
|
|
+ //出库明细和序列号的关系
|
|
|
+ ItemSnCodeDO itemSnCodeDO = new ItemSnCodeDO();
|
|
|
+ itemSnCodeDO.setItemId(item.getId());
|
|
|
+ itemSnCodeDO.setEntryOutHouseId(outDO.getId());
|
|
|
+ itemSnCodeDO.setType("out");
|
|
|
+ itemSnCodeDO.setSnCodeId(snDO.getId());
|
|
|
+ itemSnCodeDOS.add(itemSnCodeDO);
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- });
|
|
|
- //先删除序列号和子表的关系(发货单可能保存过)
|
|
|
- itemSnCodeManager.remove(new LambdaQueryWrapper<ItemSnCodeDO>()
|
|
|
- .eq(ItemSnCodeDO::getType, "send")
|
|
|
- .eq(ItemSnCodeDO::getEntryOutHouseId, sendOrderId));
|
|
|
- //保存序列号和子表的关系
|
|
|
- itemSnCodeManager.saveBatch(itemSnCodeDOS);
|
|
|
- //更改发货单状态
|
|
|
- aDo.setStatus(SaleOrderSendStatusEnum.SENDING);
|
|
|
- aDo.setWarehouseOutId(outDO.getId());
|
|
|
- orderSendManager.updateById(aDo);
|
|
|
- //更改订单状态
|
|
|
- orderDO.setStatus(SaleOrderStatusEnum.SENDING);
|
|
|
- updateById(orderDO);
|
|
|
- redisTemplate.delete(sendOrderId.toString());
|
|
|
+ });
|
|
|
+ //先删除序列号和子表的关系(发货单可能保存过)
|
|
|
+ itemSnCodeManager.remove(new LambdaQueryWrapper<ItemSnCodeDO>()
|
|
|
+ .eq(ItemSnCodeDO::getType, "send")
|
|
|
+ .eq(ItemSnCodeDO::getEntryOutHouseId, sendOrderId));
|
|
|
+ //保存序列号和子表的关系
|
|
|
+ itemSnCodeManager.saveBatch(itemSnCodeDOS);
|
|
|
+ //更改发货单状态
|
|
|
+ aDo.setStatus(SaleOrderSendStatusEnum.SENDING);
|
|
|
+ aDo.setWarehouseOutId(outDO.getId());
|
|
|
+ orderSendManager.updateById(aDo);
|
|
|
+ //更改订单状态
|
|
|
+ orderDO.setStatus(SaleOrderStatusEnum.SENDING);
|
|
|
+ updateById(orderDO);
|
|
|
+ redisTemplate.delete(sendOrderId.toString());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
private void createEntryWarehouse(OrderDO orderDO) {
|
|
@@ -729,5 +731,14 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
|
|
|
BeanUtil.copyProperties(orderCustomerFee, byId);
|
|
|
orderCustomerFeeManager.updateById(byId);
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateStockQuantity(Map<String, Object> params) {
|
|
|
+ //获取订单id
|
|
|
+ Long orderId = (Long)params.get("orderId");
|
|
|
+ //产品id
|
|
|
+ Long productId = (Long)params.get("productId");
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
|