From 4a782822ece8f3d11d9355d3e375ef91aacafb7b Mon Sep 17 00:00:00 2001 From: xiaohu <1901900812@qq.com> Date: Fri, 8 Nov 2024 02:14:40 +0800 Subject: [PATCH] //legionActivity --- .../domain/po/WxOfflineActivityGrantItem.java | 3 + ...xOfflineActivityGrantAwardServiceImpl.java | 255 +++++++++++++++--- ...WxOfflineActivityGrantItemServiceImpl.java | 24 +- ...ineActivityGrantSettlementServiceImpl.java | 78 ++++-- .../WxOfflineActivityAwardsItemMapper.xml | 2 +- .../WxOfflineActivityGrantItemMapper.xml | 7 +- .../mapper/WxOfflineActivityItemMapper.xml | 2 +- 7 files changed, 289 insertions(+), 82 deletions(-) diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantItem.java b/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantItem.java index 7bd378699..af59c7f25 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantItem.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxOfflineActivityGrantItem.java @@ -152,4 +152,7 @@ public class WxOfflineActivityGrantItem extends TenantEntity { @TableField(value = "update_date") private Date updateDate; + @TableField(value = "record_id") + private Long recordId; + } \ No newline at end of file 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 d90f89d14..fdd3103e4 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantAwardServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantAwardServiceImpl.java @@ -234,36 +234,121 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity activityItem.setActivityGrantItemList(Collections.singletonList(grantItem)); } else if (EnumOfflineActivityType.CASHBACK.getCode().equals(activityItem.getType())) { - BigDecimal cashBackPrice = BigDecimal.ZERO; + BigDecimal cashBackPriceTotal = BigDecimal.ZERO; + List grantItemList = new ArrayList<>(); + + List sortAwardsItemList = activityItem.getActivityAwardsItemList().stream().sorted(Comparator.comparing(WxOfflineActivityAwardsItem::getMinAmount)).collect(toList()); //单笔订单计算 if(EnumOfflineActivityCalculationMode.ONE.getCode().equals(activityItem.getCalculationMode())){ + for (WxOfflineActivityRecord record : wxOfflineActivityGrantAward.getRecordList()){ + WxOfflineActivityAwardsItem grantAwardsItem = null; + for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){ + if((awardsItem.getMinAmount() == null || record.getOrderMoney().compareTo(awardsItem.getMinAmount()) >= 0) + && (awardsItem.getMaxAmount() == null || record.getOrderMoney().compareTo(awardsItem.getMaxAmount()) <= 0)){ + grantAwardsItem = awardsItem; + } + } + if(grantAwardsItem == null){ + continue; + } +// WxOfflineActivityGrantItem grantItem = new WxOfflineActivityGrantItem(); +// grantItem.setActivityItemId(activityItem.getId()); +// grantItem.setActivityItemName(activityItem.getName()); +// grantItem.setActivityItemType(activityItem.getType()); +// grantItem.setAwardItamId(grantAwardsItem.getId()); +// grantItem.setAwardName(grantAwardsItem.getName()); +// grantItem.setAwardGrade(grantAwardsItem.getGrade()); +// grantItem.setAwardMinAmount(grantAwardsItem.getMinAmount()); +// grantItem.setAwardMaxAmount(grantAwardsItem.getMaxAmount()); +// grantItem.setAwardsItemRule(activityItem.getAwardsItemRule()); +// grantItem.setAwardCount(1); +// +// //计算返现金额 +// BigDecimal cashBackPrice = record.getOrderMoney() +// .multiply(grantAwardsItem.getCashBackRatio().divide(new BigDecimal(100))); +// if(EnumOfflineActivityAwardsRule.DEF.getCode().equals(activityItem.getAwardsItemRule())){ +// grantItem.setAwardPrice(cashBackPrice.setScale(2, RoundingMode.HALF_UP)); +// } else if (EnumOfflineActivityAwardsRule.YUAN.getCode().equals(activityItem.getAwardsItemRule())){ +// grantItem.setAwardPrice(cashBackPrice.setScale(0, RoundingMode.HALF_UP)); +// }else if (EnumOfflineActivityAwardsRule.TEN.getCode().equals(activityItem.getAwardsItemRule())){ +// BigDecimal cashBackPriceTen = cashBackPrice.divide(new BigDecimal(10)) +// .setScale(0, RoundingMode.HALF_UP); +// grantItem.setAwardPrice(cashBackPriceTen.multiply(new BigDecimal(10))); +// } +// grantItem.setMoneyRule(grantAwardsItem.getMoneyRule()); +// grantItem.setMallShareRate(grantAwardsItem.getMallShareRate()); +// grantItem.setMallSharePrice(grantAwardsItem.getMallSharePrice()); +//// grantItem.setMerchantShareRate(grantAwardsItem.getMerchantShareRate()); +//// grantItem.setMerchantSharePrice(grantAwardsItem.getMerchantSharePrice()); +// grantItemList.add(grantItem); + + //计算返现金额 + BigDecimal cashBackPrice = record.getOrderMoney() + .multiply(grantAwardsItem.getCashBackRatio().divide(new BigDecimal(100))); + if(EnumOfflineActivityAwardsRule.DEF.getCode().equals(activityItem.getAwardsItemRule())){ + cashBackPrice = cashBackPrice.setScale(2, RoundingMode.HALF_UP); + } else if (EnumOfflineActivityAwardsRule.YUAN.getCode().equals(activityItem.getAwardsItemRule())) { + cashBackPrice = cashBackPrice.setScale(0, RoundingMode.HALF_UP); + }else if (EnumOfflineActivityAwardsRule.TEN.getCode().equals(activityItem.getAwardsItemRule())){ + cashBackPrice = cashBackPrice.divide(new BigDecimal(10)) + .setScale(0, RoundingMode.HALF_UP).multiply(new BigDecimal(10)); + } + cashBackPriceTotal = cashBackPriceTotal.add(cashBackPrice); + } }else{ + WxOfflineActivityAwardsItem grantAwardsItem = null; + for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){ + if((awardsItem.getMinAmount() == null || wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(awardsItem.getMinAmount()) >= 0) + && (awardsItem.getMaxAmount() == null || wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(awardsItem.getMaxAmount()) <= 0)){ + grantAwardsItem = awardsItem; + } + } + if(grantAwardsItem == null){ + continue; + } + //计算返现金额 + BigDecimal cashBackPrice = wxOfflineActivityGrantAward.getOrderMoneySum() + .multiply(grantAwardsItem.getCashBackRatio().divide(new BigDecimal(100))); + if(EnumOfflineActivityAwardsRule.DEF.getCode().equals(activityItem.getAwardsItemRule())){ + cashBackPrice = cashBackPrice.setScale(2, RoundingMode.HALF_UP); + } else if (EnumOfflineActivityAwardsRule.YUAN.getCode().equals(activityItem.getAwardsItemRule())) { + cashBackPrice = cashBackPrice.setScale(0, RoundingMode.HALF_UP); + }else if (EnumOfflineActivityAwardsRule.TEN.getCode().equals(activityItem.getAwardsItemRule())){ + cashBackPrice = cashBackPrice.divide(new BigDecimal(10)) + .setScale(0, RoundingMode.HALF_UP).multiply(new BigDecimal(10)); + } + cashBackPriceTotal = cashBackPriceTotal.add(cashBackPrice); } - activityItem.setCashBackPrice(BigDecimal.ONE); -// if(wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(activityItem.getLimitMoney()) < 0){ -// activityItem.setIsMeet(false); -// continue; -// } -// activityItem.setIsMeet(true); -// activityItem.setRealAwardsItemLimit(1); -// for (WxOfflineActivityAwardsItem awardsItem : activityItem.getActivityAwardsItemList()) { -// //计算返现金额 -// BigDecimal cashBackPrice = wxOfflineActivityGrantAward.getOrderMoneySum() -// .multiply(awardsItem.getCashBackRatio().divide(new BigDecimal(100))); -// if(EnumOfflineActivityAwardsRule.DEF.getCode().equals(activityItem.getAwardsItemRule())){ -// awardsItem.setPrice(cashBackPrice.setScale(2, RoundingMode.HALF_UP)); -// } else if (EnumOfflineActivityAwardsRule.YUAN.getCode().equals(activityItem.getAwardsItemRule())) { -// awardsItem.setPrice(cashBackPrice.setScale(0, RoundingMode.HALF_UP)); -// }else if (EnumOfflineActivityAwardsRule.TEN.getCode().equals(activityItem.getAwardsItemRule())){ -// BigDecimal cashBackPriceTen = cashBackPrice.divide(new BigDecimal(10)) -// .setScale(0, RoundingMode.HALF_UP); -// awardsItem.setPrice(cashBackPriceTen.multiply(new BigDecimal(10))); -// } -// } - //计算商户商管分别承担金额 -// handlerAwardsSharePrice(activityItem.getActivityAwardsItemList()); + + if(activityItem.getActivityAwardsItemSecondList() != null && !activityItem.getActivityAwardsItemSecondList().isEmpty()){ + List merchantIds = wxOfflineActivityGrantAward.getRecordList().stream().map(WxOfflineActivityRecord::getMerchantId).distinct().collect(toList()); + Map collect = activityItem.getActivityAwardsItemSecondList().stream().collect(toMap(WxOfflineActivityAwardsItem::getMerchantCount, Function.identity())); + WxOfflineActivityAwardsItem grantAwardsSecondItem = collect.get(merchantIds.size()); + if(grantAwardsSecondItem == null){ + continue; + } + //计算返现金额 + BigDecimal cashBackPrice = wxOfflineActivityGrantAward.getOrderMoneySum() + .multiply(grantAwardsSecondItem.getCashBackRatio().divide(new BigDecimal(100))); + if(EnumOfflineActivityAwardsRule.DEF.getCode().equals(activityItem.getAwardsItemRule())){ + cashBackPrice = cashBackPrice.setScale(2, RoundingMode.HALF_UP); + } else if (EnumOfflineActivityAwardsRule.YUAN.getCode().equals(activityItem.getAwardsItemRule())) { + cashBackPrice = cashBackPrice.setScale(0, RoundingMode.HALF_UP); + }else if (EnumOfflineActivityAwardsRule.TEN.getCode().equals(activityItem.getAwardsItemRule())){ + cashBackPrice = cashBackPrice.divide(new BigDecimal(10)) + .setScale(0, RoundingMode.HALF_UP).multiply(new BigDecimal(10)); + } + cashBackPriceTotal = cashBackPriceTotal.add(cashBackPrice); + } + + if(activityItem.getMaxAmount().compareTo(cashBackPriceTotal) >= 0){ + activityItem.setCashBackPrice(cashBackPriceTotal); + }else{ + activityItem.setCashBackPrice(activityItem.getMaxAmount()); + } + } } } @@ -384,10 +469,10 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity throw new MallinkException(Result.ERROR, "请检查活动项参数"); } List activityGrantItemList = grantActivityItem.getActivityGrantItemList(); - if(activityGrantItemList == null || activityGrantItemList.isEmpty()){ - continue; -// throw new MallinkException(Result.ERROR, "请检查活动奖项参数"); - } +// if(activityGrantItemList == null || activityGrantItemList.isEmpty()){ +// continue; +//// throw new MallinkException(Result.ERROR, "请检查活动奖项参数"); +// } boolean isRepeat = activityGrantItemList.stream() .collect(groupingBy(WxOfflineActivityGrantItem::getAwardItamId, counting())) .entrySet().stream().anyMatch(e -> e.getValue() > 1); @@ -397,12 +482,7 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity Map awardsItemMap = activityItem.getActivityAwardsItemList().stream().collect(toMap(WxOfflineActivityAwardsItem::getId, Function.identity())); - for (WxOfflineActivityGrantItem grantGrantItem : activityGrantItemList) { - i++; - if(grantGrantItem.getAwardCount() == null){ - grantGrantItem.setAwardCount(1); - } - } + if(EnumOfflineActivityType.LOTTERY_DRAW.getCode().equals(activityItem.getType())){ @@ -460,20 +540,109 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity } else if (EnumOfflineActivityType.CASHBACK.getCode().equals(activityItem.getType())) { - if(activityGrantItemList.size() != 1){ - throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数"); + BigDecimal cashBackPriceTotal = BigDecimal.ZERO; + List grantItemList = new ArrayList<>(); + + List sortAwardsItemList = activityItem.getActivityAwardsItemList().stream().sorted(Comparator.comparing(WxOfflineActivityAwardsItem::getMinAmount)).collect(toList()); + //单笔订单计算 + if(EnumOfflineActivityCalculationMode.ONE.getCode().equals(activityItem.getCalculationMode())){ + for (WxOfflineActivityRecord record : wxOfflineActivityGrantAward.getRecordList()){ + WxOfflineActivityAwardsItem grantAwardsItem = null; + for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){ + if((awardsItem.getMinAmount() == null || record.getOrderMoney().compareTo(awardsItem.getMinAmount()) >= 0) + && (awardsItem.getMaxAmount() == null || record.getOrderMoney().compareTo(awardsItem.getMaxAmount()) <= 0)){ + grantAwardsItem = awardsItem; + } + } + if(grantAwardsItem == null){ + continue; + } + + WxOfflineActivityGrantItem grantGrantItem = new WxOfflineActivityGrantItem(); + grantGrantItem.setRecordId(record.getId()); + //计算返现金额 + BigDecimal cashBackPrice = record.getOrderMoney() + .multiply(grantAwardsItem.getCashBackRatio().divide(new BigDecimal(100))); + + grantAwardsItem.setPrice(cashBackPrice); + handlerGrantItem(grantGrantItem,activity,activityItem,grantAwardsItem); + + grantItemList.add(grantGrantItem); + + cashBackPriceTotal = cashBackPriceTotal.add(cashBackPrice); + } + }else{ + + WxOfflineActivityAwardsItem grantAwardsItem = null; + for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){ + if((awardsItem.getMinAmount() == null || wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(awardsItem.getMinAmount()) >= 0) + && (awardsItem.getMaxAmount() == null || wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(awardsItem.getMaxAmount()) <= 0)){ + grantAwardsItem = awardsItem; + } + } + if(grantAwardsItem == null){ + continue; + } + WxOfflineActivityGrantItem grantGrantItem = new WxOfflineActivityGrantItem(); + //计算返现金额 + BigDecimal cashBackPrice = wxOfflineActivityGrantAward.getOrderMoneySum() + .multiply(grantAwardsItem.getCashBackRatio().divide(new BigDecimal(100))); + grantAwardsItem.setPrice(cashBackPrice); + handlerGrantItem(grantGrantItem,activity,activityItem,grantAwardsItem); + + grantItemList.add(grantGrantItem); + cashBackPriceTotal = cashBackPriceTotal.add(cashBackPrice); } - WxOfflineActivityGrantItem grantGrantItem = activityGrantItemList.get(0); - if(grantGrantItem.getAwardItamId() == null){ - throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数"); + + if(activityItem.getActivityAwardsItemSecondList() != null && !activityItem.getActivityAwardsItemSecondList().isEmpty()){ + List merchantIds = wxOfflineActivityGrantAward.getRecordList().stream().map(WxOfflineActivityRecord::getMerchantId).distinct().collect(toList()); + Map collect = activityItem.getActivityAwardsItemSecondList().stream().collect(toMap(WxOfflineActivityAwardsItem::getMerchantCount, Function.identity())); + WxOfflineActivityAwardsItem grantAwardsSecondItem = collect.get(merchantIds.size()); + if(grantAwardsSecondItem == null){ + continue; + } + WxOfflineActivityGrantItem grantGrantItem = new WxOfflineActivityGrantItem(); + //计算返现金额 + BigDecimal cashBackPrice = wxOfflineActivityGrantAward.getOrderMoneySum() + .multiply(grantAwardsSecondItem.getCashBackRatio().divide(new BigDecimal(100))); + grantAwardsSecondItem.setPrice(cashBackPrice); + handlerGrantItem(grantGrantItem,activity,activityItem,grantAwardsSecondItem); + + grantItemList.add(grantGrantItem); + cashBackPriceTotal = cashBackPriceTotal.add(cashBackPrice); } - WxOfflineActivityAwardsItem awardsItem = awardsItemMap.get(grantGrantItem.getAwardItamId()); - if(awardsItem == null){ - throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数"); + + BigDecimal prop = BigDecimal.ONE; + if(activityItem.getMaxAmount().compareTo(cashBackPriceTotal) >= 0){ + activityItem.setCashBackPrice(cashBackPriceTotal); + }else{ + prop = activityItem.getMaxAmount().divide(cashBackPriceTotal).setScale(4, RoundingMode.HALF_UP);; + activityItem.setCashBackPrice(activityItem.getMaxAmount()); + } + for (WxOfflineActivityGrantItem grantItem:grantItemList){ + if(EnumOfflineActivityAwardsRule.DEF.getCode().equals(activityItem.getAwardsItemRule())){ + grantItem.setAwardPrice(grantItem.getAwardPrice().multiply(prop).multiply(prop).setScale(2, RoundingMode.HALF_UP)); + activityItem.setCashBackPrice(activityItem.getCashBackPrice().setScale(2, RoundingMode.HALF_UP)); + } else if (EnumOfflineActivityAwardsRule.YUAN.getCode().equals(activityItem.getAwardsItemRule())) { + grantItem.setAwardPrice(grantItem.getAwardPrice().multiply(prop).multiply(prop).setScale(0, RoundingMode.HALF_UP)); + activityItem.setCashBackPrice(activityItem.getCashBackPrice().setScale(0, RoundingMode.HALF_UP)); + }else if (EnumOfflineActivityAwardsRule.TEN.getCode().equals(activityItem.getAwardsItemRule())){ + grantItem.setAwardPrice(grantItem.getAwardPrice().multiply(prop).multiply(prop).divide(new BigDecimal(10)) + .setScale(0, RoundingMode.HALF_UP).multiply(new BigDecimal(10))); + activityItem.setCashBackPrice(activityItem.getCashBackPrice().divide(new BigDecimal(10)) + .setScale(0, RoundingMode.HALF_UP).multiply(new BigDecimal(10))); + } } - handlerGrantItem(grantGrantItem,activity,activityItem,awardsItem); + grantActivityItem.setActivityGrantItemList(grantItemList); + + } + for (WxOfflineActivityGrantItem grantGrantItem : grantActivityItem.getActivityGrantItemList()) { + i++; + if(grantGrantItem.getAwardCount() == null){ + grantGrantItem.setAwardCount(1); + } } } if(i == 0){ diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantItemServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantItemServiceImpl.java index 5d1ff180e..954d76923 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantItemServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantItemServiceImpl.java @@ -44,18 +44,18 @@ public class WxOfflineActivityGrantItemServiceImpl implements WxOfflineActivityG grantGrantItem.updateTenantInfo(wxOfflineActivityGrantAward); grantGrantItem.setCreateDate(now); grantGrantItem.setUpdateDate(now); - if(EnumOfflineActivityType.CASHBACK.getCode().equals(grantGrantItem.getActivityItemType())){ - BigDecimal awardPrice = wxOfflineActivityGrantAward.getOrderMoneySum() - .multiply(grantGrantItem.getCashBackRatio().divide(new BigDecimal(100))); - if(EnumOfflineActivityAwardsRule.DEF.getCode().equals(grantGrantItem.getAwardsItemRule())){ - grantGrantItem.setAwardPrice(awardPrice.setScale(2, BigDecimal.ROUND_HALF_UP)); - } else if (EnumOfflineActivityAwardsRule.YUAN.getCode().equals(grantGrantItem.getAwardsItemRule())) { - grantGrantItem.setAwardPrice(awardPrice.setScale(0, BigDecimal.ROUND_HALF_UP)); - }else if (EnumOfflineActivityAwardsRule.TEN.getCode().equals(grantGrantItem.getAwardsItemRule())){ - BigDecimal awardPriceTen = awardPrice.divide(new BigDecimal(10)).setScale(0, BigDecimal.ROUND_HALF_UP); - grantGrantItem.setAwardPrice(awardPriceTen.multiply(new BigDecimal(10))); - } - } +// if(EnumOfflineActivityType.CASHBACK.getCode().equals(grantGrantItem.getActivityItemType())){ +// BigDecimal awardPrice = wxOfflineActivityGrantAward.getOrderMoneySum() +// .multiply(grantGrantItem.getCashBackRatio().divide(new BigDecimal(100))); +// if(EnumOfflineActivityAwardsRule.DEF.getCode().equals(grantGrantItem.getAwardsItemRule())){ +// grantGrantItem.setAwardPrice(awardPrice.setScale(2, BigDecimal.ROUND_HALF_UP)); +// } else if (EnumOfflineActivityAwardsRule.YUAN.getCode().equals(grantGrantItem.getAwardsItemRule())) { +// grantGrantItem.setAwardPrice(awardPrice.setScale(0, BigDecimal.ROUND_HALF_UP)); +// }else if (EnumOfflineActivityAwardsRule.TEN.getCode().equals(grantGrantItem.getAwardsItemRule())){ +// BigDecimal awardPriceTen = awardPrice.divide(new BigDecimal(10)).setScale(0, BigDecimal.ROUND_HALF_UP); +// grantGrantItem.setAwardPrice(awardPriceTen.multiply(new BigDecimal(10))); +// } +// } rantItemList.add(grantGrantItem); } } 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 fabce08af..eae46410a 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantSettlementServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantSettlementServiceImpl.java @@ -26,6 +26,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.text.NumberFormat; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -55,6 +56,7 @@ public class WxOfflineActivityGrantSettlementServiceImpl implements WxOfflineAct List settlementList = new ArrayList<>(); 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; @@ -75,11 +77,13 @@ public class WxOfflineActivityGrantSettlementServiceImpl implements WxOfflineAct } for (WxOfflineActivityGrantItem wxOfflineActivityGrantItem : activityItem.getActivityGrantItemList()) { List itemSettlementList = new ArrayList<>(); - for (WxOfflineActivityRecord record : recordDescList){ + if(wxOfflineActivityGrantItem.getRecordId() != null){ WxOfflineActivityGrantSettlement settlement = new WxOfflineActivityGrantSettlement(); settlement.setId(idWorker.nextId()); settlement.updateTenantInfo(wxOfflineActivityGrantItem); + WxOfflineActivityRecord record = recordMap.get(wxOfflineActivityGrantItem.getRecordId()); + settlement.setRecordId(record.getId()); settlement.setOrderNo(record.getOrderNo()); settlement.setOrderMoney(record.getOrderMoney()); @@ -92,34 +96,64 @@ public class WxOfflineActivityGrantSettlementServiceImpl implements WxOfflineAct settlement.setGrantPrice(wxOfflineActivityGrantItem.getAwardPrice()); settlement.setMallShareRate(wxOfflineActivityGrantItem.getMallShareRate()); settlement.setMerchantShareRate(wxOfflineActivityGrantItem.getMerchantShareRate()); - settlement.setOrderRatio(record.getOrderRatio()); + settlement.setOrderRatio(new BigDecimal(100)); - settlement.setCreateDate(now); - settlement.setUpdateDate(now); - itemSettlementList.add(settlement); - } - //计算订单分担金额,(占比最少的订单用减法,尽量减少误差) - int itemSize = itemSettlementList.size() - 1; - BigDecimal lastGrantPrice = wxOfflineActivityGrantItem.getAwardPrice(); - for (int i = 0; i < itemSize; i++) { - WxOfflineActivityGrantSettlement settlement = itemSettlementList.get(i); - BigDecimal realGrantPrice = wxOfflineActivityGrantItem.getAwardPrice() - .multiply(settlement.getOrderRatio().divide(new BigDecimal(100))) - .setScale(2, RoundingMode.HALF_UP); - settlement.setRealGrantPrice(realGrantPrice); + settlement.setRealGrantPrice(settlement.getGrantPrice()); settlement.setRealMallSharePrice(settlement.getRealGrantPrice() .multiply(settlement.getMallShareRate().divide(new BigDecimal(100))) .setScale(2, RoundingMode.HALF_UP)); settlement.setRealMerchantSharePrice(settlement.getRealGrantPrice().subtract(settlement.getRealMallSharePrice())); - lastGrantPrice = lastGrantPrice.subtract(realGrantPrice); + settlement.setCreateDate(now); + settlement.setUpdateDate(now); + itemSettlementList.add(settlement); + }else{ + for (WxOfflineActivityRecord record : recordDescList){ + WxOfflineActivityGrantSettlement settlement = new WxOfflineActivityGrantSettlement(); + settlement.setId(idWorker.nextId()); + settlement.updateTenantInfo(wxOfflineActivityGrantItem); + + settlement.setRecordId(record.getId()); + settlement.setOrderNo(record.getOrderNo()); + settlement.setOrderMoney(record.getOrderMoney()); + settlement.setMerchantId(record.getMerchantId()); + + settlement.setActivityId(wxOfflineActivityGrantItem.getActivityId()); + settlement.setActivityItemId(wxOfflineActivityGrantItem.getActivityItemId()); + settlement.setAwardItamId(wxOfflineActivityGrantItem.getAwardItamId()); + settlement.setGrantId(wxOfflineActivityGrantItem.getGrantId()); + settlement.setGrantPrice(wxOfflineActivityGrantItem.getAwardPrice()); + settlement.setMallShareRate(wxOfflineActivityGrantItem.getMallShareRate()); + settlement.setMerchantShareRate(wxOfflineActivityGrantItem.getMerchantShareRate()); + settlement.setOrderRatio(record.getOrderRatio()); + + settlement.setCreateDate(now); + settlement.setUpdateDate(now); + itemSettlementList.add(settlement); + } + //计算订单分担金额,(占比最少的订单用减法,尽量减少误差) + int itemSize = itemSettlementList.size() - 1; + BigDecimal lastGrantPrice = wxOfflineActivityGrantItem.getAwardPrice(); + for (int i = 0; i < itemSize; i++) { + WxOfflineActivityGrantSettlement settlement = itemSettlementList.get(i); + BigDecimal realGrantPrice = wxOfflineActivityGrantItem.getAwardPrice() + .multiply(settlement.getOrderRatio().divide(new BigDecimal(100))) + .setScale(2, RoundingMode.HALF_UP); + settlement.setRealGrantPrice(realGrantPrice); + settlement.setRealMallSharePrice(settlement.getRealGrantPrice() + .multiply(settlement.getMallShareRate().divide(new BigDecimal(100))) + .setScale(2, RoundingMode.HALF_UP)); + settlement.setRealMerchantSharePrice(settlement.getRealGrantPrice().subtract(settlement.getRealMallSharePrice())); + + lastGrantPrice = lastGrantPrice.subtract(realGrantPrice); + } + WxOfflineActivityGrantSettlement lastSettlement = itemSettlementList.get(itemSize); + lastSettlement.setRealGrantPrice(lastGrantPrice); + lastSettlement.setRealMallSharePrice(lastSettlement.getRealGrantPrice() + .multiply(lastSettlement.getMallShareRate().divide(new BigDecimal(100))) + .setScale(2, RoundingMode.HALF_UP)); + lastSettlement.setRealMerchantSharePrice(lastSettlement.getRealGrantPrice().subtract(lastSettlement.getRealMallSharePrice())); } - WxOfflineActivityGrantSettlement lastSettlement = itemSettlementList.get(itemSize); - lastSettlement.setRealGrantPrice(lastGrantPrice); - lastSettlement.setRealMallSharePrice(lastSettlement.getRealGrantPrice() - .multiply(lastSettlement.getMallShareRate().divide(new BigDecimal(100))) - .setScale(2, RoundingMode.HALF_UP)); - lastSettlement.setRealMerchantSharePrice(lastSettlement.getRealGrantPrice().subtract(lastSettlement.getRealMallSharePrice())); settlementList.addAll(itemSettlementList); diff --git a/mallinkService/src/main/resources/mapper/WxOfflineActivityAwardsItemMapper.xml b/mallinkService/src/main/resources/mapper/WxOfflineActivityAwardsItemMapper.xml index 69660f3bc..622ee0742 100644 --- a/mallinkService/src/main/resources/mapper/WxOfflineActivityAwardsItemMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOfflineActivityAwardsItemMapper.xml @@ -26,7 +26,7 @@ id,tenant_id,parent_tenant_id, - activity_item_id,`name`,grade, + activity_item_id,`name`,grade,merchant_count, min_amount,max_amount,cash_back_ratio,price, money_rule,mall_share_rate,merchant_share_rate, create_date,update_date diff --git a/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantItemMapper.xml b/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantItemMapper.xml index e1d55ecc4..9c60b0bf9 100644 --- a/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantItemMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOfflineActivityGrantItemMapper.xml @@ -28,6 +28,7 @@ + @@ -38,7 +39,7 @@ award_min_amount,award_max_amount,awards_item_rule,cash_back_ratio, award_price,award_count,money_rule, mall_share_rate,merchant_share_rate, - create_date,update_date + create_date,update_date,record_id @@ -92,7 +93,7 @@ award_min_amount,award_max_amount,awards_item_rule,cash_back_ratio, award_price,award_count,money_rule, mall_share_rate,merchant_share_rate, - create_date,update_date) + create_date,update_date,record_id) values (#{item.id,jdbcType=BIGINT}, @@ -102,7 +103,7 @@ #{item.awardMinAmount,jdbcType=DECIMAL},#{item.awardMaxAmount,jdbcType=DECIMAL},#{item.awardsItemRule,jdbcType=INTEGER},#{item.cashBackRatio,jdbcType=DECIMAL}, #{item.awardPrice,jdbcType=DECIMAL},#{item.awardCount,jdbcType=INTEGER},#{item.moneyRule,jdbcType=INTEGER}, #{item.mallShareRate,jdbcType=DECIMAL},#{item.merchantShareRate,jdbcType=DECIMAL}, - #{item.createDate,jdbcType=TIMESTAMP},#{item.updateDate,jdbcType=TIMESTAMP}) + #{item.createDate,jdbcType=TIMESTAMP},#{item.updateDate,jdbcType=TIMESTAMP},#{item.recordId,jdbcType=BIGINT}) diff --git a/mallinkService/src/main/resources/mapper/WxOfflineActivityItemMapper.xml b/mallinkService/src/main/resources/mapper/WxOfflineActivityItemMapper.xml index b5f366410..35490ea2f 100644 --- a/mallinkService/src/main/resources/mapper/WxOfflineActivityItemMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOfflineActivityItemMapper.xml @@ -28,7 +28,7 @@ id,tenant_id,parent_tenant_id, activity_id,`type`,`name`, limit_money,awards_item_price,awards_item_limit,awards_item_count, - awards_item_rule,create_date,update_date + awards_item_rule,calculation_mode,max_amount,starting_tax_point,tax_points,create_date,update_date