业务背景
因为公司有多个公众号,并且是各不相同的商户主体,所以wechat_openid并不是相通的,在会员模块为了兼容这几个不同的wechat_openid互通,所以产生了会员合并功能,就是一个会员允许有多个wechat_openid;
我们通过一个merge表记录这些合并记录,保证数据的清晰度和完整性,有首有尾;
举个栗子:
- 会员1 : id = 1, wechat_openid = aaa
- 会员2 : id = 2, wechat_openid = bbb
- 会员2 与 会员1 进行合并
- 合并后会员1 : id = 1, wechat_openid = List("aaa", "bbb")
- 合并后会员2进行逻辑删除
- merge_table : old_member_id = 2, new_member_id = 1
所以如果说通过id=2去查询会员,如果主表查不到的话,就需要去merge表通过old_member_id查询,得到new_member_id之后再去主表查,如果主表还是查不到,就再去merge表循环查一次,因为公众号主体存在多个,所以存在循环查多次的情况,这是就可以使用Scala尾递归来进行查询优化;
def queryMember(): Long = {
@tailrec
def tailrecmember(count: Int, memId: Long): Long = {
val memberOpt: Option[Member] = MemberQuerySqlNew.getMemberByMemIdOrMobileOrOpenId(memberId = Some(memId), mobile = None, openId = None)
if (memberOpt.isDefined) {
memberOpt.get.id
} else {
val newMemberIdOpt: Option[Long] = MemberQuerySqlNew.getNewMemberIdByOldMemberId(memId)
if (newMemberIdOpt.isDefined) {
tailrecmember(count + 1, newMemberIdOpt.get)
} else {
assert(assertion = false, new MemberExceptionNew("Err-memberService", s"会员不存在${request.memberId}"))
-1 // 如果主表和merge表都没有数据,这种情况肯定是有异常的,所以我们用一个assert异常
}
}
}
tailrecmember(1, request.memberId)
}
并且这个方法可以当作一个公共方法来实现member查询