Browse Source

Merge branch 'refs/heads/lijianlin/feature-20250710152503-二期工作台与部分权限' into milestone-20250711-金币重构二期

lijianlin/feature-20250710152503-二期工作台与部分权限
lijianlin 3 weeks ago
parent
commit
ecba540c58
  1. 51
      src/main/java/com/example/demo/controller/AuditController.java
  2. 28
      src/main/java/com/example/demo/controller/WorkbenchController.java
  3. 2
      src/main/java/com/example/demo/mapper/AuditMapper.java
  4. 2
      src/main/java/com/example/demo/mapper/GeneralMapper.java
  5. 4
      src/main/java/com/example/demo/mapper/WorkBenchMapper.java
  6. 15
      src/main/java/com/example/demo/service/StatisticsService.java
  7. 5
      src/main/java/com/example/demo/service/WorkbenchService.java
  8. 17
      src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java
  9. 301
      src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java
  10. 94
      src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java
  11. 3
      src/main/resources/mapper/AuditMapper.xml
  12. 9
      src/main/resources/mapper/WorkBenchMapper.xml

51
src/main/java/com/example/demo/controller/AuditController.java

@ -1,14 +1,22 @@
package com.example.demo.controller;
import com.example.demo.Util.JWTUtil;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.vo.*;
import com.example.demo.service.AuditService;
import com.github.pagehelper.PageInfo;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.Arrays;
import java.util.List;
/**
* @program: gold-java
@ -39,37 +47,68 @@ public class AuditController {
}
//多条件查询充值审核订单列表
@PostMapping("selectRecharge")
public PageInfo<RechargeAudit> searchRechargeAudit(
@RequestBody Page page) {
public PageInfo<RechargeAudit> searchRechargeAudit (
@RequestBody Page page) throws Exception {
Integer pageNum = page.getPageNum();
Integer pageSize = page.getPageSize();
RechargeAudit rechargeAudit = page.getRechargeAudit();
//解token权限
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
if (admin != null) {
List<String> list = Arrays.asList(admin.getMarkets().split(","));
rechargeAudit.setMarkets(list);
}
return auditService.selectRechargeBy(pageNum, pageSize, rechargeAudit);
} //多条件查询退款审核订单列表
@PostMapping("selectRefund")
public PageInfo<RefundAudit> searchRefundAudit(
@RequestBody Page page) {
public PageInfo<RefundAudit> searchRefundAudit(@RequestBody Page page) throws Exception {
Integer pageNum = page.getPageNum();
Integer pageSize = page.getPageSize();
RefundAudit refundAudit = page.getRefundAudit();
//解token权限
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
if (admin != null) {
List<String> list = Arrays.asList(admin.getMarkets().split(","));
refundAudit.setMarkets(list);
}
return auditService.selectRefundBy(pageNum, pageSize, refundAudit);
}
//充值审核合计数
@PostMapping("sumRechargeGold")
public Gold sumRechargeGold(@RequestBody Page page) {
public Gold sumRechargeGold(@RequestBody Page page)throws Exception {
Integer pageNum = page.getPageNum();
Integer pageSize = page.getPageSize();
RechargeAudit rechargeAudit = page.getRechargeAudit();
//解token权限
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
if (admin != null) {
List<String> list = Arrays.asList(admin.getMarkets().split(","));
rechargeAudit.setMarkets(list);
}
return auditService.sumRechargeGold(pageNum, pageSize, rechargeAudit);
}
//退款审核合计数
@PostMapping("sumRefundGold")
public Gold sumRefundGold(@RequestBody Page page) {
public Gold sumRefundGold(@RequestBody Page page) throws Exception{
Integer pageNum = page.getPageNum();
Integer pageSize = page.getPageSize();
RefundAudit refundAudit = page.getRefundAudit();
//解token权限
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
if (admin != null) {
List<String> list = Arrays.asList(admin.getMarkets().split(","));
refundAudit.setMarkets(list);
}
return auditService.sumRefundGold(pageNum, pageSize, refundAudit);
}
}

28
src/main/java/com/example/demo/controller/WorkbenchController.java

@ -1,11 +1,13 @@
package com.example.demo.controller;
import com.example.demo.Util.JWTUtil;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.vo.WorkbenchCard;
import com.example.demo.mapper.StatisticsMapper;
import com.example.demo.service.GeneralService;
import com.example.demo.service.StatisticsService;
import com.example.demo.service.WorkbenchService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -13,6 +15,8 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.Date;
import java.util.List;
@ -47,15 +51,13 @@ public class WorkbenchController {
获取各地区工作台卡片的数据
*/
@PostMapping("getCard")
public ResponseEntity<WorkbenchCard> card1(@RequestBody WorkbenchCard workbench,
@AuthenticationPrincipal Admin admin) {
if (admin == null) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(null);
}
String account = admin.getAccount();
public ResponseEntity<WorkbenchCard> card1(@RequestBody WorkbenchCard workbench) throws Exception{
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
String account = admin.getAccount();
//获取当前用户的市场列表
List<String> markets = generalService.getAdminMarket(account);
List<String> markets = workbenchService.getAdminMarket(account);
WorkbenchCard result;
//判断是否是总部
if (markets != null && markets.contains("总部")) {
@ -79,15 +81,5 @@ public class WorkbenchController {
WorkbenchCard result =workbenchService.getGraph(workbench.getStartDate(),workbench.getEndDate(),workbench.getMarkets());
return ResponseEntity.ok(result);
}
/*
更新统计表并获取卡片数据
*/
/*@PostMapping("updateCard")
public ResponseEntity<WorkbenchCard> updateCard(@RequestBody WorkbenchCard workbench){
statisticsService.runHourlyTaskPart1(); //更新余量数据
statisticsService.runHourlyTaskPart2(); //更新余量外数据
WorkbenchCard result =workbenchService.getCard(workbench.getMarkets()); //获取卡片数据
return ResponseEntity.ok(result);
}*/
}

2
src/main/java/com/example/demo/mapper/AuditMapper.java

@ -21,6 +21,8 @@ import java.util.List;
@Mapper
public interface AuditMapper {
//获取用户的地区权限列表
List<String> getAdminMarket(String account) ;
//根据订单号查未审核订单
UserGoldRecord selectOrderByOrderCode(String orderCode);
//根据订单号查订单

2
src/main/java/com/example/demo/mapper/GeneralMapper.java

@ -22,7 +22,7 @@ public interface GeneralMapper {
//获取活动
List<String> getActivity();
//获取用户的地区权限列表
//获取管理员的地区权限列表
String getAdminMarket(String account);
//获取角色地区列表
String getRoleMarket(Integer roleId);

4
src/main/java/com/example/demo/mapper/WorkBenchMapper.java

@ -19,6 +19,10 @@ import java.util.List;
@Mapper
public interface WorkBenchMapper {
//获取所有用户地区
List<String> getMarket();
//获取用户的地区权限列表
String getAdminMarket(String account);
//给定时间范围内的该地区充值金币数永久+免费
Integer sumRecharge(String market, Date startDate, Date endDate);
//给定时间范围内的该地区充值金额永久金币数

15
src/main/java/com/example/demo/service/StatisticsService.java

@ -23,20 +23,5 @@ public interface StatisticsService {
public void runHourlyTaskYear();
//0点执行定时任务更新近一周part2数据
public void runDailyTaskPart2();
//查询某地区某天是否已存在统计数据
public Statistics getExistStatistics(String market,Date date);
//新增或更新或不修改某地区某天part1统计数据
public void saveStatisticsPart1(String market, Date date);
//新增或更新或不修改某地区某天年度统计数据
public void saveStatisticsYear(String market,Date yearlyStartDate, Date date);
//新增或更新或不修改某地区某天part2统计数据
public void saveStatisticsPart2(String market, Date date);
//根据地区与日期获取part1(余量属性)统计数据
public Statistics getStatisticsPart1(String market, Date date);
//根据地区与日期获取part2(余量外属性)统计数据
public Statistics getStatisticsPart2(String market, Date date);
//根据地区与日期获取全年累计统计数据
public Statistics getYearlyStatistics(String market,Date yearlyStartDate, Date date);
}

5
src/main/java/com/example/demo/service/WorkbenchService.java

@ -19,6 +19,8 @@ import java.util.Map;
public interface WorkbenchService {
//获取用户的地区权限列表
List<String> getAdminMarket(String account) ;
//获取不同地区的工作台统计卡片
WorkbenchCard getCard(List<String> markets );
//缓存卡片数据
@ -27,8 +29,7 @@ public interface WorkbenchService {
WorkbenchMarketCard createWorkbenchMarketCard(String market, Statistics currentStatistics,Statistics ydayStatistics, Date currentDate);
//获取不同地区的工作台柱状图数据根据类型起止时间地区查询
WorkbenchCard getGraph(Date startDate, Date endDate, List<String> markets);
//根据类型获取年初至今的统计数据
Map<String, Integer> calculateAllSum(String market, Date startDate, Date endDate);
//获取该日期该市场的日环比
Integer calculateDayOverDay(String market,Date date);
//获取总体日环比

17
src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java

@ -139,9 +139,7 @@ public class AuditServiceImpl implements AuditService {
*/
@Override
public PageInfo<RechargeAudit> selectRechargeBy(Integer pageNum, Integer pageSize, RechargeAudit rechargeAudit) {
String account = adminService.getCurrentAdminAccount();
List<String> markets = generalService.getAdminMarket(account);
rechargeAudit.setMarkets(markets);
PageHelper.startPage(pageNum, pageSize);
List<RechargeAudit> rechargeAudits = auditMapper.selectRechargeBy(pageNum, pageSize, rechargeAudit);
// rechargeAudit.setFreeGold(rechargeAudit.getFreeJune()+rechargeAudit.getFreeDecember());
@ -152,9 +150,9 @@ public class AuditServiceImpl implements AuditService {
*/
@Override
public PageInfo<RefundAudit> selectRefundBy(Integer pageNum, Integer pageSize, RefundAudit refundAudit) {
String account = adminService.getCurrentAdminAccount();
List<String> markets = generalService.getAdminMarket(account);
refundAudit.setMarkets(markets);
PageHelper.startPage(pageNum, pageSize);
List<RefundAudit> refundAudits = auditMapper.selectRefundBy(pageNum, pageSize, refundAudit);
@ -166,9 +164,7 @@ public class AuditServiceImpl implements AuditService {
*/
@Override
public Gold sumRechargeGold(Integer pageNum, Integer pageSize, RechargeAudit rechargeAudit) {
String account = adminService.getCurrentAdminAccount();
List<String> markets = generalService.getAdminMarket(account);
rechargeAudit.setMarkets(markets);
Gold gold = new Gold();
//获取充值审核订单列表
List<RechargeAudit> rechargeAudits = auditMapper.selectRechargeBy(1, 500000, rechargeAudit);
@ -202,9 +198,6 @@ public class AuditServiceImpl implements AuditService {
*/
@Override
public Gold sumRefundGold(Integer pageNum, Integer pageSize, RefundAudit refundAudit) {
String account = adminService.getCurrentAdminAccount();
List<String> markets = generalService.getAdminMarket(account);
refundAudit.setMarkets(markets);
Gold gold = new Gold();
//获取充值审核订单列表
List<RefundAudit> refundAudits = auditMapper.selectRefundBy(1, 500000, refundAudit);

301
src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java

@ -33,10 +33,7 @@ public class StatisticsServiceImpl implements StatisticsService {
private static final Logger log = LoggerFactory.getLogger(StatisticsServiceImpl.class);
@Autowired
private StatisticsMapper statisticsMapper;
@Autowired
private GeneralService generalService;
@Autowired
private WorkbenchService workbenchService;
/*
每小时第十分执行定时任务更新当天part1数据
@ -58,6 +55,7 @@ public class StatisticsServiceImpl implements StatisticsService {
@Override
@Scheduled(cron = "0 10 * * * ?") // 每小时执行一次
public void runHourlyTaskPart2() {
//设定起止时间 当天000000至235959
LocalDate today = LocalDate.now();
Date start = Date.from(today.atStartOfDay(ZoneId.systemDefault()).toInstant());
Date end = Date.from(
@ -103,299 +101,4 @@ public class StatisticsServiceImpl implements StatisticsService {
}
}
/*
查询某地区某天已存在的统计数据
*/
@Override
public Statistics getExistStatistics(String market, Date date) {
LocalDateTime startTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().with(LocalTime.MIN);
LocalDateTime endTime= startTime.plusDays(1).minusSeconds(1);
return statisticsMapper.selectByMarketAndDate(market,
Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()),
Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant()));
}
/*
新增或更新或不修改某地区某天part1统计数据
*/
@Override
public void saveStatisticsPart1(String market, Date date) {
//获取该地区该日期part1(余量属性)统计数据
Statistics newStats=getStatisticsPart1(market,date);
//获取该地区该日期已存在的数据
Statistics existStats = getExistStatistics(market, date);
//判断是否存在已存在的数据
if(existStats==null){
//没有记录新增
statisticsMapper.insertPart1(newStats );
}else {
//判断新旧数据part1部分(余量属性)是否一致
if (!isSameStatisticsPart1(existStats,newStats)){
statisticsMapper.updatePart1(newStats);
}else{
System.out.println("数据未发生改变");
}
}
}
/*
新增或更新或不修改某地区某天年度统计数据
*/
@Override
public void saveStatisticsYear(String market,Date yearlyStartDate, Date date) {
//获取该地区该日期年度统计数据
Statistics newStats=getYearlyStatistics(market,yearlyStartDate,date);
//获取该地区该日期已存在的数据
Statistics existStats = getExistStatistics(market, date);
//判断是否存在已存在的数据
if(existStats==null){
//没有记录新增
statisticsMapper.insertYear(newStats );
}else {
//判断新旧数据年度部分是否一致
if (!isSameStatisticsYear(existStats,newStats)){
statisticsMapper.updateYear(newStats);
}else{
System.out.println("数据未发生改变");
}
}
}
/*
新增或更新或不修改某地区某天part2统计数据
*/
@Override
public void saveStatisticsPart2(String market, Date date){
//获取该地区该日期part2(余量外属性)统计数据
Statistics newStats=getStatisticsPart2(market,date);
//获取该地区该日期已存在的数据
Statistics existStats = getExistStatistics(market, date);
//判断是否存在已存在的数据
if(existStats==null){
//没有记录新增
statisticsMapper.insertPart2(newStats );
}else {
//判断新旧数据part2部分(余量外属性)是否一致
if (!isSameStatisticsPart2(existStats,newStats)){
statisticsMapper.updatePart2(newStats);
}else{
// existStats.setUpdateTime(date);
// statisticsMapper.updatePart2(existStats);
System.out.println("数据未发生改变");
}
}
}
@Override
public Statistics getStatisticsPart1(String market, Date date) {
//获取日期
LocalDate localDate=date.toInstant()
.atZone(ZoneId.of("Asia/Shanghai")) // 使用系统默认时区
.toLocalDate();
//初始化Statistics对象
Statistics statistics = new Statistics();
statistics.setMarket(market);
statistics.setCurrentDatetime(localDate);
//计算属性
//当前金币余量
Integer currentGold = statisticsMapper.sumCurrentPermanentGold(market)+
statisticsMapper.sumCurrentFreeJune( market)+
statisticsMapper.sumCurrentFreeDecember(market)+
statisticsMapper.sumCurrentTaskGold( market);
statistics.setCurrentGold(currentGold);
//较前一日变化
Date yesterday =generalService.getYesterday();
//把yesterday改为昨天的开始时间和结束时间
LocalDateTime startTime = yesterday.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().with(LocalTime.MIN);
LocalDateTime endTime= startTime.plusDays(1).minusSeconds(1);
//昨天金币余量
Statistics ydayStats = statisticsMapper.selectByMarketAndDate(market, Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()),
Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant()));
Integer yesterdayGold=0;
if (ydayStats != null) {
yesterdayGold = ydayStats.getCurrentGold();
}
Integer dailyChange = currentGold - yesterdayGold;
statistics.setDailyChange(dailyChange);
//当前永久金币
Integer currentPermanent = statisticsMapper.sumCurrentPermanentGold(market);
statistics.setCurrentPermanent(currentPermanent);
//当前免费六月金币
Integer currentFreeJune = statisticsMapper.sumCurrentFreeJune(market);
statistics.setCurrentFreeJune(currentFreeJune);
//当前免费十二月金币
Integer currentFreeDecember = statisticsMapper.sumCurrentFreeDecember(market);
statistics.setCurrentFreeDecember(currentFreeDecember);
//当前任务金币
Integer currentTask = statisticsMapper.sumCurrentTaskGold(market);
statistics.setCurrentTask(currentTask);
return statistics;
}
/*
根据地区与日期获取part2(余量外属性)统计数据
*/
@Override
public Statistics getStatisticsPart2(String market, Date date) {
//获取日期
LocalDate localDate=date.toInstant()
.atZone(ZoneId.of("Asia/Shanghai")) // 使用系统默认时区
.toLocalDate();
//把date改为当天的开始时间和结束时间
LocalDateTime startTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().with(LocalTime.MIN);
LocalDateTime endTime= startTime.plusDays(1).minusSeconds(1);
//定义审核状态列表
List<Integer> auditStatusList = new ArrayList<>();
auditStatusList.add(1); // 审核通过
auditStatusList.add(3); // 外部传入默认通过
//查询当天该地区审核通过的所有数据
List<UserGoldRecord> records = statisticsMapper.findByMarketAndAuditStatus(market, auditStatusList,
Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()),Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant()));
//初始化Statistics对象
Statistics statistics = new Statistics();
statistics.setMarket(market);
statistics.setCurrentDatetime(localDate);
//计算属性
//充值相关-当日充值永久+免费
Integer recharge = records.stream()
.filter(record -> record.getType() == 0) // 类型为充值
.mapToInt(record -> record.getPermanentGold() + record.getFreeJune() + record.getFreeDecember() + record.getTaskGold())
.sum();
statistics.setRecharge(recharge);
//充值相关-当日金额永久
Integer money = records.stream()
.filter(record -> record.getType() == 0) // 类型为充值
.mapToInt(UserGoldRecord::getPermanentGold)
.sum();
statistics.setMoney(money);
//消费相关-当日新增消费永久
Integer consumePermanent = records.stream()
.filter(record -> record.getType() == 1) // 类型为消费
.mapToInt(UserGoldRecord::getPermanentGold)
.sum();
statistics.setConsumePermanent(Math.abs(consumePermanent));
//消费相关-当日新增消费六月免费
Integer consumeFreeJune = records.stream()
.filter(record -> record.getType() == 1) // 类型为消费
.mapToInt(UserGoldRecord::getFreeJune)
.sum();
statistics.setConsumeFreeJune(Math.abs(consumeFreeJune));
//消费相关-当日新增消费十二月免费
Integer consumeFreeDecember = records.stream()
.filter(record -> record.getType() == 1) // 类型为消费
.mapToInt(UserGoldRecord::getFreeDecember)
.sum();
statistics.setConsumeFreeDecember(Math.abs(consumeFreeDecember));
//消费相关-当日新增消费任务
Integer consumeTask = records.stream()
.filter(record -> record.getType() == 1) // 类型为消费
.mapToInt(UserGoldRecord::getTaskGold)
.sum();
statistics.setConsumeTask(Math.abs(consumeTask)); // 使用 Math.abs 确保为正数
//退款相关-当日退款永久
Integer refundPermanent = records.stream()
.filter(record -> record.getType() == 2) // 类型为退款
.mapToInt(UserGoldRecord::getPermanentGold)
.sum();
statistics.setRefundPermanent(refundPermanent);
//退款相关-当日退款六月免费
Integer refundFreeJune = records.stream()
.filter(record -> record.getType() == 2) // 类型为退款
.mapToInt(UserGoldRecord::getFreeJune)
.sum();
statistics.setRefundFreeJune(refundFreeJune);
//退款相关-当日退款十二月免费
Integer refundFreeDecember = records.stream()
.filter(record -> record.getType() == 2) // 类型为退款
.mapToInt(UserGoldRecord::getFreeDecember)
.sum();
statistics.setRefundFreeDecember(refundFreeDecember);
//退款相关-当日退款任务
Integer refundTask = records.stream()
.filter(record -> record.getType() == 2) // 类型为退款
.mapToInt(UserGoldRecord::getTaskGold)
.sum();
statistics.setRefundTask(refundTask);
//充值人数
int rechargeNum= statisticsMapper.countRechargeNum(market,Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()),Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant()));
statistics.setRechargeNum(rechargeNum);
//首充人数
int firstRecharge= statisticsMapper.countFirstRecharge(market,Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()),Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant()));
statistics.setFirstRecharge(firstRecharge);
return statistics;
}
@Override
public Statistics getYearlyStatistics(String market,Date yearlyStartDate, Date date) {
//获取日期
LocalDate localDate=date.toInstant()
.atZone(ZoneId.of("Asia/Shanghai")) // 使用系统默认时区
.toLocalDate();
// 一次性获取全年统计数据从年初到今天
Map<String, Integer> yearlyStats = workbenchService.calculateAllSum(market, yearlyStartDate, date);
//初始化Statistics对象
Statistics statistics = new Statistics();
statistics.setMarket(market);
statistics.setCurrentDatetime(localDate);
statistics.setYearlyRecharge(yearlyStats.getOrDefault("recharge", 0)); // 充值-全年累计充值
statistics.setYearlyMoney(yearlyStats.getOrDefault("money", 0)); // 充值-全年累计金额永久//充值-全年累计金额永久
statistics.setYearlyConsume(yearlyStats.getOrDefault("consume", 0)); // 年累计消费
statistics.setYearlyRefund(yearlyStats.getOrDefault("refund", 0)); // 年累计退款
statistics.setYearlyRechargeNum(yearlyStats.getOrDefault("rechargeNum", 0));//年累计充值人数
return statistics;
}
/*
* 判断两个统计对象part1(余量属性)是否相同
*/
private boolean isSameStatisticsPart1(Statistics oldStats, Statistics newStats) {
return Objects.equals(oldStats.getCurrentGold(), newStats.getCurrentGold()) &&
Objects.equals(oldStats.getCurrentPermanent(), newStats.getCurrentPermanent()) &&
Objects.equals(oldStats.getCurrentFreeJune(), newStats.getCurrentFreeJune()) &&
Objects.equals(oldStats.getCurrentFreeDecember(), newStats.getCurrentFreeDecember()) &&
Objects.equals(oldStats.getCurrentTask(), newStats.getCurrentTask()) &&
Objects.equals(oldStats.getDailyChange(), newStats.getDailyChange()) ;
}
/*
* 判断两个统计对象part2(余量外属性)是否相同
*/
private boolean isSameStatisticsPart2(Statistics oldStats, Statistics newStats) {
return Objects.equals(oldStats.getRecharge(), newStats.getRecharge()) &&
Objects.equals(oldStats.getMoney(), newStats.getMoney()) &&
Objects.equals(oldStats.getConsumePermanent(), newStats.getConsumePermanent()) &&
Objects.equals(oldStats.getConsumeFreeJune(), newStats.getConsumeFreeJune()) &&
Objects.equals(oldStats.getConsumeFreeDecember(), newStats.getConsumeFreeDecember()) &&
Objects.equals(oldStats.getConsumeTask(), newStats.getConsumeTask()) &&
Objects.equals(oldStats.getRefundPermanent(), newStats.getRefundPermanent()) &&
Objects.equals(oldStats.getRefundFreeJune(), newStats.getRefundFreeJune()) &&
Objects.equals(oldStats.getRefundFreeDecember(), newStats.getRefundFreeDecember()) &&
Objects.equals(oldStats.getRefundTask(), newStats.getRefundTask()) &&
Objects.equals(oldStats.getRechargeNum(), newStats.getRechargeNum()) &&
Objects.equals(oldStats.getFirstRecharge(), newStats.getFirstRecharge()) &&
Objects.equals(oldStats.getCurrentGold(), newStats.getCurrentGold()) &&
Objects.equals(oldStats.getDailyChange(), newStats.getDailyChange()) &&
Objects.equals(oldStats.getCurrentPermanent(), newStats.getCurrentPermanent()) &&
Objects.equals(oldStats.getCurrentFreeJune(), newStats.getCurrentFreeJune()) &&
Objects.equals(oldStats.getCurrentFreeDecember(), newStats.getCurrentFreeDecember()) &&
Objects.equals(oldStats.getCurrentTask(), newStats.getCurrentTask());
}
/*
* 判断两个统计对象年度统计是否相同
*/
private boolean isSameStatisticsYear(Statistics oldStats, Statistics newStats) {
return Objects.equals(oldStats.getYearlyRecharge(), newStats.getYearlyRecharge()) &&
Objects.equals(oldStats.getYearlyMoney(), newStats.getYearlyMoney()) &&
Objects.equals(oldStats.getYearlyConsume(), newStats.getYearlyConsume()) &&
Objects.equals(oldStats.getYearlyRefund(), newStats.getYearlyRefund()) &&
Objects.equals(oldStats.getYearlyRechargeNum(), newStats.getYearlyRechargeNum()) ;}
}

94
src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java

@ -10,6 +10,8 @@ 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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
@ -24,6 +26,9 @@ import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @program: gold-java
* @ClassName WorkbenchServiceImpl
@ -35,14 +40,12 @@ import java.util.stream.Collectors;
@Service
public class WorkbenchServiceImpl implements WorkbenchService {
private static final Logger log = LoggerFactory.getLogger(GeneralServiceImpl.class);
private final RedisTemplate<String, WorkbenchCard> redisTemplate;
// private final StatisticsMapper statisticsMapper;
@Autowired
private WorkBenchMapper workBenchMapper;
@Autowired
private GeneralService generalService;
@Autowired
private StatisticsMapper statisticsMapper;
@Autowired
public WorkbenchServiceImpl(RedisTemplate<String, WorkbenchCard> redisTemplate, StatisticsMapper statisticsMapper) {
@ -50,6 +53,32 @@ public class WorkbenchServiceImpl implements WorkbenchService {
this.statisticsMapper = statisticsMapper;
}
private static final String CACHE_KEY = "workbench_card_cache";
@Override
public List<String> getAdminMarket(String account) {
try {
String market = workBenchMapper.getAdminMarket(account);
if (market == null) {
throw new Exception("没有地区权限");
}
List<String> list = Arrays.asList(market.split(","));
//判断是否是总部
if (list != null && list.contains("总部")) {
List<String> allMarkets = workBenchMapper.getMarket(); // 获取所有地区
allMarkets.remove("总部"); // 先移除可能存在的总部
allMarkets.add(0, "总部"); // 将总部添加到列表第一位
list = allMarkets; // 更新list
}
return list;
} catch (Exception e) {
// 记录日志
log.error("获取地区权限失败", e);
// 重新抛出异常或者根据需要返回一个默认值或空列表
throw new RuntimeException("获取地区权限失败", e);
}
}
@Override
public WorkbenchCard getCard( List<String> markets) {
Date date=new Date();
@ -59,24 +88,19 @@ public class WorkbenchServiceImpl implements WorkbenchService {
// 获取开始时间和结束时间昨天
LocalDateTime startOfYday = startOfDay.minusDays(1);
LocalDateTime endOfYday = endOfDay.minusDays(1);
// 获取当前年份的第一天
LocalDate firstDayOfYear = LocalDate.now().withDayOfYear(1);
Date yearlyStartDate = Date.from(firstDayOfYear.atStartOfDay(ZoneId.systemDefault()).toInstant());
// markets = generalService.getAdminMarket();
// 批量获取统计数据
//当天的统计数据
List<Statistics> currentStatsList = statisticsMapper.selectByMarketsAndDate(markets,
Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()),
Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant()));
//昨天的统计数据
List<Statistics> ydayStatsList = statisticsMapper.selectByMarketsAndDate(markets,
Date.from(startOfYday.atZone(ZoneId.systemDefault()).toInstant()),
Date.from(endOfYday.atZone(ZoneId.systemDefault()).toInstant()));
// List<Statistics> 转换为 Map<String, Statistics>
// List<Statistics> 转换为 Map<String, Statistics>以market为键保留第一个出现的数据
Map<String, Statistics> currentStatsMap = currentStatsList.stream()
.collect(Collectors.toMap(Statistics::getMarket, Function.identity(), (existing, replacement) -> existing));
//转换昨日统计数据为Map<>
Map<String, Statistics> ydayStatsMap = ydayStatsList.stream()
.collect(Collectors.toMap(Statistics::getMarket, Function.identity(), (existing, replacement) -> existing));
@ -99,15 +123,14 @@ public class WorkbenchServiceImpl implements WorkbenchService {
@Override
public WorkbenchCard getCardCache(List<String> markets) {
markets = generalService.getMarket();
//从缓存中获取工作台数据
WorkbenchCard cached = redisTemplate.opsForValue().get(CACHE_KEY);
//有缓存直接返回缓存数据
if (cached != null) {
//直接返回缓存数据
System.out.println("读取缓存数据: " + new Date());
return cached;
}
//没缓存获取新数据并存入缓存
try {
//获取新的工作台数据
WorkbenchCard freshData = getCard(markets);
@ -126,12 +149,10 @@ public class WorkbenchServiceImpl implements WorkbenchService {
*/
@Override
public WorkbenchMarketCard createWorkbenchMarketCard(String market,Statistics currentStatistics, Statistics ydayStatistics, Date currentDate) {
Date date=new Date();
WorkbenchMarketCard card = new WorkbenchMarketCard();
card.setMarket(market);
if (currentStatistics != null&& ydayStatistics != null) {
// 一次性获取全年统计数据从年初到今天
// Map<String, Integer> yearlyStats = calculateAllSum(market, yearlyStartDate, date);
// 卡片一当前金币相关
card.setCurrentPermanent(currentStatistics.getCurrentPermanent());//余量-永久金币
card.setCurrentFreeJune(currentStatistics.getCurrentFreeJune()); //余量-免费六月金币
@ -163,10 +184,10 @@ public class WorkbenchServiceImpl implements WorkbenchService {
card.setYearlyRefund(currentStatistics.getYearlyRefund()); // 年累计退款
card.setYearlyReduce(card.getYearlyConsume() - card.getYearlyRefund());//年累计消耗
// 卡片四人头数相关
card.setRechargeNum(currentStatistics.getRechargeNum());
card.setYdayRechargeNum(ydayStatistics.getRechargeNum());
card.setFirstRecharge(currentStatistics.getFirstRecharge());
card.setYearlyRechargeNum(currentStatistics.getYearlyRechargeNum());
card.setRechargeNum(currentStatistics.getRechargeNum());//当天充值人数
card.setYdayRechargeNum(ydayStatistics.getRechargeNum()); //昨日充值人数
card.setFirstRecharge(ydayStatistics.getFirstRecharge()); //昨日充值人数中首充的数量
card.setYearlyRechargeNum(ydayStatistics.getYearlyRechargeNum()); //年累计充值人数-至昨天
// 周环比日同比
card.setWow(calculateWeekOverWeek(market, currentDate));
card.setDaily(calculateDayOverDay(market, currentDate));
@ -219,30 +240,7 @@ public class WorkbenchServiceImpl implements WorkbenchService {
return new WorkbenchCard(new ArrayList<>(), marketGraphs, markets, startDate, endDate,0,0,new Date());
}
/*
根据类型获取统计数据
*/
@Override
public Map<String, Integer> calculateAllSum(String market, Date startDate, Date endDate) {
WorkbenchFullStatistics stats = workBenchMapper.getFullStatisticsByMarketAndDate(market, startDate, endDate);
Map<String, Integer> result = new HashMap<>();
result.put("recharge", stats.getTotalRecharge() != null ? stats.getTotalRecharge() : 0);//获取充值统计数据
result.put("money", stats.getTotalMoney() != null ? stats.getTotalMoney() : 0); //充值金额统计数据
result.put("rFree", (stats.getTotalRecharge() != null ? stats.getTotalRecharge() : 0) //获取充值的免费金币统计数据
- (stats.getTotalMoney() != null ? stats.getTotalMoney() : 0));
result.put("cPermanent", stats.getTotalConsumePermanent() != null ? stats.getTotalConsumePermanent() : 0); //获取消费的永久金币统计数据
result.put("cFree", stats.getTotalConsumeFree() != null ? stats.getTotalConsumeFree() : 0); //获取消费的免费金币统计数据
result.put("cTask", stats.getTotalConsumeTask() != null ? stats.getTotalConsumeTask() : 0);//获取消费的任金币统计数据
result.put("consume",(stats.getTotalConsumePermanent() != null ? stats.getTotalConsumePermanent() : 0)//获取全部消费统计数据
+(stats.getTotalConsumeFree() != null ? stats.getTotalConsumeFree() : 0)
+(stats.getTotalConsumeTask() != null ? stats.getTotalConsumeTask() : 0));
result.put("refund", stats.getTotalRefund() != null ? stats.getTotalRefund() : 0); //获取退款统计数据
result.put("rechargeNum", stats.getTotalRechargeNum() != null ? stats.getTotalRechargeNum() : 0);//获取充值人数统计数据
return result;
}
/*
获取该日期该市场的日环比
*/
@ -319,12 +317,12 @@ public class WorkbenchServiceImpl implements WorkbenchService {
return (int) Math.round(rate);
}
/*
获取天总体的的周环比
获取天总体的的周环比
*/
@Override
public Integer calculateAllWeekOverWeek( Date date,List<String> markets) {
// List<String> markets = generalService.getMarket();
int thisWeekTotal = 0; //本周至当天充值人数
int lastWeekTotal = 0; //上周至当天充值人数
//获取本周周一

3
src/main/resources/mapper/AuditMapper.xml

@ -156,4 +156,7 @@
ORDER BY create_time DESC
limit 1
</select>
<select id="getAdminMarket" resultType="java.lang.String">
</select>
</mapper>

9
src/main/resources/mapper/WorkBenchMapper.xml

@ -125,4 +125,13 @@
AND s.current_datetime BETWEEN #{startDate} AND #{endDate}
GROUP BY s.market;
</select>
<!--获取用户的地区权限列表-->
<select id="getAdminMarket" resultType="java.lang.String">
select market from admin
where account = #{account}
</select>
<!--获取全部用户角色-->
<select id="getMarket" resultType="java.lang.String">
select DISTINCT market from user
</select>
</mapper>
Loading…
Cancel
Save