From 9f15e2964fb44b039305da75d2e843f8d04b01db Mon Sep 17 00:00:00 2001 From: Yen Date: Mon, 19 Dec 2022 09:19:58 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A2=84=E7=AE=97=E4=B8=8E=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E6=9D=A1=E4=BB=B6=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/TbsBudgetApplicationService.java | 86 +++++++++++++++++-- 1 file changed, 79 insertions(+), 7 deletions(-) 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 64f19677..2a697c9e 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 @@ -10,6 +10,7 @@ import com.qs.serve.modules.tbs.common.util.TbsBudgetCostUtil; import com.qs.serve.modules.tbs.entity.*; import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableVo; +import com.qs.serve.modules.tbs.mapper.TbsActivityGoodsMapper; import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; import lombok.AllArgsConstructor; @@ -38,6 +39,7 @@ public class TbsBudgetApplicationService { private TbsBudgetCostItemService tbsBudgetCostItemService; private SysConfigService configService; private TbsActivityMapper activityMapper; + private TbsActivityGoodsMapper activityGoodsMapper; public TbsBudgetTableVo buildResultTable(Long costApplyId){ //加载活动 @@ -182,8 +184,10 @@ public class TbsBudgetApplicationService { } List noConditionBudgetList = new ArrayList<>(); boolean budgetNoCondition = this.loadConditionByBudgetsAndMatch(budgetList, noConditionBudgetList); + //预算条件需包含活动条件, Map结构:活动id->满足的预算id列表 + Map> activityAllowBudgetIdMap = this.buildActivityBudgetMap(activityList, budgetList, noConditionBudgetList); //活动拦截 - this.handleNoBudgetActivity(throwEx, overspend, activityList, noBudgetActivityIds, budgetNoCondition); + this.handleNoBudgetActivity(throwEx, overspend, activityList, noBudgetActivityIds, budgetNoCondition,activityAllowBudgetIdMap); //统计当前活动前置项占用预算 Map counterMap = new HashMap<>(); //匹配预算主要方法 @@ -191,7 +195,7 @@ public class TbsBudgetApplicationService { final List actUnMatchList = new ArrayList<>(); for (TbsActivityCenterGoods activityCostItem : centerGoodsList) { this.matchActivityMain(activityCostItem,throwEx, overspend, activityList, hisCostGroupByItemBudget, budgetList, - noConditionBudgetList, counterMap, actMatchList, actUnMatchList); + noConditionBudgetList, counterMap, actMatchList, actUnMatchList,activityAllowBudgetIdMap); } List budgetMatchList = actMatchList.stream() .map(TbsActivityCenterGoods::toBudgetCostItem).collect(Collectors.toList()); @@ -209,6 +213,57 @@ public class TbsBudgetApplicationService { return result; } + /** + * 预算条件需包含活动条件, Map结构:活动id->满足的预算id列表 + * @param activityList + * @param budgetList + * @param noConditionBudgetList + * @return + */ + private Map> buildActivityBudgetMap(List activityList, + List budgetList, + List noConditionBudgetList) { + Map> activityAllowBudgetIdMap = new HashMap<>(); + for (TbsActivity activity : activityList) { + List budgetIdsOfActivity = new ArrayList<>(); + if(CollectionUtil.isEmpty(noConditionBudgetList)){ + budgetIdsOfActivity.addAll(noConditionBudgetList.stream().map(TbsBudget::getId).collect(Collectors.toList())); + } + LambdaQueryWrapper goodsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + goodsLambdaQueryWrapper.eq(TbsActivityGoods::getActivityId,activity.getId()); + List activityGoodsList = activityGoodsMapper.selectList(goodsLambdaQueryWrapper); + for (TbsBudget budget : budgetList) { + if(budget.getConditionFlag().equals(1)){ + List budgetConditionList = budget.getBudgetConditionList(); + boolean hasNoMatch = false; + for (TbsActivityGoods activityGoods : activityGoodsList) { + boolean matchGoods = false; + for (TbsBudgetCondition budgetCondition : budgetConditionList) { + if(activityGoods.getTargetLevelPathIds().contains(budgetCondition.getTargetLevelPathIds())){ + matchGoods = true; + break; + } + } + if(!matchGoods){ + hasNoMatch = true; + break; + } + } + if(!hasNoMatch){ + List budgetIds = activityAllowBudgetIdMap.get(activity.getId()); + if(budgetIds==null){ + budgetIds = new ArrayList<>(); + } + budgetIds.add(budget.getId()); + activityAllowBudgetIdMap.put(activity.getId(),budgetIds); + } + } + } + activityAllowBudgetIdMap.put(activity.getId(),budgetIdsOfActivity); + } + return activityAllowBudgetIdMap; + } + /** * 建立费用预算表 * @param activityList @@ -316,23 +371,28 @@ public class TbsBudgetApplicationService { * @param overspend 超值标识 * @param activityList 所有活动 * @param hisCostGroupByItemBudget 历史费用组 - * @param budgetList 所有预算 + * @param allBudgetList 所有预算 * @param noConditionBudgetList 没有条件的预算列表 * @param counterMap 历史预算占用 * @param actMatchList 匹配预算占用的费用(含超支预算) * @param actUnMatchList 没有匹配预算的费用 + * @param activityAllowBudgetIdMap 满足当前活动项的费用idMap */ private void matchActivityMain(TbsActivityCenterGoods activityCostItem, Boolean throwEx, boolean overspend, List activityList, Map> hisCostGroupByItemBudget, - List budgetList, + final List allBudgetList, List noConditionBudgetList, Map counterMap, final List actMatchList, - final List actUnMatchList) { - //PS:排序规则:优先匹配品牌条件,其次为时间条件 + final List actUnMatchList, + final Map> activityAllowBudgetIdMap) { + //过滤满全条件的预算 + List allowBudgetIds = activityAllowBudgetIdMap.get(activityCostItem.getActivityId()); + List budgetList = allBudgetList.stream().filter(obj->allowBudgetIds.contains(obj.getId())).collect(Collectors.toList()); + //PS:排序规则:优先为时间条件,其次匹配品牌条件 //按品类条件,提取可用预算(列表已按小维度到大维度排列) List currentItemBudgetList = this.filterMatchGoodsCondition(budgetList, activityCostItem); //关联无条件预算 @@ -478,7 +538,8 @@ public class TbsBudgetApplicationService { * @param budgetNoCondition 标识,没有条件的预算 */ private void handleNoBudgetActivity(Boolean throwEx, boolean overspend, List activityList, - List noBudgetActivityIds, boolean budgetNoCondition) { + List noBudgetActivityIds, boolean budgetNoCondition, + Map> activityAllowBudgetIdMap) { if(!overspend && !budgetNoCondition && throwEx && noBudgetActivityIds.size()>0){ for (Long activityId : noBudgetActivityIds) { for (TbsActivity activity : activityList) { @@ -489,6 +550,17 @@ public class TbsBudgetApplicationService { } Assert.throwEx("活动无可用预算"); } + if(throwEx){ + for (Long activityId : activityAllowBudgetIdMap.keySet()) { + if(activityAllowBudgetIdMap.get(activityId).size()<1){ + for (TbsActivity activity : activityList) { + if(activity.getId().equals(activityId)){ + Assert.throwEx("活动["+activity.getActivityCode()+"]无可用预算"); + } + } + } + } + } } /**