Browse Source

封装成本中心费用率函数

v1.0
15989082884@163.com 2 years ago
parent
commit
f7085e3d82
  1. 8
      src/main/java/com/qs/serve/modules/bir/service/BirCenterRateService.java
  2. 164
      src/main/java/com/qs/serve/modules/bir/service/impl/BirCenterRateServiceImpl.java
  3. 452
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java
  4. 10
      src/main/java/com/qs/serve/task/BirTask.java

8
src/main/java/com/qs/serve/modules/bir/service/BirCenterRateService.java

@ -0,0 +1,8 @@
package com.qs.serve.modules.bir.service;
import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem;
public interface BirCenterRateService {
public TbsCostSubItem.CostCenterTranStr buildCostCenter(String centerType, String centerId, String centerName);
}

164
src/main/java/com/qs/serve/modules/bir/service/impl/BirCenterRateServiceImpl.java

@ -0,0 +1,164 @@
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.util.CopierUtil;
import com.qs.serve.common.util.SpringUtils;
import com.qs.serve.modules.bir.entity.BirActivityCenterGoods;
import com.qs.serve.modules.bir.entity.BirRoiRate;
import com.qs.serve.modules.bir.entity.dto.BirRoiCostDTO;
import com.qs.serve.modules.bir.entity.so.BirCostRoiSo;
import com.qs.serve.modules.bir.entity.vo.BirRoiCostItemVo;
import com.qs.serve.modules.bir.entity.vo.YtdQtdToOAVo;
import com.qs.serve.modules.bir.mapper.BirRoiRateMapper;
import com.qs.serve.modules.bir.service.BirActivityCenterGoodsService;
import com.qs.serve.modules.bir.service.BirCenterRateService;
import com.qs.serve.modules.bir.service.BirRoiRateService;
import com.qs.serve.modules.bms.entity.BmsCenterRegion;
import com.qs.serve.modules.bms.entity.BmsSupplier;
import com.qs.serve.modules.bms.mapper.BmsCenterRegionMapper;
import com.qs.serve.modules.bms.mapper.BmsSupplierMapper;
import com.qs.serve.modules.erp.entity.dto.ErpDispatchSumVo;
import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper;
import com.qs.serve.modules.tbs.common.util.QuarterUtil;
import com.qs.serve.modules.tbs.entity.TbsBudget;
import com.qs.serve.modules.tbs.entity.TbsCostApply;
import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget;
import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem;
import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper;
import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.Month;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* 服务实现类
* @author YenHex
* @since 2023-06-05
*/
@Slf4j
@Service
@AllArgsConstructor
public class BirCenterRateServiceImpl implements BirCenterRateService {
private TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper;
private TbsBudgetMapper tbsBudgetMapper;
private BirRoiRateService birRoiRateService;
private final ErpDispatchDataMapper dispatchDataMapper;
private BirActivityCenterGoodsService birActivityCenterGoodsService;
public TbsCostSubItem.CostCenterTranStr buildCostCenter(String centerType,String centerId,String centerName){
int year = LocalDate.now().getYear();
int month = LocalDate.now().getMonthValue();
month = month>1?month:1;
int startMonthNum = year*100 + 1;
int endMonthNum = year*100 + month;
BirRoiCostDTO costDTO = new BirRoiCostDTO();
costDTO.setStartMonthNum(startMonthNum);
costDTO.setEndMonthNum(endMonthNum);
String centerKey = centerType + "-" + centerId;
TbsCostSubItem.CostCenterTranStr costCenter = new TbsCostSubItem.CostCenterTranStr(centerName,centerType+"-"+centerId);
/* --------------- 全年目标费用率YTD 目标预计发货,目标预算 --------------------------- */
//通过成本中心TYPE和ID取预算
LambdaQueryWrapper<TbsBudget> budgetLambdaQueryWrapper = new LambdaQueryWrapper<>();
budgetLambdaQueryWrapper.eq(TbsBudget::getCenterId,centerId);
budgetLambdaQueryWrapper.eq(TbsBudget::getCenterType,centerType);
List<TbsBudget> tbsBudgetList = tbsBudgetMapper.selectList(budgetLambdaQueryWrapper);
//通过预算ID取预算的发货和金额
LambdaQueryWrapper<TbsScheduleItemBudget> scheduleItemBudgetLambdaQueryWrapper = new LambdaQueryWrapper<>();
scheduleItemBudgetLambdaQueryWrapper.in(TbsScheduleItemBudget::getBudgetId,tbsBudgetList.stream().map(a->a.getId()).collect(Collectors.toList()));
List<TbsScheduleItemBudget> scheduleItemBudgetList = tbsScheduleItemBudgetMapper.selectList(scheduleItemBudgetLambdaQueryWrapper);
//合计目标发货和金定额
BigDecimal targetBudgetAmout = scheduleItemBudgetList.stream().map(a->a.getBudgetAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
BigDecimal targetDispatchAmout = scheduleItemBudgetList.stream().map(a->a.getPreDispatchAmount()==null?BigDecimal.ZERO:a.getPreDispatchAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
costCenter.setTargetSales(targetDispatchAmout.toString());
costCenter.setAreaBudget(targetBudgetAmout.toString());
BigDecimal targetExpenseRate = BigDecimal.ZERO;
if(targetDispatchAmout.compareTo(BigDecimal.ZERO)!=0) {
targetExpenseRate = targetBudgetAmout.divide(targetDispatchAmout, 2, BigDecimal.ROUND_HALF_DOWN);
costCenter.setTargetExpenseRate(targetExpenseRate.toString());
costCenter.setYtdTargetExpenseRate(targetExpenseRate.toString());
}
// costCenter.setTargetExpenseRate(targetExpenseRate);
costCenter.setYtdTargetBudget(targetBudgetAmout.toString());
costCenter.setYtdTargetSales(targetDispatchAmout.toString());
// costCenter.setYtdTargetExpenseRate(targetExpenseRate);
// costCenter.setQtdTargetBudget(BigDecimal.ZERO);
// costCenter.setQtdTargetSales(BigDecimal.ZERO);
// costCenter.setQtdTargetExpenseRate(BigDecimal.ZERO);
// costCenter.setMtdTargetBudget(BigDecimal.ZERO);
// costCenter.setMtdTargetSales(BigDecimal.ZERO);
// costCenter.setMtdTargetExpenseRate(BigDecimal.ZERO);
/* ------------------------------------------------------------------------- */
//实际发贷数
List<String> supplierCodeList = birRoiRateService.getSupplierCodesByCenter(costDTO,centerType, Arrays.asList(centerId));
List<ErpDispatchSumVo> dispatchSumVos = dispatchDataMapper.querySumCost(startMonthNum,endMonthNum,supplierCodeList);
//获取BIR表的数据,用于计算实际费用率
LambdaQueryWrapper<BirActivityCenterGoods> birLwq = new LambdaQueryWrapper<>();
birLwq.eq(BirActivityCenterGoods::getCenterId,centerId);
birLwq.eq(BirActivityCenterGoods::getCenterType,centerType);
birLwq.ge(BirActivityCenterGoods::getKeyNum,startMonthNum);
birLwq.le(BirActivityCenterGoods::getKeyNum,endMonthNum);
List<BirActivityCenterGoods> birCenterCost = birActivityCenterGoodsService.list(birLwq);
/* --------------- 实际费用率YTD --------------------------------------------- */
BigDecimal ytdRealDipatch = dispatchSumVos.stream().map(a->a.getDispatchSumCost()).reduce(BigDecimal.ZERO,BigDecimal::add);
BigDecimal ytdRealCost = birCenterCost.stream().map(a->a.getSplitUsedAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
costCenter.setYtdRealCost(ytdRealCost.toString());
costCenter.setYtdRealSales(ytdRealDipatch.toString());
BigDecimal ytdRealExpenseRate = BigDecimal.ZERO;
if(ytdRealDipatch.compareTo(BigDecimal.ZERO)!=0) {
ytdRealExpenseRate = ytdRealCost.divide(ytdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN);
costCenter.setYtdRealExpenseRate(ytdRealExpenseRate.toString());
}
// costCenter.setYtdRealExpenseRate(ytdRealExpenseRate);
/* ------------------------------------------------------------------------- */
/* --------------- 实际费用率QTD --------------------------------------------- */
List<Integer> yearQuarter = QuarterUtil.getQuarterNumbers(year, month);
BigDecimal qtdRealDipatch = dispatchSumVos.stream().filter(a->yearQuarter.contains(a.getYearMonth())).map(a->a.getDispatchSumCost()).reduce(BigDecimal.ZERO,BigDecimal::add);
BigDecimal qtdRealCost = birCenterCost.stream().filter(a->yearQuarter.contains(a.getKeyNum())).map(a->a.getSplitUsedAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
costCenter.setQtdRealCost(qtdRealCost.toString());
costCenter.setQtdRealSales(qtdRealDipatch.toString());
BigDecimal qtdRealExpenseRate = BigDecimal.ZERO;
if(qtdRealDipatch.compareTo(BigDecimal.ZERO)!=0) {
qtdRealExpenseRate = qtdRealCost.divide(qtdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN);
costCenter.setQtdRealExpenseRate(qtdRealExpenseRate.toString());
}
// costCenter.setQtdRealExpenseRate(qtdRealExpenseRate);
/* ------------------------------------------------------------------------- */
/* --------------- 实际费用率MTD --------------------------------------------- */
Integer yearMonth = year*100 + month;
BigDecimal mtdRealDipatch = dispatchSumVos.stream().filter(a->yearMonth.equals(a.getYearMonth())).map(a->a.getDispatchSumCost()).reduce(BigDecimal.ZERO,BigDecimal::add);
BigDecimal mtdRealCost = birCenterCost.stream().filter(a->yearMonth.equals(a.getKeyNum())).map(a->a.getSplitUsedAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
costCenter.setMtdRealCost(mtdRealCost.toString());
costCenter.setMtdRealSales(mtdRealDipatch.toString());
BigDecimal mtdRealExpenseRate = BigDecimal.ZERO;
if(mtdRealDipatch.compareTo(BigDecimal.ZERO)!=0) {
mtdRealExpenseRate = mtdRealCost.divide(mtdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN);
costCenter.setMtdRealExpenseRate(mtdRealExpenseRate.toString());
}
return costCenter;
}
}

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

@ -15,6 +15,7 @@ import com.qs.serve.modules.bir.entity.BirActivityCenterGoods;
import com.qs.serve.modules.bir.entity.dto.BirRoiCostDTO; import com.qs.serve.modules.bir.entity.dto.BirRoiCostDTO;
import com.qs.serve.modules.bir.entity.vo.YtdQtdToOAVo; import com.qs.serve.modules.bir.entity.vo.YtdQtdToOAVo;
import com.qs.serve.modules.bir.service.BirActivityCenterGoodsService; import com.qs.serve.modules.bir.service.BirActivityCenterGoodsService;
import com.qs.serve.modules.bir.service.BirCenterRateService;
import com.qs.serve.modules.bir.service.BirRoiRateService; import com.qs.serve.modules.bir.service.BirRoiRateService;
import com.qs.serve.modules.bms.entity.BmsRegion; import com.qs.serve.modules.bms.entity.BmsRegion;
import com.qs.serve.modules.bms.entity.BmsRegion2; import com.qs.serve.modules.bms.entity.BmsRegion2;
@ -92,6 +93,7 @@ public class TbsCostApplyServiceImpl extends ServiceImpl<TbsCostApplyMapper,TbsC
private final ErpDispatchDataMapper dispatchDataMapper; private final ErpDispatchDataMapper dispatchDataMapper;
private BirActivityCenterGoodsService birActivityCenterGoodsService; private BirActivityCenterGoodsService birActivityCenterGoodsService;
private TbsBudgetMapper tbsBudgetMapper; private TbsBudgetMapper tbsBudgetMapper;
private BirCenterRateService centerRateService;
@Override @Override
@ -422,238 +424,240 @@ public class TbsCostApplyServiceImpl extends ServiceImpl<TbsCostApplyMapper,TbsC
} }
//查询发货金额,并按月份分割 //查询发货金额,并按月份分割
int year = LocalDate.now().getYear(); // int year = LocalDate.now().getYear();
int month = LocalDate.now().getMonthValue(); // int month = LocalDate.now().getMonthValue();
month = month>1?month:1; // month = month>1?month:1;
int startMonthNum = year*100 + 1; // int startMonthNum = year*100 + 1;
int endMonthNum = year*100 + month; // int endMonthNum = year*100 + month;
BirRoiRateService roiRateService = SpringUtils.getBean(BirRoiRateService.class); // BirRoiRateService roiRateService = SpringUtils.getBean(BirRoiRateService.class);
BirRoiCostDTO costDTO = new BirRoiCostDTO(); // BirRoiCostDTO costDTO = new BirRoiCostDTO();
costDTO.setStartMonthNum(startMonthNum); // costDTO.setStartMonthNum(startMonthNum);
costDTO.setEndMonthNum(endMonthNum); // costDTO.setEndMonthNum(endMonthNum);
//获取BIR表的数据,用于计算实际费用率 //获取BIR表的数据,用于计算实际费用率
LambdaQueryWrapper<BirActivityCenterGoods> birLwq = new LambdaQueryWrapper<>(); // LambdaQueryWrapper<BirActivityCenterGoods> birLwq = new LambdaQueryWrapper<>();
birLwq.in(BirActivityCenterGoods::getCenterId,tbsActivityCenters.stream().map(a->a.getCenterId()).collect(Collectors.toList())); // birLwq.in(BirActivityCenterGoods::getCenterId,tbsActivityCenters.stream().map(a->a.getCenterId()).collect(Collectors.toList()));
birLwq.ge(BirActivityCenterGoods::getKeyNum,startMonthNum); // birLwq.ge(BirActivityCenterGoods::getKeyNum,startMonthNum);
birLwq.le(BirActivityCenterGoods::getKeyNum,endMonthNum); // birLwq.le(BirActivityCenterGoods::getKeyNum,endMonthNum);
List<BirActivityCenterGoods> birActivityCenterGoodsList = birActivityCenterGoodsService.list(birLwq); // List<BirActivityCenterGoods> birActivityCenterGoodsList = birActivityCenterGoodsService.list(birLwq);
Map<String,List<BirActivityCenterGoods>> birCenterCostMap = birActivityCenterGoodsList.stream().collect(Collectors.groupingBy(a->a.getCenterType() + "-"+a.getCenterId())); // Map<String,List<BirActivityCenterGoods>> birCenterCostMap = birActivityCenterGoodsList.stream().collect(Collectors.groupingBy(a->a.getCenterType() + "-"+a.getCenterId()));
//成本中心去重 //成本中心去重
Map<String,List<TbsActivityCenter>> centerMapList = tbsActivityCenters.stream().collect(Collectors.groupingBy(a->a.getCenterType()+"-"+a.getCenterId())); Map<String,List<TbsActivityCenter>> centerMapList = tbsActivityCenters.stream().collect(Collectors.groupingBy(a->a.getCenterType()+"-"+a.getCenterId()));
List<TbsActivityCenter> centerList = centerMapList.values().stream().map(a->a.get(0)).collect(Collectors.toList()); List<TbsActivityCenter> centerList = centerMapList.values().stream().map(a->a.get(0)).collect(Collectors.toList());
for(TbsActivityCenter center : centerList){ for(TbsActivityCenter center : centerList){
String centerType = center.getCenterType(); TbsCostSubItem.CostCenterTranStr costCenter = centerRateService.buildCostCenter(center.getCenterType(),center.getCenterId(),center.getCenterName());
String centerId = center.getCenterId();
String centerKey = centerType + "-" + centerId;
TbsCostSubItem.CostCenterTranStr costCenter = new TbsCostSubItem.CostCenterTranStr(center.getCenterName(),centerType+"-"+centerId);
/* --------------- 全年目标费用率YTD 目标预计发货,目标预算 --------------------------- */
//通过成本中心TYPE和ID取预算
LambdaQueryWrapper<TbsBudget> budgetLambdaQueryWrapper = new LambdaQueryWrapper<>();
budgetLambdaQueryWrapper.eq(TbsBudget::getCenterId,centerId);
budgetLambdaQueryWrapper.eq(TbsBudget::getCenterType,centerType);
List<TbsBudget> tbsBudgetList = tbsBudgetMapper.selectList(budgetLambdaQueryWrapper);
//通过预算ID取预算的发货和金额
LambdaQueryWrapper<TbsScheduleItemBudget> scheduleItemBudgetLambdaQueryWrapper = new LambdaQueryWrapper<>();
scheduleItemBudgetLambdaQueryWrapper.in(TbsScheduleItemBudget::getBudgetId,tbsBudgetList.stream().map(a->a.getId()).collect(Collectors.toList()));
List<TbsScheduleItemBudget> scheduleItemBudgetList = tbsScheduleItemBudgetMapper.selectList(scheduleItemBudgetLambdaQueryWrapper);
//合计目标发货和金定额
BigDecimal targetBudgetAmout = scheduleItemBudgetList.stream().map(a->a.getBudgetAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
BigDecimal targetDispatchAmout = scheduleItemBudgetList.stream().map(a->a.getPreDispatchAmount()==null?BigDecimal.ZERO:a.getPreDispatchAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
costCenter.setTargetSales(targetDispatchAmout.toString());
costCenter.setAreaBudget(targetBudgetAmout.toString());
BigDecimal targetExpenseRate = BigDecimal.ZERO;
if(targetDispatchAmout.compareTo(BigDecimal.ZERO)!=0) {
targetExpenseRate = targetBudgetAmout.divide(targetDispatchAmout, 2, BigDecimal.ROUND_HALF_DOWN);
costCenter.setTargetExpenseRate(targetExpenseRate.toString());
costCenter.setYtdTargetExpenseRate(targetExpenseRate.toString());
}
// costCenter.setTargetExpenseRate(targetExpenseRate);
costCenter.setYtdTargetBudget(targetBudgetAmout.toString());
costCenter.setYtdTargetSales(targetDispatchAmout.toString());
// costCenter.setYtdTargetExpenseRate(targetExpenseRate);
// costCenter.setQtdTargetBudget(BigDecimal.ZERO);
// costCenter.setQtdTargetSales(BigDecimal.ZERO);
// costCenter.setQtdTargetExpenseRate(BigDecimal.ZERO);
// costCenter.setMtdTargetBudget(BigDecimal.ZERO);
// costCenter.setMtdTargetSales(BigDecimal.ZERO);
// costCenter.setMtdTargetExpenseRate(BigDecimal.ZERO);
/* ------------------------------------------------------------------------- */
//实际发贷数
List<String> supplierCodeList = roiRateService.getSupplierCodesByCenter(costDTO,centerType,Arrays.asList(centerId));
List<ErpDispatchSumVo> dispatchSumVos = dispatchDataMapper.querySumCost(startMonthNum,endMonthNum,supplierCodeList);
List<BirActivityCenterGoods> birCenterCost = birCenterCostMap.containsKey(centerKey)?birCenterCostMap.get(centerKey):new ArrayList<>();
/* --------------- 实际费用率YTD --------------------------------------------- */
BigDecimal ytdRealDipatch = dispatchSumVos.stream().map(a->a.getDispatchSumCost()).reduce(BigDecimal.ZERO,BigDecimal::add);
BigDecimal ytdRealCost = birCenterCost.stream().map(a->a.getSplitUsedAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
costCenter.setYtdRealCost(ytdRealCost.toString());
costCenter.setYtdRealSales(ytdRealDipatch.toString());
BigDecimal ytdRealExpenseRate = BigDecimal.ZERO;
if(ytdRealDipatch.compareTo(BigDecimal.ZERO)!=0) {
ytdRealExpenseRate = ytdRealCost.divide(ytdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN);
costCenter.setYtdRealExpenseRate(ytdRealExpenseRate.toString());
}
// costCenter.setYtdRealExpenseRate(ytdRealExpenseRate);
/* ------------------------------------------------------------------------- */
/* --------------- 实际费用率QTD --------------------------------------------- */
List<Integer> yearQuarter = QuarterUtil.getQuarterNumbers(year, month);
BigDecimal qtdRealDipatch = dispatchSumVos.stream().filter(a->yearQuarter.contains(a.getYearMonth())).map(a->a.getDispatchSumCost()).reduce(BigDecimal.ZERO,BigDecimal::add);
BigDecimal qtdRealCost = birCenterCost.stream().filter(a->yearQuarter.contains(a.getKeyNum())).map(a->a.getSplitUsedAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
costCenter.setQtdRealCost(qtdRealCost.toString());
costCenter.setQtdRealSales(qtdRealDipatch.toString());
BigDecimal qtdRealExpenseRate = BigDecimal.ZERO;
if(qtdRealDipatch.compareTo(BigDecimal.ZERO)!=0) {
qtdRealExpenseRate = qtdRealCost.divide(qtdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN);
costCenter.setQtdRealExpenseRate(qtdRealExpenseRate.toString());
}
// costCenter.setQtdRealExpenseRate(qtdRealExpenseRate);
/* ------------------------------------------------------------------------- */
/* --------------- 实际费用率MTD --------------------------------------------- */
Integer yearMonth = year*100 + month;
BigDecimal mtdRealDipatch = dispatchSumVos.stream().filter(a->yearMonth.equals(a.getYearMonth())).map(a->a.getDispatchSumCost()).reduce(BigDecimal.ZERO,BigDecimal::add);
BigDecimal mtdRealCost = birCenterCost.stream().filter(a->yearMonth.equals(a.getKeyNum())).map(a->a.getSplitUsedAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
costCenter.setMtdRealCost(mtdRealCost.toString());
costCenter.setMtdRealSales(mtdRealDipatch.toString());
BigDecimal mtdRealExpenseRate = BigDecimal.ZERO;
if(mtdRealDipatch.compareTo(BigDecimal.ZERO)!=0) {
mtdRealExpenseRate = mtdRealCost.divide(mtdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN);
costCenter.setMtdRealExpenseRate(mtdRealExpenseRate.toString());
}
// costCenter.setMtdRealExpenseRate(mtdRealExpenseRate);
/* ------------------------------------------------------------------------- */
subList.add(costCenter); subList.add(costCenter);
} // String centerType = center.getCenterType();
// String centerId = center.getCenterId();
} // String centerKey = centerType + "-" + centerId;
// TbsCostSubItem.CostCenterTranStr costCenter = new TbsCostSubItem.CostCenterTranStr(center.getCenterName(),centerType+"-"+centerId);
/** // /* --------------- 全年目标费用率YTD 目标预计发货,目标预算 --------------------------- */
* 创建成本中心维度对象() // //通过成本中心TYPE和ID取预算
* @param result // LambdaQueryWrapper<TbsBudget> budgetLambdaQueryWrapper = new LambdaQueryWrapper<>();
* @param tbsScheduleItemBudgets // budgetLambdaQueryWrapper.eq(TbsBudget::getCenterId,centerId);
* @param year // budgetLambdaQueryWrapper.eq(TbsBudget::getCenterType,centerType);
* @param month // List<TbsBudget> tbsBudgetList = tbsBudgetMapper.selectList(budgetLambdaQueryWrapper);
* @param supplierCodeMapWithCenterType // //通过预算ID取预算的发货和金额
* @param birGroupByCenter // LambdaQueryWrapper<TbsScheduleItemBudget> scheduleItemBudgetLambdaQueryWrapper = new LambdaQueryWrapper<>();
* @param activityCenter // scheduleItemBudgetLambdaQueryWrapper.in(TbsScheduleItemBudget::getBudgetId,tbsBudgetList.stream().map(a->a.getId()).collect(Collectors.toList()));
* @param centerKey // List<TbsScheduleItemBudget> scheduleItemBudgetList = tbsScheduleItemBudgetMapper.selectList(scheduleItemBudgetLambdaQueryWrapper);
* @return // //合计目标发货和金定额
*/ // BigDecimal targetBudgetAmout = scheduleItemBudgetList.stream().map(a->a.getBudgetAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
@NotNull // BigDecimal targetDispatchAmout = scheduleItemBudgetList.stream().map(a->a.getPreDispatchAmount()==null?BigDecimal.ZERO:a.getPreDispatchAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
private TbsCostSubItem.CostCenter buildCostCenterParam(TbsBudgetCostResult result, List<TbsScheduleItemBudget> tbsScheduleItemBudgets, // costCenter.setTargetSales(targetDispatchAmout.toString());
int year, int month, Map<String, List<ErpDispatchSumVo>> supplierCodeMapWithCenterType, // costCenter.setAreaBudget(targetBudgetAmout.toString());
Map<String, List<BirActivityCenterGoods>> birGroupByCenter, // BigDecimal targetExpenseRate = BigDecimal.ZERO;
TbsActivityCenter activityCenter, String centerKey) { // if(targetDispatchAmout.compareTo(BigDecimal.ZERO)!=0) {
TbsCostSubItem.CostCenter costCenter = new TbsCostSubItem.CostCenter(activityCenter.getCenterName(), // targetExpenseRate = targetBudgetAmout.divide(targetDispatchAmout, 2, BigDecimal.ROUND_HALF_DOWN);
activityCenter.getCenterType()+"_"+ activityCenter.getCenterId()); // costCenter.setTargetExpenseRate(targetExpenseRate.toString());
//设置目标销量、目标预算 // costCenter.setYtdTargetExpenseRate(targetExpenseRate.toString());
for (TbsBudget budget : result.getBudgetList()) { // }
boolean eqType = activityCenter.getCenterType().equals(budget.getCenterType()); //// costCenter.setTargetExpenseRate(targetExpenseRate);
boolean eqCost = activityCenter.getCenterId().equals(budget.getCenterId()); // costCenter.setYtdTargetBudget(targetBudgetAmout.toString());
if (eqType && eqCost) { // costCenter.setYtdTargetSales(targetDispatchAmout.toString());
BigDecimal totalBudgetAmount = BigDecimal.ZERO; //// costCenter.setYtdTargetExpenseRate(targetExpenseRate);
BigDecimal totalPreDispatchAmount = BigDecimal.ZERO; //
//从命中的预算周期中取出目标发货 和 目标预算 进行合计 //// costCenter.setQtdTargetBudget(BigDecimal.ZERO);
for (TbsScheduleItemBudget itemBudget : tbsScheduleItemBudgets) { //// costCenter.setQtdTargetSales(BigDecimal.ZERO);
if (itemBudget.getBudgetId().equals(budget.getId())) { //// costCenter.setQtdTargetExpenseRate(BigDecimal.ZERO);
if (itemBudget.getBudgetAmount() != null) { //// costCenter.setMtdTargetBudget(BigDecimal.ZERO);
totalBudgetAmount = totalBudgetAmount.add(itemBudget.getBudgetAmount()); //// costCenter.setMtdTargetSales(BigDecimal.ZERO);
} //// costCenter.setMtdTargetExpenseRate(BigDecimal.ZERO);
if (itemBudget.getPreDispatchAmount() != null) { // /* ------------------------------------------------------------------------- */
totalPreDispatchAmount = totalBudgetAmount.add(itemBudget.getPreDispatchAmount()); // //实际发贷数
} // List<String> supplierCodeList = roiRateService.getSupplierCodesByCenter(costDTO,centerType,Arrays.asList(centerId));
} // List<ErpDispatchSumVo> dispatchSumVos = dispatchDataMapper.querySumCost(startMonthNum,endMonthNum,supplierCodeList);
} // List<BirActivityCenterGoods> birCenterCost = birCenterCostMap.containsKey(centerKey)?birCenterCostMap.get(centerKey):new ArrayList<>();
costCenter.setAreaBudget(totalBudgetAmount); //
costCenter.setTargetSales(totalPreDispatchAmount); // /* --------------- 实际费用率YTD --------------------------------------------- */
if (totalPreDispatchAmount.compareTo(BigDecimal.ZERO) != 0) { // BigDecimal ytdRealDipatch = dispatchSumVos.stream().map(a->a.getDispatchSumCost()).reduce(BigDecimal.ZERO,BigDecimal::add);
costCenter.setTargetExpenseRate(totalBudgetAmount.divide(totalPreDispatchAmount,2, BigDecimal.ROUND_DOWN)); // BigDecimal ytdRealCost = birCenterCost.stream().map(a->a.getSplitUsedAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
} // costCenter.setYtdRealCost(ytdRealCost.toString());
//暂保持目标相关数据一致 // costCenter.setYtdRealSales(ytdRealDipatch.toString());
costCenter.setYtdTargetSales(costCenter.getTargetSales().setScale(2,BigDecimal.ROUND_DOWN)); // BigDecimal ytdRealExpenseRate = BigDecimal.ZERO;
costCenter.setYtdTargetBudget(costCenter.getAreaBudget().setScale(2, RoundingMode.DOWN)); // if(ytdRealDipatch.compareTo(BigDecimal.ZERO)!=0) {
costCenter.setYtdTargetExpenseRate(costCenter.getTargetExpenseRate().setScale(2, RoundingMode.DOWN)); // ytdRealExpenseRate = ytdRealCost.divide(ytdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN);
// costCenter.setQtdTargetSales(costCenter.getTargetSales()); // costCenter.setYtdRealExpenseRate(ytdRealExpenseRate.toString());
// costCenter.setQtdTargetBudget(costCenter.getAreaBudget()); // }
// costCenter.setQtdTargetExpenseRate(costCenter.getTargetExpenseRate()); //// costCenter.setYtdRealExpenseRate(ytdRealExpenseRate);
// costCenter.setMtdTargetSales(); // /* ------------------------------------------------------------------------- */
// costCenter.setMtdTargetBudget(); //
// costCenter.setMtdTargetExpenseRate(); // /* --------------- 实际费用率QTD --------------------------------------------- */
break; // List<Integer> yearQuarter = QuarterUtil.getQuarterNumbers(year, month);
// BigDecimal qtdRealDipatch = dispatchSumVos.stream().filter(a->yearQuarter.contains(a.getYearMonth())).map(a->a.getDispatchSumCost()).reduce(BigDecimal.ZERO,BigDecimal::add);
} // BigDecimal qtdRealCost = birCenterCost.stream().filter(a->yearQuarter.contains(a.getKeyNum())).map(a->a.getSplitUsedAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
} // costCenter.setQtdRealCost(qtdRealCost.toString());
//发货金额 // costCenter.setQtdRealSales(qtdRealDipatch.toString());
List<ErpDispatchSumVo> erpDispatchSumVoList = supplierCodeMapWithCenterType.get(centerKey); // BigDecimal qtdRealExpenseRate = BigDecimal.ZERO;
// if(qtdRealDipatch.compareTo(BigDecimal.ZERO)!=0) {
//所有相关费率记录 // qtdRealExpenseRate = qtdRealCost.divide(qtdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN);
List<BirActivityCenterGoods> centerGoods = birGroupByCenter.get(centerKey); // costCenter.setQtdRealExpenseRate(qtdRealExpenseRate.toString());
if(CollectionUtil.isNotEmpty(centerGoods)){ // }
//年费率 //// costCenter.setQtdRealExpenseRate(qtdRealExpenseRate);
TbsCenterGoodBirDTO bir4Year = this.getTbsCenterGoodBirDTO(centerGoods,erpDispatchSumVoList); // /* ------------------------------------------------------------------------- */
costCenter.setYtdRealSales(bir4Year.getRealSales()); //
costCenter.setYtdRealCost(bir4Year.getRealCost()); // /* --------------- 实际费用率MTD --------------------------------------------- */
costCenter.setYtdRealExpenseRate(bir4Year.getRealExpenseRate()); // Integer yearMonth = year*100 + month;
// BigDecimal mtdRealDipatch = dispatchSumVos.stream().filter(a->yearMonth.equals(a.getYearMonth())).map(a->a.getDispatchSumCost()).reduce(BigDecimal.ZERO,BigDecimal::add);
//季度 // BigDecimal mtdRealCost = birCenterCost.stream().filter(a->yearMonth.equals(a.getKeyNum())).map(a->a.getSplitUsedAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
List<Integer> yearMonthList =QuarterUtil.getQuarterNumbers(year, month); // costCenter.setMtdRealCost(mtdRealCost.toString());
List<BirActivityCenterGoods> centerGoodsQuarter = centerGoods.stream() // costCenter.setMtdRealSales(mtdRealDipatch.toString());
.filter(a-> yearMonthList.contains(a.getKeyNum())) // BigDecimal mtdRealExpenseRate = BigDecimal.ZERO;
.collect(Collectors.toList()); // if(mtdRealDipatch.compareTo(BigDecimal.ZERO)!=0) {
TbsCenterGoodBirDTO bir4Quarter = this.getTbsCenterGoodBirDTO(centerGoodsQuarter,erpDispatchSumVoList); // mtdRealExpenseRate = mtdRealCost.divide(mtdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN);
costCenter.setQtdRealSales(bir4Quarter.getRealSales()); // costCenter.setMtdRealExpenseRate(mtdRealExpenseRate.toString());
costCenter.setQtdRealCost(bir4Quarter.getRealCost()); // }
costCenter.setQtdRealExpenseRate(bir4Quarter.getRealExpenseRate()); //// costCenter.setMtdRealExpenseRate(mtdRealExpenseRate);
// /* ------------------------------------------------------------------------- */
//月份
String mStr = month >9? month +"":"0"+ month;
Integer currYearMonth = Integer.parseInt(year +mStr); // subList.add(costCenter);
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()); // * @param result
} // * @param tbsScheduleItemBudgets
return costCenter; // * @param year
} // * @param month
// * @param supplierCodeMapWithCenterType
/** // * @param birGroupByCenter
* 创建 成本中心 DTO() // * @param activityCenter
* @param centerGoods // * @param centerKey
* @param erpDispatchSumVoList // * @return
* @return // */
*/ // @NotNull
@NotNull // private TbsCostSubItem.CostCenter buildCostCenterParam(TbsBudgetCostResult result, List<TbsScheduleItemBudget> tbsScheduleItemBudgets,
private TbsCenterGoodBirDTO getTbsCenterGoodBirDTO(List<BirActivityCenterGoods> centerGoods,List<ErpDispatchSumVo> erpDispatchSumVoList) { // int year, int month, Map<String, List<ErpDispatchSumVo>> supplierCodeMapWithCenterType,
BigDecimal totalRealDispatch = BigDecimal.ZERO; // Map<String, List<BirActivityCenterGoods>> birGroupByCenter,
BigDecimal totalRealCost; // TbsActivityCenter activityCenter, String centerKey) {
BigDecimal totalRealCheck = BigDecimal.ZERO; // TbsCostSubItem.CostCenter costCenter = new TbsCostSubItem.CostCenter(activityCenter.getCenterName(),
BigDecimal totalRealRelease = BigDecimal.ZERO; // activityCenter.getCenterType()+"_"+ activityCenter.getCenterId());
for (BirActivityCenterGoods centerGood : centerGoods) { // //设置目标销量、目标预算
totalRealCheck = totalRealCheck.add(centerGood.getSplitUsedAmount()); // for (TbsBudget budget : result.getBudgetList()) {
totalRealRelease = totalRealRelease.add(centerGood.getSplitReleaseAmount()); // boolean eqType = activityCenter.getCenterType().equals(budget.getCenterType());
for (ErpDispatchSumVo dispatchSumVo : erpDispatchSumVoList) { // boolean eqCost = activityCenter.getCenterId().equals(budget.getCenterId());
if(centerGood.getKeyNum().equals(dispatchSumVo.getYearMonth())){ // if (eqType && eqCost) {
totalRealDispatch = totalRealDispatch.add(dispatchSumVo.getDispatchSumCost()); // BigDecimal totalBudgetAmount = BigDecimal.ZERO;
} // BigDecimal totalPreDispatchAmount = BigDecimal.ZERO;
} // //从命中的预算周期中取出目标发货 和 目标预算 进行合计
} // for (TbsScheduleItemBudget itemBudget : tbsScheduleItemBudgets) {
totalRealCost = totalRealCheck.add(totalRealRelease); // if (itemBudget.getBudgetId().equals(budget.getId())) {
TbsCenterGoodBirDTO birDTO = new TbsCenterGoodBirDTO(); // if (itemBudget.getBudgetAmount() != null) {
birDTO.setRealCost(totalRealCost); // totalBudgetAmount = totalBudgetAmount.add(itemBudget.getBudgetAmount());
birDTO.setRealCheck(totalRealCheck); // }
birDTO.setRealRelease(totalRealRelease); // if (itemBudget.getPreDispatchAmount() != null) {
birDTO.initRealExpenseRate(); // totalPreDispatchAmount = totalBudgetAmount.add(itemBudget.getPreDispatchAmount());
return birDTO; // }
} // }
// }
// costCenter.setAreaBudget(totalBudgetAmount);
// costCenter.setTargetSales(totalPreDispatchAmount);
// if (totalPreDispatchAmount.compareTo(BigDecimal.ZERO) != 0) {
// costCenter.setTargetExpenseRate(totalBudgetAmount.divide(totalPreDispatchAmount,2, BigDecimal.ROUND_DOWN));
// }
// //暂保持目标相关数据一致
// costCenter.setYtdTargetSales(costCenter.getTargetSales().setScale(2,BigDecimal.ROUND_DOWN));
// costCenter.setYtdTargetBudget(costCenter.getAreaBudget().setScale(2, RoundingMode.DOWN));
// costCenter.setYtdTargetExpenseRate(costCenter.getTargetExpenseRate().setScale(2, RoundingMode.DOWN));
//// 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);
// if(CollectionUtil.isNotEmpty(centerGoods)){
// //年费率
// 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;
// }
/** /**

10
src/main/java/com/qs/serve/task/BirTask.java

@ -1,5 +1,6 @@
package com.qs.serve.task; package com.qs.serve.task;
import com.qs.serve.modules.bir.service.BirActivityCenterGoodsService;
import com.qs.serve.task.controller.TaskActivityController; import com.qs.serve.task.controller.TaskActivityController;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -7,6 +8,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.LocalDate;
/** /**
* @author YenHex * @author YenHex
* @since 2023/7/14 * @since 2023/7/14
@ -17,11 +20,14 @@ import org.springframework.stereotype.Component;
@ConditionalOnProperty(value = "project.task", havingValue = "true") @ConditionalOnProperty(value = "project.task", havingValue = "true")
public class BirTask { public class BirTask {
TaskActivityController activityController; private final BirActivityCenterGoodsService birActivityCenterGoodsService;
@Scheduled(cron="0 0 1 * * ?") @Scheduled(cron="0 0 1 * * ?")
public void buildTempTable(){ public void buildTempTable(){
activityController.taskBir(null); int year = LocalDate.now().getYear();
for (int i = 1;i < 13; i++) {
birActivityCenterGoodsService.buildReport(year,i);
}
} }
} }

Loading…
Cancel
Save