Browse Source

//offline

release_toaliyun_real
xiaohu 1 year ago
parent
commit
69115747e2
3 changed files with 112 additions and 65 deletions
  1. +76
    -52
      mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantAwardServiceImpl.java
  2. +35
    -12
      mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantSettlementServiceImpl.java
  3. +1
    -1
      mallinkService/src/main/resources/mapper/WxOfflineActivityGrantCashBackMapper.xml

+ 76
- 52
mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantAwardServiceImpl.java View File

@@ -179,14 +179,22 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
//订单合并计算
handlerGrantData(activity,wxOfflineActivityGrantAward,true);

//奖项处理
//订单参数处理
List<WxOfflineActivityItem> activityItemList = wxOfflineActivityItemService.getActivityItemList(activity.getId(), activity.getTenantId());
if(wxOfflineActivityGrantAward.getActivityItemList() != null && !wxOfflineActivityGrantAward.getActivityItemList().isEmpty()){
Map<Long, List<Long>> ActivityItemRecordMap = wxOfflineActivityGrantAward.getActivityItemList().stream().collect(toMap(WxOfflineActivityItem::getId, WxOfflineActivityItem::getRecordIds));
for (WxOfflineActivityItem activityItem : activityItemList) {
List<Long> records = ActivityItemRecordMap.get(activityItem.getId());
if(records != null && !records.isEmpty()){
if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){
List<Long> records = ActivityItemRecordMap.get(activityItem.getId());
if(records == null || records.isEmpty()){
throw new MallinkException(Result.ERROR, "发奖未选择订单");
}
activityItem.setRecordIds(records);
List<WxOfflineActivityRecord> 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<WxOfflineActivityGrantItem> grantItemList = new ArrayList<>();

BigDecimal orderMoneySum = activityItem.getRecordList().stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add);

List<WxOfflineActivityAwardsItem> 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<Integer, WxOfflineActivityAwardsItem> 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<WxOfflineActivityRecord> recordList){
Integer jointCount = 0;
if(recordList == null || recordList.isEmpty()){
return jointCount;
}
if(EnumOfflineActivityCountMode.MERCHANT_MODEL.getCode().equals(activityItem.getCountModel())){
//商户联单
List<Long> merchantIds = recordList.stream().map(WxOfflineActivityRecord::getMerchantId).distinct().collect(toList());
@@ -673,8 +682,21 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
for (WxOfflineActivityItem activityItem : activityItemList) {

Map<Long, WxOfflineActivityAwardsItem> 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<WxOfflineActivityRecord> collect = wxOfflineActivityGrantAward.getRecordList().stream()
.filter(record -> activityItem.getRecordIds().contains(record.getId())).collect(toList());
activityItem.setRecordList(collect);
}else{
activityItem.setRecordList(wxOfflineActivityGrantAward.getRecordList());
}
//获取发放奖项
List<WxOfflineActivityGrantItem> 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<WxOfflineActivityAwardsItem> 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<Integer, WxOfflineActivityAwardsItem> 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);


+ 35
- 12
mallinkService/src/main/java/com/iformall/service/impl/WxOfflineActivityGrantSettlementServiceImpl.java View File

@@ -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<Long, WxOfflineActivityRecord> recordMap = wxOfflineActivityGrantAward.getRecordList().stream().collect(Collectors.toMap(WxOfflineActivityRecord::getId, Function.identity()));

//获取订单占比(占比最少的订单用减法,尽量减少误差)
List<WxOfflineActivityRecord> 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<size; i++){
WxOfflineActivityRecord record = recordDescList.get(i);
BigDecimal orderRatio = record.getOrderMoney()
.divide(wxOfflineActivityGrantAward.getOrderMoneySum(),4,RoundingMode.HALF_UP)
.multiply(new BigDecimal(100));
record.setOrderRatio(orderRatio);
lastRatio = lastRatio.subtract(orderRatio);
}
recordDescList.get(size).setOrderRatio(lastRatio);
// List<WxOfflineActivityRecord> 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<size; i++){
// WxOfflineActivityRecord record = recordDescList.get(i);
// BigDecimal orderRatio = record.getOrderMoney()
// .divide(wxOfflineActivityGrantAward.getOrderMoneySum(),4,RoundingMode.HALF_UP)
// .multiply(new BigDecimal(100));
// record.setOrderRatio(orderRatio);
// lastRatio = lastRatio.subtract(orderRatio);
// }
// recordDescList.get(size).setOrderRatio(lastRatio);

for (WxOfflineActivityItem activityItem : wxOfflineActivityGrantAward.getActivityItemList()) {
if(activityItem.getActivityGrantItemList() == null){
continue;
}
//获取订单占比(占比最少的订单用减法,尽量减少误差)
List<WxOfflineActivityRecord> 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<size; i++){
WxOfflineActivityRecord record = recordDescList.get(i);
BigDecimal orderRatio = record.getOrderMoney()
.divide(orderMoneySum,4,RoundingMode.HALF_UP)
.multiply(new BigDecimal(100));
record.setOrderRatio(orderRatio);
lastRatio = lastRatio.subtract(orderRatio);
}
recordDescList.get(size).setOrderRatio(lastRatio);

for (WxOfflineActivityGrantItem wxOfflineActivityGrantItem : activityItem.getActivityGrantItemList()) {
List<WxOfflineActivityGrantSettlement> itemSettlementList = new ArrayList<>();
if(wxOfflineActivityGrantItem.getRecordId() != null){


+ 1
- 1
mallinkService/src/main/resources/mapper/WxOfflineActivityGrantCashBackMapper.xml View File

@@ -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})
</foreach>


Loading…
Cancel
Save