Browse Source

费用率

v1.0
15989082884@163.com 2 years ago
parent
commit
cdd83bb7f1
  1. 25
      src/main/java/com/qs/serve/modules/bir/service/impl/BirRoiRateServiceImpl.java
  2. 51
      src/main/java/com/qs/serve/modules/tbs/common/util/QuarterUtil.java
  3. 1
      src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenter.java
  4. 137
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java
  5. 2
      src/main/resources/mapper/erp/ErpDispatchDataMapper.xml

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

@ -13,8 +13,11 @@ 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.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.bms.service.BmsCenterRegionService;
import com.qs.serve.modules.erp.entity.ErpDispatchData;
import com.qs.serve.modules.erp.entity.dto.ErpDispatchSumVo;
import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper;
@ -51,6 +54,7 @@ public class BirRoiRateServiceImpl extends ServiceImpl<BirRoiRateMapper,BirRoiRa
private final BmsSupplierMapper bmsSupplierMapper;
private final ErpDispatchDataMapper dispatchDataMapper;
private final BmsCenterRegionMapper bmsCenterRegionMapper;
@Override
public List<BirRoiCostItemVo> queryRoiCostItems(BirRoiCostDTO param) {
@ -395,8 +399,7 @@ public class BirRoiRateServiceImpl extends ServiceImpl<BirRoiRateMapper,BirRoiRa
@Override
public List<String> getSupplierCodesByCenter(BirRoiCostDTO costDTO, String centerType, List<String> centerIds) {
if(CollUtil.isEmpty(centerIds)){
//Todo 成本中心发货
return null;
return new ArrayList<>();
}
if(centerType.equals("customer")){
List<BmsSupplier> supplierList = bmsSupplierMapper.selectBatchIds(centerIds);
@ -417,8 +420,24 @@ public class BirRoiRateServiceImpl extends ServiceImpl<BirRoiRateMapper,BirRoiRa
.or().in(BmsSupplier::getRegionThird,centerIds)
.or().in(BmsSupplier::getRegionFourthly,centerIds);
return bmsSupplierMapper.selectList(lqw).stream().map(BmsSupplier::getCode).collect(Collectors.toList());
}else if(centerType.equals("center")){
LambdaQueryWrapper<BmsCenterRegion> lqwCR = new LambdaQueryWrapper<>();
lqwCR.in(BmsCenterRegion::getCenterId,centerIds);
List<BmsCenterRegion> centerRegionList = bmsCenterRegionMapper.selectList(lqwCR);
centerIds = centerRegionList.stream().map(a->a.getRegionId()).collect(Collectors.toList());
if(centerIds.size()>0) {
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());
}else {
return new ArrayList<>();
}
}
return null;
return new ArrayList<>();
}
}

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

@ -1,7 +1,9 @@
package com.qs.serve.modules.tbs.common.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author YenHex
@ -9,44 +11,23 @@ import java.util.List;
*/
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 List<Integer> q1 = Arrays.asList(1,2,3);
public static final List<Integer> q2 = Arrays.asList(4,5,6);
public static final List<Integer> q3 = Arrays.asList(7,8,9);
public static final List<Integer> q4 = Arrays.asList(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;
}
public static final List<Integer> getQuarterNumbers(Integer year,Integer month){
Integer year100 = year*100;
if(q1.contains(month)){
return q1.stream().map(a->year100+a).collect(Collectors.toList());
}else if(q2.contains(month)){
return q2.stream().map(a->year100+a).collect(Collectors.toList());
}else if(q3.contains(month)){
return q3.stream().map(a->year100+a).collect(Collectors.toList());
}else if(q4.contains(month)){
return q4.stream().map(a->year100+a).collect(Collectors.toList());
}
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;
}
}

1
src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenter.java

@ -114,5 +114,6 @@ public class TbsActivityCenter implements Serializable {
/** 模板唯一健 */
private String tmpUk;
}

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

@ -91,6 +91,7 @@ public class TbsCostApplyServiceImpl extends ServiceImpl<TbsCostApplyMapper,TbsC
private TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper;
private final ErpDispatchDataMapper dispatchDataMapper;
private BirActivityCenterGoodsService birActivityCenterGoodsService;
private TbsBudgetMapper tbsBudgetMapper;
@Override
@ -423,60 +424,114 @@ public class TbsCostApplyServiceImpl extends ServiceImpl<TbsCostApplyMapper,TbsC
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);
//查询发货金额,并按月份分割
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;
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(TbsActivityCenter::getCenterId).collect(Collectors.toList());
List<String> supplierCodeList = roiRateService.getSupplierCodesByCenter(costDTO,centerType,centerIds);
//发货单
List<ErpDispatchSumVo> dispatchSumVos = null;
if(supplierCodeList!=null&&supplierCodeList.size()>0){
dispatchSumVos = dispatchDataMapper.querySumCost(startMonthNum,endMonthNum,supplierCodeList);
supplierCodeMapWithCenterType.put(centerType,dispatchSumVos);
}else {
//防止后面获取空指针
supplierCodeMapWithCenterType.put(centerType,new ArrayList<>());
}
}
//查询ROI底表,并拼接DTO
List<TbsCenterGoodBirDTO> centerGoodDTOS = new ArrayList<>();
// LambdaQueryWrapper<BirActivityCenterGoods> birLwq = new LambdaQueryWrapper<>();
// birLwq.in(BirActivityCenterGoods::getCenterId,tbsActivityCenters.stream().map(a->a.getCenterId()).collect(Collectors.toList()));
// List<BirActivityCenterGoods> birActivityCenterGoodsList = birActivityCenterGoodsService.list(birLwq);
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);
//获取BIR表的数据,用于计算实际费用率
LambdaQueryWrapper<BirActivityCenterGoods> birLwq = new LambdaQueryWrapper<>();
birLwq.in(BirActivityCenterGoods::getCenterId,tbsActivityCenters.stream().map(a->a.getCenterId()).collect(Collectors.toList()));
birLwq.ge(BirActivityCenterGoods::getKeyNum,startMonthNum);
birLwq.le(BirActivityCenterGoods::getKeyNum,endMonthNum);
List<BirActivityCenterGoods> birActivityCenterGoodsList = birActivityCenterGoodsService.list(birLwq);
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()));
List<TbsActivityCenter> centerList = centerMapList.values().stream().map(a->a.get(0)).collect(Collectors.toList());
for(TbsActivityCenter center : centerList){
String centerType = center.getCenterType();
String centerId = center.getCenterId();
String centerKey = centerType + "-" + centerId;
TbsCostSubItem.CostCenter costCenter = new TbsCostSubItem.CostCenter(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);
costCenter.setAreaBudget(targetBudgetAmout);
BigDecimal targetExpenseRate = BigDecimal.ZERO;
if(targetDispatchAmout.compareTo(BigDecimal.ZERO)!=0) {
targetExpenseRate = targetBudgetAmout.divide(targetDispatchAmout, 2, BigDecimal.ROUND_HALF_DOWN);
}
costCenter.setTargetExpenseRate(targetExpenseRate);
costCenter.setYtdTargetBudget(targetBudgetAmout);
costCenter.setYtdTargetSales(targetDispatchAmout);
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);
costCenter.setYtdRealSales(ytdRealDipatch);
BigDecimal ytdRealExpenseRate = BigDecimal.ZERO;
if(ytdRealDipatch.compareTo(BigDecimal.ZERO)!=0) {
ytdRealExpenseRate = ytdRealCost.divide(ytdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN);
}
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);
costCenter.setQtdRealSales(qtdRealDipatch);
BigDecimal qtdRealExpenseRate = BigDecimal.ZERO;
if(qtdRealDipatch.compareTo(BigDecimal.ZERO)!=0) {
qtdRealExpenseRate = qtdRealCost.divide(qtdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN);
}
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);
costCenter.setMtdRealSales(mtdRealDipatch);
BigDecimal mtdRealExpenseRate = BigDecimal.ZERO;
if(mtdRealDipatch.compareTo(BigDecimal.ZERO)!=0) {
mtdRealExpenseRate = mtdRealCost.divide(mtdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN);
}
costCenter.setMtdRealExpenseRate(mtdRealExpenseRate);
/* ------------------------------------------------------------------------- */
subList.add(costCenter);
}
}
/**
* 创建成本中心维度对象
* 创建成本中心维度对象()
* @param result
* @param tbsScheduleItemBudgets
* @param year
@ -568,7 +623,7 @@ public class TbsCostApplyServiceImpl extends ServiceImpl<TbsCostApplyMapper,TbsC
}
/**
* 创建 成本中心 DTO
* 创建 成本中心 DTO()
* @param centerGoods
* @param erpDispatchSumVoList
* @return

2
src/main/resources/mapper/erp/ErpDispatchDataMapper.xml

@ -57,10 +57,12 @@
where
DATE_FORMAT(date,'%Y%m') &gt;= #{startNumber}
and DATE_FORMAT(date,'%Y%m') &lt;= #{endNumber}
<if test="cusCodes!=null and cusCodes.size > 0">
and cus_code in
<foreach collection="cusCodes" item ="selectId" index="i" open="(" close=")" separator=",">
#{selectId}
</foreach>
</if>
GROUP BY DATE_FORMAT(date,'%Y%m')
</select>

Loading…
Cancel
Save