Ver Fonte

财务预估子表,根据修改的金属配置信息,重新计算 相关字段

turujie há 1 ano atrás
pai
commit
598b1e30e2

+ 6 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/dao/ComMetalConfigDao.java

@@ -2,7 +2,12 @@ package com.rongwei.bscommon.sys.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.bsentity.domin.ComMetalConfigDo;
+import com.bsentity.dto.MetalConfigDto;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -14,4 +19,5 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface ComMetalConfigDao extends BaseMapper<ComMetalConfigDo> {
+    List<MetalConfigDto> getMetalById(@Param("metalConfigIds") Set<String> metalConfigIds);
 }

+ 6 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/ComMetalConfigService.java

@@ -2,6 +2,10 @@ package com.rongwei.bscommon.sys.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.bsentity.domin.ComMetalConfigDo;
+import com.bsentity.dto.MetalConfigDto;
+
+import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -13,5 +17,7 @@ import com.bsentity.domin.ComMetalConfigDo;
  */
 public interface ComMetalConfigService extends IService<ComMetalConfigDo> {
 
+    List<MetalConfigDto> getMetalById(Set<String> metalConfigIds);
+
 }
 

+ 4 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/ComMetalFinanceItemService.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.bsentity.domin.ComMetalFinanceItemDo;
 import com.bsentity.vo.CopyFinanceRequest;
 import com.bsentity.vo.CopyFinanceVo;
+import com.bsentity.vo.FinanceItemVo;
 import com.bsentity.vo.GetFinalWeightRequest;
 import com.rongwei.rwcommon.base.R;
 
@@ -24,4 +25,7 @@ public interface ComMetalFinanceItemService extends IService<ComMetalFinanceItem
     R copyFinance(CopyFinanceRequest request);
 
     R getFinalWeight(GetFinalWeightRequest request);
+
+    R resetFinance(List<FinanceItemVo> financeItemVos);
+
 }

+ 9 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ComMetalConfigServiceImpl.java

@@ -2,10 +2,14 @@ package com.rongwei.bscommon.sys.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.bsentity.domin.ComMetalConfigDo;
+import com.bsentity.dto.MetalConfigDto;
 import com.rongwei.bscommon.sys.dao.ComMetalConfigDao;
 import com.rongwei.bscommon.sys.service.ComMetalConfigService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Set;
+
 /**
  * <p>
  * 金属配置表 服务实现类
@@ -16,4 +20,9 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class ComMetalConfigServiceImpl extends ServiceImpl<ComMetalConfigDao, ComMetalConfigDo> implements ComMetalConfigService {
+    @Override
+    public List<MetalConfigDto> getMetalById(Set<String> metalConfigIds) {
+
+        return baseMapper.getMetalById(metalConfigIds);
+    }
 }

+ 113 - 12
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ComMetalFinanceItemServiceImpl.java

@@ -8,29 +8,22 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.bsentity.domin.ComCustomerDo;
 import com.bsentity.domin.ComMetalFinanceItemDo;
 import com.bsentity.domin.ComMetalFinanceRecheckItemDo;
+import com.bsentity.dto.MetalConfigDto;
 import com.bsentity.dto.MetalProductDto;
-import com.bsentity.vo.CopyFinanceRequest;
-import com.bsentity.vo.CopyFinanceVo;
-import com.bsentity.vo.GetFinalWeightRequest;
-import com.bsentity.vo.GetFinalWeightVo;
+import com.bsentity.vo.*;
 import com.rongwei.bscommon.sys.dao.ComMetalFinanceItemDao;
 import com.rongwei.bscommon.sys.dao.ComMetalFinanceRecheckItemDao;
-import com.rongwei.bscommon.sys.service.ComCustomerService;
-import com.rongwei.bscommon.sys.service.ComMetalFinanceItemService;
-import com.rongwei.bscommon.sys.service.ComMetalFinanceRecheckItemService;
-import com.rongwei.bscommon.sys.service.ComMetalProductService;
+import com.rongwei.bscommon.sys.service.*;
 import com.rongwei.rwcommon.base.R;
 import com.rongwei.rwcommon.base.exception.CustomException;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -54,6 +47,8 @@ public class ComMetalFinanceItemServiceImpl extends ServiceImpl<ComMetalFinanceI
     ComCustomerService customerService;
     @Autowired
     ComMetalProductService comMetalProductService;
+    @Autowired
+    ComMetalConfigService comMetalConfigService;
 
     @Override
     public R copyFinance(CopyFinanceRequest request) {
@@ -146,6 +141,112 @@ public class ComMetalFinanceItemServiceImpl extends ServiceImpl<ComMetalFinanceI
         return R.ok();
     }
 
+    /**
+     *  根据重置的金属价格,重新计算 计算合计(人民币), 计算合计(美元), 单kg损失金额
+     * @param financeItemVos
+     * @return
+     */
+    @Override
+    public R resetFinance(List<FinanceItemVo> financeItemVos) {
+        log.info("重置计算  参数 -> {}" , financeItemVos);
+        // 变更数据
+        List<String> financeItemIds = financeItemVos.stream().map(FinanceItemVo::getId).collect(Collectors.toList());
+        List<ComMetalFinanceItemDo> comMetalFinanceItemDos = baseMapper.selectBatchIds(financeItemIds);
+        if (comMetalFinanceItemDos.isEmpty()){
+            return  null;
+        }
+        // 变更
+        return updateFinanceItem(comMetalFinanceItemDos , financeItemVos);
+    }
+
+
+    /**
+     * 变更计算数据 , 同时变更 表单合计数据
+     * @param comMetalFinanceItemDos
+     * @param financeItemVos
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public R updateFinanceItem(List<ComMetalFinanceItemDo> comMetalFinanceItemDos, List<FinanceItemVo> financeItemVos) {
+        log.info("重置财务预估,变更处理...");
+        // 计算处理
+        Set<String> metalConfigIds = comMetalFinanceItemDos.stream().map(ComMetalFinanceItemDo::getMetalconfigid).collect(Collectors.toSet());
+
+        List<MetalConfigDto> metalConfigDtoList =  comMetalConfigService.getMetalById(metalConfigIds);
+        MetalConfigDto metalConfigDto = metalConfigDtoList.get(0);
+
+        for (FinanceItemVo financeItemVo : financeItemVos) {
+            financeItemVo.setMetalPrice(metalConfigDto.getMetalPrice());
+            financeItemVo.setLossRate(metalConfigDto.getLossRate());
+            financeItemVo.setMetalConfigId(metalConfigDtoList.get(0).getId());
+
+            financeItemVo.calculate();
+        }
+        Map<String, FinanceItemVo> itemVoMap = financeItemVos.stream()
+                .collect(Collectors.toMap(FinanceItemVo::getId, Function.identity()));
+
+
+        for (ComMetalFinanceItemDo itemDo : comMetalFinanceItemDos) {
+            FinanceItemVo financeItemVo = itemVoMap.get(itemDo.getId());
+            itemDo.setProcessunitprice(financeItemVo.getProcessUnitPrice());
+            itemDo.setCostunitprice(financeItemVo.getCostUnitPrice());
+            itemDo.setMetalpriceloss(financeItemVo.getMetalPriceLoss());
+            itemDo.setFreightunitprice(financeItemVo.getFreightUnitPrice());
+            itemDo.setFreightloss(financeItemVo.getFreightLoss());
+            itemDo.setTotalcostrmb(financeItemVo.getTotalcostrmb());
+            itemDo.setExchangerate(financeItemVo.getExchangeRate());
+            itemDo.setPricetotalusd(financeItemVo.getPricetotalusd());
+            itemDo.setOthercostrmb(financeItemVo.getOtherCostRMB());
+            itemDo.setOthercostusd(financeItemVo.getOthercostusd());
+            itemDo.setUnitkgpricelossusd(financeItemVo.getUnitkgpricelossusd());
+
+        }
+
+
+        // 计算合计(人民币) =  所有计算合计数据总和
+        BigDecimal itemTotalcostrmb = comMetalFinanceItemDos.stream()
+                .map(ComMetalFinanceItemDo::getTotalcostrmb)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        // 计算合计(美元) =  所有计算合计(美元)总和
+        BigDecimal itemPricetotalusd = comMetalFinanceItemDos.stream()
+                .map(ComMetalFinanceItemDo::getPricetotalusd)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        // 其他费用(人民币)
+        BigDecimal itemOthercostrmb = comMetalFinanceItemDos.stream()
+                .map(ComMetalFinanceItemDo::getOthercostrmb)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+
+        // 其他费用 (美元)
+        BigDecimal itemOthercostusd = comMetalFinanceItemDos.stream()
+                .map(ComMetalFinanceItemDo::getOthercostusd)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+
+        // 金额总计 (人民币) = 计算合计(人民币)  + 其他费用(人民币)
+        BigDecimal costRmb = itemTotalcostrmb.add(itemOthercostrmb);
+
+        // 金额总计 (美元) = 计算合计(美元)  + 其他费用(美元)
+        BigDecimal pricetotalusd = itemPricetotalusd.add(itemOthercostusd);
+
+
+        ComCustomerDo comCustomerDo = customerService.getById(comMetalFinanceItemDos.get(0).getCustomerid());
+        if (ObjectUtil.isNotEmpty(comCustomerDo)){
+            comCustomerDo.setComputecostrmb(itemTotalcostrmb);
+            comCustomerDo.setComputecostusd(itemPricetotalusd);
+            comCustomerDo.setOthercostrmb(itemOthercostrmb);
+            comCustomerDo.setOthercostusd(itemOthercostusd);
+            comCustomerDo.setTotalcostrmb(costRmb);
+            comCustomerDo.setPricetotalusd(pricetotalusd);
+        }
+
+        saveOrUpdateBatch(comMetalFinanceItemDos);
+        customerService.saveOrUpdate(comCustomerDo);
+        return R.ok();
+    }
+
 
     /**
      * 计算财务复核合计数据

+ 30 - 0
business-entity/src/main/java/com/bsentity/dto/MetalConfigDto.java

@@ -0,0 +1,30 @@
+package com.bsentity.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 金属价格配置信息
+ */
+@Data
+public class MetalConfigDto implements Serializable {
+
+    /**
+     * 金属价格id
+     */
+    private String id;
+
+    /**
+     * 金属价格
+     */
+    private BigDecimal metalPrice;
+
+    /**
+     * 报废损失率
+     */
+    private BigDecimal lossRate;
+
+
+}

+ 183 - 0
business-entity/src/main/java/com/bsentity/vo/FinanceItemVo.java

@@ -0,0 +1,183 @@
+package com.bsentity.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+/**
+ * 财务预估表数据
+ */
+@Data
+public class FinanceItemVo implements Serializable {
+
+    /**
+     * 金属价格信息ID
+     */
+    @JsonProperty(value = "METALCONFIGID")
+    private String metalConfigId;
+
+    /**
+     * 财务预估数据id
+     */
+    @JsonProperty(value = "ID")
+    private String id;
+
+    /**
+     * 商品id
+     */
+    @JsonProperty(value = "PRODUCTID")
+    private String productId;
+
+    /**
+     * 主表id
+     */
+    @JsonProperty(value = "CUSTOMERID")
+    private String customerId;
+
+
+    /**
+     * 加工收入单价
+     */
+    @JsonProperty(value = "PROCESSUNITPRICE")
+    private BigDecimal processUnitPrice;
+
+    /**
+     * 投诉重量
+     */
+    @JsonProperty(value = "COMWEIGHT")
+    private BigDecimal comWeight;
+
+    /**
+     * 加工成本单价
+     */
+    @JsonProperty(value = "COSTUNITPRICE")
+    private BigDecimal costUnitPrice;
+
+    /**
+     * 金属损失金额
+     */
+    @JsonProperty(value = "METALPRICELOSS")
+    private BigDecimal metalPriceLoss;
+
+    /**
+     * 运费损失
+     */
+    @JsonProperty(value = "FREIGHTLOSS")
+    private BigDecimal freightLoss;
+
+    /**
+     * 外汇汇率
+     */
+    @JsonProperty(value = "EXCHANGERATE")
+    private BigDecimal exchangeRate;
+
+    /**
+     * 序号
+     */
+    @JsonProperty(value = "SERIALNO")
+    private String serialNo;
+
+    /**
+     * 其他费用(人民币)
+     */
+    @JsonProperty(value = "OTHERCOSTRMB")
+    private BigDecimal otherCostRMB;
+
+    /**
+     * 运费单价
+     */
+    @JsonProperty(value = "FREIGHTUNITPRICE")
+    private BigDecimal freightUnitPrice;
+
+
+    /**
+     * 金属价格
+     */
+    private BigDecimal metalPrice;
+
+    /**
+     * 报废损失率
+     */
+    private BigDecimal lossRate;
+
+    /**
+     * 计算合计(人民币)
+     */
+    private BigDecimal totalcostrmb;
+
+    /**
+     * 计算合计(美元)
+     */
+    private BigDecimal pricetotalusd;
+
+    /**
+     * 其他费用(美元)
+     */
+    private BigDecimal othercostusd;
+
+    /**
+     * 单kg损失金额(美元)
+     */
+    private BigDecimal unitkgpricelossusd;
+
+    /**
+     * 计算数据
+     */
+    public void calculate(){
+        // 金属价格
+        this.metalPrice = this.metalPrice == null ? BigDecimal.ZERO : this.metalPrice;
+        // 报废损失率
+        this.lossRate = this.lossRate == null ? BigDecimal.ZERO : this.lossRate;
+        //加工收入单价
+        this.processUnitPrice = this.processUnitPrice == null ? BigDecimal.ZERO : this.processUnitPrice;
+        // 投诉重量
+        this.comWeight = this.comWeight == null ? BigDecimal.ZERO : this.comWeight;
+        // 加工成本单价
+        this.costUnitPrice = this.costUnitPrice == null ? BigDecimal.ZERO : this.costUnitPrice;
+        // 金属损失金额
+        this.metalPriceLoss = this.metalPriceLoss == null ? BigDecimal.ZERO : this.metalPriceLoss;
+        // 运费损失
+        this.freightLoss = this.freightLoss == null ? BigDecimal.ZERO : this.freightLoss;
+        // 外汇汇率
+        this.exchangeRate = this.exchangeRate == null ? BigDecimal.ZERO : this.exchangeRate;
+
+        // 计算金属损失金额
+        this.metalPriceLoss = (this.metalPrice
+                                .divide(new BigDecimal("1.13"),4,RoundingMode.HALF_UP)
+                                .divide(new BigDecimal("1000.0"),4,RoundingMode.HALF_UP)
+                                .multiply(this.lossRate.divide(new BigDecimal("100.0"),2,RoundingMode.HALF_UP))
+                                .multiply(this.comWeight)
+                              ).setScale(2,RoundingMode.HALF_UP);
+
+        // 计算合计(人民币) = 加工收入单价/1.13*投诉重量+加工成本单价*投诉重量+金属损失金额+运费损失;
+        this.totalcostrmb = (this.processUnitPrice
+                                .divide(new BigDecimal("1.13"),4 , RoundingMode.HALF_UP)
+                                .multiply(this.comWeight)
+                                .add(this.costUnitPrice.multiply(this.comWeight))
+                                .add(this.metalPriceLoss)
+                                .add(this.freightLoss)
+                            ).setScale(2,RoundingMode.HALF_UP);
+
+        // 其他费用(美元) = 其他费用(人民币)/外汇税率
+        if (this.exchangeRate.compareTo(BigDecimal.ZERO) == 0){
+            this.pricetotalusd = BigDecimal.ZERO;
+            this.othercostusd = BigDecimal.ZERO;
+        }else {
+            // 计算合计(美元) = 计算合计(人民币)/外汇税率;
+            this.pricetotalusd = this.totalcostrmb.divide(this.exchangeRate , 2 ,RoundingMode.HALF_UP);
+            // 其他费用(美元) = 其他费用(人民币)/外汇税率
+            this.othercostusd = this.otherCostRMB.divide(this.exchangeRate ,2 ,RoundingMode.HALF_UP);
+        }
+
+        if (this.comWeight.compareTo(BigDecimal.ZERO) == 0) {
+            this.unitkgpricelossusd = BigDecimal.ZERO;
+        }else {
+            //单kg损失金额(美元) = 计算合计美元 / 最终重量
+            this.unitkgpricelossusd = this.pricetotalusd.divide(this.comWeight,2,RoundingMode.HALF_UP);
+        }
+    }
+
+}

+ 38 - 0
business-entity/src/main/resources/mybatis/ComMetalConfigDao.xml

@@ -0,0 +1,38 @@
+<?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.rongwei.bscommon.sys.dao.ComMetalConfigDao">
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.bsentity.domin.ComMetalConfigDo">
+        <id column="ID" property="id" />
+        <result column="TENANTID" property="tenantid" />
+        <result column="ROPTION" property="roption" />
+        <result column="DELETED" property="deleted" />
+        <result column="REMARK" property="remark" />
+        <result column="CREATEDATE" property="createdate" />
+        <result column="CREATEUSERID" property="createuserid" />
+        <result column="MODIFYDATE" property="modifydate" />
+        <result column="MODIFYUSERID" property="modifyuserid" />
+        <result column="CREATEUSERNAME" property="createusername" />
+        <result column="MODIFYUSERNAME" property="modifyusername" />
+        <result column="YEAR" property="year"/>
+        <result column="MONTH" property="month"/>
+        <result column="METALPRICE" property="metalprice" />
+        <result column="LOSSRATE" property="lossrate" />
+    </resultMap>
+
+
+    <select id="getMetalById" resultType="com.bsentity.dto.MetalConfigDto">
+        SELECT
+            ID,METALPRICE , LOSSRATE
+        FROM
+            com_metal_config
+        WHERE
+            <if test="metalConfigIds != null and metalConfigIds.size > 0">
+                ID in
+                <foreach collection="metalConfigIds" open="(" separator="," close=")" item="id">
+                    #{id}
+                </foreach>
+            </if>
+    </select>
+
+</mapper>

+ 10 - 0
business-server/src/main/java/com/rongwei/controller/ComCustomerController.java

@@ -3,10 +3,12 @@ package com.rongwei.controller;
 
 import com.bsentity.vo.ComProductVo;
 import com.bsentity.vo.CopyFinanceRequest;
+import com.bsentity.vo.FinanceItemVo;
 import com.bsentity.vo.GetFinalWeightRequest;
 import com.rongwei.bscommon.sys.service.ComCustomerService;
 import com.rongwei.bscommon.sys.service.ComMetalFinanceItemService;
 import com.rongwei.rwcommon.base.R;
+import com.tencent.wework.Finance;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -64,4 +66,12 @@ public class ComCustomerController {
         return comMetalFinanceItemService.getFinalWeight(request);
     }
 
+
+    /**
+     * 根据重置的金属价格,重新计算 计算合计(人民币), 计算合计(美元), 单kg损失金额
+     */
+    @PostMapping("/resetFinance")
+    public R resetFinance(@RequestBody List<FinanceItemVo> financeItemVos){
+        return comMetalFinanceItemService.resetFinance(financeItemVos);
+    }
 }