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; @Override @Transactional(rollbackFor = Exception.class) public void autoUpAgentLevel(Long memberId) { MallMember member = memberMapper.selectById(memberId); if(StrUtil.isBlank(member.getReferrerIds())) { return; } List ids = StrUtil.split(member.getReferrerIds(), ','); List 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 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 directMember = memberMapper.selectByRefererId(member.getInviteId()); if (CollUtil.isEmpty(directMember)) { return false; } // 用户团队达到指定代理数量,且都不在同一条线 int i = 0; for (MallMember child : directMember) { List 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 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(); DataDictionaryCustom returnPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.MEMBER_RETURN_PERCENT.getType(), DataDictionaryEnum.MEMBER_RETURN_PERCENT.getCode() ); String returnPercentStr = StrUtil.isNotEmpty(returnPercentDic.getValue()) ? "1" : 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( mallMember.getId(), amountActual, MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(), mallOrderInfo.getOrderNo(), "直推奖", "直推奖", id, 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 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); } }