package project.monitor.pledgegalaxy.internal; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Timestamp; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import kernel.util.Arith; import kernel.util.UUIDGenerator; import kernel.web.ApplicationUtil; import kernel.web.Page; import project.Constants; import project.log.MoneyLog; import project.log.MoneyLogService; import project.monitor.DAppAccountService; import project.monitor.pledgegalaxy.PledgeGalaxyConfigService; import project.monitor.pledgegalaxy.PledgeGalaxyOrder; import project.monitor.pledgegalaxy.PledgeGalaxyOrderService; import project.monitor.pledgegalaxy.PledgeGalaxyProfit; import project.monitor.pledgegalaxy.PledgeGalaxyProfitService; import project.monitor.pledgegalaxy.PledgeGalaxyRedisKeys; import project.monitor.pledgegalaxy.PledgeGalaxyStatusConstants; import project.monitor.pledgegalaxy.job.GalaxyOrderMessage; import project.party.PartyService; import project.party.model.Party; import project.party.model.UserRecom; import project.party.recom.UserRecomService; import project.redis.RedisHandler; import project.tip.TipConstants; import project.tip.TipService; import project.wallet.Wallet; import project.wallet.WalletExtend; import project.wallet.WalletService; /** * 质押2.0 serviceImpl * */ public class PledgeGalaxyOrderServiceImpl implements PledgeGalaxyOrderService{ protected TipService tipService; protected RedisHandler redisHandler; protected PartyService partyService; protected WalletService walletService; protected MoneyLogService moneyLogService; protected UserRecomService userRecomService; private DAppAccountService dAppAccountService; private PledgeGalaxyConfigService pledgeGalaxyConfigService; protected PledgeGalaxyProfitService pledgeGalaxyProfitService; private static final Logger logger = LoggerFactory.getLogger(PledgeGalaxyOrderServiceImpl.class); /** * 计算推荐人收益 */ protected Map cacheRecomProfit = new ConcurrentHashMap(); /** * 加入质押2.0 */ @Override public void save(PledgeGalaxyOrder order) { String partyId = order.getPartyId(); // 查看余额 Wallet wallet = walletService.saveWalletByPartyId(partyId); double amount_before = wallet.getMoney(); // 钱包金额不够扣 if (order.getAmount() > wallet.getMoney()) { // 质押提交申请 order.setStatus(PledgeGalaxyStatusConstants.PLEDGE_APPLY); // 保存数据库 ApplicationUtil.executeInsert(order); // 钱包金额为0 if (wallet.getMoney() > 0) { // 把钱包扣完 walletService.update(partyId, Arith.sub(0, wallet.getMoney())); order.setWalletDeductAmount(wallet.getMoney()); MoneyLog moneylog = new MoneyLog(); moneylog.setCategory(Constants.MONEYLOG_CATEGORY_GALAXY); moneylog.setAmount_before(amount_before); // 负数 扣钱 moneylog.setAmount(Arith.sub(0, wallet.getMoney())); moneylog.setAmount_after(Arith.sub(amount_before, wallet.getMoney())); moneylog.setLog("质押2.0下单,订单号[" + order.getId() + "]"); moneylog.setPartyId(partyId); moneylog.setWallettype(Constants.WALLET); moneylog.setContent_type(Constants.MONEYLOG_CONTENT_GALAXY_BUY); moneyLogService.save(moneylog); } // redis插入质押订单 redisHandler.setSync(PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER + order.getId(), order); String key = PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER_PARTYID; Map maps = (Map) redisHandler.get(key + partyId); if (null == maps) { maps = new ConcurrentHashMap(); } maps.put(String.valueOf(order.getId()), order); redisHandler.setSync(key + partyId, maps); double transferAmount = Arith.sub(order.getAmount(), wallet.getMoney()); dAppAccountService.transferFromForPledgeGalaxy(partyId, transferAmount, String.valueOf(order.getId())); } else { order.setStatus(PledgeGalaxyStatusConstants.PLEDGE_SUCCESS); // 保存数据库 ApplicationUtil.executeInsert(order); // redis插入质押订单 redisHandler.setSync(PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER + order.getId(), order); String key = PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER_PARTYID; Map maps = (Map) redisHandler.get(key + partyId); if (null == maps) { maps = new ConcurrentHashMap(); } maps.put(String.valueOf(order.getId()), order); redisHandler.setSync(key + partyId, maps); MoneyLog moneylog = new MoneyLog(); walletService.update(partyId, Arith.sub(0, order.getAmount())); moneylog.setAmount_before(amount_before); moneylog.setAmount(Arith.sub(0, wallet.getMoney())); moneylog.setAmount_after(Arith.sub(amount_before, order.getAmount())); moneylog.setLog("质押2.0下单,订单号[" + order.getId() + "]"); moneylog.setCategory(Constants.MONEYLOG_CATEGORY_GALAXY); moneylog.setPartyId(partyId); moneylog.setWallettype(Constants.WALLET); moneylog.setContent_type(Constants.MONEYLOG_CONTENT_GALAXY_BUY); moneyLogService.save(moneylog); } } @Override public void saveSafePal5(PledgeGalaxyOrder order, String accountType) { String partyId = order.getPartyId(); // 查看余额 Wallet wallet = walletService.saveWalletByPartyId(partyId); double amount_before = wallet.getMoney(); order.setStatus(PledgeGalaxyStatusConstants.PLEDGE_SUCCESS); // 保存数据库 ApplicationUtil.executeInsert(order); // redis插入质押订单 redisHandler.setSync(PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER + order.getId(), order); String key = PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER_PARTYID; Map maps = (Map) redisHandler.get(key + partyId); if (null == maps) { maps = new ConcurrentHashMap(); } maps.put(String.valueOf(order.getId()), order); redisHandler.setSync(key + partyId, maps); MoneyLog moneylog = new MoneyLog(); if (null != accountType && "experienceGold".equals(accountType)) { WalletExtend walletExtend = walletService.saveExtendByPara(partyId, Constants.WALLETEXTEND_EXPERIENCE_GOLD); double amountBefore = walletExtend.getAmount(); walletService.updateExtend(partyId, Constants.WALLETEXTEND_EXPERIENCE_GOLD, Arith.sub(0, order.getAmount())); moneylog.setAmount_before(amountBefore); moneylog.setAmount(Arith.sub(0, walletExtend.getAmount())); moneylog.setAmount_after(Arith.sub(amountBefore, order.getAmount())); moneylog.setLog("质押2.0体验金下单,订单号[" + order.getId() + "]"); } else { walletService.update(partyId, Arith.sub(0, order.getAmount())); moneylog.setAmount_before(amount_before); moneylog.setAmount(Arith.sub(0, wallet.getMoney())); moneylog.setAmount_after(Arith.sub(amount_before, order.getAmount())); moneylog.setLog("质押2.0下单,订单号[" + order.getId() + "]"); } moneylog.setCategory(Constants.MONEYLOG_CATEGORY_GALAXY); moneylog.setPartyId(partyId); moneylog.setWallettype(Constants.WALLET); moneylog.setContent_type(Constants.MONEYLOG_CONTENT_GALAXY_BUY); moneyLogService.save(moneylog); } /** * 后台新增 质押2.0 */ @Override public void saveBack(PledgeGalaxyOrder order, String roleName) { String partyId = order.getPartyId(); order.setStatus(PledgeGalaxyStatusConstants.PLEDGE_SUCCESS); // 保存数据库 ApplicationUtil.executeInsert(order); // redis插入质押订单 this.redisHandler.setSync(PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER + order.getId(), order); String key = PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER_PARTYID; Map maps = (Map) this.redisHandler.get(key + partyId); if (null == maps) maps = new ConcurrentHashMap(); maps.put(String.valueOf(order.getId()), order); this.redisHandler.setSync(key + partyId, maps); } /** * 质押2.0列表 */ @Override public Page pagedQuery(int pageNo, int pageSize, String partyId) { if (pageNo <= 0) pageNo = 1; Page page = new Page(pageNo, pageSize, Integer.MAX_VALUE); StringBuilder pledgeSql=new StringBuilder("SELECT UUID id,PARTY_ID partyId,AMOUNT amount,DAYS days,STATUS status,ERROR error,"); pledgeSql.append("DATE_FORMAT(START_TIME,'%Y-%m-%d %H:%i:%S') startTime,"); pledgeSql.append("DATE_FORMAT(EXPIRE_TIME,'%Y-%m-%d %H:%i:%S') expireTime,"); pledgeSql.append("DATE_FORMAT(CLOSE_TIME,'%Y-%m-%d %H:%i:%S') closeTime,"); pledgeSql.append("DATE_FORMAT(CREATE_TIME,'%Y-%m-%d %H:%i:%S') createTime "); pledgeSql.append("FROM T_AUTO_MONITOR_PLEDGE_GALAXY_ORDER WHERE PARTY_ID=? ORDER BY CREATE_TIME DESC LIMIT ?,?"); List list=ApplicationUtil.executeDQL(pledgeSql.toString(),new Object[] {partyId,page.getFirstElementNumber(),pageSize},Map.class); page.setElements(list); return page; } /** * 质押2.0详情 */ @Override public PledgeGalaxyOrder findById(String id) { return (PledgeGalaxyOrder) redisHandler.get(PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER + id); } /** * 根据partyId获取订单 */ public Map findOrdersByPartyId(String partyId) { return (Map)redisHandler.get(PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER_PARTYID + partyId); } /** * 质押2.0概况 */ public Map getData(String partyId, String projectType) { String key = PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER_PARTYID; Map maps = (Map) redisHandler.get(key + partyId); Map map = new HashMap<>(); if (projectType.equals("DAPP_EXCHANGE")) { map = getDataVickers(maps, map, partyId); } if (projectType.equals("DAPP_EXCHANGE_IOEAI") || projectType.equals("DAPP_EXCHANGE_DAPPDEFIUSDT")) { map = getDataIoeAi(maps, map, partyId); } if (projectType.equals("DAPP_EXCHANGE_SAFEPAL5")) { map = getDataSafePal5(maps, map, partyId); } Wallet wallet = walletService.saveWalletByPartyId(partyId); WalletExtend walletExtend = walletService.saveExtendByPara(partyId, Constants.WALLETEXTEND_DAPP_USDT_USER); DecimalFormat df6 = new DecimalFormat("#.####"); map.put("balance", Double.valueOf(df6.format(wallet.getMoney()))); map.put("balanceExtend", Double.valueOf(df6.format(walletExtend.getAmount()))); return map; } /** * Vickers质押概况数据 */ private Map getDataVickers(Map maps, Map map, String partyId){ double total = 0; double profit = 0; if (null != maps && maps.values().size() > 0) { for (PledgeGalaxyOrder order : maps.values()) { if (order.getStatus() == PledgeGalaxyStatusConstants.PLEDGE_SUCCESS) { total += order.getAmount(); profit += order.getProfit(); } } } double todayProfit = 0; List todayProfits = pledgeGalaxyProfitService .queryTodayProfitList(partyId, PledgeGalaxyStatusConstants.PROFIT_PASSED); if (null != todayProfits && todayProfits.size() > 0) { for (PledgeGalaxyProfit value : todayProfits) { todayProfit += value.getAmount(); } } DecimalFormat df6 = new DecimalFormat("#.####"); // 当前总质押 map.put("total", Double.valueOf(df6.format(total))); // 当日收益 map.put("todayProfit", Double.valueOf(df6.format(todayProfit))); // 总收益 map.put("profit", Double.valueOf(df6.format(profit))); return map; } /** * IoeAi质押概况数据 */ private Map getDataIoeAi(Map maps, Map map, String partyId){ double total = 0; double profit = 0; if (null != maps && maps.values().size() > 0) { for (PledgeGalaxyOrder order : maps.values()) { if (order.getStatus() == PledgeGalaxyStatusConstants.PLEDGE_SUCCESS) { total += order.getAmount(); } if (order.getStatus() != PledgeGalaxyStatusConstants.PLEDGE_APPLY || order.getStatus() != PledgeGalaxyStatusConstants.PLEDGE_FAIL) { profit += order.getProfit(); } } } double todayProfit = 0; List todayProfits = pledgeGalaxyProfitService .queryTodayProfitList(partyId, PledgeGalaxyStatusConstants.PROFIT_PASSED); if (null != todayProfits && todayProfits.size() > 0) { for (PledgeGalaxyProfit value : todayProfits) { todayProfit += value.getAmount(); } } DecimalFormat df6 = new DecimalFormat("#.####"); // 当前总质押 map.put("total", Double.valueOf(df6.format(total))); // 总收益 map.put("profit", Double.valueOf(df6.format(profit))); // 当日收益 map.put("todayProfit", Double.valueOf(df6.format(todayProfit))); return map; } /** * safePal5质押概况数据 */ private Map getDataSafePal5(Map maps, Map map, String partyId){ double total = 0; double profit = 0; if (null != maps && maps.values().size() > 0) { for (PledgeGalaxyOrder order : maps.values()) { if (order.getStatus() == PledgeGalaxyStatusConstants.PLEDGE_SUCCESS) { total += order.getAmount(); } if (order.getStatus() != PledgeGalaxyStatusConstants.PLEDGE_APPLY || order.getStatus() != PledgeGalaxyStatusConstants.PLEDGE_FAIL) { profit += order.getProfit(); } } } double todayProfit = 0; List todayProfits = pledgeGalaxyProfitService .queryTodayProfitList(partyId, PledgeGalaxyStatusConstants.PROFIT_PASSED); if (null != todayProfits && todayProfits.size() > 0) { for (PledgeGalaxyProfit value : todayProfits) { todayProfit += value.getAmount(); } } WalletExtend experienceGoldWallet = walletService.saveExtendByPara(partyId, Constants.WALLETEXTEND_EXPERIENCE_GOLD); DecimalFormat df6 = new DecimalFormat("#.####"); // 当前总质押 map.put("total", Double.valueOf(df6.format(total))); // 总收益 map.put("profit", Double.valueOf(df6.format(profit))); // 当日收益 map.put("todayProfit", Double.valueOf(df6.format(todayProfit))); // 体验金账户 map.put("experienceGold", Double.valueOf(df6.format(experienceGoldWallet.getAmount()))); return map; } /** * 分页获取质押成功状态的订单 */ @Override public Page pagedQueryComputeOrder(int pageNo, int pageSize, Date date) { if (pageNo <= 0) pageNo = 1; Page page = new Page(pageNo, pageSize, Integer.MAX_VALUE); List list=ApplicationUtil.executeSelect(PledgeGalaxyOrder.class,"WHERE STATUS=1 AND CREATE_TIME<=? LIMIT ?,?",new Object[] {date,page.getFirstElementNumber(),pageSize}); page.setElements(list); return page; } /** * 质押订单赎回 */ public void saveClose(PledgeGalaxyOrder entity, boolean isPassed) { // 不通过 if (!isPassed) { entity.setStatus(PledgeGalaxyStatusConstants.PLEDGE_SUCCESS); entity.setCloseTime(new Date()); this.update(entity); this.tipService.deleteTip(entity.getId().toString()); return; } // 体验金质押 if (PledgeGalaxyStatusConstants.EXPERIENCE_GOLD_PLEDGE != entity.getType()) { Wallet wallet = walletService.saveWalletByPartyId(entity.getPartyId()); double amount_before = wallet.getMoney(); double back_money = entity.getAmount(); // 更新钱包金额 walletService.update(String.valueOf(wallet.getPartyId()), back_money); // 保存资金日志 MoneyLog moneylog = new MoneyLog(); moneylog.setCategory(Constants.MONEYLOG_CATEGORY_GALAXY); moneylog.setAmount_before(amount_before); moneylog.setAmount(back_money); moneylog.setAmount_after(Arith.add(amount_before, back_money)); moneylog.setPartyId(entity.getPartyId()); moneylog.setWallettype(Constants.WALLET); moneylog.setLog("质押2.0赎回,本金退回,订单号[" + entity.getId() + "]"); moneylog.setContent_type(Constants.MONEYLOG_CONTENT_GALAXY_BACK); moneyLogService.save(moneylog); } entity.setStatus(PledgeGalaxyStatusConstants.RETURN_SUCCESS); entity.setCloseTime(new Date()); this.update(entity); this.tipService.deleteTip(entity.getId().toString()); } /** * 质押订单赎回申请 */ public void updateCloseApply(PledgeGalaxyOrder entity) { // 更新质押订单状态 entity.setCloseApplyTime(new Date()); entity.setStatus(PledgeGalaxyStatusConstants.RETURN_APPLY); this.update(entity); this.tipService.saveTip(entity.getId().toString(), TipConstants.PLEDGE_GALAXY_ORDER); } /** * 最终收益持久化数据库 */ @Override public void saveRecomProfit() { if (cacheRecomProfit.isEmpty()) return; // 开始增加推荐人收益 logger.info("start ------recom user Galaxy profit,date:{},count:{}",new Object[] { new Date(), cacheRecomProfit.size() }); for (Entry entry : cacheRecomProfit.entrySet()) { Wallet wallet = walletService.saveWalletByPartyId(entry.getKey()); double amount_before = wallet.getMoney(); walletService.update(String.valueOf(wallet.getPartyId()), entry.getValue()); // 保存资金日志 MoneyLog moneyLog = new MoneyLog(); moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_GALAXY); moneyLog.setAmount_before(amount_before); moneyLog.setAmount(entry.getValue()); moneyLog.setAmount_after(Arith.add(wallet.getMoney(), entry.getValue())); moneyLog.setLog("质押2.0推荐奖励金"); moneyLog.setPartyId(entry.getKey()); moneyLog.setWallettype(Constants.WALLET); moneyLog.setContent_type(Constants.MONEYLOG_CONTENT_GALAXY_RECOM_PROFIT); moneyLogService.save(moneyLog); // userDataService.saveUserDataForGalaxy(entry.getKey(), entry.getValue(), true); } // 推荐人质押2.0收益计算完成,纪录日志 logger.info("finish ------recom user Galaxy profit,date:{},count:{}", new Object[] { new Date(), cacheRecomProfit.size() }); } protected void updateProfitToWallet(double day_self_profit, PledgeGalaxyOrder order) { Wallet wallet = this.walletService.saveWalletByPartyId(order.getPartyId()); double amount_before = wallet.getMoney(); this.walletService.update(String.valueOf(wallet.getPartyId()), day_self_profit); // 保存资金日志 MoneyLog moneylog = new MoneyLog(); moneylog.setCategory(Constants.MONEYLOG_CATEGORY_GALAXY); moneylog.setAmount_before(amount_before); moneylog.setAmount(day_self_profit); moneylog.setAmount_after(Arith.add(amount_before, day_self_profit)); moneylog.setLog("质押2.0收益,订单号[" + order.getId() + "]"); moneylog.setPartyId(order.getPartyId()); moneylog.setWallettype(Constants.WALLET); moneylog.setContent_type(Constants.MONEYLOG_CONTENT_GALAXY_RECOM_PROFIT); moneylog.setCreateTime(new Date()); moneyLogService.save(moneylog); } /** * 质押订单归集失败 回退 */ public void saveReturn(PledgeGalaxyOrder entity) { if (entity.getWalletDeductAmount() > 0 && entity.getAmount() > entity.getWalletDeductAmount()) { Wallet wallet = walletService.saveWalletByPartyId(entity.getPartyId()); double amount_before = wallet.getMoney(); double back_money = entity.getWalletDeductAmount(); // 更新钱包金额 walletService.update(String.valueOf(wallet.getPartyId()), back_money); // 保存资金日志 MoneyLog moneylog = new MoneyLog(); moneylog.setCategory(Constants.MONEYLOG_CATEGORY_GALAXY); moneylog.setAmount_before(amount_before); moneylog.setAmount(back_money); moneylog.setAmount_after(Arith.add(amount_before, back_money)); moneylog.setPartyId(entity.getPartyId()); moneylog.setWallettype(Constants.WALLET); moneylog.setLog("质押2.0归集失败,本金退回,订单号[" + entity.getId() + "]"); moneylog.setContent_type(Constants.MONEYLOG_CONTENT_GALAXY_BACK); moneyLogService.save(moneylog); } // 更新质押订单状态 entity.setStatus(PledgeGalaxyStatusConstants.PLEDGE_FAIL); entity.setCloseTime(new Date()); this.update(entity); // 变更报表下单金额 // userDataService.saveUserDataForGalaxy(entity.getPartyId(), Arith.sub(0, entity.getAmount()), false); } /** * 团队收益 */ public void handleRecomProfit(String partyId, double profit, String teamRate) { List list_parents = userRecomService.getParents(partyId); if (list_parents.size() == 0) { return; } int loop = 0; int loopMax = 3; for (int i = 0; i < list_parents.size(); i++) { if (loop >= loopMax) { break; } Party party_parent = partyService.cachePartyBy(list_parents.get(i).getReco_id(), true); String parentId = String.valueOf(party_parent.getId()); String[] team_rate_array = teamRate.split("\\|"); // if (!Constants.SECURITY_ROLE_MEMBER.equals(party_parent.getRolename())) { // continue; // } loop++; double pip_amount = Double.valueOf(team_rate_array[loop - 1]); double get_money = Arith.mul(profit, pip_amount); Double recom_profit = cacheRecomProfit.get(parentId); cacheRecomProfit.put(parentId, Arith.add(recom_profit == null ? 0D : recom_profit, get_money)); } } /** * IoeAi团队收益 */ private void handleIoeAiTeamProfit(String partyId, double profit, String teamRate) { List list_parents = userRecomService.getParents(partyId); System.out.println("计算IoeAi团队收益 " + partyId + " 所有上级人数 " + list_parents.size()); if (list_parents.size() == 0) { return; } for (int i = 0; i < list_parents.size(); i++) { String parentId = String.valueOf(list_parents.get(i).getReco_id()); // 获取团队收益率 String ioeAiTeamRate = getIoeAiTeamRate(parentId, teamRate); System.out.println("获取上级 " + parentId + " 团队收益率 " + ioeAiTeamRate); if (!"0".equals(ioeAiTeamRate)) { double get_money = Arith.mul(profit, Double.valueOf(ioeAiTeamRate)); System.out.println("根据静态收益" + profit + "计算出团队收益 " + get_money); Double recom_profit = cacheRecomProfit.get(parentId); cacheRecomProfit.put(parentId, Arith.add(recom_profit == null ? 0D : recom_profit, get_money)); } } } /** * version2 IoeAi团队收益 */ private void newHandleIoeAiTeamProfit(String partyId, double profit, String teamRate) { List list_parents = userRecomService.getParents(partyId); System.out.println("计算IoeAi团队收益 " + partyId + " 所有上级人数 " + list_parents.size()); if (list_parents.size() == 0) { return; } for (int i = 0; i < list_parents.size(); i++) { String parentId = String.valueOf(list_parents.get(i).getReco_id()); // 获取团队收益率 String ioeAiTeamRate = getNewIoeAiTeamRate(parentId, teamRate); System.out.println("获取上级 " + parentId + " 团队收益率 " + ioeAiTeamRate); if (!"0".equals(ioeAiTeamRate)) { double get_money = Arith.mul(profit, Double.valueOf(ioeAiTeamRate)); System.out.println("根据静态收益" + profit + "计算出团队收益 " + get_money); Double recom_profit = cacheRecomProfit.get(parentId); cacheRecomProfit.put(parentId, Arith.add(recom_profit == null ? 0D : recom_profit, get_money)); } } } /** * version3 IoeAi团队收益 */ private void handleIoeAiTeamProfitVersion3(String partyId, double profit, String teamRate) { Party party = partyService.cachePartyBy(partyId, false); if (!party.getKyc_authority()) { return; } List list_parents = userRecomService.getParents(partyId); if (list_parents.size() == 0) { return; } for (int i = 0; i < list_parents.size(); i++) { String parentId = String.valueOf(list_parents.get(i).getReco_id()); Party parent = partyService.cachePartyBy(parentId, false); // 已经完成KYC 获取团队收益率 String ioeAiTeamRate = "0"; if (parent.getKyc_authority()) { ioeAiTeamRate = teamRate; } System.out.println("获取上级 " + parentId + " 团队收益率 " + ioeAiTeamRate); if (!"0".equals(ioeAiTeamRate)) { double get_money = Arith.mul(profit, Double.valueOf(ioeAiTeamRate)); System.out.println("根据静态收益" + profit + "计算出团队收益 " + get_money); Double recom_profit = cacheRecomProfit.get(parentId); cacheRecomProfit.put(parentId, Arith.add(recom_profit == null ? 0D : recom_profit, get_money)); } } } /** * 获取IoeAi团队收益 */ private String getIoeAiTeamRate(String partyId, String teamRate) { double pledgeAmountSum = 0D; Map selfmap = (Map)findOrdersByPartyId(partyId); if (null != selfmap && selfmap.size() > 0) { for (PledgeGalaxyOrder galaxyOrder : selfmap.values()) { if (galaxyOrder.getStatus() == PledgeGalaxyStatusConstants.PLEDGE_SUCCESS) { pledgeAmountSum += galaxyOrder.getAmount(); } } } // 伞下代理人数 是 所有下级的 List partyLists = userRecomService.findChildren(partyId); System.out.println(partyId + " 伞下所有下级人数 " + partyLists.size()); int level_1_sum = 0; if (partyLists.size() >= 3) { for (String id : partyLists) { Party party = partyService.cachePartyBy(id, false); if (null != party) { Map map = (Map)findOrdersByPartyId(id); if (null != map && map.size() > 0) { for (PledgeGalaxyOrder galaxyOrder : map.values()) { if (galaxyOrder.getDays() >= 7 && galaxyOrder.getStatus() == PledgeGalaxyStatusConstants.PLEDGE_SUCCESS) { if (Constants.SECURITY_ROLE_GUEST.equals(party.getRolename()) || party.getKyc_authority()) { System.out.println(partyId + " 的有效下级: " + party.getUsername()); level_1_sum ++; break; } } } for (PledgeGalaxyOrder galaxyOrder : map.values()) { if (galaxyOrder.getDays() >= 7 && galaxyOrder.getStatus() == PledgeGalaxyStatusConstants.PLEDGE_SUCCESS) { pledgeAmountSum += galaxyOrder.getAmount(); } } } } } } System.out.println(partyId + "伞下所有下级的总质押额度 " + pledgeAmountSum); // 团队收益 String[] teamSplit = teamRate.split("#"); Integer levelMin = Integer.valueOf(teamSplit[0].split(";")[0]); String[] amountSplit = teamSplit[0].split(";")[1].split("-"); Integer amountMin = Integer.valueOf(amountSplit[0]); if (level_1_sum < levelMin || pledgeAmountSum < amountMin) { return "0"; } int teamLevelIndex = 0; for (int i = 0; i < teamSplit.length; i++) { Integer levelNum = Integer.valueOf(teamSplit[i].split(";")[0]); if (level_1_sum < levelNum) { break; } teamLevelIndex = i; } int teamAmountIndex = 0; for (int i = 0; i < teamSplit.length; i++) { String teamAmount = teamSplit[i].split(";")[1]; String[] teamAmountSplit = teamAmount.split("-"); Integer teamAmountMin = Integer.valueOf(teamAmountSplit[0]); if (pledgeAmountSum < teamAmountMin) { break; } teamAmountIndex = i; } if (teamLevelIndex <= teamAmountIndex) { return teamSplit[teamLevelIndex].split(";")[2]; } else { return teamSplit[teamAmountIndex].split(";")[2]; } } /** * 获取IoeAi团队收益 */ private String getNewIoeAiTeamRate(String partyId, String teamRate) { Map pledgeAmountMap = new HashMap<>(); // 伞下代理人数 是 所有下级的 List partyLists = userRecomService.findChildren(partyId); System.out.println(partyId + " 伞下所有下级人数 " + partyLists.size()); if (partyLists.size() >= 3) { for (String id : partyLists) { Party party = partyService.cachePartyBy(id, false); if (null != party) { Map map = (Map)findOrdersByPartyId(id); if (null != map && map.size() > 0) { for (PledgeGalaxyOrder galaxyOrder : map.values()) { if (galaxyOrder.getDays() >= 7 && galaxyOrder.getStatus() == PledgeGalaxyStatusConstants.PLEDGE_SUCCESS) { if (Constants.SECURITY_ROLE_GUEST.equals(party.getRolename()) || party.getKyc_authority()) { double amount = pledgeAmountMap.containsKey(party.getId()) ? pledgeAmountMap.get(party.getId()) : 0; pledgeAmountMap.put(String.valueOf(party.getId()), Arith.add(amount, galaxyOrder.getAmount())); } } } } } } } int lp1 = 0; int lp2 = 0; int lp3 = 0; int lp4 = 0; int lp5 = 0; String[] teamRateSplit = teamRate.split("#"); for (double amount : pledgeAmountMap.values()) { for (int i = 0; i < teamRateSplit.length; i++) { String value = teamRateSplit[i]; String[] valueSplit = value.split(";"); int amountMin = Integer.valueOf(valueSplit[0].split("-")[0]); int amountMax = Integer.valueOf(valueSplit[0].split("-")[1]); if (amount >= amountMin && amount <= amountMax) { if (0 == i) { lp1 += 1; } else if (1 == i) { lp2 += 1; } else if (2 == i) { lp3 += 1; } else if (3 == i) { lp4 += 1; } else if (4 == i) { lp5 += 1; } } } } int lp1Temp = lp1 - 3; if (lp1Temp < 0) { // 无 System.out.println("无级别 团队收益"); return "0"; } else { lp1Temp = (int)Math.floor(lp1Temp / 3); int lp2Temp = lp2 + lp1Temp - 3; if (lp2Temp < 0) { // 青铜级 System.out.println("青铜级 团队收益"); return teamRateSplit[0].split(";")[1]; } else { lp2Temp = (int)Math.floor(lp2Temp / 3); int lp3Temp = lp3 + lp2Temp - 3; if (lp3Temp < 0) { // 白银级 System.out.println("白银级 团队收益"); return teamRateSplit[1].split(";")[1]; } else { lp3Temp = (int)Math.floor(lp3Temp / 3); int lp4Temp = lp4 + lp3Temp - 3; if (lp4Temp < 0) { // 黄金级 System.out.println("黄金级 团队收益"); return teamRateSplit[2].split(";")[1]; } else { lp4Temp = (int)Math.floor(lp4Temp / 3); int lp5Temp = lp5 + lp4Temp - 3; if (lp5Temp < 0) { // 铂金级 System.out.println("铂金级 团队收益"); return teamRateSplit[3].split(";")[1]; } else { // 钻石级 System.out.println("钻石级 团队收益"); return teamRateSplit[4].split(";")[1]; } } } } } } @Override public void cacheRecomProfitClear() { cacheRecomProfit.clear(); } /** * 根据质押状态获取订单列表 */ public List findByStatus(int status) { return ApplicationUtil.executeSelect(PledgeGalaxyOrder.class,"WHERE STATUS=?",new Object[] {status}); } /** * 根据质押状态获取订单列表 */ public List queryOrdersByStatus(String partyId, int status) { return ApplicationUtil.executeSelect(PledgeGalaxyOrder.class,"WHERE PARTY_ID=? AND STATUS=?",new Object[] {partyId,status}); } /** * 根据质押状态及创建日期获取订单列表 */ public List findByStatusCrateTime(int status, Date time) { return ApplicationUtil.executeSelect(PledgeGalaxyOrder.class,"WHERE STATUS=? AND CREATE_TIME=?",new Object[] {status, time}); } /** * 更新质押订单 */ public void update(PledgeGalaxyOrder order) { ApplicationUtil.executeUpdate(order); // 更新redis质押订单 redisHandler.setSync(PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER + order.getId(), order); String key = PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER_PARTYID; Map maps = (Map) redisHandler.get(key + String.valueOf(order.getPartyId())); if (null == maps) { maps = new ConcurrentHashMap(); } maps.put(String.valueOf(order.getId()), order); redisHandler.setSync(key + String.valueOf(order.getPartyId()), maps); } /** * 批量更新订单收益 * * @param orderList */ protected void updateBatchGalaxyOrdersProfit(final List orderList) { String sql = "UPDATE T_AUTO_MONITOR_PLEDGE_GALAXY_ORDER SET PROFIT=?,SETTLE_TIME=? WHERE UUID=?"; int[] batchUpdate = ApplicationUtil.getBean(JdbcTemplate.class).batchUpdate(sql,new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int i) throws SQLException { ps.setDouble(1, orderList.get(i).getProfit()); ps.setTimestamp(2, new Timestamp(orderList.get(i).getSettleTime().getTime())); ps.setString(3, orderList.get(i).getOrderId()); } @Override public int getBatchSize() { return orderList.size(); } }); logger.info("end miner batch update attr:{}", batchUpdate); } /** * 生成质押收益记录 */ @Override public void saveGalaxyProfit(List orders, List closeList, String projectType) { logger.info("start compute order size:{}", orders.size()); List saveGalaxyProfits = new ArrayList<>(); for (PledgeGalaxyOrder order : orders) { Date date = new Date(); // 当前时间>截止时间 if (date.after(order.getExpireTime())) { // 到期赎回 closeList.add(order); continue; } Calendar calendar = new GregorianCalendar(); calendar.setTime(date); calendar.add(calendar.DATE, Integer.valueOf(2)); Date expireTime = calendar.getTime(); String relationOrderNo = String.valueOf(order.getId()); String partyId = order.getPartyId(); int days = order.getDays(); double amount = order.getAmount(); Date createTime = order.getCreateTime(); Map map = new HashMap<>(); if (projectType.equals("DAPP_EXCHANGE")) { map = pledgeGalaxyConfigService.getVickersRateMap(partyId, Integer.valueOf(days), amount); } if (projectType.equals("DAPP_EXCHANGE_SAFEPAL5")) { map = pledgeGalaxyConfigService.getSafePal5RateMap(partyId, Integer.valueOf(days), amount); } if (projectType.equals("DAPP_EXCHANGE_IOEAI") || projectType.equals("DAPP_EXCHANGE_DAPPDEFIUSDT")) { map = pledgeGalaxyConfigService.getIoeAIRateMap(partyId, Integer.valueOf(days), amount, createTime); } // 当日静态收益 double staticRate = 0; if (map.containsKey("staticRate")) { staticRate = Double.valueOf(map.get("staticRate")); } // 总收益/4 保留3位小数下发 double day_self_profit = Arith.div(Arith.mul(order.getAmount(), staticRate), 4, 3) ; PledgeGalaxyProfit selfProfit = new PledgeGalaxyProfit(); selfProfit.setPartyId(partyId); selfProfit.setType(PledgeGalaxyStatusConstants.STATIC_INCOME); selfProfit.setAmount(day_self_profit); selfProfit.setStatus(PledgeGalaxyStatusConstants.PROFIT_PENDING); selfProfit.setExpireTime(expireTime); selfProfit.setCreateTime(date); selfProfit.setRelationOrderNo(relationOrderNo); saveGalaxyProfits.add(selfProfit); // 助力收益 if (map.containsKey("dynamicRate")) { double dynamicRate = Double.valueOf(map.get("dynamicRate")); double day_dynamic_profit = Arith.div(Arith.mul(order.getAmount(), dynamicRate), 4, 3); PledgeGalaxyProfit dynamicProfit = new PledgeGalaxyProfit(); dynamicProfit.setPartyId(partyId); dynamicProfit.setType(PledgeGalaxyStatusConstants.DYNAMIC_INCOME); dynamicProfit.setAmount(day_dynamic_profit); dynamicProfit.setStatus(PledgeGalaxyStatusConstants.PROFIT_PENDING); dynamicProfit.setExpireTime(expireTime); dynamicProfit.setCreateTime(date); dynamicProfit.setRelationOrderNo(relationOrderNo); saveGalaxyProfits.add(dynamicProfit); } } logger.info("start PledgeGalaxyProfit batch insert size:{}", saveGalaxyProfits.size()); insertBatchGalaxyProfit(saveGalaxyProfits); } /** * 批量新增收益记录 * */ protected void insertBatchGalaxyProfit(final List orderList) { String sql = "INSERT INTO T_AUTO_MONITOR_PLEDGE_GALAXY_PROFIT(UUID,PARTY_ID,TYPE,AMOUNT,STATUS,EXPIRE_TIME,CREATE_TIME,RELATION_ORDER_NO) VALUES(?,?,?,?,?,?,?,?)"; int[] batchUpdate = ApplicationUtil.getBean(JdbcTemplate.class).batchUpdate(sql, new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int i) throws SQLException { ps.setString(1, UUIDGenerator.getUUID()); ps.setString(2, orderList.get(i).getPartyId()); ps.setInt(3, orderList.get(i).getType()); ps.setDouble(4, orderList.get(i).getAmount()); ps.setInt(5, orderList.get(i).getStatus()); ps.setTimestamp(6, new Timestamp(orderList.get(i).getExpireTime().getTime())); ps.setTimestamp(7, new Timestamp(orderList.get(i).getCreateTime().getTime())); ps.setString(8, orderList.get(i).getRelationOrderNo()); } @Override public int getBatchSize() { return orderList.size(); } }); logger.info("end PledgeGalaxyProfit batch insert attr:{}", batchUpdate); } /** * 计算订单收益 */ @Override public void saveTeamProfit(List orders, String projectType) { for (PledgeGalaxyOrder order : orders) { if (projectType.equals("DAPP_EXCHANGE")) { vickersTeamProfit(order); } if (projectType.equals("DAPP_EXCHANGE_SAFEPAL5")) { safePal5TeamProfit(order); } if ((projectType.equals("DAPP_EXCHANGE_IOEAI") || projectType.equals("DAPP_EXCHANGE_DAPPDEFIUSDT")) && order.getDays() >= 7) { ioeAiTeamProfit(order); } } } private void vickersTeamProfit(PledgeGalaxyOrder order) { String partyId = order.getPartyId(); int days = order.getDays(); double amount = order.getAmount(); Map map = pledgeGalaxyConfigService.getVickersRateMap(partyId, days, amount); // 当日静态收益 double staticRate = 0; if (map.containsKey("staticRate")) { staticRate = Double.valueOf(map.get("staticRate")); } double day_self_profit = Arith.mul(amount, staticRate); // 团队收益计入缓存 if (map.containsKey("teamRate")) { handleRecomProfit(String.valueOf(order.getPartyId()), day_self_profit, map.get("teamRate")); } } private void safePal5TeamProfit(PledgeGalaxyOrder order) { String partyId = order.getPartyId(); int days = order.getDays(); double amount = order.getAmount(); Map map = pledgeGalaxyConfigService.getSafePal5RateMap(partyId, days, amount); // 当日静态收益 double staticRate = 0; if (map.containsKey("staticRate")) { staticRate = Double.valueOf(map.get("staticRate")); } double day_self_profit = Arith.mul(amount, staticRate); // 团队收益计入缓存 if (map.containsKey("teamRate")) { handleRecomProfit(partyId, day_self_profit, map.get("teamRate")); } } private void ioeAiTeamProfit(PledgeGalaxyOrder order) { String partyId = order.getPartyId(); int days = order.getDays(); double amount = order.getAmount(); Date createTime = order.getCreateTime(); Map map = pledgeGalaxyConfigService.getIoeAIRateMap(partyId, days, amount, createTime); // 当日静态收益 double staticRate = 0; if (map.containsKey("staticRate")) { staticRate = Double.valueOf(map.get("staticRate")); } double day_self_profit = Arith.mul(amount, staticRate); // if (null != createTime && createTime.before(getIoeAiTimeVersion())) { // handleIoeAiTeamProfit(String.valueOf(order.getPartyId()), day_self_profit, map.get("teamRate")); // } else { // newHandleIoeAiTeamProfit(String.valueOf(order.getPartyId()), day_self_profit, map.get("teamRate")); // } handleIoeAiTeamProfitVersion3(partyId, day_self_profit, map.get("teamRate")); } /** * 最终收益持久化数据库 */ @Override public void insertTeamProfit() { if (cacheRecomProfit.isEmpty()) return; // 开始增加推荐人收益 logger.info("start ------recom user Galaxy profit,date:{},count:{}", new Object[] { new Date(), cacheRecomProfit.size() }); List teamProfits = new ArrayList<>(); Date date = new Date(); Calendar calendar = new GregorianCalendar(); calendar.setTime(date); calendar.add(calendar.DATE, Integer.valueOf(2)); Date expireTime = calendar.getTime(); for (Entry entry : cacheRecomProfit.entrySet()) { PledgeGalaxyProfit profit = new PledgeGalaxyProfit(); profit.setPartyId(entry.getKey()); profit.setType(PledgeGalaxyStatusConstants.TEAM_INCOME); profit.setAmount(entry.getValue()); profit.setStatus(PledgeGalaxyStatusConstants.PROFIT_PENDING); profit.setExpireTime(expireTime); profit.setCreateTime(date); teamProfits.add(profit); } insertBatchTeamProfit(teamProfits); // 推荐人质押2.0收益计算完成,纪录日志 logger.info("finish ------recom user Galaxy profit,date:{},count:{}", new Object[] { new Date(), cacheRecomProfit.size() }); } /** * 批量新增收益记录 * */ protected void insertBatchTeamProfit(final List orderList) { String sql = "INSERT INTO T_AUTO_MONITOR_PLEDGE_GALAXY_PROFIT(UUID,PARTY_ID,TYPE,AMOUNT,STATUS,EXPIRE_TIME,CREATE_TIME) VALUES(?,?,?,?,?,?,?)"; int[] batchUpdate = ApplicationUtil.getBean(JdbcTemplate.class).batchUpdate(sql, new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int i) throws SQLException { ps.setString(1, UUIDGenerator.getUUID()); ps.setString(2, orderList.get(i).getPartyId()); ps.setInt(3, orderList.get(i).getType()); ps.setDouble(4, orderList.get(i).getAmount()); ps.setInt(5, orderList.get(i).getStatus()); ps.setTimestamp(6, new Timestamp(orderList.get(i).getExpireTime().getTime())); ps.setTimestamp(7, new Timestamp(orderList.get(i).getCreateTime().getTime())); } @Override public int getBatchSize() { return orderList.size(); } }); logger.info("end PledgeGalaxyProfit batch insert attr:{}", batchUpdate); } /** * 删除订单 */ public void delete(PledgeGalaxyOrder order) { ApplicationUtil.executeDelete(order); this.redisHandler.remove(PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER + order.getId()); String key = PledgeGalaxyRedisKeys.PLEDGE_GALAXY_ORDER_PARTYID; Map maps = (Map) this.redisHandler.get(key + String.valueOf(order.getPartyId())); if (null != maps) { maps.remove(String.valueOf(order.getId())); redisHandler.setSync(key + String.valueOf(order.getPartyId()), maps); } } /** * 冻结功能 */ public void updateFrozen(String partyId, boolean enabled) { // 是否锁定,如果锁定可以登录、查看,但不能操作业务有关。 // true 不锁定 if (enabled) { List orders = queryOrdersByStatus(partyId, PledgeGalaxyStatusConstants.PLEDGE_FROZEN); for (PledgeGalaxyOrder order : orders) { order.setStatus(PledgeGalaxyStatusConstants.PLEDGE_SUCCESS); update(order); } } // false 锁定 else { List orders = queryOrdersByStatus(partyId, PledgeGalaxyStatusConstants.PLEDGE_SUCCESS); for (PledgeGalaxyOrder order : orders) { order.setStatus(PledgeGalaxyStatusConstants.PLEDGE_FROZEN); update(order); } } } private Date getIoeAiTimeVersion() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String version = "2022-08-28 00:00:00"; Date time = new Date(); try { time = sdf.parse(version); } catch (ParseException e) { e.printStackTrace(); } return time; } public void setWalletService(WalletService walletService) { this.walletService = walletService; } public void setMoneyLogService(MoneyLogService moneyLogService) { this.moneyLogService = moneyLogService; } public void setRedisHandler(RedisHandler redisHandler) { this.redisHandler = redisHandler; } public void setUserRecomService(UserRecomService userRecomService) { this.userRecomService = userRecomService; } public void setPartyService(PartyService partyService) { this.partyService = partyService; } public void setPledgeGalaxyConfigService(PledgeGalaxyConfigService pledgeGalaxyConfigService) { this.pledgeGalaxyConfigService = pledgeGalaxyConfigService; } public void setdAppAccountService(DAppAccountService dAppAccountService) { this.dAppAccountService = dAppAccountService; } public void setTipService(TipService tipService) { this.tipService = tipService; } public void setPledgeGalaxyProfitService(PledgeGalaxyProfitService pledgeGalaxyProfitService) { this.pledgeGalaxyProfitService = pledgeGalaxyProfitService; } }