Browse Source

Merge remote-tracking branch 'origin/v1.0' into v1.0

v1.0
Yen 2 years ago
parent
commit
4c2219948b
  1. 8
      src/main/java/com/qs/serve/modules/bir/controller/BirActivityCenterGoodsController.java
  2. 20
      src/main/java/com/qs/serve/modules/bir/controller/BirRoiRateController.java
  3. 18
      src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java
  4. 19
      src/main/java/com/qs/serve/modules/bir/mapper/BirReportAccountBookMapper.java
  5. 11
      src/main/java/com/qs/serve/modules/bir/service/BirCenterRateService.java
  6. 203
      src/main/java/com/qs/serve/modules/bir/service/impl/BirCenterRateServiceImpl.java
  7. 33
      src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetController.java
  8. 11
      src/main/java/com/qs/serve/modules/tbs/entity/TbsBudget.java
  9. 2
      src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetBo.java
  10. 1
      src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsScheduleItemBudgetBo.java
  11. 3
      src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostSubItem.java
  12. 1
      src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetVo.java
  13. 23
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java
  14. 444
      src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java
  15. 10
      src/main/java/com/qs/serve/task/BirTask.java
  16. 33
      src/main/java/com/qs/serve/task/ErpDipatchTask.java

8
src/main/java/com/qs/serve/modules/bir/controller/BirActivityCenterGoodsController.java

@ -58,6 +58,14 @@ public class BirActivityCenterGoodsController {
public R<PageVo<BirActivityCenterGoods>> getPage(BirActivityCenterGoods param){
PageUtil.startPage();
LambdaQueryWrapper<BirActivityCenterGoods> channelWrapper = new LambdaQueryWrapper<>(param);
if(param.getKeyNumStart()!=null){
Integer keyNumStart = Integer.parseInt(param.getKeyNumStart().replace("-",""));
channelWrapper.ge(BirActivityCenterGoods::getKeyNum,keyNumStart);
}
if(param.getKeyNumEnd()!=null){
Integer keyNumEnd = Integer.parseInt(param.getKeyNumEnd().replace("-",""));
channelWrapper.le(BirActivityCenterGoods::getKeyNum,keyNumEnd);
}
List<BirActivityCenterGoods> list = centerGoodsService.list(channelWrapper);
return R.byPageHelperList(list);
}

20
src/main/java/com/qs/serve/modules/bir/controller/BirRoiRateController.java

@ -14,18 +14,15 @@ import com.qs.serve.common.util.StringUtils;
import com.qs.serve.modules.bir.entity.BirBaseActivity;
import com.qs.serve.modules.bir.entity.so.BirCostRoiSo;
import com.qs.serve.modules.bir.entity.vo.*;
import com.qs.serve.modules.bir.service.BirActivityCenterGoodsService;
import com.qs.serve.modules.bir.service.BirBaseActivityService;
import com.qs.serve.modules.bir.service.BirReportAccountBookService;
import com.qs.serve.modules.bir.service.*;
import com.qs.serve.modules.tbs.common.TbsCenterType;
import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem;
import com.qs.serve.modules.tbs.service.TbsBudgetService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.*;
import com.qs.serve.modules.bir.service.BirRoiRateService;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@ -46,6 +43,8 @@ public class BirRoiRateController {
private BirActivityCenterGoodsService activityCenterGoodsService;
private BirReportAccountBookService birReportAccountBookService;
private TbsBudgetService tbsBudgetService;
private BirCenterRateService birCenterRateService;
/**
* 台账数据集
@ -141,6 +140,17 @@ public class BirRoiRateController {
return R.ok(vo);
}
/**
* 获取成本中心费率
* @param id
* @return
*/
@RepeatSubmit
@GetMapping("/centerRateByCostApplyId")
public R<List<TbsCostSubItem.CostCenterTranStr>> centerRateByCostApplyId(Long costApplyId,Long policyId){
return R.ok(birCenterRateService.findCostCenterDataByCostApplyId(costApplyId,policyId));
}
}

18
src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java

@ -85,6 +85,7 @@ public class BirActivityCenterGoods implements Serializable {
/** 活动编码 */
@NotBlank(message = "活动编码不能为空")
@Length(max = 30,message = "活动编码长度不能超过30字")
@TableField(condition = SqlCondition.LIKE)
private String activityCode;
/** 活动总金额 */
@ -106,11 +107,13 @@ public class BirActivityCenterGoods implements Serializable {
/** 科目编码 */
@NotBlank(message = "科目编码不能为空")
@Length(max = 50,message = "科目编码长度不能超过50字")
@TableField(condition = SqlCondition.LIKE)
private String subjectCode;
/** 科目名称 */
@NotBlank(message = "科目名称不能为空")
@Length(max = 50,message = "科目名称长度不能超过50字")
@TableField(condition = SqlCondition.LIKE)
private String subjectName;
/** 成本中心类型 */
@ -126,11 +129,13 @@ public class BirActivityCenterGoods implements Serializable {
/** 成本中心编码 */
@NotBlank(message = "成本中心编码不能为空")
@Length(max = 50,message = "成本中心编码长度不能超过50字")
@TableField(condition = SqlCondition.LIKE)
private String centerCode;
/** 成本中心名称 */
@NotBlank(message = "成本中心名称不能为空")
@Length(max = 200,message = "成本中心名称长度不能超过200字")
@TableField(condition = SqlCondition.LIKE)
private String centerName;
/** 成本中心金额 */
@ -165,11 +170,13 @@ public class BirActivityCenterGoods implements Serializable {
/** 目标编码 */
@NotBlank(message = "目标编码不能为空")
@Length(max = 30,message = "目标编码长度不能超过30字")
@TableField(condition = SqlCondition.LIKE)
private String targetCode;
/** 目标名称 */
@NotBlank(message = "目标名称不能为空")
@Length(max = 200,message = "目标名称长度不能超过200字")
@TableField(condition = SqlCondition.LIKE)
private String targetName;
/** 目标等级路径 */
@ -261,20 +268,29 @@ public class BirActivityCenterGoods implements Serializable {
/** 客户编码 */
@NotBlank(message = "客户编码不能为空")
@Length(max = 30,message = "客户编码长度不能超过30字")
@TableField(condition = SqlCondition.LIKE)
private String supplierCode;
/** 客户名称 */
@NotBlank(message = "客户名称不能为空")
@Length(max = 200,message = "客户名称长度不能超过200字")
@TableField(condition = SqlCondition.LIKE)
private String supplierName;
@TableField(condition = SqlCondition.LIKE)
private String supplierSaleRegionName;
private String supplierSaleRegionId;
@TableField(condition = SqlCondition.LIKE)
private String supplierBizRegionName;
private String supplierBizRegionId;
@TableField(exist = false)
private String keyNumStart;
@TableField(exist = false)
private String keyNumEnd;
}

19
src/main/java/com/qs/serve/modules/bir/mapper/BirReportAccountBookMapper.java

@ -48,5 +48,24 @@ public interface BirReportAccountBookMapper {
@InterceptorIgnore(tenantLine = "true")
List<Map<String, Object>> reportAccountBookCenter(@Param("inyear")String inyear);
@Select("call build_region_dispatch()")
@Options(statementType = StatementType.CALLABLE)
@InterceptorIgnore(tenantLine = "true")
void buildRegionDispatch();
@Select("call build_bizregion_dispatch()")
@Options(statementType = StatementType.CALLABLE)
@InterceptorIgnore(tenantLine = "true")
void buildBizRegionDispatch();
@Select("call build_customer_dispatch()")
@Options(statementType = StatementType.CALLABLE)
@InterceptorIgnore(tenantLine = "true")
void buildCustomerDispatch();
@Select("call build_all_dispatch()")
@Options(statementType = StatementType.CALLABLE)
@InterceptorIgnore(tenantLine = "true")
void buildAllDispatch();
}

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

@ -0,0 +1,11 @@
package com.qs.serve.modules.bir.service;
import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem;
import java.util.List;
public interface BirCenterRateService {
TbsCostSubItem.CostCenterTranStr buildCostCenter(String centerType, String centerId, String centerName);
List<TbsCostSubItem.CostCenterTranStr> findCostCenterDataByCostApplyId(Long costApplyId,Long policyId);
}

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

@ -0,0 +1,203 @@
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.BirActivityCenterGoodsMapper;
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.*;
import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem;
import com.qs.serve.modules.tbs.mapper.TbsActivityCenterMapper;
import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper;
import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper;
import com.qs.serve.modules.tzc.entity.TzcPolicyItem;
import com.qs.serve.modules.tzc.mapper.TzcPolicyItemMapper;
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.*;
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 BirActivityCenterGoodsMapper birActivityCenterGoodsMapper;
private TbsActivityCenterMapper tbsActivityCenterMapper;
private TzcPolicyItemMapper tzcPolicyItemMapper;
public List<TbsCostSubItem.CostCenterTranStr> findCostCenterDataByCostApplyId(Long costApplyId,Long policyId){
List<TbsCostSubItem.CostCenterTranStr> centerDataList = new ArrayList<>();
if(costApplyId!=null) {
LambdaQueryWrapper<TbsActivityCenter> lqw = new LambdaQueryWrapper<>();
lqw.eq(TbsActivityCenter::getCostApplyId, costApplyId);
List<TbsActivityCenter> tbsActivityCenters = tbsActivityCenterMapper.selectList(lqw);
if (tbsActivityCenters.size() == 0) {
return centerDataList;
}
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) {
TbsCostSubItem.CostCenterTranStr costCenter = this.buildCostCenter(center.getCenterType(), center.getCenterId(), center.getCenterName());
costCenter.setCenterId(center.getCenterId());
costCenter.setCentertype(center.getCenterType());
costCenter.setCenterCode(center.getCenterCode());
centerDataList.add(costCenter);
}
}
if(policyId!=null) {
LambdaQueryWrapper<TzcPolicyItem> lqw = new LambdaQueryWrapper<>();
lqw.eq(TzcPolicyItem::getPolicyId,policyId);
List<TzcPolicyItem> policyItems = tzcPolicyItemMapper.selectList(lqw);
Map<String, List<TzcPolicyItem>> centerMapList = policyItems.stream().collect(Collectors.groupingBy(a -> a.getCenterType() + "-" + a.getCenterId()));
List<TzcPolicyItem> centerList = centerMapList.values().stream().map(a -> a.get(0)).collect(Collectors.toList());
for(TzcPolicyItem center : centerList) {
TbsCostSubItem.CostCenterTranStr costCenter = this.buildCostCenter(center.getCenterType(), center.getCenterId(), center.getCenterName());
costCenter.setCenterId(center.getCenterId());
costCenter.setCentertype(center.getCenterType());
costCenter.setCenterCode(center.getCenterCode());
centerDataList.add(costCenter);
}
}
return centerDataList;
}
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 = birActivityCenterGoodsMapper.selectList(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;
}
}

33
src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetController.java

@ -185,6 +185,39 @@ public class TbsBudgetController {
return R.ok();
}
/**
* 修改周期金额
* @param param
* @return
*/
@PostMapping("/updateScheduleItemAmountAdd")
@SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.UPDATE)
@PreAuthorize("hasRole('tbs:budget:update')")
public R<?> updateScheduleItemAmountAdd(@RequestBody @Valid TbsScheduleItemBudgetBo param){
SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId());
TbsScheduleItemBudget scheduleItemBudget = tbsScheduleItemBudgetService.getById(param.getId());
//金额相同时退出
// if(scheduleItemBudget.getBudgetAmount().compareTo(param.getBudgetAmount())==0){return R.ok();}
TbsBudget budget = tbsBudgetService.getById(scheduleItemBudget.getBudgetId());
// TbsScheduleItemBudget itemBudget = new TbsScheduleItemBudget();
// itemBudget.setId(param.getId());
// itemBudget.setBudgetAmount(param.getBudgetAmount());
// tbsScheduleItemBudgetService.updateById(itemBudget);
//0-预算新增;1-费用申请;2-预算调增;3-预算调减;4-费用释放
BudgetLogOptFlag optType;
BigDecimal amount;
if(param.getBudgetAmount().compareTo(BigDecimal.ZERO)>0){
amount = param.getBudgetAmount();
optType = BudgetLogOptFlag.State_2;
}else {
amount = param.getBudgetAmount();
optType = BudgetLogOptFlag.State_3;
}
TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.toTbsBudgetLog(sysUser,budget,scheduleItemBudget,optType, amount);
tbsBudgetLogService.save(budgetLog);
return R.ok();
}
/**
* 修改预计发货金额
* @param param

11
src/main/java/com/qs/serve/modules/tbs/entity/TbsBudget.java

@ -10,7 +10,9 @@ import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler;
import lombok.Data;
import org.apache.ibatis.type.JdbcType;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
@ -23,7 +25,7 @@ import javax.validation.constraints.NotBlank;
* @since 2022-11-12
*/
@Data
@TableName("tbs_budget")
@TableName(value = "tbs_budget", autoResultMap = true)
public class TbsBudget implements Serializable {
private static final long serialVersionUID = 1L;
@ -123,9 +125,16 @@ public class TbsBudget implements Serializable {
@JsonProperty
private String delFlag;
/** 附件id */
@TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR)
private String[] attachIds;
/** 后端传输dto */
@TableField(exist = false)
private List<TbsBudgetCondition> budgetConditionList;
@TableField(exist = false)
private List<?> attachList;
}

2
src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetBo.java

@ -74,6 +74,8 @@ public class TbsBudgetBo implements Serializable {
/** skuId列表(前端显示为单品) */
private List<Long> skuIds;
private String[] attachIds;
@Data
public static class ScheduleItem{

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

@ -30,7 +30,6 @@ public class TbsScheduleItemBudgetBo implements Serializable {
private Long id;
/** 预算金额 */
@DecimalMin(value = "0")
@NotNull(message = "预算金额不能为空")
private BigDecimal budgetAmount;

3
src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostSubItem.java

@ -106,6 +106,9 @@ public class TbsCostSubItem {
}
private String chengBenZhongXin;
private String chengBenZhongXinId;
private String centertype;
private String centerCode;
private String centerId;
//区域预算,预算金额
private String areaBudget;

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

@ -75,6 +75,7 @@ public class TbsBudgetVo implements Serializable {
private List<?> spuConditions;
private List<?> scheduleItem;
private List<TbsScheduleItemBudget> scheduleItemBudgets;
private List<?> attachList;
}

23
src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java

@ -17,7 +17,9 @@ import com.qs.serve.modules.goods.entity.dto.TbsCenterDto;
import com.qs.serve.modules.goods.service.GoodsCategoryService;
import com.qs.serve.modules.goods.service.GoodsSkuService;
import com.qs.serve.modules.goods.service.GoodsSpuService;
import com.qs.serve.modules.sys.entity.SysAttach;
import com.qs.serve.modules.sys.entity.SysUser;
import com.qs.serve.modules.sys.service.SysAttachService;
import com.qs.serve.modules.sys.service.SysUserService;
import com.qs.serve.modules.tbs.common.TbsCenterType;
import com.qs.serve.modules.tbs.common.TbsGoodsType;
@ -40,10 +42,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -76,6 +75,9 @@ public class TbsBudgetServiceImpl extends ServiceImpl<TbsBudgetMapper,TbsBudget>
private final TbsBudgetCostItemPolicyService tbsBudgetCostItemPolicyService;
private final VtbFundFlowService vtbFundFlowService;
private SysAttachService attachService;
@Override
@Transactional(rollbackFor = Exception.class)
public void modify(TbsBudgetBo budgetBo) {
@ -428,7 +430,20 @@ public class TbsBudgetServiceImpl extends ServiceImpl<TbsBudgetMapper,TbsBudget>
LambdaQueryWrapper<TbsScheduleItemBudget> lqw2 = new LambdaQueryWrapper<>();
lqw2.eq(TbsScheduleItemBudget::getBudgetId,budget.getId());
List<TbsScheduleItemBudget> scheduleItemBudgets = scheduleItemBudgetService.list(lqw2);
scheduleItemBudgets.forEach(a->{
LambdaQueryWrapper<TbsBudgetLog> budgetLogLambdaQueryWrapper = new LambdaQueryWrapper<>();
budgetLogLambdaQueryWrapper.in(TbsBudgetLog::getOptType, BudgetLogOptFlag.getFinalBudgetOptFlag());
budgetLogLambdaQueryWrapper.eq(TbsBudgetLog::getScheduleItemBudgetId,a.getId());
List<TbsBudgetLog> logList = budgetLogService.list(budgetLogLambdaQueryWrapper);
a.setBudgetAmount(logList.stream().map(b->b.getAmount()).reduce(BigDecimal.ZERO,BigDecimal::add));
});
budgetVo.setScheduleItem(scheduleItemBudgets);
if(CollectionUtil.isNotEmpty(budget.getAttachIds())){
List<String> attachIds = Arrays.asList(budget.getAttachIds());
List<SysAttach> attachList = attachService.listByIds(attachIds);
budgetVo.setAttachList(attachList);
}
return budgetVo;
}

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.vo.YtdQtdToOAVo;
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.BmsRegion;
import com.qs.serve.modules.bms.entity.BmsRegion2;
@ -92,6 +93,7 @@ public class TbsCostApplyServiceImpl extends ServiceImpl<TbsCostApplyMapper,TbsC
private final ErpDispatchDataMapper dispatchDataMapper;
private BirActivityCenterGoodsService birActivityCenterGoodsService;
private TbsBudgetMapper tbsBudgetMapper;
private BirCenterRateService centerRateService;
@Override
@ -422,238 +424,240 @@ public class TbsCostApplyServiceImpl extends ServiceImpl<TbsCostApplyMapper,TbsC
}
//查询发货金额,并按月份分割
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;
BirRoiRateService roiRateService = SpringUtils.getBean(BirRoiRateService.class);
BirRoiCostDTO costDTO = new BirRoiCostDTO();
costDTO.setStartMonthNum(startMonthNum);
costDTO.setEndMonthNum(endMonthNum);
// 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;
// BirRoiRateService roiRateService = SpringUtils.getBean(BirRoiRateService.class);
// BirRoiCostDTO costDTO = new BirRoiCostDTO();
// costDTO.setStartMonthNum(startMonthNum);
// costDTO.setEndMonthNum(endMonthNum);
//获取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()));
// 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.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);
/* ------------------------------------------------------------------------- */
TbsCostSubItem.CostCenterTranStr costCenter = centerRateService.buildCostCenter(center.getCenterType(),center.getCenterId(),center.getCenterName());
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 tbsScheduleItemBudgets
* @param year
* @param month
* @param supplierCodeMapWithCenterType
* @param birGroupByCenter
* @param activityCenter
* @param centerKey
* @return
*/
@NotNull
private TbsCostSubItem.CostCenter buildCostCenterParam(TbsBudgetCostResult result, List<TbsScheduleItemBudget> tbsScheduleItemBudgets,
int year, int month, Map<String, List<ErpDispatchSumVo>> supplierCodeMapWithCenterType,
Map<String, List<BirActivityCenterGoods>> 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,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;
}
// /**
// * 创建成本中心维度对象(弃)
// * @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<TbsScheduleItemBudget> tbsScheduleItemBudgets,
// int year, int month, Map<String, List<ErpDispatchSumVo>> supplierCodeMapWithCenterType,
// Map<String, List<BirActivityCenterGoods>> 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,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;
import com.qs.serve.modules.bir.service.BirActivityCenterGoodsService;
import com.qs.serve.task.controller.TaskActivityController;
import lombok.AllArgsConstructor;
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.stereotype.Component;
import java.time.LocalDate;
/**
* @author YenHex
* @since 2023/7/14
@ -17,11 +20,14 @@ import org.springframework.stereotype.Component;
@ConditionalOnProperty(value = "project.task", havingValue = "true")
public class BirTask {
TaskActivityController activityController;
private final BirActivityCenterGoodsService birActivityCenterGoodsService;
@Scheduled(cron="0 0 1 * * ?")
public void buildTempTable(){
activityController.taskBir(null);
int year = LocalDate.now().getYear();
for (int i = 1;i < 13; i++) {
birActivityCenterGoodsService.buildReport(year,i);
}
}
}

33
src/main/java/com/qs/serve/task/ErpDipatchTask.java

@ -0,0 +1,33 @@
package com.qs.serve.task;
import com.qs.serve.modules.bir.mapper.BirReportAccountBookMapper;
import com.qs.serve.modules.bir.service.BirActivityCenterGoodsService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
/**
* @author YenHex
* @since 2023/7/14
*/
@Slf4j
@Component
@AllArgsConstructor
@ConditionalOnProperty(value = "project.task", havingValue = "true")
public class ErpDipatchTask {
private final BirReportAccountBookMapper birReportAccountBookMapper;
@Scheduled(cron="0 0 1 * * ?")
public void buildTempTable(){
birReportAccountBookMapper.buildAllDispatch();
birReportAccountBookMapper.buildRegionDispatch();
birReportAccountBookMapper.buildBizRegionDispatch();
birReportAccountBookMapper.buildCustomerDispatch();
}
}
Loading…
Cancel
Save