소스 검색

出入库

24282 1 년 전
부모
커밋
2f71386df6

+ 0 - 16
sd-business/src/main/java/com/sd/business/controller/in/InOutStorageController.java

@@ -63,20 +63,4 @@ public class InOutStorageController {
         inOutStorageService.addAllot(dto);
     }
 
-    /**
-     * 出入库编辑
-     */
-    @PostMapping("/edit")
-    public void edit(@RequestBody InOutStorageDto inOutStorageDto) {
-        inOutStorageService.edit(inOutStorageDto);
-    }
-
-    /**
-     * 出入库删除
-     */
-    @PostMapping("/delete")
-    public void delete(@RequestBody BaseSelectDto dto) {
-        inOutStorageService.delete(dto.getId());
-    }
-
 }

+ 7 - 7
sd-business/src/main/java/com/sd/business/entity/inventory/po/Inventory.java

@@ -26,23 +26,23 @@ public class Inventory extends BasePo {
     private Long warehouseId;
 
     /**
-     * bom规格id
-     */
-    private Long bomSpecId;
-
-    /**
      * 事业部id
      */
     private Long departmentId;
 
     /**
-     * 结存单价
+     * bom规格id
      */
-    private BigDecimal balanceUnitPrice;
+    private Long bomSpecId;
 
     /**
      * 数量
      */
     private BigDecimal quantity;
 
+    /**
+     * 结存单价
+     */
+    private BigDecimal balanceUnitPrice;
+
 }

+ 0 - 10
sd-business/src/main/java/com/sd/business/service/in/InOutStorageService.java

@@ -35,16 +35,6 @@ public interface InOutStorageService extends BaseService<InOutStorage> {
     void add(InOutStorageDto inOutStorageDto);
 
     /**
-     * 出入库编辑
-     */
-    void edit(InOutStorageDto inOutStorageDto);
-
-    /**
-     * 出入库删除
-     */
-    void delete(Long id);
-
-    /**
      * 调拨入库
      */
     void addAllot(AddAllotDto dto);

+ 5 - 42
sd-business/src/main/java/com/sd/business/service/in/impl/InOutStorageServiceImpl.java

@@ -13,12 +13,10 @@ import com.sd.business.entity.in.emums.InOutTypeEnum;
 import com.sd.business.entity.in.emums.OutDetailTypeEnum;
 import com.sd.business.entity.in.po.InOutStorage;
 import com.sd.business.entity.in.po.InOutStorageBom;
-import com.sd.business.entity.in.po.InOutStorageDetails;
 import com.sd.business.entity.in.vo.InOutStorageVo;
 import com.sd.business.entity.warehouse.po.Warehouse;
 import com.sd.business.mapper.in.InOutStorageMapper;
 import com.sd.business.service.in.InOutStorageBomService;
-import com.sd.business.service.in.InOutStorageDetailsService;
 import com.sd.business.service.in.InOutStorageService;
 import com.sd.business.service.inventory.InventoryService;
 import com.sd.business.util.CodeEnum;
@@ -26,8 +24,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.math.BigDecimal;
-import java.util.ArrayList;
 import java.util.List;
 
 
@@ -41,16 +37,11 @@ import java.util.List;
  */
 @Service
 public class InOutStorageServiceImpl extends ServiceImpl<InOutStorageMapper, InOutStorage> implements InOutStorageService {
-    //单价逻辑还没做完,先拿个常量顶着
-    public static final BigDecimal UNITPRICE = BigDecimal.TEN;
 
     @Autowired
     private InOutStorageBomService inOutStorageBomService;
 
     @Autowired
-    private InOutStorageDetailsService detailsService;
-
-    @Autowired
     private InventoryService inventoryService;
 
     @Override
@@ -65,8 +56,7 @@ public class InOutStorageServiceImpl extends ServiceImpl<InOutStorageMapper, InO
         wrapper.ge("ios", InOutStorage::getCreateTime, dto.getBeginTime());
         wrapper.le("ios", InOutStorage::getCreateTime, dto.getEndTime());
 
-        Page<InOutStorageVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
-        return page;
+        return this.baseMapper.getPage(dto.getPage(), wrapper);
     }
 
     @Override
@@ -80,7 +70,9 @@ public class InOutStorageServiceImpl extends ServiceImpl<InOutStorageMapper, InO
     @Override
     public void add(InOutStorageDto inOutStorageDto) {
 
+        inOutStorageDto.setId(IdWorker.getId());
         List<InOutStorageBom> inOutStorageBomList = inOutStorageDto.getInOutStorageBomList();
+        inOutStorageBomList.forEach(item -> item.setInOutStorageId(inOutStorageDto.getId()));
 
         if (InOutTypeEnum.getInOutType(inOutStorageDto.getType()).equals(InOutTypeEnum.IN)) {
             // 赋值入库单号
@@ -93,39 +85,10 @@ public class InOutStorageServiceImpl extends ServiceImpl<InOutStorageMapper, InO
             // 更新库存
             inventoryService.out(inOutStorageDto.getDepartmentId(), inOutStorageDto.getWarehouseId(), inOutStorageBomList);
         }
-        this.save(inOutStorageDto);
 
-        inOutStorageBomList.forEach(item -> item.setInOutStorageId(inOutStorageDto.getId()));
-        List<InOutStorageDetails> detailsList = new ArrayList<>();
-        //进行for循环
-        for (InOutStorageBom bom : inOutStorageBomList) {
-            if (inOutStorageDto.getType().equals(1)){
-                //创建InOutStorageDetails对象
-                InOutStorageDetails details = new InOutStorageDetails();
-                //将数据进行填充
-                details.setInUnitPrice(UNITPRICE);
-                details.setQuantity(bom.getQuantity());
-                details.setWarehouseId(inOutStorageDto.getWarehouseId());
-                details.setBomSpecId(bom.getBomSpecId());
-                details.setDepartmentId(inOutStorageDto.getDepartmentId());
-
-                detailsList.add(details);
-            }
-        }
-        //进行数据的添加
-        detailsService.saveBatch(detailsList);
+        // 保存出入库信息
+        this.save(inOutStorageDto);
         inOutStorageBomService.saveBatch(inOutStorageBomList);
-
-    }
-
-    @Override
-    public void edit(InOutStorageDto inOutStorageDto) {
-        this.updateById(inOutStorageDto);
-    }
-
-    @Override
-    public void delete(Long id) {
-        this.removeById(id);
     }
 
     @Transactional(rollbackFor = Exception.class)

+ 131 - 104
sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryServiceImpl.java

@@ -1,6 +1,5 @@
 package com.sd.business.service.inventory.impl;
 
-import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.exception.ServiceException;
@@ -11,7 +10,6 @@ import com.sd.business.entity.in.po.InOutStorageDetails;
 import com.sd.business.entity.inventory.bo.InOutFun;
 import com.sd.business.entity.inventory.dto.InventorySelectDto;
 import com.sd.business.entity.inventory.dto.QuantityByWarehouseDto;
-import com.sd.business.entity.inventory.po.BalancePriceNum;
 import com.sd.business.entity.inventory.po.Inventory;
 import com.sd.business.entity.inventory.po.InventoryBackup;
 import com.sd.business.entity.inventory.vo.InventoryVo;
@@ -20,7 +18,6 @@ import com.sd.business.entity.inventory.vo.QuantityByWarehouseVo;
 import com.sd.business.mapper.inventory.InventoryMapper;
 import com.sd.business.service.bom.BomSpecService;
 import com.sd.business.service.in.InOutStorageDetailsService;
-import com.sd.business.service.in.impl.InOutStorageServiceImpl;
 import com.sd.business.service.inventory.InventoryService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,7 +25,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -48,6 +45,8 @@ import java.util.stream.Collectors;
 @Service
 public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory> implements InventoryService {
 
+    private final static BigDecimal tempUnitPrice = BigDecimal.TEN;
+
     @Autowired
     private BomSpecService bomSpecService;
 
@@ -92,75 +91,71 @@ public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory
         List<Long> bomSpecIdList = list.stream().map(InOutFun::getBomSpecId).collect(Collectors.toList());
 
         synchronized (this) {
+
+            // 保存结存单价批次
+            List<InOutStorageDetails> inOutStorageDetailsList = list.stream().map(item -> {
+                InOutStorageDetails inOutStorageDetails = new InOutStorageDetails();
+                inOutStorageDetails.setDepartmentId(departmentId);
+                inOutStorageDetails.setWarehouseId(warehouseId);
+                inOutStorageDetails.setBomSpecId(item.getBomSpecId());
+                inOutStorageDetails.setInUnitPrice(tempUnitPrice);
+                inOutStorageDetails.setQuantity(item.getQuantity());
+                return inOutStorageDetails;
+            }).collect(Collectors.toList());
+            inOutStorageDetailsService.saveBatch(inOutStorageDetailsList);
+
+            // 通过事业部id和出库id获取bom规格库存
             List<Inventory> inventoryList = getInventoryList(departmentId, warehouseId, bomSpecIdList);
+
+            // 通过出库id获取bom规格结存列表
+            Map<Long, List<InOutStorageDetails>> inOutStorageDetailsMap = getInOutStorageDetailsMap(warehouseId, bomSpecIdList);
+
+            // 通过bom规格分组
             Map<Long, Inventory> map = inventoryList.stream().collect(Collectors.toMap(Inventory::getBomSpecId, Function.identity()));
 
             for (InOutFun inOutFun : list) {
-                Long bomSpecId = inOutFun.getBomSpecId();
-                BigDecimal quantity = inOutFun.getQuantity();
-                BigDecimal unitPrice = InOutStorageServiceImpl.UNITPRICE;
-                Inventory inventory = map.get(bomSpecId);
-
-                if (inventory != null) {
-                    inventory.setQuantity(inventory.getQuantity().add(quantity));
-                } else {
-                    inventory = new Inventory();
-                    inventory.setWarehouseId(warehouseId);
-                    inventory.setDepartmentId(departmentId);
-                    inventory.setBomSpecId(bomSpecId);
-                    inventory.setQuantity(quantity);
-                    inventoryList.add(inventory);
-                    map.put(bomSpecId, inventory);
-                }
-                Map<Long, List<InOutStorageDetails>> inOutStorageDetailsMap = getInOutStorageDetailsMap(warehouseId, bomSpecIdList);
-
-                //获取结存数量
-                BigDecimal sumQuantity = inOutStorageDetailsMap.getOrDefault(inOutFun.getBomSpecId(), Collections.emptyList())
-                        .stream().map(InOutStorageDetails::getQuantity)
-                        .filter(item -> item.compareTo(BigDecimal.ZERO) > 0)
-                        .reduce(BigDecimal.ZERO, BigDecimal::add);
-
-                BigDecimal sumPrice = inOutStorageDetailsMap.getOrDefault(inOutFun.getBomSpecId(), Collections.emptyList()).stream()
-                        .filter(item -> item.getQuantity().compareTo(BigDecimal.ZERO) > 0)
-                        .map(item -> item.getQuantity().multiply(item.getInUnitPrice()))
-                        .reduce(BigDecimal.ZERO, BigDecimal::add);
-
-                // 计算最新的结存数量和结存金额
-                sumQuantity = sumQuantity.add(quantity);
-                BigDecimal balancep = quantity.multiply(unitPrice);
-                sumPrice = sumPrice.add(balancep);
-                BigDecimal balanceUnitPrice = sumPrice.divide(sumQuantity, 2, BigDecimal.ROUND_HALF_UP);
+
+                // 库存
+                Inventory inventory = map.computeIfAbsent(inOutFun.getBomSpecId(), item -> {
+                    Inventory tempInventory = new Inventory();
+                    tempInventory.setWarehouseId(warehouseId);
+                    tempInventory.setDepartmentId(departmentId);
+                    tempInventory.setBomSpecId(item);
+                    tempInventory.setQuantity(BigDecimal.ZERO);
+                    inventoryList.add(tempInventory);
+                    return tempInventory;
+                });
+
+                // 获取入库结存单价
+                BigDecimal balanceUnitPrice = getBalanceUnitPrice(inOutStorageDetailsMap, inOutFun);
+
+                inventory.setQuantity(inventory.getQuantity().add(inOutFun.getQuantity()));
                 inventory.setBalanceUnitPrice(balanceUnitPrice);
             }
+
             saveOrUpdateBatch(inventoryList);
         }
     }
 
     @Override
     public void out(Long departmentId, Long warehouseId, List<? extends InOutFun> list) {
-
-        //存储一条数据出库的数量
-        Map<Long, BigDecimal> map = list.stream()
-                .collect(Collectors.toMap(InOutFun::getBomSpecId, InOutFun::getQuantity));
-
-        List<Long> bomSpecIdList = new ArrayList<>(map.keySet());
+        List<Long> bomSpecIdList = list.stream().map(InOutFun::getBomSpecId).collect(Collectors.toList());
 
         synchronized (this) {
 
+            // 通过事业部id和出库id获取bom规格库存
             List<Inventory> inventoryList = getInventoryList(departmentId, warehouseId, bomSpecIdList);
+            Map<Long, Inventory> inventoryMap = inventoryList.stream().collect(Collectors.toMap(Inventory::getBomSpecId, Function.identity()));
 
             // 获取bom规格id和结存明细列表map
             Map<Long, List<InOutStorageDetails>> inOutStorageDetailsMap = getInOutStorageDetailsMap(warehouseId, bomSpecIdList);
 
-            // 存储需要修改的入库记录
-            List<InOutStorageDetails> updateList = new ArrayList<>();
-
-            // 查询库存中是否存在bom
-            for (Inventory inventory : inventoryList) {
-
-                Long bomSpecId = inventory.getBomSpecId();
+            for (InOutFun inOutFun : list) {
+                Long bomSpecId = inOutFun.getBomSpecId();
+                BigDecimal quantity = inOutFun.getQuantity();
 
-                if (!bomSpecIdList.contains(bomSpecId)) {
+                Inventory inventory = inventoryMap.get(bomSpecId);
+                if (inventory == null || inventory.getQuantity().compareTo(quantity) < 0) {
                     BomSpec bomSpec = bomSpecService.getById(bomSpecId);
                     if (bomSpec == null) {
                         throw new ServiceException("未知bom规格id:" + bomSpecId);
@@ -168,69 +163,27 @@ public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory
                     throw new ServiceException("出库失败,品名为:" + bomSpec.getName() + "的bom库存不足");
                 }
 
-                List<InOutStorageDetails> outStorageDetails = inOutStorageDetailsMap.getOrDefault(bomSpecId, Collections.emptyList());
-                // 循环次数
-                int j = 0;
+                // 计算出库结存单价
+                BigDecimal balanceUnitPrice = getOutBalanceUnitPrice(inOutStorageDetailsMap, inOutFun);
 
-                // 需要出库数量
-                BigDecimal quantity = map.get(bomSpecId);
-
-                do {
-                    if (outStorageDetails.size() == j) {
-                        throw new ServiceException("数据异常,无法计算库存单价!!");
-                    }
-                    // 获取这条记录剩余的数量
-                    InOutStorageDetails inOutStorageDetails = outStorageDetails.get(j);
-
-                    // 单条可出库数量
-                    BigDecimal tempQuantity = inOutStorageDetails.getQuantity();
-
-                    if (tempQuantity.compareTo(quantity) > 0) {
-                        inOutStorageDetails.setQuantity(tempQuantity.subtract(quantity));
-                        quantity = BigDecimal.ZERO;
-                    } else if (tempQuantity.compareTo(quantity) < 0) {
-                        inOutStorageDetails.setQuantity(BigDecimal.ZERO);
-                        quantity = tempQuantity.subtract(quantity).abs();
-                    } else {
-                        inOutStorageDetails.setQuantity(BigDecimal.ZERO);
-                        quantity = BigDecimal.ZERO;
-                    }
-                    updateList.add(inOutStorageDetails);
-                    j++;
-
-                } while (quantity.compareTo(BigDecimal.ZERO) > 0);
-
-                // 库存总数量
-                BigDecimal totalInventory = outStorageDetails.stream()
-                        .map(InOutStorageDetails::getQuantity)
-                        .filter(item -> item.compareTo(BigDecimal.ZERO) > 0)
-                        .reduce(BigDecimal.ZERO, BigDecimal::add);
-
-                // 库存总金额
-                BigDecimal totalInventoryAmount = outStorageDetails.stream()
-                        .filter(item -> item.getQuantity().compareTo(BigDecimal.ZERO) > 0)
-                        .map(item -> item.getQuantity().multiply(item.getInUnitPrice()))
-                        .reduce(BigDecimal.ZERO, BigDecimal::add);
-
-                BigDecimal balanceUnitPrice;
-                // 结存单价
-                if (totalInventory.compareTo(BigDecimal.ZERO) == 0) {
-                    balanceUnitPrice = BigDecimal.ZERO;
-                } else {
-                    balanceUnitPrice = totalInventoryAmount.divide(totalInventory, 2, RoundingMode.HALF_UP);
-                }
                 // 赋值结存单价
                 inventory.setBalanceUnitPrice(balanceUnitPrice);
-                inventory.setQuantity(totalInventory);
+                inventory.setQuantity(inventory.getQuantity().subtract(quantity));
             }
 
             // 修改计算结存单价的出入库明细表
-            inOutStorageDetailsService.updateBatchById(updateList);
+            List<InOutStorageDetails> inOutStorageDetailsList = inOutStorageDetailsMap.values()
+                    .stream().flatMap(Collection::stream).collect(Collectors.toList());
+            inOutStorageDetailsService.updateBatchById(inOutStorageDetailsList);
 
             // 修改库存数量以及结存单价
             updateBatchById(inventoryList);
         }
     }
+
+    /**
+     * 通过事业部id和出库id获取bom规格库存
+     */
     private List<Inventory> getInventoryList(Long departmentId, Long warehouseId, List<Long> bomSpecIdList) {
         return list(q -> q
                 .eq(Inventory::getDepartmentId, departmentId)
@@ -238,6 +191,10 @@ public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory
                 .in(Inventory::getBomSpecId, bomSpecIdList)
         );
     }
+
+    /**
+     * 通过出库id获取bom规格结存列表
+     */
     private Map<Long, List<InOutStorageDetails>> getInOutStorageDetailsMap(Long warehouseId, List<Long> bomSpecIdList) {
         List<InOutStorageDetails> list = inOutStorageDetailsService.list(q -> q
                 .eq(InOutStorageDetails::getWarehouseId, warehouseId)
@@ -247,4 +204,74 @@ public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory
         return list.stream().collect(Collectors.groupingBy(InOutStorageDetails::getBomSpecId));
     }
 
+    /**
+     * 获取入库结存单价
+     */
+    private BigDecimal getBalanceUnitPrice(Map<Long, List<InOutStorageDetails>> inOutStorageDetailsMap, InOutFun inOutFun) {
+
+        // 获取结存数量
+        BigDecimal sumQuantity = inOutStorageDetailsMap
+                .getOrDefault(inOutFun.getBomSpecId(), Collections.emptyList())
+                .stream()
+                .map(InOutStorageDetails::getQuantity)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        // 获取结存金额
+        BigDecimal sumPrice = inOutStorageDetailsMap
+                .getOrDefault(inOutFun.getBomSpecId(), Collections.emptyList())
+                .stream()
+                .map(item -> item.getQuantity().multiply(item.getInUnitPrice()))
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        // 结存单价
+        if (sumQuantity.compareTo(BigDecimal.ZERO) == 0) {
+            return BigDecimal.ZERO;
+        }
+
+        // 计算新结存单价
+        return sumPrice.divide(sumQuantity, 2, RoundingMode.HALF_UP);
+    }
+
+    /**
+     * 获取出库结存单价
+     */
+    private BigDecimal getOutBalanceUnitPrice(Map<Long, List<InOutStorageDetails>> inOutStorageDetailsMap, InOutFun inOutFun) {
+
+        Long bomSpecId = inOutFun.getBomSpecId();
+        BigDecimal quantity = inOutFun.getQuantity();
+
+        List<InOutStorageDetails> outStorageDetails = inOutStorageDetailsMap.getOrDefault(bomSpecId, Collections.emptyList());
+
+        // 循环次数
+        int j = 0;
+
+        do {
+            if (outStorageDetails.size() == j) {
+                throw new ServiceException("数据异常,无法计算库存单价!!");
+            }
+
+            // 获取这条记录剩余的数量
+            InOutStorageDetails inOutStorageDetails = outStorageDetails.get(j);
+
+            // 单条可出库数量
+            BigDecimal tempQuantity = inOutStorageDetails.getQuantity();
+
+            if (tempQuantity.compareTo(quantity) > 0) {
+                inOutStorageDetails.setQuantity(tempQuantity.subtract(quantity));
+                quantity = BigDecimal.ZERO;
+            } else if (tempQuantity.compareTo(quantity) < 0) {
+                inOutStorageDetails.setQuantity(BigDecimal.ZERO);
+                quantity = quantity.subtract(tempQuantity);
+            } else {
+                inOutStorageDetails.setQuantity(BigDecimal.ZERO);
+                quantity = BigDecimal.ZERO;
+            }
+
+            j++;
+
+        } while (quantity.compareTo(BigDecimal.ZERO) > 0);
+
+        return getBalanceUnitPrice(inOutStorageDetailsMap, inOutFun);
+    }
+
 }