金币系统后端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

300 lines
12 KiB

package com.example.demo.serviceImpl;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import com.example.demo.Util.CheckIfNullUtil;
import com.example.demo.domain.vo.Meium;
import com.example.demo.domain.vo.Statistics;
import com.example.demo.domain.vo.Statisticss;
import com.example.demo.domain.vo.SumCoin;
import com.example.demo.mapper.StatisticsMapper;
import com.example.demo.sevice.StatisticsService;
import lombok.RequiredArgsConstructor;
import org.apache.ibatis.annotations.Param;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.List;
@RequiredArgsConstructor
@Transactional
@Service
@CacheConfig(cacheNames = "statistics")
public class StatisticsServiceImpl implements StatisticsService {
private final StatisticsMapper statisticsMapper;
@Cacheable(key="#root.method.name")
@Override
public Statistics getStatistics() {
Statistics statistics = new Statistics();
// 全年累计数据
Statistics yearStats = CheckIfNullUtil.defaultIfNull( statisticsMapper.getTotalYearCoin(), new Statistics());
statistics.setRechargeSumCoin(yearStats.getRechargeSumCoin());
statistics.setFreeSumCoin(yearStats.getFreeSumCoin());
statistics.setTaskSumCoin(yearStats.getTaskSumCoin());
statistics.setTotalSumCoin(yearStats.getTotalSumCoin());
// 昨日新增数据
Statistics yesterdayStats = CheckIfNullUtil.defaultIfNull( statisticsMapper.getYesterdayNewCoin(), new Statistics());
statistics.setRechargeYesterdaySumCoin(yesterdayStats.getRechargeYesterdaySumCoin());
statistics.setFreeYesterdaySumCoin(yesterdayStats.getFreeYesterdaySumCoin());
statistics.setTaskYesterdaySumCoin(yesterdayStats.getTaskYesterdaySumCoin());
statistics.setTotalYesterdaySumCoin(yesterdayStats.getTotalYesterdaySumCoin());
// 年累计充值人数
statistics.setRechargeCount(statisticsMapper.getYearRechargeCount());
// 本周和上周充值人数
int thisWeekCount = statisticsMapper.getRechargeCountThisWeek();
int lastWeekCount = statisticsMapper.getRechargeCountLastWeek();
statistics.setRechargeCountThisWeek(thisWeekCount);
statistics.setRechargeCountLastWeek(lastWeekCount);
// 周同比计算
BigDecimal weekOverWeekRate = BigDecimal.ZERO;//初始化为 0 表示如果没有足够的数据(如 lastWeekCount == 0),默认周同比增长率为 0。
if (lastWeekCount > 0) {
weekOverWeekRate = BigDecimal.valueOf((double) (thisWeekCount - lastWeekCount) / lastWeekCount * 100)//将计算结果转换为 BigDecimal 类型,保证高精度。
.setScale(2, BigDecimal.ROUND_HALF_UP); // 保留两位小数
}
statistics.setWeekOverWeekRate(weekOverWeekRate);
//今日和昨日充值人数
int todayCount = statisticsMapper.getRechargeCountToday();
int yesterdayCount = statisticsMapper.getRechargeCountYesterday();
int firstYesterdayCount =statisticsMapper.getFirstRechargeCountYesterday();
statistics.setRechargeCountToday(todayCount);
statistics.setRechargeCountYesterday(yesterdayCount);
statistics.setFirstRechargeCountYesterday(firstYesterdayCount);
//日环比计算
BigDecimal dayOverDayRate = BigDecimal.ZERO;
if (yesterdayCount > 0) {
dayOverDayRate = BigDecimal.valueOf((double) (todayCount - yesterdayCount) / yesterdayCount * 100).
setScale(2, BigDecimal.ROUND_HALF_UP);
}
statistics.setDayOverDayRate(dayOverDayRate);
return statistics;
}
@Cacheable(key="#root.method.name")
@Override
public Statisticss stats() {
Statisticss a = new Statisticss();
a.setCoinSystemSum(statisticsMapper.getCoinSystemSum());
a.setERPSum(statisticsMapper.getERPSum());
a.setHomilyChartSum(statisticsMapper.getHomilyChartSum());
a.setHomilyLinkSum(statisticsMapper.getHomilyLinkSum());
return a;
}
//----------------------------------------------------------------------------------------------------//
@Cacheable(key="#root.method.name")
public SumCoin getSumCoin(){
return statisticsMapper.getSumCoin();
}
@Cacheable(key="#root.method.name")
@Override
public SumCoin getYearConsumeCoin() {
return statisticsMapper.getYearConsumeCoin();
}
@Cacheable(key="#root.method.name")
@Override
public SumCoin getDayConsumeCoin() {
return statisticsMapper.getDayConsumeCoin();
}
@Override
public List<SumCoin> getMediuPayCoin() {
return List.of();
}
@Override
public List<SumCoin> getMediuConsumeCoin() {
return List.of();
}
public SumCoin getMess(Integer jwcode){
return statisticsMapper.getMess(jwcode);
}
@Cacheable(key="#root.method.name")
@Override
public List<SumCoin> getMediumAreaPay() {
return statisticsMapper.getMediumAreaPay();
}
@Cacheable(key="#root.method.name")
@Override
public List<SumCoin> getMediumAreaConsume() {
return statisticsMapper.getMediumAreaConsume();
}
@Override
public List<Meium> getMee( Meium meium) {
if(0 == (meium.getUpdateType())){
if("免费金币".equals(meium.getType())){
return statisticsMapper.getBuyAndFree(meium.getSearchStartTime(),meium.getSearchEndTime());
}else if("充值金币".equals(meium.getType())){
return statisticsMapper.getBuyAndRecharge(meium.getSearchStartTime(),meium.getSearchEndTime());
}else if("任务金币".equals(meium.getType())){
return statisticsMapper.getBuyAndTask(meium.getSearchStartTime(),meium.getSearchEndTime());
}else{
return statisticsMapper.getBuy(meium.getSearchStartTime(),meium.getSearchEndTime());
}
}else if(1 == (meium.getUpdateType())){
if("免费金币".equals(meium.getType())){
return statisticsMapper.getPayAndFree(meium.getSearchStartTime(),meium.getSearchEndTime());
}else if("充值金币".equals(meium.getType())){
return statisticsMapper.getPayAndRecharge(meium.getSearchStartTime(),meium.getSearchEndTime());
}else if("任务金币".equals(meium.getType())){
return statisticsMapper.getPayAndTask(meium.getSearchStartTime(),meium.getSearchEndTime());
}else{
return statisticsMapper.getPay(meium.getSearchStartTime(),meium.getSearchEndTime());
}
} else
return null;
}
@Override
public List<SumCoin> getMediu() {
return List.of();
}
// public List<SumCoin> getCoinTime( SumCoin sumcoin) {
//
// System.out.println(sumcoin+"-------sumcoin----");
// Date searchStartTime=sumcoin.getSearchStartTime();
// Date searchEndTime=sumcoin.getSearchEndTime();
// String updateType=sumcoin.getUpdateType();
//
//// //提供开始时间与结束时间
////// if(searchStartTime!=null && searchEndTime!=null){
//// //计算两个时间点之间的差值
//// long daysBetween = ChronoUnit.DAYS.between(searchStartTime, searchEndTime);
//
//// 提供开始时间与结束时间
//
//
// // 使用 Calendar 清除时间和时区的影响
// Calendar startCal = Calendar.getInstance();
// startCal.setTime(searchStartTime);
// startCal.set(Calendar.HOUR_OF_DAY, 0);
// startCal.set(Calendar.MINUTE, 0);
// startCal.set(Calendar.SECOND, 0);
// startCal.set(Calendar.MILLISECOND, 0);
//
// Calendar endCal = Calendar.getInstance();
// endCal.setTime(searchEndTime);
// endCal.set(Calendar.HOUR_OF_DAY, 0);
// endCal.set(Calendar.MINUTE, 0);
// endCal.set(Calendar.SECOND, 0);
// endCal.set(Calendar.MILLISECOND, 0);
//
// // 计算两个时间点之间的天数差异
// long diffInMillies = endCal.getTimeInMillis() - startCal.getTimeInMillis();
// long daysBetween = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS);
//
//
// //年
// if(daysBetween>100 || searchStartTime==null & searchEndTime==null){
// if("消费".equals(updateType)){
// return statisticsMapper.getMediuConsumeCoin();
// }else if("充值".equals(updateType)){
// return statisticsMapper.getMediuPayCoin();
// }
//
// }else {
// if ("消费".equals(updateType)) {
// return statisticsMapper.getMediuCounsumeCoinyue(searchStartTime,searchEndTime);
// } else if ("充值".equals(updateType)) {
// return statisticsMapper.getMediuPayCoinyue(searchStartTime,searchEndTime);
// }
// }
//
//
//
//
//
//
// return null;
//
// }
public List<SumCoin> getCoinTime(SumCoin sumcoin) {
System.out.println(sumcoin + "-------sumcoin----");
Date searchStartTime = sumcoin.getSearchStartTime();
Date searchEndTime = sumcoin.getSearchEndTime();
Integer updateType = sumcoin.getUpdateType();
// 如果开始时间和结束时间都为空,则直接返回默认统计结果
if (searchStartTime == null && searchEndTime == null) {
if (1 == updateType) {
return statisticsMapper.getMediuConsumeCoin(searchStartTime,searchEndTime);
} else if (0 == updateType) {
return statisticsMapper.getMediuPayCoin(searchStartTime,searchEndTime);
}
return null; // 或者抛出异常,取决于业务需求
}
// 如果只有其中一个时间为null,则可能需要处理或抛出异常,这里假设不允许这种情况
if (searchStartTime == null || searchEndTime == null) {
throw new IllegalArgumentException("开始时间和结束时间必须同时为空或不为空");
}
// 使用 Calendar 清除时间和时区的影响
Calendar startCal = Calendar.getInstance();
startCal.setTime(searchStartTime);
startCal.set(Calendar.HOUR_OF_DAY, 0);
startCal.set(Calendar.MINUTE, 0);
startCal.set(Calendar.SECOND, 0);
startCal.set(Calendar.MILLISECOND, 0);
Calendar endCal = Calendar.getInstance();
endCal.setTime(searchEndTime);
endCal.set(Calendar.HOUR_OF_DAY, 0);
endCal.set(Calendar.MINUTE, 0);
endCal.set(Calendar.SECOND, 0);
endCal.set(Calendar.MILLISECOND, 0);
// 计算两个时间点之间的天数差异
long diffInMillies = endCal.getTimeInMillis() - startCal.getTimeInMillis();
long daysBetween = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS);
// 根据条件选择查询方法
if (daysBetween > 100) {
if (1 == updateType) {
return statisticsMapper.getMediuConsumeCoin(searchStartTime,searchEndTime);
} else if (0 == updateType) {
return statisticsMapper.getMediuPayCoin(searchStartTime,searchEndTime);
}
} else {
if (1 == updateType) {
return statisticsMapper.getMediuCounsumeCoinyue(searchStartTime, searchEndTime);
} else if (0 == updateType) {
return statisticsMapper.getMediuPayCoinyue(searchStartTime, searchEndTime);
}
}
// 如果没有匹配的updateType,返回null或抛出异常,取决于业务需求
return null;
}
}