Browse Source

Merge branch 'dev' of joenyliang/v3studio-erp-api into master

合并代码,解决更新时库存为负数的问题
zhumin 7 months ago
parent
commit
4343414c04

+ 41 - 39
module-erp/src/main/java/com/hys/app/service/erp/impl/OrderManagerImpl.java

@@ -116,49 +116,51 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void edit(OrderDTO orderDTO) {
-        //修改把原先订单所有的东西都置空在新增
-        orderSendManager.remove(new LambdaQueryWrapper<OrderSendDO>().eq(OrderSendDO::getOrderId, orderDTO.getId()));
-
-        //解冻库存
-        List<OrderItemDO> itemDOS = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderDTO.getId()));
-        List<StockDTO> stockDTOS = new ArrayList<>();
-        for (OrderItemDO itemDO : itemDOS) {
-            StockDTO stockDTO = new StockDTO();
-            stockDTO.setId(itemDO.getProductStockId());
-            stockDTO.setNum(-itemDO.getNum());
-            stockDTOS.add(stockDTO);
-        }
-        productStockManager.updateLockedStock(stockDTOS);
-        orderItemManager.remove(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderDTO.getId()));
-        List<LockedStockDetailDO> list = lockedStockDetailManager.list(new LambdaQueryWrapper<LockedStockDetailDO>().eq(LockedStockDetailDO::getOrderId, orderDTO.getId()));
-        //删除冻结明细
-        lockedStockDetailManager.remove(new LambdaQueryWrapper<LockedStockDetailDO>().eq(LockedStockDetailDO::getOrderId, orderDTO.getId()));
-        List<StockDTO> arrayList = new ArrayList<>();
-        list.forEach(item -> {
-            StockDTO dto = new StockDTO();
-            dto.setId(item.getProductStockId());
-            dto.setNum(-item.getLockedNum());
-            arrayList.add(dto);
-        });
-        productStockManager.updateLockedStock(arrayList);
+        synchronized (orderDTO.getId().toString().intern()) {
+            //修改把原先订单所有的东西都置空在新增
+            orderSendManager.remove(new LambdaQueryWrapper<OrderSendDO>().eq(OrderSendDO::getOrderId, orderDTO.getId()));
+
+            //解冻库存
+            List<OrderItemDO> itemDOS = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderDTO.getId()));
+            List<StockDTO> stockDTOS = new ArrayList<>();
+            for (OrderItemDO itemDO : itemDOS) {
+                StockDTO stockDTO = new StockDTO();
+                stockDTO.setId(itemDO.getProductStockId());
+                stockDTO.setNum(-itemDO.getNum());
+                stockDTOS.add(stockDTO);
+            }
+            productStockManager.updateLockedStock(stockDTOS);
+            orderItemManager.remove(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderDTO.getId()));
+            List<LockedStockDetailDO> list = lockedStockDetailManager.list(new LambdaQueryWrapper<LockedStockDetailDO>().eq(LockedStockDetailDO::getOrderId, orderDTO.getId()));
+            //删除冻结明细
+            lockedStockDetailManager.remove(new LambdaQueryWrapper<LockedStockDetailDO>().eq(LockedStockDetailDO::getOrderId, orderDTO.getId()));
+            List<StockDTO> arrayList = new ArrayList<>();
+            list.forEach(item -> {
+                StockDTO dto = new StockDTO();
+                dto.setId(item.getProductStockId());
+                dto.setNum(-item.getLockedNum());
+                arrayList.add(dto);
+            });
+            //productStockManager.updateLockedStock(arrayList);
 
 
-        if (OrderTypeEnum.TO_C.equals(orderDTO.getType())) {
-            if (ObjectUtil.isNull(orderDTO.getStartTime())) {
-                throw new ServiceException("租用时间不能为空");
+            if (OrderTypeEnum.TO_C.equals(orderDTO.getType())) {
+                if (ObjectUtil.isNull(orderDTO.getStartTime())) {
+                    throw new ServiceException("租用时间不能为空");
+                }
             }
+            GaoDeUtil.getLongitudeLatitude(orderDTO.getProvinceCityAreaAddress());
+            OrderDO orderDO = BeanUtil.copyProperties(orderDTO, OrderDO.class);
+            orderDO.setUpdateTime(System.currentTimeMillis() / 1000);
+            // 更新订单
+            updateById(orderDO);
+            // 更新订单项
+            List<OrderItemDO> itemList = BeanUtils.toBean(orderDTO.getItemList(), OrderItemDO.class);
+
+            itemList.forEach(item -> item.setOrderId(orderDO.getId()));
+            orderItemManager.remove(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderDTO.getId()));
+            orderItemManager.saveBatch(itemList);
         }
-        GaoDeUtil.getLongitudeLatitude(orderDTO.getProvinceCityAreaAddress());
-        OrderDO orderDO = BeanUtil.copyProperties(orderDTO, OrderDO.class);
-        orderDO.setUpdateTime(System.currentTimeMillis() / 1000);
-        // 更新订单
-        updateById(orderDO);
-        // 更新订单项
-        List<OrderItemDO> itemList = BeanUtils.toBean(orderDTO.getItemList(), OrderItemDO.class);
-
-        itemList.forEach(item -> item.setOrderId(orderDO.getId()));
-        orderItemManager.remove(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderDTO.getId()));
-        orderItemManager.saveBatch(itemList);
     }
 
     @Override

+ 13 - 1
module-erp/src/main/java/com/hys/app/service/erp/impl/ProductStockManagerImpl.java

@@ -11,6 +11,7 @@ import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
 import com.hys.app.framework.util.PageConvert;
+import com.hys.app.framework.util.ScriptUtil;
 import com.hys.app.mapper.erp.ProductStockMapper;
 import com.hys.app.mapper.goods.ProductMapper;
 import com.hys.app.model.erp.dos.GoodsDO;
@@ -27,6 +28,8 @@ import com.hys.app.model.erp.vo.WarehouseVO;
 import com.hys.app.service.erp.ProductManager;
 import com.hys.app.service.erp.ProductStockManager;
 import com.hys.app.service.erp.WarehouseManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -47,6 +50,9 @@ import java.util.stream.Collectors;
 @Service
 public class ProductStockManagerImpl extends BaseServiceImpl<ProductStockMapper, ProductStockDO> implements ProductStockManager {
 
+    private static final Logger log = LoggerFactory.getLogger(ScriptUtil.class);
+
+
     @Autowired
     private ProductStockConverter converter;
 
@@ -256,9 +262,15 @@ public class ProductStockManagerImpl extends BaseServiceImpl<ProductStockMapper,
         }
         for (ProductStockDO aDo : list) {
             StockDTO stockDTO = ids.stream().filter(item -> item.getId().equals(aDo.getId())).findFirst().get();
-           Integer currentLocked = aDo.getLockedStock()+stockDTO.getNum();
+            Integer currentLocked = aDo.getLockedStock()+stockDTO.getNum();
             aDo.setLockedStock(currentLocked);
             aDo.setUsableStock(aDo.getActualStock()-currentLocked);
+
+            log.info("商品库存变更 - 商品ID:{}, 实际库存:{}, 可用库存:{}, 冻结库存:{}",
+                aDo.getProductId(),
+                aDo.getActualStock(),
+                aDo.getUsableStock(),
+                aDo.getLockedStock());
         }
         updateBatchById(list);
     }