From 43d5d3b9347e3920e4c814e6defb162faf06c815 Mon Sep 17 00:00:00 2001 From: Yen Date: Thu, 6 Jun 2024 08:53:16 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=AE=A1=E6=89=B9=E8=BE=85?= =?UTF-8?q?=E5=8A=A9=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bir/controller/BirRoiRateController.java | 27 ++-- .../modules/bir/entity/BirBudgetTarget.java | 92 ++++++++++++++ .../bir/entity/so/BirBudgetTargetSo.java | 71 +++++++++++ .../bir/entity/vo/BirBudgetTargetVo.java | 61 +++++++++ .../bir/mapper/BirBudgetTargetMapper.java | 22 ++++ .../bir/service/BirBudgetTargetService.java | 20 +++ .../impl/BirBudgetTargetServiceImpl.java | 116 ++++++++++++++++++ .../service/impl/BmsSupplierServiceImpl.java | 4 + .../service/impl/TbsCostApplyServiceImpl.java | 5 +- .../mapper/bir/BirBudgetTargetMapper.xml | 101 +++++++++++++++ 10 files changed, 506 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/qs/serve/modules/bir/entity/BirBudgetTarget.java create mode 100644 src/main/java/com/qs/serve/modules/bir/entity/so/BirBudgetTargetSo.java create mode 100644 src/main/java/com/qs/serve/modules/bir/entity/vo/BirBudgetTargetVo.java create mode 100644 src/main/java/com/qs/serve/modules/bir/mapper/BirBudgetTargetMapper.java create mode 100644 src/main/java/com/qs/serve/modules/bir/service/BirBudgetTargetService.java create mode 100644 src/main/java/com/qs/serve/modules/bir/service/impl/BirBudgetTargetServiceImpl.java create mode 100644 src/main/resources/mapper/bir/BirBudgetTargetMapper.xml diff --git a/src/main/java/com/qs/serve/modules/bir/controller/BirRoiRateController.java b/src/main/java/com/qs/serve/modules/bir/controller/BirRoiRateController.java index 6dc4ae65..20c9cad5 100644 --- a/src/main/java/com/qs/serve/modules/bir/controller/BirRoiRateController.java +++ b/src/main/java/com/qs/serve/modules/bir/controller/BirRoiRateController.java @@ -1,15 +1,11 @@ package com.qs.serve.modules.bir.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.qs.serve.common.model.annotation.RepeatSubmit; -import com.qs.serve.common.model.annotation.SysLog; -import com.qs.serve.common.model.dto.PageVo; import com.qs.serve.common.model.dto.R; -import com.qs.serve.common.model.enums.BizType; -import com.qs.serve.common.model.enums.SystemModule; import com.qs.serve.common.util.*; -import com.qs.serve.modules.bir.entity.BirBaseActivity; +import com.qs.serve.modules.bir.entity.so.BirBudgetTargetSo; +import com.qs.serve.modules.bir.entity.vo.BirBudgetTargetVo; import com.qs.serve.modules.bir.entity.so.BirCostRoiSo; import com.qs.serve.modules.bir.entity.vo.*; import com.qs.serve.modules.bir.service.*; @@ -18,7 +14,6 @@ import com.qs.serve.modules.sys.service.SysDictDataService; import com.qs.serve.modules.tbs.common.TbsCenterType; import com.qs.serve.modules.tbs.entity.TbsActivity; import com.qs.serve.modules.tbs.entity.TbsActivityCenter; -import com.qs.serve.modules.tbs.entity.TbsCostApply; import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem; import com.qs.serve.modules.tbs.mapper.TbsActivityCenterMapper; import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; @@ -26,15 +21,10 @@ import com.qs.serve.modules.tbs.service.TbsBudgetService; import com.qs.serve.modules.tbs.service.TbsCostApplyService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.*; -import java.math.BigDecimal; -import java.time.LocalDate; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; /** * BI报表 ROI费率 @@ -58,6 +48,7 @@ public class BirRoiRateController { private TbsActivityMapper tbsActivityMapper; private TbsActivityCenterMapper tbsActivityCenterMapper; private BirBaseActivityService birBaseActivityService; + private BirBudgetTargetService birBudgetTargetService; /** * 测试 @@ -149,6 +140,18 @@ public class BirRoiRateController { return R.ok(vo); } + /** + * 获取费率 + * @param query + * @return + */ + @RepeatSubmit + @PostMapping("/costYearMonthV2") + public R> getCostRoiOfYearMonthV2(@RequestBody BirBudgetTargetSo query){ + List list = birBudgetTargetService.listVo(query); + return R.ok(list); + } + /** * 获取成本中心费率 * @param costApplyId diff --git a/src/main/java/com/qs/serve/modules/bir/entity/BirBudgetTarget.java b/src/main/java/com/qs/serve/modules/bir/entity/BirBudgetTarget.java new file mode 100644 index 00000000..ec0764fa --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bir/entity/BirBudgetTarget.java @@ -0,0 +1,92 @@ +package com.qs.serve.modules.bir.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; + +/** + * 实体类 + * @author YenHex + * @since 2024-06-05 + */ +@Data +@TableName("bir_budget_target") +public class BirBudgetTarget implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 搜索维度:0-客户;1-城市;2-省级经理;3-大区经理 */ + private Integer searchType; + + /** 年份 */ + private Integer yearNum; + + /** 季度 */ + private Integer quarterNum; + + /** 月份 */ + private Integer monthNum; + + /** 销售目标 */ + private BigDecimal targetAmt; + + /** 预算金额 */ + private BigDecimal budgetAmt; + + /** 实际发货 */ + private BigDecimal dispatchAmt; + + /** 去年同期发货 */ + private BigDecimal lastYearDispatchAmt; + + /** 城+省费用 */ + private BigDecimal provinceCityAmt; + + /** 城+省+区费用 */ + private BigDecimal provinceCityRegionAmt; + + /** 实际总费用 */ + private BigDecimal totalRealAmt; + + private String brandId; + + /** 品牌编码 */ + @Length(max = 255,message = "品牌编码长度不能超过255字") + private String brandCode; + + /** 品牌 */ + @Length(max = 255,message = "品牌长度不能超过255字") + private String brandName; + + /** 成本中心类型:saleRegion; bizRegion; costCenter; supplier */ + @Length(max = 255,message = "成本中心类型:saleRegion; bizRegion; costCenter; supplier长度不能超过255字") + private String centerType; + + private String centerId; + + /** 成本中心编码 */ + @Length(max = 255,message = "成本中心编码长度不能超过255字") + private String centerCode; + + /** 成本中心名 */ + @Length(max = 255,message = "成本中心名长度不能超过255字") + private String centerName; + +} + diff --git a/src/main/java/com/qs/serve/modules/bir/entity/so/BirBudgetTargetSo.java b/src/main/java/com/qs/serve/modules/bir/entity/so/BirBudgetTargetSo.java new file mode 100644 index 00000000..e5c1c1a6 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bir/entity/so/BirBudgetTargetSo.java @@ -0,0 +1,71 @@ +package com.qs.serve.modules.bir.entity.so; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author YenHex + * @since 2024/6/4 + */ +@Data +public class BirBudgetTargetSo { + + /** 搜索维度:0-客户;1-城市;2-省级经理;3-大区经理 */ + private Integer loadType; + + /** + * 开始时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime yearMonthStart; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime yearMonthEnd; + + /** + * 业务待定 + */ + private String supplierId; + + /** + * 成本中心 + */ + private List centerList; + + /**品牌 */ + private List brandIds; + + /** + * 减少xml条件 + */ + private Integer selectCenterFlag; + + /**成本中心编码 */ + private List centerIds; + + /**行政区域-成本中心编码 */ + private List bizRegionIds; + + /**销售区域-成本中心编码 */ + private List saleRegionIds; + + /**客户-成本中心编码 */ + private List supplierIds; + + @Data + public static class CostInfo{ + /** + * center,saleRegion,bizRegion,supplier + */ + private String costType; + + private String costId; + } + +} diff --git a/src/main/java/com/qs/serve/modules/bir/entity/vo/BirBudgetTargetVo.java b/src/main/java/com/qs/serve/modules/bir/entity/vo/BirBudgetTargetVo.java new file mode 100644 index 00000000..01297892 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bir/entity/vo/BirBudgetTargetVo.java @@ -0,0 +1,61 @@ +package com.qs.serve.modules.bir.entity.vo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2024/6/4 + */ +@Data +public class BirBudgetTargetVo { + + /** 年份 */ + private Integer yearNum; + + /** 月份 */ + private Integer monthNum; + + /** 销售目标 */ + private BigDecimal targetAmt; + + /** 预算金额 */ + private BigDecimal budgetAmt; + + /** 实际发货 */ + private BigDecimal dispatchAmt; + + /** 实际总费用 */ + private BigDecimal totalRealAmt; + + /** 去年同期发货 */ + private BigDecimal lastYearDispatchAmt; + + /** 城+省费用 */ + private BigDecimal provinceCityAmt; + + /** 城+省+区费用 */ + private BigDecimal provinceCityRegionAmt; + + + /** 预算费用率 */ + private BigDecimal budgetRate; + + /** 发货达成率 */ + private BigDecimal dispatchRate; + + /** 同期成长率*/ + private BigDecimal lastYearGrowRate; + + /** 城+省费用率 */ + private BigDecimal provinceCityRate; + + /** 城+省+区费用率 */ + private BigDecimal provinceCityRegionRate; + + /** 实际总费用率 */ + private BigDecimal totalRealRate; + +} diff --git a/src/main/java/com/qs/serve/modules/bir/mapper/BirBudgetTargetMapper.java b/src/main/java/com/qs/serve/modules/bir/mapper/BirBudgetTargetMapper.java new file mode 100644 index 00000000..b057cc21 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bir/mapper/BirBudgetTargetMapper.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bir.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bir.entity.BirBudgetTarget; +import com.qs.serve.modules.bir.entity.so.BirBudgetTargetSo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Mapper + * @author YenHex + * @date 2024-06-04 + */ +public interface BirBudgetTargetMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + List selectBirBudgetTargetList(@Param("query") BirBudgetTargetSo budgetTargetSo); + +} + diff --git a/src/main/java/com/qs/serve/modules/bir/service/BirBudgetTargetService.java b/src/main/java/com/qs/serve/modules/bir/service/BirBudgetTargetService.java new file mode 100644 index 00000000..2a577710 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bir/service/BirBudgetTargetService.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.bir.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bir.entity.BirBudgetTarget; +import com.qs.serve.modules.bir.entity.so.BirBudgetTargetSo; +import com.qs.serve.modules.bir.entity.vo.BirBudgetTargetVo; + +import java.util.List; + +/** + * 服务接口 + * @author YenHex + * @date 2024-06-04 + */ +public interface BirBudgetTargetService extends IService { + + List listVo(BirBudgetTargetSo query); + +} + diff --git a/src/main/java/com/qs/serve/modules/bir/service/impl/BirBudgetTargetServiceImpl.java b/src/main/java/com/qs/serve/modules/bir/service/impl/BirBudgetTargetServiceImpl.java new file mode 100644 index 00000000..ac512bb4 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bir/service/impl/BirBudgetTargetServiceImpl.java @@ -0,0 +1,116 @@ +package com.qs.serve.modules.bir.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.bir.entity.so.BirBudgetTargetSo; +import com.qs.serve.modules.bir.entity.vo.BirBudgetTargetVo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bir.entity.BirBudgetTarget; +import com.qs.serve.modules.bir.service.BirBudgetTargetService; +import com.qs.serve.modules.bir.mapper.BirBudgetTargetMapper; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.temporal.TemporalAdjuster; +import java.time.temporal.TemporalAdjusters; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * @author YenHex + * @since 2024-06-04 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BirBudgetTargetServiceImpl extends ServiceImpl implements BirBudgetTargetService { + + @Override + public List listVo(BirBudgetTargetSo query) { + + LocalDateTime endMonth = query.getYearMonthEnd(); + LocalDateTime startMonth = query.getYearMonthStart(); + //格式化 + startMonth = startMonth.withDayOfMonth(1).toLocalDate().atTime(0,0,0); + endMonth = endMonth.with(TemporalAdjusters.lastDayOfMonth()).toLocalDate().atTime(23,59,59); + query.setYearMonthStart(startMonth); + query.setYearMonthEnd(endMonth); + query.setSelectCenterFlag(0); + if(CollUtil.isNotEmpty(query.getCenterList())){ + query.setSelectCenterFlag(1); + } + + List birBudgetTargets = baseMapper.selectBirBudgetTargetList(query); + + Map> listMap = birBudgetTargets.stream() + .collect(Collectors.groupingBy(obj->obj.getYearNum()+"_"+obj.getMonthNum())); + + List budgetTargetVoList = new ArrayList<>(); + + + //12个月 + final int TOTAL_MONTH = 12; + for (int y = startMonth.getYear(); y <= endMonth.getYear(); y++) { + for (int m = 1; m <= TOTAL_MONTH; m++) { + //防止多空白行 + if(y == startMonth.getYear() && m < startMonth.getMonthValue()){ + continue; + } + if(y == endMonth.getYear() && m > endMonth.getMonthValue()){ + continue; + } + budgetTargetVoList.add(getBudgetTargetVo(listMap, m, y)); + } + } + return budgetTargetVoList; + } + + private BirBudgetTargetVo getBudgetTargetVo(Map> listMap, int month, int year) { + List mList = listMap.get(year +"_"+ month); + BirBudgetTargetVo targetVo = new BirBudgetTargetVo(); + targetVo.setYearNum(year); + targetVo.setMonthNum(month); + targetVo.setTargetAmt(BigDecimal.ZERO); + targetVo.setBudgetAmt(BigDecimal.ZERO); + targetVo.setDispatchAmt(BigDecimal.ZERO); + targetVo.setTotalRealAmt(BigDecimal.ZERO); + targetVo.setLastYearDispatchAmt(BigDecimal.ZERO); + targetVo.setProvinceCityAmt(BigDecimal.ZERO); + targetVo.setProvinceCityRegionAmt(BigDecimal.ZERO); + if(CollUtil.isNotEmpty(mList)){ + for (BirBudgetTarget target : mList) { + targetVo.setTargetAmt(targetVo.getTargetAmt().add(target.getTargetAmt())); + targetVo.setBudgetAmt(targetVo.getBudgetAmt().add(target.getBudgetAmt())); + targetVo.setDispatchAmt(targetVo.getDispatchAmt().add(target.getDispatchAmt())); + targetVo.setTotalRealAmt(targetVo.getTotalRealAmt().add(target.getTotalRealAmt())); + targetVo.setLastYearDispatchAmt(targetVo.getLastYearDispatchAmt().add(target.getLastYearDispatchAmt())); + targetVo.setProvinceCityAmt(targetVo.getProvinceCityAmt().add(target.getProvinceCityAmt())); + targetVo.setProvinceCityRegionAmt(targetVo.getProvinceCityRegionAmt().add(target.getProvinceCityRegionAmt())); + } + //预算费率 = 预算费用/销售目标 + targetVo.setBudgetRate(targetVo.getBudgetAmt().divide(targetVo.getTargetAmt(),2, RoundingMode.DOWN)); + //发货达成率 = 实际发货/销售目标 + targetVo.setDispatchRate(targetVo.getDispatchAmt().divide(targetVo.getTargetAmt(),2, RoundingMode.DOWN)); + //(当前发货-去年同期发货)/去年同期发货 + targetVo.setLastYearGrowRate( + targetVo.getDispatchAmt() + .subtract(targetVo.getLastYearDispatchAmt()) + .divide(targetVo.getLastYearDispatchAmt(),2, RoundingMode.DOWN) + ); + //实际费用率=实际费用/实际发货 + targetVo.setProvinceCityRate(targetVo.getProvinceCityAmt().divide(targetVo.getDispatchAmt(),2, RoundingMode.DOWN)); + targetVo.setProvinceCityRegionRate(targetVo.getProvinceCityRate().divide(targetVo.getDispatchAmt(),2, RoundingMode.DOWN)); + targetVo.setTotalRealRate(targetVo.getTotalRealAmt().divide(targetVo.getDispatchAmt(),2, RoundingMode.DOWN)); + } + return targetVo; + } + +} + diff --git a/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierServiceImpl.java b/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierServiceImpl.java index 2e48570d..b93f370f 100644 --- a/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierServiceImpl.java @@ -254,6 +254,8 @@ public class BmsSupplierServiceImpl extends ServiceImpl vtbLqw = new LambdaQueryWrapper<>(); vtbLqw.eq(VtbVerification::getCostApplyId,id); vtbLqw.and( @@ -543,7 +546,7 @@ public class TbsCostApplyServiceImpl extends ServiceImpl contractLambdaQueryWrapper = new LambdaQueryWrapper<>(); contractLambdaQueryWrapper.eq(TbsCostContract::getCostApplyId,id); diff --git a/src/main/resources/mapper/bir/BirBudgetTargetMapper.xml b/src/main/resources/mapper/bir/BirBudgetTargetMapper.xml new file mode 100644 index 00000000..dd9fd1da --- /dev/null +++ b/src/main/resources/mapper/bir/BirBudgetTargetMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + bir_budget_target.`id`, + bir_budget_target.`search_type`, + bir_budget_target.`year_num`, + bir_budget_target.`quarter_num`, + bir_budget_target.`month_num`, + bir_budget_target.`target_amt`, + bir_budget_target.`budget_amt`, + bir_budget_target.`dispatch_amt`, + bir_budget_target.`last_year_dispatch_amt`, + bir_budget_target.`province_city_amt`, + bir_budget_target.`province_city_region_amt`, + bir_budget_target.`total_real_amt`, + bir_budget_target.`brand_id`, + bir_budget_target.`brand_code`, + bir_budget_target.`brand_name`, + bir_budget_target.`center_type`, + bir_budget_target.`center_id`, + bir_budget_target.`center_code`, + bir_budget_target.`center_name` + + + +