Commit a8a38abe authored by 徐小光's avatar 徐小光

Merge branch 'feature_generated_column' into 'master'

根据md5(phoneNo,idNo)获取用户信息

See merge request !38
parents b73d7179 bd871404
package cn.quantgroup.xyqb.controller.phonenoidno;
import cn.quantgroup.xyqb.entity.UserHashPhoneNoIdNoMapping;
import cn.quantgroup.xyqb.util.encrypt.Md5Util;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
/**
* 同步xyqb_user.user_detail
* <p>
* Date: 2019/12/13
* Time: 上午10:42
*
* @author: yangrui
*/
@Slf4j
//@RestController
//@RequestMapping("/v1/phonenoidno")
public class UserHashPhoneNoIdNoMappingController {
private static final String SYNC_DATA_PHONE_NO_ID_NO = "syncdataphonenoidno";
private static final String SYNC_DATA_PHONE_NO_ID_NO_SWITCH = "switch";
private static final String SYNC_DATA_PHONE_NO_ID_NO_LAST_ID = "last_id";
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource
private JdbcTemplate jdbcTemplate;
/**
* md5(phone_no,id_no)
* 本地环境模拟-Xms3G -Xmx3G,单线程同步实际时间45分钟
*
* @return
*/
// @GetMapping("/sync/data")
public String syncData() {
log.info("start");
long start = System.currentTimeMillis();
long idStart = 0;
Object lastIdObj = stringRedisTemplate.opsForHash().get(SYNC_DATA_PHONE_NO_ID_NO, SYNC_DATA_PHONE_NO_ID_NO_LAST_ID);
if (lastIdObj != null) {
idStart = Long.valueOf(String.valueOf(lastIdObj));
}
final int limit = 5000;
long count = jdbcTemplate.queryForObject("select count(id) from user_detail where id > ?", Long.class, new Object[]{idStart});
if (count > 0) {
long page = count / limit + 1;
for (int i = 0; i < page; i++) {
Object state = stringRedisTemplate.opsForHash().get(SYNC_DATA_PHONE_NO_ID_NO, SYNC_DATA_PHONE_NO_ID_NO_SWITCH);
if (state == null || "on".equals(state)) {
List<UserHashPhoneNoIdNoMapping> userHashPhoneNoIdNoMappings = Lists.newArrayList();
jdbcTemplate.query("select id, user_id, phone_no, id_no" +
" from user_detail where id > ? limit ?", new Object[]{idStart, limit}, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
UserHashPhoneNoIdNoMapping userHashPhoneNoIdNoMapping = new UserHashPhoneNoIdNoMapping();
/* 暂存 */
userHashPhoneNoIdNoMapping.setId(rs.getLong("id"));
userHashPhoneNoIdNoMapping.setUserId(rs.getLong("user_id"));
String phoneNoIdNoMd5 = (rs.getString("phone_no") + rs.getString("id_no")).toUpperCase();
userHashPhoneNoIdNoMapping.setPhoneNoIdNoMd5(Md5Util.build(phoneNoIdNoMd5));
userHashPhoneNoIdNoMappings.add(userHashPhoneNoIdNoMapping);
}
});
if (CollectionUtils.isNotEmpty(userHashPhoneNoIdNoMappings)) {
jdbcTemplate.batchUpdate("insert ignore into user_hash_phone_no_id_no_mapping (user_id, phone_no_id_no_md5) values (?,?)", new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
UserHashPhoneNoIdNoMapping userHashPhoneNoIdNoMapping = userHashPhoneNoIdNoMappings.get(i);
ps.setLong(1, userHashPhoneNoIdNoMapping.getUserId());
ps.setString(2, userHashPhoneNoIdNoMapping.getPhoneNoIdNoMd5());
}
@Override
public int getBatchSize() {
return userHashPhoneNoIdNoMappings.size();
}
});
idStart = userHashPhoneNoIdNoMappings.get(userHashPhoneNoIdNoMappings.size() - 1).getId();
stringRedisTemplate.opsForHash().put(SYNC_DATA_PHONE_NO_ID_NO, SYNC_DATA_PHONE_NO_ID_NO_LAST_ID, String.valueOf(idStart));
}
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
log.info("done cost time = 【{}】", System.currentTimeMillis() - start);
return "SUCCESS";
}
// @GetMapping("/sync/data/stop")
public String syncDataStop() {
stringRedisTemplate.opsForHash().put(SYNC_DATA_PHONE_NO_ID_NO, SYNC_DATA_PHONE_NO_ID_NO_SWITCH, "off");
return "SUCCESS";
}
// @GetMapping("/sync/data/open/switch")
public String syncDataOpenSwitch() {
stringRedisTemplate.opsForHash().put(SYNC_DATA_PHONE_NO_ID_NO, SYNC_DATA_PHONE_NO_ID_NO_SWITCH, "on");
return "SUCCESS";
}
}
package cn.quantgroup.xyqb.entity;
import lombok.Data;
import javax.persistence.*;
import java.sql.Timestamp;
@Data
@Entity
@Table(name = "user_hash_phone_no_id_no_mapping")
public class UserHashPhoneNoIdNoMapping {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "phone_no_id_no_md5")
private String phoneNoIdNoMd5;
@Column(name = "created_at")
private Timestamp createdAt;
@Column(name = "updated_at")
private Timestamp updatedAt;
public UserHashPhoneNoIdNoMapping() {
}
public UserHashPhoneNoIdNoMapping(Long userId) {
this.userId = userId;
}
@PrePersist
public void prePersist() {
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
createdAt = timestamp;
updatedAt = timestamp;
}
@PreUpdate
public void preUpdate() {
updatedAt = new Timestamp(System.currentTimeMillis());
}
}
package cn.quantgroup.xyqb.event;
import cn.quantgroup.xyqb.entity.UserHashMapping;
import cn.quantgroup.xyqb.entity.UserHashPhoneNoIdNoMapping;
import cn.quantgroup.xyqb.model.UserRegisterParam;
import cn.quantgroup.xyqb.repository.IUserHashMappingRepository;
import cn.quantgroup.xyqb.repository.IUserHashPhoneNoIdNoMappingRepository;
import cn.quantgroup.xyqb.util.encrypt.Md5Util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
......@@ -10,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.persistence.PersistenceException;
@Component
......@@ -18,6 +21,8 @@ public class PhoneHashEventListener implements ApplicationListener<RegisterEvent
@Autowired
private IUserHashMappingRepository userHashMappingRepository;
@Resource
private IUserHashPhoneNoIdNoMappingRepository userHashPhoneNoIdNoMappingRepository;
@Override
public void onApplicationEvent(RegisterEvent event) {
......@@ -25,6 +30,24 @@ public class PhoneHashEventListener implements ApplicationListener<RegisterEvent
String phoneNo = userRegisterParam.getPhoneNo();
Long userId = userRegisterParam.getUser().getId();
String idNo = userRegisterParam.getIdNo();
/* modify by yangrui on 2019/12/16 下午5:47 */
UserHashPhoneNoIdNoMapping userHashPhoneNoIdNoMapping = userHashPhoneNoIdNoMappingRepository.findByUserId(userId);
if (userHashPhoneNoIdNoMapping == null) {
userHashPhoneNoIdNoMapping = new UserHashPhoneNoIdNoMapping(userId);
}
StringBuilder phoneNoIdNoMd5 = new StringBuilder(phoneNo);
if (StringUtils.isNotEmpty(idNo)) {
phoneNoIdNoMd5.append(idNo);
}
userHashPhoneNoIdNoMapping.setPhoneNoIdNoMd5(Md5Util.build(phoneNoIdNoMd5.toString().toUpperCase()));
try {
userHashPhoneNoIdNoMappingRepository.saveAndFlush(userHashPhoneNoIdNoMapping);
} catch (PersistenceException e) {
log.error("保存userHashPhoneNoIdNoMapping重复, 无需再保存, userId:{}", userId);
}
UserHashMapping userHashMapping = userHashMappingRepository.findByUserId(userId);
if (userHashMapping != null && userHashMapping.getIdNoMd5() != null) {
//已存在的用户, 并且已存在身份证号
......@@ -37,7 +60,7 @@ public class PhoneHashEventListener implements ApplicationListener<RegisterEvent
//无论如何都更新手机号
String phoneNoMd5 = Md5Util.build(phoneNo);
userHashMapping.setPhoneNoMd5(phoneNoMd5);
String idNo = userRegisterParam.getIdNo();
//如果有身份证号. 更新一下
if (StringUtils.isNotEmpty(idNo)) {
......
......@@ -2,13 +2,16 @@ package cn.quantgroup.xyqb.event;
import cn.quantgroup.xyqb.entity.UserDetail;
import cn.quantgroup.xyqb.entity.UserHashMapping;
import cn.quantgroup.xyqb.entity.UserHashPhoneNoIdNoMapping;
import cn.quantgroup.xyqb.repository.IUserHashMappingRepository;
import cn.quantgroup.xyqb.repository.IUserHashPhoneNoIdNoMappingRepository;
import cn.quantgroup.xyqb.util.encrypt.Md5Util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.persistence.PersistenceException;
......@@ -21,6 +24,8 @@ public class UserDetailHashEventListener implements ApplicationListener<UserDeta
@Autowired
private IUserHashMappingRepository userHashMappingRepository;
@Resource
private IUserHashPhoneNoIdNoMappingRepository userHashPhoneNoIdNoMappingRepository;
@Override
public void onApplicationEvent(UserDetailUpdateEvent event) {
......@@ -45,5 +50,23 @@ public class UserDetailHashEventListener implements ApplicationListener<UserDeta
} catch (PersistenceException e) {
log.error("保存userHashMapping重复, 无需再保存, userId:{}", userDetail.getUserId());
}
/* modify by yangrui on 2019/12/16 下午5:48 */
UserHashPhoneNoIdNoMapping userHashPhoneNoIdNoMapping = userHashPhoneNoIdNoMappingRepository.findByUserId(userDetail.getUserId());
//如果不存在, 我先保存一下
if (userHashPhoneNoIdNoMapping == null) {
userHashPhoneNoIdNoMapping = new UserHashPhoneNoIdNoMapping(userDetail.getUserId());
}
//可能存在手机号、身份证号修改. 搞一下.
String phoneNoIdNoMd5 = (userDetail.getPhoneNo() + userDetail.getIdNo()).toUpperCase();
userHashPhoneNoIdNoMapping.setPhoneNoIdNoMd5(Md5Util.build(phoneNoIdNoMd5));
try {
userHashPhoneNoIdNoMappingRepository.save(userHashPhoneNoIdNoMapping);
} catch (PersistenceException e) {
log.error("保存userHashPhoneNoIdNoMapping重复, 无需再保存, userId:{}", userDetail.getUserId());
}
}
}
package cn.quantgroup.xyqb.model;
import lombok.Getter;
/**
* Date: 2019/12/13
* Time: 上午11:22
*
* @author: yangrui
*/
@Getter
public enum FindByMd5Enum {
/**
* md5(phoneNo)
*/
PHONENO(1),
/**
* md5(idNo)
*/
IDNO(2),
/**
* md5(phoneNoidNo)
*/
PHONENOIDNO(3),;
private int type;
FindByMd5Enum(int type) {
this.type = type;
}
}
package cn.quantgroup.xyqb.repository;
import cn.quantgroup.xyqb.entity.UserHashPhoneNoIdNoMapping;
import org.springframework.data.jpa.repository.JpaRepository;
public interface IUserHashPhoneNoIdNoMappingRepository extends JpaRepository<UserHashPhoneNoIdNoMapping, Long> {
UserHashPhoneNoIdNoMapping findFirstByPhoneNoIdNoMd5(String phoneNoIdNoMd5);
UserHashPhoneNoIdNoMapping findByUserId(Long userId);
}
......@@ -4,10 +4,13 @@ import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserDetail;
import cn.quantgroup.xyqb.entity.UserHashMapping;
import cn.quantgroup.xyqb.entity.UserHashPhoneNoIdNoMapping;
import cn.quantgroup.xyqb.event.PhoneNoUpdateEvent;
import cn.quantgroup.xyqb.exception.DataException;
import cn.quantgroup.xyqb.model.FindByMd5Enum;
import cn.quantgroup.xyqb.model.UserInfo;
import cn.quantgroup.xyqb.repository.IUserHashMappingRepository;
import cn.quantgroup.xyqb.repository.IUserHashPhoneNoIdNoMappingRepository;
import cn.quantgroup.xyqb.repository.IUserRepository;
import cn.quantgroup.xyqb.service.user.IUserDetailService;
import cn.quantgroup.xyqb.service.user.IUserService;
......@@ -28,6 +31,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.sql.Timestamp;
import java.util.Collections;
import java.util.List;
......@@ -50,6 +54,9 @@ public class UserServiceImpl implements IUserService {
@Autowired
private IUserHashMappingRepository userHashMappingRepository;
@Resource
private IUserHashPhoneNoIdNoMappingRepository userHashPhoneNoIdNoMappingRepository;
@Autowired
private IUserDetailService userDetailService;
......@@ -196,10 +203,18 @@ public class UserServiceImpl implements IUserService {
md5Value = md5Value.toLowerCase();
long value = HashUtil.crc32(md5Value);
UserHashMapping userHashMapping;
if (type == 1) {
/* modify by yangrui on 2019/12/13 上午11:52 */
if (FindByMd5Enum.PHONENO.getType() == type) {
userHashMapping = userHashMappingRepository.findByPhoneNoMd5ShortAndPhoneNoMd5(value, md5Value);
} else {
} else if (FindByMd5Enum.IDNO.getType() == type) {
userHashMapping = userHashMappingRepository.findByIdNoMd5ShortAndIdNoMd5(value, md5Value);
} else {
userHashMapping = null;
UserHashPhoneNoIdNoMapping userHashPhoneNoIdNoMapping = userHashPhoneNoIdNoMappingRepository.findFirstByPhoneNoIdNoMd5(md5Value);
if (userHashPhoneNoIdNoMapping != null) {
userHashMapping = new UserHashMapping();
userHashMapping.setUserId(userHashPhoneNoIdNoMapping.getUserId());
}
}
if (userHashMapping == null) {
return 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