From 39ae80ef282a058247155bed7af622778b6542a5 Mon Sep 17 00:00:00 2001 From: Yen Date: Tue, 21 Feb 2023 17:49:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=BF=E7=AD=96=E5=8F=91=E5=B8=83,=E6=94=BF?= =?UTF-8?q?=E7=AD=96=E9=A2=84=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/TbsBudgetApplicationService.java | 13 +- .../tzc/controller/TzcPolicyController.java | 16 + .../controller/TzcPolicyItemController.java | 5 +- .../serve/modules/tzc/entity/TzcPolicy.java | 9 + .../modules/tzc/entity/TzcPolicyGoods.java | 20 + .../modules/tzc/entity/TzcPolicyItem.java | 12 + .../modules/tzc/entity/bo/TzcPolicyBo.java | 1 - .../tzc/entity/bo/TzcPolicyItemBo.java | 8 +- .../tzc/service/TzcPolicyApplication.java | 382 ++++++++++++++++++ .../tzc/service/TzcPolicyGoodsService.java | 3 + .../impl/TzcPolicyGoodsServiceImpl.java | 8 + .../impl/TzcPolicyItemServiceImpl.java | 36 +- .../service/impl/TzcPolicyServiceImpl.java | 18 +- 13 files changed, 503 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplication.java diff --git a/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetApplicationService.java b/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetApplicationService.java index 06d0f058..892bd798 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetApplicationService.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetApplicationService.java @@ -207,6 +207,7 @@ public class TbsBudgetApplicationService { budgetList = new ArrayList<>(); } List noConditionBudgetList = new ArrayList<>(); + //加载预算条件和关联预算匹配,返回是否由无条件预算 boolean budgetNoCondition = this.loadConditionByBudgetsAndMatch(budgetList, noConditionBudgetList); //预算条件需包含活动条件, Map结构:活动id->满足的预算id列表 Map> activityAllowBudgetIdMap = this.buildActivityBudgetMap(activityList, budgetList, noConditionBudgetList); @@ -439,7 +440,7 @@ public class TbsBudgetApplicationService { List budgetList = allBudgetList.stream().filter(obj->allowBudgetIds.contains(obj.getId())).collect(Collectors.toList()); //PS:排序规则:优先为时间条件,其次匹配品牌条件 //按品类条件,提取可用预算(列表已按小维度到大维度排列) - List currentItemBudgetList = this.filterMatchGoodsCondition(budgetList, activityCostItem); + List currentItemBudgetList = this.filterMatchGoodsCondition(budgetList, activityCostItem.getTargetLevelPathIds()); //关联无条件预算 currentItemBudgetList.addAll(noConditionBudgetList); //提取可用预算的考核期 @@ -551,12 +552,12 @@ public class TbsBudgetApplicationService { /** * 按品类条件,提取可用预算 * @param budgetList - * @param activityCostItem + * @param targetLevelPathIds * @return */ @NotNull - private List filterMatchGoodsCondition(List budgetList,TbsActivityCenterGoods activityCostItem) { - String levelPath = activityCostItem.getTargetLevelPathIds(); + public List filterMatchGoodsCondition(List budgetList,String targetLevelPathIds) { + String levelPath = targetLevelPathIds; Set levelPathSet = new LinkedHashSet<>(); levelPathSet.add(levelPath); TbsBudgetCostUtil.buildPaths(levelPath,levelPathSet); @@ -582,6 +583,7 @@ public class TbsBudgetApplicationService { } /** + * 加载预算条件和关联预算匹配,返回是否由无条件预算 * 1.加载所有的条件 * 2.匹配初无条件预算 * 3.预算条件关联到预算对象中 @@ -589,7 +591,7 @@ public class TbsBudgetApplicationService { * @param noConditionBudgetList * @return 含有无条件预算标识 */ - private boolean loadConditionByBudgetsAndMatch( List budgetList, List noConditionBudgetList) { + public boolean loadConditionByBudgetsAndMatch( List budgetList, List noConditionBudgetList) { boolean budgetNoCondition = false; for (TbsBudget budget : budgetList) { if(budget.getConditionFlag().equals(1)){ @@ -647,6 +649,7 @@ public class TbsBudgetApplicationService { for (TbsActivity activity : activityList) { List budgetItemList = tbsScheduleItemBudgetService .betweenDateList(activity.getPreStartDate(),activity.getPreEndDate()); + //设置关联用于后面条件过滤 activity.setScheduleItemBudgetList(budgetItemList); if(CollectionUtil.isNotEmpty(budgetItemList)){ for (TbsScheduleItemBudget item : budgetItemList) { diff --git a/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyController.java b/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyController.java index 5b6ef9c5..932a32d2 100644 --- a/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyController.java +++ b/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyController.java @@ -6,6 +6,7 @@ import com.qs.serve.common.model.dto.PageVo; import com.qs.serve.common.model.dto.R; import com.qs.serve.common.model.enums.BizType; import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.common.util.AuthContextUtils; import com.qs.serve.common.util.PageUtil; import com.qs.serve.common.util.CopierUtil; import com.qs.serve.common.util.StringUtils; @@ -38,6 +39,21 @@ public class TzcPolicyController { private TzcPolicyService tzcPolicyService; private TzcPolicyItemService tzcPolicyItemService; + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/pageMy") + public R> getPageMy(TzcPolicy param){ + String userId = AuthContextUtils.getSysUserId(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + param.setUserId(userId); + PageUtil.startPage(); + List list = tzcPolicyService.list(lqw); + return R.byPageHelperList(list); + } + /** * 翻页 * @param param diff --git a/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java b/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java index d66e7fe0..113f27c7 100644 --- a/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java +++ b/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java @@ -91,6 +91,9 @@ public class TzcPolicyItemController { @SysLog(module = SystemModule.Policy, title = "政策项", biz = BizType.QUERY) public R getById(@PathVariable("id") String id){ TzcPolicyItem tzcPolicyItem = tzcPolicyItemService.getById(id); + List goodsList = tzcPolicyGoodsService.listByItemId(tzcPolicyItem.getId()); + goodsList.forEach(TzcPolicyGoods::initSpuSkuName); + tzcPolicyItem.setPolicyGoodsList(goodsList); return R.ok(tzcPolicyItem); } @@ -102,7 +105,6 @@ public class TzcPolicyItemController { */ @PostMapping("/updateById") @SysLog(module = SystemModule.Policy, title = "政策项", biz = BizType.UPDATE) - @PreAuthorize("hasRole('tzc:policy:insert')") public R updateById(@RequestBody @Valid TzcPolicyItemBo param){ if(param.getId()==null){ return R.error(); @@ -117,7 +119,6 @@ public class TzcPolicyItemController { */ @PostMapping("/save") @SysLog(module = SystemModule.Policy, title = "政策项", biz = BizType.INSERT) - @PreAuthorize("hasRole('tzc:policyItem:insert')") public R save(@RequestBody @Valid TzcPolicyItemBo param){ param.setId(null); return tzcPolicyItemService.modify(param); diff --git a/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicy.java b/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicy.java index d291af38..3a9ba47e 100644 --- a/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicy.java +++ b/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicy.java @@ -54,6 +54,15 @@ public class TzcPolicy implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private LocalDateTime passTime; + /** 政策项数量 */ + private Integer totalItems; + + /** 政策项总金额 */ + private BigDecimal totalItemAmount; + + /** 政策项总使用金额 */ + private BigDecimal totalItemUsedAmount; + /** 客户id */ @NotNull(message = "客户id不能为空") private Long supplierId; diff --git a/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyGoods.java b/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyGoods.java index 0701988f..c3797422 100644 --- a/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyGoods.java +++ b/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyGoods.java @@ -9,7 +9,9 @@ import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.modules.tbs.common.TbsGoodsType; import lombok.Data; +import lombok.extern.slf4j.Slf4j; import org.hibernate.validator.constraints.Length; import org.springframework.format.annotation.DateTimeFormat; @@ -21,6 +23,7 @@ import javax.validation.constraints.NotBlank; * @author YenHex * @since 2023-02-20 */ +@Slf4j @Data @TableName("tzc_policy_goods") public class TzcPolicyGoods implements Serializable { @@ -105,5 +108,22 @@ public class TzcPolicyGoods implements Serializable { @JsonProperty private String delFlag; + @TableField(exist = false) + private String spuName; + + @TableField(exist = false) + private String skuName; + + public void initSpuSkuName(){ + if(this.getTargetType().equals(TbsGoodsType.sku.name())){ + try { + String[] names = this.getTargetLevelPathNames().split("_"); + this.setSkuName(names[names.length-1]); + this.setSpuName(names[names.length-2]); + } catch (Exception e) { + log.error("格式错误:{}",this.getTargetLevelPathNames()); + } + } + } } diff --git a/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java b/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java index cac9d0e3..3fbe9a3d 100644 --- a/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java +++ b/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java @@ -9,12 +9,14 @@ import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; 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; +import java.util.List; /** * 政策项 实体类 @@ -69,6 +71,9 @@ public class TzcPolicyItem implements Serializable { @NotNull(message = "返点百分比不能为空") private BigDecimal discountRate; + /** 优惠上限 */ + private BigDecimal discountMax; + /** 已用金额 */ @NotNull(message = "已用金额不能为空") private BigDecimal usedAmount; @@ -170,6 +175,13 @@ public class TzcPolicyItem implements Serializable { @JsonProperty private String delFlag; + @TableField(exist = false) + private List policyGoodsList; + + /** 后端参数,预算考核期 */ + @TableField(exist = false) + List scheduleItemBudgetList; + public void initSetNull(){ this.setId(null); this.setCreateBy(null); diff --git a/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyBo.java b/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyBo.java index eb5edf99..9f29f271 100644 --- a/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyBo.java +++ b/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyBo.java @@ -35,7 +35,6 @@ public class TzcPolicyBo implements Serializable { private String title; /** 客户id */ - @NotNull(message = "客户id不能为空") private Long supplierId; /** 备注 */ diff --git a/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyItemBo.java b/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyItemBo.java index b59595ce..c229c9d1 100644 --- a/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyItemBo.java +++ b/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyItemBo.java @@ -43,7 +43,7 @@ public class TzcPolicyItemBo implements Serializable { private String centerId; /** 科目id */ - @NotNull(message = "科目id不能为空") + //@NotNull(message = "科目id不能为空") private Long subjectId; /** 开始时间 */ @@ -60,13 +60,13 @@ public class TzcPolicyItemBo implements Serializable { @NotNull(message = "满减金额不能为空") private BigDecimal discountAmount; + /** 优惠上限 */ + private BigDecimal discountMax; + /** 返点百分比 */ @NotNull(message = "返点百分比不能为空") private BigDecimal discountRate; - /** 已用金额 */ - @NotNull(message = "已用金额不能为空") - private BigDecimal usedAmount; @NotNull(message = "商品列表参数不能为空") List policyGoodsList; diff --git a/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplication.java b/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplication.java new file mode 100644 index 00000000..ea435f0d --- /dev/null +++ b/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplication.java @@ -0,0 +1,382 @@ +package com.qs.serve.modules.tzc.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.sys.service.SysConfigService; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper; +import com.qs.serve.modules.tbs.service.TbsBudgetApplicationService; +import com.qs.serve.modules.tbs.service.TbsBudgetConditionService; +import com.qs.serve.modules.tbs.service.TbsBudgetCostItemService; +import com.qs.serve.modules.tbs.service.TbsScheduleItemBudgetService; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import com.qs.serve.modules.tzc.entity.TzcPolicyGoods; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/2/20 + */ +@Service +@Slf4j +@AllArgsConstructor +public class TzcPolicyApplication { + + private TzcPolicyService tzcPolicyService; + private TzcPolicyGoodsService tzcPolicyGoodsService; + private TbsBudgetApplicationService budgetApplicationService; + private TbsScheduleItemBudgetService tbsScheduleItemBudgetService; + private TbsBudgetMapper tbsBudgetMapper; + private TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper; + private TbsBudgetConditionService tbsBudgetConditionService; + private TbsBudgetCostItemService tbsBudgetCostItemService; + private SysConfigService configService; + /** + * + * @param policyId + */ + public void commitPolicy(Long policyId){ + // + } + + /** + * 创建费用占用结果 + * @param costApplyId 用于加载历史预算时,排除当前费用占比 + * @param policyList 政策列表 + * @param policyItemList 政策项列表 + * @param policyGoodsList 政策商品 + * @param overspend 是否支持超出预算 + * @param throwEx 是否需要抛出异常 + * @param buildTableFlag 创建表VO + * @return + */ + public TbsBudgetCostResult buildBudgetCostResult(Long costApplyId, + List policyList, + List policyItemList, + List policyGoodsList, + Boolean overspend, + Boolean throwEx, + Boolean buildTableFlag){ + //考核期有关的预算id,判断逻辑为活动需要允许在 + List budgetIds = new ArrayList<>(); + //没有预算的活动 + Set noBudgetPolicyIds = new HashSet<>(); + //所有满足条件的考核期,用于加载历史核销费用 + List scheduleItemList = this.loadScheduleBudgetAndSetting(policyItemList, budgetIds, noBudgetPolicyIds); + List centerIds = policyItemList.stream().map(TzcPolicyItem::getCenterId).collect(Collectors.toList()); + List subjectIds = policyItemList.stream().map(TzcPolicyItem::getSubjectId).distinct().collect(Collectors.toList()); + List budgetList; + if(budgetIds.size()>0){ + LambdaQueryWrapper budgetLqw = new LambdaQueryWrapper<>(); + budgetLqw.in(TbsBudget::getId,budgetIds); + budgetLqw.and(qw->qw.eq(TbsBudget::getSubjectId,0).or(qw2->qw2.in(TbsBudget::getSubjectId,subjectIds))); + budgetLqw.in(TbsBudget::getCenterId,centerIds); + budgetLqw.eq(TbsBudget::getBudgetState,1); + budgetList = tbsBudgetMapper.selectList(budgetLqw); + }else { + budgetList = new ArrayList<>(); + } + List noConditionBudgetList = new ArrayList<>(); + //加载预算条件和关联预算匹配,返回是否由无条件预算 + boolean budgetNoCondition = budgetApplicationService.loadConditionByBudgetsAndMatch(budgetList, noConditionBudgetList); + //预算条件需包含活动条件, Map结构:活动id->满足的预算id列表 + Map> policyAllowBudgetIdMap = this.buildPolicyBudgetMap(policyItemList, budgetList, noConditionBudgetList); + //活动拦截 + if(!budgetNoCondition){ + this.handleNoBudgetPolicy(throwEx, overspend, policyItemList,noBudgetPolicyIds,policyAllowBudgetIdMap); + } + //统计所有占用预算金额 + Map budgetItemAmountMap = new HashMap<>(scheduleItemList.size()); + //统计费用申请占用金额 + Map budgetItemApplyAmountMap = new HashMap<>(scheduleItemList.size()); + for (TbsScheduleItemBudget itemBudget : scheduleItemList) { + BigDecimal budgetItemApplyAmount = tbsScheduleItemBudgetMapper.totalApplyAmount(itemBudget.getId(),costApplyId); + budgetItemApplyAmountMap.put(itemBudget.getId(),budgetItemApplyAmount); + BigDecimal budgetItemAmount = tbsScheduleItemBudgetMapper.totalCostAmount(itemBudget.getBudgetId(),itemBudget.getScheduleItemId(),costApplyId); + //因为结果为负数,需去相反数 + budgetItemAmount = budgetItemAmount==null?BigDecimal.ZERO:budgetItemAmount.negate(); + budgetItemAmountMap.put(itemBudget.getId(),budgetItemAmount); + } + //统计当前活动前置项占用预算 + Map counterMap = new HashMap<>(); + //匹配预算主要方法 + final List actMatchList = new ArrayList<>(); + final List actUnMatchList = new ArrayList<>(); + for (TzcPolicyGoods policyGoods : policyGoodsList) { +// this.matchPolicyMain(policyGoods,throwEx, overspend, activityList, budgetItemAmountMap, budgetList, +// noConditionBudgetList, counterMap, actMatchList, actUnMatchList,policyAllowBudgetIdMap,budgetItemApplyAmountMap); + } + return null; + } + + /** + * 匹配的主要方法 + * @param policyGoods 政策商品 + * @param throwEx 预算不够时抛出异常 + * @param overspend 超值标识 + * @param policyItemList 所有政策项 + * @param budgetItemAmountMap 统计所有占用预算金额 + * @param allBudgetList 所有预算 + * @param noConditionBudgetList 没有条件的预算列表 + * @param counterMap 历史预算占用 + * @param actMatchList 匹配预算占用的费用(含超支预算) + * @param actUnMatchList 没有匹配预算的费用 + * @param activityAllowBudgetIdMap 满足当前活动项的费用idMap + * @param budgetItemApplyAmountMap 统计费用申请占用金额 + */ + private void matchPolicyMain(TzcPolicyGoods policyGoods, + Boolean throwEx, + boolean overspend, + List policyItemList, + Map budgetItemAmountMap, + final List allBudgetList, + List noConditionBudgetList, + Map counterMap, + final List actMatchList, + final List actUnMatchList, + final Map> activityAllowBudgetIdMap, + Map budgetItemApplyAmountMap) { + //过滤满全条件的预算 + List allowBudgetIds = activityAllowBudgetIdMap.get(policyGoods.getPolicyItemId()); + List budgetList = allBudgetList.stream().filter(obj->allowBudgetIds.contains(obj.getId())).collect(Collectors.toList()); + //PS:排序规则:优先为时间条件,其次匹配品牌条件 + //按品类条件,提取可用预算(列表已按小维度到大维度排列) + List currentItemBudgetList = budgetApplicationService.filterMatchGoodsCondition(budgetList, policyGoods.getTargetLevelPathIds()); + //关联无条件预算 + currentItemBudgetList.addAll(noConditionBudgetList); + //提取可用预算的考核期 + List currentScheduleItemBudgets = new ArrayList<>(); + for (TzcPolicyItem policyItem : policyItemList) { + //忽略重叠情况 + if(!policyGoods.getPolicyItemId().equals(policyItem.getId())){ + continue; + } + //当前科目 + Long subjectId = policyItem.getSubjectId(); + //拦截非当前成本中心 + String centerId = policyItem.getCenterId(); + String centerType = policyItem.getCenterType(); + for (TbsBudget budget : currentItemBudgetList) { + if(!budget.getCenterId().equals(centerId) || + !budget.getCenterType().equals(centerType) ){ + continue; + } + if(!subjectId.equals(budget.getSubjectId())&&!budget.getSubjectId().equals(0L)){ + continue; + } + List scheduleItemBudgets = policyItem.getScheduleItemBudgetList(); + for (TbsScheduleItemBudget scheduleItemBudget : scheduleItemBudgets) { + if(scheduleItemBudget.getBudgetId().equals(budget.getId())){ + currentScheduleItemBudgets.add(scheduleItemBudget); + } + } + } + } + //检测是否有是否足够预算 +// BigDecimal goodsAmount = activityCostItem.getCenterGoodsAmount(); +// if(CollectionUtil.isNotEmpty(currentScheduleItemBudgets)){ +// boolean isMatch = false; +// for (TbsScheduleItemBudget itemBudget : currentScheduleItemBudgets) { +// //历史费用(含申请占用金额) +// BigDecimal totalUsed = budgetItemAmountMap.get(itemBudget.getId()); +// //当前项费用 +// BigDecimal budgetAmount = itemBudget.getBudgetAmount(); +// //前置费用 +// BigDecimal lastAmount = counterMap.get(itemBudget.getId()); +// if(lastAmount==null){ +// lastAmount = BigDecimal.ZERO; +// } +// //判断是否够用 +// if(budgetAmount.subtract(lastAmount).subtract(totalUsed).compareTo(goodsAmount)>0){ +// activityCostItem.setBudgetId(itemBudget.getBudgetId()); +// activityCostItem.setScheduleId(itemBudget.getScheduleId()); +// activityCostItem.setScheduleItemId(itemBudget.getScheduleItemId()); +// activityCostItem.setScheduleItemBudgetId(itemBudget.getId()); +// activityCostItem.setScheduleItemName(itemBudget.getItemName()); +// //绑定录入时可用预算 +// activityCostItem.setScheduleItemAmount(budgetAmount); +// //剩余的可用预算 +// activityCostItem.setScheduleItemAmountUsed(totalUsed); +// activityCostItem.setScheduleItemAmountApply(budgetItemApplyAmountMap.get(itemBudget.getId())); +// isMatch = true; +// //记录当前费用使用考核期费用 +// lastAmount = lastAmount.add(goodsAmount); +// counterMap.put(itemBudget.getId(),lastAmount); +// actMatchList.add(activityCostItem); +// break; +// } +// } +// //无匹配的预算 +// if(!isMatch){ +// if (throwEx){ +// Assert.throwEx("品类["+ activityCostItem.getTargetName()+"]预算不足"); +// } +// if(overspend){ +// TbsScheduleItemBudget itemBudget = currentScheduleItemBudgets.get(0); +// activityCostItem.setBudgetId(itemBudget.getBudgetId()); +// activityCostItem.setScheduleId(itemBudget.getScheduleId()); +// activityCostItem.setScheduleItemId(itemBudget.getScheduleItemId()); +// activityCostItem.setScheduleItemBudgetId(itemBudget.getId()); +// activityCostItem.setScheduleItemName(itemBudget.getItemName()); +// //记录当前费用使用考核期费用 +// BigDecimal lastAmount = counterMap.get(itemBudget.getId()); +// if(lastAmount==null){ +// lastAmount = BigDecimal.ZERO; +// } +// lastAmount = lastAmount.add(goodsAmount); +// counterMap.put(itemBudget.getId(),lastAmount); +// actMatchList.add(activityCostItem); +// }else{ +// activityCostItem.setBudgetId(0L); +// activityCostItem.setScheduleId(0L); +// activityCostItem.setScheduleItemId(0L); +// activityCostItem.setScheduleItemBudgetId(0L); +// activityCostItem.setScheduleItemName("无"); +// actUnMatchList.add(activityCostItem); +// } +// } +// }else { +// if(throwEx){ +// Assert.throwEx("品类["+ activityCostItem.getTargetName()+"]无可用预算"); +// } +// //添加到预算超支表 +// activityCostItem.setBudgetId(0L); +// activityCostItem.setScheduleId(0L); +// activityCostItem.setScheduleItemId(0L); +// activityCostItem.setScheduleItemBudgetId(0L); +// activityCostItem.setScheduleItemName("无"); +// actUnMatchList.add(activityCostItem); +// } + } + + /** + * 拦截没有预算的活动 + * @param throwEx 抛出异常 + * @param overspend 超支 + * @param policyItemList 活动列表 + * @param noBudgetPolicyIds 没有预算的活动id + * @param activityAllowBudgetIdMap 预算条件需包含活动条件, Map结构:活动id->满足的预算id列表 + */ + private void handleNoBudgetPolicy(Boolean throwEx, boolean overspend, List policyItemList, + Set noBudgetPolicyIds, + Map> activityAllowBudgetIdMap) { + if(!overspend && throwEx && noBudgetPolicyIds.size()>0){ + for (TzcPolicyItem policyItem : policyItemList) { + for (Long policyId : noBudgetPolicyIds) { + if(policyItem.getId().equals(policyId)){ + Assert.throwEx("["+policyItem.getPolicyItemCode()+"]无可用预算"); + } + } + List budgetIds = activityAllowBudgetIdMap.get(policyItem.getId()); + if(CollectionUtil.isEmpty(budgetIds)){ + Assert.throwEx("["+policyItem.getPolicyItemCode()+"]无可用预算"); + } + } + Assert.throwEx("无可用预算"); + } + } + + /** + * 预算条件需包含活动条件, Map结构:活动id->满足的预算id列表 + * @param policyItemList + * @param budgetList + * @param noConditionBudgetList + * @return + */ + private Map> buildPolicyBudgetMap(List policyItemList, + List budgetList, + List noConditionBudgetList) { + Map> activityAllowBudgetIdMap = new HashMap<>(); + for (TzcPolicyItem policyItem : policyItemList) { + Long policyItemId = policyItem.getId(); + List budgetIdsOfActivity = new ArrayList<>(); + if(CollectionUtil.isEmpty(noConditionBudgetList)){ + budgetIdsOfActivity.addAll(noConditionBudgetList.stream().map(TbsBudget::getId).collect(Collectors.toList())); + } + List policyGoodsList = tzcPolicyGoodsService.listByItemId(policyItemId); + for (TbsBudget budget : budgetList) { + if(budget.getConditionFlag().equals(1)){ + List budgetConditionList = budget.getBudgetConditionList(); + boolean hasNoMatch = false; + for (TzcPolicyGoods policyGoods : policyGoodsList) { + boolean matchGoods = false; + for (TbsBudgetCondition budgetCondition : budgetConditionList) { + if(policyGoods.getTargetLevelPathIds().contains(budgetCondition.getTargetLevelPathIds())){ + matchGoods = true; + break; + } + } + if(!matchGoods){ + hasNoMatch = true; + break; + } + } + if(!hasNoMatch){ + List budgetIds = activityAllowBudgetIdMap.get(policyItemId); + if(budgetIds==null){ + budgetIds = new ArrayList<>(); + } + budgetIds.add(budget.getId()); + budgetIds.addAll(budgetIdsOfActivity); + activityAllowBudgetIdMap.put(policyItemId,budgetIds); + } + }else { + List budgetIds = activityAllowBudgetIdMap.get(policyItemId); + if(budgetIds==null){ + budgetIds = new ArrayList<>(); + } + budgetIds.add(budget.getId()); + budgetIds.addAll(budgetIdsOfActivity); + activityAllowBudgetIdMap.put(policyItemId,budgetIds); + } + } + } + return activityAllowBudgetIdMap; + } + + /** + * 1.通过活动加载所有满足条件的考核期(用于加载历史核销费用), + * 2.设置没有可用预算的活动id + * 3.设置匹配的考核期列表到活动中 + * @param policyItemList -> item设置满足条件的考核期列表 + * @param budgetIds + * @param noBudgetPolicyItemIds 没有预算的政策项ID + * @return scheduleItemList 命中的考核期列表 + */ + public List loadScheduleBudgetAndSetting(List policyItemList, + List budgetIds, Set noBudgetPolicyItemIds) { + List scheduleItemList = new ArrayList<>(); + Set budgetIdsSet = new HashSet<>(); + Map allAllowScheduleItemTempMap = new HashMap<>(); + for (TzcPolicyItem policyItem : policyItemList) { + List budgetItemList = tbsScheduleItemBudgetService + .betweenDateList(policyItem.getPolicyStartDate(),policyItem.getPolicyEndDate()); + //设置关联用于后面条件过滤 + policyItem.setScheduleItemBudgetList(budgetItemList); + if(CollectionUtil.isNotEmpty(budgetItemList)){ + for (TbsScheduleItemBudget item : budgetItemList) { + budgetIdsSet.add(item.getBudgetId()); + allAllowScheduleItemTempMap.put(item.getId(),item); + } + }else { + noBudgetPolicyItemIds.add(policyItem.getId()); + } + } + for (Long tmpId : allAllowScheduleItemTempMap.keySet()) { + scheduleItemList.add(allAllowScheduleItemTempMap.get(tmpId)); + } + budgetIds.addAll(budgetIdsSet); + return scheduleItemList; + } + +} diff --git a/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyGoodsService.java b/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyGoodsService.java index 473fa2cd..9e9f478a 100644 --- a/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyGoodsService.java +++ b/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyGoodsService.java @@ -3,6 +3,7 @@ package com.qs.serve.modules.tzc.service; import com.baomidou.mybatisplus.extension.service.IService; import com.qs.serve.modules.tzc.entity.TzcPolicyGoods; import com.qs.serve.modules.tzc.entity.bo.TzcPolicyGoodsBo; +import java.util.List; /** * 政策商品 服务接口 @@ -11,5 +12,7 @@ import com.qs.serve.modules.tzc.entity.bo.TzcPolicyGoodsBo; */ public interface TzcPolicyGoodsService extends IService { + List listByItemId(Long itemId); + } diff --git a/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyGoodsServiceImpl.java b/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyGoodsServiceImpl.java index ca404948..3a9da505 100644 --- a/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyGoodsServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyGoodsServiceImpl.java @@ -18,6 +18,8 @@ import com.qs.serve.modules.tzc.entity.TzcPolicyGoods; import com.qs.serve.modules.tzc.service.TzcPolicyGoodsService; import com.qs.serve.modules.tzc.mapper.TzcPolicyGoodsMapper; +import java.util.List; + /** * 政策商品 服务实现类 * @author YenHex @@ -28,5 +30,11 @@ import com.qs.serve.modules.tzc.mapper.TzcPolicyGoodsMapper; @AllArgsConstructor public class TzcPolicyGoodsServiceImpl extends ServiceImpl implements TzcPolicyGoodsService { + @Override + public List listByItemId(Long itemId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TzcPolicyGoods::getPolicyItemId,itemId); + return this.list(lqw); + } } diff --git a/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyItemServiceImpl.java b/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyItemServiceImpl.java index 0731be51..3c0031fe 100644 --- a/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyItemServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyItemServiceImpl.java @@ -26,6 +26,7 @@ import com.qs.serve.modules.tzc.service.TzcPolicyItemService; import com.qs.serve.modules.tzc.mapper.TzcPolicyItemMapper; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -62,23 +63,27 @@ public class TzcPolicyItemServiceImpl extends ServiceImpl policyItemList = this.listByPolicyId(tzcPolicy.getId()); + tzcPolicyItem.setPolicyItemCode(tzcPolicy.getPolicyCode()+"_"+(policyItemList.size()+1)); } - List policyItemList = this.listByPolicyId(tzcPolicy.getId()); - BmsSubject bmsSubject = bmsSubjectService.getById(param.getSubjectId()); + BmsSubject bmsSubject = bmsSubjectService.getByCode("FYMC05"); TbsCenterDto centerDto = tbsCenterDtoService.getCenterDto(param.getCenterType(),param.getCenterId()); - TzcPolicyItem tzcPolicyItem = new TzcPolicyItem(); - tzcPolicyItem.setId(param.getId()); tzcPolicyItem.setPolicyId(param.getPolicyId()); tzcPolicyItem.setPolicyStartDate(param.getPolicyStartDate()); tzcPolicyItem.setPolicyEndDate(param.getPolicyEndDate()); tzcPolicyItem.setDiscountAmount(param.getDiscountAmount()); tzcPolicyItem.setDiscountRate(param.getDiscountRate()); - tzcPolicyItem.setUsedAmount(param.getUsedAmount()); + tzcPolicyItem.setDiscountMax(param.getDiscountMax()); + //tzcPolicyItem.setUsedAmount(param.getUsedAmount()); tzcPolicyItem.setCenterType(centerDto.getCenterType()); tzcPolicyItem.setCenterId(centerDto.getId()); tzcPolicyItem.setCenterCode(centerDto.getCenterCode()); @@ -86,7 +91,6 @@ public class TzcPolicyItemServiceImpl extends ServiceImpla.setPolicyItemId(itemId)); + tzcPolicyGoodsList.forEach(a->{ + a.setPolicyItemId(itemId); + a.setPolicyItemCode(tzcPolicyItem.getPolicyItemCode()); + }); tzcPolicyGoodsService.saveBatch(tzcPolicyGoodsList); + //更新政策数量 + List policyItemList = this.listByPolicyId(tzcPolicy.getId()); + BigDecimal totalAmount = BigDecimal.ZERO; + BigDecimal totalUsedAmount = BigDecimal.ZERO; + for (TzcPolicyItem policyItem : policyItemList) { + totalAmount = totalAmount.add(policyItem.getDiscountMax()); + totalUsedAmount = totalUsedAmount.add(policyItem.getUsedAmount()); + } + TzcPolicy policyParam = new TzcPolicy(); + policyParam.setTotalItemAmount(totalAmount); + policyParam.setTotalItemUsedAmount(totalUsedAmount); + policyParam.setTotalItems(policyItemList.size()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TzcPolicy::getId,param.getPolicyId()); + tzcPolicyMapper.update(policyParam,lqw); return R.ok(tzcPolicyItem); } diff --git a/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyServiceImpl.java b/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyServiceImpl.java index ffe756ff..cb860961 100644 --- a/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyServiceImpl.java @@ -52,17 +52,17 @@ public class TzcPolicyServiceImpl extends ServiceImpl } }else { tzcPolicy = new TzcPolicy(); - tzcPolicy.setPolicyCode(IdUtil.getSnowflake()+""); + tzcPolicy.setPolicyCode(IdUtil.dateTimeStampId()+""); + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + tzcPolicy.setUserId(sysUser.getId()); + tzcPolicy.setUserCode(sysUser.getCode()); + tzcPolicy.setUserName(sysUser.getName()); + BmsSupplier supplier = bmsSupplierService.getById(policyParam.getSupplierId()); + tzcPolicy.setSupplierId(policyParam.getSupplierId()); + tzcPolicy.setSupplierCode(supplier.getCode()); + tzcPolicy.setSupplierName(supplier.getName()); } - BmsSupplier supplier = bmsSupplierService.getById(policyParam.getSupplierId()); - SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); tzcPolicy.setTitle(policyParam.getTitle()); - tzcPolicy.setSupplierId(policyParam.getSupplierId()); - tzcPolicy.setSupplierCode(supplier.getCode()); - tzcPolicy.setSupplierName(supplier.getName()); - tzcPolicy.setUserId(sysUser.getId()); - tzcPolicy.setUserCode(sysUser.getCode()); - tzcPolicy.setUserName(sysUser.getName()); tzcPolicy.setRemark(policyParam.getRemark()); this.saveOrUpdate(tzcPolicy); return R.ok(tzcPolicy);