Browse Source

积分排行榜 - 排行规则:相同分数,排名相同

feature/syp_points
zhangyongzhangyong 6 years ago
parent
commit
01e9c62e55
  1. 4
      esua-epdc/epdc-module/epdc-api/epdc-api-client/src/main/java/com/elink/esua/epdc/dto/result/EpdcAppPointsRankingResultDTO.java
  2. 5
      esua-epdc/epdc-module/epdc-api/epdc-api-client/src/main/java/com/elink/esua/epdc/dto/result/EpdcAppPointsRankingTopTenDTO.java
  3. 4
      esua-epdc/epdc-module/epdc-points/epdc-points-server/src/main/java/com/elink/esua/epdc/dao/PointsLogsDao.java
  4. 42
      esua-epdc/epdc-module/epdc-points/epdc-points-server/src/main/java/com/elink/esua/epdc/service/impl/PointsLogsServiceImpl.java
  5. 49
      esua-epdc/epdc-module/epdc-points/epdc-points-server/src/main/resources/mapper/PointsLogsDao.xml

4
esua-epdc/epdc-module/epdc-api/epdc-api-client/src/main/java/com/elink/esua/epdc/dto/result/EpdcAppPointsRankingResultDTO.java

@ -18,12 +18,12 @@ public class EpdcAppPointsRankingResultDTO implements Serializable {
/** /**
* 积分排行接口返回值 - 前十列表 * 积分排行接口返回值 - 前十列表
*/ */
private List<EpdcAppPointsRankingTopTenDTO> pointsRankingTopTen; private List<EpdcAppPointsRankingTopTenDTO> rank;
/** /**
* 积分排行接口返回值 -用户排名 * 积分排行接口返回值 -用户排名
*/ */
private EpdcAppPointsRankingUserDTO pointsRankingUser; private EpdcAppPointsRankingUserDTO currentUser;

5
esua-epdc/epdc-module/epdc-api/epdc-api-client/src/main/java/com/elink/esua/epdc/dto/result/EpdcAppPointsRankingTopTenDTO.java

@ -28,4 +28,9 @@ public class EpdcAppPointsRankingTopTenDTO implements Serializable {
* 积分 * 积分
*/ */
private Integer points; private Integer points;
/**
* 取排行榜 名次
*/
private Integer rank;
} }

4
esua-epdc/epdc-module/epdc-points/epdc-points-server/src/main/java/com/elink/esua/epdc/dao/PointsLogsDao.java

@ -104,7 +104,7 @@ public interface PointsLogsDao extends BaseDao<PointsLogsEntity> {
List<PointsLogsDTO> selectListVolunteerPointsLog(Map<String, Object> params); List<PointsLogsDTO> selectListVolunteerPointsLog(Map<String, Object> params);
/** /**
* 积分排行接口0 周排行1 月排行 - 查询用户个人排名 * 积分排行接口0 周排行1 月排行 - 查询用户个人排名名次 积分
* *
* @param formDto * @param formDto
* param pageIndex 必选 页码 * param pageIndex 必选 页码
@ -117,7 +117,7 @@ public interface PointsLogsDao extends BaseDao<PointsLogsEntity> {
EpdcAppPointsRankingUserDTO selectUserPointsRanking(EpdcAppPointsRankingFormDTO formDto); EpdcAppPointsRankingUserDTO selectUserPointsRanking(EpdcAppPointsRankingFormDTO formDto);
/** /**
* 积分排行接口0 周排行1 月排行 - 产生积分记录的总人数 * 积分排行接口0 周排行1 月排行 - 产生积分记录的总人数相同积分做去重处理
* *
* @param formDto * @param formDto
* param pageIndex 必选 页码 * param pageIndex 必选 页码

42
esua-epdc/epdc-module/epdc-points/epdc-points-server/src/main/java/com/elink/esua/epdc/service/impl/PointsLogsServiceImpl.java

@ -53,10 +53,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays; import java.util.*;
import java.util.Date;
import java.util.List;
import java.util.Map;
/** /**
* 积分记录表 积分记录表 * 积分记录表 积分记录表
@ -236,21 +233,50 @@ public class PointsLogsServiceImpl extends BaseServiceImpl<PointsLogsDao, Points
public EpdcAppPointsRankingResultDTO listPointsRanking(EpdcAppPointsRankingFormDTO formDto) { public EpdcAppPointsRankingResultDTO listPointsRanking(EpdcAppPointsRankingFormDTO formDto) {
int pageIndex = (formDto.getPageIndex() - NumConstant.ONE) * formDto.getPageSize(); int pageIndex = (formDto.getPageIndex() - NumConstant.ONE) * formDto.getPageSize();
formDto.setPageIndex(pageIndex); formDto.setPageIndex(pageIndex);
// 积分相同,排名相同
EpdcAppPointsRankingResultDTO rangking = new EpdcAppPointsRankingResultDTO(); EpdcAppPointsRankingResultDTO rangking = new EpdcAppPointsRankingResultDTO();
rangking.setPointsRankingTopTen(baseDao.selectListPointsRanking(formDto)); // 获取排好序的 排行榜数据数据
rangking.setRank(this.sortListPointsRank(formDto));
// 判断当前用户是否产生过积分记录 // 判断当前用户是否产生过积分记录
EpdcAppPointsRankingUserDTO userRang = baseDao.selectUserPointsRanking(formDto); EpdcAppPointsRankingUserDTO userRang = baseDao.selectUserPointsRanking(formDto);
// 用户产生过积分记录,返回积分排名 // 用户产生过积分记录,返回积分排名
if (userRang != null) { if (userRang != null) {
rangking.setPointsRankingUser(userRang); userRang.setUserId(formDto.getUserId());
userRang.setNickName(formDto.getNickName());
rangking.setCurrentUser(userRang);
} else { } else {
// 未产生过积分排名 总排名+1 // 未产生过积分排名 总排名+1
rangking.setPointsRankingUser(this.noPointsRecordIsUserRanking(formDto)); rangking.setCurrentUser(this.noPointsRecordIsUserRanking(formDto));
} }
return rangking; return rangking;
} }
/**
* 获取排好序的排行榜数据
* @param formDto
* @return java.util.List<com.elink.esua.epdc.dto.result.EpdcAppPointsRankingTopTenDTO>
* @Author zhangyong
* @Date 16:09 2020-05-13
**/
private List<EpdcAppPointsRankingTopTenDTO> sortListPointsRank(EpdcAppPointsRankingFormDTO formDto){
List<EpdcAppPointsRankingTopTenDTO> listPointsRank = new ArrayList<>();
listPointsRank = baseDao.selectListPointsRanking(formDto);
int sortNumber = 1;
if (listPointsRank != null){
for (int i = 1; i < listPointsRank.size(); i++){
listPointsRank.get(0).setRank(NumConstant.ONE);
if(listPointsRank.get(i - NumConstant.ONE).getPoints().intValue() == listPointsRank.get(i).getPoints().intValue()){
listPointsRank.get(i).setRank(sortNumber);
} else {
sortNumber = sortNumber + NumConstant.ONE;
listPointsRank.get(i).setRank(sortNumber);
}
}
}
return listPointsRank;
}
/** /**
* 查询积分排行接口0 周排行1 月排行如果没有当前登录用户的积分记录返回 处理(总排名+1) 过的排名信息 * 查询积分排行接口0 周排行1 月排行如果没有当前登录用户的积分记录返回 处理(总排名+1) 过的排名信息
* @param formDto * @param formDto

49
esua-epdc/epdc-module/epdc-points/epdc-points-server/src/main/resources/mapper/PointsLogsDao.xml

@ -26,14 +26,13 @@
<select id="selectListPointsRecord" resultType="com.elink.esua.epdc.dto.result.EpdcAppPointsRecordResultDTO"> <select id="selectListPointsRecord" resultType="com.elink.esua.epdc.dto.result.EpdcAppPointsRecordResultDTO">
SELECT SELECT
l.ID id, l.ID id,
r.RULE_DESC ruleDesc, l.OPERATION_DESC ruleDesc,
l.OPERATION_TYPE operationType, l.OPERATION_TYPE operationType,
l.POINTS points, l.POINTS points,
l.OPERATION_TIME operationTime l.OPERATION_TIME operationTime
FROM FROM
epdc_points_logs l epdc_points_logs l
LEFT JOIN epdc_points_rule r ON l.RULE_CODE = r.RULE_CODE WHERE l.DEL_FLAG = 0
WHERE l.DEL_FLAG = 0 AND r.DEL_FLAG = 0
AND l.USER_ID = #{userId} AND l.USER_ID = #{userId}
ORDER BY ORDER BY
l.OPERATION_TIME DESC l.OPERATION_TIME DESC
@ -132,21 +131,19 @@
<select id="selectUserPointsRanking" resultType="com.elink.esua.epdc.dto.result.EpdcAppPointsRankingUserDTO"> <select id="selectUserPointsRanking" resultType="com.elink.esua.epdc.dto.result.EpdcAppPointsRankingUserDTO">
SELECT SELECT
userRanking.rank, userRanking.rank,
userRanking.userId,
userRanking.nickName,
userRanking.points userRanking.points
FROM( FROM(
SELECT SELECT
(@i:=@i+1) rank, (@i:=@i+1) rank,
tab.USER_ID userId, tab.USER_ID userId,
(SELECT NICKNAME FROM epdc_points_logs WHERE tab.USER_ID = USER_ID ORDER BY CREATED_TIME DESC limit 0,1) nickName, GROUP_CONCAT(tab.USER_ID SEPARATOR ',') pdtj,
tab.points tab.points
FROM( FROM(
SELECT SELECT
USER_ID, USER_ID,
(SUM(case when OPERATION_TYPE = 1 then IFNULL(points,0) else 0 end) - SUM(case when OPERATION_TYPE = 0 then IFNULL(points,0) else 0 end)) points (SUM(case when OPERATION_TYPE = 1 then IFNULL(points,0) else 0 end) - SUM(case when OPERATION_TYPE = 0 then IFNULL(points,0) else 0 end)) points
FROM epdc_points_logs FROM epdc_points_logs
WHERE DEL_FLAG = 0 WHERE DEL_FLAG = 0
<if test="rankingType != null and rankingType == 0"> <if test="rankingType != null and rankingType == 0">
AND YEARWEEK(date_format(OPERATION_TIME,'%Y-%m-%d')) = YEARWEEK(now()) AND YEARWEEK(date_format(OPERATION_TIME,'%Y-%m-%d')) = YEARWEEK(now())
</if> </if>
@ -154,8 +151,9 @@
AND DATE_FORMAT( OPERATION_TIME, '%Y%m' ) = DATE_FORMAT( CURDATE() , '%Y%m' ) AND DATE_FORMAT( OPERATION_TIME, '%Y%m' ) = DATE_FORMAT( CURDATE() , '%Y%m' )
</if> </if>
GROUP BY USER_ID GROUP BY USER_ID
ORDER BY (SUM(case when OPERATION_TYPE = 1 then IFNULL(points,0) else 0 end) - SUM(case when OPERATION_TYPE = 0 then IFNULL(points,0) else 0 end)) DESC
) tab ,(select @i:=0) t1 ) tab ,(select @i:=0) t1
GROUP BY tab.points
ORDER BY tab.points DESC
) userRanking ) userRanking
WHERE userRanking.userId = #{userId} WHERE userRanking.userId = #{userId}
</select> </select>
@ -165,18 +163,21 @@
COUNT(1) COUNT(1)
FROM( FROM(
SELECT SELECT
USER_ID, p.points
SUM(case when OPERATION_TYPE = 0 then IFNULL(points,0) else 0 end) totalPointsDeducted, FROM(
SUM(case when OPERATION_TYPE = 1 then IFNULL(points,0) else 0 end) totalPointsAdd SELECT
FROM epdc_points_logs USER_ID,
WHERE DEL_FLAG = 0 (SUM(case when OPERATION_TYPE = 1 then IFNULL(points,0) else 0 end) - SUM(case when OPERATION_TYPE = 0 then IFNULL(points,0) else 0 end)) points
<if test="rankingType != null and rankingType == 0"> FROM epdc_points_logs
AND YEARWEEK(date_format(OPERATION_TIME,'%Y-%m-%d')) = YEARWEEK(now()) WHERE DEL_FLAG = 0
</if> <if test="rankingType != null and rankingType == 0">
<if test="rankingType != null and rankingType == 1"> AND YEARWEEK(date_format(OPERATION_TIME,'%Y-%m-%d')) = YEARWEEK(now())
AND DATE_FORMAT( OPERATION_TIME, '%Y%m' ) = DATE_FORMAT( CURDATE() , '%Y%m' ) </if>
</if> <if test="rankingType != null and rankingType == 1">
GROUP BY USER_ID AND DATE_FORMAT( OPERATION_TIME, '%Y%m' ) = DATE_FORMAT( CURDATE() , '%Y%m' )
</if>
GROUP BY USER_ID
) p GROUP BY p.points
) tab ) tab
</select> </select>
</mapper> </mapper>

Loading…
Cancel
Save