package project.bonus.internal; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.springframework.jdbc.core.JdbcTemplate; import kernel.bo.RecordObjectMapper; import kernel.util.Arith; import kernel.util.DateUtils; import kernel.util.StringUtils; import project.Constants; import project.blockchain.RechargeBlockchain; import project.blockchain.RechargeBlockchainService; import project.bonus.RechargeBonusService; import project.log.MoneyLog; import project.log.MoneyLogService; import project.party.PartyService; import project.party.model.Party; import project.party.model.UserRecom; import project.party.recom.UserRecomService; import project.syspara.SysparaService; import project.user.UserData; import project.user.UserDataService; import project.wallet.Wallet; import project.wallet.WalletLog; import project.wallet.WalletLogService; import project.wallet.WalletService; public class RechargeBonusServiceImpl implements RechargeBonusService { protected JdbcTemplate jdbcTemplate; protected UserRecomService userRecomService; protected SysparaService sysparaService; protected WalletService walletService; protected MoneyLogService moneyLogService; protected RechargeBlockchainService rechargeBlockchainService; protected WalletLogService walletLogService; protected UserDataService userDataService; protected PartyService partyService; /** * 每个推广人每天一次收益,每次充值金额最低在()以上有推广费用,充值分成比在系统参数里 * */ @Override public void saveBounsHandle(RechargeBlockchain entity, double transfer_usdt) { List recom_parents = userRecomService.getParents(entity.getPartyId()); if (recom_parents == null) { return; } if (recom_parents.size() == 0) { return; } /** * 上级为空则直接结束 */ if ("".equals(recom_parents.get(0).getReco_id()) || recom_parents.get(0).getReco_id() == null) { return; } /** * 邀请奖励是否第三代后无限返佣一代 XX% 二代XX% 三代以后 XX% * true , false */ boolean recharge_bonus_forever = sysparaService.find("recharge_bonus_forever").getBoolean(); /** * 获取数据库奖金分成比例 */ String recharge_bonus_parameters = sysparaService.find("recharge_bonus_parameters").getValue(); String[] recharge_bonus_array = recharge_bonus_parameters.split(","); double base_amount = Double.valueOf(recharge_bonus_array[0]); double order_usdt_amount = Arith.mul(transfer_usdt, entity.getVolume()); /** * 充值奖励类型(默认1) * 1.下级用户每日首次充值超过分成金额则上级奖励; * 2.上级累计充值超过分成金额则有奖励 */ String recharge_bonus_type = sysparaService.find("recharge_bonus_type").getValue(); if(StringUtils.isEmptyString(recharge_bonus_type)||"1".equals(recharge_bonus_type)) { /** * 如果到账usdt金额小于可分成金额,直接退出 */ if (order_usdt_amount < base_amount) { return; } /** * 如果今日该用户还有充值过超过分成金额的记录,则不再奖励 */ List orders = rechargeBlockchainService.findByPartyIdAndToday(entity.getPartyId()); if (orders == null) { return; } if (orders.size() > 1) { for (int i = 0; i < orders.size(); i++) { RechargeBlockchain order = orders.get(i); double order_amount = Arith.mul(order.getVolume(), transfer_usdt); if (entity.getOrder_no().equals(order.getOrder_no())) { continue; } if (order_amount >= base_amount && order.getSucceeded() == 1) { return; } } } } boolean recharge_new_bonus_button = sysparaService.find("recharge_new_bonus_button").getBoolean(); // --start-- 12.2 新盘需求 // 1000,10,0.05,0.03,0.003,0.003 double first_bonus_max_num = 0d; if (recharge_new_bonus_button) { first_bonus_max_num = Double.valueOf(recharge_bonus_array[1]); } // --end-- 12.2 新盘需求 /** * 判断有几个父级代理,最多不超过4个有奖励 */ for (int i = 0; i < recom_parents.size(); i++) { if (recharge_new_bonus_button) { // --start-- 12.2 新盘需求 if (i >= 3) { return; } // --end-- 12.2 新盘需求 } else { if (i >= 4 && !recharge_bonus_forever) { return; } } /** * 邀请人是正式用户和演示用户才加奖金 */ Party party = new Party(); party = this.partyService.cachePartyBy(recom_parents.get(i).getReco_id(), true); if (!"MEMBER".equals(party.getRolename()) && !"GUEST".equals(party.getRolename())) { continue; } /** * 2.上级累计充值超过分成金额则有奖励 */ if("2".equals(recharge_bonus_type)&&!checkRechargeBonus(party.getId().toString(),order_usdt_amount,base_amount)) { continue; } // double pip_amount = Double.valueOf(recharge_bonus_array[i + 1]); double pip_amount = 0d; if (recharge_new_bonus_button) { // --start-- 12.2 新盘需求 /** * 直推奖励 3%~5%,满足10人时为5% */ if (i == 0 && this.userRecomService.findRecoms(recom_parents.get(i).getReco_id()) .size() >= first_bonus_max_num) { pip_amount = Double.valueOf(recharge_bonus_array[i + 2]); } else { pip_amount = Double.valueOf(recharge_bonus_array[i + 3]); // --end-- 12.2 新盘需求 } } else { if(i>=4) { pip_amount = Double.valueOf(recharge_bonus_array[4]); }else { pip_amount = Double.valueOf(recharge_bonus_array[i + 1]); } } double get_money = Arith.mul(order_usdt_amount, pip_amount); Wallet wallet = walletService.saveWalletByPartyId(recom_parents.get(i).getReco_id()); double amount_before = wallet.getMoney(); // wallet.setMoney(Arith.add(wallet.getMoney(), get_money)); walletService.update(wallet.getPartyId().toString(), get_money); /** * 保存资金日志 */ MoneyLog moneyLog = new MoneyLog(); moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_COIN); moneyLog.setAmount_before(amount_before); moneyLog.setAmount(get_money); moneyLog.setAmount_after(Arith.add(wallet.getMoney(), get_money)); moneyLog.setLog("第" + (i + 1) + "代用户充值到账了币种" + entity.getSymbol() + ",数量" + entity.getVolume() + ",订单号[" + entity.getOrder_no() + "]所奖励"); moneyLog.setPartyId(recom_parents.get(i).getReco_id()); moneyLog.setWallettype("USDT"); moneyLog.setContent_type(Constants.MONEYLOG_CONTENT_RECHARGE); moneyLogService.save(moneyLog); WalletLog walletLog = new WalletLog(); walletLog.setCategory(Constants.MONEYLOG_CATEGORY_RECHARGE); walletLog.setPartyId(recom_parents.get(i).getReco_id()); walletLog.setOrder_no(entity.getOrder_no()); walletLog.setWallettype(Constants.WALLET); walletLog.setStatus(1); walletLog.setAmount(get_money); walletLogService.save(walletLog); } } /** * 累计充值是否超过分成金额 * @param partyId * @param usdtAmount * @param baseAmount * @return */ private boolean checkRechargeBonus(String partyId,double usdtAmount,double baseAmount) { if(usdtAmount>=baseAmount) { return true; } Map map = userDataService.cacheByPartyId(partyId); double rechargeMoney = rechargeMoney(map, null, null); return rechargeMoney>=baseAmount; } /** * 时间范围内的充值总额 * * @param datas * @param startTime * @param endTime * @return */ private double rechargeMoney(Map datas, String startTime, String endTime) { if (datas == null || datas.isEmpty()) return 0; double userRecharge = 0; for (Entry valueEntry : datas.entrySet()) { UserData userdata = valueEntry.getValue(); Date time = userdata.getCreateTime(); if (!StringUtils.isNullOrEmpty(startTime)) { Date startDate = DateUtils.toDate(startTime, DateUtils.DF_yyyyMMdd); int intervalDays = DateUtils.getIntervalDaysByTwoDate(startDate, time);// 开始-数据时间 if (intervalDays > 0) // 开始>数据时间 ,则过滤 continue; } if (!StringUtils.isNullOrEmpty(endTime)) { Date endDate = DateUtils.toDate(endTime, DateUtils.DF_yyyyMMdd); int intervalDays = DateUtils.getIntervalDaysByTwoDate(endDate, time);// 结束-数据时间 if (intervalDays < 0) // 结束<数据时间 continue; } userRecharge = Arith.add(userdata.getRecharge_usdt(), userRecharge); } return userRecharge; } /** * 每日定时返佣 */ public void saveDailyBounsHandle() { //是否开启每日定时任务返佣,为空则不开启 0.5% 0.3% 0.2% = 0.005,0.003,0.002 String daily_recharge_recom = this.sysparaService.find("daily_recharge_recom").getValue(); List userDatas = findBydate(new Date()); for(int j=0;j < userDatas.size() ;j++) { UserData userData = userDatas.get(j); String partyId = (String) userData.getPartyId(); double amount = userData.getRecharge(); // 获取时间 查询 昨天 的 userdata 所有订单,里面 充值不为0的则 开始 返佣 Party party_user = this.partyService.cachePartyBy(partyId, true); List recom_parents = userRecomService.getParents(partyId); if (recom_parents == null) { continue; } if (recom_parents.size() == 0) { continue; } // 上级为空则直接结束 if ("".equals(recom_parents.get(0).getReco_id()) || recom_parents.get(0).getReco_id() == null) { continue; } String[] recharge_bonus_array = daily_recharge_recom.split(","); /** * 判断有几个父级代理,最多不超过3个有奖励 */ for (int i = 0; i < recom_parents.size(); i++) { if (i < 3) { /** * 邀请人是正式用户和演示用户才加奖金 */ Party party = new Party(); party = this.partyService.cachePartyBy(recom_parents.get(i).getReco_id(), true); if (!"MEMBER".equals(party.getRolename()) && !"GUEST".equals(party.getRolename())) { continue; } double pip_amount = Double.valueOf(recharge_bonus_array[i]); double get_money = Arith.mul(amount, pip_amount); String parentPartyId = String.valueOf(recom_parents.get(i).getReco_id()); Wallet wallet = walletService.saveWalletByPartyId(parentPartyId); double amount_before = wallet.getMoney(); walletService.update(parentPartyId, get_money); // 保存资金日志 MoneyLog moneyLog = new MoneyLog(); moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_COIN); moneyLog.setAmount_before(amount_before); moneyLog.setAmount(get_money); moneyLog.setAmount_after(Arith.add(wallet.getMoney(), get_money)); moneyLog.setLog("第" + (i + 1) + "代用户"+party_user.getUsername()+"日充值数量总价值" + amount + "USDT,所奖励"); moneyLog.setPartyId(parentPartyId); moneyLog.setWallettype("USDT"); moneyLog.setContent_type(Constants.MONEYLOG_CONTENT_RECHARGE); moneyLogService.save(moneyLog); WalletLog walletLog = new WalletLog(); walletLog.setCategory(Constants.MONEYLOG_CATEGORY_RECHARGE); walletLog.setPartyId(parentPartyId); walletLog.setOrder_no(""); walletLog.setWallettype(Constants.WALLET); walletLog.setStatus(1); walletLog.setAmount(get_money); walletLogService.save(walletLog); // 记录userdata表充值返佣 userDataService.saveUserDataForRechargeRecom(parentPartyId, get_money); } } } } /** * 查找某一天的前一天的 有 充值记录 的 */ private List findBydate( Date date) { Date createTime_begin = null; Date createTime_end = null; if (date != null) { createTime_end = DateUtils.toDate(DateUtils.format(date, "yyyy-MM-dd")); createTime_begin= DateUtils.addDate(createTime_end, -1); } List list = jdbcTemplate.query("SELECT * FROM T_USERDATA WHERE CREATE_TIME >= ? and CREATE_TIME < ? and RECHARGE > 0 ", RecordObjectMapper.newInstance(UserData.class), createTime_begin, createTime_end); if (list.size() > 0) { return list; } return null; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public void setUserRecomService(UserRecomService userRecomService) { this.userRecomService = userRecomService; } public void setSysparaService(SysparaService sysparaService) { this.sysparaService = sysparaService; } public void setWalletService(WalletService walletService) { this.walletService = walletService; } public void setMoneyLogService(MoneyLogService moneyLogService) { this.moneyLogService = moneyLogService; } public void setRechargeBlockchainService(RechargeBlockchainService rechargeBlockchainService) { this.rechargeBlockchainService = rechargeBlockchainService; } public void setWalletLogService(WalletLogService walletLogService) { this.walletLogService = walletLogService; } public void setUserDataService(UserDataService userDataService) { this.userDataService = userDataService; } public void setPartyService(PartyService partyService) { this.partyService = partyService; } }