package com.xzx.gc.order.service;
|
|
import cn.hutool.core.codec.Base64;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.StrUtil;
|
import com.xzx.gc.common.constant.CommonEnum;
|
import com.xzx.gc.common.constant.Constants;
|
import com.xzx.gc.entity.*;
|
import com.xzx.gc.order.mapper.*;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* @author wzy
|
* @date 2021-07-14
|
**/
|
@Slf4j
|
@Service
|
@Transactional(rollbackFor = Exception.class)
|
public class DistribService {
|
|
@Autowired
|
private UserHeadDetailsMapper userHeadDetailsMapper;
|
@Autowired
|
private UserHeadRelateMapper userHeadRelateMapper;
|
@Autowired
|
private JhyOrderMapper jhyOrderMapper;
|
@Autowired
|
private RedPaperRuleMapper redPaperRuleMapper;
|
@Autowired
|
private JhyOrderItemsMapper jhyOrderItemsMapper;
|
@Autowired
|
private SysMessageMapper sysMessageMapper;
|
@Autowired
|
private AccountMapper accountMapper;
|
@Autowired
|
private UserMapper userMapper;
|
@Autowired
|
private ScoreDetailsMapper scoreDetailsMapper;
|
@Autowired
|
private UserShareInfoMapper userShareInfoMapper;
|
@Autowired
|
private OrderMapper orderMapper;
|
|
/**
|
* 团长积分/环保币返利规则
|
*
|
* @param orderId
|
* @param userId
|
*/
|
public void distribRecord(Long orderId, String userId) {
|
UserHeadRelate userHeadRelate = userHeadRelateMapper.selectRelateByUserId(userId);
|
if (userHeadRelate == null) {
|
return;
|
}
|
|
RedPaperRule redPaperRule = redPaperRuleMapper.selectDistribRule();
|
if (0 == redPaperRule.getStatus()) {
|
return;
|
}
|
|
Integer count = userHeadDetailsMapper.selectDetailsCount(userId);
|
UserInfo userInfo = userMapper.selectByPrimaryKey(userId);
|
AccountInfo accountInfo = accountMapper.selectAccountInfoByUserId(userHeadRelate.getHeadUserId());
|
|
if (AccountInfo.IS_PROHIBIT_Y.equals(accountInfo.getIsProhibit())) {
|
return;
|
}
|
|
List<String> remark = new ArrayList<>();
|
BigDecimal totalReturnScore = BigDecimal.ZERO;
|
BigDecimal totalReturnCoin = BigDecimal.ZERO;
|
|
BigDecimal totalScore = jhyOrderItemsMapper.selectOrderScoreByOrderId(orderId);
|
JhyOrder order = jhyOrderMapper.selectByPrimaryKey(orderId);
|
if (count == 0) {
|
String value = getRuleValue(redPaperRule, CommonEnum.团长首单奖励.getValue());
|
|
// 首单返利
|
if (StrUtil.isNotBlank(value) && !"0".equals(value)) {
|
BigDecimal money = new BigDecimal(value);
|
totalReturnCoin = totalReturnCoin.add(money);
|
remark.add("首单返利:" + money);
|
}
|
}
|
|
if (count > 0) {
|
String value = getRuleValue(redPaperRule, CommonEnum.首单后返利数量.getValue());
|
|
if (StrUtil.isNotBlank(value) && !"0".equals(value)) {
|
// 首单完成后,在value单内,返利积分或者环保币
|
if (count - 1 < Integer.parseInt(value)) {
|
String scoreStr = getRuleValue(redPaperRule, CommonEnum.返利固定积分.getValue());
|
String coinStr = getRuleValue(redPaperRule, CommonEnum.返利环保币比例.getValue());
|
// 根据积分返利固定积分
|
if (StrUtil.isNotBlank(scoreStr) && !"0".equals(scoreStr)) {
|
BigDecimal score = new BigDecimal(scoreStr);
|
totalReturnScore = totalReturnScore.add(score);
|
remark.add("首单完成后返固定积分:" + scoreStr);
|
}
|
|
// 根据订单总积分, 1:40比例,换算成环保币,返对应百分比
|
if (StrUtil.isNotBlank(coinStr) && !"0".equals(coinStr)) {
|
BigDecimal coinRatio = new BigDecimal(coinStr).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN);
|
BigDecimal totalCoin = totalScore.divide(new BigDecimal(Constants.PRICE_SCORE_EXCHANGE), 2, BigDecimal.ROUND_DOWN);
|
|
BigDecimal returnCoin = totalCoin.multiply(coinRatio).setScale(2, BigDecimal.ROUND_DOWN);
|
totalReturnCoin = totalReturnCoin.add(returnCoin);
|
remark.add("首单完成后返比例环保币:" + returnCoin +"(" + coinRatio +")");
|
}
|
|
// 当用户进行订单数量,超过value单后,每完成一单返利指定积分
|
} else {
|
String finishValue = getRuleValue(redPaperRule, CommonEnum.完成数量后返积分.getValue());
|
if (StrUtil.isNotBlank(finishValue) && !"0".equals(finishValue)) {
|
BigDecimal score = new BigDecimal(finishValue);
|
totalReturnScore = totalReturnScore.add(score);
|
remark.add("完成指定"+ Integer.parseInt(value) +"数量后每单返利:" + score);
|
}
|
}
|
}
|
}
|
|
if (totalReturnCoin.intValue() == 0 && totalReturnScore.intValue() == 0) {
|
return;
|
}
|
|
UserHeadDetails userHeadDetails = new UserHeadDetails();
|
userHeadDetails.setHeadUserId(userHeadRelate.getHeadUserId());
|
userHeadDetails.setUserId(userId);
|
userHeadDetails.setOrderNo(order.getOrderNo());
|
userHeadDetails.setAmount(totalReturnCoin);
|
userHeadDetails.setScore(totalReturnScore);
|
userHeadDetails.setCreatedTime(new Date());
|
userHeadDetails.setRemark(CollUtil.join(remark, ","));
|
userHeadDetailsMapper.insert(userHeadDetails);
|
|
userHeadRelate.setAmount(userHeadRelate.getAmount().add(totalReturnCoin));
|
userHeadRelate.setScore(userHeadRelate.getScore().add(totalReturnScore));
|
userHeadRelateMapper.updateByPrimaryKey(userHeadRelate);
|
|
accountInfo.setMoney(new BigDecimal(accountInfo.getMoney()).add(totalReturnCoin).setScale(2, BigDecimal.ROUND_DOWN).toString());
|
BigDecimal collectScore = StrUtil.isNotBlank(accountInfo.getCollectScore()) ? new BigDecimal(accountInfo.getCollectScore()) : BigDecimal.ZERO;
|
accountInfo.setCollectScore(collectScore.add(totalReturnScore).setScale(0, BigDecimal.ROUND_DOWN).toString());
|
accountMapper.updateByPrimaryKey(accountInfo);
|
|
if (totalReturnScore.compareTo(BigDecimal.ZERO) > 0) {
|
ScoreDetails scoreDetails = new ScoreDetails();
|
scoreDetails.setCurrentScore(new BigDecimal(accountInfo.getCollectScore()));
|
scoreDetails.setOriginalScore(collectScore);
|
scoreDetails.setChangeScore(totalReturnScore);
|
scoreDetails.setCreatedTime(new Date());
|
scoreDetails.setType(ScoreDetails.SCORE_TYPE_OTHER);
|
scoreDetails.setUserId(userHeadRelate.getHeadUserId());
|
scoreDetails.setOrderNo(order.getOrderNo());
|
scoreDetailsMapper.insert(scoreDetails);
|
}
|
|
SysMessage sysMessage = new SysMessage();
|
sysMessage.setCreateTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
|
sysMessage.setCreateUserId(userHeadRelate.getHeadUserId());
|
sysMessage.setUserId(userHeadRelate.getHeadUserId());
|
sysMessage.setMessageType("4");
|
sysMessage.setMessageSubTypeName("返利消息");
|
sysMessage.setMessage("收到用户:" + userInfo.getMobilePhone().replaceAll("(\\w{3})\\w*(\\w{4})", "$1****$2") + "的订单返利, 积分:" + totalReturnScore +", 环保币:" + totalReturnCoin);
|
sysMessage.setFlag("2");
|
sysMessageMapper.insert(sysMessage);
|
}
|
|
/**
|
* 普通用户邀请用户并下单返利规则
|
*
|
*/
|
public void inviteAddOrderScore(String userId, String orderId) {
|
UserInfo userInfo = userMapper.selectByPrimaryKey(userId);
|
UserShareInfo userShareInfo = userShareInfoMapper.selectUserShareInfoByInvited(userInfo.getMobilePhone());
|
|
if (userShareInfo == null) {
|
return;
|
}
|
|
// 查询当前用户邀请人信息,判断是否为团长,如果是团长,则不返利
|
AccountInfo accountInfo = accountMapper.selectAccountInfoByPhone(userShareInfo.getMobilePhone());
|
if (AccountInfo.IS_HEAD_Y.equals(accountInfo.getIsHead())) {
|
log.info("邀请人为团长, 不执行返利");
|
return;
|
}
|
|
if (AccountInfo.IS_PROHIBIT_Y.equals(accountInfo.getIsProhibit())) {
|
return;
|
}
|
|
List<RedPaperRule> rules = redPaperRuleMapper.selectRuleByType(10);
|
if (CollUtil.isEmpty(rules)) {
|
log.info("没有具体规则");
|
return;
|
}
|
|
RedPaperRule rule = rules.get(0);
|
if (rule.getStatus() == 0) {
|
log.info("规则被禁用, 不执行返利");
|
return;
|
}
|
|
List<OrderInfo> riderOrders = orderMapper.selectOrderNoWaitAndCancel(userId);
|
int riderCnt = 0;
|
if (CollUtil.isNotEmpty(riderOrders)) {
|
riderCnt = riderOrders.size();
|
}
|
|
List<JhyOrder> jhyOrders = jhyOrderMapper.selectJhyOrderNoWaitAndCancel(userId);
|
int jhyCnt = 0;
|
if (CollUtil.isNotEmpty(jhyOrders)) {
|
jhyCnt = jhyOrders.size();
|
}
|
|
// 仅首单返利
|
if (jhyCnt + riderCnt > 1) {
|
return;
|
}
|
|
String value = getRuleValue(rule, CommonEnum.推荐首单奖励.getValue());
|
BigDecimal returnScore = BigDecimal.ZERO;
|
if (StrUtil.isNotBlank(value)) {
|
returnScore = new BigDecimal(value);
|
}
|
|
BigDecimal collectScore = StrUtil.isNotBlank(accountInfo.getCollectScore()) ? new BigDecimal(accountInfo.getCollectScore()) : BigDecimal.ZERO;
|
accountInfo.setCollectScore(collectScore.add(returnScore).setScale(0, BigDecimal.ROUND_DOWN).toString());
|
accountMapper.updateByPrimaryKey(accountInfo);
|
|
if (returnScore.compareTo(BigDecimal.ZERO) > 0) {
|
ScoreDetails scoreDetails = new ScoreDetails();
|
scoreDetails.setCurrentScore(new BigDecimal(accountInfo.getCollectScore()));
|
scoreDetails.setOriginalScore(collectScore);
|
scoreDetails.setChangeScore(returnScore);
|
scoreDetails.setCreatedTime(new Date());
|
scoreDetails.setType(ScoreDetails.SCORE_TYPE_INVITE_FIRST_ORDER);
|
scoreDetails.setUserId(accountInfo.getUserId());
|
scoreDetails.setOrderNo(orderId.toString());
|
scoreDetailsMapper.insert(scoreDetails);
|
}
|
|
SysMessage sysMessage = new SysMessage();
|
sysMessage.setCreateTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
|
sysMessage.setCreateUserId(accountInfo.getUserId());
|
sysMessage.setUserId(accountInfo.getUserId());
|
sysMessage.setMessageType("4");
|
sysMessage.setMessageSubTypeName("返利消息");
|
sysMessage.setMessage("收到用户:" + userInfo.getMobilePhone().replaceAll("(\\w{3})\\w*(\\w{4})", "$1****$2") + "的订单返利, 积分:" + returnScore);
|
sysMessage.setFlag("2");
|
sysMessageMapper.insert(sysMessage);
|
|
}
|
|
private String getRuleValue(RedPaperRule redPaperRule, String key) {
|
List<String> rules = StrUtil.split(redPaperRule.getSharingProfitType(), ',');
|
List<String> values = StrUtil.split(redPaperRule.getShareRatio(), ',');
|
|
int i = rules.indexOf(key);
|
return values.get(i);
|
}
|
}
|