Browse Source

in和out基本的逻辑完成
bug还没修好

xiaomi 1 year ago
parent
commit
261573affc

+ 0 - 6
sd-business/src/main/java/com/sd/business/entity/in/po/InOutStorageBom.java

@@ -41,11 +41,5 @@ public class InOutStorageBom extends BasePo implements InOutFun {
     @DecimalMin(value = "0.01", message = "出入库数量必须大于0")
     private BigDecimal quantity;
 
-    /**
-     * 单价
-     */
-    @NotNull(message = "出入库单价不能为空")
-    @DecimalMin(value = "0.01",message = "入库单价必须大于0")
-    private BigDecimal unitPrice;
 
 }

+ 4 - 9
sd-business/src/main/java/com/sd/business/entity/in/po/InOutStorageDetails.java

@@ -26,12 +26,7 @@ public class InOutStorageDetails extends BasePo {
     private Long inOutStorageId;
 
     /**
-     * 类型:1入库 0出库
-     */
-    private Long type;
-
-    /**
-     * 库存id
+     * 事业部id
      */
     private Long departmentId;
 
@@ -46,17 +41,17 @@ public class InOutStorageDetails extends BasePo {
     private Long bomSpecId;
 
     /**
-     * 入库金额
+     * 金额
      */
     private BigDecimal inSumPrice;
 
     /**
-     * 入库单价
+     * 单价
      */
     private BigDecimal inUnitPrice;
 
     /**
-     * 入库数量
+     * 数量
      */
     private BigDecimal quantity;
 

+ 0 - 6
sd-business/src/main/java/com/sd/business/entity/inventory/bo/InOutFun.java

@@ -14,10 +14,4 @@ public interface InOutFun {
      */
     BigDecimal getQuantity();
 
-    /**
-     * 入库单价
-     * @return
-     */
-    BigDecimal getUnitPrice();
-
 }

+ 3 - 0
sd-business/src/main/java/com/sd/business/entity/inventory/po/BalancePriceNum.java

@@ -1,5 +1,7 @@
 package com.sd.business.entity.inventory.po;
 
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.ruoyi.common.core.domain.BasePo;
 import lombok.Getter;
 import lombok.Setter;
@@ -8,6 +10,7 @@ import java.math.BigDecimal;
 
 @Getter
 @Setter
+@TableName("in_out_storage_details")
 public class BalancePriceNum extends BasePo {
 
     /**

+ 2 - 4
sd-business/src/main/java/com/sd/business/service/in/impl/InOutStorageDetailsServiceImpl.java

@@ -30,15 +30,13 @@ public class InOutStorageDetailsServiceImpl extends ServiceImpl<InOutStorageDeta
     public Page<InOutStorageDetailsVo> getPage(InOutStorageDetailsSelectDto dto) {
         IWrapper<InOutStorageDetails> wrapper = getWrapper();
         wrapper.orderByDesc("iosd", InOutStorageDetails::getId);
-        Page<InOutStorageDetailsVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
-        return page;
+        return this.baseMapper.getPage(dto.getPage(), wrapper);
     }
 
     @Override
     public InOutStorageDetailsVo detail(Long id) {
         InOutStorageDetails InOutStorageDetails = this.getById(id);
-        InOutStorageDetailsVo result = BeanUtil.toBean(InOutStorageDetails, InOutStorageDetailsVo.class);
-        return result;
+        return BeanUtil.toBean(InOutStorageDetails, InOutStorageDetailsVo.class);
     }
 
     @Override

+ 4 - 3
sd-business/src/main/java/com/sd/business/service/in/impl/InOutStorageServiceImpl.java

@@ -41,6 +41,8 @@ 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;
@@ -101,14 +103,13 @@ public class InOutStorageServiceImpl extends ServiceImpl<InOutStorageMapper, InO
             InOutStorageDetails details = new InOutStorageDetails();
             //将数据进行填充
             details.setInOutStorageId(bom.getInOutStorageId());
-            details.setInUnitPrice(bom.getUnitPrice());
+            details.setInUnitPrice(UNITPRICE);
             details.setQuantity(bom.getQuantity());
             details.setWarehouseId(inOutStorageDto.getWarehouseId());
             details.setBomSpecId(bom.getBomSpecId());
             details.setDepartmentId(inOutStorageDto.getDepartmentId());
-            details.setType(1L);
             //计算入库金额
-            BigDecimal sumPrice = bom.getUnitPrice().multiply(bom.getQuantity());
+            BigDecimal sumPrice = UNITPRICE.multiply(bom.getQuantity());
             details.setInSumPrice(sumPrice);
             detailsList.add(details);
         }

+ 69 - 72
sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryServiceImpl.java

@@ -1,5 +1,7 @@
 package com.sd.business.service.inventory.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.exception.ServiceException;
@@ -19,6 +21,7 @@ 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 org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -96,7 +99,7 @@ public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory
             for (InOutFun inOutFun : list) {
                 Long bomSpecId = inOutFun.getBomSpecId();
                 BigDecimal quantity = inOutFun.getQuantity();
-                BigDecimal unitPrice = inOutFun.getUnitPrice();
+                BigDecimal unitPrice = InOutStorageServiceImpl.UNITPRICE;
                 Inventory inventory = map.get(bomSpecId);
 
                 if (inventory != null) {
@@ -113,9 +116,13 @@ public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory
 
                 // 根据bom规格id和仓库id获取结存金额和结存数量
                 BalancePriceNum priceAndNum = baseMapper.getPriceAndNum(bomSpecId, warehouseId);
+                if (priceAndNum == null){
+                    throw new ServiceException("没有该数据");
+                }
                 BigDecimal balanceNum = priceAndNum.getBalanceNum();
                 BigDecimal balancePrice = priceAndNum.getBalancePrice();
 
+
                 // 计算最新的结存数量和结存金额
                 balanceNum = balanceNum.add(quantity);
                 BigDecimal balancep = quantity.multiply(unitPrice);
@@ -151,83 +158,73 @@ public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory
 
             //根据仓库id和规格id获取出入详细表数据
             List<InOutStorageDetails> detailsList = getDetailsList(warehouseId, bomSpecIdList);
-            List<InOutStorageDetails> updateList = new ArrayList<>();
-            List<InOutStorageDetails> outDetailsList = new ArrayList<>();
-            Map<Long,BigDecimal> outPriceMap = new HashMap<>();
-
-            for (int i = 0; i < detailsList.size(); i++) {
-                InOutStorageDetails details = detailsList.get(i);
+            if (CollUtil.isEmpty(detailsList)){
+                throw new ServiceException("");
             }
-
-            for (InOutStorageDetails details : detailsList) {
-                //如果数量足够减扣
-                BigDecimal outNum = map.get(details.getBomSpecId());
-                if (details.getQuantity().compareTo(outNum) >= 0){
-                    //对数量进行减扣
-                    details.setQuantity(details.getQuantity().subtract(outNum));
-
-                    //将这次出库的金额存储到map里面
-                    BigDecimal outPrice = details.getInUnitPrice().multiply(outNum);
-                    outPriceMap.put(details.getBomSpecId(),outPrice);
-
-                    //将减扣数量后的对象修改回去
-                    updateList.add(details);
-                    //创建一个新的对象
-                    InOutStorageDetails outStorageDetails = new InOutStorageDetails();
-                    //将数据进行拷贝
-                    BeanUtils.copyProperties(details,outStorageDetails);
-                    //修改需要修改的值
-                    outStorageDetails.setQuantity(outNum);
-                    outStorageDetails.setId(null);
-                    outStorageDetails.setType(0L);
-                    //添加记录
-                    outDetailsList.add(outStorageDetails);
-                    break;
+            //存储需要修改的入库记录
+            List<InOutStorageDetails> updateList = new ArrayList<>();
+            //存储这次出库的金额
+            Map<Long, BigDecimal> outPriceMap = new HashMap<>();
+
+            int j = 0;
+            BigDecimal quantity;
+            do {
+                InOutStorageDetails details = detailsList.get(j);
+                BigDecimal num = map.get(details.getBomSpecId());
+                quantity = details.getQuantity().subtract(num);
+                if (quantity.compareTo(BigDecimal.ZERO) < 0){
+                    throw new ServiceException("出库失败,库存不足");
                 }
-                // 数量不够减扣
-                // 获取剩余的数量
-                BigDecimal remainderNum = outNum.subtract(details.getQuantity());
-                if (remainderNum.compareTo(BigDecimal.ZERO) > 0) {
-                    details.setQuantity(BigDecimal.ZERO);
-                    updateList.add(details);
+                //对数量进行减扣
+                BigDecimal detailsNum = details.getQuantity().subtract(num);
+                details.setQuantity(detailsNum);
+
+                //数量减少了,那金额也得减少
+                details.setInSumPrice(detailsNum.multiply(details.getInUnitPrice()));
+
+                //将这次出库的金额存储到map里面
+                BigDecimal outPrice = details.getInUnitPrice().multiply(num);
+                outPriceMap.put(details.getBomSpecId(), outPrice);
+                //将减扣数量后的对象修改回去
+                updateList.add(details);
+                j++;
+
+            }while (quantity.compareTo(BigDecimal.ZERO) > 0);
+
+
+                inOutStorageDetailsService.updateBatchById(updateList);
+                /*inOutStorageDetailsService.saveBatch(outDetailsList);*/
+
+                for (Inventory inventory : inventoryList) {
+                    // 获取之前的结存金额
+                    BigDecimal balancePrice = inventory.getQuantity().multiply(inventory.getBalanceUnitPrice());
+                    // 减去出库金额后的结存金额
+                    BigDecimal newBalancePrice = balancePrice.subtract(outPriceMap.get(inventory.getBomSpecId()));
+                    // 减去出库数量后的结存数量
+                    inventory.setQuantity(inventory.getQuantity().subtract(map.get(inventory.getBomSpecId())));
+                    // 获取最后的结存单价
+                    BigDecimal balanceUnitPrice = newBalancePrice.divide(inventory.getQuantity(), 2, BigDecimal.ROUND_HALF_UP);
+                    //将数据存入对象
+                    inventory.setBalanceUnitPrice(balanceUnitPrice);
                 }
-                // TODO 这时候需要顺延到下一条记录,暂时没想好怎么顺
-                // 上面也许可以不用增强for,普通for试试
-            }
-            inOutStorageDetailsService.updateBatchById(updateList);
-            inOutStorageDetailsService.saveBatch(outDetailsList);
-
-            for (Inventory inventory : inventoryList) {
-                // 获取之前的结存金额
-                BigDecimal balancePrice = inventory.getQuantity().multiply(inventory.getBalanceUnitPrice());
-                // 减去出库金额后的结存金额
-                BigDecimal newBalancePrice = balancePrice.subtract(outPriceMap.get(inventory.getBomSpecId()));
-                // 减去出库数量后的结存数量
-                inventory.setQuantity(inventory.getQuantity().subtract(map.get(inventory.getBomSpecId())));
-                // 获取最后的结存单价
-                BigDecimal balanceUnitPrice = newBalancePrice.divide(inventory.getQuantity(), 2, BigDecimal.ROUND_HALF_UP);
-                //将数据存入对象
-                inventory.setBalanceUnitPrice(balanceUnitPrice);
+                updateBatchById(inventoryList);
             }
-            updateBatchById(inventoryList);
-        }
-
-    }
 
-    private List<Inventory> getInventoryList(Long departmentId, Long warehouseId, List<Long> bomSpecIdList) {
-        return list(q -> q
-                .eq(Inventory::getDepartmentId, departmentId)
-                .eq(Inventory::getWarehouseId, warehouseId)
-                .in(Inventory::getBomSpecId, bomSpecIdList)
-        );
     }
+        private List<Inventory> getInventoryList (Long departmentId, Long warehouseId, List < Long > bomSpecIdList){
+            return list(q -> q
+                    .eq(Inventory::getDepartmentId, departmentId)
+                    .eq(Inventory::getWarehouseId, warehouseId)
+                    .in(Inventory::getBomSpecId, bomSpecIdList)
+            );
+        }
 
-    private List<InOutStorageDetails> getDetailsList(Long warehouseId, List<Long> bomSpecIdList) {
-        return inOutStorageDetailsService.list(q -> q
-                .eq(InOutStorageDetails::getWarehouseId, warehouseId)
-                .in(InOutStorageDetails::getBomSpecId, bomSpecIdList)
-                .isNotNull(InOutStorageDetails::getQuantity)
-        );
-    }
+        private List<InOutStorageDetails> getDetailsList (Long warehouseId, List < Long > bomSpecIdList){
+            return inOutStorageDetailsService.list(q -> q
+                    .eq(InOutStorageDetails::getWarehouseId, warehouseId)
+                    .in(InOutStorageDetails::getBomSpecId, bomSpecIdList)
+                    .isNotNull(InOutStorageDetails::getQuantity)
+            );
+        }
 
 }

+ 3 - 2
sd-business/src/main/resources/mapper/in/InOutStorageDetailsMapper.xml

@@ -5,8 +5,7 @@
         select
             iosd.id,
             iosd.in_out_storage_id,
-            iosd.type,
-            iosd.inventory_id,
+            iosd.department_id,
             iosd.warehouse_id,
             iosd.bom_spec_id,
             iosd.in_sum_price,
@@ -20,4 +19,6 @@
             ${ew.customSqlSegment}
     </select>
 
+
+
 </mapper>

+ 5 - 7
sd-business/src/main/resources/mapper/inventory/InventoryMapper.xml

@@ -46,10 +46,10 @@
         order by d.id
     </select>
 
-    <select id="getPriceAndNum" resultType="com.sd.business.entity.inventory.po.BalancePriceNum">
-        select sum(ifnull(i.in_sum_price, 0)) balancePrice
-              ,sum(ifnull(i.quantity, 0)) balanceNum
-        from in_out_storage_details i
+    <select id="getPriceAndNum" resultType="com.sd.business.entity.in.po.InOutStorageDetails">
+        select sum(in_sum_price) balancePrice,
+               sum(quantity) balanceNum
+        from in_out_storage_details iosd
         <where>
             <if test="bomSpecId != null">
                 and  bom_spec_id = #{bomSpecId}
@@ -57,7 +57,6 @@
             <if test="warehouseId != null">
                 and warehouse_id = #{warehouseId}
             </if>
-            and type = 1
         </where>
     </select>
 
@@ -76,8 +75,7 @@
             <if test="departmentId != null">
                 and department_id = #{departmentId}
             </if>
-            and type = 1
-            and quantity > 0
+            and i.quantity > 0
         </where>
         order by i.create_time
     </select>