package cc.mrbird.febs.mall.service.impl;
|
|
import cc.mrbird.febs.common.entity.FebsResponse;
|
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
|
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
|
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.IAgentService;
|
import cc.mrbird.febs.mall.service.IApiMallMemberService;
|
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
|
import cc.mrbird.febs.mall.service.IMallAchieveService;
|
import cn.hutool.core.collection.CollUtil;
|
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;
|
|
@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;
|
}
|
|
public static void main(String[] args) {
|
|
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);
|
}
|
}
|