Răsfoiți Sursa

库存操作统一

yzc 1 an în urmă
părinte
comite
cd01c33a0d

+ 0 - 22
hx-wms/src/main/java/com/fjhx/wms/entity/stock/bo/InOutBo.java

@@ -1,22 +0,0 @@
-package com.fjhx.wms.entity.stock.bo;
-
-import lombok.Getter;
-import lombok.Setter;
-
-import java.math.BigDecimal;
-
-@Getter
-@Setter
-public class InOutBo {
-
-    /**
-     * 产品id
-     */
-    private Long productId;
-
-    /**
-     * 出入库数量
-     */
-    private BigDecimal quantity;
-
-}

+ 0 - 14
hx-wms/src/main/java/com/fjhx/wms/entity/stock/emums/InOutType.java

@@ -1,14 +0,0 @@
-package com.fjhx.wms.entity.stock.emums;
-
-public enum InOutType {
-
-    /**
-     * 入库
-     */
-    IN,
-
-    /**
-     * 出库
-     */
-    OUT,
-}

+ 2 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/emums/JournalType.java

@@ -1,5 +1,6 @@
 package com.fjhx.wms.entity.stock.emums;
 
+import com.fjhx.common.enums.InOutType;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
@@ -21,6 +22,7 @@ public enum JournalType {
     JD_BACK_IN(InOutType.IN, 15, "京东退货入库", ""),
 
 
+    //待出入库类型
     BORDER_OF_LINE_IN(InOutType.IN, 16, "待入库 线边回仓", ""),
     COMPLETION_IN(InOutType.IN, 17, "待入库 完工入库", ""),
     PURCHASE_ARRIVAL_IN(InOutType.IN, 18, "待入库 采购到货", ""),

+ 1 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/emums/StockWaitType.java

@@ -1,5 +1,6 @@
 package com.fjhx.wms.entity.stock.emums;
 
+import com.fjhx.common.enums.InOutType;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 

+ 5 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/po/Stock.java

@@ -45,4 +45,9 @@ public class Stock extends BasePo {
      */
     private BigDecimal unitPrice;
 
+    /**
+     * 归属公司id
+     */
+    private Long companyId;
+
 }

+ 1 - 1
hx-wms/src/main/java/com/fjhx/wms/service/stock/StockService.java

@@ -62,7 +62,6 @@ public interface StockService extends BaseService<Stock> {
      */
     void delete(Long id);
 
-    void ModifyInventory(int type, List<Stock> list, Long warehouseId);
 
     /**
      * 良品转次品
@@ -88,4 +87,5 @@ public interface StockService extends BaseService<Stock> {
      */
     void inOut(List<? extends InOutBo> list, Long warehouseId, JournalType journalType, Long businessId);
 
+    void changeStock(List<? extends InOutBo> list, Long warehouseId, JournalType journalType);
 }

+ 2 - 1
hx-wms/src/main/java/com/fjhx/wms/service/stock/StockWaitService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.wms.entity.stock.dto.StockWaitDetailsDto;
 import com.fjhx.wms.entity.stock.dto.StockWaitDto;
 import com.fjhx.wms.entity.stock.dto.StockWaitSelectDto;
+import com.fjhx.wms.entity.stock.emums.JournalType;
 import com.fjhx.wms.entity.stock.po.StockWait;
 import com.fjhx.wms.entity.stock.vo.StockWaitVo;
 import com.ruoyi.common.core.service.BaseService;
@@ -59,5 +60,5 @@ public interface StockWaitService extends BaseService<StockWait> {
      */
     void delete(Long id);
 
-    Integer getStockJournalType(int businessType);
+    JournalType getStockJournalType(int businessType);
 }

+ 70 - 93
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fjhx.wms.service.stock.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSONArray;
@@ -342,10 +343,13 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
     @Override
     @DSTransactional
     public void add(StockDto stockDto) {
+        JournalType journalType = Objects.equals(stockDto.getType(), 1) ? JournalType.MANUAL_IN : JournalType.MANUAL_OUT;
+        InOutType inOutType = journalType.getType();
+
         //创建出入库记录
         StockJournal stockJournal = new StockJournal();
         stockJournal.setOpType(stockDto.getType());
-        stockJournal.setType(stockDto.getType());
+        stockJournal.setType(journalType.getDetailType());
         stockJournal.setCode(stockDto.getType() == 1 ? CodeEnum.SIN_CODE.getCode() : CodeEnum.SOUT_CODE.getCode());
         stockJournal.setWarehouseId(stockDto.getWarehouseId());
         stockJournal.setBusinessId(stockDto.getBusinessId());
@@ -363,56 +367,21 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
             stockJournalDetailsList.add(stockJournalDetails);
         }
         //操作库存
-        ModifyInventory(1, stockDto.getList(), stockDto.getWarehouseId());
-
-
-//        changeStock(stockDto.getList());
+        List<InOutBo> inOutBoList = BeanUtil.copyToList(list, InOutBo.class);
+        changeStock(inOutBoList, stockDto.getWarehouseId(), journalType);
 
         //保存出入库明细
         stockJournalDetailsService.saveBatch(stockJournalDetailsList);
 
         //修改可用库存
-        List<InOutBo> inOutBoList = new ArrayList<>();
-        InOutType inOutType = Objects.equals(stockDto.getType(), 1) ? InOutType.IN : InOutType.OUT;
         ProductAvailableRecordType productAvailableRecordType = inOutType.equals(InOutType.IN) ? ProductAvailableRecordType.HAND_IN : ProductAvailableRecordType.HAND_OUT;
-
-        for (Stock stock : list) {
-            InOutBo inOutBo = new InOutBo();
-            inOutBo.setProductId(stock.getProductId());
-            inOutBo.setQuantity(stock.getQuantity());
-            inOutBoList.add(inOutBo);
-        }
-
         productInfoService.editAvailableQuantity(inOutBoList, inOutType, null, productAvailableRecordType, SecurityUtils.getCompanyId());
     }
 
     @Override
     @DSTransactional
     public void edit(StockDto stockDto) {
-        //创建出入库记录
-        StockJournal stockJournal = new StockJournal();
-        stockJournal.setOpType(stockDto.getType());
-        stockJournal.setCode(stockDto.getType() == 1 ? CodeEnum.SIN_CODE.getCode() : CodeEnum.SOUT_CODE.getCode());
-        stockJournal.setType(stockDto.getType());
-        stockJournal.setWarehouseId(stockDto.getWarehouseId());
-        stockJournal.setBusinessId(stockDto.getBusinessId());
-        //保存出入库记录
-        stockJournalService.save(stockJournal);
-        //操作库存
-        List<Stock> list = stockDto.getList();
-        List<StockJournalDetails> stockJournalDetailsList = new ArrayList<>();
-        for (Stock stock : list) {
-            //创建出入库明细
-            StockJournalDetails stockJournalDetails = new StockJournalDetailsDto();
-            stockJournalDetails.setStockJournalId(stockJournal.getId());
-            stockJournalDetails.setProductId(stock.getProductId());
-            stockJournalDetails.setQuantity(stock.getQuantity());
-            stockJournalDetails.setBusinessDetailsId(stock.getId());
-            stockJournalDetailsList.add(stockJournalDetails);
-        }
-        ModifyInventory(2, stockDto.getList(), stockDto.getWarehouseId());
-        //保存出入库明细
-        stockJournalDetailsService.saveBatch(stockJournalDetailsList);
+        add(stockDto);
     }
 
     @Override
@@ -420,58 +389,57 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
         this.removeById(id);
     }
 
-    /**
-     * 操作库存通用方法
-     *
-     * @param type 1入库 2出库 3维多利亚冻结库存入库 4维多利亚待出库次品库存
-     */
-    @Override
-    public synchronized void ModifyInventory(int type, List<Stock> list, Long warehouseId) {
-        List<Stock> data = new ArrayList<>();
-
-        //获取现有库存
-        List<Long> productIds = list.stream().map(Stock::getProductId).collect(Collectors.toList());
-        Map<Long, Stock> stockMap = this.mapKEntity(Stock::getProductId, q -> q.in(Stock::getProductId, productIds).eq(Stock::getWarehouseId, warehouseId));
-
-        for (Stock stock : list) {
-            //忽略操作数量为0的记录 避免出现出入库记录为0的条目
-            if (BigDecimal.ZERO.compareTo(stock.getQuantity()) == 0) {
-                continue;
-            }
-
-            Stock oldStocks = stockMap.get(stock.getProductId());
-            //如果库存不存在 就创建一条空库存
-            if (ObjectUtil.isEmpty(oldStocks)) {
-                oldStocks = new Stock();
-                oldStocks.setProductId(stock.getProductId());
-                oldStocks.setWarehouseId(warehouseId);
-                oldStocks.setQuantity(BigDecimal.ZERO);
-            }
-
-            if (type == 1) {
-                //入库库存相加
-                BigDecimal quantity = oldStocks.getQuantity().add(stock.getQuantity());
-                oldStocks.setQuantity(quantity);
-            } else if (type == 2) {
-                //出库库存相减
-                ProductInfo productInfo = productInfoService.getById(stock.getProductId());
-                if (productInfo == null) {
-                    throw new ServiceException("产品id:" + stock.getProductId() + "不存在");
-                }
-                BigDecimal quantity = oldStocks.getQuantity().subtract(stock.getQuantity());
-                if (quantity.compareTo(BigDecimal.ZERO) < 0) {
-                    throw new ServiceException("以下商品库存不足,无法出库:" + productInfo.getName());
-                }
-                oldStocks.setQuantity(quantity);
-            } else {
-                throw new ServiceException("未知库存操作类型");
-            }
-            data.add(oldStocks);
-
-        }
-        //操作库存
-        saveOrUpdateBatch(data);
-    }
+//    /**
+//     * 操作库存通用方法
+//     *
+//     * @param type 1入库 2出库 3维多利亚冻结库存入库 4维多利亚待出库次品库存
+//     */
+//    public synchronized void ModifyInventory(int type, List<Stock> list, Long warehouseId) {
+//        List<Stock> data = new ArrayList<>();
+//
+//        //获取现有库存
+//        List<Long> productIds = list.stream().map(Stock::getProductId).collect(Collectors.toList());
+//        Map<Long, Stock> stockMap = this.mapKEntity(Stock::getProductId, q -> q.in(Stock::getProductId, productIds).eq(Stock::getWarehouseId, warehouseId));
+//
+//        for (Stock stock : list) {
+//            //忽略操作数量为0的记录 避免出现出入库记录为0的条目
+//            if (BigDecimal.ZERO.compareTo(stock.getQuantity()) == 0) {
+//                continue;
+//            }
+//
+//            Stock oldStocks = stockMap.get(stock.getProductId());
+//            //如果库存不存在 就创建一条空库存
+//            if (ObjectUtil.isEmpty(oldStocks)) {
+//                oldStocks = new Stock();
+//                oldStocks.setProductId(stock.getProductId());
+//                oldStocks.setWarehouseId(warehouseId);
+//                oldStocks.setQuantity(BigDecimal.ZERO);
+//            }
+//
+//            if (type == 1) {
+//                //入库库存相加
+//                BigDecimal quantity = oldStocks.getQuantity().add(stock.getQuantity());
+//                oldStocks.setQuantity(quantity);
+//            } else if (type == 2) {
+//                //出库库存相减
+//                ProductInfo productInfo = productInfoService.getById(stock.getProductId());
+//                if (productInfo == null) {
+//                    throw new ServiceException("产品id:" + stock.getProductId() + "不存在");
+//                }
+//                BigDecimal quantity = oldStocks.getQuantity().subtract(stock.getQuantity());
+//                if (quantity.compareTo(BigDecimal.ZERO) < 0) {
+//                    throw new ServiceException("以下商品库存不足,无法出库:" + productInfo.getName());
+//                }
+//                oldStocks.setQuantity(quantity);
+//            } else {
+//                throw new ServiceException("未知库存操作类型");
+//            }
+//            data.add(oldStocks);
+//
+//        }
+//        //操作库存
+//        saveOrUpdateBatch(data);
+//    }
 
     /**
      * 次品转良品
@@ -540,7 +508,14 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
     /**
      * 改变库存数量
      */
-    private synchronized void changeStock(List<? extends InOutBo> list, Long warehouseId, JournalType journalType) {
+    @Override
+    public synchronized void changeStock(List<? extends InOutBo> list, Long warehouseId, JournalType journalType) {
+        Warehouse warehouse = warehouseService.getById(warehouseId);
+        if (ObjectUtil.isEmpty(warehouse)) {
+            throw new ServiceException("仓库不存在");
+        }
+        //获取归属公司id
+        Long companyId = warehouse.getCompanyId();
 
         Map<Long, BigDecimal> map = list.stream().collect(Collectors.toMap(
                 InOutBo::getProductId,
@@ -550,13 +525,14 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
 
         if (journalType.getType().equals(InOutType.IN)) {
             map.forEach((productId, quantity) -> {
-                Stock stock = getOne(q -> q.eq(Stock::getProductId, productId).eq(Stock::getWarehouseId, warehouseId));
+                Stock stock = getOne(q -> q.eq(Stock::getProductId, productId).eq(Stock::getWarehouseId, warehouseId).eq(Stock::getCompanyId, companyId));
 
                 if (stock == null) {
                     stock = new Stock();
                     stock.setWarehouseId(warehouseId);
                     stock.setProductId(productId);
                     stock.setQuantity(quantity);
+                    stock.setCompanyId(companyId);
                     save(stock);
                 } else {
                     Long stockId = stock.getId();
@@ -572,6 +548,7 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
                         .setSql("quantity = quantity - '" + quantity + "'")
                         .eq(Stock::getProductId, productId)
                         .eq(Stock::getWarehouseId, warehouseId)
+                        .eq(Stock::getCompanyId, companyId)
                         .apply("quantity - {0} >= 0", quantity)
                 );
 

+ 12 - 67
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.entity.InOutBo;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
@@ -182,8 +183,6 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
         }
     }
 
-    //    @DSTransactional
-//    @Override
     public void add1(StockWaitDto stockWaitDto) {
         Assert.notEmpty(stockWaitDto.getId(), "待出入库id不能为空");
         Assert.notEmpty(stockWaitDto.getWarehouseId(), "仓库id不能为空");
@@ -197,71 +196,16 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
         StockWait stockWait = getById(stockWaitDto.getId());
         updateById(stockWait);
 
-//        //如果业务类型是 采购到货入库 计算结存单价[结存单价=(结存单价*库存数量+采购单价*入库数量)/(库存数量+入库数量)]
-//        if (StockWaitType.PURCHASE_ARRIVAL_IN.getDetailType().equals(stockWait.getBusinessType())) {
-//            //获取待入库明细信息
-//            List<Long> swdId = stockWaitDetailsDtoList.stream().map(StockWaitDetails::getId).collect(Collectors.toList());
-//            List<StockWaitDetails> oldStockWaitDetailsList = stockWaitDetailsService.listByIds(swdId);
-//            Map<Long, StockWaitDetails> oldStockWaitDetailsMap = oldStockWaitDetailsList.stream()
-//                    .collect(Collectors.toMap(StockWaitDetails::getId, Function.identity()));
-//
-//            List<Long> productIds = oldStockWaitDetailsList.stream().map(StockWaitDetails::getProductId).collect(Collectors.toList());
-//            //获取库存消息
-//            Map<Long, Stock> stockMap = stockService.mapKEntity(Stock::getProductId, q -> q
-//                    .eq(Stock::getWarehouseId, stockWaitDto.getWarehouseId())
-//                    .in(Stock::getProductId, productIds));
-//            //获取到货明细信息
-//            List<Long> arrivalDetailsIds = oldStockWaitDetailsList.stream().map(StockWaitDetails::getBusinessDetailsId).collect(Collectors.toList());
-//            List<ArrivalDetailPo> arrivalDetailList = myPurchaseService.getArrivalDetailList(arrivalDetailsIds);
-//            Assert.notEmpty(arrivalDetailList, "到货明细信息为空");
-//            Map<Long, ArrivalDetailPo> arrivalDetailPoMap = arrivalDetailList.stream().collect(Collectors.toMap(ArrivalDetailPo::getId, Function.identity()));
-//            //获取采购明细信息
-//            List<Long> purchaseDetailIds = arrivalDetailList.stream().map(ArrivalDetailPo::getPurchaseDetailId).collect(Collectors.toList());
-//            List<PurchaseDetailPo> purchaseDetailList = myPurchaseService.getPurchaseDetailList(purchaseDetailIds);
-//            Assert.notEmpty(arrivalDetailList, "采购明细信息为空");
-//            Map<Long, PurchaseDetailPo> purchaseDetailPoMap = purchaseDetailList.stream().collect(Collectors.toMap(PurchaseDetailPo::getId, Function.identity()));
-//
-//            List<Stock> stockList1 = new ArrayList<>();
-//            for (StockWaitDetails stockWaitDetails : stockWaitDetailsDtoList) {
-//                StockWaitDetails oldStockWaitDetails = oldStockWaitDetailsMap.get(stockWaitDetails.getId());
-//                Assert.notEmpty(oldStockWaitDetails, "查询不到待入库明细信息");
-//                //获取到货信息
-//                ArrivalDetailPo arrivalDetailPo = arrivalDetailPoMap.get(oldStockWaitDetails.getBusinessDetailsId());
-//                Assert.notEmpty(arrivalDetailPo, "查询不到到货明细信息");
-//                //获取采购信息
-//                PurchaseDetailPo purchaseDetailPo = purchaseDetailPoMap.get(arrivalDetailPo.getPurchaseDetailId());
-//                Assert.notEmpty(arrivalDetailPo, "查询不到采购明细信息");
-//                //获取库存信息
-//                Stock stock = stockMap.get(oldStockWaitDetails.getProductId());
-//                if (ObjectUtil.isEmpty(stock)) {
-//                    stock = new Stock();
-//                    stock.setWarehouseId(stockWaitDto.getWarehouseId());
-//                    stock.setProductId(oldStockWaitDetails.getProductId());
-//                    stock.setQuantity(BigDecimal.ZERO);
-//                    stock.setUnitPrice(BigDecimal.ZERO);
-//                }
-//                //计算结存单价 结存单价=(结存单价*库存数量+采购单价*入库数量)/(库存数量+入库数量)
-//                BigDecimal multiply = stock.getUnitPrice().multiply(stock.getQuantity());//结存单价*库存数量
-//                BigDecimal multiply1 = purchaseDetailPo.getPrice().multiply(stockWaitDetails.getQuantity());//采购单价*入库数量
-//                BigDecimal add = multiply.add(multiply1);//(结存单价*库存数量+采购单价*入库数量)
-//                BigDecimal add1 = stock.getQuantity().add(stockWaitDetails.getQuantity());//库存数量+入库数量
-//                BigDecimal divide = add.divide(add1, 4, BigDecimal.ROUND_HALF_UP);//(结存单价*库存数量+采购单价*入库数量)/(库存数量+入库数量)
-//                stock.setUnitPrice(divide);
-//
-//                stockList1.add(stock);
-//            }
-//            stockService.saveOrUpdateBatch(stockList1);
-//        }
-
         //操作库存
         List<Long> swdIds = stockWaitDetailsDtoList.stream().map(StockWaitDetails::getId).collect(Collectors.toList());
         Map<Long, StockWaitDetails> oldStockWaitDetailsMap = stockWaitDetailsService.mapKEntity(StockWaitDetails::getId, q -> q.in(StockWaitDetails::getId, swdIds));
 
         //创建出入库记录
         Integer businessType = stockWait.getBusinessType();
+        JournalType journalType = getStockJournalType(businessType);
         StockJournal stockJournal = new StockJournal();
         stockJournal.setOpType(stockWait.getType());//根据待入库类型赋值操作类型 1入库 2出库
-        stockJournal.setType(getStockJournalType(businessType));
+        stockJournal.setType(journalType.getDetailType());
         stockJournal.setCode(stockWait.getType() == 1 ? CodeEnum.SIN_CODE.getCode() : CodeEnum.SOUT_CODE.getCode());
         stockJournal.setWarehouseId(stockWaitDto.getWarehouseId());
         stockJournal.setBusinessId(stockWaitDto.getId());
@@ -284,9 +228,10 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
             stockJournalDetailsList.add(stockJournalDetails);
 
         }
+        List<InOutBo> inOutBoList = BeanUtil.copyToList(stockList, InOutBo.class);
 
         //操作库存根据待出入库类型来1入库2出库
-        stockService.ModifyInventory(stockWait.getType(), stockList, stockWaitDto.getWarehouseId());
+        stockService.changeStock(inOutBoList, stockWaitDto.getWarehouseId(), journalType);
         //保存出入库明细
         stockJournalDetailsService.saveBatch(stockJournalDetailsList);
 
@@ -306,25 +251,25 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
      * 根据待出入库业务类型获取对应的出入库记录类型
      */
     @Override
-    public Integer getStockJournalType(int businessType) {
+    public JournalType getStockJournalType(int businessType) {
         if (StockWaitType.BORDER_OF_LINE_IN.getDetailType().equals(businessType)) {
             //线边回仓库
-            return JournalType.BORDER_OF_LINE_IN.getDetailType();
+            return JournalType.BORDER_OF_LINE_IN;
         } else if (StockWaitType.COMPLETION_IN.getDetailType().equals(businessType)) {
             //完工入库
-            return JournalType.COMPLETION_IN.getDetailType();
+            return JournalType.COMPLETION_IN;
         } else if (StockWaitType.PURCHASE_ARRIVAL_IN.getDetailType().equals(businessType)) {
             //采购到货
-            return JournalType.PURCHASE_ARRIVAL_IN.getDetailType();
+            return JournalType.PURCHASE_ARRIVAL_IN;
         } else if (StockWaitType.BACK_OUT.getDetailType().equals(businessType)) {
             //退货出货
-            return JournalType.BACK_OUT.getDetailType();
+            return JournalType.BACK_OUT;
         } else if (StockWaitType.SALE_ORDER_OUT.getDetailType().equals(businessType)) {
             //销售订单出库
-            return JournalType.SALES_OUT.getDetailType();
+            return JournalType.SALES_OUT;
         } else if (StockWaitType.PRODUCTION_TASK_OUT.getDetailType().equals(businessType)) {
             //生产任务待出库
-            return JournalType.PRODUCTION_TASK_OUT.getDetailType();
+            return JournalType.PRODUCTION_TASK_OUT;
         } else {
             throw new ServiceException("未知待出入库业务类型");
         }