Commit 7d033828 authored by alex yao's avatar alex yao

feat:数据统计-平台积分统计

parent cf8affcd
SELECT
COALESCE(SUM(CASE WHEN DATE(datetime) = CURDATE() THEN point_num ELSE NULL END), 0) AS today_total_points,
COALESCE(SUM(CASE WHEN YEARWEEK(datetime, 1) = YEARWEEK(CURDATE(), 1) THEN point_num ELSE NULL END), 0) AS week_total_points,
COALESCE(SUM(CASE WHEN YEAR(datetime) = YEAR(CURRENT_DATE) AND MONTH(datetime) = MONTH(CURRENT_DATE) THEN point_num ELSE NULL END), 0) AS month_total_points,
COALESCE(SUM(CASE WHEN YEAR(datetime) = YEAR(CURRENT_DATE) THEN point_num ELSE NULL END), 0) AS year_total_points
FROM biz_data_analyze_point_record
WHERE 1=1
<<and member_id = :memberId >>
<<and channel in (:channels)>>
\ No newline at end of file
package cn.com.poc.data_analyze.query;
import java.io.Serializable;
import java.util.List;
/**
* Query Condition class for MemberPointUsageOverallQuery
*/
public class MemberPointUsageOverallQueryCondition implements Serializable {
private static final long serialVersionUID = 1L;
private java.lang.Long memberId;
public java.lang.Long getMemberId() {
return this.memberId;
}
public void setMemberId(java.lang.Long memberId) {
this.memberId = memberId;
}
private List<String> channels;
public List<String> getChannels() {
return channels;
}
public void setChannels(List<String> channels) {
this.channels = channels;
}
}
\ No newline at end of file
package cn.com.poc.data_analyze.query;
import cn.com.yict.framemax.data.model.BaseItemClass;
import javax.persistence.Column;
import javax.persistence.Entity;
import java.io.Serializable;
/**
* Query Item class for MemberPointUsageOverallQuery
*/
@Entity
public class MemberPointUsageOverallQueryItem extends BaseItemClass implements Serializable {
private static final long serialVersionUID = 1L;
/**
* today_total_points
* today_total_points
*/
private java.lang.Double todayTotalPoints;
@Column(name = "today_total_points")
public java.lang.Double getTodayTotalPoints() {
return this.todayTotalPoints;
}
public void setTodayTotalPoints(java.lang.Double todayTotalPoints) {
this.todayTotalPoints = todayTotalPoints;
}
/**
* week_total_points
* week_total_points
*/
private java.lang.Double weekTotalPoints;
@Column(name = "week_total_points")
public java.lang.Double getWeekTotalPoints() {
return this.weekTotalPoints;
}
public void setWeekTotalPoints(java.lang.Double weekTotalPoints) {
this.weekTotalPoints = weekTotalPoints;
}
/**
* month_total_points
* month_total_points
*/
private java.lang.Double monthTotalPoints;
@Column(name = "month_total_points")
public java.lang.Double getMonthTotalPoints() {
return this.monthTotalPoints;
}
public void setMonthTotalPoints(java.lang.Double monthTotalPoints) {
this.monthTotalPoints = monthTotalPoints;
}
/**
* year_total_points
* year_total_points
*/
private java.lang.Double yearTotalPoints;
@Column(name = "year_total_points")
public java.lang.Double getYearTotalPoints() {
return this.yearTotalPoints;
}
public void setYearTotalPoints(java.lang.Double yearTotalPoints) {
this.yearTotalPoints = yearTotalPoints;
}
}
\ No newline at end of file
WITH RECURSIVE DateRange AS (
SELECT :startDate AS date_value
UNION ALL
SELECT DATE_ADD(date_value, INTERVAL 1 DAY)
FROM DateRange
WHERE DATE_ADD(date_value, INTERVAL 1 DAY) <= :endDate
),
pointData AS (
SELECT
DATE(datetime) AS consume_date,
SUM(point_num) AS total_points
FROM
biz_data_analyze_point_record
WHERE 1=1
<< and member_id = :memberId >>
<< and datetime >= :startDate and datetime <= :endDate >>
<< and channel = :channel >>
GROUP BY
DATE(datetime)
)
SELECT
dr.date_value AS dialogue_date,
COALESCE(pd.total_points, 0) AS total_points
FROM
DateRange dr
LEFT JOIN
pointData pd ON dr.date_value = pd.consume_date
ORDER BY
dr.date_value
\ No newline at end of file
package cn.com.poc.data_analyze.query;
import java.io.Serializable;
/**
* Query Condition class for MemberPointUsageQuery
*/
public class MemberPointUsageTrendQueryCondition implements Serializable {
private static final long serialVersionUID = 1L;
private java.lang.String startDate;
public java.lang.String getStartDate() {
return this.startDate;
}
public void setStartDate(java.lang.String startDate) {
this.startDate = startDate;
}
private java.lang.String endDate;
public java.lang.String getEndDate() {
return this.endDate;
}
public void setEndDate(java.lang.String endDate) {
this.endDate = endDate;
}
private java.lang.Long memberId;
public java.lang.Long getMemberId() {
return this.memberId;
}
public void setMemberId(java.lang.Long memberId) {
this.memberId = memberId;
}
private String channel;
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
}
\ No newline at end of file
package cn.com.poc.data_analyze.query;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import cn.com.yict.framemax.data.model.BaseItemClass;
/**
* Query Item class for MemberPointUsageQuery
*/
@Entity
public class MemberPointUsageTrendQueryItem extends BaseItemClass implements Serializable {
private static final long serialVersionUID = 1L;
/**
* dialogue_date
* dialogue_date
*/
private String dialogueDate;
@Column(name = "dialogue_date")
public String getDialogueDate() {
return this.dialogueDate;
}
public void setDialogueDate(String dialogueDate) {
this.dialogueDate = dialogueDate;
}
/**
* total_points
* total_points
*/
private java.lang.Double totalPoints;
@Column(name = "total_points")
public java.lang.Double getTotalPoints() {
return this.totalPoints;
}
public void setTotalPoints(java.lang.Double totalPoints) {
this.totalPoints = totalPoints;
}
}
\ No newline at end of file
...@@ -24,4 +24,8 @@ public interface BizDataAnalyzePointRecordService extends BaseService { ...@@ -24,4 +24,8 @@ public interface BizDataAnalyzePointRecordService extends BaseService {
List<ChannelPointsCountQueryItem> channelPointsCountQuery(ChannelPointsCountQueryCondition condition, PagingInfo pagingInfo); List<ChannelPointsCountQueryItem> channelPointsCountQuery(ChannelPointsCountQueryCondition condition, PagingInfo pagingInfo);
List<DataAnalyzePointRecordQueryItem> dataAnalyzePointRecordQuery(DataAnalyzePointRecordQueryCondition condition, PagingInfo pagingInfo); List<DataAnalyzePointRecordQueryItem> dataAnalyzePointRecordQuery(DataAnalyzePointRecordQueryCondition condition, PagingInfo pagingInfo);
List<MemberPointUsageTrendQueryItem> memberPointUsageTrendQuery(MemberPointUsageTrendQueryCondition condition, PagingInfo pagingInfo);
List<MemberPointUsageOverallQueryItem> memberPointUsageOverallQuery(MemberPointUsageOverallQueryCondition condition, PagingInfo pagingInfo);
} }
\ No newline at end of file
...@@ -103,4 +103,14 @@ public class BizDataAnalyzePointRecordServiceImpl extends BaseServiceImpl ...@@ -103,4 +103,14 @@ public class BizDataAnalyzePointRecordServiceImpl extends BaseServiceImpl
public List<DataAnalyzePointRecordQueryItem> dataAnalyzePointRecordQuery(DataAnalyzePointRecordQueryCondition condition, PagingInfo pagingInfo) { public List<DataAnalyzePointRecordQueryItem> dataAnalyzePointRecordQuery(DataAnalyzePointRecordQueryCondition condition, PagingInfo pagingInfo) {
return this.sqlDao.query(condition, DataAnalyzePointRecordQueryItem.class, pagingInfo); return this.sqlDao.query(condition, DataAnalyzePointRecordQueryItem.class, pagingInfo);
} }
@Override
public List<MemberPointUsageTrendQueryItem> memberPointUsageTrendQuery(MemberPointUsageTrendQueryCondition condition, PagingInfo pagingInfo) {
return this.sqlDao.query(condition, MemberPointUsageTrendQueryItem.class, pagingInfo);
}
@Override
public List<MemberPointUsageOverallQueryItem> memberPointUsageOverallQuery(MemberPointUsageOverallQueryCondition condition, PagingInfo pagingInfo) {
return this.sqlDao.query(condition, MemberPointUsageOverallQueryItem.class, pagingInfo);
}
} }
\ No newline at end of file
package cn.com.poc.expose.aggregate;
import cn.com.poc.data_analyze.domain.DataAnalyzeTimeRange;
import cn.com.poc.data_analyze.query.MemberPointUsageTrendQueryItem;
import cn.com.poc.expose.entity.PlatformPointUsageEntity;
import java.util.List;
import java.util.Map;
/**
* @author alex.yao
* @date 2024/12/23
*/
public interface DataStatisticsService {
/**
* 平台积分使用情况
*
* @param memberId 会员ID
* @param channels 渠道列表
*/
PlatformPointUsageEntity platformPointUsage(Long memberId, List<String> channels);
/**
* 平台积分使用趋势
*/
Map<String, List<MemberPointUsageTrendQueryItem>> platformPointTrend(Long memberId, List<String> channels, DataAnalyzeTimeRange timeRange);
}
package cn.com.poc.expose.aggregate.impl;
import cn.com.poc.common.utils.Assert;
import cn.com.poc.common.utils.DateUtils;
import cn.com.poc.data_analyze.constants.DataAnalyzeTimeRangeEnum;
import cn.com.poc.data_analyze.domain.DataAnalyzeTimeRange;
import cn.com.poc.data_analyze.query.MemberPointUsageOverallQueryCondition;
import cn.com.poc.data_analyze.query.MemberPointUsageOverallQueryItem;
import cn.com.poc.data_analyze.query.MemberPointUsageTrendQueryCondition;
import cn.com.poc.data_analyze.query.MemberPointUsageTrendQueryItem;
import cn.com.poc.data_analyze.service.BizDataAnalyzePointRecordService;
import cn.com.poc.expose.aggregate.DataStatisticsService;
import cn.com.poc.expose.dto.data_statistics.PlatformPointUsageDto;
import cn.com.poc.expose.entity.PlatformPointUsageEntity;
import cn.com.yict.framemax.core.i18n.I18nMessageException;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
* @author alex.yao
* @date 2024/12/23
*/
@Service
public class DataStatisticsServiceImpl implements DataStatisticsService {
@Resource
private BizDataAnalyzePointRecordService bizDataAnalyzePointRecordService;
@Override
public PlatformPointUsageEntity platformPointUsage(Long memberId, List<String> channels) {
MemberPointUsageOverallQueryCondition memberPointUsageOverallQueryCondition = new MemberPointUsageOverallQueryCondition();
memberPointUsageOverallQueryCondition.setMemberId(memberId);
memberPointUsageOverallQueryCondition.setChannels(channels);
List<MemberPointUsageOverallQueryItem> items = bizDataAnalyzePointRecordService.memberPointUsageOverallQuery(memberPointUsageOverallQueryCondition, null);
PlatformPointUsageEntity platformPointUsageEntity = new PlatformPointUsageEntity();
if (CollectionUtils.isNotEmpty(items)) {
MemberPointUsageOverallQueryItem memberPointUsageOverallQueryItem = items.get(0);
platformPointUsageEntity.setToday(memberPointUsageOverallQueryItem.getTodayTotalPoints());
platformPointUsageEntity.setWeek(memberPointUsageOverallQueryItem.getWeekTotalPoints());
platformPointUsageEntity.setMonth(memberPointUsageOverallQueryItem.getMonthTotalPoints());
platformPointUsageEntity.setYear(memberPointUsageOverallQueryItem.getYearTotalPoints());
} else {
platformPointUsageEntity.setToday(0D);
platformPointUsageEntity.setWeek(0D);
platformPointUsageEntity.setMonth(0D);
platformPointUsageEntity.setYear(0D);
}
return platformPointUsageEntity;
}
@Override
public Map<String, List<MemberPointUsageTrendQueryItem>> platformPointTrend(Long memberId, List<String> channels, DataAnalyzeTimeRange timeRange) {
Map<String, List<MemberPointUsageTrendQueryItem>> result = new TreeMap<>();
String startTime;
String endTime;
Date startDate;
Date endDate;
switch (DataAnalyzeTimeRangeEnum.getByType(timeRange.getRangType())) {
case week:
endDate = DateUtils.getTodayEnd();
startDate = DateUtils.getDayStartTime(DateUtils.addDays(endDate, -6));
startTime = DateUtils.formatDate(startDate, DateUtils.yyyy_MM_dd);
endTime = DateUtils.formatDate(endDate, DateUtils.yyyy_MM_dd_HH_mm_ss);
break;
case month:
endDate = DateUtils.getTodayEnd();
startDate = DateUtils.getDayStartTime(DateUtils.addMonth(endDate, -1));
startTime = DateUtils.formatDate(startDate, DateUtils.yyyy_MM_dd);
endTime = DateUtils.formatDate(endDate, DateUtils.yyyy_MM_dd_HH_mm_ss);
break;
case customize:
Assert.notBlank(timeRange.getStartTime());
Assert.notBlank(timeRange.getEndTime());
startTime = timeRange.getStartTime();
endDate = DateUtils.getDayEnd(DateUtils.stringToDateShort(timeRange.getEndTime()));
endTime = DateUtils.formatDate(endDate, DateUtils.yyyy_MM_dd_HH_mm_ss);
break;
default:
throw new I18nMessageException("data-analyze/not.support.rang.type");
}
for (String channel : channels) {
MemberPointUsageTrendQueryCondition memberPointUsageTrendQueryCondition = new MemberPointUsageTrendQueryCondition();
memberPointUsageTrendQueryCondition.setStartDate(startTime);
memberPointUsageTrendQueryCondition.setEndDate(endTime);
memberPointUsageTrendQueryCondition.setMemberId(memberId);
memberPointUsageTrendQueryCondition.setChannel(channel);
List<MemberPointUsageTrendQueryItem> items = bizDataAnalyzePointRecordService.memberPointUsageTrendQuery(memberPointUsageTrendQueryCondition, null);
result.put(channel, items);
}
return result;
}
}
package cn.com.poc.expose.dto.data_statistics;
import java.io.Serializable;
import java.util.List;
/**
* @author alex.yao
* @date 2024/12/23
*/
public class PlatformPointTrendDto implements Serializable {
/**
* 渠道
*/
private String channel;
/**
* 积分使用情况
*/
private List<PointUsage> pointUsages;
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
public List<PointUsage> getPointUsages() {
return pointUsages;
}
public void setPointUsages(List<PointUsage> pointUsages) {
this.pointUsages = pointUsages;
}
}
package cn.com.poc.expose.dto.data_statistics;
import cn.com.poc.data_analyze.domain.DataAnalyzeTimeRange;
import java.util.List;
/**
* @author alex.yao
* @date 2024/12/23
*/
public class PlatformPointTrendRequestDto {
private List<String> channel;
private DataAnalyzeTimeRange timeRange;
public List<String> getChannel() {
return channel;
}
public void setChannel(List<String> channel) {
this.channel = channel;
}
public DataAnalyzeTimeRange getTimeRange() {
return timeRange;
}
public void setTimeRange(DataAnalyzeTimeRange timeRange) {
this.timeRange = timeRange;
}
}
package cn.com.poc.expose.dto.data_statistics;
import java.io.Serializable;
/**
* @author alex.yao
* @date 2024/12/23
*/
public class PlatformPointUsageDto implements Serializable {
/**
* 今日使用量
*/
private Double today;
/**
* 本周使用量
*/
private Double week;
/**
* 本月使用量
*/
private Double month;
/**
* 本年使用量
*/
private Double year;
public Double getToday() {
return today;
}
public void setToday(Double today) {
this.today = today;
}
public Double getWeek() {
return week;
}
public void setWeek(Double week) {
this.week = week;
}
public Double getMonth() {
return month;
}
public void setMonth(Double month) {
this.month = month;
}
public Double getYear() {
return year;
}
public void setYear(Double year) {
this.year = year;
}
}
package cn.com.poc.expose.dto.data_statistics;
/**
* @author alex.yao
* @date 2024/12/23
*/
public class PointUsage {
private String date;
private Double count;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public Double getCount() {
return count;
}
public void setCount(Double count) {
this.count = count;
}
}
package cn.com.poc.expose.entity;
import java.io.Serializable;
/**
* @author alex.yao
* @date 2024/12/23
*/
public class PlatformPointUsageEntity implements Serializable {
/**
* 今日使用量
*/
private Double today;
/**
* 本周使用量
*/
private Double week;
/**
* 本月使用量
*/
private Double month;
/**
* 本年使用量
*/
private Double year;
public Double getToday() {
return today;
}
public void setToday(Double today) {
this.today = today;
}
public Double getWeek() {
return week;
}
public void setWeek(Double week) {
this.week = week;
}
public Double getMonth() {
return month;
}
public void setMonth(Double month) {
this.month = month;
}
public Double getYear() {
return year;
}
public void setYear(Double year) {
this.year = year;
}
}
package cn.com.poc.expose.rest;
import cn.com.poc.expose.dto.data_statistics.PlatformPointTrendDto;
import cn.com.poc.expose.dto.data_statistics.PlatformPointTrendRequestDto;
import cn.com.poc.expose.dto.data_statistics.PlatformPointUsageDto;
import cn.com.yict.framemax.core.rest.BaseRest;
import cn.com.yict.framemax.web.permission.Access;
import cn.com.yict.framemax.web.permission.Permission;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
* 数据统计接口
*
* @author alex.yao
* @date 2024/12/23
*/
@Permission(Access.Safety)
public interface DataStatisticsRest extends BaseRest {
/**
* 平台积分使用情况
*/
PlatformPointUsageDto platformPointUsage(@RequestParam List<String> channels);
/**
* 平台积分使用趋势
*/
List<PlatformPointTrendDto> platformPointTrend(@RequestBody PlatformPointTrendRequestDto dto);
}
package cn.com.poc.expose.rest.impl;
import cn.com.poc.common.utils.Assert;
import cn.com.poc.common.utils.BlContext;
import cn.com.poc.data_analyze.query.MemberPointUsageTrendQueryItem;
import cn.com.poc.expose.aggregate.DataStatisticsService;
import cn.com.poc.expose.dto.data_statistics.PlatformPointTrendDto;
import cn.com.poc.expose.dto.data_statistics.PlatformPointTrendRequestDto;
import cn.com.poc.expose.dto.data_statistics.PlatformPointUsageDto;
import cn.com.poc.expose.dto.data_statistics.PointUsage;
import cn.com.poc.expose.entity.PlatformPointUsageEntity;
import cn.com.poc.expose.rest.DataStatisticsRest;
import cn.com.poc.support.security.oauth.entity.UserBaseEntity;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author alex.yao
* @date 2024/12/23
*/
@Component
public class DataStatisticsRestImpl implements DataStatisticsRest {
@Resource
private DataStatisticsService dataStatisticsService;
@Override
public PlatformPointUsageDto platformPointUsage(List<String> channels) {
Assert.notEmpty(channels);
UserBaseEntity userBaseEntity = BlContext.getCurrentUser();
PlatformPointUsageEntity platformPointUsageEntity = dataStatisticsService.platformPointUsage(userBaseEntity.userId, channels);
PlatformPointUsageDto platformPointUsageDto = new PlatformPointUsageDto();
platformPointUsageDto.setToday(BigDecimal.valueOf(platformPointUsageEntity.getToday()).setScale(2, RoundingMode.HALF_UP).doubleValue());
platformPointUsageDto.setWeek((BigDecimal.valueOf(platformPointUsageEntity.getWeek()).setScale(2, RoundingMode.HALF_UP).doubleValue()));
platformPointUsageDto.setMonth((BigDecimal.valueOf(platformPointUsageEntity.getMonth()).setScale(2, RoundingMode.HALF_UP).doubleValue()));
platformPointUsageDto.setYear((BigDecimal.valueOf(platformPointUsageEntity.getYear()).setScale(2, RoundingMode.HALF_UP).doubleValue()));
return platformPointUsageDto;
}
@Override
public List<PlatformPointTrendDto> platformPointTrend(PlatformPointTrendRequestDto dto) {
Assert.notEmpty(dto.getChannel());
List<PlatformPointTrendDto> result = new ArrayList<>();
UserBaseEntity userBaseEntity = BlContext.getCurrentUser();
Map<String, List<MemberPointUsageTrendQueryItem>> pointTrend = dataStatisticsService.platformPointTrend(userBaseEntity.userId, dto.getChannel(), dto.getTimeRange());
Set<String> keySet = pointTrend.keySet();
for (String channel : keySet) {
PlatformPointTrendDto platformPointTrendDto = new PlatformPointTrendDto();
platformPointTrendDto.setChannel(channel);
List<MemberPointUsageTrendQueryItem> items = pointTrend.get(channel);
List<PointUsage> pointUsages = new ArrayList<>();
for (MemberPointUsageTrendQueryItem item : items) {
PointUsage pointUsage = new PointUsage();
pointUsage.setDate(item.getDialogueDate());
pointUsage.setCount(BigDecimal.valueOf(item.getTotalPoints()).setScale(2, RoundingMode.HALF_UP).doubleValue());
pointUsages.add(pointUsage);
}
platformPointTrendDto.setPointUsages(pointUsages);
result.add(platformPointTrendDto);
}
return result;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment