最近项目有遇到一个需求:
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); } } }