Browse Source

添加费用申请时子表费率

contract
Yen 2 years ago
parent
commit
a640ea2b4a
  1. 5
      src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java
  2. 19
      src/main/java/com/qs/serve/modules/bir/service/BirRoiRateService.java
  3. 37
      src/main/java/com/qs/serve/modules/bir/service/impl/BirRoiRateServiceImpl.java
  4. 52
      src/main/java/com/qs/serve/modules/tbs/common/util/QuarterUtil.java
  5. 34
      src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCenterGoodBirDTO.java
  6. 50
      src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostSubItem.java
  7. 332
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java

5
src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java

@ -63,6 +63,10 @@ public class BirActivityCenterGoods implements Serializable {
@NotNull(message = "分配的核销金额不能为空")
private BigDecimal splitUsedAmount;
/** 分配的释放金额 */
@NotNull(message = "分配的释放金额不能为空")
private BigDecimal splitReleaseAmount;
/** 成本明细编码 */
@Length(max = 30,message = "成本明细编码长度不能超过30字")
private String centerGoodsCode;
@ -258,6 +262,5 @@ public class BirActivityCenterGoods implements Serializable {
@Length(max = 200,message = "客户名称长度不能超过200字")
private String supplierName;
}

19
src/main/java/com/qs/serve/modules/bir/service/BirRoiRateService.java

@ -38,5 +38,24 @@ public interface BirRoiRateService extends IService<BirRoiRate> {
YtdQtdToOAVo buildYtdAndQtdData(TbsCostApply apply);
/**
* 设置查询条件和返回客户CODELIST
* @param costDTO
* @param supplierId
* @param loadType 0->客户,1->申请人的客户,2->客户的行政区域,3->客户的销售区域
* @param userId
* @return
*/
List<String> getBiRoiCostDTOAndFindSupplierCodes(BirRoiCostDTO costDTO,String supplierId,Integer loadType,String userId);
/**
* 获取客户编码
* @param costDTO
* @param centerType
* @param centerIds
* @return
*/
List<String> getSupplierCodesByCenter(BirRoiCostDTO costDTO,String centerType,List<String> centerIds);
}

37
src/main/java/com/qs/serve/modules/bir/service/impl/BirRoiRateServiceImpl.java

@ -1,5 +1,6 @@
package com.qs.serve.modules.bir.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qs.serve.common.model.dto.DateSplitDTO;
@ -108,7 +109,7 @@ public class BirRoiRateServiceImpl extends ServiceImpl<BirRoiRateMapper,BirRoiRa
costDTO.setEndMonthNum(currMonthNum);
//设置查询条件和返回客户CODELIST
List<String> supplierCodeList = setBiroiCostDTOAndFindSupplierCodes(costDTO,supplierId,loadType,param.getUserId());
List<String> supplierCodeList = getBiRoiCostDTOAndFindSupplierCodes(costDTO,supplierId,loadType,param.getUserId());
List<BirRoiCostItemVo> costItemVoList = this.queryRoiCostItems(costDTO);
@ -311,7 +312,7 @@ public class BirRoiRateServiceImpl extends ServiceImpl<BirRoiRateMapper,BirRoiRa
private Float getPercenDateByLoadType(Integer loadType,BirRoiCostDTO oriCostDTO,String supplierId,String userId){
BirRoiCostDTO costDTO = CopierUtil.copy(oriCostDTO,new BirRoiCostDTO());
List<String> supplierCodeList = setBiroiCostDTOAndFindSupplierCodes(costDTO, supplierId, loadType, userId);
List<String> supplierCodeList = getBiRoiCostDTOAndFindSupplierCodes(costDTO, supplierId, loadType, userId);
Float tempPercent = getPercentDate(costDTO,supplierCodeList);
return tempPercent;
}
@ -334,7 +335,8 @@ public class BirRoiRateServiceImpl extends ServiceImpl<BirRoiRateMapper,BirRoiRa
return percent;
}
private List<String> setBiroiCostDTOAndFindSupplierCodes(BirRoiCostDTO costDTO,String supplierId,Integer loadType,String userId){
@Override
public List<String> getBiRoiCostDTOAndFindSupplierCodes(BirRoiCostDTO costDTO, String supplierId, Integer loadType, String userId){
BmsSupplier bmsSupplier = bmsSupplierMapper.selectById(supplierId);
List<String> supplierCodeList = new ArrayList<>();
@ -347,7 +349,6 @@ public class BirRoiRateServiceImpl extends ServiceImpl<BirRoiRateMapper,BirRoiRa
}else if (loadType.equals(1)){
//1->申请人的客户
costDTO.setUserId(userId);
//加载用户的其它供应商编码
BmsSupplier param4Supplier = new BmsSupplier();
param4Supplier.setCurrUserId(userId);
List<BmsSupplier> supplierList = bmsSupplierMapper.selectSupplierList(param4Supplier);
@ -387,5 +388,33 @@ public class BirRoiRateServiceImpl extends ServiceImpl<BirRoiRateMapper,BirRoiRa
supplierCodeList.add("0");
return supplierCodeList;
}
@Override
public List<String> getSupplierCodesByCenter(BirRoiCostDTO costDTO, String centerType, List<String> centerIds) {
if(CollUtil.isEmpty(centerIds)){
return null;
}
if(centerType.equals("customer")){
List<BmsSupplier> supplierList = bmsSupplierMapper.selectBatchIds(centerIds);
return supplierList.stream().map(BmsSupplier::getCode).collect(Collectors.toList());
}else if(centerType.equals("bizRegion")){
LambdaQueryWrapper<BmsSupplier> lqw = new LambdaQueryWrapper<>();
lqw.select(BmsSupplier::getCode);
lqw.in(BmsSupplier::getRegion2First,centerIds)
.or().in(BmsSupplier::getRegion2Second,centerIds)
.or().in(BmsSupplier::getRegion2Third,centerIds)
.or().in(BmsSupplier::getRegion2Fourthly,centerIds);
return bmsSupplierMapper.selectList(lqw).stream().map(BmsSupplier::getCode).collect(Collectors.toList());
}else if(centerType.equals("saleRegion")){
LambdaQueryWrapper<BmsSupplier> lqw = new LambdaQueryWrapper<>();
lqw.select(BmsSupplier::getCode);
lqw.in(BmsSupplier::getRegionFirst,centerIds)
.or().in(BmsSupplier::getRegionSecond,centerIds)
.or().in(BmsSupplier::getRegionThird,centerIds)
.or().in(BmsSupplier::getRegionFourthly,centerIds);
return bmsSupplierMapper.selectList(lqw).stream().map(BmsSupplier::getCode).collect(Collectors.toList());
}
return null;
}
}

52
src/main/java/com/qs/serve/modules/tbs/common/util/QuarterUtil.java

@ -0,0 +1,52 @@
package com.qs.serve.modules.tbs.common.util;
import java.util.ArrayList;
import java.util.List;
/**
* @author YenHex
* @since 2023/7/13
*/
public class QuarterUtil {
public static final String[] q1 = {"01","02","03"};
public static final String[] q2 = {"04","05","06"};
public static final String[] q3 = {"07","08","09"};
public static final String[] q4 = {"10","11","12"};
public static final String[] getQuarterNumbers(Integer month){
String mStr = month>9?month+"":"0"+month;
for (String s : q1) {
if(mStr.equals(s)){
return q1;
}
}
for (String s : q2) {
if(mStr.equals(s)){
return q2;
}
}
for (String s : q3) {
if(mStr.equals(s)){
return q3;
}
}
for (String s : q4) {
if(mStr.equals(s)){
return q4;
}
}
return null;
}
public static List<Integer> getQuarterNumbers(Integer year,Integer month){
String[] q = getQuarterNumbers(month);
List<Integer> list = new ArrayList<>();
for (String s : q) {
list.add(Integer.parseInt(year+s));
}
return list;
}
}

34
src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCenterGoodBirDTO.java

@ -0,0 +1,34 @@
package com.qs.serve.modules.tbs.entity.dto;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author YenHex
* @since 2023/7/13
*/
@Data
public class TbsCenterGoodBirDTO {
//实际销量(发货金额)
private BigDecimal realSales;
//实际费用(核销和释放金额)
private BigDecimal realCost;
//实际费用率(核销和释放金额/发货金额)
private BigDecimal realExpenseRate;
//实际费用(核销)
private BigDecimal realCheck;
//实际费用(释放金额)
private BigDecimal realRelease;
public void initRealExpenseRate(){
if(realSales!=null&&realSales.compareTo(BigDecimal.ZERO)!=0){
realExpenseRate = realCost.divide(realCost,BigDecimal.ROUND_DOWN);
}
}
}

50
src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostSubItem.java

@ -20,15 +20,59 @@ public class TbsCostSubItem {
private String chengBenZhongXin;
private String chengBenZhongXinId;
//budgetAmount
//区域预算,预算金额
private BigDecimal areaBudget;
//preDispatchAmout
//目标销量,预估发货金额
private BigDecimal targetSales;
//targetExpenseRate = areaBudget/targetSales
//目标预算费率,预估费率。targetExpenseRate = areaBudget/targetSales
private BigDecimal targetExpenseRate;
//目标销量(发货金额)
private BigDecimal qtdTargetSales;
//目标预算(预算金额)
private BigDecimal qtdTargetBudget;
//目标费用率(预算金额/预估发货金额)
private BigDecimal qtdTargetExpenseRate;
//实际销量(发货金额)
private BigDecimal qtdRealSales;
//实际费用(核销和释放金额)
private BigDecimal qtdRealCost;
//实际费用率(核销和释放金额/发货金额)
private BigDecimal qtdRealExpenseRate;
//目标销量
private BigDecimal ytdTargetSales;
//目标预算
private BigDecimal ytdTargetBudget;
//目标费用率
private BigDecimal ytdTargetExpenseRate;
//实际销量
private BigDecimal ytdRealSales;
//实际费用
private BigDecimal ytdRealCost;
//实际费用率
private BigDecimal ytdRealExpenseRate;
//目标销量
private BigDecimal mtdTargetSales;
//目标预算
private BigDecimal mtdTargetBudget;
//目标费用率
private BigDecimal mtdTargetExpenseRate;
//实际销量
private BigDecimal mtdRealSales;
//实际费用
private BigDecimal mtdRealCost;
//实际费用率
private BigDecimal mtdRealExpenseRate;
}
@Data

332
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java

@ -11,6 +11,8 @@ import com.qs.serve.common.model.consts.BudgetLogRollbackFlag;
import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.util.*;
import com.qs.serve.common.util.model.DateFormatString;
import com.qs.serve.modules.bir.entity.BirActivityCenterGoods;
import com.qs.serve.modules.bir.entity.dto.BirRoiCostDTO;
import com.qs.serve.modules.bir.entity.vo.YtdQtdToOAVo;
import com.qs.serve.modules.bir.service.BirRoiRateService;
import com.qs.serve.modules.bms.entity.BmsRegion;
@ -21,6 +23,8 @@ import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper;
import com.qs.serve.modules.bms.mapper.BmsRegionMapper;
import com.qs.serve.modules.bms.service.BmsSubjectService;
import com.qs.serve.modules.bms.service.BmsSupplierService;
import com.qs.serve.modules.erp.entity.dto.ErpDispatchSumVo;
import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper;
import com.qs.serve.modules.seeyon.entity.BaseCreateCallbackBo;
import com.qs.serve.modules.seeyon.entity.BaseCreateProcessBo;
import com.qs.serve.modules.seeyon.service.SeeYonRequestService;
@ -31,15 +35,17 @@ import com.qs.serve.modules.sys.service.SysUserService;
import com.qs.serve.modules.tbs.common.TbsActivityState;
import com.qs.serve.modules.tbs.common.TbsCostApplyState;
import com.qs.serve.modules.tbs.common.TbsSeeYonConst;
import com.qs.serve.modules.tbs.common.util.QuarterUtil;
import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil;
import com.qs.serve.modules.tbs.entity.*;
import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo;
import com.qs.serve.modules.tbs.entity.dto.TbsCenterGoodBirDTO;
import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult;
import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem;
import com.qs.serve.modules.tbs.mapper.*;
import com.qs.serve.modules.tbs.service.*;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeansException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -81,6 +87,7 @@ public class TbsCostApplyServiceImpl extends ServiceImpl<TbsCostApplyMapper,TbsC
private BirRoiRateService birRoiRateService;
private TbsCostPercentMapper tbsCostPercentMapper;
private TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper;
private final ErpDispatchDataMapper dispatchDataMapper;
@Override
@ -221,48 +228,8 @@ public class TbsCostApplyServiceImpl extends ServiceImpl<TbsCostApplyMapper,TbsC
data.put("exsp1",TbsSeeYonConst.CostApplyConf.Code());
data.put("money",tbsCostApply.getTotalActivityAmount());
//记录费率参数
YtdQtdToOAVo ytdQtdToOAVo = birRoiRateService.buildYtdAndQtdData(tbsCostApply);
// data.put("ytdCusExpenseRate",ytdQtdToOAVo.getYtdCustomerPercent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdCustomerPercent()));
// data.put("ytdEmpExpenseRate",ytdQtdToOAVo.getYtdUserPercent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdUserPercent()));
// data.put("ytdAdminiExpenseRate",ytdQtdToOAVo.getYtdRegionPercent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdRegionPercent()));
// data.put("ytdSalesExpenseRate",ytdQtdToOAVo.getYtdRegion2Percent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdRegion2Percent()));
// data.put("cusExpenseRate",ytdQtdToOAVo.getQtdCustomerPercent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdCustomerPercent()));
// data.put("empExpenseRate",ytdQtdToOAVo.getQtdUserPercent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdUserPercent()));
// data.put("salesExpenseRate",ytdQtdToOAVo.getQtdRegionPercent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdRegionPercent()));
// data.put("adminiExpenseRate",ytdQtdToOAVo.getQtdRegion2Percent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdRegion2Percent()));
//插入记录表前移除历史记录
tbsCostPercentMapper.delByCostApplyId(tbsCostApply.getId());
TbsCostPercent costPercent = new TbsCostPercent();
costPercent.setCostApplyId(tbsCostApply.getId());
costPercent.setYtdCustomerPercent(ytdQtdToOAVo.getYtdCustomerPercent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdCustomerPercent()));
costPercent.setYtdUserPercent(ytdQtdToOAVo.getYtdUserPercent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdUserPercent()));
costPercent.setYtdRegion2Percent(ytdQtdToOAVo.getYtdRegion2Percent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdRegion2Percent()));
costPercent.setYtdRegionPercent(ytdQtdToOAVo.getYtdRegionPercent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdRegionPercent()));
costPercent.setQtdCustomerPercent(ytdQtdToOAVo.getQtdCustomerPercent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdCustomerPercent()));
costPercent.setQtdUserPercent(ytdQtdToOAVo.getQtdUserPercent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdUserPercent()));
costPercent.setQtdRegion2Percent(ytdQtdToOAVo.getQtdRegion2Percent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdRegion2Percent()));
costPercent.setQtdRegionPercent(ytdQtdToOAVo.getQtdRegionPercent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdRegionPercent()));
tbsCostPercentMapper.insert(costPercent);
//记录主表费率参数
this.buildMainData4ROI(tbsCostApply, data);
//拓展添加审批关联区域
String saleRegionId = supplier.handleSaleRegionId();
@ -289,60 +256,15 @@ public class TbsCostApplyServiceImpl extends ServiceImpl<TbsCostApplyMapper,TbsC
List<TbsActivitySubject> tbsActivitySubjects = tbsActivitySubjectService.listByCostApplyId(Long.parseLong(id));
List<String> subjectNames = tbsActivitySubjects.stream().map(TbsActivitySubject::getSubjectName).distinct().collect(Collectors.toList());
List<Object> subList = new ArrayList<>();
for (String subjectName : subjectNames) {
subList.add(new TbsCostSubItem.Subject(subjectName));
}
//目标费率和成本中心统计
List<TbsBudgetCostItem> tbsBudgetCostItems = result.getBudgetMatchList();
List<Long> scheduleItemBudgetIds = tbsBudgetCostItems.stream().map(a->a.getScheduleItemBudgetId()).distinct().collect(Collectors.toList());
List<TbsScheduleItemBudget> tbsScheduleItemBudgets = tbsScheduleItemBudgetMapper.selectBatchIds(scheduleItemBudgetIds);
/*for(TbsScheduleItemBudget tbsScheduleItemBudget : tbsScheduleItemBudgets){
subList.add(
new TbsCostSubItem.Amount(
tbsScheduleItemBudget.getBudgetAmount(),
tbsScheduleItemBudget.getPreDispatchAmount(),
tbsScheduleItemBudget.compareTargetExpenseRate()
)
);
}*/
for (TbsActivityCenter activityCenter : tbsActivityCenters) {
TbsCostSubItem.CostCenter costCenter = new TbsCostSubItem.CostCenter(activityCenter.getCenterName(),
activityCenter.getCenterType()+"_"+ activityCenter.getCenterId());
for (TbsBudget budget : result.getBudgetList()) {
boolean eqType = activityCenter.getCenterType().equals(budget.getCenterType());
boolean eqCost = activityCenter.getCenterId().equals(budget.getCenterId());
if(eqType&&eqCost){
BigDecimal totalBudgetAmount = BigDecimal.ZERO;
BigDecimal totalPreDispatchAmount = BigDecimal.ZERO;
for (TbsScheduleItemBudget itemBudget : tbsScheduleItemBudgets) {
if(itemBudget.getBudgetId().equals(budget.getId())){
if(itemBudget.getBudgetAmount()!=null){
totalBudgetAmount = totalBudgetAmount.add(itemBudget.getBudgetAmount());
}
if(itemBudget.getPreDispatchAmount()!=null){
totalPreDispatchAmount = totalBudgetAmount.add(itemBudget.getPreDispatchAmount());
}
}
}
costCenter.setAreaBudget(totalBudgetAmount);
costCenter.setTargetSales(totalPreDispatchAmount);
if(totalPreDispatchAmount.compareTo(BigDecimal.ZERO)!=0){
costCenter.setTargetExpenseRate(totalBudgetAmount.divide(totalPreDispatchAmount,BigDecimal.ROUND_DOWN));
}
}
}
subList.add(costCenter);
}
//创建子表数据
this.buildSubList(result, tbsActivityCenters, subjectNames, subList);
//创建商品抬头列表
List<TbsActivityGoods> tbsActivityGoods = tbsActivityGoodsService.listByCostApplyId(Long.parseLong(id));
Set<String> bands = new HashSet<>();
for (TbsActivityGoods tbsActivityGood : tbsActivityGoods) {
String band = tbsActivityGood.getTargetLevelPathNames().split("_")[0];
bands.add(band);
}
String goods = bands.stream().collect(Collectors.joining(","));
data.put("chanPinPinLei",goods);
data.put("sub",subList);
@ -429,6 +351,234 @@ public class TbsCostApplyServiceImpl extends ServiceImpl<TbsCostApplyMapper,TbsC
}
/**
* 记录主表费率参数
* @param tbsCostApply
* @param data
*/
private void buildMainData4ROI(TbsCostApply tbsCostApply, Map<String, Object> data) {
YtdQtdToOAVo ytdQtdToOAVo = birRoiRateService.buildYtdAndQtdData(tbsCostApply);
data.put("ytdCusExpenseRate",ytdQtdToOAVo.getYtdCustomerPercent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdCustomerPercent()));
data.put("ytdEmpExpenseRate",ytdQtdToOAVo.getYtdUserPercent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdUserPercent()));
data.put("ytdAdminiExpenseRate",ytdQtdToOAVo.getYtdRegionPercent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdRegionPercent()));
data.put("ytdSalesExpenseRate",ytdQtdToOAVo.getYtdRegion2Percent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdRegion2Percent()));
data.put("cusExpenseRate",ytdQtdToOAVo.getQtdCustomerPercent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdCustomerPercent()));
data.put("empExpenseRate",ytdQtdToOAVo.getQtdUserPercent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdUserPercent()));
data.put("salesExpenseRate",ytdQtdToOAVo.getQtdRegionPercent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdRegionPercent()));
data.put("adminiExpenseRate",ytdQtdToOAVo.getQtdRegion2Percent()==null?
BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdRegion2Percent()));
//插入记录表前移除历史记录
// tbsCostPercentMapper.delByCostApplyId(tbsCostApply.getId());
// TbsCostPercent costPercent = new TbsCostPercent();
// costPercent.setCostApplyId(tbsCostApply.getId());
// costPercent.setYtdCustomerPercent(ytdQtdToOAVo.getYtdCustomerPercent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdCustomerPercent()));
// costPercent.setYtdUserPercent(ytdQtdToOAVo.getYtdUserPercent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdUserPercent()));
// costPercent.setYtdRegion2Percent(ytdQtdToOAVo.getYtdRegion2Percent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdRegion2Percent()));
// costPercent.setYtdRegionPercent(ytdQtdToOAVo.getYtdRegionPercent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdRegionPercent()));
// costPercent.setQtdCustomerPercent(ytdQtdToOAVo.getQtdCustomerPercent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdCustomerPercent()));
// costPercent.setQtdUserPercent(ytdQtdToOAVo.getQtdUserPercent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdUserPercent()));
// costPercent.setQtdRegion2Percent(ytdQtdToOAVo.getQtdRegion2Percent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdRegion2Percent()));
// costPercent.setQtdRegionPercent(ytdQtdToOAVo.getQtdRegionPercent()==null?
// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdRegionPercent()));
// tbsCostPercentMapper.insert(costPercent);
}
/**
* 创建子表数据
* @param result
* @param tbsActivityCenters
* @param subjectNames
* @param subList
*/
private void buildSubList(TbsBudgetCostResult result, List<TbsActivityCenter> tbsActivityCenters, List<String> subjectNames, List<Object> subList) {
for (String subjectName : subjectNames) {
subList.add(new TbsCostSubItem.Subject(subjectName));
}
//目标费率和成本中心统计
List<TbsBudgetCostItem> tbsBudgetCostItems = result.getBudgetMatchList();
List<Long> scheduleItemBudgetIds = tbsBudgetCostItems.stream().map(a->a.getScheduleItemBudgetId()).distinct().collect(Collectors.toList());
List<TbsScheduleItemBudget> tbsScheduleItemBudgets = tbsScheduleItemBudgetMapper.selectBatchIds(scheduleItemBudgetIds);
/*for(TbsScheduleItemBudget tbsScheduleItemBudget : tbsScheduleItemBudgets){
subList.add(
new TbsCostSubItem.Amount(
tbsScheduleItemBudget.getBudgetAmount(),
tbsScheduleItemBudget.getPreDispatchAmount(),
tbsScheduleItemBudget.compareTargetExpenseRate()
)
);
}*/
//查询发货金额,并按月份分割
int year = LocalDate.now().getYear();
int month = LocalDate.now().getMonthValue();
int startMonthNum = Integer.parseInt(year+"01");
int endMonthNum = Integer.parseInt(year+"01");
tbsActivityCenters.stream().collect(Collectors.groupingBy(TbsActivityCenter::getCenterType));
BirRoiRateService roiRateService = SpringUtils.getBean(BirRoiRateService.class);
BirRoiCostDTO costDTO = new BirRoiCostDTO();
costDTO.setStartMonthNum(startMonthNum);
costDTO.setEndMonthNum(endMonthNum);
/*成本中心维度*/
//发货单
Map<String,List<ErpDispatchSumVo>> supplierCodeMapWithCenterType = new HashMap<>();
Map<String,List<TbsActivityCenter>> centerMapList = tbsActivityCenters.stream().collect(Collectors.groupingBy(TbsActivityCenter::getCenterType));
for (String centerType : centerMapList.keySet()) {
List<String> centerIds =centerMapList.get(centerType).stream().map(a->a.getCenterId()).collect(Collectors.toList());
List<String> supplierCodeList = roiRateService.getSupplierCodesByCenter(costDTO,centerType,centerIds);
//发货单
List<ErpDispatchSumVo> dispatchSumVos = null;
if(supplierCodeList.size()>0){
dispatchSumVos = dispatchDataMapper.querySumCost(startMonthNum,endMonthNum,supplierCodeList);
supplierCodeMapWithCenterType.put(centerType,dispatchSumVos);
}
}
//查询ROI底表,并拼接DTO
List<TbsCenterGoodBirDTO> centerGoodDTOS = new ArrayList<>();
List<BirActivityCenterGoods> birActivityCenterGoodsList = new ArrayList<>();
//按成本中心维度分组
Map<String,List<BirActivityCenterGoods>> birGroupByCenter = birActivityCenterGoodsList.stream()
.collect(Collectors.groupingBy(a->a.getCenterType()+"_"+a.getCenterId()));
for (TbsActivityCenter activityCenter : tbsActivityCenters) {
String centerKey = activityCenter.getCenterType()+"_"+activityCenter.getCenterId();
//创建成本中心维度对象
TbsCostSubItem.CostCenter costCenter = this.buildCostCenterParam(result, tbsScheduleItemBudgets,
year, month, supplierCodeMapWithCenterType, birGroupByCenter, activityCenter, centerKey);
subList.add(costCenter);
}
}
/**
* 创建成本中心维度对象
* @param result
* @param tbsScheduleItemBudgets
* @param year
* @param month
* @param supplierCodeMapWithCenterType
* @param birGroupByCenter
* @param activityCenter
* @param centerKey
* @return
*/
@NotNull
private TbsCostSubItem.CostCenter buildCostCenterParam(TbsBudgetCostResult result, List<TbsScheduleItemBudget> tbsScheduleItemBudgets, int year, int month, Map<String, List<ErpDispatchSumVo>> supplierCodeMapWithCenterType, Map<String, List<BirActivityCenterGoods>> birGroupByCenter, TbsActivityCenter activityCenter, String centerKey) {
TbsCostSubItem.CostCenter costCenter = new TbsCostSubItem.CostCenter(activityCenter.getCenterName(),
activityCenter.getCenterType()+"_"+ activityCenter.getCenterId());
//设置目标销量、目标预算
for (TbsBudget budget : result.getBudgetList()) {
boolean eqType = activityCenter.getCenterType().equals(budget.getCenterType());
boolean eqCost = activityCenter.getCenterId().equals(budget.getCenterId());
if (eqType && eqCost) {
BigDecimal totalBudgetAmount = BigDecimal.ZERO;
BigDecimal totalPreDispatchAmount = BigDecimal.ZERO;
for (TbsScheduleItemBudget itemBudget : tbsScheduleItemBudgets) {
if (itemBudget.getBudgetId().equals(budget.getId())) {
if (itemBudget.getBudgetAmount() != null) {
totalBudgetAmount = totalBudgetAmount.add(itemBudget.getBudgetAmount());
}
if (itemBudget.getPreDispatchAmount() != null) {
totalPreDispatchAmount = totalBudgetAmount.add(itemBudget.getPreDispatchAmount());
}
}
}
costCenter.setAreaBudget(totalBudgetAmount);
costCenter.setTargetSales(totalPreDispatchAmount);
if (totalPreDispatchAmount.compareTo(BigDecimal.ZERO) != 0) {
costCenter.setTargetExpenseRate(totalBudgetAmount.divide(totalPreDispatchAmount, BigDecimal.ROUND_DOWN));
}
//暂保持目标相关数据一致
costCenter.setYtdTargetSales(costCenter.getTargetSales());
costCenter.setYtdTargetBudget(costCenter.getAreaBudget());
costCenter.setYtdTargetExpenseRate(costCenter.getTargetExpenseRate());
costCenter.setQtdTargetSales(costCenter.getTargetSales());
costCenter.setQtdTargetBudget(costCenter.getAreaBudget());
costCenter.setQtdTargetExpenseRate(costCenter.getTargetExpenseRate());
// costCenter.setMtdTargetSales();
// costCenter.setMtdTargetBudget();
// costCenter.setMtdTargetExpenseRate();
break;
}
}
//发货金额
List<ErpDispatchSumVo> erpDispatchSumVoList = supplierCodeMapWithCenterType.get(centerKey);
//年费率
List<BirActivityCenterGoods> centerGoods = birGroupByCenter.get(centerKey);
TbsCenterGoodBirDTO bir4Year = this.getTbsCenterGoodBirDTO(centerGoods,erpDispatchSumVoList);
costCenter.setYtdRealSales(bir4Year.getRealSales());
costCenter.setYtdRealCost(bir4Year.getRealCost());
costCenter.setYtdRealExpenseRate(bir4Year.getRealExpenseRate());
//季度
List<Integer> yearMonthList =QuarterUtil.getQuarterNumbers(year, month);
List<BirActivityCenterGoods> centerGoodsQuarter = centerGoods.stream()
.filter(a-> yearMonthList.contains(a.getKeyNum()))
.collect(Collectors.toList());
TbsCenterGoodBirDTO bir4Quarter = this.getTbsCenterGoodBirDTO(centerGoodsQuarter,erpDispatchSumVoList);
costCenter.setQtdRealSales(bir4Quarter.getRealSales());
costCenter.setQtdRealCost(bir4Quarter.getRealCost());
costCenter.setQtdRealExpenseRate(bir4Quarter.getRealExpenseRate());
//月份
String mStr = month >9? month +"":"0"+ month;
Integer currYearMonth = Integer.parseInt(year +mStr);
List<BirActivityCenterGoods> centerGoodsM = centerGoods.stream()
.filter(a-> currYearMonth.equals(a.getKeyNum()))
.collect(Collectors.toList());
TbsCenterGoodBirDTO bir4Month = this.getTbsCenterGoodBirDTO(centerGoodsM,erpDispatchSumVoList);
costCenter.setMtdRealSales(bir4Month.getRealSales());
costCenter.setMtdRealCost(bir4Month.getRealCost());
costCenter.setMtdRealExpenseRate(bir4Month.getRealExpenseRate());
return costCenter;
}
/**
* 创建 成本中心 DTO
* @param centerGoods
* @param erpDispatchSumVoList
* @return
*/
@NotNull
private TbsCenterGoodBirDTO getTbsCenterGoodBirDTO(List<BirActivityCenterGoods> centerGoods,List<ErpDispatchSumVo> erpDispatchSumVoList) {
BigDecimal totalRealDispatch = BigDecimal.ZERO;
BigDecimal totalRealCost;
BigDecimal totalRealCheck = BigDecimal.ZERO;
BigDecimal totalRealRelease = BigDecimal.ZERO;
for (BirActivityCenterGoods centerGood : centerGoods) {
totalRealCheck = totalRealCheck.add(centerGood.getSplitUsedAmount());
totalRealRelease = totalRealRelease.add(centerGood.getSplitReleaseAmount());
for (ErpDispatchSumVo dispatchSumVo : erpDispatchSumVoList) {
if(centerGood.getKeyNum().equals(dispatchSumVo.getYearMonth())){
totalRealDispatch = totalRealDispatch.add(dispatchSumVo.getDispatchSumCost());
}
}
}
totalRealCost = totalRealCheck.add(totalRealRelease);
TbsCenterGoodBirDTO birDTO = new TbsCenterGoodBirDTO();
birDTO.setRealCost(totalRealCost);
birDTO.setRealCheck(totalRealCheck);
birDTO.setRealRelease(totalRealRelease);
birDTO.initRealExpenseRate();
return birDTO;
}
/**

Loading…
Cancel
Save