package com.ruoyi.account.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.account.api.model.*;
|
import com.ruoyi.account.dto.ApplyForAdmissionDTO;
|
import com.ruoyi.account.mapper.AppUserMapper;
|
import com.ruoyi.account.service.*;
|
import com.ruoyi.account.util.GeodesyUtil;
|
import com.ruoyi.account.util.SMSUtil;
|
import com.ruoyi.account.util.payment.PaymentUtil;
|
import com.ruoyi.account.util.payment.model.CloseOrderResult;
|
import com.ruoyi.account.util.tencentMap.TencentMapUtil;
|
import com.ruoyi.account.util.weChat.EnvVersion;
|
import com.ruoyi.account.util.weChat.WXCore;
|
import com.ruoyi.account.util.weChat.WeChatUtil;
|
import com.ruoyi.account.vo.*;
|
import com.ruoyi.common.core.domain.R;
|
import com.ruoyi.common.core.utils.StringUtils;
|
import com.ruoyi.common.core.web.page.PageInfo;
|
import com.ruoyi.common.redis.service.RedisService;
|
import com.ruoyi.common.security.service.TokenService;
|
import com.ruoyi.order.feignClient.OrderClient;
|
import com.ruoyi.other.api.domain.*;
|
import com.ruoyi.other.api.feignClient.*;
|
import com.ruoyi.system.api.feignClient.SysUserClient;
|
import com.ruoyi.system.api.model.LoginUser;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.context.annotation.Bean;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.stereotype.Service;
|
import org.springframework.util.CollectionUtils;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.time.LocalDateTime;
|
import java.time.ZoneOffset;
|
import java.util.*;
|
import java.util.concurrent.TimeUnit;
|
import java.util.stream.Collectors;
|
|
|
/**
|
* <p>
|
* 服务实现类
|
* </p>
|
*
|
* @author luodangjia
|
* @since 2024-11-21
|
*/
|
@Slf4j
|
@Service
|
public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> implements AppUserService {
|
|
@Resource
|
private WeChatUtil weChatUtil;
|
|
@Resource
|
private TokenService tokenService;
|
|
@Resource
|
private RedisService redisService;
|
|
@Resource
|
private ShopClient shopClient;
|
|
@Resource
|
private SysUserClient sysUserClient;
|
|
@Resource
|
private PointSettingClient pointSettingClient;
|
|
@Value("${file.upload.location}")
|
private String filePath;
|
|
@Value("${file.upload.accessPath}")
|
private String accessPath;
|
|
@Resource
|
private UserPointService userPointService;
|
|
@Resource
|
private AppUserMapper appUserMapper;
|
|
@Resource
|
private RegionClient regionClient;
|
|
@Resource
|
private RedisTemplate redisTemplate;
|
@Resource
|
private OrderClient orderClient;
|
|
private static final String DEFAULT_AVATAR_URL = "http://qijishenghuiyuan.obs.cn-southwest-2.myhuaweicloud.com/admin/aedfbbb41280471f8d9fa7905298b65f.png";
|
|
|
/**
|
* 小程序一键登录
|
* @param appletLogin
|
* @return
|
*/
|
@Override
|
public R appletLogin(AppletLogin appletLogin) {
|
//使用jscode获取微信openid
|
Map<String, Object> map = weChatUtil.code2Session(appletLogin.getJscode());
|
Integer errcode = Integer.valueOf(map.get("errcode").toString());
|
if(0 != errcode){
|
return R.fail(map.get("msg").toString());
|
}
|
String openid = map.get("openid").toString();
|
String sessionKey = map.get("sessionKey").toString();
|
//查询用户是否注册,没有注册则注册
|
AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getWxOpenid, openid).ne(AppUser::getStatus, 3).eq(AppUser::getDelFlag, 0));
|
if(null == appUser){
|
//注册
|
//获取手机号
|
String decrypt = WXCore.decrypt(appletLogin.getEncryptedData_phone(), sessionKey, appletLogin.getIv_phone());
|
if (StringUtils.isEmpty(decrypt)) {
|
return R.fail("获取手机信息失败");
|
}
|
JSONObject phone = JSON.parseObject(decrypt);
|
String purePhoneNumber = phone.getString("purePhoneNumber");
|
//新用户默认信息
|
appUser.setName(purePhoneNumber.substring(0, 3) + "****" + purePhoneNumber.substring(7));
|
appUser.setPhone(purePhoneNumber);
|
appUser.setAvatar( DEFAULT_AVATAR_URL);
|
appUser.setWxOpenid(openid);
|
appUser.setStatus(1);
|
appUser.setDelFlag(false);
|
this.save(appUser);
|
}
|
//账户被冻结,给出提示
|
if(2 == appUser.getStatus()){
|
return R.fail("账户已被冻结,请联系管理员!");
|
}
|
|
LoginVo loginVo = new LoginVo();
|
loginVo.setSkipPage(1);
|
loginVo.setPhone(appUser.getPhone());
|
//构建token
|
LoginUser loginUser = new LoginUser();
|
loginUser.setUserid(appUser.getId());
|
loginUser.setUsername(appUser.getName());
|
Map<String, Object> tokenApplet = tokenService.createTokenApplet(loginUser);
|
loginVo.setToken(tokenApplet.get("access_token").toString());
|
loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString()));
|
|
appUser.setLastLoginTime(LocalDateTime.now());
|
this.updateById(appUser);
|
return R.ok(loginVo);
|
}
|
|
|
/**
|
* 手机号码登录
|
* @param mobileLogin
|
* @return
|
*/
|
@Override
|
public R<LoginVo> mobileLogin(MobileLogin mobileLogin) {
|
String code = redisService.getCacheObject(mobileLogin.getPhone());
|
if(!"999999".equals(mobileLogin.getCode())){
|
if(null == code || !code.equals(mobileLogin.getCode())){
|
return R.fail("验证码错误");
|
}
|
}
|
|
//查询用户是否注册,没有注册则系统注册
|
AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, mobileLogin.getPhone())
|
.ne(AppUser::getStatus, 3).eq(AppUser::getDelFlag, 0));
|
if(null == appUser){
|
appUser=new AppUser();
|
//注册
|
//使用jscode获取微信openid
|
Map<String, Object> map = weChatUtil.code2Session(mobileLogin.getJscode());
|
Integer errcode = Integer.valueOf(map.get("errcode").toString());
|
if(0 != errcode){
|
return R.fail(map.get("msg").toString());
|
}
|
String openid = map.get("openid").toString();
|
//设置默认信息
|
appUser.setName(mobileLogin.getPhone().substring(0, 3) + "****" + mobileLogin.getPhone().substring(7));
|
appUser.setPhone(mobileLogin.getPhone());
|
appUser.setAvatar( DEFAULT_AVATAR_URL);
|
appUser.setWxOpenid(openid);
|
appUser.setStatus(1);
|
appUser.setDelFlag(false);
|
//调用地图获取省市区数据
|
String citycode = TencentMapUtil.inverseGeographicalAnalysis(mobileLogin.getLongitude(), mobileLogin.getLatitude(), false);
|
if(null != citycode){
|
Region region = regionClient.getRegionBiCode(citycode).getData();
|
appUser.setDistrict(region.getName());
|
appUser.setDistrictCode(citycode);
|
region = regionClient.getRegionBiCode(citycode.substring(0, 4) + "00").getData();
|
appUser.setCity(region.getName());
|
appUser.setCityCode(region.getCode());
|
region = regionClient.getRegionBiCode(citycode.substring(0, 2) + "0000").getData();
|
appUser.setProvince(region.getName());
|
appUser.setProvinceCode(region.getCode());
|
}
|
|
this.save(appUser);
|
}
|
//账户被冻结,给出提示
|
if(2 == appUser.getStatus()){
|
return R.fail("账户已被冻结,请联系管理员!");
|
}
|
LoginVo loginVo = new LoginVo();
|
loginVo.setSkipPage(1);
|
loginVo.setPhone(appUser.getPhone());
|
//构建token
|
LoginUser loginUser = new LoginUser();
|
loginUser.setUserid(appUser.getId());
|
loginUser.setUsername(appUser.getName());
|
Map<String, Object> tokenApplet = tokenService.createTokenApplet(loginUser);
|
loginVo.setToken(tokenApplet.get("access_token").toString());
|
loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString()));
|
appUser.setLastLoginTime(LocalDateTime.now());
|
this.updateById(appUser);
|
return R.ok(loginVo);
|
}
|
|
|
/**
|
* 获取短信验证码
|
* @param smsCode
|
* @return
|
*/
|
@Override
|
public R getSMSCode(SMSCode smsCode) {
|
//校验验证码获取频率(1分钟5次)
|
String key = smsCode.getType() + "&" + smsCode.getPhone();
|
Map<String, Object> cacheMap = redisService.getCacheMap(key);
|
if(null != cacheMap && cacheMap.size() > 0){
|
Integer number = Integer.valueOf(cacheMap.get("number").toString()) + 1;
|
Long startTime = Long.valueOf(cacheMap.get("startTime").toString());
|
if(number > 5 && (System.currentTimeMillis() - startTime) < 60000){
|
return R.fail("获取验证码太频繁,请稍后重试!");
|
}
|
if(number <= 5){
|
cacheMap.put("number", number);
|
}else{
|
cacheMap.put("number", 1);
|
cacheMap.put("startTime", System.currentTimeMillis());
|
}
|
}else{
|
cacheMap = new HashMap<>();
|
cacheMap.put("number", 1);
|
cacheMap.put("startTime", System.currentTimeMillis());
|
}
|
//存储计数器到缓存中,5分钟有效期
|
redisService.setCacheMap(key, cacheMap, 300);
|
|
//开始构建验证码内容
|
String code = "";
|
for (int i = 0; i < 6; i++) {
|
code += Double.valueOf(Math.random() * 10).intValue();
|
}
|
SMSUtil.sendSms("[\"" + code + "\"]", smsCode.getPhone(), "8824121211029", "39533d100b2b4aee8ed198aa49fe99dd");
|
redisService.setCacheObject(smsCode.getPhone(), code, 300L, TimeUnit.SECONDS);
|
return R.ok();
|
}
|
|
|
/**
|
* 注册账号
|
*/
|
/*
|
@Override
|
public R<LoginVo> registerAccount(RegisterAccount registerAccount) {
|
//校验验证码
|
// String code = redisService.getCacheObject(registerAccount.getPhone());
|
// if(!"999999".equals(registerAccount.getCode())){
|
// if(null == code || !code.equals(registerAccount.getCode())){
|
// return R.fail("验证码错误");
|
// }
|
// }
|
//使用jscode获取微信openid
|
Map<String, Object> map = weChatUtil.code2Session(registerAccount.getJscode());
|
Integer errcode = Integer.valueOf(map.get("errcode").toString());
|
if(0 != errcode){
|
return R.fail(map.get("msg").toString());
|
}
|
String openid = map.get("openid").toString();
|
//查询用户是否注册
|
AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getWxOpenid, openid).ne(AppUser::getStatus, 3).eq(AppUser::getDelFlag, 0));
|
if(null != appUser){
|
return R.fail("此微信号已注册,请直接登录!");
|
}
|
AppUser appUser1 = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, registerAccount.getPhone()).ne(AppUser::getStatus, 3).eq(AppUser::getDelFlag, 0));
|
if(null != appUser1 && StringUtils.isNotEmpty(appUser1.getWxOpenid())){
|
return R.fail("手机号已注册,请直接登录!");
|
}
|
if(null != appUser1 && appUser1.getStatus() == 2){
|
return R.fail("手机号已注册,请直接登录!");
|
}
|
|
String avatar = registerAccount.getAvatar();
|
if (StringUtils.isEmpty(avatar)){
|
avatar = "http://qijishenghuiyuan.obs.cn-southwest-2.myhuaweicloud.com/admin/aedfbbb41280471f8d9fa7905298b65f.png";
|
}
|
|
//如果手机号已注册,但是没有微信号,则将微信号添加到已有账户上
|
if(null != appUser1 && StringUtils.isEmpty(appUser1.getWxOpenid())){
|
appUser1.setWxOpenid(openid);
|
this.updateById(appUser1);
|
appUser = appUser1;
|
}else if(null == appUser){
|
appUser = new AppUser();
|
appUser.setAvatar(avatar);
|
appUser.setName(registerAccount.getName());
|
appUser.setPhone(registerAccount.getPhone());
|
appUser.setWxOpenid(openid);
|
//注册默认为普通会员
|
appUser.setVipId(1);
|
appUser.setStatus(1);
|
appUser.setCreateTime(LocalDateTime.now());
|
appUser.setDelFlag(false);
|
appUser.setFirstAdd(1);
|
appUser.setLastLoginTime(LocalDateTime.now());
|
//绑定门店为推荐人绑定的门店
|
AppUser appUser2 = this.getById(registerAccount.getPromoter());
|
appUser.setInviteUserId(registerAccount.getPromoter());
|
appUser.setShopId(appUser2.getShopId());
|
appUser.setPartPoint(0);
|
appUser.setPartGrowPoint(0);
|
appUser.setShopPoint(0);
|
appUser.setSharePoint(0);
|
appUser.setShopAmount(BigDecimal.ZERO);
|
appUser.setWithdrawableAmount(BigDecimal.ZERO);
|
appUser.setWithdrawnAmount(BigDecimal.ZERO);
|
appUser.setTotalRechargeAmount(BigDecimal.ZERO);
|
appUser.setTotalRedPacketAmount(BigDecimal.ZERO);
|
appUser.setTotalDistributionAmount(BigDecimal.ZERO);
|
appUser.setBalance(BigDecimal.ZERO);
|
//新用户才能奖励积分,老用户注销重新注册没有
|
long old = this.count(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, registerAccount.getPhone()).eq(AppUser::getDelFlag, 0));
|
R<PointSetting> pointSettingR = pointSettingClient.getPointSetting(1);
|
if (R.isError(pointSettingR)){
|
throw new RuntimeException("获取积分设置失败");
|
}
|
PointSetting pointSetting = pointSettingR.getData();
|
if (pointSetting == null){
|
throw new RuntimeException("积分设置不存在");
|
}
|
Integer regisPoint = pointSetting.getRegisPoint();
|
if(0 == old){
|
Integer regisPoint1 = 0;
|
//计算可用积分比例
|
if(1 == pointSetting.getGetRegisPointOpen()){
|
regisPoint1 = new BigDecimal(regisPoint).multiply(pointSetting.getGetRegisPoint().divide(new BigDecimal(100))).intValue();
|
}
|
appUser.setLavePoint(regisPoint);
|
appUser.setAvailablePoint(regisPoint1);
|
appUser.setTotalAvailablePoint(regisPoint1);
|
if(null != pointSetting && 1 == pointSetting.getGetRegisPointGift()){
|
appUser.setTransferablePoint(regisPoint1);
|
}
|
appUser.setTotalRegisterPoint(regisPoint);
|
appUser.setTotalPoint(regisPoint);
|
}
|
//根据平台的配置未达标,则标注为可修改推广人
|
appUser.setChangePromoter(0);
|
appUser.setLongitude(registerAccount.getLongitude());
|
appUser.setLatitude(registerAccount.getLatitude());
|
//调用地图获取省市区数据
|
String citycode = TencentMapUtil.inverseGeographicalAnalysis(registerAccount.getLongitude(), registerAccount.getLatitude(), false);
|
if(null != citycode){
|
Region region = regionClient.getRegionBiCode(citycode).getData();
|
appUser.setDistrict(region.getName());
|
appUser.setDistrictCode(citycode);
|
region = regionClient.getRegionBiCode(citycode.substring(0, 4) + "00").getData();
|
appUser.setCity(region.getName());
|
appUser.setCityCode(region.getCode());
|
region = regionClient.getRegionBiCode(citycode.substring(0, 2) + "0000").getData();
|
appUser.setProvince(region.getName());
|
appUser.setProvinceCode(region.getCode());
|
}
|
this.save(appUser);
|
|
//增加积分变动记录
|
if(0 == old && regisPoint > 0){
|
//构建积分流水记录
|
UserPoint userPoint = new UserPoint();
|
userPoint.setType(7);
|
userPoint.setHistoricalPoint(0);
|
userPoint.setVariablePoint(regisPoint);
|
userPoint.setBalance(appUser.getLavePoint());
|
userPoint.setCreateTime(LocalDateTime.now());
|
userPoint.setAppUserId(appUser.getId());
|
userPointService.save(userPoint);
|
}
|
|
//拉新分佣
|
if(0 == old && null != appUser2){
|
pointSetting = pointSettingClient.getPointSetting(appUser2.getVipId()).getData();
|
Integer newPoint = pointSetting.getNewPoint();
|
Integer newPoint1 = 0;
|
if(1 == pointSetting.getGetNewPointOpen()){
|
newPoint1 = new BigDecimal(newPoint).multiply(pointSetting.getGetNewPoint().divide(new BigDecimal(100))).intValue();
|
}
|
appUser2.setLavePoint(appUser2.getLavePoint() + newPoint);
|
appUser2.setAvailablePoint(appUser2.getAvailablePoint() + newPoint1);
|
appUser2.setTotalAvailablePoint(appUser2.getTotalAvailablePoint() + newPoint1);
|
if(null != pointSetting && 1 == pointSetting.getGetNewPointGift()){
|
appUser2.setTransferablePoint(appUser2.getTransferablePoint() + newPoint1);
|
}
|
appUser2.setTotalInvitePoint(appUser2.getTotalInvitePoint() + newPoint);
|
appUser2.setTotalPoint(appUser2.getTotalPoint() + newPoint);
|
this.updateById(appUser2);
|
if(newPoint > 0){
|
UserPoint userPoint = new UserPoint();
|
userPoint.setType(3);
|
userPoint.setHistoricalPoint(appUser2.getLavePoint() - newPoint);
|
userPoint.setVariablePoint(newPoint);
|
userPoint.setBalance(appUser2.getLavePoint());
|
userPoint.setCreateTime(LocalDateTime.now());
|
userPoint.setAppUserId(appUser2.getId());
|
userPointService.save(userPoint);
|
}
|
|
if(null != appUser2.getInviteUserId()){
|
AppUser appUser3 = this.getById(appUser2.getInviteUserId());
|
appUser3.setLavePoint(appUser3.getLavePoint() + newPoint);
|
appUser3.setAvailablePoint(appUser3.getAvailablePoint() + newPoint1);
|
appUser3.setTotalAvailablePoint(appUser3.getTotalAvailablePoint() + newPoint1);
|
if(null != pointSetting && 1 == pointSetting.getGetRegisPointGift()){
|
appUser3.setTransferablePoint(appUser3.getTransferablePoint() + newPoint1);
|
}
|
appUser3.setTotalInvitePoint(appUser3.getTotalInvitePoint() + newPoint);
|
appUser3.setTotalPoint(appUser3.getTotalPoint() + newPoint);
|
this.updateById(appUser3);
|
if(newPoint > 0){
|
UserPoint userPoint = new UserPoint();
|
userPoint.setType(3);
|
userPoint.setHistoricalPoint(appUser3.getLavePoint() - newPoint);
|
userPoint.setVariablePoint(newPoint);
|
userPoint.setBalance(appUser3.getLavePoint());
|
userPoint.setCreateTime(LocalDateTime.now());
|
userPoint.setAppUserId(appUser3.getId());
|
userPointService.save(userPoint);
|
}
|
}
|
}
|
|
//获取微信推广二维码
|
String fileName = UUID.randomUUID() + ".jpg";
|
String getwxacodeunlimit = weChatUtil.getwxacodeunlimit("pages/start/start", "id=" + appUser.getId(), EnvVersion.RELEASE, filePath + fileName);
|
appUser.setQrCode(getwxacodeunlimit);
|
this.updateById(appUser);
|
|
}
|
LoginVo loginVo = new LoginVo();
|
loginVo.setSkipPage(1);
|
loginVo.setFirstTime(null == appUser1);
|
loginVo.setPhone(appUser.getPhone());
|
//构建token
|
LoginUser loginUser = new LoginUser();
|
loginUser.setUserid(appUser.getId());
|
loginUser.setUsername(appUser.getName());
|
Map<String, Object> tokenApplet = tokenService.createTokenApplet(loginUser);
|
loginVo.setToken(tokenApplet.get("access_token").toString());
|
loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString()));
|
return R.ok(loginVo);
|
}
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
public IPage<AppUser> getAppuserPage(Integer pageNum, Integer pageSize, AppUser appUser, Integer shopId, Set<Long> userId) {
|
if (StringUtils.isNotEmpty(appUser.getShopName())){
|
R<Set<Integer>> shopR = shopClient.getShopIdByName(appUser.getShopName());
|
if (R.isSuccess(shopR)){
|
Set<Integer> shopIds = shopR.getData();
|
if (!CollectionUtils.isEmpty(shopIds)){
|
appUser.setShopIds(shopIds);
|
}else {
|
return new Page<>();
|
}
|
}
|
}
|
return appUserMapper.getAppuserPage(new Page<>(pageNum, pageSize), appUser, shopId, userId);
|
}
|
@Override
|
public IPage<AppUser> getAppuserPage1(Integer pageNum, Integer pageSize, AppUser appUser,List<Long> userIds) {
|
return appUserMapper.getAppuserPage1(new Page<>(pageNum, pageSize), appUser,userIds);
|
}
|
|
|
|
@Override
|
public List<AppUser> getAppUserByPhoneNoFilter(String phone) {
|
return this.baseMapper.getAppUserByPhoneNoFilter(phone);
|
}
|
|
|
|
/**
|
* 小程序-个人中心
|
* @return
|
*/
|
@Override
|
public AppUser index() {
|
Long userId = tokenService.getLoginUserApplet().getUserid();
|
//当前用户信息
|
AppUser user = this.getById(userId);
|
//查询门店,如果门店被冻结
|
List<Shop> shopList = shopClient.getShopByUserId(userId).getData();
|
user.setShopStatus(0);//未拥有门店
|
if (shopList != null && !shopList.isEmpty()) {
|
user.setShopStatus(2);//门店都被冻结
|
for (Shop shop : shopList) {
|
if (shop.getStatus()==1) {
|
user.setShopStatus(1);//门店状态
|
}
|
if(null==user.getShopIds()){
|
Set<Integer> integers = new HashSet<>();
|
user.setShopIds(integers);
|
}
|
user.getShopIds().add(shop.getId());
|
user.setShopIds(user.getShopIds());
|
|
}
|
}
|
return user;
|
}
|
|
@Override
|
public PageInfo<UserPointStatisticsVO> getUserPointPageList(String name, Integer pageCurr, Integer pageSize) {
|
PageInfo<UserPointStatisticsVO> pageInfo=new PageInfo<>(pageCurr,pageSize);
|
List<UserPointStatisticsVO> list=baseMapper.getUserPointPageList(pageInfo, name);
|
list.forEach(x->{
|
x.setIdStr(String.valueOf(x.getId()));
|
});
|
pageInfo.setRecords(list);
|
return pageInfo;
|
}
|
}
|