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 6b85d173..9df0d154 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 @@ -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> getStandingBook(){ + public R> getStandingBook(String type){ + List 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 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(); + } /** * 获取费率 diff --git a/src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java b/src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java index 49e785d4..f638b914 100644 --- a/src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java +++ b/src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java @@ -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; - } - } diff --git a/src/main/java/com/qs/serve/modules/bir/entity/BirScheduleItemBudget.java b/src/main/java/com/qs/serve/modules/bir/entity/BirScheduleItemBudget.java new file mode 100644 index 00000000..f1758afc --- /dev/null +++ b/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; + + +} + diff --git a/src/main/java/com/qs/serve/modules/bir/entity/dto/BirCenterGoodSplitDTO.java b/src/main/java/com/qs/serve/modules/bir/entity/dto/BirCenterGoodSplitDTO.java new file mode 100644 index 00000000..961fe7bc --- /dev/null +++ b/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; + +} diff --git a/src/main/java/com/qs/serve/modules/bir/mapper/BirActivityCenterGoodsMapper.java b/src/main/java/com/qs/serve/modules/bir/mapper/BirActivityCenterGoodsMapper.java index f91b9a49..87091173 100644 --- a/src/main/java/com/qs/serve/modules/bir/mapper/BirActivityCenterGoodsMapper.java +++ b/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 { + /** + * 查询出异动的记录 + * @param startDate + * @param endDate + * @return + */ + List selectChangeCenterGoods(@Param("startDate") LocalDate startDate, + @Param("endDate")LocalDate endDate); } diff --git a/src/main/java/com/qs/serve/modules/bir/mapper/BirScheduleItemBudgetMapper.java b/src/main/java/com/qs/serve/modules/bir/mapper/BirScheduleItemBudgetMapper.java new file mode 100644 index 00000000..4435d969 --- /dev/null +++ b/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 { + +} + diff --git a/src/main/java/com/qs/serve/modules/bir/service/BirActivityCenterGoodsService.java b/src/main/java/com/qs/serve/modules/bir/service/BirActivityCenterGoodsService.java index d41782fb..7a3a3855 100644 --- a/src/main/java/com/qs/serve/modules/bir/service/BirActivityCenterGoodsService.java +++ b/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 { + /** + * 创建分割统计表 + * @param year + * @param month + */ + void buildReport(int year, int month); + + + } diff --git a/src/main/java/com/qs/serve/modules/bir/service/BirScheduleItemBudgetService.java b/src/main/java/com/qs/serve/modules/bir/service/BirScheduleItemBudgetService.java new file mode 100644 index 00000000..369fc6d6 --- /dev/null +++ b/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 { + + /** + * 创建数据 + */ + void buildScheduleItemBudget(); + +} + diff --git a/src/main/java/com/qs/serve/modules/bir/service/impl/BirActivityCenterGoodsServiceImpl.java b/src/main/java/com/qs/serve/modules/bir/service/impl/BirActivityCenterGoodsServiceImpl.java index 32ed1938..c4cfa280 100644 --- a/src/main/java/com/qs/serve/modules/bir/service/impl/BirActivityCenterGoodsServiceImpl.java +++ b/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 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 activityCenterGoodsAllList = this.baseMapper.selectChangeCenterGoods(startDate,endDate); + if(activityCenterGoodsAllList.size()<1){ + return; + } + // 删除历史数据 + List activityIds = activityCenterGoodsAllList.stream().filter(a->a.getId()!=null) + .map(TbsActivityCenterGoods::getActivityId).collect(Collectors.toList()); + LambdaQueryWrapper birBaseActivityLqw = new LambdaQueryWrapper<>(); + birBaseActivityLqw.in(BirActivityCenterGoods::getActivityId,activityIds); + this.remove(birBaseActivityLqw); + + //加载所有自定义成本中心 + List costCenterList = costCenterMapper.selectList(new QueryWrapper<>()); + + // 按活动id分组 + Map> collectMap = activityCenterGoodsAllList.stream() + .collect(Collectors.groupingBy(TbsActivityCenterGoods::getActivityId)); + + for (Long activityId : collectMap.keySet()) { + //用于保存的对象列表 + List bacgList = new ArrayList<>(); + //创建对象列表 + List 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 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 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 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 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 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; + } } diff --git a/src/main/java/com/qs/serve/modules/bir/service/impl/BirScheduleItemBudgetServiceImpl.java b/src/main/java/com/qs/serve/modules/bir/service/impl/BirScheduleItemBudgetServiceImpl.java new file mode 100644 index 00000000..16989411 --- /dev/null +++ b/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 implements BirScheduleItemBudgetService { + + private final TbsBudgetMapper budgetMapper; + private final TbsBudgetLogMapper budgetLogMapper; + private final TbsScheduleItemBudgetMapper scheduleItemBudgetMapper; + + @Override + public void buildScheduleItemBudget() { + //加载所有启用的预算 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(TbsBudget::getId); + lqw.eq(TbsBudget::getBudgetState,1); + lqw.eq(TbsBudget::getBirFlag,0); + List budgetList = budgetMapper.selectList(lqw); + List budgetIds = budgetList.stream().map(TbsBudget::getId).collect(Collectors.toList()); + //清空异动数据 + LambdaQueryWrapper rmLqw = new LambdaQueryWrapper<>(); + rmLqw.in(BirScheduleItemBudget::getBudgetId,budgetIds); + this.remove(rmLqw); + //加载所有的调增调减预算 + Map budgetLogAmtMap = buildAdjustBudgetAmount(budgetIds); + //加载预算的周期金额 + LambdaQueryWrapper sibLqw = new LambdaQueryWrapper<>(); + sibLqw.in(TbsScheduleItemBudget::getBudgetId,budgetIds); + List scheduleItemBudgetList = scheduleItemBudgetMapper.selectList(sibLqw); + List 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 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 buildAdjustBudgetAmount(List budgetIds) { + LambdaQueryWrapper 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 budgetLogs = budgetLogMapper.selectList(budgetLogLqw); + Map budgetLogAmtMap = new HashMap<>(); + Map> 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; + } + + +} + diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java b/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java index 0d5e79a6..30df6321 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java +++ b/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()); diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudget.java b/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudget.java index f1e90683..aab75398 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudget.java +++ b/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") diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/TbsScheduleItemBudget.java b/src/main/java/com/qs/serve/modules/tbs/entity/TbsScheduleItemBudget.java index f5aaaeb2..8dbad964 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/TbsScheduleItemBudget.java +++ b/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; diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityTemplateBo.java b/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityTemplateBo.java index 8254c1a7..8cce73a9 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityTemplateBo.java +++ b/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; /** 费用申请主题能否编辑 */ diff --git a/src/main/resources/mapper/bir/BirActivityCenterGoodsMapper.xml b/src/main/resources/mapper/bir/BirActivityCenterGoodsMapper.xml new file mode 100644 index 00000000..8765aaf2 --- /dev/null +++ b/src/main/resources/mapper/bir/BirActivityCenterGoodsMapper.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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` + + + + + +