Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
X
xyqb-user2
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
head_group
xyqb-user2
Commits
a8a38abe
Commit
a8a38abe
authored
Dec 17, 2019
by
徐小光
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'feature_generated_column' into 'master'
根据md5(phoneNo,idNo)获取用户信息 See merge request
!38
parents
b73d7179
bd871404
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
270 additions
and
3 deletions
+270
-3
UserHashPhoneNoIdNoMappingController.java
...ler/phonenoidno/UserHashPhoneNoIdNoMappingController.java
+120
-0
UserHashPhoneNoIdNoMapping.java
...cn/quantgroup/xyqb/entity/UserHashPhoneNoIdNoMapping.java
+43
-0
PhoneHashEventListener.java
...java/cn/quantgroup/xyqb/event/PhoneHashEventListener.java
+24
-1
UserDetailHashEventListener.java
...cn/quantgroup/xyqb/event/UserDetailHashEventListener.java
+23
-0
FindByMd5Enum.java
src/main/java/cn/quantgroup/xyqb/model/FindByMd5Enum.java
+32
-0
IUserHashPhoneNoIdNoMappingRepository.java
...yqb/repository/IUserHashPhoneNoIdNoMappingRepository.java
+11
-0
UserServiceImpl.java
...cn/quantgroup/xyqb/service/user/impl/UserServiceImpl.java
+17
-2
No files found.
src/main/java/cn/quantgroup/xyqb/controller/phonenoidno/UserHashPhoneNoIdNoMappingController.java
0 → 100644
View file @
a8a38abe
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"
;
}
}
src/main/java/cn/quantgroup/xyqb/entity/UserHashPhoneNoIdNoMapping.java
0 → 100644
View file @
a8a38abe
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
());
}
}
src/main/java/cn/quantgroup/xyqb/event/PhoneHashEventListener.java
View file @
a8a38abe
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
))
{
...
...
src/main/java/cn/quantgroup/xyqb/event/UserDetailHashEventListener.java
View file @
a8a38abe
...
...
@@ -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
());
}
}
}
src/main/java/cn/quantgroup/xyqb/model/FindByMd5Enum.java
0 → 100644
View file @
a8a38abe
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
;
}
}
src/main/java/cn/quantgroup/xyqb/repository/IUserHashPhoneNoIdNoMappingRepository.java
0 → 100644
View file @
a8a38abe
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
);
}
src/main/java/cn/quantgroup/xyqb/service/user/impl/UserServiceImpl.java
View file @
a8a38abe
...
...
@@ -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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment