Commit 538c2d77 authored by 唐峰's avatar 唐峰

个人信息编辑更新,消费地图历史数据清洗接口,微信登录校验绑定用户id情况

parent 41fa853a
......@@ -2,6 +2,7 @@ package cn.quantgroup.xyqb.controller.api.v2;
import cn.quantgroup.xyqb.controller.IBaseController;
import cn.quantgroup.xyqb.controller.req.v2.LoginReq;
import cn.quantgroup.xyqb.controller.req.v2.UserInfoConvertReq;
import cn.quantgroup.xyqb.model.ClientType;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.model.LoginBean;
......@@ -37,4 +38,14 @@ public class OauthApiV2Controller implements IBaseController {
}
return JsonResult.buildSuccessResultGeneric(loginContext.interLogin(loginReq));
}
@PostMapping("/shop-map/user-data-convert")
public JsonResult<UserInfoConvertReq> shopMapDataConvert(@RequestBody UserInfoConvertReq req){
//手机号是否存在--注册 登录
//微信是否存在- 若存在,和手机号是否匹配相同
//头像昵称
return JsonResult.buildSuccessResultGeneric(loginContext.shopMapDataConvert(req));
}
}
package cn.quantgroup.xyqb.controller.req.v2;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserInfoEntity;
import cn.quantgroup.xyqb.entity.WechatUserInfo;
import cn.quantgroup.xyqb.model.ClientType;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class UserInfoConvertReq {
//转换的信息
private List<UserConvertInfo> userConvertInfoList;
private Integer tenantId;
//小程序的appId
private String appId;
@Data
public static class UserConvertInfo{
//传递参数: phoneNo registeredFrom createdAt updatedAt
private User user;
//openId appName unionId nickName headImgUrl appId
private WechatUserInfo wechatUserInfo;
// nickName photo birthday
private UserInfoEntity userInfoEntity;
}
}
......@@ -26,6 +26,7 @@ public enum BizExceptionEnum {
UN_PERMISSION_STMS("1015","没有内部接口访问权限"),
EXPIRE_WECHAT_TOKEN("1016","微信接口token过期,请执行定时任务"),
ERROR_MATCHING_WECHAT_APP_ID("1017","微信appName和appId不匹配"),
ERROR_WECHAT_BIND_USERID("1018","微信未和用户绑定,登录失败"),
......
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.controller.req.v2.LoginReq;
import cn.quantgroup.xyqb.controller.req.v2.UserInfoConvertReq;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserInfoEntity;
import cn.quantgroup.xyqb.entity.UserTag;
import cn.quantgroup.xyqb.entity.WechatUserInfo;
import cn.quantgroup.xyqb.event.UserLoginEvent;
import cn.quantgroup.xyqb.exception.BizException;
import cn.quantgroup.xyqb.exception.BizExceptionEnum;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.model.LoginBean;
import cn.quantgroup.xyqb.model.UserInfo;
import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.model.v2.login.BaseLoginParam;
import cn.quantgroup.xyqb.repository.IUserInfoRepository;
import cn.quantgroup.xyqb.repository.IUserRepository;
import cn.quantgroup.xyqb.repository.IWeChatUserRepository;
import cn.quantgroup.xyqb.session.XyqbSessionContextHolder;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
@Slf4j
public class LoginContext {
private final ApplicationEventPublisher applicationEventPublisher;
private final IUserRepository userRepository;
private final IUserInfoRepository userInfoRepository;
private final IWeChatUserRepository weChatUserRepository;
private final Map<Integer, LoginStrategy> interloginStrategyMap = new HashMap<>();
public LoginContext(List<LoginStrategy> loginStrategies, ApplicationEventPublisher applicationEventPublisher, IUserRepository userRepository, IUserInfoRepository userInfoRepository) {
public LoginContext(List<LoginStrategy> loginStrategies, ApplicationEventPublisher applicationEventPublisher, IUserRepository userRepository,
IUserInfoRepository userInfoRepository,IWeChatUserRepository weChatUserRepository) {
this.applicationEventPublisher = applicationEventPublisher;
this.userRepository = userRepository;
this.userInfoRepository = userInfoRepository;
this.weChatUserRepository = weChatUserRepository;
loginStrategies.forEach(i -> interloginStrategyMap.put(i.getType(), i));
}
......@@ -94,4 +112,123 @@ public class LoginContext {
return loginBean;
}
/**
* 消费地图历史数据清洗转换
*/
public UserInfoConvertReq shopMapDataConvert(UserInfoConvertReq req){
List<UserInfoConvertReq.UserConvertInfo> userConvertInfoList = req.getUserConvertInfoList();
if (CollectionUtils.isEmpty(userConvertInfoList) || userConvertInfoList.get(0).getUser() == null) {
throw new BizException(BizExceptionEnum.ERROR_PARAM);
}
Map<String,User> phoneUserMap = Maps.newHashMap();
Map<String,UserInfoEntity> phoneUserEntityMap = Maps.newHashMap();
Map<String, WechatUserInfo> phoneWechatUserMap = Maps.newHashMap();
List<String> phoneNoList = Lists.newArrayList();
for (UserInfoConvertReq.UserConvertInfo convertInfo : userConvertInfoList) {
phoneUserMap.put(convertInfo.getUser().getPhoneNo(), convertInfo.getUser());
phoneUserEntityMap.put(convertInfo.getUser().getPhoneNo(), convertInfo.getUserInfoEntity());
phoneWechatUserMap.put(convertInfo.getUser().getPhoneNo(), convertInfo.getWechatUserInfo());
phoneNoList.add(convertInfo.getUser().getPhoneNo());
}
//用户注册
List<User> registerUserList = registerUser(phoneNoList, phoneUserMap, req.getTenantId());
List<Long> userIdList = registerUserList.stream().map(e -> e.getId()).collect(Collectors.toList());
//用户扩展信息
Map<Long, UserInfoEntity> userIdEntityMapQuery = Maps.newHashMap();
List<UserInfoEntity> userInfoEntityListQuery = userInfoRepository.findByTenantIdAndUserIdIn(req.getTenantId(), userIdList);
if (CollectionUtils.isNotEmpty(userInfoEntityListQuery)) {
userIdEntityMapQuery = userInfoEntityListQuery.stream().collect(Collectors.toMap(UserInfoEntity::getUserId, Function.identity(), (k1, k2) -> k1));
}
//用户微信信息
List<String> openIdList = phoneWechatUserMap.values().stream().map(e -> e.getOpenId()).collect(Collectors.toList());
List<WechatUserInfo> wechatUserInfoListQuery = weChatUserRepository.findByOpenIdInAndAppIdAndTenantId(openIdList, req.getAppId(), req.getTenantId());
Map<Long, WechatUserInfo> userIdWechatMapQuery = Maps.newHashMap();
if (CollectionUtils.isNotEmpty(wechatUserInfoListQuery)) {
userIdWechatMapQuery = wechatUserInfoListQuery.stream().collect(Collectors.toMap(WechatUserInfo::getUserId, Function.identity(), (k1, k2) -> k1));
}
for (User user : registerUserList) {
UserInfoEntity userInfoEntity = phoneUserEntityMap.get(user.getPhoneNo());
if (userInfoEntity != null && userIdEntityMapQuery.get(user.getId()) == null) {
userInfoEntity.setUserId(user.getId());
userInfoEntity.setTenantId(req.getTenantId());
} else if (userInfoEntity != null && userIdEntityMapQuery.get(user.getId()) != null) {
log.info("用户扩展信息已存在,userId:{},用户信息:{}", user.getId(), JSONObject.toJSONString(userInfoEntity));
}
//微信头像昵称正常存储
WechatUserInfo wechatUserInfo = phoneWechatUserMap.get(user.getPhoneNo());
if (wechatUserInfo != null && userIdWechatMapQuery.get(user.getId()) == null) {
wechatUserInfo.setUserId(user.getId());
wechatUserInfo.setTenantId(req.getTenantId());
} else if (wechatUserInfo != null && userIdWechatMapQuery.get(user.getId()) == null) {
log.info("用户微信信息已存在,userId:{},用户信息:{}", user.getId(), JSONObject.toJSONString(wechatUserInfo));
}
}
Collection<WechatUserInfo> wechatUserInfos = phoneWechatUserMap.values();
if (CollectionUtils.isNotEmpty(wechatUserInfos)) {
weChatUserRepository.save(wechatUserInfos);
}
Collection<UserInfoEntity> entities = phoneUserEntityMap.values();
if (CollectionUtils.isNotEmpty(entities)) {
userInfoRepository.save(entities);
}
return req;
//手机号是否存在--注册 登录
//微信是否存在- 若存在,和手机号是否匹配相同
//头像昵称
//用户存在--更新头像昵称 和微信信息
//用户不存在--
}
private List<User> registerUser(List<String> phoneNoList,Map<String,User> phoneUserMap,Integer tenantId) {
//查询已注册用户
List<User> registeredUserList = userRepository.findByPhoneNoInAndTenantId(phoneNoList, tenantId);
registeredUserList = CollectionUtils.isEmpty(registeredUserList) ? Lists.newArrayList() : registeredUserList;
List<String> registeredPhoneList = registeredUserList.stream().map(e -> e.getPhoneNo()).collect(Collectors.toList());
//TODO 可能冻结,或者注销
//待注册
List<String> needRegisterPhoneList = phoneNoList.stream().filter(e -> !registeredPhoneList.contains(e)).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(needRegisterPhoneList)) {
List<User> pendRegisterUserList = Lists.newArrayList();
for (String phone : needRegisterPhoneList) {
//TODO 可能会存在已经注销的,又洗进来了
String uuid = UUID.randomUUID().toString();
User user = phoneUserMap.get(phone);
user.setEncryptedPhoneNo(phone);
user.setEnable(true);
user.setTenantId(tenantId);
user.setUuid(uuid);
//清洗数据,忽略密码
user.setPassword(null);
user.setCipherPassword(null);
pendRegisterUserList.add(user);
}
List<User> saveList = userRepository.save(pendRegisterUserList);
registeredUserList.addAll(saveList);
}
return registeredUserList;
}
}
......@@ -91,6 +91,11 @@ public class WechatMiniLoginStrategy implements LoginStrategy {
//2、登录判断逻辑
WechatUserInfo wechatUserInfo = weChatUserRepository.findByOpenIdAndAppIdAndTenantId(openid, loginParam.getAppId(), sessionStruct.getTenantId());
//未绑定userid,禁止登录
if (wechatUserInfo == null || wechatUserInfo.getUserId() == null) {
throw new BizException(BizExceptionEnum.ERROR_WECHAT_BIND_USERID);
}
boolean register = false;
if (wechatUserInfo == null) {
//首次登录
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment