Переглянути джерело

产品可用库存功能修改

yzc 1 рік тому
батько
коміт
3127a661d4
17 змінених файлів з 228 додано та 34 видалено
  1. 20 0
      hx-item/src/main/java/com/fjhx/item/controller/product/ProductStockInfoController.java
  2. 17 0
      hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductStockInfoDto.java
  3. 17 0
      hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductStockInfoSelectDto.java
  4. 10 0
      hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductAvailableRecord.java
  5. 0 5
      hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductInfo.java
  6. 38 0
      hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductStockInfo.java
  7. 17 0
      hx-item/src/main/java/com/fjhx/item/entity/product/vo/ProductStockInfoVo.java
  8. 17 0
      hx-item/src/main/java/com/fjhx/item/mapper/product/ProductStockInfoMapper.java
  9. 1 3
      hx-item/src/main/java/com/fjhx/item/service/product/ProductInfoService.java
  10. 17 0
      hx-item/src/main/java/com/fjhx/item/service/product/ProductStockInfoService.java
  11. 28 12
      hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java
  12. 21 0
      hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductStockInfoServiceImpl.java
  13. 4 0
      hx-item/src/main/resources/mapper/product/ProductStockInfoMapper.xml
  14. 14 9
      hx-sale/src/main/java/com/fjhx/sale/flow/ContractFlow.java
  15. 4 2
      hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseFlow.java
  16. 2 2
      hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseUpdateFlow.java
  17. 1 1
      hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockServiceImpl.java

+ 20 - 0
hx-item/src/main/java/com/fjhx/item/controller/product/ProductStockInfoController.java

@@ -0,0 +1,20 @@
+package com.fjhx.item.controller.product;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * <p>
+ * 产品总库存信息 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2024-01-14
+ */
+@RestController
+@RequestMapping("/productStockInfo")
+public class ProductStockInfoController {
+
+
+}

+ 17 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductStockInfoDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.item.entity.product.dto;
+
+import com.fjhx.item.entity.product.po.ProductStockInfo;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 产品总库存信息新增编辑入参实体
+ *
+ * @author
+ * @since 2024-01-14
+ */
+@Getter
+@Setter
+public class ProductStockInfoDto extends ProductStockInfo {
+
+}

+ 17 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductStockInfoSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.item.entity.product.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 产品总库存信息列表查询入参实体
+ *
+ * @author
+ * @since 2024-01-14
+ */
+@Getter
+@Setter
+public class ProductStockInfoSelectDto extends BaseSelectDto {
+
+}

+ 10 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductAvailableRecord.java

@@ -45,4 +45,14 @@ public class ProductAvailableRecord extends BasePo {
      */
     private Integer businessType;
 
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+    /**
+     * 归属公司id
+     */
+    private Long companyId;
+
 }

+ 0 - 5
hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductInfo.java

@@ -147,11 +147,6 @@ public class ProductInfo extends BasePo {
      */
     private String costCurrency;
 
-    /**
-     * 可用库存
-     */
-    private BigDecimal availableQuantity;
-
 
     //---------------------------------------------------------------
     /**

+ 38 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductStockInfo.java

@@ -0,0 +1,38 @@
+package com.fjhx.item.entity.product.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 产品总库存信息
+ * </p>
+ *
+ * @author
+ * @since 2024-01-14
+ */
+@Getter
+@Setter
+@TableName("product_stock_info")
+public class ProductStockInfo extends BasePo {
+
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+    /**
+     * 可用库存
+     */
+    private BigDecimal availableQuantity;
+
+    /**
+     * 归属公司id
+     */
+    private Long companyId;
+
+}

+ 17 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/vo/ProductStockInfoVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.item.entity.product.vo;
+
+import com.fjhx.item.entity.product.po.ProductStockInfo;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 产品总库存信息列表查询返回值实体
+ *
+ * @author
+ * @since 2024-01-14
+ */
+@Getter
+@Setter
+public class ProductStockInfoVo extends ProductStockInfo {
+
+}

+ 17 - 0
hx-item/src/main/java/com/fjhx/item/mapper/product/ProductStockInfoMapper.java

@@ -0,0 +1,17 @@
+package com.fjhx.item.mapper.product;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.item.entity.product.po.ProductStockInfo;
+
+
+/**
+ * <p>
+ * 产品总库存信息 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2024-01-14
+ */
+public interface ProductStockInfoMapper extends BaseMapper<ProductStockInfo> {
+
+}

+ 1 - 3
hx-item/src/main/java/com/fjhx/item/service/product/ProductInfoService.java

@@ -1,6 +1,5 @@
 package com.fjhx.item.service.product;
 
-import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.common.entity.InOutBo;
 import com.fjhx.common.enums.InOutType;
@@ -65,8 +64,7 @@ public interface ProductInfoService extends BaseService<ProductInfo> {
      */
     void add(ProductInfoDto productInfoDto);
 
-    @DSTransactional
-    void editAvailableQuantity(List<InOutBo> inOutList, InOutType inOutType, Long businessId, ProductAvailableRecordType businessType);
+    void editAvailableQuantity(List<InOutBo> inOutList, InOutType inOutType, Long businessId, ProductAvailableRecordType businessType, Long companyId);
 
     /**
      * 产品库新增 尔泓扩展

+ 17 - 0
hx-item/src/main/java/com/fjhx/item/service/product/ProductStockInfoService.java

@@ -0,0 +1,17 @@
+package com.fjhx.item.service.product;
+
+import com.fjhx.item.entity.product.po.ProductStockInfo;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 产品总库存信息 服务类
+ * </p>
+ *
+ * @author
+ * @since 2024-01-14
+ */
+public interface ProductStockInfoService extends BaseService<ProductStockInfo> {
+
+}

+ 28 - 12
hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java

@@ -19,16 +19,14 @@ import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.item.entity.product.bo.ProductAnalysisBo;
 import com.fjhx.item.entity.product.dto.ProductInfoDto;
 import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
-import com.fjhx.item.entity.product.po.ProductAvailableRecord;
-import com.fjhx.item.entity.product.po.ProductClassify;
-import com.fjhx.item.entity.product.po.ProductInfo;
-import com.fjhx.item.entity.product.po.ProductInfoEhsdExcel;
+import com.fjhx.item.entity.product.po.*;
 import com.fjhx.item.entity.product.vo.ProductInfoVo;
 import com.fjhx.item.enums.ProductAvailableRecordType;
 import com.fjhx.item.mapper.product.ProductInfoMapper;
 import com.fjhx.item.service.product.ProductAvailableRecordService;
 import com.fjhx.item.service.product.ProductClassifyService;
 import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.item.service.product.ProductStockInfoService;
 import com.fjhx.item.util.CodeEnum;
 import com.fjhx.item.util.excel.util.ExcelUtil;
 import com.fjhx.tenant.entity.dict.dto.DictTenantDataSelectDto;
@@ -79,6 +77,8 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
     private ProductAvailableRecordService productAvailableRecordService;
     @Autowired
     private ISysDeptService sysDeptService;
+    @Autowired
+    private ProductStockInfoService productStockInfoService;
 
     @Override
     public Page<ProductInfoVo> getPage(ProductInfoSelectDto dto) {
@@ -299,21 +299,34 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
      */
     @DSTransactional
     @Override
-    public synchronized void editAvailableQuantity(List<InOutBo> inOutList, InOutType inOutType, Long businessId, ProductAvailableRecordType businessType) {
+    public synchronized void editAvailableQuantity(List<InOutBo> inOutList, InOutType inOutType, Long businessId, ProductAvailableRecordType businessType, Long companyId) {
+
         List<Long> pIds = inOutList.stream().map(InOutBo::getProductId).collect(Collectors.toList());
         if (ObjectUtil.isEmpty(pIds)) {
             return;
         }
-        Map<Long, ProductInfo> productInfoMap = this.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, pIds));
+        //获取合同归属归属的物料可用库存
+        Map<Long, ProductStockInfo> availableQuantityMap = productStockInfoService.mapKEntity(ProductStockInfo::getId, q -> q
+                .in(ProductStockInfo::getProductId, pIds)
+                .eq(ProductStockInfo::getCompanyId, companyId)
+        );
 
         List<ProductAvailableRecord> availableRecordList = new ArrayList<>();
         for (InOutBo inOutBo : inOutList) {
-            ProductInfo productInfo = productInfoMap.get(inOutBo.getProductId());
+            ProductStockInfo productStockInfo = availableQuantityMap.get(inOutBo.getProductId());
+            if (ObjectUtil.isEmpty(productStockInfo)) {
+                productStockInfo = new ProductStockInfo();
+                productStockInfo.setAvailableQuantity(BigDecimal.ZERO);
+                productStockInfo.setCompanyId(companyId);
+                productStockInfo.setProductId(inOutBo.getProductId());
+                productStockInfoService.save(productStockInfo);
+                availableQuantityMap.put(inOutBo.getProductId(), productStockInfo);
+            }
 
             BigDecimal availableQuantityNew;
             BigDecimal edQuantity = inOutBo.getQuantity();
 
-            BigDecimal availableQuantity = productInfo.getAvailableQuantity();
+            BigDecimal availableQuantity = productStockInfo.getAvailableQuantity();
 
             if (inOutType.equals(InOutType.IN)) {
                 availableQuantityNew = availableQuantity.add(inOutBo.getQuantity());
@@ -327,20 +340,23 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
                 throw new ServiceException("未知类型");
             }
 
-            this.update(q -> q
-                    .eq(ProductInfo::getId, productInfo.getId())
-                    .set(ProductInfo::getAvailableQuantity, availableQuantityNew)
+            Long productStockInfoId = productStockInfo.getId();
+            productStockInfoService.update(q -> q
+                    .eq(ProductStockInfo::getId, productStockInfoId)
+                    .set(ProductStockInfo::getAvailableQuantity, availableQuantityNew)
                     .set(BasePo::getUpdateTime, new Date())
                     .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
             );
 
             //保存操作记录
             ProductAvailableRecord productAvailableRecord = new ProductAvailableRecord();
-            productAvailableRecord.setBeforeQuantity(productInfo.getAvailableQuantity());
+            productAvailableRecord.setBeforeQuantity(productStockInfo.getAvailableQuantity());
             productAvailableRecord.setAfterQuantity(availableQuantityNew);
             productAvailableRecord.setEditQuantity(edQuantity);
             productAvailableRecord.setBusinessId(businessId);
             productAvailableRecord.setBusinessType(businessType.getType());
+            productAvailableRecord.setProductId(inOutBo.getProductId());
+            productAvailableRecord.setCompanyId(companyId);
 
             availableRecordList.add(productAvailableRecord);
         }

+ 21 - 0
hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductStockInfoServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fjhx.item.service.product.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.item.entity.product.po.ProductStockInfo;
+import com.fjhx.item.mapper.product.ProductStockInfoMapper;
+import com.fjhx.item.service.product.ProductStockInfoService;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 产品总库存信息 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2024-01-14
+ */
+@Service
+public class ProductStockInfoServiceImpl extends ServiceImpl<ProductStockInfoMapper, ProductStockInfo> implements ProductStockInfoService {
+
+}

+ 4 - 0
hx-item/src/main/resources/mapper/product/ProductStockInfoMapper.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.item.mapper.product.ProductStockInfoMapper">
+</mapper>

+ 14 - 9
hx-sale/src/main/java/com/fjhx/sale/flow/ContractFlow.java

@@ -17,9 +17,11 @@ import com.fjhx.flow.core.FlowDelegate;
 import com.fjhx.flow.enums.FlowStatusEnum;
 import com.fjhx.item.entity.product.po.ProductBomDetail;
 import com.fjhx.item.entity.product.po.ProductInfo;
+import com.fjhx.item.entity.product.po.ProductStockInfo;
 import com.fjhx.item.enums.ProductAvailableRecordType;
 import com.fjhx.item.service.product.ProductBomDetailService;
 import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.item.service.product.ProductStockInfoService;
 import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail;
 import com.fjhx.purchase.service.subscribe.SubscribeDetailService;
 import com.fjhx.sale.entity.contract.dto.ContractDto;
@@ -76,6 +78,8 @@ public class ContractFlow extends FlowDelegate {
     private ProductBomDetailService productBomDetailService;
     @Autowired
     private ISysDeptService deptService;
+    @Autowired
+    private ProductStockInfoService productStockInfoService;
 
     @Override
     public String getFlowKey() {
@@ -258,17 +262,18 @@ public class ContractFlow extends FlowDelegate {
 
             //获取物料列表,以及原材料
             List<ProductBomDetail> productBomDetails = productBomMap.get(productId);
-            ProductBomDetail rawMaterial = new ProductBomDetail();
-//            //添加原材料
-//            rawMaterial.setMaterialId(productInfo.getRawMaterialId());
-//            rawMaterial.setProductId(productId);
-//            rawMaterial.setQuantity(BigDecimal.ONE);
-//            productBomDetails.add(rawMaterial);
 
             if (ObjectUtil.isNotEmpty(productBomDetails)) {
                 List<Long> materialIds = productBomDetails.stream().map(ProductBomDetail::getMaterialId).collect(Collectors.toList());
                 Map<Long, ProductInfo> materialMap = productInfoService.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, materialIds));
 
+                //获取合同归属归属的物料可用库存
+                Map<Long, BigDecimal> availableQuantityMap = productStockInfoService.mapKV(ProductStockInfo::getId, ProductStockInfo::getAvailableQuantity, q -> q
+                        .in(ProductStockInfo::getProductId, materialIds)
+                        .eq(ProductStockInfo::getCompanyId, contract.getCompanyId())
+                );
+
+
                 //遍历物料列表
                 for (ProductBomDetail productBomDetail : productBomDetails) {
                     Long materialId = productBomDetail.getMaterialId();
@@ -279,7 +284,7 @@ public class ContractFlow extends FlowDelegate {
                     //获取产品安全库存
                     BigDecimal stockThreshold = materialInfo.getStockThreshold();
                     //获取可用库存
-                    BigDecimal availableQuantity = materialInfo.getAvailableQuantity();
+                    BigDecimal availableQuantity = availableQuantityMap.getOrDefault(materialId, BigDecimal.ZERO);
                     //计数需要采购的数量(需采购量 = 安全库存 - (可用库存 - 合同量)若 需采购量<0,则按0算不采购)
                     BigDecimal subtract = availableQuantity.subtract(multiply);
                     BigDecimal requiredQuantity = stockThreshold.subtract(subtract);
@@ -290,13 +295,13 @@ public class ContractFlow extends FlowDelegate {
                         InOutBo inOutBo = new InOutBo();
                         inOutBo.setProductId(materialId);
                         inOutBo.setQuantity(multiply);
-                        productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.OUT, contractProduct.getId(), ProductAvailableRecordType.SALE_PASS);
+                        productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.OUT, contractProduct.getId(), ProductAvailableRecordType.SALE_PASS, contract.getCompanyId());
                     } else {
                         //需要采购的数量>=0 可用库存 = 安全库存
                         InOutBo inOutBo = new InOutBo();
                         inOutBo.setProductId(materialId);
                         inOutBo.setQuantity(stockThreshold);
-                        productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.EQ, contractProduct.getId(), ProductAvailableRecordType.SALE_PASS);
+                        productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.EQ, contractProduct.getId(), ProductAvailableRecordType.SALE_PASS, contract.getCompanyId());
                     }
 
                     //需要采购的数量大于0生成待采购数据

+ 4 - 2
hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseFlow.java

@@ -255,7 +255,7 @@ public class EhsdPurchaseFlow extends FlowDelegate {
 				inOutBoList.add(inOutBo);
 			}
 		}
-		productInfoService.editAvailableQuantity(inOutBoList, InOutType.IN, businessId, ProductAvailableRecordType.PURCHASE_PASS);
+		productInfoService.editAvailableQuantity(inOutBoList, InOutType.IN, businessId, ProductAvailableRecordType.PURCHASE_PASS, purchase.getCompanyId());
 
 
 		//采购审批通过 生成待入库数据
@@ -317,6 +317,8 @@ public class EhsdPurchaseFlow extends FlowDelegate {
 	 */
 	@Override
 	public void cancellation(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
+		EhsdPurchase purchase = purchaseService.getById(businessId);
+
 		super.cancellation(flowId, businessId, flowStatus);
 		purchaseService.update(q -> q
 				.eq(EhsdPurchase::getId, businessId)
@@ -337,6 +339,6 @@ public class EhsdPurchaseFlow extends FlowDelegate {
 				inOutBoList.add(inOutBo);
 			}
 		}
-		productInfoService.editAvailableQuantity(inOutBoList, InOutType.OUT, businessId, ProductAvailableRecordType.PURCHASE_CANCEL);
+		productInfoService.editAvailableQuantity(inOutBoList, InOutType.OUT, businessId, ProductAvailableRecordType.PURCHASE_CANCEL, purchase.getCompanyId());
 	}
 }

+ 2 - 2
hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseUpdateFlow.java

@@ -233,7 +233,7 @@ public class EhsdPurchaseUpdateFlow extends FlowDelegate {
                 oldInOutBoList.add(inOutBo);
             }
         }
-        productInfoService.editAvailableQuantity(oldInOutBoList, InOutType.OUT, purchase.getOldPurchaseId(), ProductAvailableRecordType.PURCHASE_UPDATE);
+        productInfoService.editAvailableQuantity(oldInOutBoList, InOutType.OUT, purchase.getOldPurchaseId(), ProductAvailableRecordType.PURCHASE_UPDATE, purchase.getCompanyId());
 
 
         //将可用库存改为新合同数据
@@ -248,7 +248,7 @@ public class EhsdPurchaseUpdateFlow extends FlowDelegate {
                 inOutBoList.add(inOutBo);
             }
         }
-        productInfoService.editAvailableQuantity(inOutBoList, InOutType.IN, businessId, ProductAvailableRecordType.PURCHASE_UPDATE);
+        productInfoService.editAvailableQuantity(inOutBoList, InOutType.IN, businessId, ProductAvailableRecordType.PURCHASE_UPDATE, purchase.getCompanyId());
 
 
         //-----------------------------

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

@@ -383,7 +383,7 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
             inOutBoList.add(inOutBo);
         }
 
-        productInfoService.editAvailableQuantity(inOutBoList, inOutType, null, productAvailableRecordType);
+        productInfoService.editAvailableQuantity(inOutBoList, inOutType, null, productAvailableRecordType, SecurityUtils.getCompanyId());
     }
 
     @Override