diff --git a/src/main/java/com/qs/serve/modules/bir/service/impl/BirRoiRateServiceImpl.java b/src/main/java/com/qs/serve/modules/bir/service/impl/BirRoiRateServiceImpl.java index 2c776b1b..fcd99022 100644 --- a/src/main/java/com/qs/serve/modules/bir/service/impl/BirRoiRateServiceImpl.java +++ b/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 queryRoiCostItems(BirRoiCostDTO param) { @@ -395,8 +399,7 @@ public class BirRoiRateServiceImpl extends ServiceImpl getSupplierCodesByCenter(BirRoiCostDTO costDTO, String centerType, List centerIds) { if(CollUtil.isEmpty(centerIds)){ - //Todo 成本中心发货 - return null; + return new ArrayList<>(); } if(centerType.equals("customer")){ List supplierList = bmsSupplierMapper.selectBatchIds(centerIds); @@ -417,8 +420,24 @@ public class BirRoiRateServiceImpl extends ServiceImpl lqwCR = new LambdaQueryWrapper<>(); + lqwCR.in(BmsCenterRegion::getCenterId,centerIds); + List centerRegionList = bmsCenterRegionMapper.selectList(lqwCR); + centerIds = centerRegionList.stream().map(a->a.getRegionId()).collect(Collectors.toList()); + if(centerIds.size()>0) { + LambdaQueryWrapper 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<>(); } } diff --git a/src/main/java/com/qs/serve/modules/tbs/common/util/QuarterUtil.java b/src/main/java/com/qs/serve/modules/tbs/common/util/QuarterUtil.java index ef4a1fb5..06c17795 100644 --- a/src/main/java/com/qs/serve/modules/tbs/common/util/QuarterUtil.java +++ b/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 q1 = Arrays.asList(1,2,3); + public static final List q2 = Arrays.asList(4,5,6); + public static final List q3 = Arrays.asList(7,8,9); + public static final List 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 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 getQuarterNumbers(Integer year,Integer month){ - String[] q = getQuarterNumbers(month); - List list = new ArrayList<>(); - for (String s : q) { - list.add(Integer.parseInt(year+s)); - } - return list; - } - - } diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenter.java b/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenter.java index 9b7eadac..20c2203f 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenter.java +++ b/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenter.java @@ -114,5 +114,6 @@ public class TbsActivityCenter implements Serializable { /** 模板唯一健 */ private String tmpUk; + } diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java index 4ce8e766..02b42737 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java @@ -91,6 +91,7 @@ public class TbsCostApplyServiceImpl extends ServiceImpl tbsBudgetCostItems = result.getBudgetMatchList(); - List scheduleItemBudgetIds = tbsBudgetCostItems.stream().map(a->a.getScheduleItemBudgetId()).distinct().collect(Collectors.toList()); - List 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> supplierCodeMapWithCenterType = new HashMap<>(); - Map> centerMapList = tbsActivityCenters.stream().collect(Collectors.groupingBy(TbsActivityCenter::getCenterType)); - for (String centerType : centerMapList.keySet()) { - List centerIds =centerMapList.get(centerType).stream().map(TbsActivityCenter::getCenterId).collect(Collectors.toList()); - List supplierCodeList = roiRateService.getSupplierCodesByCenter(costDTO,centerType,centerIds); - //发货单 - List dispatchSumVos = null; - if(supplierCodeList!=null&&supplierCodeList.size()>0){ - dispatchSumVos = dispatchDataMapper.querySumCost(startMonthNum,endMonthNum,supplierCodeList); - supplierCodeMapWithCenterType.put(centerType,dispatchSumVos); - }else { - //防止后面获取空指针 - supplierCodeMapWithCenterType.put(centerType,new ArrayList<>()); + + //获取BIR表的数据,用于计算实际费用率 + LambdaQueryWrapper 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 birActivityCenterGoodsList = birActivityCenterGoodsService.list(birLwq); + Map> birCenterCostMap = birActivityCenterGoodsList.stream().collect(Collectors.groupingBy(a->a.getCenterType() + "-"+a.getCenterId())); + //成本中心去重 + Map> centerMapList = tbsActivityCenters.stream().collect(Collectors.groupingBy(a->a.getCenterType()+"-"+a.getCenterId())); + List 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 budgetLambdaQueryWrapper = new LambdaQueryWrapper<>(); + budgetLambdaQueryWrapper.eq(TbsBudget::getCenterId,centerId); + budgetLambdaQueryWrapper.eq(TbsBudget::getCenterType,centerType); + List tbsBudgetList = tbsBudgetMapper.selectList(budgetLambdaQueryWrapper); + //通过预算ID取预算的发货和金额 + LambdaQueryWrapper scheduleItemBudgetLambdaQueryWrapper = new LambdaQueryWrapper<>(); + scheduleItemBudgetLambdaQueryWrapper.in(TbsScheduleItemBudget::getBudgetId,tbsBudgetList.stream().map(a->a.getId()).collect(Collectors.toList())); + List 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 supplierCodeList = roiRateService.getSupplierCodesByCenter(costDTO,centerType,Arrays.asList(centerId)); + List dispatchSumVos = dispatchDataMapper.querySumCost(startMonthNum,endMonthNum,supplierCodeList); + List 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 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); + /* ------------------------------------------------------------------------- */ + - //查询ROI底表,并拼接DTO - List centerGoodDTOS = new ArrayList<>(); -// LambdaQueryWrapper birLwq = new LambdaQueryWrapper<>(); -// birLwq.in(BirActivityCenterGoods::getCenterId,tbsActivityCenters.stream().map(a->a.getCenterId()).collect(Collectors.toList())); -// List birActivityCenterGoodsList = birActivityCenterGoodsService.list(birLwq); - List birActivityCenterGoodsList = new ArrayList<>(); - //按成本中心维度分组 - Map> 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 @@ -568,7 +623,7 @@ public class TbsCostApplyServiceImpl extends ServiceImpl - #{selectId} - + + and cus_code in + + #{selectId} + + GROUP BY DATE_FORMAT(date,'%Y%m')