From 69115747e205b64e1ade3829ed3292312bf52e6a Mon Sep 17 00:00:00 2001 From: xiaohu <1901900812@qq.com> Date: Sun, 23 Feb 2025 01:52:46 +0800 Subject: [PATCH] //offline --- ...xOfflineActivityGrantAwardServiceImpl.java | 128 +++++++++++------- ...ineActivityGrantSettlementServiceImpl.java | 47 +++++-- .../WxOfflineActivityGrantCashBackMapper.xml | 2 +- 3 files changed, 112 insertions(+), 65 deletions(-) diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantAwardServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantAwardServiceImpl.java index 69a6ed63f..ddd44d151 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantAwardServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantAwardServiceImpl.java @@ -179,14 +179,22 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity //订单合并计算 handlerGrantData(activity,wxOfflineActivityGrantAward,true); - //奖项处理 + //订单参数处理 List activityItemList = wxOfflineActivityItemService.getActivityItemList(activity.getId(), activity.getTenantId()); if(wxOfflineActivityGrantAward.getActivityItemList() != null && !wxOfflineActivityGrantAward.getActivityItemList().isEmpty()){ Map> ActivityItemRecordMap = wxOfflineActivityGrantAward.getActivityItemList().stream().collect(toMap(WxOfflineActivityItem::getId, WxOfflineActivityItem::getRecordIds)); for (WxOfflineActivityItem activityItem : activityItemList) { - List records = ActivityItemRecordMap.get(activityItem.getId()); - if(records != null && !records.isEmpty()){ + if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){ + List records = ActivityItemRecordMap.get(activityItem.getId()); + if(records == null || records.isEmpty()){ + throw new MallinkException(Result.ERROR, "发奖未选择订单"); + } activityItem.setRecordIds(records); + List collect = wxOfflineActivityGrantAward.getRecordList().stream() + .filter(record -> activityItem.getRecordIds().contains(record.getId())).collect(toList()); + activityItem.setRecordList(collect); + }else{ + activityItem.setRecordList(wxOfflineActivityGrantAward.getRecordList()); } } } @@ -200,7 +208,7 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity //处理发奖数量 activityItem.setIsMeet(true); - handleLotteryDrawCount(activityItem,wxOfflineActivityGrantAward.getRecordList()); + handleLotteryDrawCount(activityItem,activityItem.getRecordList()); if(activityItem.getRealAwardsItemLimit() == 0){ activityItem.setIsMeet(false); } @@ -211,7 +219,7 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity handlerAwardsSharePrice(activityItem.getActivityAwardsItemList()); //处理发放奖项 - handleGiftAwards(activityItem,wxOfflineActivityGrantAward.getRecordList()); + handleGiftAwards(activityItem,activityItem.getRecordList()); activityItem.setIsMeet(true); if(activityItem.getActivityGrantItemList() == null || activityItem.getActivityGrantItemList().isEmpty()){ activityItem.setIsMeet(false); @@ -222,11 +230,13 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity BigDecimal cashBackPriceTotal = BigDecimal.ZERO; List grantItemList = new ArrayList<>(); + BigDecimal orderMoneySum = activityItem.getRecordList().stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); + List sortAwardsItemList = activityItem.getActivityAwardsItemList().stream().sorted(Comparator.comparing(WxOfflineActivityAwardsItem::getMinAmount)).collect(toList()); //单笔订单计算 if(EnumOfflineActivityMode.ONE.getCode().equals(activityItem.getModeType())){ - for (WxOfflineActivityRecord record : wxOfflineActivityGrantAward.getRecordList()){ + for (WxOfflineActivityRecord record : activityItem.getRecordList()){ WxOfflineActivityAwardsItem grantAwardsItem = null; for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){ if((awardsItem.getMinAmount() == null || record.getOrderMoney().compareTo(awardsItem.getMinAmount()) >= 0) @@ -275,16 +285,16 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity } }else{ - BigDecimal orderMoneySum = wxOfflineActivityGrantAward.getRecordList().stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); - if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){ - if(activityItem.getRecordIds() != null && !activityItem.getRecordIds().isEmpty()){ - orderMoneySum = wxOfflineActivityGrantAward.getRecordList().stream() - .filter(record -> activityItem.getRecordIds().contains(record.getId())) - .map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); - }else{ - orderMoneySum = BigDecimal.ZERO; - } - } +// BigDecimal orderMoneySum = activityItem.getRecordList().stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); +// if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){ +// if(activityItem.getRecordIds() != null && !activityItem.getRecordIds().isEmpty()){ +// orderMoneySum = wxOfflineActivityGrantAward.getRecordList().stream() +// .filter(record -> activityItem.getRecordIds().contains(record.getId())) +// .map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); +// }else{ +// orderMoneySum = BigDecimal.ZERO; +// } +// } WxOfflineActivityAwardsItem grantAwardsItem = null; for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){ @@ -302,13 +312,13 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity } - Integer jointCount = getJointCount(activityItem,wxOfflineActivityGrantAward.getRecordList()); + Integer jointCount = getJointCount(activityItem,activityItem.getRecordList()); if(jointCount != 0 && activityItem.getActivityAwardsItemSecondList() != null && !activityItem.getActivityAwardsItemSecondList().isEmpty()){ Map jointCountMap = activityItem.getActivityAwardsItemSecondList().stream().collect(toMap(WxOfflineActivityAwardsItem::getMerchantCount, Function.identity())); WxOfflineActivityAwardsItem grantAwardsSecondItem = jointCountMap.get(jointCount); if(grantAwardsSecondItem != null){ //计算返现金额 - BigDecimal cashBackPrice = wxOfflineActivityGrantAward.getOrderMoneySum() + BigDecimal cashBackPrice = orderMoneySum .multiply(grantAwardsSecondItem.getCashBackRatio().divide(new BigDecimal(100))); cashBackPriceTotal = cashBackPriceTotal.add(cashBackPrice); } @@ -386,20 +396,16 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity }else{ BigDecimal orderMoneySum = recordList.stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); - if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){ - if(activityItem.getRecordIds() != null && !activityItem.getRecordIds().isEmpty()){ - orderMoneySum = recordList.stream() - .filter(record -> activityItem.getRecordIds().contains(record.getId())) - .map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); - }else{ - orderMoneySum = BigDecimal.ZERO; - } - - } +// if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){ +// if(activityItem.getRecordList() != null && !activityItem.getRecordList().isEmpty()){ +// orderMoneySum = activityItem.getRecordList().stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); +// }else{ +// orderMoneySum = BigDecimal.ZERO; +// } +// } if(activityItem.getAwardsItemPrice() != null && activityItem.getAwardsItemPrice().compareTo(BigDecimal.ZERO) > 0){ limitCount = orderMoneySum.divide(activityItem.getAwardsItemPrice(),0, RoundingMode.HALF_DOWN).intValue(); } - } Integer jointCount = getJointCount(activityItem,recordList); @@ -448,15 +454,15 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity } }else{ BigDecimal orderMoneySum = recordList.stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); - if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){ - if(activityItem.getRecordIds() != null && !activityItem.getRecordIds().isEmpty()){ - orderMoneySum = recordList.stream() - .filter(record -> activityItem.getRecordIds().contains(record.getId())) - .map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); - }else{ - orderMoneySum = BigDecimal.ZERO; - } - } +// if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){ +// if(activityItem.getRecordIds() != null && !activityItem.getRecordIds().isEmpty()){ +// orderMoneySum = recordList.stream() +// .filter(record -> activityItem.getRecordIds().contains(record.getId())) +// .map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); +// }else{ +// orderMoneySum = BigDecimal.ZERO; +// } +// } Integer awardsGrade = null; for (WxOfflineActivityAwardsModel activityAwardsModel :activityItem.getActivityAwardsModelList()){ if((activityAwardsModel.getMinAmount() == null || orderMoneySum.compareTo(activityAwardsModel.getMinAmount()) >= 0) @@ -498,6 +504,9 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity private Integer getJointCount(WxOfflineActivityItem activityItem, List recordList){ Integer jointCount = 0; + if(recordList == null || recordList.isEmpty()){ + return jointCount; + } if(EnumOfflineActivityCountMode.MERCHANT_MODEL.getCode().equals(activityItem.getCountModel())){ //商户联单 List merchantIds = recordList.stream().map(WxOfflineActivityRecord::getMerchantId).distinct().collect(toList()); @@ -673,8 +682,21 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity for (WxOfflineActivityItem activityItem : activityItemList) { Map awardsItemMap = activityItem.getActivityAwardsItemList().stream().collect(toMap(WxOfflineActivityAwardsItem::getId, Function.identity())); - //获取奖项 + WxOfflineActivityItem grantActivityItem = grantActivityItemMap.get(activityItem.getId()); + //订单参数处理 + if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){ + if(grantActivityItem.getRecordIds() == null || grantActivityItem.getRecordIds().isEmpty()){ + throw new MallinkException(Result.ERROR, "发奖未选择订单"); + } + activityItem.setRecordIds(grantActivityItem.getRecordIds()); + List collect = wxOfflineActivityGrantAward.getRecordList().stream() + .filter(record -> activityItem.getRecordIds().contains(record.getId())).collect(toList()); + activityItem.setRecordList(collect); + }else{ + activityItem.setRecordList(wxOfflineActivityGrantAward.getRecordList()); + } + //获取发放奖项 List activityGrantItemList = null; if(grantActivityItem != null){ activityGrantItemList = grantActivityItem.getActivityGrantItemList(); @@ -741,10 +763,12 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity BigDecimal cashBackPriceTotal = BigDecimal.ZERO; activityGrantItemList = new ArrayList<>(); + BigDecimal orderMoneySum = activityItem.getRecordList().stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); + List sortAwardsItemList = activityItem.getActivityAwardsItemList().stream().sorted(Comparator.comparing(WxOfflineActivityAwardsItem::getMinAmount)).collect(toList()); //单笔订单计算 if(EnumOfflineActivityMode.ONE.getCode().equals(activityItem.getModeType())){ - for (WxOfflineActivityRecord record : wxOfflineActivityGrantAward.getRecordList()){ + for (WxOfflineActivityRecord record : activityItem.getRecordList()){ WxOfflineActivityAwardsItem grantAwardsItem = null; for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){ if((awardsItem.getMinAmount() == null || record.getOrderMoney().compareTo(awardsItem.getMinAmount()) >= 0) @@ -769,16 +793,16 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity } }else{ - BigDecimal orderMoneySum = wxOfflineActivityGrantAward.getRecordList().stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); - if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){ - if(activityItem.getRecordIds() != null && !activityItem.getRecordIds().isEmpty()){ - orderMoneySum = wxOfflineActivityGrantAward.getRecordList().stream() - .filter(record -> activityItem.getRecordIds().contains(record.getId())) - .map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); - }else{ - orderMoneySum = BigDecimal.ZERO; - } - } +// BigDecimal orderMoneySum = activityItem.getRecordList().stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); +// if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){ +// if(activityItem.getRecordIds() != null && !activityItem.getRecordIds().isEmpty()){ +// orderMoneySum = wxOfflineActivityGrantAward.getRecordList().stream() +// .filter(record -> activityItem.getRecordIds().contains(record.getId())) +// .map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); +// }else{ +// orderMoneySum = BigDecimal.ZERO; +// } +// } WxOfflineActivityAwardsItem grantAwardsItem = null; for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){ @@ -800,14 +824,14 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity } } - Integer jointCount = getJointCount(activityItem,wxOfflineActivityGrantAward.getRecordList()); + Integer jointCount = getJointCount(activityItem,activityItem.getRecordList()); if(jointCount != 0 && activityItem.getActivityAwardsItemSecondList() != null && !activityItem.getActivityAwardsItemSecondList().isEmpty()){ Map jointCountMap = activityItem.getActivityAwardsItemSecondList().stream().collect(toMap(WxOfflineActivityAwardsItem::getMerchantCount, Function.identity())); WxOfflineActivityAwardsItem awardsSecondItem = jointCountMap.get(jointCount); if(awardsSecondItem != null){ WxOfflineActivityGrantItem grantGrantItem = new WxOfflineActivityGrantItem(); //计算返现金额 - BigDecimal cashBackPrice = wxOfflineActivityGrantAward.getOrderMoneySum() + BigDecimal cashBackPrice = orderMoneySum .multiply(awardsSecondItem.getCashBackRatio().divide(new BigDecimal(100))); awardsSecondItem.setPrice(cashBackPrice); handlerGrantItem(grantGrantItem,activity,activityItem,awardsSecondItem); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantSettlementServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantSettlementServiceImpl.java index 2dea6f481..ee94af6a4 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantSettlementServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantSettlementServiceImpl.java @@ -8,6 +8,7 @@ import com.iformall.domain.po.*; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.vo.OfflineActivitySettlement; import com.iformall.domain.vo.OfflineActivitySettlementStatistics; +import com.iformall.enums.EnumOfflineActivityMode; import com.iformall.enums.EnumOfflineActivityStatus; import com.iformall.enums.EnumYesOrNo; import com.iformall.mapper.WxMerchantMapper; @@ -57,24 +58,46 @@ public class WxOfflineActivityGrantSettlementServiceImpl implements WxOfflineAct final IdWorker idWorker = IdWorker.get(); Date now = new Date(); Map recordMap = wxOfflineActivityGrantAward.getRecordList().stream().collect(Collectors.toMap(WxOfflineActivityRecord::getId, Function.identity())); + //获取订单占比(占比最少的订单用减法,尽量减少误差) - List recordDescList = wxOfflineActivityGrantAward.getRecordList().stream().sorted(Comparator.comparing(WxOfflineActivityRecord::getOrderMoney).reversed()).collect(Collectors.toList()); - int size = recordDescList.size() - 1; - BigDecimal lastRatio = new BigDecimal(100); - for(int i=0; i recordDescList = wxOfflineActivityGrantAward.getRecordList().stream().sorted(Comparator.comparing(WxOfflineActivityRecord::getOrderMoney).reversed()).collect(Collectors.toList()); +// int size = recordDescList.size() - 1; +// BigDecimal lastRatio = new BigDecimal(100); +// for(int i=0; i recordDescList = activityItem.getRecordList().stream().sorted(Comparator.comparing(WxOfflineActivityRecord::getOrderMoney).reversed()).collect(Collectors.toList()); +// if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType()) +// && activityItem.getRecordIds() != null && !activityItem.getRecordIds().isEmpty()){ +// recordDescList = wxOfflineActivityGrantAward.getRecordList().stream() +// .filter(record -> activityItem.getRecordIds().contains(record.getId())) +// .sorted(Comparator.comparing(WxOfflineActivityRecord::getOrderMoney).reversed()).collect(Collectors.toList()); +// } + BigDecimal orderMoneySum = recordDescList.stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add); + int size = recordDescList.size() - 1; + BigDecimal lastRatio = new BigDecimal(100); + for(int i=0; i itemSettlementList = new ArrayList<>(); if(wxOfflineActivityGrantItem.getRecordId() != null){ diff --git a/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantCashBackMapper.xml b/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantCashBackMapper.xml index badb1206f..5f788aa4b 100644 --- a/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantCashBackMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantCashBackMapper.xml @@ -85,7 +85,7 @@ (#{item.id,jdbcType=BIGINT}, #{item.grantId,jdbcType=BIGINT},#{item.activityId,jdbcType=BIGINT},#{item.activityName,jdbcType=VARCHAR}, #{item.activityItemId,jdbcType=BIGINT},#{item.activityItemName,jdbcType=VARCHAR},#{item.activityItemType,jdbcType=INTEGER}, - #{item.awardsItemRule,jdbcType=INTEGER},#{item.calculationMode,jdbcType=INTEGER}, + #{item.awardsItemRule,jdbcType=INTEGER}, #{item.createDate,jdbcType=TIMESTAMP},#{item.updateDate,jdbcType=TIMESTAMP}, #{item.maxAmount,jdbcType=DECIMAL},#{item.startingTaxPoint,jdbcType=DECIMAL},#{item.taxPoints,jdbcType=DECIMAL},#{item.cashBackPrice,jdbcType=DECIMAL},#{item.taxPointsAmount,jdbcType=DECIMAL})