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.

237 lines
12 KiB

package com.example.demo.serviceImpl;
import com.example.demo.domain.entity.Statistics;
import com.example.demo.domain.vo.WorkbenchCard;
import com.example.demo.domain.vo.WorkbenchMarketCard;
import com.example.demo.mapper.StatisticsMapper;
import com.example.demo.mapper.WorkBenchMapper;
import com.example.demo.service.GeneralService;
import com.example.demo.service.StatisticsService;
import com.example.demo.service.WorkbenchService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* @program: gold-java
* @ClassName WorkbenchServiceImpl
* @description:
* @author: Ethan
* @create: 2025−06-18 10:47
* @Version 1.0
**/
@Service
public class WorkbenchServiceImpl implements WorkbenchService {
@Autowired
private WorkBenchMapper workBenchMapper;
@Autowired
private GeneralService generalService;
@Autowired
private StatisticsMapper statisticsMapper;
@Override
public WorkbenchCard getCard(String token, List<String> markets) {
Date date=new Date();
// 获取开始时间和结束时间(当天)
LocalDateTime startOfDay = date.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime()
.with(LocalTime.MIN);
LocalDateTime endOfDay = startOfDay.plusDays(1).minusSeconds(1);
// 获取当前日期
LocalDate today = LocalDate.now();
// 获取当前年份的第一天
LocalDate firstDayOfYear = today.withDayOfYear(1);
Date yearlyStartDate=Date.from(firstDayOfYear.atStartOfDay(ZoneId.systemDefault()).toInstant());
List<WorkbenchMarketCard> marketCards = new ArrayList<>();
// 遍历每个 marketCard 并填充数据
for (String market : markets) {
if (market == null || market.trim().isEmpty()) continue;
// 查询该地区当天的数据
Statistics statistics = statisticsMapper.selectByMarketAndDate(
market,
Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()),
Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant())
);
WorkbenchMarketCard card = new WorkbenchMarketCard();
card.setMarket(market);
if (statistics != null){
// 卡片一:当前金币相关
card.setCurrentPermanent(statistics.getCurrentPermanent());//余量-永久金币
card.setCurrentFreeJune(statistics.getCurrentFreeJune()); //余量-免费六月金币
card.setCurrentFreeDecember(statistics.getCurrentFreeDecember()); //余量-免费十二月金币
card.setCurrentTask(statistics.getCurrentTask()); //余量-任务金币
card.setCurrentFree(card.getCurrentFreeJune() + card.getCurrentFreeDecember()); //余量-免费金币
card.setCurrentGold(card.getCurrentPermanent() + card.getCurrentFree() + card.getCurrentTask()); //余量-总金币
card.setDailyChange(statistics.getDailyChange()); //较前一日变化
// 卡片二:充值相关
card.setRecharge(statistics.getRecharge()); //充值-当日充值
card.setMoney(statistics.getMoney()); //充值-当日金额(永久)
card.setYearlyRecharge(calculateSum(market, "recharge",yearlyStartDate ,date));//充值-全年累计充值
card.setYearlyMoney(calculateSum(market, "money",yearlyStartDate ,date)); //充值-全年累计金额(永久)
// 卡片三:消费与退款
card.setConsumePermanent(statistics.getConsumePermanent());//消费-永久金币
card.setConsumeFreeJune(statistics.getConsumeFreeJune());//消费-免费六月金币
card.setConsumeFreeDecember(statistics.getConsumeFreeDecember());//消费-免费十二月金币
card.setConsumeTask(statistics.getConsumeTask());//消费-任务金币
card.setRefundPermanent(statistics.getRefundPermanent());//退款-永久金币
card.setRefundFreeJune(statistics.getRefundFreeJune());//退款-免费六月金币
card.setRefundFreeDecember(statistics.getRefundFreeDecember());//退款-免费十二月金币
card.setRefundTask(statistics.getRefundTask());//退款-任务金币
//当日总消费
int totalConsume = card.getConsumePermanent() + card.getConsumeFreeJune() + card.getConsumeFreeDecember() + card.getConsumeTask();
//当日总退款
int totalRefund = card.getRefundPermanent() + card.getRefundFreeJune() + card.getRefundFreeDecember() + card.getRefundTask();
card.setDailyConsume(totalConsume - totalRefund);//当日总消耗
card.setYearlyConsume(calculateSum(market, "consume", yearlyStartDate,date));//年累计消费
card.setYearlyRefund(calculateSum(market, "refund",yearlyStartDate ,date));//年累计退款
card.setYearlyReduce(card.getYearlyConsume() - card.getYearlyRefund());//年累计消耗
// 卡片四:人头数相关
card.setRechargeNum(statistics.getRechargeNum());
card.setFirstRecharge(statistics.getFirstRecharge());
card.setYearlyRechargeNum(calculateSum(market,"rechargeNum",yearlyStartDate,date));
// 周环比、日同比
card.setWow(calculateWeekOverWeek(market, date));
card.setDaily(calculateDayOverDay(market, date));
marketCards.add(card);
}
}
return new WorkbenchCard(token, marketCards,markets,date,date);
}
@Override
public WorkbenchCard getGraph(String token, Date startDate, Date endDate, List<String> markets) {
List<WorkbenchMarketCard> marketCards = new ArrayList<>();
for (String market : markets) {
WorkbenchMarketCard cards = new WorkbenchMarketCard();
cards.setMarket(market);
cards.setSumRechargePermanent(calculateSum(market, "money",startDate,endDate));
cards.setSumRechargeFree(calculateSum(market, "rFree",startDate,endDate));
cards.setSumConsumePermanent(calculateSum(market, "cPermanent",startDate,endDate));
cards.setSumConsumeFree(calculateSum(market, "cFree",startDate,endDate));
cards.setSumConsumeTask(calculateSum(market, "cTask",startDate,endDate));
marketCards.add( cards);
}
return new WorkbenchCard(token, marketCards,markets,startDate,endDate);
}
/*
根据类型获取统计数据
*/
@Override
public Integer calculateSum(String market, String type, Date startDate,Date endDate) {
//判断类型
switch
(type) {
case "recharge": //获取累计充值
return workBenchMapper.sumRecharge(market, startDate,endDate);
case "money": //获取累计金额(永久)
return workBenchMapper.sumMoney(market,startDate,endDate);
case "rFree": //获取累计充值(免费)
return workBenchMapper.sumRecharge(market,startDate,endDate)-
workBenchMapper.sumMoney(market,startDate,endDate);
case "consume": //获取累计消费
return workBenchMapper.sumConsume(market,startDate,endDate);
case "cPermanent": //获取累计消费-永久
return workBenchMapper.sumCPermanent(market,startDate,endDate);
case "cFree": //获取累计消费- 免费
return workBenchMapper.sumCFree(market,startDate,endDate);
case "cTask": //获取累计消费- 任务
return workBenchMapper.sumCTask(market,startDate,endDate);
case "refund": //获取累计退款
return workBenchMapper.sumRefund(market,startDate,endDate);
case "rechargeNum": //获取累计充值人数
return workBenchMapper.countRechargeNum(market,startDate,endDate);
default:
return 0;
}
}
/*
获取该日期该市场的日同比
*/
@Override
public Integer calculateDayOverDay(String market, Date date) {
//传入日期的数据
LocalDateTime startTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().with(LocalTime.MIN);
LocalDateTime endTime= startTime.plusDays(1).minusSeconds(1);
Statistics currentStatistics = statisticsMapper.selectByMarketAndDate(market,
Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()),
Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant()));
//空数据或数量为零,为避免0除数错误,返回增长率为0
if (currentStatistics == null || currentStatistics.getRechargeNum() == null) {
return 0;
}
Date yesterday = addDays(date, -1); //传入日期减一,昨天
Statistics yesterdayStatistics = statisticsMapper.selectByMarketAndDate(market,
Date.from(yesterday.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().with(LocalTime.MIN).atZone(ZoneId.systemDefault()).toInstant()),
Date.from(yesterday.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().with(LocalTime.MAX).atZone(ZoneId.systemDefault()).toInstant()));
//空数据或数量为零,为避免0除数错误,返回增长率为0
if (yesterdayStatistics == null || yesterdayStatistics.getRechargeNum() == null || yesterdayStatistics.getRechargeNum() == 0) {
return 0;
}
//计算增长率
double rate = ((double) (currentStatistics.getRechargeNum() - yesterdayStatistics.getRechargeNum()) / yesterdayStatistics.getRechargeNum()) * 100;
return (int) Math.round(rate);
}
/*
获取该日期该市场的周环比
*/
@Override
public Integer calculateWeekOverWeek(String market, Date date) {
//获取传入日期所在周的周一
Date thisWeekStart = getStartOfWeek(date);
//获取传入日期上一周的周一
Date lastWeekStart = addDays(thisWeekStart, -7);
// 获取本周周一至今天的充值人数总和
int thisWeekTotal = statisticsMapper.countRechargeNum(market, thisWeekStart, date);
// 获取上周同一时间段的充值人数总和
int lastWeekTotal = statisticsMapper.countRechargeNum(market, lastWeekStart, addDays(date, -7));
if (lastWeekTotal == 0) {
return 0; // 避免除以零的情况
}
double rate = ((double) (thisWeekTotal - lastWeekTotal) / lastWeekTotal) * 100;
return (int) Math.round(rate);
}
@Override
public Date addDays(Date date, int days) {
Calendar cal = Calendar.getInstance();
cal.setTime(date); //设置日期为传入的日期
cal.add(Calendar.DATE, days); //传入日期加上多少天
return cal.getTime(); //返回处理后的日期
}
@Override
public Date getStartOfWeek(Date date) {
// 将 Date 转换为 LocalDate
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// 获取周一作为一周的第一天
DayOfWeek firstDayOfWeek = DayOfWeek.MONDAY;
// 返回所在周的第一天,转换回Date格式
return Date.from(localDate.with(firstDayOfWeek)
.atStartOfDay(ZoneId.systemDefault())
.toInstant());
}
}