Browse Source

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

contract
15989082884@163.com 2 years ago
parent
commit
fd2b7f5ff4
  1. 17
      src/main/java/com/qs/serve/modules/bir/controller/BirRoiRateController.java
  2. 66
      src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java
  3. 126
      src/main/java/com/qs/serve/modules/bir/entity/BirScheduleItemBudget.java
  4. 20
      src/main/java/com/qs/serve/modules/bir/entity/dto/BirCenterGoodSplitDTO.java
  5. 13
      src/main/java/com/qs/serve/modules/bir/mapper/BirActivityCenterGoodsMapper.java
  6. 14
      src/main/java/com/qs/serve/modules/bir/mapper/BirScheduleItemBudgetMapper.java
  7. 9
      src/main/java/com/qs/serve/modules/bir/service/BirActivityCenterGoodsService.java
  8. 19
      src/main/java/com/qs/serve/modules/bir/service/BirScheduleItemBudgetService.java
  9. 287
      src/main/java/com/qs/serve/modules/bir/service/impl/BirActivityCenterGoodsServiceImpl.java
  10. 194
      src/main/java/com/qs/serve/modules/bir/service/impl/BirScheduleItemBudgetServiceImpl.java
  11. 11
      src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java
  12. 3
      src/main/java/com/qs/serve/modules/tbs/entity/TbsBudget.java
  13. 2
      src/main/java/com/qs/serve/modules/tbs/entity/TbsScheduleItemBudget.java
  14. 2
      src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityTemplateBo.java
  15. 128
      src/main/resources/mapper/bir/BirActivityCenterGoodsMapper.xml

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

@ -15,6 +15,7 @@ import com.qs.serve.modules.bir.entity.vo.BirCenterCostRateItem;
import com.qs.serve.modules.bir.entity.vo.BirCenterCostRateMain;
import com.qs.serve.modules.bir.entity.vo.BirRoiCostItemVo;
import com.qs.serve.modules.bir.entity.vo.BirRoiVo;
import com.qs.serve.modules.bir.service.BirActivityCenterGoodsService;
import com.qs.serve.modules.bir.service.BirBaseActivityService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -40,13 +41,15 @@ public class BirRoiRateController {
private BirRoiRateService birRoiRateService;
private BirBaseActivityService activityService;
private BirActivityCenterGoodsService activityCenterGoodsService;
/**
* 台账数据集
* @return
*/
@GetMapping("/standingBook")
public R<List<BirCenterCostRateMain>> getStandingBook(){
public R<List<BirCenterCostRateMain>> getStandingBook(String type){
List<BirCenterCostRateItem> list = new ArrayList<>();
BirCenterCostRateItem rateItem = new BirCenterCostRateItem();
rateItem.setTargetDispatchAmt(BigDecimal.ZERO);
@ -71,7 +74,7 @@ public class BirRoiRateController {
* @return
*/
@GetMapping("/test22")
public R<?> getPage(){
public R<?> test22(){
//移除当年所有
int year = 2023;
// LambdaQueryWrapper<BirBaseActivity> rmLqw = new LambdaQueryWrapper<>();
@ -84,6 +87,16 @@ public class BirRoiRateController {
return R.ok();
}
/**
* 台账
* @return
*/
@GetMapping("/test33")
public R<?> test33(){
activityCenterGoodsService.buildReport(2023,1);
return R.ok();
}
/**
* 获取费率

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

@ -19,7 +19,7 @@ import javax.validation.constraints.NotBlank;
/**
* 实体类
* @author YenHex
* @since 2023-07-06
* @since 2023-07-07
*/
@Data
@TableName("bir_activity_center_goods")
@ -37,7 +37,7 @@ public class BirActivityCenterGoods implements Serializable {
/** 年月 */
@NotNull(message = "年月不能为空")
private Integer yearMonth;
private Integer keyNum;
/** 天数 */
@NotNull(message = "天数不能为空")
@ -80,6 +80,15 @@ public class BirActivityCenterGoods implements Serializable {
@Length(max = 30,message = "活动编码长度不能超过30字")
private String activityCode;
/** 活动总金额 */
private BigDecimal activityTotalAmount;
/** 活动总核销金额 */
private BigDecimal activityTotalCheckAmount;
/** 活动完成主题 */
private Integer activityFinishedFlag;
/** 科目id */
@NotNull(message = "科目id不能为空")
private Long subjectId;
@ -250,58 +259,5 @@ public class BirActivityCenterGoods implements Serializable {
private String supplierName;
public static BirActivityCenterGoods toNewObject(BirActivityCenterGoods source){
BirActivityCenterGoods activityCenterGoods = new BirActivityCenterGoods();
activityCenterGoods.setId(source.getId());
activityCenterGoods.setActivityCenterGoodsId(source.getActivityCenterGoodsId());
activityCenterGoods.setYearMonth(source.getYearMonth());
activityCenterGoods.setDays(source.getDays());
activityCenterGoods.setStarDate(source.getStarDate());
activityCenterGoods.setEndDate(source.getEndDate());
activityCenterGoods.setSplitAmount(source.getSplitAmount());
activityCenterGoods.setSplitUsedAmount(source.getSplitUsedAmount());
activityCenterGoods.setCenterGoodsCode(source.getCenterGoodsCode());
activityCenterGoods.setCostApplyId(source.getCostApplyId());
activityCenterGoods.setActivityId(source.getActivityId());
activityCenterGoods.setActivityCode(source.getActivityCode());
activityCenterGoods.setSubjectId(source.getSubjectId());
activityCenterGoods.setSubjectCode(source.getSubjectCode());
activityCenterGoods.setSubjectName(source.getSubjectName());
activityCenterGoods.setCenterType(source.getCenterType());
activityCenterGoods.setCenterId(source.getCenterId());
activityCenterGoods.setCenterCode(source.getCenterCode());
activityCenterGoods.setCenterName(source.getCenterName());
activityCenterGoods.setCenterAmount(source.getCenterAmount());
activityCenterGoods.setCenterRate(source.getCenterRate());
activityCenterGoods.setCenterGoodsAmount(source.getCenterGoodsAmount());
activityCenterGoods.setCenterGoodsRate(source.getCenterGoodsRate());
activityCenterGoods.setUsedAmount(source.getUsedAmount());
activityCenterGoods.setTargetType(source.getTargetType());
activityCenterGoods.setTargetId(source.getTargetId());
activityCenterGoods.setTargetCode(source.getTargetCode());
activityCenterGoods.setTargetName(source.getTargetName());
activityCenterGoods.setTargetLevelPathIds(source.getTargetLevelPathIds());
activityCenterGoods.setTargetLevelPathNames(source.getTargetLevelPathNames());
activityCenterGoods.setCenterLv1Id(source.getCenterLv1Id());
activityCenterGoods.setCenterLv1Code(source.getCenterLv1Code());
activityCenterGoods.setCenterLv1Name(source.getCenterLv1Name());
activityCenterGoods.setCenterLv2Id(source.getCenterLv2Id());
activityCenterGoods.setCenterLv2Code(source.getCenterLv2Code());
activityCenterGoods.setCenterLv2Name(source.getCenterLv2Name());
activityCenterGoods.setRemark(source.getRemark());
activityCenterGoods.setCreateTime(source.getCreateTime());
activityCenterGoods.setUpdateTime(source.getUpdateTime());
activityCenterGoods.setTenantId(source.getTenantId());
activityCenterGoods.setActStartDate(source.getActStartDate());
activityCenterGoods.setActEndDate(source.getActEndDate());
activityCenterGoods.setPreStartDate(source.getPreStartDate());
activityCenterGoods.setPreEndDate(source.getPreEndDate());
activityCenterGoods.setPreCheckDate(source.getPreCheckDate());
activityCenterGoods.setSupplierId(source.getSupplierId());
activityCenterGoods.setSupplierCode(source.getSupplierCode());
activityCenterGoods.setSupplierName(source.getSupplierName());
return activityCenterGoods;
}
}

126
src/main/java/com/qs/serve/modules/bir/entity/BirScheduleItemBudget.java

@ -0,0 +1,126 @@
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 2023-07-07
*/
@Data
@TableName("bir_schedule_item_budget")
public class BirScheduleItemBudget implements Serializable {
private static final long serialVersionUID = 1L;
/** id */
@TableId(type = IdType.AUTO)
private Long id;
/** 考核id */
@NotNull(message = "考核id不能为空")
private Long scheduleId;
/** 考核期项id */
@NotNull(message = "考核期项id不能为空")
private Long scheduleItemId;
/** 考核编码 */
@NotBlank(message = "考核编码不能为空")
@Length(max = 30,message = "考核编码长度不能超过30字")
private String itemName;
/** 开始时间 */
@NotNull(message = "开始时间不能为空")
@Length(max = 0,message = "开始时间长度不能超过0字")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime budgetStartDate;
/** 结束时间 */
@NotNull(message = "结束时间不能为空")
@Length(max = 0,message = "结束时间长度不能超过0字")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime budgetEndDate;
/** 预算id */
@NotNull(message = "预算id不能为空")
private Long budgetId;
/** 预算金额 */
@NotNull(message = "预算金额不能为空")
private BigDecimal budgetAmount;
/** */
private BigDecimal preDispatchAmount;
private BigDecimal splitBudgetAmount;
private BigDecimal splitPreDispatchAmount;
/** 备注 */
@Length(max = 255,message = "备注长度不能超过255字")
private String remark;
/** 创建时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/** 最后更新时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
/** 所属租户 */
@JsonIgnore
@JsonProperty
private String tenantId;
/** 创建人 */
@TableField(fill = FieldFill.INSERT)
private String createBy;
/** 更新人 */
@TableField(fill = FieldFill.UPDATE)
private String updateBy;
/** 键值(日期数) */
@NotNull(message = "键值(日期数)不能为空")
private Integer keyNum;
/** 当月有多少天 */
private Integer monthDays;
/** 活动总天数 */
private Integer totalDays;
/** 当月分割开始 */
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate startDate;
/** 当月分割结束 */
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate endDate;
}

20
src/main/java/com/qs/serve/modules/bir/entity/dto/BirCenterGoodSplitDTO.java

@ -0,0 +1,20 @@
package com.qs.serve.modules.bir.entity.dto;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author YenHex
* @since 2023/7/7
*/
@Data
public class BirCenterGoodSplitDTO {
//当前CenterGoods分割项金额
BigDecimal currentSplitAmount;
//当前CenterGoods分割项核销金额(粗略计算)
BigDecimal currentSplitCheckAmount;
}

13
src/main/java/com/qs/serve/modules/bir/mapper/BirActivityCenterGoodsMapper.java

@ -2,6 +2,11 @@ package com.qs.serve.modules.bir.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qs.serve.modules.bir.entity.BirActivityCenterGoods;
import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.util.List;
/**
* Mapper
@ -10,6 +15,14 @@ import com.qs.serve.modules.bir.entity.BirActivityCenterGoods;
*/
public interface BirActivityCenterGoodsMapper extends BaseMapper<BirActivityCenterGoods> {
/**
* 查询出异动的记录
* @param startDate
* @param endDate
* @return
*/
List<TbsActivityCenterGoods> selectChangeCenterGoods(@Param("startDate") LocalDate startDate,
@Param("endDate")LocalDate endDate);
}

14
src/main/java/com/qs/serve/modules/bir/mapper/BirScheduleItemBudgetMapper.java

@ -0,0 +1,14 @@
package com.qs.serve.modules.bir.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qs.serve.modules.bir.entity.BirScheduleItemBudget;
/**
* 预算考核期项 Mapper
* @author YenHex
* @date 2023-07-07
*/
public interface BirScheduleItemBudgetMapper extends BaseMapper<BirScheduleItemBudget> {
}

9
src/main/java/com/qs/serve/modules/bir/service/BirActivityCenterGoodsService.java

@ -10,5 +10,14 @@ import com.qs.serve.modules.bir.entity.BirActivityCenterGoods;
*/
public interface BirActivityCenterGoodsService extends IService<BirActivityCenterGoods> {
/**
* 创建分割统计表
* @param year
* @param month
*/
void buildReport(int year, int month);
}

19
src/main/java/com/qs/serve/modules/bir/service/BirScheduleItemBudgetService.java

@ -0,0 +1,19 @@
package com.qs.serve.modules.bir.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.bir.entity.BirScheduleItemBudget;
/**
* 预算考核期项 服务接口
* @author YenHex
* @date 2023-07-07
*/
public interface BirScheduleItemBudgetService extends IService<BirScheduleItemBudget> {
/**
* 创建数据
*/
void buildScheduleItemBudget();
}

287
src/main/java/com/qs/serve/modules/bir/service/impl/BirActivityCenterGoodsServiceImpl.java

@ -1,16 +1,37 @@
package com.qs.serve.modules.bir.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qs.serve.common.model.dto.DateSplitDTO;
import com.qs.serve.common.util.DateSplitUtil;
import com.qs.serve.modules.bir.entity.BirBaseActivity;
import com.qs.serve.modules.bir.entity.dto.BirCenterGoodSplitDTO;
import com.qs.serve.modules.bms.entity.BmsCostCenter;
import com.qs.serve.modules.bms.entity.BmsRegion;
import com.qs.serve.modules.bms.entity.BmsRegion2;
import com.qs.serve.modules.bms.mapper.BmsCostCenterMapper;
import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper;
import com.qs.serve.modules.bms.mapper.BmsRegionMapper;
import com.qs.serve.modules.tbs.entity.TbsActivity;
import com.qs.serve.modules.tbs.entity.TbsActivityCenter;
import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods;
import com.qs.serve.modules.tbs.service.TbsActivityCenterGoodsService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;
import com.qs.serve.modules.bir.entity.BirActivityCenterGoods;
import com.qs.serve.modules.bir.service.BirActivityCenterGoodsService;
import com.qs.serve.modules.bir.mapper.BirActivityCenterGoodsMapper;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 服务实现类
* @author YenHex
@ -21,10 +42,274 @@ import com.qs.serve.modules.bir.mapper.BirActivityCenterGoodsMapper;
@AllArgsConstructor
public class BirActivityCenterGoodsServiceImpl extends ServiceImpl<BirActivityCenterGoodsMapper,BirActivityCenterGoods> implements BirActivityCenterGoodsService {
private TbsActivityCenterGoodsService centerGoodsService;
private final TbsActivityCenterGoodsService centerGoodsService;
private final BmsCostCenterMapper costCenterMapper;
private final BmsRegionMapper regionMapper;
private final BmsRegion2Mapper region2Mapper;
@Override
public void buildReport(int year, int month) {
LocalDate startDate = LocalDate.of(year,month,1);
int lastDayNum2 = startDate.lengthOfMonth();
LocalDate endDate = LocalDate.of(year,month,lastDayNum2);
//加载所有异动的数据
List<TbsActivityCenterGoods> activityCenterGoodsAllList = this.baseMapper.selectChangeCenterGoods(startDate,endDate);
if(activityCenterGoodsAllList.size()<1){
return;
}
// 删除历史数据
List<Long> activityIds = activityCenterGoodsAllList.stream().filter(a->a.getId()!=null)
.map(TbsActivityCenterGoods::getActivityId).collect(Collectors.toList());
LambdaQueryWrapper<BirActivityCenterGoods> birBaseActivityLqw = new LambdaQueryWrapper<>();
birBaseActivityLqw.in(BirActivityCenterGoods::getActivityId,activityIds);
this.remove(birBaseActivityLqw);
//加载所有自定义成本中心
List<BmsCostCenter> costCenterList = costCenterMapper.selectList(new QueryWrapper<>());
// 按活动id分组
Map<Long,List<TbsActivityCenterGoods>> collectMap = activityCenterGoodsAllList.stream()
.collect(Collectors.groupingBy(TbsActivityCenterGoods::getActivityId));
for (Long activityId : collectMap.keySet()) {
//用于保存的对象列表
List<BirActivityCenterGoods> bacgList = new ArrayList<>();
//创建对象列表
List<TbsActivityCenterGoods> activityCenterGoodsList = collectMap.get(activityId);
for (TbsActivityCenterGoods activityCenterGoods : activityCenterGoodsList) {
LocalDate actStartDate = activityCenterGoods.getPreStartDate();
LocalDate actEndDate = activityCenterGoods.getPreEndDate();
int currentActDays = (int) (actEndDate.toEpochDay()-actStartDate.toEpochDay()+1);
List<DateSplitDTO> dateSplitList = DateSplitUtil.getSplitDto(actStartDate,actEndDate);
if(dateSplitList.size()>1){
for (DateSplitDTO currDateSplit : dateSplitList) {
//获取该项分割金额对象
BirCenterGoodSplitDTO goodSplitDTO = this.buildSplitAmount(activityCenterGoods,
dateSplitList, currDateSplit,currentActDays);
//创建底表对象
BirActivityCenterGoods entity = createBirActivityCenterGoodsEntity(costCenterList,
activityCenterGoods, currentActDays, currDateSplit, goodSplitDTO);
bacgList.add(entity);
}
}else if (dateSplitList.size()==1){
DateSplitDTO currDateSplit = dateSplitList.get(0);
//获取该项分割金额对象
BirCenterGoodSplitDTO goodSplitDTO = this.buildSplitAmount(activityCenterGoods,
dateSplitList, currDateSplit,currentActDays);
//创建底表对象
BirActivityCenterGoods entity = createBirActivityCenterGoodsEntity(costCenterList,
activityCenterGoods, currentActDays, currDateSplit, goodSplitDTO);
bacgList.add(entity);
}
}
if(bacgList.size()>0){
this.saveBatch(bacgList);
}
}
//TODO 更新区域类型的名称和编码
}
/**
* 创建底表对象
* @param costCenterList
* @param activityCenterGoods
* @param currentActDays
* @param currDateSplit
* @param goodSplitDTO
* @return
*/
@NotNull
private BirActivityCenterGoods createBirActivityCenterGoodsEntity(List<BmsCostCenter> costCenterList,
TbsActivityCenterGoods activityCenterGoods,
Integer currentActDays,
DateSplitDTO currDateSplit,
BirCenterGoodSplitDTO goodSplitDTO) {
BirActivityCenterGoods entity = new BirActivityCenterGoods();
entity.setActivityCenterGoodsId(activityCenterGoods.getId());
entity.setKeyNum(currDateSplit.getYearMonth());
entity.setDays(currentActDays);
entity.setStarDate(currDateSplit.getStartDate());
entity.setEndDate(currDateSplit.getEndDate());
entity.setSplitAmount(goodSplitDTO.getCurrentSplitAmount());
entity.setSplitUsedAmount(goodSplitDTO.getCurrentSplitCheckAmount());
entity.setCenterGoodsCode(activityCenterGoods.getCenterGoodsCode());
entity.setCostApplyId(activityCenterGoods.getCostApplyId());
entity.setActivityId(activityCenterGoods.getActivityId());
entity.setActivityCode(activityCenterGoods.getActivityCode());
entity.setActivityTotalAmount(activityCenterGoods.getActivityAmt());
entity.setActivityTotalCheckAmount(activityCenterGoods.getActivityCheckAmt());
entity.setActivityFinishedFlag(activityCenterGoods.getActivityFinishedFlag());
entity.setSubjectId(activityCenterGoods.getSubjectId());
entity.setSubjectCode(activityCenterGoods.getSubjectCode());
entity.setSubjectName(activityCenterGoods.getSubjectName());
entity.setCenterType(activityCenterGoods.getCenterType());
entity.setCenterId(activityCenterGoods.getCenterId());
entity.setCenterCode(activityCenterGoods.getCenterCode());
entity.setCenterName(activityCenterGoods.getCenterName());
entity.setCenterAmount(activityCenterGoods.getCenterAmount());
entity.setCenterRate(activityCenterGoods.getCenterRate());
entity.setCenterGoodsAmount(activityCenterGoods.getCenterGoodsAmount());
entity.setCenterGoodsRate(activityCenterGoods.getCenterGoodsRate());
entity.setUsedAmount(activityCenterGoods.getUsedAmount());
entity.setTargetType(activityCenterGoods.getTargetType());
entity.setTargetId(activityCenterGoods.getTargetId());
entity.setTargetCode(activityCenterGoods.getTargetCode());
entity.setTargetName(activityCenterGoods.getTargetName());
entity.setTargetLevelPathIds(activityCenterGoods.getTargetLevelPathIds());
entity.setTargetLevelPathNames(activityCenterGoods.getTargetLevelPathNames());
//递归初始化成本中心
this.initializeCostCenterInfo(entity, costCenterList);
entity.setActStartDate(activityCenterGoods.getActStartDate());
entity.setActEndDate(activityCenterGoods.getActEndDate());
entity.setPreStartDate(activityCenterGoods.getPreStartDate());
entity.setPreEndDate(activityCenterGoods.getPreEndDate());
entity.setPreCheckDate(activityCenterGoods.getPreCheckDate());
entity.setSupplierId(activityCenterGoods.getSupplierId());
entity.setSupplierCode(activityCenterGoods.getSupplierCode());
entity.setSupplierName(activityCenterGoods.getSupplierName());
return entity;
}
/**
* 递归初始化成本中心
* @param entity
* @param costCenterList
*/
private void initializeCostCenterInfo(BirActivityCenterGoods entity,List<BmsCostCenter> costCenterList) {
String centerId = entity.getCenterId();
String centerType = entity.getCenterType();
String centerCode = entity.getCenterCode();
String centerName = entity.getCenterName();
if("center".equals(centerType)){
for (BmsCostCenter costCenter : costCenterList) {
if(centerId.equals(costCenter.getId().toString())){
if(costCenter.getPid().equals(0L)){
entity.setCenterLv1Id(costCenter.getId().toString());
entity.setCenterLv1Code(costCenter.getCode());
entity.setCenterLv1Name(costCenter.getName());
}else {
//递归设置成本中心
this.recursionInitCenter(entity, costCenterList, costCenter,6);
}
}
}
}else if ("saleRegion".equals(centerType)){
BmsRegion region = regionMapper.selectById(centerId);
if(region==null){
QueryWrapper lqw = new QueryWrapper();
lqw.eq("code",centerId);
region = regionMapper.selectOne(lqw);
}
String[] regionIds = region.getPathIds().split("_");
entity.setCenterLv1Id(regionIds[0]);
if(regionIds.length>1){
entity.setCenterLv2Id(regionIds[1]);
}
}else if ("bizRegion".equals(centerType)){
BmsRegion2 region = region2Mapper.selectById(centerId);
if(region==null){
QueryWrapper lqw = new QueryWrapper();
lqw.eq("code",centerId);
region = region2Mapper.selectOne(lqw);
}
String[] regionIds = region.getPathIds().split("_");
entity.setCenterLv1Id(regionIds[0]);
if(regionIds.length>1){
entity.setCenterLv2Id(regionIds[1]);
}
}else{
entity.setCenterLv1Id(centerId);
entity.setCenterLv1Code(centerCode);
entity.setCenterLv1Name(centerName);
}
}
/**
* 递归设置成本中心
* @param entity
* @param costCenterList
* @param costCenter
* @param maxLevel 循环最大层级
*/
private void recursionInitCenter(BirActivityCenterGoods entity,
List<BmsCostCenter> costCenterList,
BmsCostCenter costCenter,
Integer maxLevel) {
maxLevel--;
for (BmsCostCenter nextTopCenter : costCenterList) {
if(nextTopCenter.getPid().equals(0L)){
entity.setCenterLv1Id(nextTopCenter.getId().toString());
entity.setCenterLv1Code(nextTopCenter.getCode());
entity.setCenterLv1Name(nextTopCenter.getName());
entity.setCenterLv2Id(costCenter.getId().toString());
entity.setCenterLv2Code(costCenter.getCode());
entity.setCenterLv2Name(costCenter.getName());
return;
}else {
if(maxLevel<0){
return;
}
this.recursionInitCenter(entity,costCenterList,nextTopCenter,maxLevel);
}
}
}
/**
* 获取项分割对象
* @param activityCenterGoods
* @param dateSplitList
* @param currDateSplit
* @param currentActDays
* @return
*/
private BirCenterGoodSplitDTO buildSplitAmount(TbsActivityCenterGoods activityCenterGoods,
List<DateSplitDTO> dateSplitList ,
DateSplitDTO currDateSplit,
Integer currentActDays){
//活动相关
BigDecimal activityAmt = activityCenterGoods.getActivityAmt();
BigDecimal activityCheckAmt = activityCenterGoods.getActivityCheckAmt();
//当前CenterGoods项金额
BigDecimal centerGoodsAmount = activityCenterGoods.getCenterGoodsAmount();
//当前CenterGoods分割项金额
BigDecimal currentSplitAmount = activityCenterGoods.getCenterGoodsAmount();
//当前CenterGoods项核销金额(粗略计算)
BigDecimal currentCheckAmount = activityCheckAmt
.multiply(activityCenterGoods.getCenterRate())
.multiply(activityCenterGoods.getCenterGoodsRate())
.divide(new BigDecimal("10000"),BigDecimal.ROUND_DOWN);
//当前CenterGoods分割项核销金额(粗略计算)
BigDecimal currentSplitCheckAmount = currentSplitAmount;
//日期占比
BigDecimal dayRate = new BigDecimal(currDateSplit.getDays() + "")
.divide(new BigDecimal(currentActDays + ""), 2, BigDecimal.ROUND_HALF_DOWN);
// sort==size 最后一个节点
if (currDateSplit.getSort().equals(dateSplitList.size())) {
for (DateSplitDTO splitDTO : dateSplitList) {
//跳过当前年月
if (splitDTO.getYearMonth().equals(currDateSplit.getYearMonth())) {
continue;
}
currentSplitAmount = currentSplitAmount.subtract(centerGoodsAmount.multiply(dayRate));
currentSplitCheckAmount = currentSplitCheckAmount.subtract(currentCheckAmount.multiply(dayRate));
break;
}
} else {
currentSplitAmount = centerGoodsAmount.multiply(dayRate);
currentSplitCheckAmount = currentCheckAmount.multiply(dayRate);
}
BirCenterGoodSplitDTO goodSplitDTO = new BirCenterGoodSplitDTO();
goodSplitDTO.setCurrentSplitAmount(currentSplitAmount);
goodSplitDTO.setCurrentSplitCheckAmount(currentSplitCheckAmount);
return goodSplitDTO;
}
}

194
src/main/java/com/qs/serve/modules/bir/service/impl/BirScheduleItemBudgetServiceImpl.java

@ -0,0 +1,194 @@
package com.qs.serve.modules.bir.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qs.serve.common.model.dto.DateSplitDTO;
import com.qs.serve.common.model.enums.BudgetLogOptFlag;
import com.qs.serve.common.util.Assert;
import com.qs.serve.common.util.DateSplitUtil;
import com.qs.serve.modules.tbs.entity.TbsBudget;
import com.qs.serve.modules.tbs.entity.TbsBudgetLog;
import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget;
import com.qs.serve.modules.tbs.mapper.TbsBudgetLogMapper;
import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper;
import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;
import com.qs.serve.modules.bir.entity.BirScheduleItemBudget;
import com.qs.serve.modules.bir.service.BirScheduleItemBudgetService;
import com.qs.serve.modules.bir.mapper.BirScheduleItemBudgetMapper;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 预算考核期项 服务实现类
* @author YenHex
* @since 2023-07-07
*/
@Slf4j
@Service
@AllArgsConstructor
public class BirScheduleItemBudgetServiceImpl extends ServiceImpl<BirScheduleItemBudgetMapper,BirScheduleItemBudget> implements BirScheduleItemBudgetService {
private final TbsBudgetMapper budgetMapper;
private final TbsBudgetLogMapper budgetLogMapper;
private final TbsScheduleItemBudgetMapper scheduleItemBudgetMapper;
@Override
public void buildScheduleItemBudget() {
//加载所有启用的预算
LambdaQueryWrapper<TbsBudget> lqw = new LambdaQueryWrapper<>();
lqw.select(TbsBudget::getId);
lqw.eq(TbsBudget::getBudgetState,1);
lqw.eq(TbsBudget::getBirFlag,0);
List<TbsBudget> budgetList = budgetMapper.selectList(lqw);
List<Long> budgetIds = budgetList.stream().map(TbsBudget::getId).collect(Collectors.toList());
//清空异动数据
LambdaQueryWrapper<BirScheduleItemBudget> rmLqw = new LambdaQueryWrapper<>();
rmLqw.in(BirScheduleItemBudget::getBudgetId,budgetIds);
this.remove(rmLqw);
//加载所有的调增调减预算
Map<Long, BigDecimal> budgetLogAmtMap = buildAdjustBudgetAmount(budgetIds);
//加载预算的周期金额
LambdaQueryWrapper<TbsScheduleItemBudget> sibLqw = new LambdaQueryWrapper<>();
sibLqw.in(TbsScheduleItemBudget::getBudgetId,budgetIds);
List<TbsScheduleItemBudget> scheduleItemBudgetList = scheduleItemBudgetMapper.selectList(sibLqw);
List<BirScheduleItemBudget> maintenanceList = new ArrayList<>();
for (TbsScheduleItemBudget scheduleItemBudget : scheduleItemBudgetList) {
// 调整金额
BigDecimal adjustAmount = budgetLogAmtMap.get(scheduleItemBudget.getId());
if(adjustAmount!=null){
scheduleItemBudget.setBudgetAmount(scheduleItemBudget.getBudgetAmount().add(adjustAmount));
}
// 按时间分割
LocalDate actStartDate = scheduleItemBudget.getStartDate().toLocalDate();
LocalDate actEndDate = scheduleItemBudget.getEndDate().toLocalDate();
int currentActDays = (int) (actEndDate.toEpochDay()-actStartDate.toEpochDay()+1);
List<DateSplitDTO> dateSplitList = DateSplitUtil.getSplitDto(actStartDate,actEndDate);
if(dateSplitList.size()>1){
//计算剩余
BigDecimal surplusScheduleBudget = scheduleItemBudget.getBudgetAmount();
BigDecimal surplusScheduleDispatch = scheduleItemBudget.getPreDispatchAmount();
for (DateSplitDTO currDateSplit : dateSplitList) {
//日期占比
BigDecimal dayRate = new BigDecimal(currDateSplit.getDays() + "")
.divide(new BigDecimal(currentActDays + ""), 2, BigDecimal.ROUND_HALF_DOWN);
//分割的金额
BigDecimal splitBudgetAmt;
BigDecimal splitDispatchAmt;
//最后一项
if(currDateSplit.getSort().equals(dateSplitList.size())){
splitBudgetAmt = surplusScheduleBudget;
splitDispatchAmt = surplusScheduleDispatch;
}else {
splitBudgetAmt = scheduleItemBudget.getBudgetAmount().multiply(dayRate);
splitDispatchAmt = scheduleItemBudget.getPreDispatchAmount().multiply(dayRate);
surplusScheduleBudget = surplusScheduleBudget.subtract(splitBudgetAmt);
surplusScheduleDispatch = surplusScheduleDispatch.subtract(splitDispatchAmt);
}
maintenanceList.add(
this.buildMainEntity(
scheduleItemBudget,
currDateSplit,
currentActDays,
splitBudgetAmt,
splitDispatchAmt)
);
}
}else if (dateSplitList.size()==1){
maintenanceList.add(
this.buildMainEntity(
scheduleItemBudget,
dateSplitList.get(0),
currentActDays,
scheduleItemBudget.getBudgetAmount(),
scheduleItemBudget.getPreDispatchAmount())
);
}else {
Assert.throwEx("Invalid date");
}
}
}
/**
* Builds the main entity
* @param source
* @param dateSplit
* @param totalDays
* @param splitBudgetAmount
* @param splitPreDispatchAmount
* @return
*/
public BirScheduleItemBudget buildMainEntity(TbsScheduleItemBudget source,DateSplitDTO dateSplit,
Integer totalDays,
BigDecimal splitBudgetAmount,
BigDecimal splitPreDispatchAmount){
BirScheduleItemBudget scheduleItemBudget = new BirScheduleItemBudget();
scheduleItemBudget.setId(source.getId());
scheduleItemBudget.setScheduleId(source.getScheduleId());
scheduleItemBudget.setScheduleItemId(source.getScheduleItemId());
scheduleItemBudget.setItemName(source.getItemName());
scheduleItemBudget.setBudgetStartDate(source.getStartDate());
scheduleItemBudget.setBudgetEndDate(source.getEndDate());
scheduleItemBudget.setBudgetId(source.getBudgetId());
scheduleItemBudget.setBudgetAmount(source.getBudgetAmount());
scheduleItemBudget.setPreDispatchAmount(source.getPreDispatchAmount());
scheduleItemBudget.setSplitBudgetAmount(splitBudgetAmount);
scheduleItemBudget.setSplitPreDispatchAmount(splitPreDispatchAmount);
scheduleItemBudget.setRemark(source.getRemark());
scheduleItemBudget.setCreateTime(source.getCreateTime());
scheduleItemBudget.setUpdateTime(source.getUpdateTime());
scheduleItemBudget.setTenantId(source.getTenantId());
scheduleItemBudget.setCreateBy(source.getCreateBy());
scheduleItemBudget.setUpdateBy(source.getUpdateBy());
scheduleItemBudget.setKeyNum(dateSplit.getYearMonth());
scheduleItemBudget.setMonthDays(dateSplit.getDays());
scheduleItemBudget.setTotalDays(totalDays);
scheduleItemBudget.setStartDate(dateSplit.getStartDate());
scheduleItemBudget.setEndDate(dateSplit.getEndDate());
return scheduleItemBudget;
}
/**
* 加载所有的调增调减预算
* @param budgetIds
* @return key -> scheduleItemBudgetId ; value -> 调整金额
*/
@NotNull
private Map<Long, BigDecimal> buildAdjustBudgetAmount(List<Long> budgetIds) {
LambdaQueryWrapper<TbsBudgetLog> budgetLogLqw = new LambdaQueryWrapper<>();
budgetLogLqw.select(TbsBudgetLog::getBudgetId,TbsBudgetLog::getAmount);
budgetLogLqw.in(TbsBudgetLog::getBudgetId,budgetIds);
budgetLogLqw.in(TbsBudgetLog::getOptType,
BudgetLogOptFlag.State_2.getCode(),
BudgetLogOptFlag.State_3.getCode());
List<TbsBudgetLog> budgetLogs = budgetLogMapper.selectList(budgetLogLqw);
Map<Long, BigDecimal> budgetLogAmtMap = new HashMap<>();
Map<Long,List<TbsBudgetLog>> budgetLogsGroup = budgetLogs.stream().collect(Collectors.groupingBy(TbsBudgetLog::getScheduleItemBudgetId));
for (Long budgetId : budgetLogsGroup.keySet()) {
BigDecimal adjustedAmount = BigDecimal.ZERO;
for (TbsBudgetLog budgetLog : budgetLogsGroup.get(budgetId)) {
if(budgetLog.getAmount() != null) {
adjustedAmount = adjustedAmount.add(budgetLog.getAmount());
}
}
budgetLogAmtMap.put(budgetId, adjustedAmount);
}
return budgetLogAmtMap;
}
}

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

@ -238,6 +238,17 @@ public class TbsActivityCenterGoods implements Serializable {
@TableField(exist = false)
private Long scheduleItemBudgetId;
/** 后台参数:用于生成BIR */
@TableField(exist = false)
private BigDecimal activityAmt;
/** 后台参数:用于生成BIR */
@TableField(exist = false)
private BigDecimal activityCheckAmt;
/** 后台参数:用于生成BIR */
@TableField(exist = false)
private Integer activityFinishedFlag;
public TbsBudgetCostItem toBudgetCostItem(){
TbsBudgetCostItem budgetCostItem = CopierUtil.copy(this,new TbsBudgetCostItem());

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

@ -90,6 +90,9 @@ public class TbsBudget implements Serializable {
/** 条件标识 */
private Integer conditionFlag;
/** 生成底表标识:默认0;同步成功为1 */
private Integer birFlag;
/** 创建时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")

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

@ -65,9 +65,11 @@ public class TbsScheduleItemBudget implements Serializable {
@NotNull(message = "预算金额不能为空")
private BigDecimal budgetAmount;
@NotNull(message = "预估发货金额")
private BigDecimal preDispatchAmount;
/** 备注 */
@Length(max = 255,message = "备注长度不能超过255字")
private String remark;

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

@ -42,7 +42,6 @@ public class TbsActivityTemplateBo implements Serializable {
/** 模板值 */
@NotBlank(message = "模板值不能为空")
@Length(max = 6000,message = "模板值长度不能超过6000字")
private String templateValue;
/** 备注 */
@ -77,7 +76,6 @@ public class TbsActivityTemplateBo implements Serializable {
private LocalDateTime endTime;
/** 费用申请主题 */
@Length(max = 255,message = "费用申请主题长度不能超过255字")
private String costTheme;
/** 费用申请主题能否编辑 */

128
src/main/resources/mapper/bir/BirActivityCenterGoodsMapper.xml

@ -0,0 +1,128 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qs.serve.modules.bir.mapper.BirActivityCenterGoodsMapper">
<resultMap id="birActivityCenterGoodsMap" type="com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods" >
<result property="id" column="id"/>
<result property="centerGoodsCode" column="center_goods_code"/>
<result property="costApplyId" column="cost_apply_id"/>
<result property="activityId" column="activity_id"/>
<result property="activityCode" column="activity_code"/>
<result property="subjectId" column="subject_id"/>
<result property="subjectCode" column="subject_code"/>
<result property="subjectName" column="subject_name"/>
<result property="centerType" column="center_type"/>
<result property="centerId" column="center_id"/>
<result property="centerCode" column="center_code"/>
<result property="centerName" column="center_name"/>
<result property="centerAmount" column="center_amount"/>
<result property="centerRate" column="center_rate"/>
<result property="centerGoodsAmount" column="center_goods_amount"/>
<result property="centerGoodsRate" column="center_goods_rate"/>
<result property="usedAmount" column="used_amount"/>
<result property="targetType" column="target_type"/>
<result property="targetId" column="target_id"/>
<result property="targetCode" column="target_code"/>
<result property="targetName" column="target_name"/>
<result property="targetLevelPathIds" column="target_level_path_ids"/>
<result property="targetLevelPathNames" column="target_level_path_names"/>
<result property="remark" column="remark"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
<result property="tenantId" column="tenant_id"/>
<result property="createBy" column="create_by"/>
<result property="updateBy" column="update_by"/>
<result property="delFlag" column="del_flag"/>
<result property="actStartDate" column="act_start_date"/>
<result property="actEndDate" column="act_end_date"/>
<result property="preStartDate" column="pre_start_date"/>
<result property="preEndDate" column="pre_end_date"/>
<result property="preCheckDate" column="pre_check_date"/>
<result property="tmpUk" column="tmp_uk"/>
<result property="supplierId" column="supplier_id"/>
<result property="supplierCode" column="supplier_code"/>
<result property="supplierName" column="supplier_name"/>
<result property="activityAmt" column="activity_amt"/>
<result property="activityFinishedFlag" column="activity_finished_flag"/>
<result property="activityCheckAmt" column="activity_check_amt"/>
</resultMap>
<sql id="tbsActivityCenterGoodsSql">
tbs_activity_center_goods.`id`,
tbs_activity_center_goods.`center_goods_code`,
tbs_activity_center_goods.`cost_apply_id`,
tbs_activity_center_goods.`activity_id`,
tbs_activity_center_goods.`activity_code`,
tbs_activity_center_goods.`subject_id`,
tbs_activity_center_goods.`subject_code`,
tbs_activity_center_goods.`subject_name`,
tbs_activity_center_goods.`center_type`,
tbs_activity_center_goods.`center_id`,
tbs_activity_center_goods.`center_code`,
tbs_activity_center_goods.`center_name`,
tbs_activity_center_goods.`center_amount`,
tbs_activity_center_goods.`center_rate`,
tbs_activity_center_goods.`center_goods_amount`,
tbs_activity_center_goods.`center_goods_rate`,
tbs_activity_center_goods.`used_amount`,
tbs_activity_center_goods.`target_type`,
tbs_activity_center_goods.`target_id`,
tbs_activity_center_goods.`target_code`,
tbs_activity_center_goods.`target_name`,
tbs_activity_center_goods.`target_level_path_ids`,
tbs_activity_center_goods.`target_level_path_names`,
tbs_activity_center_goods.`remark`,
tbs_activity_center_goods.`create_time`,
tbs_activity_center_goods.`update_time`,
tbs_activity_center_goods.`tenant_id`,
tbs_activity_center_goods.`create_by`,
tbs_activity_center_goods.`update_by`,
tbs_activity_center_goods.`del_flag`,
tbs_activity_center_goods.`act_start_date`,
tbs_activity_center_goods.`act_end_date`,
tbs_activity_center_goods.`pre_start_date`,
tbs_activity_center_goods.`pre_end_date`,
tbs_activity_center_goods.`pre_check_date`,
tbs_activity_center_goods.`tmp_uk`,
tbs_activity_center_goods.`supplier_id`,
tbs_activity_center_goods.`supplier_code`,
tbs_activity_center_goods.`supplier_name` </sql>
<select id="selectChangeCenterGoods" resultType="com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods">
select
tbs_activity.total_amount as activity_amt,
tbs_activity.used_amount as activity_check_amt,
tbs_activity.finished_flag as activity_finished_flag,
tbs_activity_center_goods.*
from tbs_activity_center_goods
left join tbs_activity
on tbs_activity.id = tbs_activity_center_goods.activity_id
left join bir_activity_center_goods
on tbs_activity_center_goods.id = bir_activity_center_goods.activity_center_goods_id
left join `tbs_cost_apply`
on `tbs_activity`.cost_apply_id = `tbs_cost_apply`.id
where
1=1
and tbs_activity.del_flag = 0
and tbs_cost_apply.charge_state !=0
and (
bir_activity_center_goods.activity_id is null
or bir_activity_center_goods.activity_total_amount != tbs_activity.total_amount
or bir_activity_center_goods.activity_total_check_amount != tbs_activity.used_amount
or bir_activity_center_goods.pre_start_date != tbs_activity.pre_start_date
or bir_activity_center_goods.pre_end_date != tbs_activity.pre_end_date
or bir_activity_center_goods.activity_finished_flag != `tbs_activity`.finished_flag
)
and (
(tbs_activity.act_start_date between #{startDate} and #{endDate})
or
(tbs_activity.act_end_date between #{startDate} and #{endDate})
or
(tbs_activity.act_end_date &gt;= #{endDate} and tbs_activity.act_start_date &lt;= #{startDate})
)
</select>
</mapper>
Loading…
Cancel
Save