@@ -1,11 +1,9 @@
package com.iformall.service.impl;
package com.iformall.service.impl;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.entity.vo.BaseEntityTypeConstants;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSON;
import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils;
import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.iformall.common.IdWorker;
import com.iformall.common.IdWorker;
import com.iformall.common.Result;
import com.iformall.common.Result;
import com.iformall.domain.po.*;
import com.iformall.domain.po.*;
@@ -17,7 +15,6 @@ import com.iformall.exception.MallinkException;
import com.iformall.mapper.*;
import com.iformall.mapper.*;
import com.iformall.service.*;
import com.iformall.service.*;
import com.iformall.utils.DateUtils;
import com.iformall.utils.DateUtils;
import com.iformall.utils.DownFileUtil;
import org.slf4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired;
@@ -28,8 +25,6 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.math.RoundingMode;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.NumberFormat;
import java.text.NumberFormat;
import java.util.*;
import java.util.*;
import java.util.function.Function;
import java.util.function.Function;
@@ -77,6 +72,9 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
@Autowired
@Autowired
WxOfflineActivityRecordGrantService wxOfflineActivityRecordGrantService;
WxOfflineActivityRecordGrantService wxOfflineActivityRecordGrantService;
@Autowired
WxOfflineActivityGrantItemRecordService wxOfflineActivityGrantItemRecordService;
@Autowired
@Autowired
WxOfflineActivityItemService wxOfflineActivityItemService;
WxOfflineActivityItemService wxOfflineActivityItemService;
@@ -178,79 +176,56 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
if(!EnumOfflineActivityStatus.ON_LINE.getCode().equals(activity.getStatus())){
if(!EnumOfflineActivityStatus.ON_LINE.getCode().equals(activity.getStatus())){
throw new MallinkException(Result.ERROR, "请检查活动状态");
throw new MallinkException(Result.ERROR, "请检查活动状态");
}
}
//订单合并
//订单合并计算
handlerGrantData(activity,wxOfflineActivityGrantAward,true);
handlerGrantData(activity,wxOfflineActivityGrantAward,true);
//奖项处理
//奖项处理
List<WxOfflineActivityItem> activityItemList = wxOfflineActivityItemService.getActivityItemList(activity.getId(), activity.getTenantId());
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()){
activityItem.setRecordIds(records);
}
}
}
wxOfflineActivityGrantAward.setActivityItemList(activityItemList);
wxOfflineActivityGrantAward.setActivityItemList(activityItemList);
//
for(WxOfflineActivityItem activityItem : wxOfflineActivityGrantAward.getActivityItemList()){
for(WxOfflineActivityItem activityItem : wxOfflineActivityGrantAward.getActivityItemList()){
if(EnumOfflineActivityType.LOTTERY_DRAW.getCode().equals(activityItem.getType())){
if(EnumOfflineActivityType.LOTTERY_DRAW.getCode().equals(activityItem.getType())){
//计算商户商管分别承担金额
handlerAwardsSharePrice(activityItem.getActivityAwardsItemList());
if(wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(activityItem.getLimitMoney()) < 0){
activityItem.setIsMeet(false);
continue;
}
//处理发奖数量
activityItem.setIsMeet(true);
activityItem.setIsMeet(true);
//奖项限制数量
int limitCount = 0;
if(activityItem.getAwardsItemPrice() != null && activityItem.getAwardsItemPrice().compareTo(BigDecimal.ZERO) > 0){
limitCount = wxOfflineActivityGrantAward.getOrderMoneySum().divide(activityItem.getAwardsItemPrice(),0,BigDecimal.ROUND_HALF_DOWN).intValue();
}
if(activityItem.getAwardsItemLimit() != null && activityItem.getAwardsItemLimit() > 0
&& activityItem.getAwardsItemLimit() < limitCount){
limitCount = activityItem.getAwardsItemLimit();
handleLotteryDrawCount(activityItem,wxOfflineActivityGrantAward.getRecordList());
if(activityItem.getRealAwardsItemLimit() == 0){
activityItem.setIsMeet(false);
}
}
activityItem.setRealAwardsItemLimit(limitCount);
//计算商户商管分别承担金额
handlerAwardsSharePrice(activityItem.getActivityAwardsItemList());
}
}
else if(EnumOfflineActivityType.GIFT.getCode().equals(activityItem.getType())){
else if(EnumOfflineActivityType.GIFT.getCode().equals(activityItem.getType())){
//计算商户商管分别承担金额
//计算商户商管分别承担金额
handlerAwardsSharePrice(activityItem.getActivityAwardsItemList());
handlerAwardsSharePrice(activityItem.getActivityAwardsItemList());
List<WxOfflineActivityAwardsItem> sortAwardsItemList = activityItem.getActivityAwardsItemList().stream().sorted(Comparator.comparing(WxOfflineActivityAwardsItem::getMinAmount)).collect(toList());
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){
//处理发放奖项
handleGiftAwards(activityItem,wxOfflineActivityGrantAward.getRecordList());
activityItem.setIsMeet(true);
if(activityItem.getActivityGrantItemList() == null || activityItem.getActivityGrantItemList().isEmpty()){
activityItem.setIsMeet(false);
activityItem.setIsMeet(false);
continue;
}
}
activityItem.setIsMeet(true);
activityItem.setRealAwardsItemLimit(1);
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);
grantItem.setAwardPrice(grantAwardsItem.getPrice());
grantItem.setMoneyRule(grantAwardsItem.getMoneyRule());
grantItem.setMallShareRate(grantAwardsItem.getMallShareRate());
grantItem.setMallSharePrice(grantAwardsItem.getMallSharePrice());
grantItem.setMerchantShareRate(grantAwardsItem.getMerchantShareRate());
grantItem.setMerchantSharePrice(grantAwardsItem.getMerchantSharePrice());
activityItem.setActivityGrantItemList(Collections.singletonList(grantItem));
}
}
else if (EnumOfflineActivityType.CASHBACK.getCode().equals(activityItem.getType())) {
else if (EnumOfflineActivityType.CASHBACK.getCode().equals(activityItem.getType())) {
BigDecimal cashBackPriceTotal = BigDecimal.ZERO;
BigDecimal cashBackPriceTotal = BigDecimal.ZERO;
List<WxOfflineActivityGrantItem> grantItemList = new ArrayList<>();
List<WxOfflineActivityGrantItem> grantItemList = new ArrayList<>();
List<WxOfflineActivityAwardsItem> sortAwardsItemList = activityItem.getActivityAwardsItemList().stream().sorted(Comparator.comparing(WxOfflineActivityAwardsItem::getMinAmount)).collect(toList());
List<WxOfflineActivityAwardsItem> sortAwardsItemList = activityItem.getActivityAwardsItemList().stream().sorted(Comparator.comparing(WxOfflineActivityAwardsItem::getMinAmount)).collect(toList());
//单笔订单计算
//单笔订单计算
if(EnumOfflineActivityCalculationMode.ONE.getCode().equals(activityItem.getCalculationMode())){
if(EnumOfflineActivityMode.ONE.getCode().equals(activityItem.getModeType())){
for (WxOfflineActivityRecord record : wxOfflineActivityGrantAward.getRecordList()){
for (WxOfflineActivityRecord record : wxOfflineActivityGrantAward.getRecordList()){
WxOfflineActivityAwardsItem grantAwardsItem = null;
WxOfflineActivityAwardsItem grantAwardsItem = null;
for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){
for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){
@@ -300,27 +275,33 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
}
}
}else{
}else{
BigDecimal orderMoneySum = wxOfflineActivityGrantAward.getRecordList().stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){
orderMoneySum = wxOfflineActivityGrantAward.getRecordList().stream()
.filter(record -> activityItem.getRecordIds().contains(record.getId()))
.map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
}
WxOfflineActivityAwardsItem grantAwardsItem = null;
WxOfflineActivityAwardsItem grantAwardsItem = null;
for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){
for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){
if((awardsItem.getMinAmount() == null || wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(awardsItem.getMinAmount()) >= 0)
&& (awardsItem.getMaxAmount() == null || wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(awardsItem.getMaxAmount()) <= 0)){
if((awardsItem.getMinAmount() == null || orderMoneySum .compareTo(awardsItem.getMinAmount()) >= 0)
&& (awardsItem.getMaxAmount() == null || orderMoneySum .compareTo(awardsItem.getMaxAmount()) <= 0)){
grantAwardsItem = awardsItem;
grantAwardsItem = awardsItem;
}
}
}
}
if(grantAwardsItem != null){
if(grantAwardsItem != null){
//计算返现金额
//计算返现金额
BigDecimal cashBackPrice = wxOfflineActivityGrantAward.getOrderMoneySum()
BigDecimal cashBackPrice = orderMoneySum
.multiply(grantAwardsItem.getCashBackRatio().divide(new BigDecimal(100)));
.multiply(grantAwardsItem.getCashBackRatio().divide(new BigDecimal(100)));
cashBackPriceTotal = cashBackPriceTotal.add(cashBackPrice);
cashBackPriceTotal = cashBackPriceTotal.add(cashBackPrice);
}
}
}
}
if(activityItem.getActivityAwardsItemSecondList() != null && !activityItem.getActivityAwardsItemSecondList().isEmpty()){
List<Long> merchantIds = wxOfflineActivityGrantAward.getRecordList().stream().map(WxOfflineActivityRecord::getMerchantId).distinct().collect(toList());
Map<Integer, WxOfflineActivityAwardsItem> collect = activityItem.getActivityAwardsItemSecondList().stream().collect(toMap(WxOfflineActivityAwardsItem::getMerchantCount, Function.identity()));
WxOfflineActivityAwardsItem grantAwardsSecondItem = collect.get(merchantIds.size() );
Integer jointCount = getJointCount(activityItem,wxOfflineActivityGrantAward.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){
if(grantAwardsSecondItem != null){
//计算返现金额
//计算返现金额
BigDecimal cashBackPrice = wxOfflineActivityGrantAward.getOrderMoneySum()
BigDecimal cashBackPrice = wxOfflineActivityGrantAward.getOrderMoneySum()
@@ -348,7 +329,6 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
activityGrantCashBack.setActivityItemName(activityItem.getName());
activityGrantCashBack.setActivityItemName(activityItem.getName());
activityGrantCashBack.setActivityItemType(activityItem.getType());
activityGrantCashBack.setActivityItemType(activityItem.getType());
activityGrantCashBack.setAwardsItemRule(activityItem.getAwardsItemRule());
activityGrantCashBack.setAwardsItemRule(activityItem.getAwardsItemRule());
activityGrantCashBack.setCalculationMode(activityItem.getCalculationMode());
activityGrantCashBack.setMaxAmount(activityItem.getMaxAmount());
activityGrantCashBack.setMaxAmount(activityItem.getMaxAmount());
activityGrantCashBack.setStartingTaxPoint(activityItem.getStartingTaxPoint());
activityGrantCashBack.setStartingTaxPoint(activityItem.getStartingTaxPoint());
activityGrantCashBack.setTaxPoints(activityItem.getTaxPoints());
activityGrantCashBack.setTaxPoints(activityItem.getTaxPoints());
@@ -385,6 +365,150 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
}
}
}
}
private void handleLotteryDrawCount(WxOfflineActivityItem activityItem, List<WxOfflineActivityRecord> recordList){
int limitCount = 0;
if(EnumOfflineActivityMode.ONE.getCode().equals(activityItem.getModeType())){
for(WxOfflineActivityRecord record :recordList){
Integer record_count = 0;
for (WxOfflineActivityAwardsModel activityAwardsModel :activityItem.getActivityAwardsModelList()){
if((activityAwardsModel.getMinAmount() == null || record.getOrderMoney().compareTo(activityAwardsModel.getMinAmount()) >= 0)
&& (activityAwardsModel.getMaxAmount() == null || record.getOrderMoney().compareTo(activityAwardsModel.getMaxAmount()) <= 0)){
record_count = activityAwardsModel.getAwardsCount();
}
}
limitCount += record_count;
}
}else{
BigDecimal orderMoneySum = recordList.stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){
orderMoneySum = recordList.stream()
.filter(record -> activityItem.getRecordIds().contains(record.getId()))
.map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
}
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);
if(jointCount != 0){
Map<Integer, WxOfflineActivityAwardsModel> jointCountMap = activityItem.getActivityAwardsModelSecondList().stream().collect(toMap(WxOfflineActivityAwardsModel::getMerchantCount, Function.identity()));
WxOfflineActivityAwardsModel activityAwardsModel = jointCountMap.get(jointCount);
limitCount += activityAwardsModel.getAwardsCount();
}
if(activityItem.getAwardsItemLimit() != null && activityItem.getAwardsItemLimit() > 0
&& activityItem.getAwardsItemLimit() < limitCount){
limitCount = activityItem.getAwardsItemLimit();
}
activityItem.setRealAwardsItemLimit(limitCount);
}
private void handleGiftAwards(WxOfflineActivityItem activityItem, List<WxOfflineActivityRecord> recordList){
Map<Integer,WxOfflineActivityGrantItem> grantItemMap = new HashMap<>();
Map<Integer, WxOfflineActivityAwardsItem> awardsItemMap = activityItem.getActivityAwardsItemList().stream().collect(toMap(WxOfflineActivityAwardsItem::getGrade, Function.identity()));
if(EnumOfflineActivityMode.ONE.getCode().equals(activityItem.getModeType())){
for(WxOfflineActivityRecord record :recordList){
Integer awardsGrade = null;
for (WxOfflineActivityAwardsModel activityAwardsModel :activityItem.getActivityAwardsModelList()){
if((activityAwardsModel.getMinAmount() == null || record.getOrderMoney().compareTo(activityAwardsModel.getMinAmount()) >= 0)
&& (activityAwardsModel.getMaxAmount() == null || record.getOrderMoney().compareTo(activityAwardsModel.getMaxAmount()) <= 0)){
awardsGrade = activityAwardsModel.getAwardsGrade();
}
}
if(awardsGrade == null){
break;
}
WxOfflineActivityGrantItem wxOfflineActivityGrantItem = grantItemMap.get(awardsGrade);
if(wxOfflineActivityGrantItem != null){
wxOfflineActivityGrantItem.setAwardCount(wxOfflineActivityGrantItem.getAwardCount() + 1);
}else{
WxOfflineActivityAwardsItem awardsItem = awardsItemMap.get(awardsGrade);
wxOfflineActivityGrantItem = createGrantItemFromGrant(activityItem, awardsItem);
grantItemMap.put(awardsGrade, wxOfflineActivityGrantItem);
}
}
}else{
BigDecimal orderMoneySum = recordList.stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){
orderMoneySum = recordList.stream()
.filter(record -> activityItem.getRecordIds().contains(record.getId()))
.map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
}
Integer awardsGrade = null;
for (WxOfflineActivityAwardsModel activityAwardsModel :activityItem.getActivityAwardsModelList()){
if((activityAwardsModel.getMinAmount() == null || orderMoneySum.compareTo(activityAwardsModel.getMinAmount()) >= 0)
&& (activityAwardsModel.getMaxAmount() == null || orderMoneySum.compareTo(activityAwardsModel.getMaxAmount()) <= 0)){
awardsGrade = activityAwardsModel.getAwardsGrade();
}
}
if(awardsGrade != null){
WxOfflineActivityAwardsItem awardsItem = awardsItemMap.get(awardsGrade);
WxOfflineActivityGrantItem wxOfflineActivityGrantItem = createGrantItemFromGrant(activityItem, awardsItem);
grantItemMap.put(awardsGrade, wxOfflineActivityGrantItem);
}
}
Integer jointCount = getJointCount(activityItem,recordList);
if(jointCount != 0){
Map<Integer, WxOfflineActivityAwardsModel> jointCountMap = activityItem.getActivityAwardsModelSecondList().stream().collect(toMap(WxOfflineActivityAwardsModel::getMerchantCount, Function.identity()));
WxOfflineActivityAwardsModel activityAwardsModel = jointCountMap.get(jointCount);
WxOfflineActivityGrantItem wxOfflineActivityGrantItem = grantItemMap.get(activityAwardsModel.getAwardsGrade());
if(wxOfflineActivityGrantItem != null){
wxOfflineActivityGrantItem.setAwardCount(wxOfflineActivityGrantItem.getAwardCount() + 1);
}else{
WxOfflineActivityAwardsItem awardsItem = awardsItemMap.get(activityAwardsModel.getAwardsGrade());
wxOfflineActivityGrantItem = createGrantItemFromGrant(activityItem, awardsItem);
grantItemMap.put(activityAwardsModel.getAwardsGrade(), wxOfflineActivityGrantItem);
}
}
if(!grantItemMap.isEmpty()){
activityItem.setActivityGrantItemList(new ArrayList<>(grantItemMap.values()));
}
}
private Integer getJointCount(WxOfflineActivityItem activityItem, List<WxOfflineActivityRecord> recordList){
Integer jointCount = 0;
if(EnumOfflineActivityCountMode.MERCHANT_MODEL.getCode().equals(activityItem.getCountModel())){
//商户联单
List<Long> merchantIds = recordList.stream().map(WxOfflineActivityRecord::getMerchantId).distinct().collect(toList());
jointCount = merchantIds.size();
}else if(EnumOfflineActivityCountMode.BUSINESS_MODEL.getCode().equals(activityItem.getCountModel())){
//业态联单
List<Integer> businessIds = recordList.stream().map(WxOfflineActivityRecord::getBusinessId).distinct().collect(toList());
jointCount = businessIds.size();
}
return jointCount;
}
private WxOfflineActivityGrantItem createGrantItemFromGrant(WxOfflineActivityItem activityItem,WxOfflineActivityAwardsItem grantAwardsItem){
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);
grantItem.setAwardPrice(grantAwardsItem.getPrice());
grantItem.setMoneyRule(grantAwardsItem.getMoneyRule());
grantItem.setMallShareRate(grantAwardsItem.getMallShareRate());
grantItem.setMallSharePrice(grantAwardsItem.getMallSharePrice());
grantItem.setMerchantShareRate(grantAwardsItem.getMerchantShareRate());
grantItem.setMerchantSharePrice(grantAwardsItem.getMerchantSharePrice());
return grantItem;
}
private WxOfflineActivityGrantCashBack getLastActivityGrantCashBack(WxOfflineActivityGrantAward wxOfflineActivityGrantAward,Long activityId,Long activityItemId){
private WxOfflineActivityGrantCashBack getLastActivityGrantCashBack(WxOfflineActivityGrantAward wxOfflineActivityGrantAward,Long activityId,Long activityItemId){
Long grantId = wxOfflineActivityGrantAwardMapper.getLastId(wxOfflineActivityGrantAward);
Long grantId = wxOfflineActivityGrantAwardMapper.getLastId(wxOfflineActivityGrantAward);
if(grantId == null){
if(grantId == null){
@@ -424,6 +548,7 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
}
}
handlerGrantData(activity,wxOfflineActivityGrantAward,false);
handlerGrantData(activity,wxOfflineActivityGrantAward,false);
Date now = new Date();
Date now = new Date();
final IdWorker idWorker = IdWorker.get();
final IdWorker idWorker = IdWorker.get();
wxOfflineActivityGrantAward.setId(idWorker.nextId());
wxOfflineActivityGrantAward.setId(idWorker.nextId());
@@ -441,7 +566,9 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
upd.setUpdateDate(now);
upd.setUpdateDate(now);
wxOfflineActivityGrantAwardMapper.updateStatusNo(upd);
wxOfflineActivityGrantAwardMapper.updateStatusNo(upd);
//创建订单关联
wxOfflineActivityRecordGrantService.insertFromGrantAward(wxOfflineActivityGrantAward);
wxOfflineActivityRecordGrantService.insertFromGrantAward(wxOfflineActivityGrantAward);
wxOfflineActivityGrantItemRecordService.insertFromGrantAward(wxOfflineActivityGrantAward);
//处理奖项
//处理奖项
handlerGrantItem(activity,wxOfflineActivityGrantAward);
handlerGrantItem(activity,wxOfflineActivityGrantAward);
@@ -518,6 +645,7 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
List<WxOfflineActivityItem> activityItemList = wxOfflineActivityItemService.getActivityItemList(activity.getId(), activity.getTenantId());
List<WxOfflineActivityItem> activityItemList = wxOfflineActivityItemService.getActivityItemList(activity.getId(), activity.getTenantId());
int i = 0;//检查活动奖项
int i = 0;//检查活动奖项
for (WxOfflineActivityItem activityItem : activityItemList) {
for (WxOfflineActivityItem activityItem : activityItemList) {
@@ -530,13 +658,14 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
activityGrantItemList = grantActivityItem.getActivityGrantItemList();
activityGrantItemList = grantActivityItem.getActivityGrantItemList();
}
}
if(EnumOfflineActivityType.LOTTERY_DRAW.getCode().equals(activityItem.getType())){
if(EnumOfflineActivityType.LOTTERY_DRAW.getCode().equals(activityItem.getType())
|| EnumOfflineActivityType.GIFT.getCode().equals(activityItem.getType())){
if(activityGrantItemList == null || activityGrantItemList.isEmpty()){
if(activityGrantItemList == null || activityGrantItemList.isEmpty()){
continue;
continue;
}
}
if(wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(activityItem.getLimitMoney()) < 0){
throw new MallinkException(Result.ERROR, "活动项"+activityItem.getName()+"金额不满足");
}
// if(wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(activityItem.getLimitMoney()) < 0){
// throw new MallinkException(Result.ERROR, "活动项"+activityItem.getName()+"金额不满足");
// }
boolean isRepeat = activityGrantItemList.stream()
boolean isRepeat = activityGrantItemList.stream()
.collect(groupingBy(WxOfflineActivityGrantItem::getAwardItamId, counting()))
.collect(groupingBy(WxOfflineActivityGrantItem::getAwardItamId, counting()))
@@ -545,20 +674,6 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
throw new MallinkException(Result.ERROR, "请检查活动奖项存在重复");
throw new MallinkException(Result.ERROR, "请检查活动奖项存在重复");
}
}
//奖项限制数量
int limitCount = 0;
if(activityItem.getAwardsItemPrice() != null && activityItem.getAwardsItemPrice().compareTo(BigDecimal.ZERO) > 0){
limitCount = wxOfflineActivityGrantAward.getOrderMoneySum().divide(activityItem.getAwardsItemPrice(),0,BigDecimal.ROUND_HALF_DOWN).intValue();
}
if(activityItem.getAwardsItemLimit() != null && activityItem.getAwardsItemLimit() > 0
&& activityItem.getAwardsItemLimit() < limitCount){
limitCount = activityItem.getAwardsItemLimit();
}
if(limitCount != 0 && activityGrantItemList.stream().mapToInt(WxOfflineActivityGrantItem::getAwardCount).sum()>limitCount){
throw new MallinkException(Result.ERROR, "活动项"+activityItem.getName()+"奖券超过限制");
}
for (WxOfflineActivityGrantItem grantGrantItem : activityGrantItemList) {
for (WxOfflineActivityGrantItem grantGrantItem : activityGrantItemList) {
if(grantGrantItem.getAwardItamId() == null){
if(grantGrantItem.getAwardItamId() == null){
throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数");
throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数");
@@ -573,42 +688,40 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
activityItem.setActivityGrantItemList(activityGrantItemList);
activityItem.setActivityGrantItemList(activityGrantItemList);
}
}
else if(EnumOfflineActivityType.GIFT.getCode().equals(activityItem.getType())){
if(activityGrantItemList == null || activityGrantItemList.isEmpty()){
continue;
}
if(activityGrantItemList.size() != 1){
throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数");
}
WxOfflineActivityGrantItem grantGrantItem = activityGrantItemList.get(0);
if(grantGrantItem.getAwardItamId() == null){
throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数");
}
WxOfflineActivityAwardsItem awardsItem = awardsItemMap.get(grantGrantItem.getAwardItamId());
if(awardsItem == null){
throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数");
}
// if(awardsItem.getMinAmount() != null && wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(awardsItem.getMinAmount()) < 0){
// throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数(金额不在范围类)");
// else if(EnumOfflineActivityType.GIFT.getCode().equals(activityItem.getType())){
// if(activityGrantItemList == null || activityGrantItemList.isEmpty()){
// continue;
// }
// }
if((awardsItem.getMinAmount() != null && wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(awardsItem.getMinAmount()) < 0)
|| (awardsItem.getMaxAmount() != null && wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(awardsItem.getMaxAmount()) > 0)){
throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数(金额不在范围类)");
}
handlerGrantItem(grantGrantItem,activity,activityItem,awardsItem);
activityItem.setActivityGrantItemList(activityGrantItemList);
}
//
// boolean isRepeat = activityGrantItemList.stream()
// .collect(groupingBy(WxOfflineActivityGrantItem::getAwardItamId, counting()))
// .entrySet().stream().anyMatch(e -> e.getValue() > 1);
// if(isRepeat){
// throw new MallinkException(Result.ERROR, "请检查活动奖项存在重复");
// }
//
// for (WxOfflineActivityGrantItem grantGrantItem : activityGrantItemList) {
// if(grantGrantItem.getAwardItamId() == null){
// throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数");
// }
// WxOfflineActivityAwardsItem awardsItem = awardsItemMap.get(grantGrantItem.getAwardItamId());
// if(awardsItem == null){
// throw new MallinkException(Result.ERROR, "请检查活动"+activityItem.getName()+"奖项参数");
// }
//
// handlerGrantItem(grantGrantItem,activity,activityItem,awardsItem);
// }
//
// activityItem.setActivityGrantItemList(activityGrantItemList);
//
// }
else if (EnumOfflineActivityType.CASHBACK.getCode().equals(activityItem.getType())) {
else if (EnumOfflineActivityType.CASHBACK.getCode().equals(activityItem.getType())) {
BigDecimal cashBackPriceTotal = BigDecimal.ZERO;
BigDecimal cashBackPriceTotal = BigDecimal.ZERO;
activityGrantItemList = new ArrayList<>();
activityGrantItemList = new ArrayList<>();
List<WxOfflineActivityAwardsItem> sortAwardsItemList = activityItem.getActivityAwardsItemList().stream().sorted(Comparator.comparing(WxOfflineActivityAwardsItem::getMinAmount)).collect(toList());
List<WxOfflineActivityAwardsItem> sortAwardsItemList = activityItem.getActivityAwardsItemList().stream().sorted(Comparator.comparing(WxOfflineActivityAwardsItem::getMinAmount)).collect(toList());
//单笔订单计算
//单笔订单计算
if(EnumOfflineActivityCalculationMode.ONE.getCode().equals(activityItem.getCalculationMode())){
if(EnumOfflineActivityMode.ONE.getCode().equals(activityItem.getModeTyp e())){
for (WxOfflineActivityRecord record : wxOfflineActivityGrantAward.getRecordList()){
for (WxOfflineActivityRecord record : wxOfflineActivityGrantAward.getRecordList()){
WxOfflineActivityAwardsItem grantAwardsItem = null;
WxOfflineActivityAwardsItem grantAwardsItem = null;
for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){
for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){
@@ -634,18 +747,24 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
}
}
}else{
}else{
BigDecimal orderMoneySum = wxOfflineActivityGrantAward.getRecordList().stream().map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
if(EnumOfflineActivityMode.CONDITION_SUM.getCode().equals(activityItem.getModeType())){
orderMoneySum = wxOfflineActivityGrantAward.getRecordList().stream()
.filter(record -> activityItem.getRecordIds().contains(record.getId()))
.map(WxOfflineActivityRecord::getOrderMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
}
WxOfflineActivityAwardsItem grantAwardsItem = null;
WxOfflineActivityAwardsItem grantAwardsItem = null;
for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){
for(WxOfflineActivityAwardsItem awardsItem : sortAwardsItemList){
if((awardsItem.getMinAmount() == null || wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(awardsItem.getMinAmount()) >= 0)
&& (awardsItem.getMaxAmount() == null || wxOfflineActivityGrantAward.getOrderMoneySum().compareTo(awardsItem.getMaxAmount()) <= 0)){
if((awardsItem.getMinAmount() == null || orderMoneySum .compareTo(awardsItem.getMinAmount()) >= 0)
&& (awardsItem.getMaxAmount() == null || orderMoneySum .compareTo(awardsItem.getMaxAmount()) <= 0)){
grantAwardsItem = awardsItem;
grantAwardsItem = awardsItem;
}
}
}
}
if(grantAwardsItem != null){
if(grantAwardsItem != null){
WxOfflineActivityGrantItem grantGrantItem = new WxOfflineActivityGrantItem();
WxOfflineActivityGrantItem grantGrantItem = new WxOfflineActivityGrantItem();
//计算返现金额
//计算返现金额
BigDecimal cashBackPrice = wxOfflineActivityGrantAward.getOrderMoneySum()
BigDecimal cashBackPrice = orderMoneySum
.multiply(grantAwardsItem.getCashBackRatio().divide(new BigDecimal(100)));
.multiply(grantAwardsItem.getCashBackRatio().divide(new BigDecimal(100)));
grantAwardsItem.setPrice(cashBackPrice);
grantAwardsItem.setPrice(cashBackPrice);
handlerGrantItem(grantGrantItem,activity,activityItem,grantAwardsItem);
handlerGrantItem(grantGrantItem,activity,activityItem,grantAwardsItem);
@@ -653,13 +772,12 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
activityGrantItemList.add(grantGrantItem);
activityGrantItemList.add(grantGrantItem);
cashBackPriceTotal = cashBackPriceTotal.add(cashBackPrice);
cashBackPriceTotal = cashBackPriceTotal.add(cashBackPrice);
}
}
}
}
if(activityItem.getActivityAwardsItemSecondList() != null && !activityItem.getActivityAwardsItemSecondList().isEmpty()){
List<Long> merchantIds = wxOfflineActivityGrantAward.getRecordList().stream().map(WxOfflineActivityRecord::getMerchantId).distinct().collect(toList());
Map<Integer, WxOfflineActivityAwardsItem> collect = activityItem.getActivityAwardsItemSecondList().stream().collect(toMap(WxOfflineActivityAwardsItem::getMerchantCount, Function.identity()));
WxOfflineActivityAwardsItem awardsSecondItem = collect.get(merchantIds.size() );
Integer jointCount = getJointCount(activityItem,wxOfflineActivityGrantAward.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){
if(awardsSecondItem != null){
WxOfflineActivityGrantItem grantGrantItem = new WxOfflineActivityGrantItem();
WxOfflineActivityGrantItem grantGrantItem = new WxOfflineActivityGrantItem();
//计算返现金额
//计算返现金额
@@ -671,7 +789,6 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
activityGrantItemList.add(grantGrantItem);
activityGrantItemList.add(grantGrantItem);
cashBackPriceTotal = cashBackPriceTotal.add(cashBackPrice);
cashBackPriceTotal = cashBackPriceTotal.add(cashBackPrice);
}
}
}
}
BigDecimal prop = BigDecimal.ONE;
BigDecimal prop = BigDecimal.ONE;
@@ -707,7 +824,6 @@ public class WxOfflineActivityGrantAwardServiceImpl implements WxOfflineActivity
activityGrantCashBack.setActivityItemName(activityItem.getName());
activityGrantCashBack.setActivityItemName(activityItem.getName());
activityGrantCashBack.setActivityItemType(activityItem.getType());
activityGrantCashBack.setActivityItemType(activityItem.getType());
activityGrantCashBack.setAwardsItemRule(activityItem.getAwardsItemRule());
activityGrantCashBack.setAwardsItemRule(activityItem.getAwardsItemRule());
activityGrantCashBack.setCalculationMode(activityItem.getCalculationMode());
activityGrantCashBack.setMaxAmount(activityItem.getMaxAmount());
activityGrantCashBack.setMaxAmount(activityItem.getMaxAmount());
activityGrantCashBack.setStartingTaxPoint(activityItem.getStartingTaxPoint());
activityGrantCashBack.setStartingTaxPoint(activityItem.getStartingTaxPoint());
activityGrantCashBack.setTaxPoints(activityItem.getTaxPoints());
activityGrantCashBack.setTaxPoints(activityItem.getTaxPoints());