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. 444
      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;
}
}

444
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取预算
// 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);
} }
} }
/** // /**
* 创建成本中心维度对象() // * 创建成本中心维度对象(弃)
* @param result // * @param result
* @param tbsScheduleItemBudgets // * @param tbsScheduleItemBudgets
* @param year // * @param year
* @param month // * @param month
* @param supplierCodeMapWithCenterType // * @param supplierCodeMapWithCenterType
* @param birGroupByCenter // * @param birGroupByCenter
* @param activityCenter // * @param activityCenter
* @param centerKey // * @param centerKey
* @return // * @return
*/ // */
@NotNull // @NotNull
private TbsCostSubItem.CostCenter buildCostCenterParam(TbsBudgetCostResult result, List<TbsScheduleItemBudget> tbsScheduleItemBudgets, // private TbsCostSubItem.CostCenter buildCostCenterParam(TbsBudgetCostResult result, List<TbsScheduleItemBudget> tbsScheduleItemBudgets,
int year, int month, Map<String, List<ErpDispatchSumVo>> supplierCodeMapWithCenterType, // int year, int month, Map<String, List<ErpDispatchSumVo>> supplierCodeMapWithCenterType,
Map<String, List<BirActivityCenterGoods>> birGroupByCenter, // Map<String, List<BirActivityCenterGoods>> birGroupByCenter,
TbsActivityCenter activityCenter, String centerKey) { // TbsActivityCenter activityCenter, String centerKey) {
TbsCostSubItem.CostCenter costCenter = new TbsCostSubItem.CostCenter(activityCenter.getCenterName(), // TbsCostSubItem.CostCenter costCenter = new TbsCostSubItem.CostCenter(activityCenter.getCenterName(),
activityCenter.getCenterType()+"_"+ activityCenter.getCenterId()); // activityCenter.getCenterType()+"_"+ activityCenter.getCenterId());
//设置目标销量、目标预算 // //设置目标销量、目标预算
for (TbsBudget budget : result.getBudgetList()) { // for (TbsBudget budget : result.getBudgetList()) {
boolean eqType = activityCenter.getCenterType().equals(budget.getCenterType()); // boolean eqType = activityCenter.getCenterType().equals(budget.getCenterType());
boolean eqCost = activityCenter.getCenterId().equals(budget.getCenterId()); // boolean eqCost = activityCenter.getCenterId().equals(budget.getCenterId());
if (eqType && eqCost) { // if (eqType && eqCost) {
BigDecimal totalBudgetAmount = BigDecimal.ZERO; // BigDecimal totalBudgetAmount = BigDecimal.ZERO;
BigDecimal totalPreDispatchAmount = BigDecimal.ZERO; // BigDecimal totalPreDispatchAmount = BigDecimal.ZERO;
//从命中的预算周期中取出目标发货 和 目标预算 进行合计 // //从命中的预算周期中取出目标发货 和 目标预算 进行合计
for (TbsScheduleItemBudget itemBudget : tbsScheduleItemBudgets) { // for (TbsScheduleItemBudget itemBudget : tbsScheduleItemBudgets) {
if (itemBudget.getBudgetId().equals(budget.getId())) { // if (itemBudget.getBudgetId().equals(budget.getId())) {
if (itemBudget.getBudgetAmount() != null) { // if (itemBudget.getBudgetAmount() != null) {
totalBudgetAmount = totalBudgetAmount.add(itemBudget.getBudgetAmount()); // totalBudgetAmount = totalBudgetAmount.add(itemBudget.getBudgetAmount());
} // }
if (itemBudget.getPreDispatchAmount() != null) { // if (itemBudget.getPreDispatchAmount() != null) {
totalPreDispatchAmount = totalBudgetAmount.add(itemBudget.getPreDispatchAmount()); // totalPreDispatchAmount = totalBudgetAmount.add(itemBudget.getPreDispatchAmount());
} // }
} // }
} // }
costCenter.setAreaBudget(totalBudgetAmount); // costCenter.setAreaBudget(totalBudgetAmount);
costCenter.setTargetSales(totalPreDispatchAmount); // costCenter.setTargetSales(totalPreDispatchAmount);
if (totalPreDispatchAmount.compareTo(BigDecimal.ZERO) != 0) { // if (totalPreDispatchAmount.compareTo(BigDecimal.ZERO) != 0) {
costCenter.setTargetExpenseRate(totalBudgetAmount.divide(totalPreDispatchAmount,2, BigDecimal.ROUND_DOWN)); // costCenter.setTargetExpenseRate(totalBudgetAmount.divide(totalPreDispatchAmount,2, BigDecimal.ROUND_DOWN));
} // }
//暂保持目标相关数据一致 // //暂保持目标相关数据一致
costCenter.setYtdTargetSales(costCenter.getTargetSales().setScale(2,BigDecimal.ROUND_DOWN)); // costCenter.setYtdTargetSales(costCenter.getTargetSales().setScale(2,BigDecimal.ROUND_DOWN));
costCenter.setYtdTargetBudget(costCenter.getAreaBudget().setScale(2, RoundingMode.DOWN)); // costCenter.setYtdTargetBudget(costCenter.getAreaBudget().setScale(2, RoundingMode.DOWN));
costCenter.setYtdTargetExpenseRate(costCenter.getTargetExpenseRate().setScale(2, RoundingMode.DOWN)); // costCenter.setYtdTargetExpenseRate(costCenter.getTargetExpenseRate().setScale(2, RoundingMode.DOWN));
// costCenter.setQtdTargetSales(costCenter.getTargetSales()); //// costCenter.setQtdTargetSales(costCenter.getTargetSales());
// costCenter.setQtdTargetBudget(costCenter.getAreaBudget()); //// costCenter.setQtdTargetBudget(costCenter.getAreaBudget());
// costCenter.setQtdTargetExpenseRate(costCenter.getTargetExpenseRate()); //// costCenter.setQtdTargetExpenseRate(costCenter.getTargetExpenseRate());
// costCenter.setMtdTargetSales(); //// costCenter.setMtdTargetSales();
// costCenter.setMtdTargetBudget(); //// costCenter.setMtdTargetBudget();
// costCenter.setMtdTargetExpenseRate(); //// costCenter.setMtdTargetExpenseRate();
break; // break;
//
} // }
} // }
//发货金额 // //发货金额
List<ErpDispatchSumVo> erpDispatchSumVoList = supplierCodeMapWithCenterType.get(centerKey); // List<ErpDispatchSumVo> erpDispatchSumVoList = supplierCodeMapWithCenterType.get(centerKey);
//
//所有相关费率记录 // //所有相关费率记录
List<BirActivityCenterGoods> centerGoods = birGroupByCenter.get(centerKey); // List<BirActivityCenterGoods> centerGoods = birGroupByCenter.get(centerKey);
if(CollectionUtil.isNotEmpty(centerGoods)){ // if(CollectionUtil.isNotEmpty(centerGoods)){
//年费率 // //年费率
TbsCenterGoodBirDTO bir4Year = this.getTbsCenterGoodBirDTO(centerGoods,erpDispatchSumVoList); // TbsCenterGoodBirDTO bir4Year = this.getTbsCenterGoodBirDTO(centerGoods,erpDispatchSumVoList);
costCenter.setYtdRealSales(bir4Year.getRealSales()); // costCenter.setYtdRealSales(bir4Year.getRealSales());
costCenter.setYtdRealCost(bir4Year.getRealCost()); // costCenter.setYtdRealCost(bir4Year.getRealCost());
costCenter.setYtdRealExpenseRate(bir4Year.getRealExpenseRate()); // costCenter.setYtdRealExpenseRate(bir4Year.getRealExpenseRate());
//
//季度 // //季度
List<Integer> yearMonthList =QuarterUtil.getQuarterNumbers(year, month); // List<Integer> yearMonthList =QuarterUtil.getQuarterNumbers(year, month);
List<BirActivityCenterGoods> centerGoodsQuarter = centerGoods.stream() // List<BirActivityCenterGoods> centerGoodsQuarter = centerGoods.stream()
.filter(a-> yearMonthList.contains(a.getKeyNum())) // .filter(a-> yearMonthList.contains(a.getKeyNum()))
.collect(Collectors.toList()); // .collect(Collectors.toList());
TbsCenterGoodBirDTO bir4Quarter = this.getTbsCenterGoodBirDTO(centerGoodsQuarter,erpDispatchSumVoList); // TbsCenterGoodBirDTO bir4Quarter = this.getTbsCenterGoodBirDTO(centerGoodsQuarter,erpDispatchSumVoList);
costCenter.setQtdRealSales(bir4Quarter.getRealSales()); // costCenter.setQtdRealSales(bir4Quarter.getRealSales());
costCenter.setQtdRealCost(bir4Quarter.getRealCost()); // costCenter.setQtdRealCost(bir4Quarter.getRealCost());
costCenter.setQtdRealExpenseRate(bir4Quarter.getRealExpenseRate()); // costCenter.setQtdRealExpenseRate(bir4Quarter.getRealExpenseRate());
//
//月份 // //月份
String mStr = month >9? month +"":"0"+ month; // String mStr = month >9? month +"":"0"+ month;
Integer currYearMonth = Integer.parseInt(year +mStr); // Integer currYearMonth = Integer.parseInt(year +mStr);
List<BirActivityCenterGoods> centerGoodsM = centerGoods.stream() // List<BirActivityCenterGoods> centerGoodsM = centerGoods.stream()
.filter(a-> currYearMonth.equals(a.getKeyNum())) // .filter(a-> currYearMonth.equals(a.getKeyNum()))
.collect(Collectors.toList()); // .collect(Collectors.toList());
TbsCenterGoodBirDTO bir4Month = this.getTbsCenterGoodBirDTO(centerGoodsM,erpDispatchSumVoList); // TbsCenterGoodBirDTO bir4Month = this.getTbsCenterGoodBirDTO(centerGoodsM,erpDispatchSumVoList);
costCenter.setMtdRealSales(bir4Month.getRealSales()); // costCenter.setMtdRealSales(bir4Month.getRealSales());
costCenter.setMtdRealCost(bir4Month.getRealCost()); // costCenter.setMtdRealCost(bir4Month.getRealCost());
costCenter.setMtdRealExpenseRate(bir4Month.getRealExpenseRate()); // costCenter.setMtdRealExpenseRate(bir4Month.getRealExpenseRate());
} // }
return costCenter; // return costCenter;
} // }
/** // /**
* 创建 成本中心 DTO() // * 创建 成本中心 DTO(弃)
* @param centerGoods // * @param centerGoods
* @param erpDispatchSumVoList // * @param erpDispatchSumVoList
* @return // * @return
*/ // */
@NotNull // @NotNull
private TbsCenterGoodBirDTO getTbsCenterGoodBirDTO(List<BirActivityCenterGoods> centerGoods,List<ErpDispatchSumVo> erpDispatchSumVoList) { // private TbsCenterGoodBirDTO getTbsCenterGoodBirDTO(List<BirActivityCenterGoods> centerGoods,List<ErpDispatchSumVo> erpDispatchSumVoList) {
BigDecimal totalRealDispatch = BigDecimal.ZERO; // BigDecimal totalRealDispatch = BigDecimal.ZERO;
BigDecimal totalRealCost; // BigDecimal totalRealCost;
BigDecimal totalRealCheck = BigDecimal.ZERO; // BigDecimal totalRealCheck = BigDecimal.ZERO;
BigDecimal totalRealRelease = BigDecimal.ZERO; // BigDecimal totalRealRelease = BigDecimal.ZERO;
for (BirActivityCenterGoods centerGood : centerGoods) { // for (BirActivityCenterGoods centerGood : centerGoods) {
totalRealCheck = totalRealCheck.add(centerGood.getSplitUsedAmount()); // totalRealCheck = totalRealCheck.add(centerGood.getSplitUsedAmount());
totalRealRelease = totalRealRelease.add(centerGood.getSplitReleaseAmount()); // totalRealRelease = totalRealRelease.add(centerGood.getSplitReleaseAmount());
for (ErpDispatchSumVo dispatchSumVo : erpDispatchSumVoList) { // for (ErpDispatchSumVo dispatchSumVo : erpDispatchSumVoList) {
if(centerGood.getKeyNum().equals(dispatchSumVo.getYearMonth())){ // if(centerGood.getKeyNum().equals(dispatchSumVo.getYearMonth())){
totalRealDispatch = totalRealDispatch.add(dispatchSumVo.getDispatchSumCost()); // totalRealDispatch = totalRealDispatch.add(dispatchSumVo.getDispatchSumCost());
} // }
} // }
} // }
totalRealCost = totalRealCheck.add(totalRealRelease); // totalRealCost = totalRealCheck.add(totalRealRelease);
TbsCenterGoodBirDTO birDTO = new TbsCenterGoodBirDTO(); // TbsCenterGoodBirDTO birDTO = new TbsCenterGoodBirDTO();
birDTO.setRealCost(totalRealCost); // birDTO.setRealCost(totalRealCost);
birDTO.setRealCheck(totalRealCheck); // birDTO.setRealCheck(totalRealCheck);
birDTO.setRealRelease(totalRealRelease); // birDTO.setRealRelease(totalRealRelease);
birDTO.initRealExpenseRate(); // birDTO.initRealExpenseRate();
return birDTO; // 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