diff --git a/src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java b/src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java index f638b914..b8773838 100644 --- a/src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java +++ b/src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java @@ -63,6 +63,10 @@ public class BirActivityCenterGoods implements Serializable { @NotNull(message = "分配的核销金额不能为空") private BigDecimal splitUsedAmount; + /** 分配的释放金额 */ + @NotNull(message = "分配的释放金额不能为空") + private BigDecimal splitReleaseAmount; + /** 成本明细编码 */ @Length(max = 30,message = "成本明细编码长度不能超过30字") private String centerGoodsCode; @@ -258,6 +262,5 @@ public class BirActivityCenterGoods implements Serializable { @Length(max = 200,message = "客户名称长度不能超过200字") private String supplierName; - } diff --git a/src/main/java/com/qs/serve/modules/bir/service/BirRoiRateService.java b/src/main/java/com/qs/serve/modules/bir/service/BirRoiRateService.java index 04007c34..e8d967a4 100644 --- a/src/main/java/com/qs/serve/modules/bir/service/BirRoiRateService.java +++ b/src/main/java/com/qs/serve/modules/bir/service/BirRoiRateService.java @@ -38,5 +38,24 @@ public interface BirRoiRateService extends IService { YtdQtdToOAVo buildYtdAndQtdData(TbsCostApply apply); + /** + * 设置查询条件和返回客户CODELIST + * @param costDTO + * @param supplierId + * @param loadType 0->客户,1->申请人的客户,2->客户的行政区域,3->客户的销售区域 + * @param userId + * @return + */ + List getBiRoiCostDTOAndFindSupplierCodes(BirRoiCostDTO costDTO,String supplierId,Integer loadType,String userId); + + /** + * 获取客户编码 + * @param costDTO + * @param centerType + * @param centerIds + * @return + */ + List getSupplierCodesByCenter(BirRoiCostDTO costDTO,String centerType,List centerIds); + } 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 96504369..fdcd8dfb 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 @@ -1,5 +1,6 @@ package com.qs.serve.modules.bir.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qs.serve.common.model.dto.DateSplitDTO; @@ -108,7 +109,7 @@ public class BirRoiRateServiceImpl extends ServiceImpl supplierCodeList = setBiroiCostDTOAndFindSupplierCodes(costDTO,supplierId,loadType,param.getUserId()); + List supplierCodeList = getBiRoiCostDTOAndFindSupplierCodes(costDTO,supplierId,loadType,param.getUserId()); List costItemVoList = this.queryRoiCostItems(costDTO); @@ -311,7 +312,7 @@ public class BirRoiRateServiceImpl extends ServiceImpl supplierCodeList = setBiroiCostDTOAndFindSupplierCodes(costDTO, supplierId, loadType, userId); + List supplierCodeList = getBiRoiCostDTOAndFindSupplierCodes(costDTO, supplierId, loadType, userId); Float tempPercent = getPercentDate(costDTO,supplierCodeList); return tempPercent; } @@ -334,7 +335,8 @@ public class BirRoiRateServiceImpl extends ServiceImpl setBiroiCostDTOAndFindSupplierCodes(BirRoiCostDTO costDTO,String supplierId,Integer loadType,String userId){ + @Override + public List getBiRoiCostDTOAndFindSupplierCodes(BirRoiCostDTO costDTO, String supplierId, Integer loadType, String userId){ BmsSupplier bmsSupplier = bmsSupplierMapper.selectById(supplierId); List supplierCodeList = new ArrayList<>(); @@ -347,7 +349,6 @@ public class BirRoiRateServiceImpl extends ServiceImpl申请人的客户 costDTO.setUserId(userId); - //加载用户的其它供应商编码 BmsSupplier param4Supplier = new BmsSupplier(); param4Supplier.setCurrUserId(userId); List supplierList = bmsSupplierMapper.selectSupplierList(param4Supplier); @@ -387,5 +388,33 @@ public class BirRoiRateServiceImpl extends ServiceImpl getSupplierCodesByCenter(BirRoiCostDTO costDTO, String centerType, List centerIds) { + if(CollUtil.isEmpty(centerIds)){ + return null; + } + if(centerType.equals("customer")){ + List supplierList = bmsSupplierMapper.selectBatchIds(centerIds); + return supplierList.stream().map(BmsSupplier::getCode).collect(Collectors.toList()); + }else if(centerType.equals("bizRegion")){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(BmsSupplier::getCode); + lqw.in(BmsSupplier::getRegion2First,centerIds) + .or().in(BmsSupplier::getRegion2Second,centerIds) + .or().in(BmsSupplier::getRegion2Third,centerIds) + .or().in(BmsSupplier::getRegion2Fourthly,centerIds); + return bmsSupplierMapper.selectList(lqw).stream().map(BmsSupplier::getCode).collect(Collectors.toList()); + }else if(centerType.equals("saleRegion")){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(BmsSupplier::getCode); + lqw.in(BmsSupplier::getRegionFirst,centerIds) + .or().in(BmsSupplier::getRegionSecond,centerIds) + .or().in(BmsSupplier::getRegionThird,centerIds) + .or().in(BmsSupplier::getRegionFourthly,centerIds); + return bmsSupplierMapper.selectList(lqw).stream().map(BmsSupplier::getCode).collect(Collectors.toList()); + } + return null; + } } 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 new file mode 100644 index 00000000..ef4a1fb5 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/tbs/common/util/QuarterUtil.java @@ -0,0 +1,52 @@ +package com.qs.serve.modules.tbs.common.util; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author YenHex + * @since 2023/7/13 + */ +public class QuarterUtil { + + public static final String[] q1 = {"01","02","03"}; + public static final String[] q2 = {"04","05","06"}; + public static final String[] q3 = {"07","08","09"}; + public static final String[] q4 = {"10","11","12"}; + + public static final String[] getQuarterNumbers(Integer month){ + String mStr = month>9?month+"":"0"+month; + for (String s : q1) { + if(mStr.equals(s)){ + return q1; + } + } + for (String s : q2) { + if(mStr.equals(s)){ + return q2; + } + } + for (String s : q3) { + if(mStr.equals(s)){ + return q3; + } + } + for (String s : q4) { + if(mStr.equals(s)){ + return q4; + } + } + return null; + } + + public static List 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/dto/TbsCenterGoodBirDTO.java b/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCenterGoodBirDTO.java new file mode 100644 index 00000000..f10c64eb --- /dev/null +++ b/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCenterGoodBirDTO.java @@ -0,0 +1,34 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/7/13 + */ +@Data +public class TbsCenterGoodBirDTO { + //实际销量(发货金额) + private BigDecimal realSales; + + //实际费用(核销和释放金额) + private BigDecimal realCost; + + //实际费用率(核销和释放金额/发货金额) + private BigDecimal realExpenseRate; + + //实际费用(核销) + private BigDecimal realCheck; + + //实际费用(释放金额) + private BigDecimal realRelease; + + public void initRealExpenseRate(){ + if(realSales!=null&&realSales.compareTo(BigDecimal.ZERO)!=0){ + realExpenseRate = realCost.divide(realCost,BigDecimal.ROUND_DOWN); + } + } + +} diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostSubItem.java b/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostSubItem.java index 3a91e4b9..333281ce 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostSubItem.java +++ b/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostSubItem.java @@ -20,15 +20,59 @@ public class TbsCostSubItem { private String chengBenZhongXin; private String chengBenZhongXinId; - //budgetAmount + //区域预算,预算金额 private BigDecimal areaBudget; - //preDispatchAmout + //目标销量,预估发货金额 private BigDecimal targetSales; - //targetExpenseRate = areaBudget/targetSales + //目标预算费率,预估费率。targetExpenseRate = areaBudget/targetSales private BigDecimal targetExpenseRate; + + //目标销量(发货金额) + private BigDecimal qtdTargetSales; + //目标预算(预算金额) + private BigDecimal qtdTargetBudget; + //目标费用率(预算金额/预估发货金额) + private BigDecimal qtdTargetExpenseRate; + + //实际销量(发货金额) + private BigDecimal qtdRealSales; + //实际费用(核销和释放金额) + private BigDecimal qtdRealCost; + //实际费用率(核销和释放金额/发货金额) + private BigDecimal qtdRealExpenseRate; + + + + //目标销量 + private BigDecimal ytdTargetSales; + //目标预算 + private BigDecimal ytdTargetBudget; + //目标费用率 + private BigDecimal ytdTargetExpenseRate; + //实际销量 + private BigDecimal ytdRealSales; + //实际费用 + private BigDecimal ytdRealCost; + //实际费用率 + private BigDecimal ytdRealExpenseRate; + + + //目标销量 + private BigDecimal mtdTargetSales; + //目标预算 + private BigDecimal mtdTargetBudget; + //目标费用率 + private BigDecimal mtdTargetExpenseRate; + //实际销量 + private BigDecimal mtdRealSales; + //实际费用 + private BigDecimal mtdRealCost; + //实际费用率 + private BigDecimal mtdRealExpenseRate; + } @Data 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 28b53f7d..34d1b3d2 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 @@ -11,6 +11,8 @@ import com.qs.serve.common.model.consts.BudgetLogRollbackFlag; import com.qs.serve.common.model.dto.R; import com.qs.serve.common.util.*; import com.qs.serve.common.util.model.DateFormatString; +import com.qs.serve.modules.bir.entity.BirActivityCenterGoods; +import com.qs.serve.modules.bir.entity.dto.BirRoiCostDTO; import com.qs.serve.modules.bir.entity.vo.YtdQtdToOAVo; import com.qs.serve.modules.bir.service.BirRoiRateService; import com.qs.serve.modules.bms.entity.BmsRegion; @@ -21,6 +23,8 @@ import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; import com.qs.serve.modules.bms.mapper.BmsRegionMapper; import com.qs.serve.modules.bms.service.BmsSubjectService; import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.erp.entity.dto.ErpDispatchSumVo; +import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; import com.qs.serve.modules.seeyon.entity.BaseCreateCallbackBo; import com.qs.serve.modules.seeyon.entity.BaseCreateProcessBo; import com.qs.serve.modules.seeyon.service.SeeYonRequestService; @@ -31,15 +35,17 @@ import com.qs.serve.modules.sys.service.SysUserService; import com.qs.serve.modules.tbs.common.TbsActivityState; import com.qs.serve.modules.tbs.common.TbsCostApplyState; import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.common.util.QuarterUtil; import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; import com.qs.serve.modules.tbs.entity.*; -import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.dto.TbsCenterGoodBirDTO; import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem; import com.qs.serve.modules.tbs.mapper.*; import com.qs.serve.modules.tbs.service.*; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.BeansException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -81,6 +87,7 @@ public class TbsCostApplyServiceImpl extends ServiceImpl tbsActivitySubjects = tbsActivitySubjectService.listByCostApplyId(Long.parseLong(id)); List subjectNames = tbsActivitySubjects.stream().map(TbsActivitySubject::getSubjectName).distinct().collect(Collectors.toList()); List subList = new ArrayList<>(); - for (String subjectName : subjectNames) { - subList.add(new TbsCostSubItem.Subject(subjectName)); - } - - //目标费率和成本中心统计 - List tbsBudgetCostItems = result.getBudgetMatchList(); - List scheduleItemBudgetIds = tbsBudgetCostItems.stream().map(a->a.getScheduleItemBudgetId()).distinct().collect(Collectors.toList()); - List tbsScheduleItemBudgets = tbsScheduleItemBudgetMapper.selectBatchIds(scheduleItemBudgetIds); - /*for(TbsScheduleItemBudget tbsScheduleItemBudget : tbsScheduleItemBudgets){ - subList.add( - new TbsCostSubItem.Amount( - tbsScheduleItemBudget.getBudgetAmount(), - tbsScheduleItemBudget.getPreDispatchAmount(), - tbsScheduleItemBudget.compareTargetExpenseRate() - ) - ); - }*/ - for (TbsActivityCenter activityCenter : tbsActivityCenters) { - TbsCostSubItem.CostCenter costCenter = new TbsCostSubItem.CostCenter(activityCenter.getCenterName(), - activityCenter.getCenterType()+"_"+ activityCenter.getCenterId()); - for (TbsBudget budget : result.getBudgetList()) { - boolean eqType = activityCenter.getCenterType().equals(budget.getCenterType()); - boolean eqCost = activityCenter.getCenterId().equals(budget.getCenterId()); - if(eqType&&eqCost){ - BigDecimal totalBudgetAmount = BigDecimal.ZERO; - BigDecimal totalPreDispatchAmount = BigDecimal.ZERO; - for (TbsScheduleItemBudget itemBudget : tbsScheduleItemBudgets) { - if(itemBudget.getBudgetId().equals(budget.getId())){ - if(itemBudget.getBudgetAmount()!=null){ - totalBudgetAmount = totalBudgetAmount.add(itemBudget.getBudgetAmount()); - } - if(itemBudget.getPreDispatchAmount()!=null){ - totalPreDispatchAmount = totalBudgetAmount.add(itemBudget.getPreDispatchAmount()); - } - } - } - costCenter.setAreaBudget(totalBudgetAmount); - costCenter.setTargetSales(totalPreDispatchAmount); - if(totalPreDispatchAmount.compareTo(BigDecimal.ZERO)!=0){ - costCenter.setTargetExpenseRate(totalBudgetAmount.divide(totalPreDispatchAmount,BigDecimal.ROUND_DOWN)); - } - } - } - subList.add(costCenter); - } - + //创建子表数据 + this.buildSubList(result, tbsActivityCenters, subjectNames, subList); + //创建商品抬头列表 List tbsActivityGoods = tbsActivityGoodsService.listByCostApplyId(Long.parseLong(id)); Set bands = new HashSet<>(); for (TbsActivityGoods tbsActivityGood : tbsActivityGoods) { String band = tbsActivityGood.getTargetLevelPathNames().split("_")[0]; bands.add(band); } - - String goods = bands.stream().collect(Collectors.joining(",")); data.put("chanPinPinLei",goods); data.put("sub",subList); @@ -429,6 +351,234 @@ public class TbsCostApplyServiceImpl extends ServiceImpl data) { + YtdQtdToOAVo ytdQtdToOAVo = birRoiRateService.buildYtdAndQtdData(tbsCostApply); + data.put("ytdCusExpenseRate",ytdQtdToOAVo.getYtdCustomerPercent()==null? + BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdCustomerPercent())); + data.put("ytdEmpExpenseRate",ytdQtdToOAVo.getYtdUserPercent()==null? + BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdUserPercent())); + data.put("ytdAdminiExpenseRate",ytdQtdToOAVo.getYtdRegionPercent()==null? + BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdRegionPercent())); + data.put("ytdSalesExpenseRate",ytdQtdToOAVo.getYtdRegion2Percent()==null? + BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdRegion2Percent())); + data.put("cusExpenseRate",ytdQtdToOAVo.getQtdCustomerPercent()==null? + BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdCustomerPercent())); + data.put("empExpenseRate",ytdQtdToOAVo.getQtdUserPercent()==null? + BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdUserPercent())); + data.put("salesExpenseRate",ytdQtdToOAVo.getQtdRegionPercent()==null? + BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdRegionPercent())); + data.put("adminiExpenseRate",ytdQtdToOAVo.getQtdRegion2Percent()==null? + BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdRegion2Percent())); + + //插入记录表前移除历史记录 +// tbsCostPercentMapper.delByCostApplyId(tbsCostApply.getId()); +// TbsCostPercent costPercent = new TbsCostPercent(); +// costPercent.setCostApplyId(tbsCostApply.getId()); +// costPercent.setYtdCustomerPercent(ytdQtdToOAVo.getYtdCustomerPercent()==null? +// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdCustomerPercent())); +// costPercent.setYtdUserPercent(ytdQtdToOAVo.getYtdUserPercent()==null? +// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdUserPercent())); +// costPercent.setYtdRegion2Percent(ytdQtdToOAVo.getYtdRegion2Percent()==null? +// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdRegion2Percent())); +// costPercent.setYtdRegionPercent(ytdQtdToOAVo.getYtdRegionPercent()==null? +// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getYtdRegionPercent())); +// costPercent.setQtdCustomerPercent(ytdQtdToOAVo.getQtdCustomerPercent()==null? +// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdCustomerPercent())); +// costPercent.setQtdUserPercent(ytdQtdToOAVo.getQtdUserPercent()==null? +// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdUserPercent())); +// costPercent.setQtdRegion2Percent(ytdQtdToOAVo.getQtdRegion2Percent()==null? +// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdRegion2Percent())); +// costPercent.setQtdRegionPercent(ytdQtdToOAVo.getQtdRegionPercent()==null? +// BigDecimal.ZERO:BigDecimal.valueOf(ytdQtdToOAVo.getQtdRegionPercent())); +// tbsCostPercentMapper.insert(costPercent); + } + + /** + * 创建子表数据 + * @param result + * @param tbsActivityCenters + * @param subjectNames + * @param subList + */ + private void buildSubList(TbsBudgetCostResult result, List tbsActivityCenters, List subjectNames, List subList) { + for (String subjectName : subjectNames) { + subList.add(new TbsCostSubItem.Subject(subjectName)); + } + + //目标费率和成本中心统计 + List tbsBudgetCostItems = result.getBudgetMatchList(); + List scheduleItemBudgetIds = tbsBudgetCostItems.stream().map(a->a.getScheduleItemBudgetId()).distinct().collect(Collectors.toList()); + List tbsScheduleItemBudgets = tbsScheduleItemBudgetMapper.selectBatchIds(scheduleItemBudgetIds); + /*for(TbsScheduleItemBudget tbsScheduleItemBudget : tbsScheduleItemBudgets){ + subList.add( + new TbsCostSubItem.Amount( + tbsScheduleItemBudget.getBudgetAmount(), + tbsScheduleItemBudget.getPreDispatchAmount(), + tbsScheduleItemBudget.compareTargetExpenseRate() + ) + ); + }*/ + + //查询发货金额,并按月份分割 + int year = LocalDate.now().getYear(); + int month = LocalDate.now().getMonthValue(); + int startMonthNum = Integer.parseInt(year+"01"); + int endMonthNum = Integer.parseInt(year+"01"); + tbsActivityCenters.stream().collect(Collectors.groupingBy(TbsActivityCenter::getCenterType)); + BirRoiRateService roiRateService = SpringUtils.getBean(BirRoiRateService.class); + BirRoiCostDTO costDTO = new BirRoiCostDTO(); + costDTO.setStartMonthNum(startMonthNum); + costDTO.setEndMonthNum(endMonthNum); + /*成本中心维度*/ + //发货单 + Map> supplierCodeMapWithCenterType = new HashMap<>(); + Map> centerMapList = tbsActivityCenters.stream().collect(Collectors.groupingBy(TbsActivityCenter::getCenterType)); + for (String centerType : centerMapList.keySet()) { + List centerIds =centerMapList.get(centerType).stream().map(a->a.getCenterId()).collect(Collectors.toList()); + List supplierCodeList = roiRateService.getSupplierCodesByCenter(costDTO,centerType,centerIds); + //发货单 + List dispatchSumVos = null; + if(supplierCodeList.size()>0){ + dispatchSumVos = dispatchDataMapper.querySumCost(startMonthNum,endMonthNum,supplierCodeList); + supplierCodeMapWithCenterType.put(centerType,dispatchSumVos); + } + } + + //查询ROI底表,并拼接DTO + List centerGoodDTOS = new ArrayList<>(); + 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 + * @param month + * @param supplierCodeMapWithCenterType + * @param birGroupByCenter + * @param activityCenter + * @param centerKey + * @return + */ + @NotNull + private TbsCostSubItem.CostCenter buildCostCenterParam(TbsBudgetCostResult result, List tbsScheduleItemBudgets, int year, int month, Map> supplierCodeMapWithCenterType, Map> birGroupByCenter, TbsActivityCenter activityCenter, String centerKey) { + TbsCostSubItem.CostCenter costCenter = new TbsCostSubItem.CostCenter(activityCenter.getCenterName(), + activityCenter.getCenterType()+"_"+ activityCenter.getCenterId()); + //设置目标销量、目标预算 + for (TbsBudget budget : result.getBudgetList()) { + boolean eqType = activityCenter.getCenterType().equals(budget.getCenterType()); + boolean eqCost = activityCenter.getCenterId().equals(budget.getCenterId()); + if (eqType && eqCost) { + BigDecimal totalBudgetAmount = BigDecimal.ZERO; + BigDecimal totalPreDispatchAmount = BigDecimal.ZERO; + for (TbsScheduleItemBudget itemBudget : tbsScheduleItemBudgets) { + if (itemBudget.getBudgetId().equals(budget.getId())) { + if (itemBudget.getBudgetAmount() != null) { + totalBudgetAmount = totalBudgetAmount.add(itemBudget.getBudgetAmount()); + } + if (itemBudget.getPreDispatchAmount() != null) { + totalPreDispatchAmount = totalBudgetAmount.add(itemBudget.getPreDispatchAmount()); + } + } + } + costCenter.setAreaBudget(totalBudgetAmount); + costCenter.setTargetSales(totalPreDispatchAmount); + if (totalPreDispatchAmount.compareTo(BigDecimal.ZERO) != 0) { + costCenter.setTargetExpenseRate(totalBudgetAmount.divide(totalPreDispatchAmount, BigDecimal.ROUND_DOWN)); + } + //暂保持目标相关数据一致 + costCenter.setYtdTargetSales(costCenter.getTargetSales()); + costCenter.setYtdTargetBudget(costCenter.getAreaBudget()); + costCenter.setYtdTargetExpenseRate(costCenter.getTargetExpenseRate()); + costCenter.setQtdTargetSales(costCenter.getTargetSales()); + costCenter.setQtdTargetBudget(costCenter.getAreaBudget()); + costCenter.setQtdTargetExpenseRate(costCenter.getTargetExpenseRate()); +// costCenter.setMtdTargetSales(); +// costCenter.setMtdTargetBudget(); +// costCenter.setMtdTargetExpenseRate(); + break; + + } + } + //发货金额 + List erpDispatchSumVoList = supplierCodeMapWithCenterType.get(centerKey); + + //年费率 + List centerGoods = birGroupByCenter.get(centerKey); + TbsCenterGoodBirDTO bir4Year = this.getTbsCenterGoodBirDTO(centerGoods,erpDispatchSumVoList); + costCenter.setYtdRealSales(bir4Year.getRealSales()); + costCenter.setYtdRealCost(bir4Year.getRealCost()); + costCenter.setYtdRealExpenseRate(bir4Year.getRealExpenseRate()); + + //季度 + List yearMonthList =QuarterUtil.getQuarterNumbers(year, month); + List 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 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 centerGoods,List 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; + } /**