Browse Source

活动底表分割

contract
Yen 2 years ago
parent
commit
425d7aa7ea
  1. 14
      src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java
  2. 20
      src/main/java/com/qs/serve/modules/bir/entity/dto/BirCenterGoodSplitDTO.java
  3. 13
      src/main/java/com/qs/serve/modules/bir/mapper/BirActivityCenterGoodsMapper.java
  4. 7
      src/main/java/com/qs/serve/modules/bir/service/BirActivityCenterGoodsService.java
  5. 267
      src/main/java/com/qs/serve/modules/bir/service/impl/BirActivityCenterGoodsServiceImpl.java
  6. 11
      src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java
  7. 120
      src/main/resources/mapper/bir/BirActivityCenterGoodsMapper.xml

14
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")
@ -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;
@ -264,6 +273,9 @@ public class BirActivityCenterGoods implements Serializable {
activityCenterGoods.setCostApplyId(source.getCostApplyId());
activityCenterGoods.setActivityId(source.getActivityId());
activityCenterGoods.setActivityCode(source.getActivityCode());
activityCenterGoods.setActivityTotalAmount(source.getActivityTotalAmount());
activityCenterGoods.setActivityTotalCheckAmount(source.getActivityTotalCheckAmount());
activityCenterGoods.setActivityFinishedFlag(source.getActivityFinishedFlag());
activityCenterGoods.setSubjectId(source.getSubjectId());
activityCenterGoods.setSubjectCode(source.getSubjectCode());
activityCenterGoods.setSubjectName(source.getSubjectName());

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);
}

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

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

267
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,254 @@ 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);
}
}
}
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.setYearMonth(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 ("bizRegion".equals(centerType)){
BmsRegion region = regionMapper.selectById(centerId);
String[] regionIds = region.getPathIds().split("_");
entity.setCenterLv1Id(regionIds[0]);
if(regionIds.length>1){
entity.setCenterLv2Id(regionIds[1]);
}
}else if ("saleRegion".equals(centerType)){
BmsRegion2 region = region2Mapper.selectById(centerId);
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
* @param activityCheckAmt
* @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;
}
}

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());

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

@ -0,0 +1,120 @@
<?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"/>
</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_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