package cc.mrbird.febs.mall.service.impl;
|
|
import cc.mrbird.febs.common.entity.FebsResponse;
|
import cc.mrbird.febs.common.enumerates.*;
|
import cc.mrbird.febs.common.exception.FebsException;
|
import cc.mrbird.febs.common.utils.AppContants;
|
import cc.mrbird.febs.common.utils.HttpCurlUtil;
|
import cc.mrbird.febs.common.utils.ShareCodeUtil;
|
import cc.mrbird.febs.mall.entity.*;
|
import cc.mrbird.febs.mall.mapper.*;
|
import cc.mrbird.febs.mall.service.*;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.date.DateField;
|
import cn.hutool.core.date.DateTime;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.crypto.SecureUtil;
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import jdk.nashorn.internal.ir.IfNode;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpStatus;
|
import org.springframework.http.MediaType;
|
import org.springframework.http.converter.StringHttpMessageConverter;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.web.client.RestTemplate;
|
|
import javax.annotation.Resource;
|
import java.io.IOException;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.nio.charset.Charset;
|
import java.util.*;
|
|
/**
|
* @author wzy
|
* @date 2021-09-26
|
**/
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class AgentServiceImpl implements IAgentService {
|
|
private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
|
private final MallMemberMapper memberMapper;
|
private final MallMemberWalletMapper mallMemberWalletMapper;
|
private final RestTemplate restTemplate;
|
private final MallOrderInfoMapper mallOrderInfoMapper;
|
private final MallOrderItemMapper mallOrderItemMapper;
|
private final MallGoodsMapper mallGoodsMapper;
|
private final IApiMallMemberWalletService memberWalletService;
|
private final MallRollPerkMapper mallRollPerkMapper;
|
private final IMallMoneyFlowService mallMoneyFlowService;
|
private final MallMemberClassMapper mallMemberClassMapper;
|
private final MallMemberHouseMapper mallMemberHouseMapper;
|
private final MallMoneyFlowMapper mallMoneyFlowMapper;
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void autoUpAgentLevel(Long memberId) {
|
MallMember member = memberMapper.selectById(memberId);
|
if(StrUtil.isBlank(member.getReferrerIds())) {
|
return;
|
}
|
|
List<String> ids = StrUtil.split(member.getReferrerIds(), ',');
|
List<MallMember> parentMembers = memberMapper.selectByInviteIds(ids);
|
for (MallMember parent : parentMembers) {
|
// 未激活用户无法升级
|
if (AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())) {
|
continue;
|
}
|
|
DataDictionaryCustom nextLevel = dataDictionaryCustomMapper.selectNextAgentLevelInfo(parent.getLevel());
|
if (nextLevel == null) {
|
log.info("当前层级无下一级:{}", parent.getLevel());
|
continue;
|
}
|
|
AgentInfo agentInfo = JSONObject.parseObject(nextLevel.getValue(), AgentInfo.class);
|
if (!directMemberCnt(parent, agentInfo)) {
|
continue;
|
}
|
|
if (!agentCntFinish(parent, agentInfo)) {
|
continue;
|
}
|
|
if (!teamIncome(parent, agentInfo)) {
|
continue;
|
}
|
|
parent.setLevel(nextLevel.getCode());
|
memberMapper.updateById(parent);
|
}
|
}
|
|
/**
|
* 判断直推人数是否达标
|
*
|
* @param member
|
* @return
|
*/
|
private boolean directMemberCnt(MallMember member, AgentInfo agentInfo) {
|
List<MallMember> childs = memberMapper.selectByRefererId(member.getInviteId());
|
if (CollUtil.isEmpty(childs)) {
|
return false;
|
}
|
|
if (childs.size() >= agentInfo.getDirectCnt()) {
|
return true;
|
}
|
|
log.info("用户:{}直推数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getLevel(), childs.size(), agentInfo.getLastAgentCnt());
|
return false;
|
}
|
|
/**
|
* 判断下级代理数量是否达标
|
*
|
* @return
|
*/
|
private boolean agentCntFinish(MallMember member, AgentInfo agentInfo) {
|
if (agentInfo.getLastAgentCnt() == null || agentInfo.getLastAgentCnt() == 0) {
|
return true;
|
}
|
|
// 直推用户
|
List<MallMember> directMember = memberMapper.selectByRefererId(member.getInviteId());
|
if (CollUtil.isEmpty(directMember)) {
|
return false;
|
}
|
|
// 用户团队达到指定代理数量,且都不在同一条线
|
int i = 0;
|
for (MallMember child : directMember) {
|
List<MallMember> mallMembers = memberMapper.selectChildAgentList(child.getInviteId(), member.getLevel());
|
if (CollUtil.isNotEmpty(mallMembers)) {
|
i++;
|
}
|
}
|
|
if (i >= agentInfo.getLastAgentCnt()) {
|
return true;
|
}
|
|
log.info("用户:{}代理数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getLevel(), i, agentInfo.getLastAgentCnt());
|
return false;
|
}
|
|
/**
|
* 团队业绩是否达标
|
*
|
* @param agentInfo
|
* @return
|
*/
|
private boolean teamIncome(MallMember member, AgentInfo agentInfo) {
|
BigDecimal totalIncome = memberMapper.selectAchieveByMemberId(member.getInviteId(), 2);
|
|
BigDecimal targetIncome = agentInfo.getTeamIncome().multiply(new BigDecimal("10000"));
|
if (totalIncome.compareTo(targetIncome) >= 0) {
|
return true;
|
}
|
|
log.info("用户:{}团队业绩未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getLevel(), totalIncome, targetIncome);
|
return false;
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void returnMoneyToAgent(Long orderId) {
|
}
|
|
@Override
|
public void rankReturnMoney(Long orderId) {
|
|
}
|
|
@Override
|
public void addMember(String memberOpenId) {
|
MallMember mallMember = memberMapper.selectMemberByOpenId(memberOpenId);
|
//根据OPENID,查询用户信息,如果存在,直接返回
|
if (ObjectUtil.isNotEmpty(mallMember)) {
|
mallMember.setSubStatus(MallMember.SUB_STATUS_ENABLE);
|
memberMapper.updateById(mallMember);
|
return;
|
}
|
mallMember = new MallMember();
|
mallMember.setPassword(SecureUtil.md5("a123456"));
|
mallMember.setName("微信用户");
|
mallMember.setSubStatus(MallMember.SUB_STATUS_ENABLE);
|
mallMember.setReferrerId(null);
|
mallMember.setPhone(null);
|
mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE);
|
mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL);
|
mallMember.setLevel(AgentLevelEnum.ZERO_LEVEL.name());
|
mallMember.setSex("男");
|
mallMember.setBindPhone(null);
|
mallMember.setOpenId(memberOpenId);
|
memberMapper.insert(mallMember);
|
//生成邀请码
|
String inviteId = ShareCodeUtil.toSerialCode(mallMember.getId());
|
mallMember.setInviteId(inviteId);
|
//推荐人和推荐人链
|
boolean flag = false;
|
String parentId = mallMember.getReferrerId();
|
if (StrUtil.isBlank(parentId)) {
|
flag = true;
|
}
|
String ids = "";
|
while (!flag) {
|
if (StrUtil.isBlank(ids)) {
|
ids += parentId;
|
} else {
|
ids += ("," + parentId);
|
}
|
MallMember parentMember = memberMapper.selectInfoByInviteId(parentId);
|
if (parentMember == null) {
|
break;
|
}
|
parentId = parentMember.getReferrerId();
|
if (StrUtil.isBlank(parentMember.getReferrerId())) {
|
flag = true;
|
}
|
}
|
if (StrUtil.isNotBlank(ids)) {
|
mallMember.setReferrerIds(ids);
|
}
|
memberMapper.updateById(mallMember);
|
//初始化钱包信息
|
MallMemberWallet wallet = new MallMemberWallet();
|
wallet.setBalance(BigDecimal.ZERO);
|
wallet.setMemberId(mallMember.getId());
|
mallMemberWalletMapper.insert(wallet);
|
return;
|
}
|
|
@Override
|
public void addMemberScan(String str) {
|
|
String[] split = StrUtil.split(str, "@");
|
String referrerId = split[0];
|
String openId = split[1];
|
MallMember mallMember = memberMapper.selectMemberByOpenId(openId);
|
if (ObjectUtil.isNotEmpty(mallMember)) {
|
return;
|
}
|
mallMember = new MallMember();
|
mallMember.setPassword(SecureUtil.md5("a123456"));
|
mallMember.setName("微信用户");
|
mallMember.setSubStatus(MallMember.SUB_STATUS_DISABLED);
|
mallMember.setReferrerId(referrerId);
|
mallMember.setPhone(null);
|
mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE);
|
mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL);
|
mallMember.setLevel(AgentLevelEnum.ZERO_LEVEL.name());
|
mallMember.setSex("男");
|
mallMember.setBindPhone(null);
|
mallMember.setOpenId(openId);
|
memberMapper.insert(mallMember);
|
//生成邀请码
|
String inviteId = ShareCodeUtil.toSerialCode(mallMember.getId());
|
mallMember.setInviteId(inviteId);
|
//推荐人和推荐人链
|
boolean flag = false;
|
String parentId = mallMember.getReferrerId();
|
if (StrUtil.isBlank(parentId)) {
|
flag = true;
|
}
|
String ids = "";
|
while (!flag) {
|
if (StrUtil.isBlank(ids)) {
|
ids += parentId;
|
} else {
|
ids += ("," + parentId);
|
}
|
MallMember parentMember = memberMapper.selectInfoByInviteId(parentId);
|
if (parentMember == null) {
|
break;
|
}
|
parentId = parentMember.getReferrerId();
|
if (StrUtil.isBlank(parentMember.getReferrerId())) {
|
flag = true;
|
}
|
}
|
if (StrUtil.isNotBlank(ids)) {
|
mallMember.setReferrerIds(ids);
|
}
|
memberMapper.updateById(mallMember);
|
//初始化钱包信息
|
MallMemberWallet wallet = new MallMemberWallet();
|
wallet.setBalance(BigDecimal.ZERO);
|
wallet.setMemberId(mallMember.getId());
|
mallMemberWalletMapper.insert(wallet);
|
return;
|
}
|
|
@Override
|
public void updateMemberInfo(String str) {
|
String[] split = StrUtil.split(str, "|");
|
String accessToken = split[0];
|
String openId = split[1];
|
MallMember mallMember = memberMapper.selectMemberByOpenId(openId);
|
if (ObjectUtil.isEmpty(mallMember)) {
|
return;
|
}
|
String requrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+accessToken+"&openid="+openId+"&lang=zh_CN";
|
|
// 创建一个StringHttpMessageConverter,并设置字符集为UTF-8
|
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
|
stringConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.TEXT_PLAIN));
|
// 将StringHttpMessageConverter添加到RestTemplate的消息转换器列表中
|
restTemplate.getMessageConverters().add(0, stringConverter);
|
// 创建HttpHeaders对象,设置Accept头部的值为"text/plain;charset=UTF-8"
|
HttpHeaders headers = new HttpHeaders();
|
headers.setAccept(Collections.singletonList(MediaType.TEXT_PLAIN));
|
headers.set(HttpHeaders.ACCEPT_CHARSET, "UTF-8");
|
|
String responseStr = restTemplate.getForObject(requrl, String.class);
|
net.sf.json.JSONObject json = net.sf.json.JSONObject.fromObject(responseStr);
|
log.info("微信获取用户信息={}", json);
|
|
if (json.containsKey("errcode")) {
|
log.info("微信登录获取到异常信息errcode");
|
return;
|
}
|
String nickname = json.getString("nickname");
|
String headImgUrl = json.getString("headimgurl");
|
mallMember.setName(nickname);
|
mallMember.setAvatar(headImgUrl);
|
memberMapper.updateById(mallMember);
|
return;
|
}
|
|
|
@Override
|
public void orderGetMsg(String str) {
|
/**
|
* String str : orderId@amount
|
*/
|
String[] split = StrUtil.split(str, "@");
|
String orderId = split[0];
|
String amount = split[1];
|
MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(orderId);
|
if(ObjectUtil.isEmpty(mallOrderInfo)){
|
return;
|
}
|
Long memberId = mallOrderInfo.getMemberId();
|
MallMember mallMember = memberMapper.selectById(memberId);
|
|
|
List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(mallOrderInfo.getId());
|
if(CollUtil.isEmpty(mallOrderItemList)){
|
return;
|
}
|
|
/**
|
* 支付后同意验证
|
* 1:是否送券
|
* 2:是否送积分
|
* 3:是否返利
|
*/
|
//是否返利
|
BigDecimal amountBigDecimal = new BigDecimal(StrUtil.isEmpty(amount) ? "0" : amount);
|
if(BigDecimal.ZERO.compareTo(amountBigDecimal) < 0){
|
if(ObjectUtil.isNotEmpty(mallMember.getReferrerId())){
|
String referrerId = mallMember.getReferrerId();
|
MallMember mallMemberParent = memberMapper.selectInfoByInviteId(referrerId);
|
Long id = mallMemberParent.getId();
|
|
MallMoneyFlow mallMoneyFlow = mallMoneyFlowMapper.selectOneByOrderNoAndMemberIdAndRtMemberId(mallOrderInfo.getOrderNo(), memberId, id);
|
if(ObjectUtil.isEmpty(mallMoneyFlow)){
|
DataDictionaryCustom returnPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.MEMBER_RETURN_PERCENT.getType(),
|
DataDictionaryEnum.MEMBER_RETURN_PERCENT.getCode()
|
);
|
String returnPercentStr = StrUtil.isEmpty(returnPercentDic.getValue()) ? "10" : returnPercentDic.getValue();
|
BigDecimal returnPercent = new BigDecimal(returnPercentStr).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN);
|
BigDecimal amountActual = amountBigDecimal.multiply(returnPercent).setScale(2, BigDecimal.ROUND_DOWN);
|
|
mallMoneyFlowService.addMoneyFlow(
|
id,
|
amountActual,
|
MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(),
|
mallOrderInfo.getOrderNo(),
|
"直推奖",
|
"直推奖",
|
mallMember.getId(),
|
1,
|
FlowTypeEnum.BALANCE.getValue(),
|
2);
|
}
|
}
|
}
|
for(MallOrderItem mallOrderItem : mallOrderItemList){
|
Long goodsId = mallOrderItem.getGoodsId();
|
MallGoods mallGoods = mallGoodsMapper.selectById(goodsId);
|
if(ObjectUtil.isEmpty(mallGoods)){
|
break;
|
}
|
if(ObjectUtil.isNotEmpty(mallGoods.getIsUnreal()) && 1 == mallGoods.getIsUnreal()){
|
mallOrderInfo.setStatus(OrderStatusEnum.FINISH.getValue());
|
mallOrderInfoMapper.updateById(mallOrderInfo);
|
//是否送券 1:是 2:否
|
BigDecimal levelTwoPrice = mallGoods.getLevelTwoPrice();
|
if(BigDecimal.ONE.compareTo(levelTwoPrice) == 0){
|
MallRollPerk mallRollPerk = new MallRollPerk();
|
mallRollPerk.setMemberId(memberId);
|
mallRollPerk.setState(1);
|
mallRollPerk.setRollId(mallGoods.getLevelThreePrice().longValue());
|
mallRollPerkMapper.insert(mallRollPerk);
|
}
|
//赠送积分
|
BigDecimal levelOnePrice = mallGoods.getLevelOnePrice();
|
if(BigDecimal.ZERO.compareTo(levelOnePrice) <= 0){
|
memberWalletService.add(levelOnePrice, memberId, "score");
|
|
mallMoneyFlowService.addMoneyFlow(memberId, levelOnePrice, MoneyFlowTypeEnum.STATIC_BONUS.getValue(),
|
mallOrderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue(),"赠送积分",2);
|
}
|
}
|
}
|
}
|
|
@Override
|
public void rollSendMsg(Long orderId) {
|
MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(orderId);
|
if(ObjectUtil.isEmpty(mallOrderInfo)){
|
return;
|
}
|
Long memberId = mallOrderInfo.getMemberId();
|
MallMember mallMember = memberMapper.selectById(memberId);
|
if(ObjectUtil.isEmpty(mallMember)){
|
return;
|
}
|
|
List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(orderId);
|
if(CollUtil.isEmpty(mallOrderItemList)){
|
return;
|
}
|
MallOrderItem mallOrderItem = mallOrderItemList.get(0);
|
String goodsName = mallOrderItem.getGoodsName();
|
String skuImage = mallOrderItem.getSkuImage();
|
Long goodsId = mallOrderItem.getGoodsId();
|
MallGoods mallGoods = mallGoodsMapper.selectById(goodsId);
|
if(ObjectUtil.isEmpty(mallGoods)){
|
return;
|
}
|
Integer isNormal = mallGoods.getIsNormal();
|
if(4 == isNormal){
|
//课程卷
|
MallMemberClass mallMemberClass = new MallMemberClass();
|
mallMemberClass.setMemberId(mallMember.getId());
|
mallMemberClass.setOrderId(orderId);
|
mallMemberClass.setClassName(goodsName);
|
mallMemberClass.setClassPic(skuImage);
|
mallMemberClass.setClassDec(mallGoods.getGoodsIntrodution());
|
mallMemberClass.setClassUrl(mallGoods.getVideoUrl());
|
mallMemberClass.setCreateTime(DateUtil.date());
|
mallMemberClassMapper.insert(mallMemberClass);
|
return;
|
}else if(5 == isNormal){
|
//民宿卷
|
MallMemberHouse mallMemberHouse = new MallMemberHouse();
|
mallMemberHouse.setOrderId(orderId);
|
mallMemberHouse.setOrderNo(mallOrderInfo.getOrderNo());
|
mallMemberHouse.setMemberId(memberId);
|
mallMemberHouse.setState(1);
|
mallMemberHouse.setCreateTime(DateUtil.date());
|
mallMemberHouse.setUpdateTime(mallOrderInfo.getUseTime());
|
mallMemberHouse.setUnuseTime(DateUtil.date().offset(DateField.HOUR_OF_DAY,48));
|
mallMemberHouse.setHouseName(mallGoods.getHouseName());
|
mallMemberHouse.setHouseAddress(mallGoods.getHouseAddress());
|
mallMemberHouse.setHousePic(mallGoods.getThumb());
|
mallMemberHouseMapper.insert(mallMemberHouse);
|
return;
|
}else{
|
return;
|
}
|
}
|
|
public static void main(String[] args) {
|
|
DateTime offset = DateUtil.date().offset(DateField.HOUR_OF_DAY, 48);
|
System.out.println(offset);
|
|
// RestTemplate restTemplate = new RestTemplate();
|
// String accessToken = "70__DR_q_qmjcMfPQEBwmjdfJFWnpml55Bq6JK2vt9MMdcRLsHaYM1BQGFWzLUISjcFC8HAYTKOaPJH93KHNvo4KIeMZkxFF2qP66nAdygUQ6c";
|
// String openId = "oXL7Y6LW5KGQTbmmP5W3JljjApSo";
|
// String requrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+accessToken+"&openid="+openId+"&lang=zh_CN";
|
// // 创建一个StringHttpMessageConverter,并设置字符集为UTF-8
|
// StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
|
// stringConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.TEXT_PLAIN));
|
// // 将StringHttpMessageConverter添加到RestTemplate的消息转换器列表中
|
// restTemplate.getMessageConverters().add(0, stringConverter);
|
// // 创建HttpHeaders对象,设置Accept头部的值为"text/plain;charset=UTF-8"
|
// HttpHeaders headers = new HttpHeaders();
|
// headers.setAccept(Collections.singletonList(MediaType.TEXT_PLAIN));
|
// headers.set(HttpHeaders.ACCEPT_CHARSET, "UTF-8");
|
//
|
// String responseStr = restTemplate.getForObject(requrl, String.class);
|
// net.sf.json.JSONObject json = net.sf.json.JSONObject.fromObject(responseStr);
|
// log.info("微信获取用户信息={}", json);
|
// String nickname = json.getString("nickname");
|
// String headImgUrl = json.getString("headimgurl");
|
// System.out.println(nickname);
|
// System.out.println(headImgUrl);
|
}
|
}
|