Commit f2b57e46 authored by killer's avatar killer

Merge branch 'dev_deleteUser_20211229_lkw' into release

# Conflicts:
#	src/main/java/cn/quantgroup/xyqb/service/user/IUserService.java
#	src/main/java/cn/quantgroup/xyqb/service/user/impl/UserServiceImpl.java
parents 8d1af00c c1e23eb8
......@@ -232,4 +232,7 @@ public interface Constants {
*/
String VERIFY_TYPE_QG = "qg";
// -- End -- 验证码常量组
/** 注销用户后再次允许注册时间间隔-天数 */
long DELETE_USER_AGAIN_REGISTER_INTERVAL = 90;
}
......@@ -187,4 +187,14 @@ public class ExceptionHandlingController implements IBaseController {
public JsonResult handelMissingServletRequestParameterException(MissingServletRequestParameterException re) {
return JsonResult.buildErrorStateResult(re.getMessage(), null);
}
/**
* 用户注册登录异常处理
* @param e 异常
* @return JsonResult<String>
*/
@ExceptionHandler(UserRegisterLoginException.class)
public JsonResult<?> handleUserDeregisterException(UserRegisterLoginException e) {
return JsonResult.buildErrorStateResult(e.getMessage(), null);
}
}
......@@ -49,6 +49,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.util.*;
......@@ -1597,4 +1598,23 @@ public class InnerController implements IBaseController {
cleanDataService.cleanData();
return JsonResult.buildSuccessResult("已经开始清洗");
}
/**
* 注销用户
*
* @param userId 用户id
* @return 销户结果
*/
@ApiOperation(value = "注销用户", httpMethod = "GET", notes="注销用户")
@GetMapping("/user/delete/{userId}")
public JsonResult<?> deregister(@NotNull @PathVariable("userId") Long userId) {
log.info("用户id[{}], 销户开始", userId);
/* 执行销户 */
userService.deregister(userId);
log.info("用户id[{}], 销户成功", userId);
return JsonResult.buildSuccessResult("用户销户成功", true);
}
}
\ No newline at end of file
package cn.quantgroup.xyqb.entity;
import lombok.*;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;
/**
* 销户记录
*
* @author killer
* @date 2021年12月29日
**/
@Getter
@Setter
@ToString
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "user_deregister_record")
public class UserDeregisterRecord implements Serializable {
private static final long serialVersionUID = -1L;
/** 主建ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
private Long id;
/** 用户表ID */
@Column(name = "user_id")
private Long userId;
/** 手机号MD5 */
@Column(name = "phone_no")
private String phoneNo;
/** password */
@Column(name = "password")
private String password;
/** 渠道表ID */
@Column(name = "registered_from")
private Long registeredFrom;
/** uuid */
@Column(name = "uuid")
private String uuid;
/** uuid */
@Column(name = "deregister_time")
private Date deregisterTime;
/** 创建时间 */
@Column(name = "created_at")
private Timestamp createdAt;
/** 更新时间 */
@Column(name = "updated_at")
private Timestamp updatedAt;
@PrePersist
public void prePersist() {
Timestamp now = new Timestamp(System.currentTimeMillis());
this.createdAt = now;
this.updatedAt = now;
}
@PreUpdate
public void preUpdate() {
this.updatedAt = new Timestamp(System.currentTimeMillis());
}
}
package cn.quantgroup.xyqb.exception;
/**
* 用户销户异常
*
* @author killer
* @date 2021年12月29日14:31:02
*/
public class UserRegisterLoginException extends RuntimeException {
private static final long serialVersionUID = -1L;
public UserRegisterLoginException(String msg, Throwable t) {
super(msg, t);
}
public UserRegisterLoginException(String msg) {
super(msg);
}
}
package cn.quantgroup.xyqb.repository;
import cn.quantgroup.xyqb.entity.UserDeregisterRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/**
* 销户 Repository
*
* @author killer
* @date 2021年12月29日12:05:01
*/
public interface IUserDeregisterRecordRepository extends JpaRepository<UserDeregisterRecord, Long> {
/**
* 通过用户手机号md5查询销户记录
*
* @param phoneNo 手机号md5
* @return List<UserDeregisterRecord>
*/
List<UserDeregisterRecord> findByPhoneNo(String phoneNo);
}
......@@ -21,6 +21,7 @@ public interface IUserRepository extends JpaRepository<User, Long>, JpaSpecifica
/**
* 根据手机号查询用户UUID
*
* @param phoneNo - 手机号
* @return user表的uuid
*/
......@@ -29,6 +30,7 @@ public interface IUserRepository extends JpaRepository<User, Long>, JpaSpecifica
/**
* 根据身份证号查询用户UUID
*
* @param idNo - 身份证号
* @return user表的uuid
*/
......@@ -51,4 +53,11 @@ public interface IUserRepository extends JpaRepository<User, Long>, JpaSpecifica
List<User> findByUuidIn(List<String> uuids);
/**
* 根据userId删除用户
*
* @param userId 用户id
*/
void deleteById(Long userId);
}
......@@ -12,7 +12,6 @@ import static org.springframework.transaction.annotation.Propagation.MANDATORY;
/**
* Created by 11 on 2017/1/18.
* modify by djh 20200527 http://confluence.quantgroup.cn/pages/viewpage.action?pageId=30657427
*
*/
public interface IWeChatUserRepository extends JpaRepository<WechatUserInfo, Long> {
WechatUserInfo findByOpenIdAndAppName(String openId, String appName);
......@@ -37,6 +36,17 @@ public interface IWeChatUserRepository extends JpaRepository<WechatUserInfo, Lon
@Query(value = "update wechat_userinfo set user_id=null,phone_no='*' where user_id=?1 and app_name=?2", nativeQuery = true)
int dissociateByUserIdAndAppName(Long userId, String appName);
/**
* 解除商城用户与小程序和公众号关联关系
*
* @param userId 用户id
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update wechat_userinfo set user_id=null,phone_no='*' where user_id=?1 and app_name in ('xyqb', 'wuxi')", nativeQuery = true)
int forbiddenXyqbAndWuxiUserByUserId(Long userId);
/**
* 关联用户
*
......
package cn.quantgroup.xyqb.service.register;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserDeregisterRecord;
import java.util.List;
/**
* 销户服务
*
* @author killer
* @date 2021年12月29日14:23:53
*/
public interface IUserDeregisterService {
/**
* 通过用户手机号md5查询销户记录
*
* @param phoneNo 手机号md5
* @return List<UserDeregisterRecord>
*/
List<UserDeregisterRecord> queryByPhoneNo(String phoneNo);
/**
* 保存用户销户记录
*
* @param user 用户
*/
void save(User user);
}
package cn.quantgroup.xyqb.service.register.impl;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserDeregisterRecord;
import cn.quantgroup.xyqb.repository.IUserDeregisterRecordRepository;
import cn.quantgroup.xyqb.service.register.IUserDeregisterService;
import cn.quantgroup.xyqb.util.encrypt.Md5Util;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* 销户服务实现
*
* @author killer
* @date 2021年12月29日
**/
@Slf4j
@Service
@RequiredArgsConstructor
public class IUserDeregisterServiceImpl implements IUserDeregisterService {
private final IUserDeregisterRecordRepository userDeregisterRecordRepository;
@Override
public List<UserDeregisterRecord> queryByPhoneNo(String phoneNo) {
return userDeregisterRecordRepository.findByPhoneNo(phoneNo);
}
@Override
public void save(User user) {
UserDeregisterRecord build = UserDeregisterRecord.builder()
.userId(user.getId())
.deregisterTime(new Date())
.password(user.getPassword())
.registeredFrom(user.getRegisteredFrom())
.uuid(user.getUuid())
.phoneNo(Md5Util.build(user.getPhoneNo()))
.build();
userDeregisterRecordRepository.save(build);
}
}
......@@ -4,12 +4,17 @@ import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.entity.Address;
import cn.quantgroup.xyqb.entity.Contact;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserDeregisterRecord;
import cn.quantgroup.xyqb.event.RegisterEvent;
import cn.quantgroup.xyqb.exception.UserRegisterLoginException;
import cn.quantgroup.xyqb.model.UserRegisterParam;
import cn.quantgroup.xyqb.service.register.IUserDeregisterService;
import cn.quantgroup.xyqb.service.register.IUserRegisterService;
import cn.quantgroup.xyqb.service.user.IUserService;
import cn.quantgroup.xyqb.util.DateUtils;
import cn.quantgroup.xyqb.util.PasswordUtil;
import cn.quantgroup.xyqb.util.TenantUtil;
import cn.quantgroup.xyqb.util.encrypt.Md5Util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.ApplicationEventPublisher;
......@@ -17,9 +22,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.*;
import static cn.quantgroup.xyqb.Constants.DELETE_USER_AGAIN_REGISTER_INTERVAL;
/**
* @author liqing
......@@ -27,7 +32,7 @@ import java.util.UUID;
*/
@Service("userRegisterService")
@Slf4j
public class UserRegisterServiceImpl implements IUserRegisterService {
public class UserRegisterServiceImpl implements IUserRegisterService {
@Resource
private ApplicationEventPublisher applicationEventPublisher;
......@@ -35,9 +40,16 @@ import java.util.UUID;
@Resource
private IUserService userService;
@Resource
private IUserDeregisterService userDeregisterService;
@Transactional(rollbackFor = Exception.class)
@Override
public User register(Long registerFrom, String phoneNo) {
/* 用户销户检查 */
deregisterCheck(phoneNo);
UserRegisterParam userRegisterParam = UserRegisterParam.builder()
.registerFrom(registerFrom)
.phoneNo(phoneNo)
......@@ -54,6 +66,9 @@ import java.util.UUID;
@Transactional(rollbackFor = Exception.class)
@Override
public User register(Long registerFrom, String phoneNo, Integer tenantId) {
deregisterCheck(phoneNo);
UserRegisterParam userRegisterParam = UserRegisterParam.builder()
.registerFrom(registerFrom)
.phoneNo(phoneNo)
......@@ -72,6 +87,9 @@ import java.util.UUID;
@Transactional(rollbackFor = Exception.class)
@Override
public User register(Long registerFrom, String phoneNo, String idNo, String name, Long channelId, Long btRegisterChannelId) {
deregisterCheck(phoneNo);
UserRegisterParam userRegisterParam = UserRegisterParam.builder()
.registerFrom(registerFrom)
.phoneNo(phoneNo)
......@@ -91,6 +109,9 @@ import java.util.UUID;
@Transactional(rollbackFor = Exception.class)
@Override
public User register(Long registerFrom, String phoneNo, String idNo, String name, Long channelId, Long btRegisterChannelId, Integer tenantId) {
deregisterCheck(phoneNo);
UserRegisterParam userRegisterParam = UserRegisterParam.builder()
.registerFrom(registerFrom)
.phoneNo(phoneNo)
......@@ -142,6 +163,9 @@ import java.util.UUID;
@Transactional(rollbackFor = Exception.class)
@Override
public boolean register(String phoneNo, String password, Long registerFrom, String ip, Long channelId, Long btRegisterChannelId, String dimension) {
deregisterCheck(phoneNo);
UserRegisterParam userRegisterParam = UserRegisterParam.builder()
.registerFrom(registerFrom)
.phoneNo(phoneNo).password(password)
......@@ -160,6 +184,9 @@ import java.util.UUID;
@Transactional(rollbackFor = Exception.class)
@Override
public User register(String phoneNo, Long channelId, Long registerFrom, String appChannel, Long btRegisterChannelId, String dimension) {
deregisterCheck(phoneNo);
UserRegisterParam userRegisterParam = UserRegisterParam.builder()
.registerFrom(registerFrom)
.phoneNo(phoneNo)
......@@ -179,6 +206,9 @@ import java.util.UUID;
@Transactional(rollbackFor = Exception.class)
@Override
public User register(String phoneNo, Long channelId, Long registerFrom, String appChannel, Long btRegisterChannelId, String dimension, Integer tenantId) {
deregisterCheck(phoneNo);
UserRegisterParam userRegisterParam = UserRegisterParam.builder()
.registerFrom(registerFrom)
.phoneNo(phoneNo)
......@@ -199,6 +229,9 @@ import java.util.UUID;
@Transactional(rollbackFor = Exception.class)
@Override
public User register(Long registeredFrom, Long channelId, String phoneNo, String name, String idNo, Address addressObj, String contacts, List<Contact> contactList, Long btRegisterChannelId) {
deregisterCheck(phoneNo);
UserRegisterParam userRegisterParam = UserRegisterParam.builder()
.registerFrom(registeredFrom)
.phoneNo(phoneNo)
......@@ -218,4 +251,28 @@ import java.util.UUID;
return user;
}
/**
* 注册校验-销户校验
*
* @param phoneNo 手机号
*/
private void deregisterCheck(String phoneNo) {
List<UserDeregisterRecord> deregisterRecords = userDeregisterService.queryByPhoneNo(Md5Util.build(phoneNo));
/* 获取最新销户记录 */
Optional<UserDeregisterRecord> lastOne = deregisterRecords.stream()
.max(Comparator.comparing(UserDeregisterRecord::getDeregisterTime));
if (!lastOne.isPresent()) {
return;
}
/* 销户时间小于90天不允许再次注册 */
long diffDay = DateUtils.dayDiff(new Date(), lastOne.get().getDeregisterTime());
if (DELETE_USER_AGAIN_REGISTER_INTERVAL >= diffDay) {
throw new UserRegisterLoginException("距离上次销户时间小于90天,无法再次注册");
}
}
}
......@@ -26,7 +26,7 @@ public interface IUserService {
User findByPhoneInDb(String phone);
User findSlaveByPhoneInDb(String phone);
User findSlaveByPhoneInDb(String phone);
User findByUuidInDb(String uuid);
......@@ -93,11 +93,12 @@ public interface IUserService {
/**
* 按照userid 或者 uuid 批量查询
*
* @param vals
* @param type
* @return
*/
List<User> findByUuidsOrUserIds(List<String> vals,Integer type, Integer tenantId);
List<User> findByUuidsOrUserIds(List<String> vals, Integer type, Integer tenantId);
/**
* 登出
......@@ -105,4 +106,11 @@ public interface IUserService {
void logout(String token);
void kdspLogout(Long userId, LoginProperties loginProperties);
/**
* 通过userId销户
*
* @param userId 用户id
*/
void deregister(Long userId);
}
......@@ -12,10 +12,12 @@ import cn.quantgroup.xyqb.entity.*;
import cn.quantgroup.xyqb.event.PhoneNoUpdateEvent;
import cn.quantgroup.xyqb.exception.DataException;
import cn.quantgroup.xyqb.exception.UserNotExistException;
import cn.quantgroup.xyqb.exception.UserRegisterLoginException;
import cn.quantgroup.xyqb.model.*;
import cn.quantgroup.xyqb.repository.IUserHashMappingRepository;
import cn.quantgroup.xyqb.repository.IUserHashPhoneNoIdNoMappingRepository;
import cn.quantgroup.xyqb.repository.IUserRepository;
import cn.quantgroup.xyqb.service.register.IUserDeregisterService;
import cn.quantgroup.xyqb.service.register.IUserRegisterService;
import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.service.user.*;
......@@ -91,6 +93,9 @@ public class UserServiceImpl implements IUserService, IBaseController {
@Autowired
private ITenantService tenantService;
@Autowired
private IUserDeregisterService userDeregisterService;
@Override
// @Cacheable(value = "usercache", key = "'xyqbuser' + #phone", unless = "#result == null", cacheManager = "cacheManager")
public User findByPhoneInDb(String phone) {
......@@ -115,7 +120,7 @@ public class UserServiceImpl implements IUserService, IBaseController {
//校验租户ID
if (!tenantId.equals(tenantId)) {
users = tenantService.selectUsersByTenantId(users, tenantId);
}else {
} else {
users = tenantService.validationTentIdByTentId(users, tenantId);
}
users.forEach(user -> userIdAndPhoneMap.put(user.getId(), user.getPhoneNo()));
......@@ -356,28 +361,28 @@ public class UserServiceImpl implements IUserService, IBaseController {
return JsonResult.buildErrorStateResult("登录时微信关联失败", null);
}
try {
String scDeviceId=request.getHeader("scDeviceId");
if(!StringUtils.isEmpty(scDeviceId)){
iSensorsAnalytics.trackSignUp( user.getUuid(),scDeviceId);
String scDeviceId = request.getHeader("scDeviceId");
if (!StringUtils.isEmpty(scDeviceId)) {
iSensorsAnalytics.trackSignUp(user.getUuid(), scDeviceId);
}
String terminal=request.getHeader("terminal");
String channel=request.getHeader("channel");
log.info("--------手机号{}-------scDeviceId{},terminal{},channel{},是否注册{}",phoneNo,scDeviceId,terminal,channel,register);
if(!StringUtils.isEmpty(terminal)&&"APP".equals(terminal)||!StringUtils.isEmpty(channel)&&("214".equals(channel)||"217".equals(channel))){
if(register){
String terminal = request.getHeader("terminal");
String channel = request.getHeader("channel");
log.info("--------手机号{}-------scDeviceId{},terminal{},channel{},是否注册{}", phoneNo, scDeviceId, terminal, channel, register);
if (!StringUtils.isEmpty(terminal) && "APP".equals(terminal) || !StringUtils.isEmpty(channel) && ("214".equals(channel) || "217".equals(channel))) {
if (register) {
EventRecord userRecord = EventRecord.builder().setDistinctId(user.getUuid()).isLoginId(Boolean.TRUE)
.setEventName("App_RegisterEvent")
.build();
iSensorsAnalytics.track(userRecord);
}else {
} else {
EventRecord userRecord = EventRecord.builder().setDistinctId(user.getUuid()).isLoginId(Boolean.TRUE)
.setEventName("App_LoginEvent")
.build();
iSensorsAnalytics.track(userRecord);
}
iSensorsAnalytics.flush();
}else {
log.info("老神策埋点{},{}------------",user.getRegisteredFrom(),user.getUuid());
} else {
log.info("老神策埋点{},{}------------", user.getRegisteredFrom(), user.getUuid());
EventRecord userRecord = EventRecord.builder().setDistinctId(user.getUuid()).isLoginId(Boolean.TRUE)
.setEventName("PD_WUXIEC_UserLoginVccorCash")
.addProperty("son_channel_id", user.getRegisteredFrom())
......@@ -506,14 +511,14 @@ public class UserServiceImpl implements IUserService, IBaseController {
List<User> users = userRepository.findByIdIn(collect);
if (!tenantId.equals(TenantUtil.TENANT_DEFAULT)) {
return tenantService.selectUsersByTenantId(users, tenantId);
}else {
} else {
return tenantService.validationTentIdByTentId(users, tenantId);
}
} else { //不是1 就是 uuids
List<User> users = userRepository.findByUuidIn(vals);
if (!tenantId.equals(TenantUtil.TENANT_DEFAULT)) {
return tenantService.selectUsersByTenantId(users, tenantId);
}else {
} else {
return tenantService.validationTentIdByTentId(users, tenantId);
}
}
......@@ -530,4 +535,26 @@ public class UserServiceImpl implements IUserService, IBaseController {
sessionService.kdspDeleteSession(userId, loginProperties);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void deregister(Long userId) {
User user = userRepository.findById(userId);
if (Objects.isNull(user)) {
throw new UserRegisterLoginException("用户不存在");
}
/* 保存用户销户记录 */
userDeregisterService.save(user);
/* 删除用户 */
userRepository.deleteById(userId);
/* 清空session */
sessionService.deleteByUserId(user.getId());
/* 清空缓存 */
sessionService.deleteUserCatch(user);
/* 禁用微信 */
wechatService.forbiddenXyqbAndWuxiUserByUserId(user.getId());
}
}
......@@ -35,7 +35,16 @@ public interface IWechatService {
* @return
*/
WechatUserInfo queryByUserId(Long userId);
WechatUserInfo queryByUserId(Long userId,String appName);
WechatUserInfo queryByUserId(Long userId, String appName);
int forbiddenUserWeChat(Long userId);
/**
* 通过userId解除商城用户与小程序和公众号关联关系
*
* @param userId 用户id
* @return 禁用结果
*/
int forbiddenXyqbAndWuxiUserByUserId(Long userId);
}
......@@ -117,20 +117,20 @@ public class WechatServiceImpl implements IWechatService {
@Override
public WechatUserInfo findWechatUserInfoFromDb(String openId) {
return weChatUserRepository.findByOpenIdAndAppName(openId,"xyqb");
return weChatUserRepository.findByOpenIdAndAppName(openId, "xyqb");
}
@Override
@Transactional(rollbackFor = Exception.class)
public WechatUserInfo saveWechatUserInfo(WechatUserInfo userInfo) {
log.info("微信信息保存开始:{}",JSON.toJSONString(userInfo));
log.info("微信信息保存开始:{}", JSON.toJSONString(userInfo));
if (Objects.isNull(userInfo) || Objects.isNull(userInfo.getOpenId())) {
return null;
}
long count = weChatUserRepository.countByOpenIdAndAppName(userInfo.getOpenId(),"xyqb");
long count = weChatUserRepository.countByOpenIdAndAppName(userInfo.getOpenId(), "xyqb");
if (count > 0) {
//注意,这里会抛异常(5000/total),WeChatController中已捕获处理
return weChatUserRepository.findByOpenIdAndAppName(userInfo.getOpenId(),"xyqb");
return weChatUserRepository.findByOpenIdAndAppName(userInfo.getOpenId(), "xyqb");
}
if (null == userInfo.getPhoneNo()) {
userInfo.setPhoneNo("");
......@@ -151,9 +151,9 @@ public class WechatServiceImpl implements IWechatService {
userInfo = userInfo.convertEmoji();
WechatUserInfo wechatUserInfo = weChatUserRepository.save(userInfo);
WechatEventMsg wechatEventMsg = WechatEventMsg.builder()
.userId(wechatUserInfo.getUserId())
.openId(wechatUserInfo.getOpenId())
.build();
.userId(wechatUserInfo.getUserId())
.openId(wechatUserInfo.getOpenId())
.build();
applicationEventPublisher.publishEvent(new WechatBindEvent(this, wechatEventMsg));
return wechatUserInfo;
}
......@@ -166,27 +166,27 @@ public class WechatServiceImpl implements IWechatService {
return 0;
}
// Old - 当前openId的WechatUserInfo
WechatUserInfo wechatUserInfo = weChatUserRepository.findByOpenIdAndAppName(openId,"xyqb");
WechatUserInfo wechatUserInfo = weChatUserRepository.findByOpenIdAndAppName(openId, "xyqb");
if (Objects.nonNull(wechatUserInfo) && Objects.equals(userId, wechatUserInfo.getUserId()) && Objects.equals(openId, wechatUserInfo.getOpenId())) {
log.info("微信关联成功:重复关联:跳过:[service]:userId:{},phoneNo:{},openId:{}", userId, phoneNo, openId);
return 1;
}
// 强制解除关联
int dissociate = weChatUserRepository.dissociateUser(openId, userId,"xyqb");
int dissociate = weChatUserRepository.dissociateUser(openId, userId, "xyqb");
if (dissociate < 1) {
log.error("微信关联失败:解绑条数<1:[service]:userId:{},phoneNo:{},openId:{}", userId, phoneNo, openId);
throw new WechatRelateUserException("微信关联失败");
}
int relate = weChatUserRepository.relateUser(userId, Optional.ofNullable(phoneNo).orElse(""), openId,"xyqb");
int relate = weChatUserRepository.relateUser(userId, Optional.ofNullable(phoneNo).orElse(""), openId, "xyqb");
if (relate < 1) {
log.error("微信关联失败:绑定条数<1:[service]:userId:{},phoneNo:{},openId:{}", userId, phoneNo, openId);
throw new WechatRelateUserException("微信关联失败");
}
WechatEventMsg wechatEventMsg = WechatEventMsg.builder()
.userId(userId)
.openId(openId)
.build();
applicationEventPublisher.publishEvent(new WechatBindEvent(this,wechatEventMsg));
.userId(userId)
.openId(openId)
.build();
applicationEventPublisher.publishEvent(new WechatBindEvent(this, wechatEventMsg));
// Todo : 如果当前openId已关联其他用户,则解绑成功后要注销其登录session -- 考虑后暂时不执行,影响太大
log.info("微信关联成功:[service]:userId:{},phoneNo:{},openId:{},dissociate:{},relate:{},Old-WechatUserInfo:{}", userId, phoneNo, openId, dissociate, relate, wechatUserInfo);
return relate;
......@@ -197,7 +197,7 @@ public class WechatServiceImpl implements IWechatService {
if (!ValidationUtil.validatePhoneNo(phoneNo)) {
return null;
}
return weChatUserRepository.findByPhoneNoAndAppName(phoneNo,"xyqb");
return weChatUserRepository.findByPhoneNoAndAppName(phoneNo, "xyqb");
}
private String getTokenFromWechatServer(String code) {
......@@ -222,30 +222,33 @@ public class WechatServiceImpl implements IWechatService {
* @param userId - 用户标识
* @return
* @TODO 2021-10-14 修改 findByUserIdAndAppName 为 findFirstByUserIdAndAppNameOrderByCreatedAtDesc, 原因是存在有多个数据情况
*
*/
@Override
public WechatUserInfo queryByUserId(Long userId) {
return weChatUserRepository.findFirstByUserIdAndAppNameOrderByCreatedAtDesc(userId,"xyqb");
return weChatUserRepository.findFirstByUserIdAndAppNameOrderByCreatedAtDesc(userId, "xyqb");
}
/**
*
* @param userId
* @param appName
* @return
* @TODO 2021-10-14 修改 findByUserIdAndAppName 为 findFirstByUserIdAndAppNameOrderByCreatedAtDesc, 原因是存在有多个数据情况
*/
public WechatUserInfo queryByUserId(Long userId,String appName){
if(appName==null||"".equals(appName.trim())){
public WechatUserInfo queryByUserId(Long userId, String appName) {
if (appName == null || "".equals(appName.trim())) {
appName = "xyqb";
}
return weChatUserRepository.findFirstByUserIdAndAppNameOrderByCreatedAtDesc(userId,appName);
return weChatUserRepository.findFirstByUserIdAndAppNameOrderByCreatedAtDesc(userId, appName);
}
@Override
public int forbiddenUserWeChat(Long userId) {
return weChatUserRepository.dissociateByUserIdAndAppName(userId,"xyqb");
return weChatUserRepository.dissociateByUserIdAndAppName(userId, "xyqb");
}
@Override
public int forbiddenXyqbAndWuxiUserByUserId(Long userId) {
return weChatUserRepository.forbiddenXyqbAndWuxiUserByUserId(userId);
}
}
package cn.quantgroup.xyqb.util;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
......@@ -49,4 +47,15 @@ public class DateUtils {
long now = System.currentTimeMillis();
return (timeStamp - now) / 1000;
}
/**
* 获取时间差天数
*
* @param bDate begin
* @param eDate end
* @return 时间差天数
*/
public static long dayDiff(Date bDate, Date eDate) {
return ((bDate.getTime() - eDate.getTime()) / (1000 * 3600 * 24));
}
}
# 销户需求
-- http://confluence.quantgroup.cn/pages/viewpage.action?pageId=61677003
CREATE TABLE `user_deregister_record`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`phone_no` varchar(255) NOT NULL COMMENT '手机号MD5值',
`password` varchar(128) DEFAULT '' NULL COMMENT '密码',
`registered_from` bigint(20) DEFAULT 0 null COMMENT '渠道ID',
`uuid` varchar(64) DEFAULT '' COMMENT 'uuid',
`deregister_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '销户时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`) USING BTREE,
KEY `idx_delete_time` (`deregister_time`)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8 COMMENT ='销户记录表';
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
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