Browse Source

动态修改产品单价

yzc 1 year ago
parent
commit
d16d2b223c

+ 5 - 0
hx-item/src/main/java/com/fjhx/item/controller/product/ProductBomInfoController.java

@@ -102,6 +102,11 @@ public class ProductBomInfoController {
         }
 
         productBomDetailService.editLinked(productBomDetailList, ProductBomDetail::getProductId, dto.getId());
+
+        //重新计算产品价格
+        ProductInfo productInfo = productInfoService.getById(dto.getId());
+        ProductInfo productPrice = productInfoService.getProductPrice(productInfo);
+        productInfoService.updateById(productPrice);
     }
 
 }

+ 12 - 0
hx-item/src/main/java/com/fjhx/item/controller/product/ProductInfoController.java

@@ -3,6 +3,7 @@ package com.fjhx.item.controller.product;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.item.entity.product.dto.ProductInfoDto;
 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.fjhx.item.service.product.ProductInfoService;
 import com.ruoyi.common.core.domain.BaseSelectDto;
@@ -63,6 +64,17 @@ public class ProductInfoController {
     }
 
     /**
+     * 计算产品价格
+     *
+     * @return
+     */
+    @PostMapping("/getProductPrice")
+    public ProductInfo getProductPrice(@RequestBody ProductInfoDto productInfoDto) {
+        return productInfoService.getProductPrice(productInfoDto);
+    }
+
+
+    /**
      * 产品库编辑
      */
     @PostMapping("/edit")

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

@@ -38,6 +38,11 @@ public interface ProductInfoService extends BaseService<ProductInfo> {
     void add(ProductInfoDto productInfoDto);
 
     /**
+     * 获取产品价格
+     */
+    ProductInfo getProductPrice(ProductInfo productInfo);
+
+    /**
      * 产品库编辑
      */
     void edit(ProductInfoDto productInfoDto);

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

@@ -202,13 +202,15 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
         }
 
 
+        //归属公司过滤
+        wrapper.eq("pi", ProductInfo::getCompanyId, dto.getCompanyId());
+
         //没禁用权限过滤的情况
         if (!ObjectUtil.equals(dto.getDisablePerm(), 1)) {
             //权限过滤:产品
             wrapper.and(q1 -> q1.
                     and(q -> q.eq("pi", ProductInfo::getDefinition, 1)
                             .in("pi", ProductInfo::getCompanyId, SecurityUtils.getCompanyIds())
-                            .eq("pi", ProductInfo::getCompanyId, dto.getCompanyId())
                     )
                     .or().eq("pi", ProductInfo::getDefinition, 2)
             );
@@ -280,9 +282,82 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
         saveOrEditRawMaterial(productInfoDto);
     }
 
+    /**
+     * 获取产品价格
+     */
+    @Override
+    public ProductInfo getProductPrice(ProductInfo productInfo) {
+        Long id = productInfo.getId();
+        BigDecimal length = productInfo.getLength();
+        BigDecimal width = productInfo.getWidth();
+        Long technologyId = productInfo.getTechnologyId();
+        Assert.notEmpty(length, "产品长度不能为空!");
+        Assert.notEmpty(width, "产品宽度不能为空!");
+        Assert.notEmpty(technologyId, "工艺id不能为空");
+
+        //获取物料价格
+        BigDecimal materialPrice = BigDecimal.ZERO;
+        if (ObjectUtil.isNotEmpty(id)) {
+            List<Long> mIds = productBomDetailService.listObject(ProductBomDetail::getProductId, q -> q
+                    .eq(ProductBomDetail::getProductId, id)
+            );
+
+            List<ProductInfo> list = this.list(q -> q.in(ProductInfo::getId, mIds));
+            for (ProductInfo materialInfo : list) {
+                if (ObjectUtil.equals(materialInfo.getClass(), 100)) {
+                    //原材料
+                    BigDecimal multiply = length.multiply(width).multiply(materialInfo.getPrice());
+                    materialPrice = materialPrice.add(multiply);
+                } else {
+                    //普通物料
+                    materialPrice = materialPrice.add(materialInfo.getPrice());
+
+                }
+            }
+        }
+        //获取工序价格
+        List<ProcessesBo> processesList = baseMapper.getProcessesByTechnologyId(productInfo.getTechnologyId());
+        BigDecimal processesPrice = processesList.stream().map(ProcessesBo::getCostPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        productInfo.setPrice(materialPrice.add(processesPrice));
+        return productInfo;
+    }
+
     @DSTransactional
     @Override
     public void edit(ProductInfoDto productInfoDto) {
+
+        //修改物料时 更新关联产品价格
+        if (ObjectUtil.equals(productInfoDto.getDefinition(), 2)) {
+            List<Long> pIds = productBomDetailService.listObject(ProductBomDetail::getProductId, q -> q
+                    .eq(ProductBomDetail::getMaterialId, productInfoDto.getId())
+            );
+
+            if (ObjectUtil.isNotEmpty(pIds)) {
+                List<ProductInfo> productInfoList = this.listByIds(pIds);
+                for (ProductInfo productInfo : productInfoList) {
+                    ProductInfo materialInfo = this.getById(productInfoDto.getId());
+
+                    BigDecimal oldPrice = materialInfo.getPrice();
+                    BigDecimal newPrice = productInfoDto.getPrice();
+
+                    if (ObjectUtil.equals(materialInfo.getClass(), 100)) {
+                        oldPrice = productInfo.getLength().multiply(productInfo.getWidth()).multiply(oldPrice);
+                        newPrice = productInfo.getLength().multiply(productInfo.getWidth()).multiply(newPrice);
+                    }
+
+                    BigDecimal subtract = newPrice.subtract(oldPrice);
+                    this.update(q -> q
+                            .in(ProductInfo::getId, productInfo.getId())
+                            .setSql("price = price + " + subtract)
+                            .set(BasePo::getUpdateTime, new Date())
+                            .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                    );
+                }
+            }
+        }
+
+
         // 禁止产品编号修改
         productInfoDto.setCode(null);
         //检查【产品名称】和【规格型号】不能同时重复,但可以单项重复。
@@ -316,7 +391,7 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
         ObsFileUtil.editFile(productInfoDto.getFileList(), productInfoDto.getId());
         ObsFileUtil.editFile(productInfoDto.getProdFileList(), productInfoDto.getId(), 2);
 
-        //修改原材料
+        //修改产品时 修改原材料
         saveOrEditRawMaterial(productInfoDto);
     }
 
@@ -350,6 +425,16 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
     @DSTransactional
     @Override
     public void delete(Long id) {
+        //删除物料时 检查是否关联产品
+        List<Long> pIds = productBomDetailService.listObject(ProductBomDetail::getProductId, q -> q
+                .eq(ProductBomDetail::getMaterialId, id)
+        );
+        if (ObjectUtil.isNotEmpty(pIds)) {
+            List<String> strings = this.listObject(ProductInfo::getName, q -> q.in(ProductInfo::getId, pIds));
+            String collect = strings.stream().collect(Collectors.joining(","));
+            throw new ServiceException("该物料当前关联了以下产品:" + collect + " 禁止删除!");
+        }
+
         this.removeById(id);
         ObsFileUtil.removeFile(id);
     }

+ 48 - 7
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionProcessesServiceImpl.java

@@ -6,26 +6,33 @@ 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.file.entity.ObsFile;
-import com.fjhx.file.service.FileInfoService;
 import com.fjhx.file.utils.ObsFileUtil;
+import com.fjhx.item.entity.product.po.ProductInfo;
+import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.mes.entity.applicable.po.ApplicableProducts;
 import com.fjhx.mes.entity.production.dto.ProductionProcessesDto;
 import com.fjhx.mes.entity.production.dto.ProductionProcessesSelectDto;
 import com.fjhx.mes.entity.production.po.ProductionProcesses;
 import com.fjhx.mes.entity.production.vo.ProductionProcessesVo;
 import com.fjhx.mes.entity.technology.po.Technology;
+import com.fjhx.mes.entity.technology.po.TechnologyProcessLine;
 import com.fjhx.mes.entity.work.po.WorkOrder;
 import com.fjhx.mes.mapper.production.ProductionProcessesMapper;
 import com.fjhx.mes.service.applicable.ApplicableProductsService;
 import com.fjhx.mes.service.production.ProductionProcessesService;
+import com.fjhx.mes.service.technology.TechnologyProcessLineService;
 import com.fjhx.mes.service.technology.TechnologyService;
-import com.fjhx.mes.service.work.WorkOrderProductionProcessesService;
+import com.ruoyi.common.core.domain.BasePo;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 
 /**
@@ -40,13 +47,13 @@ import java.util.List;
 public class ProductionProcessesServiceImpl extends ServiceImpl<ProductionProcessesMapper, ProductionProcesses> implements ProductionProcessesService {
 
     @Autowired
-    private FileInfoService fileInfoService;
-    @Autowired
-    private WorkOrderProductionProcessesService workOrderProductionProcessesService;
-    @Autowired
     private ApplicableProductsService applicableProductsService;
     @Autowired
     private TechnologyService technologyService;
+    @Autowired
+    private TechnologyProcessLineService technologyProcessLineService;
+    @Autowired
+    private ProductInfoService productInfoService;
 
 
     @Override
@@ -83,7 +90,31 @@ public class ProductionProcessesServiceImpl extends ServiceImpl<ProductionProces
     @DSTransactional
     @Override
     public void edit(ProductionProcessesDto productionProcessesDto) {
-//        Assert.notEmpty(productionProcessesDto.getRoleId(),"角色id不能为空");
+        ProductionProcesses productionProcesses = this.getById(productionProcessesDto.getId());
+        //修改对应产品价格
+        List<Long> technologyIds = technologyProcessLineService.listObject(TechnologyProcessLine::getTechnologyId, q -> q
+                .eq(TechnologyProcessLine::getTargetProcessesId, productionProcessesDto.getId())
+        );
+        if (ObjectUtil.isNotEmpty(technologyIds)) {
+            List<Long> pIds = productInfoService.listObject(ProductInfo::getId, q -> q.in(ProductInfo::getTechnologyId, technologyIds));
+            if (ObjectUtil.isNotEmpty(pIds)) {
+                BigDecimal costPrice = productionProcesses.getCostPrice();
+                BigDecimal newCostPrice = productionProcessesDto.getCostPrice();
+                costPrice = costPrice == null ? BigDecimal.ZERO : costPrice;
+                newCostPrice = newCostPrice == null ? BigDecimal.ZERO : newCostPrice;
+
+                BigDecimal subtract = newCostPrice.subtract(costPrice);
+
+                productInfoService.update(q -> q
+                        .in(ProductInfo::getId, pIds)
+                        .setSql("price = price + " + subtract)
+                        .set(BasePo::getUpdateTime, new Date())
+                        .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                );
+            }
+        }
+
+
         List<ObsFile> fileList = productionProcessesDto.getFileList();
         if (fileList.size() > 0) {
             ObsFile obsFile = fileList.get(0);
@@ -99,6 +130,16 @@ public class ProductionProcessesServiceImpl extends ServiceImpl<ProductionProces
     @DSTransactional
     @Override
     public void delete(Long id) {
+        //检查工序关联工艺
+        List<Long> technologyIds = technologyProcessLineService.listObject(TechnologyProcessLine::getTechnologyId, q -> q
+                .eq(TechnologyProcessLine::getTargetProcessesId, id)
+        );
+        if (ObjectUtil.isNotEmpty(technologyIds)) {
+            List<String> strings = technologyService.listObject(Technology::getName, q -> q.in(Technology::getId, technologyIds));
+            String collect = strings.stream().collect(Collectors.joining(","));
+            throw new ServiceException("该工序关联以下产线:" + collect + "禁止删除!");
+        }
+
         this.removeById(id);
         ObsFileUtil.removeFile(id);
     }

+ 35 - 0
hx-mes/src/main/java/com/fjhx/mes/service/technology/impl/TechnologyServiceImpl.java

@@ -22,10 +22,14 @@ import com.fjhx.mes.service.applicable.ApplicableProductsService;
 import com.fjhx.mes.service.production.ProductionProcessesService;
 import com.fjhx.mes.service.technology.TechnologyProcessLineService;
 import com.fjhx.mes.service.technology.TechnologyService;
+import com.ruoyi.common.core.domain.BasePo;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -162,6 +166,31 @@ public class TechnologyServiceImpl extends ServiceImpl<TechnologyMapper, Technol
     @DSTransactional
     @Override
     public void edit(TechnologyDto technologyDto) {
+        Technology oldTechnology = this.getById(technologyDto.getId());
+        //修改产品价格
+        List<Long> pIds = productInfoService.listObject(ProductInfo::getId, q -> q.eq(ProductInfo::getTechnologyId, technologyDto.getId()));
+        if (ObjectUtil.isNotEmpty(pIds)) {
+            BigDecimal oldPrice = BigDecimal.ZERO;
+            BigDecimal newPrice = BigDecimal.ZERO;
+            String[] oldProcessRoute = oldTechnology.getProcessRoute().split(",");
+            if (ObjectUtil.isNotEmpty(oldProcessRoute)) {
+                List<ProductionProcesses> oldPList = productionProcessesService.list(q -> q.in(ProductionProcesses::getId, oldProcessRoute));
+                oldPrice = oldPList.stream().map(ProductionProcesses::getCostPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+            }
+            String[] newProcessRoute = technologyDto.getProcessRoute().split(",");
+            if (ObjectUtil.isNotEmpty(newProcessRoute)) {
+                List<ProductionProcesses> newPList = productionProcessesService.list(q -> q.in(ProductionProcesses::getId, newProcessRoute));
+                newPrice = newPList.stream().map(ProductionProcesses::getCostPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+            }
+            BigDecimal subtract = newPrice.subtract(oldPrice);
+            productInfoService.update(q -> q
+                    .in(ProductInfo::getId, pIds)
+                    .setSql("price = price + " + subtract)
+                    .set(BasePo::getUpdateTime, new Date())
+                    .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+            );
+        }
+
         this.updateById(technologyDto);
 
         //修改工艺线路列表,只能全删了再创建
@@ -223,6 +252,12 @@ public class TechnologyServiceImpl extends ServiceImpl<TechnologyMapper, Technol
     @DSTransactional
     @Override
     public void delete(Long id) {
+        List<String> pNames = productInfoService.listObject(ProductInfo::getName, q -> q.eq(ProductInfo::getTechnologyId, id));
+        if (ObjectUtil.isNotEmpty(pNames)) {
+            String collect = pNames.stream().collect(Collectors.joining(","));
+            throw new ServiceException("该产线关联以下产品:" + collect + "禁止删除!");
+        }
+
         this.removeById(id);
         applicableProductsService.remove(q -> q.eq(ApplicableProducts::getTechnologyId, id));
     }

+ 10 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/quotation/po/QuotationProduct.java

@@ -64,4 +64,14 @@ public class QuotationProduct extends BasePo {
      * 生产公司报价单价
      */
     private BigDecimal prodPrice;
+
+    /**
+     * 业务员最低价
+     */
+    private BigDecimal minPrice;
+
+    /**
+     * 放大比例
+     */
+    private BigDecimal amplifyRatio;
 }