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 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);
/**
* 积分排行接口0 周排行1 月排行 - 查询用户个人排名
* 积分排行接口0 周排行1 月排行 - 查询用户个人排名名次 积分
*
* @param formDto
* param pageIndex 必选 页码
@ -117,7 +117,7 @@ public interface PointsLogsDao extends BaseDao<PointsLogsEntity> {
EpdcAppPointsRankingUserDTO selectUserPointsRanking(EpdcAppPointsRankingFormDTO formDto);
/**
* 积分排行接口0 周排行1 月排行 - 产生积分记录的总人数
* 积分排行接口0 周排行1 月排行 - 产生积分记录的总人数相同积分做去重处理
*
* @param formDto
* 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.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 积分记录表 积分记录表
@ -236,21 +233,50 @@ public class PointsLogsServiceImpl extends BaseServiceImpl<PointsLogsDao, Points
public EpdcAppPointsRankingResultDTO listPointsRanking(EpdcAppPointsRankingFormDTO formDto) {
int pageIndex = (formDto.getPageIndex() - NumConstant.ONE) * formDto.getPageSize();
formDto.setPageIndex(pageIndex);
// 积分相同,排名相同
EpdcAppPointsRankingResultDTO rangking = new EpdcAppPointsRankingResultDTO();
rangking.setPointsRankingTopTen(baseDao.selectListPointsRanking(formDto));
// 获取排好序的 排行榜数据数据
rangking.setRank(this.sortListPointsRank(formDto));
// 判断当前用户是否产生过积分记录
EpdcAppPointsRankingUserDTO userRang = baseDao.selectUserPointsRanking(formDto);
// 用户产生过积分记录,返回积分排名
if (userRang != null) {
rangking.setPointsRankingUser(userRang);
userRang.setUserId(formDto.getUserId());
userRang.setNickName(formDto.getNickName());
rangking.setCurrentUser(userRang);
} else {
// 未产生过积分排名 总排名+1
rangking.setPointsRankingUser(this.noPointsRecordIsUserRanking(formDto));
rangking.setCurrentUser(this.noPointsRecordIsUserRanking(formDto));
}
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) 过的排名信息
* @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
l.ID id,
r.RULE_DESC ruleDesc,
l.OPERATION_DESC ruleDesc,
l.OPERATION_TYPE operationType,
l.POINTS points,
l.OPERATION_TIME operationTime
FROM
epdc_points_logs l
LEFT JOIN epdc_points_rule r ON l.RULE_CODE = r.RULE_CODE
WHERE l.DEL_FLAG = 0 AND r.DEL_FLAG = 0
WHERE l.DEL_FLAG = 0
AND l.USER_ID = #{userId}
ORDER BY
l.OPERATION_TIME DESC
@ -132,21 +131,19 @@
<select id="selectUserPointsRanking" resultType="com.elink.esua.epdc.dto.result.EpdcAppPointsRankingUserDTO">
SELECT
userRanking.rank,
userRanking.userId,
userRanking.nickName,
userRanking.points
FROM(
SELECT
(@i:=@i+1) rank,
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
FROM(
SELECT
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
FROM epdc_points_logs
WHERE DEL_FLAG = 0
SELECT
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
FROM epdc_points_logs
WHERE DEL_FLAG = 0
<if test="rankingType != null and rankingType == 0">
AND YEARWEEK(date_format(OPERATION_TIME,'%Y-%m-%d')) = YEARWEEK(now())
</if>
@ -154,8 +151,9 @@
AND DATE_FORMAT( OPERATION_TIME, '%Y%m' ) = DATE_FORMAT( CURDATE() , '%Y%m' )
</if>
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
GROUP BY tab.points
ORDER BY tab.points DESC
) userRanking
WHERE userRanking.userId = #{userId}
</select>
@ -165,18 +163,21 @@
COUNT(1)
FROM(
SELECT
USER_ID,
SUM(case when OPERATION_TYPE = 0 then IFNULL(points,0) else 0 end) totalPointsDeducted,
SUM(case when OPERATION_TYPE = 1 then IFNULL(points,0) else 0 end) totalPointsAdd
FROM epdc_points_logs
WHERE DEL_FLAG = 0
<if test="rankingType != null and rankingType == 0">
AND YEARWEEK(date_format(OPERATION_TIME,'%Y-%m-%d')) = YEARWEEK(now())
</if>
<if test="rankingType != null and rankingType == 1">
AND DATE_FORMAT( OPERATION_TIME, '%Y%m' ) = DATE_FORMAT( CURDATE() , '%Y%m' )
</if>
GROUP BY USER_ID
p.points
FROM(
SELECT
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
FROM epdc_points_logs
WHERE DEL_FLAG = 0
<if test="rankingType != null and rankingType == 0">
AND YEARWEEK(date_format(OPERATION_TIME,'%Y-%m-%d')) = YEARWEEK(now())
</if>
<if test="rankingType != null and rankingType == 1">
AND DATE_FORMAT( OPERATION_TIME, '%Y%m' ) = DATE_FORMAT( CURDATE() , '%Y%m' )
</if>
GROUP BY USER_ID
) p GROUP BY p.points
) tab
</select>
</mapper>

Loading…
Cancel
Save