将待处理对象肢解成多个处理类处理,组合到一个处理类中

这是一个拉取平台用户的代码,肢解后,可以应对不同的拉取用户处理场合。比如单位用户,特殊标记用户,关连角色什么的。

@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);
		}
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值