package com.qxueyou.scc.school.service.impl; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.qxueyou.scc.base.dao.CommonDAO; //import com.qxueyou.scc.base.model.ONSMsg; import com.qxueyou.scc.base.model.Pager; import com.qxueyou.scc.base.model.Result; //import com.qxueyou.scc.base.service.ICacheService; //import com.qxueyou.scc.base.service.impl.CommonONSProducer; import com.qxueyou.scc.base.util.ClientUtils; import com.qxueyou.scc.base.util.CollectionUtils; import com.qxueyou.scc.base.util.TraceUtils; //import com.qxueyou.scc.msg.service.IMsgVenderService; import com.qxueyou.scc.school.dao.RankDAO; import com.qxueyou.scc.school.model.SchRank; import com.qxueyou.scc.school.model.SchRankHis; import com.qxueyou.scc.school.model.SchRankVer; import com.qxueyou.scc.school.service.IRankService; //import com.qxueyou.scc.transact.model.TransAccountType; /** * ÅÅÃûÏûÏ¢·¢ËÍ·þÎñ£¬¶ÔÓ¦µÄÏûÏ¢½ÓÊÕ·þÎñΪ RankMsgReceiveService * * @author µÂ»¢ * */ @Service public class RankService implements IRankService { /**ÅÅÐÐ**/ private static final String RANK = "rank"; /**ÈÕÖ¾**/ private final Logger log = LogManager.getLogger("RankService"); @Autowired CommonDAO dao; @Autowired RankDAO rankDao; // @Autowired // CommonONSProducer onsProducer; // // @Autowired // IMsgVenderService easemobService; // // /** »ý·ÖÕË»§ºÍÓ¶½ðÕË»§ */ // @Autowired // ITransAccountService transAccountService; // // /**»º´æ**/ // @Autowired // ICacheService cacheService; @Override public Result reqUpdateRankOld(String userId) { // ONSMsg msg = new ONSMsg(onsProducer.getTopic()); // // msg.put("msgType", "SCH_RANK"); // msg.put("userId", userId); // // try { // // onsProducer.sendMsg(msg); // // return new Result(true); // // } catch (Exception e) { // log.error("call rankMsgSendService fail.userId: " + userId, e); // } return new Result(false); } @Override public Result reqUpdateRank(String userId, String rankType, String scopeType, String scopeId) { // ONSMsg msg = new ONSMsg(onsProducer.getTopic()); // // msg.put("msgType", "SCH_RANK"); // msg.put("userId", userId); // msg.put("rankType", rankType); // msg.put("scopeType", scopeType); // msg.put("scopeId", scopeId); // // try { // // onsProducer.sendMsg(msg); // // return new Result(true); // // } catch (Exception e) { // log.error("call rankMsgSendService fail.userId: " + userId, e); // } return new Result(false); } @Override public int getRankInScope(String userId, String rankType, String scopeType, String scopeId) { String hql = "select his.rank from SchRankHis his,SchRankVer ver " + "where his.versionId=ver.versionId " + "and ver.latest is true " + "and ver.rankType=? " + "and ver.scopeType=? " + "and ver.scopeId=? " + "and his.userId=?"; Integer rank = dao.findUnique(hql, CollectionUtils.newList(rankType,scopeType,scopeId,userId), Integer.class); return rank==null?-1:rank; } @Override public int getRankInClass(String userId, String classId) { String hql = "select his.rank from SchRankHis his,SchRankVer ver " + "where his.versionId=ver.versionId " + "and ver.latest is true " + "and ver.rankType=? " + "and ver.scopeType=? " + "and ver.scopeId=? " + "and his.userId=?"; Integer rank = dao.findUnique(hql, CollectionUtils.newList(SchRank.RANK_TYPE_SCORE,SchRank.SCOPE_TYPE_CLASS,classId,userId), Integer.class); return rank==null?-1:rank; } @Override public List getClassRankLst(String classId) { Pager page = new Pager(); page.setPageNum(1); page.setPageSize(200); return getClassRankLst(classId,page); } @Override public List getClassRankLst(String classId,Pager page) { String versionId = getLastestVersionId(SchRank.RANK_TYPE_SCORE,SchRank.SCOPE_TYPE_CLASS,classId); String hql = "from SchRankHis his where his.versionId=? and his.value is not null order by his.rank"; List result = dao.findList(hql, page, CollectionUtils.newList(versionId), SchRankHis.class); return result; } /** * »ñÈ¡×îа汾ID * @param rankType * @param scopeType * @param scopeId * @return */ private String getLastestVersionId(String rankType,String scopeType,String scopeId) { String hql = "select ver.versionId from SchRankVer ver where " + "ver.latest is true " + "and ver.rankType=? " + "and ver.scopeType=? " + "and ver.scopeId=? " ; return this.dao.findUnique(hql, CollectionUtils.newList(rankType,scopeType,scopeId), String.class); } @Override public int getRankInQxueyou(String userId) { String hql = "select his.rank from SchRankHis his,SchRankVer ver " + "where his.versionId=ver.versionId " + "and ver.latest is true " + "and ver.rankType=? " + "and ver.scopeType=? "+ "and his.userId=?"; Integer rank = dao.findUnique(hql, CollectionUtils.newList(SchRank.RANK_TYPE_SCORE,SchRank.SCOPE_TYPE_QXUEYOU,userId), Integer.class); return rank==null?-1:rank; } @Override public List getQxueyouTopRankLst() { String versionId = getLastestVersionId(SchRank.RANK_TYPE_SCORE,SchRank.SCOPE_TYPE_QXUEYOU,"null"); String hql = "from SchRankHis his where his.versionId=? order by his.rank"; List result = dao.find(hql, CollectionUtils.newList(versionId), SchRankHis.class); return result; } /** * »ñÈ¡Óû§¸öÈË´«²¥´óʹ»ý·ÖºÍÅÅÃûÐÅÏ¢ * * @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){ // transAccountService.addAccount(TransAccountType.ACCOUNT_TYPE_ATS_COMMISSION, userId); // } // if(!hasScore){ // transAccountService.addAccount(TransAccountType.ACCOUNT_TYPE_ATS_SCORE, userId); // } // } 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); objSchRankHis.setUserId(userId); objSchRankHis.setName(ClientUtils.getUserName()); objSchRankHis.setRankTime(new Date()); objSchRankHis.setRank(iCount+1); objSchRankHis.setValue(BigDecimal.ZERO); objSchRankHis.setVersionId(versionId); this.dao.save(objSchRankHis); iCount++; } int percentages = 100-(iCount == 0?0:objSchRankHis.getRank()*100/iCount); if(percentages <= 0){ percentages = 0; } if(percentages >= 100){ percentages = 99; } //»ñÈ¡ÅÅÃû°Ù·Ö±È objSchRankHis.setPercentages(new BigDecimal(percentages).setScale(2, BigDecimal.ROUND_HALF_UP)); return objSchRankHis; } /** * »ñÈ¡ÅÅÐÐ×îа汾 * * @return */ private String getAtsLastVersion(){ // 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); objSchRankVer.setRankType(SchRank.RANK_TYPE_ATS_SCORE); objSchRankVer.setScopeType(SchRank.SCOPE_TYPE_QXUEYOU); objSchRankVer.setScopeId("null"); objSchRankVer.setVersionTime(new Date()); objSchRankVer.setDeleteFlag(false); TraceUtils.setCreateTrace(objSchRankVer); this.dao.save(objSchRankVer); versionId = objSchRankVer.getVersionId(); } //·ÅÈ뻺´æ // cacheService.set("ATS_RANK_VERSION", 60*60*8, versionId); } return versionId; } /** * »ñȡȫ²¿ÈËÊý * * @param versionId * @return */ private Integer atsUserCount(String versionId){ // 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; } @Override public void updateRankValue(String userId, String rankType, BigDecimal delta, BigDecimal total, String remark, boolean isSendMsg) { String hql = "update SchRank set value= ? where rankType=? and userId=?"; dao.bulkUpdate(hql, new Object[]{total,rankType,userId}); //ÇëÇó¸üÐÂÅÅÃû // 1.¸üе±Ç°°à¼¶Êý¾Ý reqUpdateRank(userId, SchRank.RANK_TYPE_SCORE, SchRank.SCOPE_TYPE_CLASS, ClientUtils.getClassId()); // 2.¸üÐÂQѧÓÑÊý¾Ý reqUpdateRank(userId, SchRank.RANK_TYPE_SCORE, SchRank.SCOPE_TYPE_QXUEYOU, "null"); // ÅжÏÊÇ·ñ·¢ËÍÏûÏ¢ if(!isSendMsg){ return; } try { Map extra = new HashMap(); extra.put("title", "»ý·Ö±ä¶¯"); extra.put("delta", String.valueOf(delta)); // »ý·Ö²»ÔÙ·¢ÏµÍ³Í¨Öª by cyq 20160823 //easemobService.doSendTextMsgToUsers("notice-sys", new String[]{userId}, msg.getContent(), extra); } catch (Exception e) { log.error("Ôö¼Ó»ý·ÖÍÆËÍÏûÏ¢³ö´í:"+e,e); } } /** * ´´½¨»ý·ÖÏûÏ¢ * @param userId * @param delta * @param remark * @return *//* 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.setReceiverId(userId); msg.setSender(null); msg.setContent("Ôö¼Ó"+delta+"¸ö»ý·Ö:"+remark); return msg; }*/ /** * ÇëÇóºÃÓÑÅÅÃû * @return -1´ú±í»¹Ã»ÓÐÃû´Î */ public int getRankInFriend(String userId) { String hql = "select his.rank from SchRankHis his,SchRankVer ver " + "where his.versionId=ver.versionId " + "and ver.latest is true " + "and ver.rankType = ? " + "and ver.scopeType = ? " + "and ver.scopeId = ? " + "and his.userId = ?"; Integer rank = dao.findUnique(hql, CollectionUtils.newList(SchRank.RANK_TYPE_SCORE,SchRank.SCOPE_TYPE_FRIEND,userId,userId), Integer.class); return rank==null?-1:rank; } /** * ÇëÇóºÃÓÑÅÅÃûÁбí * @return */ public List getFriendRankLst(String userId, Pager page) { String versionId = getLastestVersionId(SchRank.RANK_TYPE_SCORE,SchRank.SCOPE_TYPE_FRIEND,userId); String hql = "from SchRankHis his where his.versionId=? order by his.rank"; List result = dao.findList(hql, page, CollectionUtils.newList(versionId), SchRankHis.class); return result; } /** * ×î½ünumÌìȫվÅÅÃû״̬±ä»¯ */ public List> getPersonalQxueyouRankTrend(String userId,Pager page, int num) { List lstRankHis = new ArrayList(); List versionId = this.getLastestNumVersionId(SchRank.RANK_TYPE_SCORE, SchRank.SCOPE_TYPE_QXUEYOU, null , num); if(!versionId.isEmpty()){ String hql = "from SchRankHis his where his.versionId in (:versionId) and his.userId = :userId order by his.rankTime asc "; Map argsMap = new HashMap(); argsMap.put("versionId", versionId); argsMap.put("userId", ClientUtils.getUserId()); lstRankHis = this.dao.findByComplexHql(hql, page, argsMap, SchRankHis.class); } return this.generatePersonalRankTrend(lstRankHis,num ,SchRank.SCOPE_TYPE_QXUEYOU,null,userId); } /** * ×î½ünumÌìºÃÓÑÅÅÃû״̬±ä»¯ */ public List> getPersonalFriendRankTrend(String userId, Pager page, int num) { List lstRankHis = new ArrayList(); List versionId = this.getLastestNumVersionId(SchRank.RANK_TYPE_SCORE, SchRank.SCOPE_TYPE_FRIEND, userId , num); if(!versionId.isEmpty()){ String hql = "from SchRankHis his where his.versionId in (:versionId) and his.userId = :userId order by his.rankTime asc "; Map argsMap = new HashMap(); argsMap.put("versionId", versionId); argsMap.put("userId", ClientUtils.getUserId()); lstRankHis = this.dao.findByComplexHql(hql, page, argsMap, SchRankHis.class); } return this.generatePersonalRankTrend(lstRankHis,num ,SchRank.SCOPE_TYPE_FRIEND,null,userId); } /** * ×î½ünumÌì°à¼¶ÅÅÃû״̬±ä»¯ */ public List> getPersonalClassRankTrend(String userId,String classId,Pager page,int num) { List lstRankHis = new ArrayList(); List versionId = this.getLastestNumVersionId(SchRank.RANK_TYPE_SCORE, SchRank.SCOPE_TYPE_CLASS, classId , num); if(!versionId.isEmpty()){ String hql = "from SchRankHis his where his.versionId in (:versionId) and his.userId = :userId order by his.rankTime asc "; Map argsMap = new HashMap(); argsMap.put("versionId", versionId); argsMap.put("userId", userId); lstRankHis = this.dao.findByComplexHql(hql, page, argsMap, SchRankHis.class); } return this.generatePersonalRankTrend(lstRankHis,num ,SchRank.SCOPE_TYPE_CLASS,classId,userId); } /** * ×é×°±ä»¯Ç÷ÊÆ,ÓÐÒ»¸öbug£¬ÐµÇ¼µÄÓû§µÚÒ»´Î²é¿´»ý·Ö£¬»áÏÔÊ¾Ç°ÃæËÄÌì»ý·ÖºÍµ±Ç°×îлý·ÖÒ»Ö * @param lstRankHis * @param num * @param classId * @return */ private List> generatePersonalRankTrend(List lstRankHis,int num ,String scopeType,String scopeId,String userId ){ // È¡µÃÿÌìµÄ×îºóÒ»¸ö°æ±¾£¬²éѯÅÅÃû±íÊý¾Ý List> result = new ArrayList>(lstRankHis.size()); Map mapIndex = new HashMap(); SimpleDateFormat weekFm = new SimpleDateFormat("EEEE", Locale.CHINA); //SimpleDateFormat dateFm = new SimpleDateFormat("yyyy-MM-dd"); Map map; // ½«±¾À´ÓеÄÅÅÃû³éÈ¡×é×° if(!lstRankHis.isEmpty()){ int index = 0; for(SchRankHis rank : lstRankHis){ if( (System.currentTimeMillis() / (1000 * 60 * 60 * 24) - rank.getRankTime().getTime() / (1000 * 60 * 60 * 24 )) < num ){ index = num - (int)(System.currentTimeMillis()/(1000 * 60 * 60 * 24) - rank.getRankTime().getTime() / (1000 * 60 * 60 * 24)) ; map = new HashMap(); map.put("index", index ); map.put(RANK, rank.getRank()); map.put("rankTime", rank.getRankTime().getTime()); map.put("rankWeek", weekFm.format(rank.getRankTime())); //map.put("rankDate", dateFm.format(rank.getRankTime())); result.add(map); mapIndex.put(index,rank.getRank()); } } } //Åжϣ¬ÉÙÁËÐèÒªÖØÐÂ×é×° 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 ){ lTime = Long.parseLong(String.valueOf(result.get(i).get("rankTime"))) ; iRank = Integer.parseInt(String.valueOf(result.get(i).get(RANK))) ; } } //µÚ¶þ±é×é×° for(int i = num ; i > 0 ; i--){ if(!mapIndex.containsKey(i)){ //Èç¹ûûÓУ¬Í³Ò»ÒÔºóÃæµÄÅÅÃûΪ׼ iRank = i == num ? iRank : mapIndex.get(i+1); map = new HashMap(); map.put("index", i); map.put(RANK, iRank); map.put("rankTime", startTime + ((long)i) * 24 * 60 * 60 * 1000 ); map.put("rankWeek", weekFm.format(startTime + ((long)i) * 24 * 60 * 60 * 1000)); //map.put("rankDate", dateFm.format(startTime + ((long)i) * 24 * 60 * 60 * 1000)); result.add(map); mapIndex.put(i,iRank); } } }else{ //ûÓеϰ£¬Ö±½ÓÓõ±Ç°»ý·Ö Integer iRank = null; if(SchRank.SCOPE_TYPE_CLASS.equals(scopeType)){ iRank = this.getRankInClass(userId, scopeId); } if(SchRank.SCOPE_TYPE_QXUEYOU.equals(scopeType)){ iRank = this.getRankInQxueyou(userId); } if(SchRank.SCOPE_TYPE_FRIEND.equals(scopeType)){ iRank = this.getRankInFriend(userId); } String strRank = iRank > 0 ? String.valueOf(iRank) : "--" ; for(int i = 1 ; i <= num ; i++ ){ map = new HashMap(); map.put("index", i); map.put(RANK, strRank); map.put("rankTime", startTime + ((long)i) * 24 * 60 * 60 * 1000 ); map.put("rankWeek", weekFm.format(startTime + ((long)i) * 24 * 60 * 60 * 1000 )); result.add(map); } } return result ; } /** * »ñÈ¡×î½üNÌìµÄÿÌìÒ»¸ö°æ±¾£¬Ã¿Ìì»ñÈ¡µÄÒ»¸ö°æ±¾¹æÔòΪ£ºµ±Ìì×îеÄÒ»¸ö°æ±¾ * @param rankType * @param scopeType * @param scopeId * @return */ private List getLastestNumVersionId(String rankType,String scopeType,String scopeId,int num) { Pager page = new Pager(); page.setPageNum(1); page.setPageSize(num); String plusSQL = ""; if(StringUtils.isNotBlank(scopeId)){ plusSQL = " AND SCOPE_ID = :scopeId "; } String sql = "SELECT " + "VID,VER,VTIME " + "FROM " + "( " + "SELECT DISTINCT VERSION_ID VID, VERSION_TIME VTIME,VERSION VER " + "FROM SCH_RANK_VER WHERE RANK_TYPE = :randType AND SCOPE_TYPE = :scopeType " + plusSQL + " ORDER BY VERSION DESC " + ") V GROUP BY DATE(VTIME) ORDER BY V.VER DESC "; Map argsHWMap = new HashMap(); argsHWMap.put("randType", rankType); argsHWMap.put("scopeType", scopeType); if(StringUtils.isNotBlank(scopeId)){ argsHWMap.put("scopeId", scopeId); } List lstObj = this.dao.findByComplexSql(sql, page, argsHWMap, Object[].class); if(lstObj.isEmpty()){ return new ArrayList(); } List lstVer = new ArrayList(num); //ÅжÏÊÇ·ñÿÌì¶¼ÓÐÒ»Ìõ¼Ç¼ for(Object[] obj : lstObj ){ lstVer.add(String.valueOf(obj[0])); } return lstVer; } /** * µÃµ½ÅÅÃûÊý¾Ý£¨°à¼¶¡¢ºÃÓÑ¡¢È«Õ¾£©ÅÅÃû ¼°ÅÅÃûÉÏÉýϽµ * @return */ public Map getScoreRankPageData(){ Map result = new HashMap(); Pager page = new Pager(); page.setPageNum(1); page.setPageSize(Integer.MAX_VALUE); //1.°à¼¶ÅÅÃû¼°ÉÏÉý List> 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ÅÅÃû¼°ÉÏÉý List> 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.ºÃÓÑÅÅÃû¼°ÉÏÉý List> 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)); this.getChange(result, firstFriendRank, lastestFriendRank, "friend"); return result; } /** * Åжϸıä * * @param firstRank * @param lastestRank * @param type * @return */ private Map getChange(Map result, String firstRank, String lastestRank, String type){ if(!"--".equals(lastestRank)){ result.put(type+"Rank", lastestRank); if(!"--".equals(firstRank)){ int first = Integer.parseInt(firstRank) ; int last = Integer.parseInt(lastestRank); result.put(type+"ChangeNum", last > first ? last - first : first - last ); result.put(type+"ChangeUp", last > first ? true : false ); }else{ result.put(type+"ChangeNum", "" ); result.put(type+"ChangeUp", false ); } }else{ result.put(type+"Rank", "--"); result.put(type+"ChangeNum", "" ); result.put(type+"ChangeUp", false ); } return result; } }