Browse Source

新增代码优化

cxd 6 months ago
parent
commit
842312a8d1

+ 6 - 0
module-erp/src/main/java/com/hys/app/service/erp/OrderManager.java

@@ -20,6 +20,7 @@ import com.hys.app.service.kuaidiniao.entity.PreOrderModelDTO;
 import com.hys.app.service.kuaidiniao.entity.resReturnBackBase;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 订单业务层接口
@@ -146,5 +147,10 @@ public interface OrderManager extends BaseService<OrderDO> {
      * @param orderCustomerFee
      */
     void editOrderCustomerFee(Long id, OrderCustomerFee orderCustomerFee);
+
+    /**
+     * 更新库存的数量
+     */
+    void updateStockQuantity(Map<String,Object> params);
 }
 

+ 159 - 148
module-erp/src/main/java/com/hys/app/service/erp/impl/OrderManagerImpl.java

@@ -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");
+
+    }
 }
 

+ 25 - 22
module-erp/src/main/java/com/hys/app/service/erp/impl/WarehouseEntryManagerImpl.java

@@ -103,30 +103,33 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long add(WarehouseEntryDTO warehouseEntryDTO) {
-        check(warehouseEntryDTO);
-        // 保存入库单
-        WarehouseEntryDO warehouseEntryDO = BeanUtil.copyProperties(warehouseEntryDTO, WarehouseEntryDO.class);
-        warehouseEntryDO.setSn(noGenerateManager.generate(NoBusinessTypeEnum.WarehouseEntry));
-        save(warehouseEntryDO);
-        // 保存入库单商品明细
-        List<WarehouseEntryProductDTO> productList1 = warehouseEntryDTO.getProductList();
-        ArrayList<WarehouseEntryProductDO> productList = new ArrayList<>();
-        for (WarehouseEntryProductDTO dto : productList1) {
-            WarehouseEntryProductDO productDO = BeanUtil.copyProperties(dto, WarehouseEntryProductDO.class);
-            productDO.setProductId(dto.getProductId());
-            productDO.setWarehouseEntryId(warehouseEntryDO.getId());
-            productList.add(productDO);
-        }
-        warehouseEntryProductManager.saveBatch(productList);
-        //保存子表和序列号的关系
-        warehouseEntryDTO.setId(warehouseEntryDO.getId());
-        saveSnCode(warehouseEntryDTO.getId(), productList);
 
-        //如果是入库就要增加库存
-        if ("submit".equals(warehouseEntryDTO.getSaveOrSubmit())) {
-            updateStock(warehouseEntryDTO, getById(warehouseEntryDO.getId()), productList);
+        synchronized (WarehouseEntryManagerImpl.class){
+            check(warehouseEntryDTO);
+            // 保存入库单
+            WarehouseEntryDO warehouseEntryDO = BeanUtil.copyProperties(warehouseEntryDTO, WarehouseEntryDO.class);
+            warehouseEntryDO.setSn(noGenerateManager.generate(NoBusinessTypeEnum.WarehouseEntry));
+            save(warehouseEntryDO);
+            // 保存入库单商品明细
+            List<WarehouseEntryProductDTO> productList1 = warehouseEntryDTO.getProductList();
+            ArrayList<WarehouseEntryProductDO> productList = new ArrayList<>();
+            for (WarehouseEntryProductDTO dto : productList1) {
+                WarehouseEntryProductDO productDO = BeanUtil.copyProperties(dto, WarehouseEntryProductDO.class);
+                productDO.setProductId(dto.getProductId());
+                productDO.setWarehouseEntryId(warehouseEntryDO.getId());
+                productList.add(productDO);
+            }
+            warehouseEntryProductManager.saveBatch(productList);
+            //保存子表和序列号的关系
+            warehouseEntryDTO.setId(warehouseEntryDO.getId());
+            saveSnCode(warehouseEntryDTO.getId(), productList);
+
+            //如果是入库就要增加库存
+            if ("submit".equals(warehouseEntryDTO.getSaveOrSubmit())) {
+                updateStock(warehouseEntryDTO, getById(warehouseEntryDO.getId()), productList);
+            }
+            return warehouseEntryDO.getId();
         }
-        return warehouseEntryDO.getId();
     }