这是一个拉取平台用户的代码,肢解后,可以应对不同的拉取用户处理场合。比如单位用户,特殊标记用户,关连角色什么的。
@Component
public class UserCenterPuller {
@Autowired
private RestTemplate restTemplate;
@Autowired
List<UserUpdateHandler> userUpdateHandlers;
@Autowired
PlatformTransactionManager transactionManager;
@Autowired
PropertiesReader propertiesReader;
public void pullUserCenterUsers(String groupPrimaryKey) {
String userCenterHost = propertiesReader.getUserCenterHost();
String url = userCenterHost + "/xxxxxxxx?groupPrimaryKey="+groupPrimaryKey;
String json = restTemplate.postForObject(url, null, String.class);
List<PullUserVo> vos = toPullUserVos(json);
vos.foreach(vo->excuteHandlers(vo));
}
private void excuteHandlers(PullUserVo vo) {
//手动开事务,针对每一个用户都进行事务包裹
TransactionStatus status = startTransaction();
try {
// 处理增删改查
for (UserUpdateHandler userUpdateHandler : userUpdateHandlers) {
userUpdateHandler.doUpdateUser(vo);
}
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
}
}
private List<PullUserVo> toPullUserVos(String json) {
JSONObject parseObject = JSONObject.parseObject(json);
Integer errcode = parseObject.getInteger("errcode");
List<PullUserVo> vos = new ArrayList<>();
if (null == errcode || errcode.intValue() != 200) {
return vos;
}
JSONArray jsonArray = parseObject.getJSONArray("data");
if (jsonArray.size() == 0) {
return vos;
}
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
vos.add(new PullUserVo(jsonObject));
}
return vos;
}
private TransactionStatus startTransaction() {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
return transactionManager.getTransaction(def);
}
}
UserUpdateHandler 基类
public interface UserUpdateHandler implements Ordered {
public void doUpdateUser(PullUserVo pullUserVo);
@Override
default int getOrder() {
return HandleOrder.getOrder(this.getClass());
}
}
处理类排序集中配置
public class HandleOrder {
private static Map<String, Integer> handleOrder;
static {
handleOrder = new HashMap<>();
handleOrder.put(DeleteUserHandler.class.getName(), 0);
handleOrder.put(UserModelHandler.class.getName(), 1);
handleOrder.put(UserAreaModelHandler.class.getName(), 2);
handleOrder.put(MemberInfoModelHandler.class.getName(), 3);
}
public static Integer getOrder(Class<? extends UserUpdateHandler> cls) {
return handleOrder.get(cls.getName());
}
}
//处理删除
@Component
public class DeleteUserHandler extends UserUpdateHandler {
@Override
public void doUpdateUser(PullUserVo pullUserVo) {
if (!pullUserVo.getDelFlag()) {
return;
}
String id = pullUserVo.getId();
String areaId = pullUserVo.getAreaId();
userDao.softDeleteById(id);
userAreaDao.delete(id, null);
deleteMember(id, areaId);
}
private void deleteMember(String id, String areaId) {
MemberInfoQuery q = new MemberInfoQuery();
q.setUserId(id);
q.findAllArea();
memberInfoDao.softDeleteByQuery(q);
}
}
//处理User对象
@Component
public class UserModelHandler extends UserUpdateHandler {
@Override
public void doUpdateUser(PullUserVo pullUserVo) {
if (pullUserVo.getDelFlag()) {
return;
}
User user = pullUserVo.toUser();
// 是否存在
User dbuser = userDao.get(user.getId(), "id");
boolean isInsert = null == dbuser;
if(isInsert) {
user.setIsUsing(1);
}
userDao.updateOrSave(isInsert, user);
}
}
//处理userArea对象
@Component
public class UserAreaModelHandler extends UserUpdateHandler {
@Override
public void doUpdateUser(PullUserVo pullUserVo) {
if (pullUserVo.getDelFlag()) {
return;
}
UserArea userArea = pullUserVo.toUserArea();
UserArea dbUserArea = userAreaDao.get(userArea.getAreaId(), userArea.getUserId(), "user_id,area_id");
userAreaDao.updateOrSave(null == dbUserArea, userArea);
}
}
//处理memberinfo对象
@Component
public class MemberInfoModelHandler extends UserUpdateHandler {
@Override
public void doUpdateUser(PullUserVo pullUserVo) {
if (pullUserVo.getDelFlag()) {
return;
}
List<MemberInfo> memberInfos = pullUserVo.toMemberInfos();
if (memberInfos.size() > 0) {
for (MemberInfo memberInfo : memberInfos) {
toAddMemberInfo(memberInfo);
}
}
// 清掉非委员数据记录
if (!pullUserVo.getIsMember()) {
clearMemberRecord(pullUserVo, 1);
}
if (!pullUserVo.getIsNationMember()) {
clearMemberRecord(pullUserVo, 2);
}
}
private void clearMemberRecord(PullUserVo pullUserVo, Integer memberType) {
MemberInfoQuery q = new MemberInfoQuery();
q.setUserId(pullUserVo.getId());
q.setAreaId(pullUserVo.getAreaId());
q.setMemberType(memberType);
memberInfoDao.softDeleteByQuery(q);
}
private void toAddMemberInfo(MemberInfo memberInfo) {
MemberInfo member = memberInfoDao.getMember(memberInfo.getMemberType(), memberInfo.getUserId());
if (null == member) {
memberInfoDao.insertSelective(memberInfo);
} else {
memberInfoDao.updateByQuery(memberInfo);
}
}
}