最近项目有遇到一个需求:
1用户表tmk_user_info(图1)
refferNo是推荐人手机号表里的phoneNo(推荐人也是tmk_user_info里的人)
recordid是主键
2用户账号表tmk_user_account(图2 和tmk_user_info里的数据一 一对应)
accountuser是tmk_user_info表里的recordid
totalamount是该用户的账号余额
同一个用户可以有多个推荐人,奖励规则是:一级推荐人奖励a1元,二级推荐人奖励a2元,三级推荐人奖励3元… 以此类推,最多奖励五级,在奖励过程中如果发现两个相互推荐的人则结束后续的奖励,现在给定一个用户recordid要求根据tmk_user_info的推荐人关系更新所有的获得奖励的用户totalamount字段
问题分析和思路:
如上图假设recordid初始为1他的查表得到他的推荐人为2,3,4,5
然后继续查表得知2的推荐人为1,7,8,9其中1在前面的路径已经出现过了所以不计算奖励也不继续后面的查询,由于奖励最多5级所以最多查五次
伪代码:
Integer[] levelarr = {a1,a2,a3,a4,a5}; //奖励金额数组
List<String> refferIds = new ArrayList<>();
List<String> refferIds2 = new ArrayList<>();
List<String> refferIds3 = new ArrayList<>();
refferIds2.add(1); //记录初始recordid 的值1
for(int i=0;i<5;i++){
refferIds.clear();
refferIds.addAll(refferIds2);
refferIds2.clear();
for (String refferId : refferIds) {
//从tmk_user_info读取推荐关系
sql= " select tui2.recordid refferuserid from "+
" tmk_user_info tui1 LEFT JOIN tmk_user_info "+
" tui2 on tui1.refferNo =tui2.phoneNo and"+
" tui2.deletestatus=0 where tui1.recordid "+
" in(" + refferId + ") and tui1.deletestatus=0";
refferIds3 = DbUtil.get().executeQueryFirstColString(sql);
for (String refferId3 : refferIds3) {
//有可能推荐人还未注册
if(refferId3==null){
continue;
}
//验证是否存在相互推荐的情况
count=DbUtil.get().executeQueryOneInt(
"select count(1) from tmk_user_info where
" refferNo="+refferId+"
" and recordid="+refferId3);
if( count!=0){
continue;
}
refferIds2.add(refferId3);
//更新 tmk_user_account的totalamount字段
UserAccountModel userAccountModel = new UserAccountModel();
userAccountModel.setAccountuser(Integer.valueOf(refferId3));
userAccountModel = (UserAccountModel)getDao().selectObject("TMK_USER_ACCOUNT.ibatorgenerated_selectByUserid",userAccountModel);
userAccountModel.setReward(userAccountModel.getReward() + levelarr[i]); userAccountModel.setTotalamount(userAccountModel.getTotalamount() + levelarr[i]);
getDao().updateSql("TMK_USER_ACCOUNT.ibatorgenerated_updateByPrimaryKeySelective",userAccountModel);
}
}
}