Przeglądaj źródła

Merge remote-tracking branch 'origin/master'

wxf 2 lat temu
rodzic
commit
ea11f03a1f

+ 49 - 13
hx-ehsd/src/main/java/com/fjhx/ehsd/flow/EhsdPurchaseFlow.java

@@ -1,36 +1,34 @@
 package com.fjhx.ehsd.flow;
 
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.ehsd.entity.purchase.po.*;
 import com.fjhx.ehsd.service.purchase.*;
+import com.fjhx.ehsd.util.CodeEnum;
 import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.flow.core.FlowDelegate;
 import com.fjhx.purchase.entity.purchase.enums.PurchaseDataResourceEnum;
-import com.fjhx.purchase.entity.purchase.enums.PurchaseDetailStatusEnum;
 import com.fjhx.purchase.entity.purchase.enums.PurchaseStatusEnum;
-import com.fjhx.purchase.entity.purchase.po.Purchase;
-import com.fjhx.purchase.entity.purchase.po.PurchaseDetail;
-import com.fjhx.purchase.service.purchase.PurchaseDetailService;
-import com.fjhx.purchase.service.purchase.PurchaseService;
-import com.fjhx.purchase.util.code.CodeEnum;
 import com.fjhx.sale.entity.contract.po.ContractProduct;
 import com.fjhx.sale.entity.sample.po.SampleProduct;
 import com.fjhx.sale.service.contract.ContractProductService;
 import com.fjhx.sale.service.sample.SampleProductService;
 import com.obs.services.internal.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * EHSD采购流程
@@ -39,15 +37,13 @@ import java.util.stream.Collectors;
  * @DATE:2023/4/3 17:38
  */
 @Component
+@DS(SourceConstant.EHSD)
 public class EhsdPurchaseFlow extends FlowDelegate {
 
     @Autowired
     private EhsdPurchaseService purchaseService;
 
     @Autowired
-    private SampleProductService sampleProductService;
-
-    @Autowired
     private EhsdPurchaseProductService purchaseProductService;
 
     @Autowired
@@ -57,10 +53,13 @@ public class EhsdPurchaseFlow extends FlowDelegate {
     private EhsdPurchaseArrivalService purchaseArrivalService;
 
     @Autowired
+    private EhsdPurchaseProductMountingsService purchaseProductMountingsService;
+
+    @Autowired
     private ContractProductService contractProductService;
 
     @Autowired
-    private EhsdPurchaseProductMountingsService purchaseProductMountingsService;
+    private SampleProductService sampleProductService;
 
 
     @Override
@@ -75,10 +74,12 @@ public class EhsdPurchaseFlow extends FlowDelegate {
      * @return
      */
     @Override
+    @DSTransactional
     public Long start(Long flowId, JSONObject submitData) {
         EhsdPurchase purchase = submitData.toJavaObject(EhsdPurchase.class);
         purchase.setCode(CodeEnum.PURCHASE.getCode());
         purchase.setStatus(PurchaseStatusEnum.UNDER_REVIEW.getKey());
+        purchase.setUserName(SecurityUtils.getUsername());
         purchaseService.save(purchase);
         List<EhsdPurchaseProduct> purchaseProductList = purchase.getPurchaseProductList();
         List<EhsdPurchaseProject> purchaseProjectList = purchase.getPurchaseProjectList();
@@ -86,10 +87,12 @@ public class EhsdPurchaseFlow extends FlowDelegate {
         List<EhsdPurchaseProductMountings> addMountingsList = new ArrayList<>();
         if(CollectionUtils.isNotEmpty(purchaseProductList)){
             for(EhsdPurchaseProduct s : purchaseProductList){//产品
+                long id = IdWorker.getId();
+                s.setId(id);
                 s.setPurchaseId(purchase.getId());
                 List<EhsdPurchaseProductMountings> purchaseProductMountingsList = s.getPurchaseProductMountingsList();
                 if(CollectionUtils.isNotEmpty(purchaseProductMountingsList)){//产品配件
-                    purchaseProductMountingsList.forEach(obj -> obj.setId(s.getId()));
+                    purchaseProductMountingsList.forEach(obj -> obj.setPurchaseProductId(id));
                     addMountingsList.addAll(purchaseProductMountingsList);
                 }
                 ObsFileUtil.saveFile(s.getFileList(),s.getId());
@@ -119,12 +122,45 @@ public class EhsdPurchaseFlow extends FlowDelegate {
      * @param submitData 数据
      */
     @Override
+    @DSTransactional
     public void end(Long flowId, Long businessId, JSONObject submitData) {
         //通过业务ID查询采购数据
         EhsdPurchase purchase = purchaseService.getById(businessId);
         if(ObjectUtils.isEmpty(purchase)){
             throw new ServiceException("采购单不存在,或已被删除");
         }
+        //查询采购产品
+        List<EhsdPurchaseProduct> purchaseProductList = purchaseProductService.list(Wrappers.<EhsdPurchaseProduct>query().lambda().eq(EhsdPurchaseProduct::getPurchaseId,businessId));
+        List<ContractProduct> upContractProduct = new ArrayList<>();
+        List<SampleProduct> upSampleProduct = new ArrayList<>();
+        for(EhsdPurchaseProduct p:purchaseProductList){
+            if(ObjectUtils.isNotEmpty(p.getDataResourceId())&&
+                    p.getDataResource()== PurchaseDataResourceEnum.DATA_RESOURCE_1.getKey()){//如果采购的是外销合同
+                ContractProduct contractProduct = contractProductService.getById(p.getDataResourceId());
+                BigDecimal expendQuantity = contractProduct.getExpendQuantity().subtract(p.getQuantity());
+                if(expendQuantity.compareTo(BigDecimal.ZERO)< 1){//小于0不让继续执行
+                    throw new ServiceException("采购数量不得大于合同剩余采购数量");
+                }
+                contractProduct.setExpendQuantity(expendQuantity);
+                upContractProduct.add(contractProduct);
+            }
+            if(ObjectUtils.isNotEmpty(p.getDataResourceId())&&
+                    p.getDataResource()== PurchaseDataResourceEnum.DATA_RESOURCE_2.getKey()){//如果采购的是样品单
+                SampleProduct sampleProduct = sampleProductService.getById(p.getDataResourceId());
+                BigDecimal expendQuantity = sampleProduct.getExpendQuantity().subtract(p.getQuantity());
+                if(expendQuantity.compareTo(BigDecimal.ZERO)< 1){//小于0不让继续执行
+                    throw new ServiceException("采购数量不得大于合同剩余采购数量");
+                }
+                sampleProduct.setExpendQuantity(expendQuantity);
+                upSampleProduct.add(sampleProduct);
+            }
+        }
+        if(CollectionUtils.isNotEmpty(upContractProduct)){//扣减销售合同数量
+            contractProductService.updateBatchById(upContractProduct);
+        }
+        if(CollectionUtils.isNotEmpty(upSampleProduct)){//扣减样品单数量
+            sampleProductService.updateBatchById(upSampleProduct);
+        }
         //修改采购状态为审批通过
         purchase.setStatus(PurchaseStatusEnum.PASS.getKey());
         purchase.setApprovedDate(new Date());

+ 2 - 2
hx-item/src/main/java/com/fjhx/item/mapper/product/ProductInfoMapper.java

@@ -3,7 +3,6 @@ package com.fjhx.item.mapper.product;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.entity.product.vo.ProductInfoVo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
@@ -36,9 +35,10 @@ public interface ProductInfoMapper extends BaseMapper<ProductInfo> {
 
     /**
      * 根据产品类型获取产品
+     *
      * @return
      */
-    List<ProductInfoVo> getListByProductType(@Param("productType") Integer productType);
+    List<ProductInfoVo> getListByProductType(@Param("productType") Integer productType, @Param("definition") Integer definition);
 
     /**
      * 产品类型排行(数据看板-产品分析页面)

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

@@ -107,7 +107,7 @@ public interface ProductInfoService extends BaseService<ProductInfo> {
      *
      * @return
      */
-    List<ProductInfoVo> getListByProductType(Integer productType);
+    List<ProductInfoVo> getListByProductType(Integer productType, Integer definition);
 
     /**
      * excel导入

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

@@ -510,8 +510,8 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
      * @return
      */
     @Override
-    public List<ProductInfoVo> getListByProductType(Integer productType) {
-        return baseMapper.getListByProductType(productType);
+    public List<ProductInfoVo> getListByProductType(Integer productType, Integer definition) {
+        return baseMapper.getListByProductType(productType, definition);
     }
 
     @Override

+ 7 - 4
hx-item/src/main/resources/mapper/product/ProductInfoMapper.xml

@@ -45,14 +45,17 @@
 
     <select id="getListByProductType" resultType="com.fjhx.item.entity.product.vo.ProductInfoVo">
         SELECT
-            t1.*,
-            t2.`name` AS classifyName
+        t1.*,
+        t2.`name` AS classifyName
         FROM
-            product_info t1
+        product_info t1
         LEFT JOIN product_classify t2 ON t1.product_classify_id = t2.id
         <where>
             <if test="productType neq null ">
-               t1.type = #{productType}
+                t1.type = #{productType}
+            </if>
+            <if test="definition neq null">
+                and t1.definition = #{definition}
             </if>
         </where>
     </select>

+ 9 - 1
hx-purchase/src/main/java/com/fjhx/purchase/entity/subscribe/dto/SubscribeDetailSelectDto.java

@@ -9,7 +9,7 @@ import java.util.List;
 /**
  * 申购单列表查询入参实体
  *
- * @author 
+ * @author
  * @since 2023-04-03
  */
 @Getter
@@ -35,4 +35,12 @@ public class SubscribeDetailSelectDto extends BaseSelectDto {
      * 收货仓库id过滤
      */
     private Long receiptWarehouseId;
+
+    /**
+     * 定义
+     * 1产品
+     * 2物料
+     */
+    private Integer definition;
+
 }

+ 27 - 35
hx-purchase/src/main/java/com/fjhx/purchase/service/subscribe/impl/SubscribeDetailServiceImpl.java

@@ -21,7 +21,6 @@ import com.fjhx.purchase.service.subscribe.SubscribeDetailService;
 import com.fjhx.wms.entity.warehouse.po.Warehouse;
 import com.fjhx.wms.service.warehouse.WarehouseService;
 import com.obs.services.internal.ServiceException;
-import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.apache.commons.collections4.MapUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,6 +31,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 
@@ -62,50 +62,42 @@ public class SubscribeDetailServiceImpl extends ServiceImpl<SubscribeDetailMappe
      */
     @Override
     public Page<SubscribeDetailVo> getPage(SubscribeDetailSelectDto dto) {
-        Map<Long, List<ProductInfoVo>> productMap;
-        List<Long> productIds = new ArrayList<>();
         IWrapper<SubscribeDetail> wrapper = getWrapper();
-        //搜索条件-----当产品数据量多得情况下会影响查询得速度。超过1000条mybatisplus在in查询得时候会报错
-        if (ObjectUtil.isNotEmpty(dto.getProductType())) {//如果类型存在带入类型查询
-            List<ProductInfoVo> productList = productInfoService.getListByProductType(dto.getProductType());
-            if (CollectionUtils.isEmpty(productList)) {
-                return new Page<>();
-            } else {
-                productMap = productList.stream().distinct().collect(Collectors.groupingBy(ProductInfoVo::getId));
-                productIds = productList.stream().map(ProductInfoVo::getId).collect(Collectors.toList());
-            }
-        } else {//不存在查所有
-            List<ProductInfoVo> productList = productInfoService.getListByProductType(null);
-            productMap = productList.stream().distinct().collect(Collectors.groupingBy(ProductInfoVo::getId));
-        }
         if (ObjectUtil.isNotEmpty(dto.getStatus())) {
             wrapper.in("t1", SubscribeDetail::getStatus, Arrays.asList(dto.getStatus().split(",")));
         }
-        if (CollectionUtils.isNotEmpty(productIds)) {
-            wrapper.in("t1", SubscribeDetail::getBussinessId, productIds);
-        }
-        if (StringUtils.isNotEmpty(dto.getKeyword())) {
-            wrapper.like("t2", Subscribe::getCode, dto.getKeyword());
+
+        // 如果类型存在带入类型查询
+        List<ProductInfoVo> productList = productInfoService.getListByProductType(dto.getProductType(), dto.getDefinition());
+        if (ObjectUtil.isEmpty(productList)) {
+            return new Page<>();
         }
-        //维多利亚扩展根据到货仓库id过滤
+        List<Long> productIds = productList.stream().map(ProductInfoVo::getId).collect(Collectors.toList());
+        wrapper.in("t1", SubscribeDetail::getBussinessId, productIds);
+        wrapper.like("t2", Subscribe::getCode, dto.getKeyword());
+
+        // 维多利亚扩展根据到货仓库id过滤
         wrapper.eq("json_unquote(t2.victoriatourist_json -> '$.receiptWarehouseId')", dto.getReceiptWarehouseId());
         wrapper.orderByDesc("t1", SubscribeDetail::getCreateTime);
+
         Page<SubscribeDetailVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
         List<SubscribeDetailVo> list = page.getRecords();
-        if (CollectionUtils.isNotEmpty(list) && MapUtils.isNotEmpty(productMap)) {
-            for (SubscribeDetailVo s : list) {
-                List<ProductInfoVo> productInfos = productMap.getOrDefault(s.getBussinessId(), null);
-                if (ObjectUtil.isNotEmpty(productInfos)) {
-                    ProductInfoVo vo = productInfos.get(0);
-                    s.setProductCode(vo.getCode());
-                    s.setProductName(vo.getName());
-                    s.setProductType(vo.getType());
-                    s.setProductCategory(vo.getClassifyName());
-                    s.setProductUnit(vo.getUnit());
-                    s.setProductDefinition(vo.getDefinition());
-                }
-            }
+
+        if (list.size() == 0) {
+            return page;
         }
+
+        for (SubscribeDetailVo s : list) {
+            Map<Long, ProductInfoVo> productMap = productList.stream().collect(Collectors.toMap(ProductInfoVo::getId, Function.identity()));
+            ProductInfoVo productInfo = productMap.get(s.getBussinessId());
+            s.setProductCode(productInfo.getCode());
+            s.setProductName(productInfo.getName());
+            s.setProductType(productInfo.getType());
+            s.setProductCategory(productInfo.getClassifyName());
+            s.setProductUnit(productInfo.getUnit());
+            s.setProductDefinition(productInfo.getDefinition());
+        }
+
         return page;
     }
 

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

@@ -1,6 +1,7 @@
 package com.fjhx.sale.flow;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -22,6 +23,7 @@ import com.fjhx.sale.service.sample.SampleProductService;
 import com.obs.services.internal.ServiceException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -86,6 +88,7 @@ public class PurchaseFlow extends FlowDelegate {
      * @param submitData 数据
      */
     @Override
+    @DSTransactional
     public void end(Long flowId, Long businessId, JSONObject submitData) {
         //通过业务ID查询采购数据
         Purchase purchase = purchaseService.getById(businessId);
@@ -102,7 +105,7 @@ public class PurchaseFlow extends FlowDelegate {
                 ContractProduct contractProduct = contractProductService.getById(p.getDataResourceId());
                 BigDecimal expendQuantity = contractProduct.getExpendQuantity().subtract(p.getCount());
                 if(expendQuantity.compareTo(BigDecimal.ZERO)< 1){//小于0不让继续执行
-                    throw new ServiceException("采购数量不得大于合同数量");
+                    throw new ServiceException("采购数量不得大于合同剩余采购数量");
                 }
                 contractProduct.setExpendQuantity(expendQuantity);
                 upContractProduct.add(contractProduct);
@@ -112,7 +115,7 @@ public class PurchaseFlow extends FlowDelegate {
                 SampleProduct sampleProduct = sampleProductService.getById(p.getDataResourceId());
                 BigDecimal expendQuantity = sampleProduct.getExpendQuantity().subtract(p.getCount());
                 if(expendQuantity.compareTo(BigDecimal.ZERO)< 1){//小于0不让继续执行
-                    throw new ServiceException("采购数量不得大于合同数量");
+                    throw new ServiceException("采购数量不得大于合同剩余采购数量");
                 }
                 sampleProduct.setExpendQuantity(expendQuantity);
                 upSampleProduct.add(sampleProduct);

+ 60 - 0
hx-wms/src/main/java/com/fjhx/wms/utils/CalculatingUnitPriceUtil.java

@@ -0,0 +1,60 @@
+package com.fjhx.wms.utils;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.fjhx.item.entity.product.po.ProductInfo;
+import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.wms.entity.stock.po.Stock;
+import com.fjhx.wms.service.stock.StockService;
+import com.ruoyi.common.exception.ServiceException;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 计算结存单价
+ */
+public class CalculatingUnitPriceUtil {
+
+    private static final StockService stockService = SpringUtil.getBean(StockService.class);
+    private static final ProductInfoService productInfoService = SpringUtil.getBean(ProductInfoService.class);
+
+    /**
+     * 加权平均值
+     * (库存单价 * 库存数量 + 入库单价 * 入库数量) / (库存数量 + 入库数量)
+     *
+     * @param productId 产品id
+     * @param quantity  入库数量
+     * @param price     入库单价
+     * @return 加权平均值
+     */
+    public static BigDecimal weightedMean(Long productId, BigDecimal quantity, BigDecimal price) {
+        BigDecimal oldUnitPrice = getOldUnitPrice(productId);
+        BigDecimal stockQuantity = getStockQuantity(productId);
+
+        return oldUnitPrice.multiply(stockQuantity).add(price.multiply(quantity))
+                .divide(stockQuantity.add(quantity), 4, RoundingMode.HALF_UP);
+    }
+
+    /**
+     * 获取原结存单价
+     */
+    private static BigDecimal getOldUnitPrice(Long productId) {
+        ProductInfo productInfo = productInfoService.getById(productId);
+        if (productInfo == null) {
+            throw new ServiceException("未找到产品");
+        }
+        return ObjectUtil.defaultIfNull(productInfo.getUnitPrice(), BigDecimal.ZERO);
+    }
+
+    /**
+     * 获取库存数量
+     */
+    private static BigDecimal getStockQuantity(Long productId) {
+        List<Stock> list = stockService.list(q -> q.eq(Stock::getProductId, productId));
+        return list.stream().map(Stock::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
+
+}