租车吸引客户业务:关于多重奖励的解决方案

最近项目有遇到一个需求:
1用户表tmk_user_info(图1)
图1
refferNo是推荐人手机号表里的phoneNo(推荐人也是tmk_user_info里的人)
recordid是主键
2用户账号表tmk_user_account(图2 和tmk_user_info里的数据一 一对应)
图2
accountuser是tmk_user_info表里的recordid
totalamount是该用户的账号余额

同一个用户可以有多个推荐人,奖励规则是:一级推荐人奖励a1元,二级推荐人奖励a2元,三级推荐人奖励3元… 以此类推,最多奖励五级,在奖励过程中如果发现两个相互推荐的人则结束后续的奖励,现在给定一个用户recordid要求根据tmk_user_info的推荐人关系更新所有的获得奖励的用户totalamount字段

问题分析和思路:
图3
如上图假设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);

	        }
	    }							
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据与后端架构提升之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值