| | |
| | | //import com.qxueyou.scc.transact.model.TransAccountType; |
| | | |
| | | /** |
| | | * 排名消息发送服务,对应的消息接收服务为 RankMsgReceiveService |
| | | * 排名消息发送服务,对应的消息接收服务为 RankMsgReceiveService |
| | | * |
| | | * @author 德虎 |
| | | * @author 德虎 |
| | | * |
| | | */ |
| | | @Service |
| | | public class RankService implements |
| | | IRankService { |
| | | |
| | | /**排行**/ |
| | | /**排行**/ |
| | | private static final String RANK = "rank"; |
| | | |
| | | /**日志**/ |
| | | /**日志**/ |
| | | private final Logger log = LogManager.getLogger("RankService"); |
| | | |
| | | @Autowired |
| | |
| | | // @Autowired |
| | | // IMsgVenderService easemobService; |
| | | // |
| | | // /** 积分账户和佣金账户 */ |
| | | // /** 积分账户和佣金账户 */ |
| | | // @Autowired |
| | | // ITransAccountService transAccountService; |
| | | // |
| | | // /**缓存**/ |
| | | // /**缓存**/ |
| | | // @Autowired |
| | | // ICacheService cacheService; |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 获取最新版本ID |
| | | * 获取最新版本ID |
| | | * @param rankType |
| | | * @param scopeType |
| | | * @param scopeId |
| | |
| | | } |
| | | |
| | | /** |
| | | * 获取用户个人传播大使积分和排名信息 |
| | | * 获取用户个人传播大使积分和排名信息 |
| | | * |
| | | * @param userId 用户id |
| | | * @param userId 用户id |
| | | * @return |
| | | */ |
| | | @Override |
| | | public SchRankHis doGetUserRank(String userId) { |
| | | // //防止重复回调 |
| | | // //防止重复回调 |
| | | // String ing = cacheService.get("CREAT_ACCOUNT"+userId, String.class); |
| | | // if(StringUtils.isBlank(ing)){ |
| | | // //放入缓存 |
| | | // //放入缓存 |
| | | // cacheService.set("CREAT_ACCOUNT"+userId, 60*60, "ING"); |
| | | // //判断用户是否存在积分和佣金账户,不存在就添加 |
| | | // //判断用户是否存在积分和佣金账户,不存在就添加 |
| | | // boolean hasCommission = transAccountService.existsAccount(TransAccountType.ACCOUNT_TYPE_ATS_COMMISSION, userId); |
| | | // boolean hasScore = transAccountService.existsAccount(TransAccountType.ACCOUNT_TYPE_ATS_SCORE, userId); |
| | | // if(!hasCommission){ |
| | |
| | | // } |
| | | |
| | | String versionId = this.getAtsLastVersion(); |
| | | //获取个人排名 |
| | | //获取个人排名 |
| | | String hql = "from SchRankHis his where his.versionId=? and his.userId = ? and his.deleteFlag is false"; |
| | | SchRankHis objSchRankHis = dao.findUnique(hql, CollectionUtils.newList(versionId, userId), SchRankHis.class); |
| | | |
| | | Integer iCount = this.atsUserCount(versionId); |
| | | if(objSchRankHis == null){ |
| | | //新建排行 |
| | | //新建排行 |
| | | objSchRankHis = new SchRankHis(); |
| | | TraceUtils.setCreateTrace(objSchRankHis); |
| | | objSchRankHis.setDeleteFlag(false); |
| | |
| | | if(percentages >= 100){ |
| | | percentages = 99; |
| | | } |
| | | //获取排名百分比 |
| | | //获取排名百分比 |
| | | objSchRankHis.setPercentages(new BigDecimal(percentages).setScale(2, BigDecimal.ROUND_HALF_UP)); |
| | | return objSchRankHis; |
| | | } |
| | | |
| | | /** |
| | | * 获取排行最新版本 |
| | | * 获取排行最新版本 |
| | | * |
| | | * @return |
| | | */ |
| | |
| | | // String versionId = cacheService.get("ATS_RANK_VERSION", String.class); |
| | | String versionId =null; |
| | | if(StringUtils.isBlank(versionId)){ |
| | | //获取最新排名版本 |
| | | //获取最新排名版本 |
| | | versionId = getLastestVersionId(SchRank.RANK_TYPE_ATS_SCORE,SchRank.SCOPE_TYPE_QXUEYOU,"null"); |
| | | //新增版本表 |
| | | //新增版本表 |
| | | if(StringUtils.isEmpty(versionId)){ |
| | | SchRankVer objSchRankVer = new SchRankVer(); |
| | | objSchRankVer.setLatest(true); |
| | |
| | | this.dao.save(objSchRankVer); |
| | | versionId = objSchRankVer.getVersionId(); |
| | | } |
| | | //放入缓存 |
| | | //放入缓存 |
| | | // cacheService.set("ATS_RANK_VERSION", 60*60*8, versionId); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 获取全部人数 |
| | | * 获取全部人数 |
| | | * |
| | | * @param versionId |
| | | * @return |
| | |
| | | // Integer count = cacheService.get("ATS_RANK_USER_COUNT", Integer.class); |
| | | Integer count =0; |
| | | if(count == null || count == 0){ |
| | | //获取全站大使人数 |
| | | //获取全站大使人数 |
| | | String hql_count = "from SchRankHis his where his.versionId=? and his.deleteFlag is false"; |
| | | |
| | | count = dao.findCount(hql_count, CollectionUtils.newList(versionId)); |
| | | //放入缓存 |
| | | //放入缓存 |
| | | // cacheService.set("ATS_RANK_USER_COUNT", 60*60*8, count); |
| | | } |
| | | return count; |
| | |
| | | |
| | | dao.bulkUpdate(hql, new Object[]{total,rankType,userId}); |
| | | |
| | | //请求更新排名 |
| | | // 1.更新当前班级数据 |
| | | //请求更新排名 |
| | | // 1.更新当前班级数据 |
| | | reqUpdateRank(userId, SchRank.RANK_TYPE_SCORE, SchRank.SCOPE_TYPE_CLASS, ClientUtils.getClassId()); |
| | | |
| | | // 2.更新Q学友数据 |
| | | // 2.更新Q学友数据 |
| | | reqUpdateRank(userId, SchRank.RANK_TYPE_SCORE, SchRank.SCOPE_TYPE_QXUEYOU, "null"); |
| | | |
| | | // 判断是否发送消息 |
| | | // 判断是否发送消息 |
| | | if(!isSendMsg){ |
| | | return; |
| | | } |
| | |
| | | try { |
| | | |
| | | Map<String,String> extra = new HashMap<String,String>(); |
| | | extra.put("title", "积分变动"); |
| | | extra.put("title", "积分变动"); |
| | | extra.put("delta", String.valueOf(delta)); |
| | | // 积分不再发系统通知 by cyq 20160823 |
| | | // 积分不再发系统通知 by cyq 20160823 |
| | | //easemobService.doSendTextMsgToUsers("notice-sys", new String[]{userId}, msg.getContent(), extra); |
| | | |
| | | } catch (Exception e) { |
| | | |
| | | log.error("增加积分推送消息出错:"+e,e); |
| | | log.error("增加积分推送消息出错:"+e,e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 创建积分消息 |
| | | * 创建积分消息 |
| | | * @param userId |
| | | * @param delta |
| | | * @param remark |
| | |
| | | *//* |
| | | private Message newScoreMsg(String userId, BigDecimal delta, String remark) { |
| | | |
| | | //新建消息并保存 |
| | | //新建消息并保存 |
| | | Message msg = new Message(); |
| | | TraceUtils.setCreateTrace(msg); |
| | | |
| | | msg.setMsgType("SCH_SCORES"); |
| | | msg.setSenderId(ClientUtils.getUserId()!=null?ClientUtils.getUserId():"admin"); |
| | | msg.setSender(ClientUtils.getUserName()!=null?ClientUtils.getUserName():"系统管理员"); |
| | | msg.setSender(ClientUtils.getUserName()!=null?ClientUtils.getUserName():"系统管理员"); |
| | | msg.setReceiverId(userId); |
| | | msg.setSender(null); |
| | | msg.setContent("增加"+delta+"个积分:"+remark); |
| | | msg.setContent("增加"+delta+"个积分:"+remark); |
| | | |
| | | return msg; |
| | | }*/ |
| | |
| | | |
| | | |
| | | /** |
| | | * 请求好友排名 |
| | | * @return -1代表还没有名次 |
| | | * 请求好友排名 |
| | | * @return -1代表还没有名次 |
| | | */ |
| | | public int getRankInFriend(String userId) { |
| | | String hql = "select his.rank from SchRankHis his,SchRankVer ver " + |
| | |
| | | } |
| | | |
| | | /** |
| | | * 请求好友排名列表 |
| | | * 请求好友排名列表 |
| | | * @return |
| | | */ |
| | | public List<SchRankHis> getFriendRankLst(String userId, Pager page) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 最近num天全站排名状态变化 |
| | | * 最近num天全站排名状态变化 |
| | | */ |
| | | public List<Map<String,Object>> getPersonalQxueyouRankTrend(String userId,Pager page, int num) { |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 最近num天好友排名状态变化 |
| | | * 最近num天好友排名状态变化 |
| | | */ |
| | | public List<Map<String,Object>> getPersonalFriendRankTrend(String userId, |
| | | Pager page, int num) { |
| | |
| | | |
| | | |
| | | /** |
| | | * 最近num天班级排名状态变化 |
| | | * 最近num天班级排名状态变化 |
| | | */ |
| | | public List<Map<String,Object>> getPersonalClassRankTrend(String userId,String classId,Pager page,int num) { |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 组装变化趋势,有一个bug,新登录的用户第一次查看积分,会显示前面四天积分和当前最新积分一致 |
| | | * 组装变化趋势,有一个bug,新登录的用户第一次查看积分,会显示前面四天积分和当前最新积分一致 |
| | | * @param lstRankHis |
| | | * @param num |
| | | * @param classId |
| | |
| | | */ |
| | | private List<Map<String,Object>> generatePersonalRankTrend(List<SchRankHis> lstRankHis,int num ,String scopeType,String scopeId,String userId ){ |
| | | |
| | | // 取得每天的最后一个版本,查询排名表数据 |
| | | // 取得每天的最后一个版本,查询排名表数据 |
| | | List<Map<String,Object>> result = new ArrayList<Map<String,Object>>(lstRankHis.size()); |
| | | Map<Integer,Integer> mapIndex = new HashMap<Integer,Integer>(); |
| | | SimpleDateFormat weekFm = new SimpleDateFormat("EEEE", Locale.CHINA); |
| | | //SimpleDateFormat dateFm = new SimpleDateFormat("yyyy-MM-dd"); |
| | | Map<String,Object> map; |
| | | |
| | | // 将本来有的排名抽取组装 |
| | | // 将本来有的排名抽取组装 |
| | | if(!lstRankHis.isEmpty()){ |
| | | |
| | | int index = 0; |
| | |
| | | |
| | | } |
| | | |
| | | //判断,少了需要重新组装 |
| | | //判断,少了需要重新组装 |
| | | long startTime = System.currentTimeMillis() - ((long)num) * 24 * 60 * 60 * 1000 ; |
| | | if( !result.isEmpty() && result.size() < num ){ |
| | | Integer iRank = null; |
| | | long lTime = 0 ; |
| | | |
| | | //第一遍取最新排名 |
| | | //第一遍取最新排名 |
| | | for(int i = result.size() -1 ; i >= 0 ; i--){ |
| | | if(null != result.get(i) && StringUtils.isNotBlank(String.valueOf(result.get(i).get("rankTime"))) |
| | | && Long.parseLong(String.valueOf(result.get(i).get("rankTime"))) > lTime ){ |
| | |
| | | } |
| | | } |
| | | |
| | | //第二遍组装 |
| | | //第二遍组装 |
| | | for(int i = num ; i > 0 ; i--){ |
| | | if(!mapIndex.containsKey(i)){ |
| | | //如果没有,统一以后面的排名为准 |
| | | //如果没有,统一以后面的排名为准 |
| | | iRank = i == num ? iRank : mapIndex.get(i+1); |
| | | map = new HashMap<String,Object>(); |
| | | map.put("index", i); |
| | |
| | | |
| | | }else{ |
| | | |
| | | //没有的话,直接用当前积分 |
| | | //没有的话,直接用当前积分 |
| | | Integer iRank = null; |
| | | |
| | | if(SchRank.SCOPE_TYPE_CLASS.equals(scopeType)){ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 获取最近N天的每天一个版本,每天获取的一个版本规则为:当天最新的一个版本 |
| | | * 获取最近N天的每天一个版本,每天获取的一个版本规则为:当天最新的一个版本 |
| | | * @param rankType |
| | | * @param scopeType |
| | | * @param scopeId |
| | |
| | | } |
| | | |
| | | List<String> lstVer = new ArrayList<String>(num); |
| | | //判断是否每天都有一条记录 |
| | | //判断是否每天都有一条记录 |
| | | for(Object[] obj : lstObj ){ |
| | | lstVer.add(String.valueOf(obj[0])); |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * 得到排名数据(班级、好友、全站)排名 及排名上升下降 |
| | | * 得到排名数据(班级、好友、全站)排名 及排名上升下降 |
| | | * @return |
| | | */ |
| | | public Map<String,Object> getScoreRankPageData(){ |
| | |
| | | page.setPageSize(Integer.MAX_VALUE); |
| | | |
| | | |
| | | //1.班级排名及上升 |
| | | //1.班级排名及上升 |
| | | List<Map<String,Object>> lstClass = this.getPersonalClassRankTrend(ClientUtils.getUserId(), ClientUtils.getClassId(), page, 2); |
| | | String firstClassRank = String.valueOf(lstClass.get(0).get(RANK)); |
| | | String lastestClassRank = String.valueOf(lstClass.get(1).get(RANK)); |
| | | |
| | | this.getChange(result, firstClassRank, lastestClassRank, "class"); |
| | | |
| | | //2.qxueyou排名及上升 |
| | | //2.qxueyou排名及上升 |
| | | List<Map<String,Object>> lstQxueyou = this.getPersonalQxueyouRankTrend(ClientUtils.getUserId(), page, 2); |
| | | String firstQxueyouRank = String.valueOf(lstQxueyou.get(0).get(RANK)); |
| | | String lastestQxueyouRank = String.valueOf(lstQxueyou.get(1).get(RANK)); |
| | | |
| | | this.getChange(result, firstQxueyouRank, lastestQxueyouRank, "qxueyou"); |
| | | //3.好友排名及上升 |
| | | //3.好友排名及上升 |
| | | List<Map<String,Object>> lstFriend = this.getPersonalFriendRankTrend(ClientUtils.getUserId(), page, 2); |
| | | String firstFriendRank = String.valueOf(lstFriend.get(0).get(RANK)); |
| | | String lastestFriendRank = String.valueOf(lstFriend.get(1).get(RANK)); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 判断改变 |
| | | * 判断改变 |
| | | * |
| | | * @param firstRank |
| | | * @param lastestRank |