Browse Source

Merge branch 'milestone-20250702-金币重构一期' into sunjiabei/feature-20250623130922-消费功能

暂用(不合并)
sunjiabei 3 days ago
parent
commit
78af78ec42
  1. 2
      src/main/java/com/example/demo/DemoApplication.java
  2. 45
      src/main/java/com/example/demo/Util/RedisUtil.java
  3. 2
      src/main/java/com/example/demo/config/RedisConfig.java
  4. 1
      src/main/java/com/example/demo/controller/GoldDetailController.java
  5. 66
      src/main/java/com/example/demo/controller/PermissionController.java
  6. 13
      src/main/java/com/example/demo/controller/StatisticsController.java
  7. 49
      src/main/java/com/example/demo/controller/WorkbenchController.java
  8. 1
      src/main/java/com/example/demo/domain/entity/Admin.java
  9. 18
      src/main/java/com/example/demo/domain/entity/Export.java
  10. 8
      src/main/java/com/example/demo/domain/entity/Statistics.java
  11. 2
      src/main/java/com/example/demo/domain/entity/User.java
  12. 2
      src/main/java/com/example/demo/domain/vo/Page.java
  13. 27
      src/main/java/com/example/demo/domain/vo/Permission.java
  14. 17
      src/main/java/com/example/demo/domain/vo/TestRequest.java
  15. 45
      src/main/java/com/example/demo/domain/vo/WorkbenchCard.java
  16. 65
      src/main/java/com/example/demo/domain/vo/WorkbenchMarketCard.java
  17. 17
      src/main/java/com/example/demo/mapper/AdminMapper.java
  18. 31
      src/main/java/com/example/demo/mapper/PermissionMapper.java
  19. 15
      src/main/java/com/example/demo/mapper/StatisticsMapper.java
  20. 23
      src/main/java/com/example/demo/mapper/WorkBenchMapper.java
  21. 1
      src/main/java/com/example/demo/service/GeneralService.java
  22. 29
      src/main/java/com/example/demo/service/PermissionService.java
  23. 16
      src/main/java/com/example/demo/service/StatisticsService.java
  24. 19
      src/main/java/com/example/demo/service/WorkbenchService.java
  25. 3
      src/main/java/com/example/demo/serviceImpl/GeneralServiceImpl.java
  26. 1
      src/main/java/com/example/demo/serviceImpl/GoldDetailServiceImpl.java
  27. 115
      src/main/java/com/example/demo/serviceImpl/PermissionServiceImpl.java
  28. 103
      src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java
  29. 212
      src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java
  30. 2
      src/main/resources/application.yml
  31. 9
      src/main/resources/mapper/AdminMapper.xml
  32. 73
      src/main/resources/mapper/PermissionMapper.xml
  33. 68
      src/main/resources/mapper/StatisticsMapper.xml
  34. 86
      src/main/resources/mapper/WorkBenchMapper.xml

2
src/main/java/com/example/demo/DemoApplication.java

@ -2,8 +2,10 @@ package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling // 启用调度功能
public class DemoApplication {
public static void main(String[] args) {

45
src/main/java/com/example/demo/Util/RedisUtil.java

@ -1,3 +1,4 @@
/*
package com.example.demo.Util;
import jakarta.annotation.PostConstruct;
@ -34,21 +35,25 @@ public class RedisUtil {
delayMessageExecutor = Executors.newFixedThreadPool(DELAY_THREAD_POOL_SIZE);
}
/**
*/
/**
* 发送消息到队列
* @param queueName 队列名称
* @param message 消息内容
*/
*//*
public void sendMessage(String queueName, Object message) {
redisTemplate.opsForList().rightPush(queueName, message);
}
/**
*/
/**
* 阻塞获取消息(优化版增加重试机制)
* @param queueName 队列名称
* @param timeout 超时时间()
* @return 消息内容
*/
*//*
public Object blockingGetMessage(String queueName, long timeout) {
// 分段获取避免长时间阻塞
long endTime = System.currentTimeMillis() + timeout * 1000;
@ -61,30 +66,36 @@ public class RedisUtil {
return null;
}
/**
*/
/**
* 非阻塞获取消息
* @param queueName 队列名称
* @return 消息内容
*/
*//*
public Object getMessage(String queueName) {
return redisTemplate.opsForList().leftPop(queueName);
}
/**
*/
/**
* 获取队列长度
* @param queueName 队列名称
* @return 队列长度
*/
*//*
public Long getQueueSize(String queueName) {
return redisTemplate.opsForList().size(queueName);
}
/**
*/
/**
* 发送延迟消息(优化版)
* @param queueName 队列名称
* @param message 消息内容
* @param delay 延迟时间()
*/
*//*
public void sendDelayMessage(String queueName, Object message, long delay) {
String delayQueueKey = getDelayQueueKey(queueName);
String messageId = generateMessageId();
@ -105,9 +116,11 @@ public class RedisUtil {
});
}
/**
*/
/**
* 启动延迟消息处理任务
*/
*//*
@Scheduled(fixedRate = DELAY_QUEUE_POLL_INTERVAL)
public void processDelayMessages() {
Set<String> delayQueues = redisTemplate.keys("delay:*");
@ -121,9 +134,11 @@ public class RedisUtil {
}
}
/**
*/
/**
* 处理单个延迟队列
*/
*//*
private void processSingleDelayQueue(String queueName) {
String delayQueueKey = getDelayQueueKey(queueName);
long now = System.currentTimeMillis();
@ -172,4 +187,4 @@ public class RedisUtil {
}
return serialized;
}
}
}*/

2
src/main/java/com/example/demo/config/RedisConfig.java

@ -1,3 +1,4 @@
/*
package com.example.demo.config;
import org.springframework.beans.factory.annotation.Autowired;
@ -44,3 +45,4 @@ public class RedisConfig {
}
*/

1
src/main/java/com/example/demo/controller/GoldDetailController.java

@ -49,6 +49,7 @@ public class GoldDetailController {
}
@PostMapping("/getGold")
public Result getGold(@RequestBody Page page) {
System.out.println( page);
if(ObjectUtils.isEmpty(page.getPageNum())){
return Result.error("页码数为空!");
}

66
src/main/java/com/example/demo/controller/PermissionController.java

@ -0,0 +1,66 @@
package com.example.demo.controller;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.AdminRole;
import com.example.demo.domain.vo.Page;
import com.example.demo.domain.vo.Permission;
import com.example.demo.domain.vo.Result;
import com.example.demo.service.PermissionService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
/**
* @program: GOLD
* @ClassName PermissionController
* @description:
* @author: huangqizhen
* @create: 202506-26 13:22
* @Version 1.0
**/
@RestController
@RequestMapping("/permission")
@RequiredArgsConstructor
@Slf4j
@CrossOrigin
public class PermissionController {
private final PermissionService permissionService;
@PostMapping("/getposition")
public Result getposition(@RequestBody String token){
return Result.success(permissionService.getposition(token));
}
@PostMapping("/getmarket")
public Result getmarket(@RequestBody String token){
return Result.success(permissionService.getmarket(token));
}
@PostMapping("/getPermission")
public Result getPermission(@RequestBody Page page){
return Result.success(permissionService.getpermission(page.getPageNum(), page.getPageSize(), page.getPermission()));
}
@PostMapping("/addPermission")
public Result addPermission(@RequestBody Admin admin) throws Exception {
System.out.println( admin);
try {
return Result.success(permissionService.addpermission(admin));
}
catch (Exception e) {
log.error(Arrays.toString(e.getStackTrace()));
return Result.error(e.getMessage());
}
}
@PostMapping("/getRole")
public Result getRole(@RequestBody String token){
return Result.success(permissionService.getRole(token));
}
@PostMapping("/deleteAdmin")
public Result deleteAdmin(@RequestBody Admin admin){
return Result.success(permissionService.deleteAdmin(admin.getId()));
}
@PostMapping("/updateAdminRole")
public Result updateAdminRole(@RequestBody AdminRole adminrole){
return Result.success(permissionService.updateAdminRole(adminrole));
}
}

13
src/main/java/com/example/demo/controller/StatisticsController.java

@ -34,10 +34,15 @@ public class StatisticsController {
private StatisticsService statisticsService;
@Autowired
private GeneralService generalService;
//测试定时任务1
@PostMapping("/Hourly")
public void HourlyTask() {
statisticsService.runHourlyTask();
//测试定时任务part1
@PostMapping("/Hourly1")
public void HourlyTask1() {
statisticsService.runHourlyTaskPart1();
}
//测试定时任务part2
@PostMapping("/Hourly2")
public void HourlyTask2() {
statisticsService.runHourlyTaskPart2();
}

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

@ -1,12 +1,20 @@
package com.example.demo.controller;
import com.example.demo.domain.entity.Statistics;
import com.example.demo.domain.vo.TestRequest;
import com.example.demo.domain.vo.WorkbenchCard;
import com.example.demo.mapper.StatisticsMapper;
import com.example.demo.service.StatisticsService;
import com.example.demo.service.WorkbenchService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.Map;
/**
* @program: gold-java
* @ClassName WorkbenchController
@ -24,27 +32,40 @@ import org.springframework.web.bind.annotation.*;
public class WorkbenchController {
@Autowired
private WorkbenchService WorkbenchService;
private WorkbenchService workbenchService;
@Autowired
private StatisticsService statisticsService;
@Autowired
private StatisticsMapper statisticsMapper;
/*
获取工作台卡片一的数据
获取各地区工作台卡片的数据
*/
@PostMapping("card1")
public WorkbenchCard card1(@RequestBody WorkbenchCard workbench){
return WorkbenchService.getCard1(workbench.getToken(),workbench.getMarket());
@PostMapping("getCard")
public ResponseEntity<WorkbenchCard> card1(@RequestBody WorkbenchCard workbench){
WorkbenchCard result =workbenchService.getCard(workbench.getToken(),workbench.getMarkets());
return ResponseEntity.ok(result);
}
/*
获取工作台卡片二的数据
获取各地区工作台图表的数据
*/
@PostMapping("card2")
public WorkbenchCard card2(@RequestBody WorkbenchCard workbench){
return WorkbenchService.getCard2(workbench.getToken(),workbench.getMarket());
@PostMapping("getGraph")
public ResponseEntity<WorkbenchCard> graph1(@RequestBody WorkbenchCard workbench){
WorkbenchCard result =workbenchService.getGraph(workbench.getToken(),workbench.getStartDate(),workbench.getEndDate(),workbench.getMarkets());
return ResponseEntity.ok(result);
}
/*
获取工作台卡片三的数据
测试一段时间内的统计数据
*/
@PostMapping("card3")
public WorkbenchCard card3(@RequestBody WorkbenchCard workbench){
return WorkbenchService.getCard3(workbench.getToken(),workbench.getMarket());
}
/* @PostMapping("testSum")
public Statistics testSum( @RequestBody TestRequest request){
String market = request.getMarket();
Date date = request.getDate();
//获取传入日期所在周的周一
Date thisWeekStart = workbenchService.getStartOfWeek(date);
return statisticsMapper.selectSumByMarketAndDate(market, thisWeekStart, date);
}*/
}

1
src/main/java/com/example/demo/domain/entity/Admin.java

@ -29,4 +29,5 @@ public class Admin implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date updateTime; // 更新时间
private Integer roleId;
}

18
src/main/java/com/example/demo/domain/entity/Export.java

@ -19,15 +19,15 @@ import java.util.Date;
@NoArgsConstructor
public class Export {
private String token;
private Integer account;
private String url;
private String fileName;
private Byte type;
private Byte state;
private Integer dataNum;
private String reason;
private Integer account; // 账号
private String url; // 文件路径
private String fileName; // 文件名
private Byte type; // 类型
private Byte state; // 状态
private Integer dataNum; // 数据量
private String reason; // 失败原因
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime;
private Date createTime; // 创建时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date updateTime;
private Date updateTime; // 更新时间
}

8
src/main/java/com/example/demo/domain/entity/Statistics.java

@ -2,10 +2,13 @@ package com.example.demo.domain.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.Date;
/**
@ -45,8 +48,9 @@ public class Statistics implements Serializable {
private Integer rechargeNum; // 当日充值人数
private Integer firstRecharge; // 当日首充人数
// 数据日期
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "Asia/Shanghai")
private Date currentDatetime;
@JsonFormat(pattern = "yyyy-MM-dd")
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate currentDatetime;
// 创建时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime;

2
src/main/java/com/example/demo/domain/entity/User.java

@ -27,7 +27,7 @@ public class User implements Serializable {
private Integer currentFreeDecember; // 当前十二月免费金币
private Integer currentTaskGold; // 当前任务金币
private Integer rechargeNum; // 充值次数
private Integer sumConsume; // 消费总额
private Integer sumConsume; // 历史消费
private Integer consumeNum; // 消费次数
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "Asia/Shanghai")

2
src/main/java/com/example/demo/domain/vo/Page.java

@ -23,5 +23,5 @@ public class Page {
private ConsumeUser consumeUser;
private User user;
private RefundUser refundUser;
private Permission permission;
}

27
src/main/java/com/example/demo/domain/vo/Permission.java

@ -0,0 +1,27 @@
package com.example.demo.domain.vo;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: GOLD
* @ClassName Permission
* @description:
* @author: huangqizhen
* @create: 202506-26 10:54
* @Version 1.0
**/
@Data
@NoArgsConstructor
public class Permission {
private String token;
private String id;
private String name; //姓名
private String account; //账号
private String market; //地区
private String postiton; //职位
private String roleName; //角色
private String remark; //备注
private Integer adminStatus; //状态
private Integer roleId; //角色id
}

17
src/main/java/com/example/demo/domain/vo/TestRequest.java

@ -0,0 +1,17 @@
package com.example.demo.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
public class TestRequest {
private String market;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date date;
}

45
src/main/java/com/example/demo/domain/vo/WorkbenchCard.java

@ -1,16 +1,18 @@
package com.example.demo.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* @program: gold-java
* @ClassName Workbench
* @description: 工作台请求参数
* @description: 工作台顶层容器
* @author: Ethan
* @create: 202506-17 17:43
* @Version 1.0
@ -21,41 +23,12 @@ import java.util.List;
@AllArgsConstructor
public class WorkbenchCard implements Serializable {
private String token; //用户token
private List<String> market; // 地区
// 卡片一当前金币相关
private Integer currentGold; // 当前金币余量
private Integer dailyChange; // 余量较前一天的变化
private Integer currentPermanent; // 永久金币余量
private Integer currentFreeJune; // 六月到期免费金币余量
private Integer currentFreeDecember; // 十二月到期免费金币余量
private Integer currentTask; // 任务金币余量
private Integer currentFree; // 免费金币余量currentFreeJune + currentFreeDecember
private List<WorkbenchMarketCard> marketCards; // 地区卡片数据
private List<String> markets; // 地区列表
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date startDate; // 起始时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date endDate; // 结束时间
// 卡片二充值相关
private Integer recharge; // 当日充值金币数
private Integer money; // 当日金额永久金币
private Integer yearlyRecharge; // 全年累计充值金币数
private Integer yearlyMoney; // 全年累计金额
// 卡片三当日消费/退款/消耗相关
private Integer consumePermanent; // 当日新增消费永久
private Integer consumeFreeJune; // 当日新增消费六月免费
private Integer consumeFreeDecember; // 当日新增消费十二月免费
private Integer consumeTask; // 当日新增消费任务
private Integer refundPermanent; // 当日新增退款永久
private Integer refundFreeJune; // 当日新增退款六月免费
private Integer refundFreeDecember; // 当日新增退款十二月免费
private Integer refundTask; // 当日新增退款任务
private Integer dailyConsume; // 当日总消耗 = consumePermanent + consumeFreeJune + consumeFreeDecember + consumeTask - (refundPermanent + refundFreeJune + refundFreeDecember + refundTask)
private Integer yearlyConsume; // 全年累计消费
private Integer yearlyRefund; // 全年累计退款金币数
private Integer yearlyReduce; // 全年累计消耗金币数 = yearlyConsume - yearlyRefund
// 卡片四人头数相关
private Integer rechargeNum; // 当日充值人数
private Integer firstRecharge; // 当日首充人数
private Integer wow; // 周同比%
private Integer daily; // 日环比%
private Integer yearlyRechargeNum; // 全年累计充值人头数
}

65
src/main/java/com/example/demo/domain/vo/WorkbenchMarketCard.java

@ -0,0 +1,65 @@
package com.example.demo.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @program: gold-java
* @ClassName WorkbenchMarketCard
* @description:
* @author: Ethan
* @create: 202506-25 16:20
* @Version 1.0
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WorkbenchMarketCard implements Serializable {
private String market;//地区
// 卡片一当前金币相关
private Integer currentGold; // 当前金币余量
private Integer dailyChange; // 余量较前一天的变化
private Integer currentPermanent; // 永久金币余量
private Integer currentFreeJune; // 六月到期免费金币余量
private Integer currentFreeDecember; // 十二月到期免费金币余量
private Integer currentTask; // 任务金币余量
private Integer currentFree; // 免费金币余量currentFreeJune + currentFreeDecember
// 卡片二充值相关
private Integer recharge; // 当日充值金币数
private Integer money; // 当日金额永久金币
private Integer yearlyRecharge; // 全年累计充值金币数
private Integer yearlyMoney; // 全年累计金额
// 卡片三当日消费/退款/消耗相关
private Integer consumePermanent; // 当日新增消费永久
private Integer consumeFreeJune; // 当日新增消费六月免费
private Integer consumeFreeDecember; // 当日新增消费十二月免费
private Integer consumeTask; // 当日新增消费任务
private Integer refundPermanent; // 当日新增退款永久
private Integer refundFreeJune; // 当日新增退款六月免费
private Integer refundFreeDecember; // 当日新增退款十二月免费
private Integer refundTask; // 当日新增退款任务
private Integer dailyConsume; // 当日总消耗 = consumePermanent + consumeFreeJune + consumeFreeDecember + consumeTask - (refundPermanent + refundFreeJune + refundFreeDecember + refundTask)
private Integer yearlyConsume; // 全年累计消费
private Integer yearlyRefund; // 全年累计退款金币数
private Integer yearlyReduce; // 全年累计消耗金币数 = yearlyConsume - yearlyRefund
// 卡片四人头数相关
private Integer rechargeNum; // 当日充值人数
private Integer firstRecharge; // 当日首充人数
private Integer wow; // 周同比%
private Integer daily; // 日环比%
private Integer yearlyRechargeNum; // 全年累计充值人头数
//图表
private Integer SumRechargePermanent; //合计充值永久金币
private Integer SumRechargeFree; //合计充值免费金币
private Integer SumConsumePermanent; //合计消费永久金币
private Integer SumConsumeFree; //合计消费免费金币
private Integer SumConsumeTask; //合计消费任务金币
}

17
src/main/java/com/example/demo/mapper/AdminMapper.java

@ -0,0 +1,17 @@
package com.example.demo.mapper;
import com.example.demo.domain.entity.Admin;
import org.apache.ibatis.annotations.Mapper;
/**
* @program: GOLD
* @ClassName AdminMapper
* @description:
* @author: huangqizhen
* @create: 202506-27 17:21
* @Version 1.0
**/
@Mapper
public interface AdminMapper {
Admin getAdmin(String account);
}

31
src/main/java/com/example/demo/mapper/PermissionMapper.java

@ -0,0 +1,31 @@
package com.example.demo.mapper;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.AdminRole;
import com.example.demo.domain.entity.Role;
import com.example.demo.domain.vo.Permission;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @program: GOLD
* @ClassName PermissionMapper
* @description:
* @author: huangqizhen
* @create: 202506-26 11:25
* @Version 1.0
**/
@Mapper
public interface PermissionMapper {
List<String> getposition(String token);
List<String> getmarket(String token);
List<Permission> getPermission(Permission permission);
Integer updatePermission(Admin admin);
Integer addPermission(Admin admin);
List<Role> getRole(String token);
Integer addadminRole(AdminRole adminRole);
Integer deleteAdmin(Integer id);
Integer deleteAdminRole(Integer id);
Integer updateAdminRole(AdminRole adminRole);
}

15
src/main/java/com/example/demo/mapper/StatisticsMapper.java

@ -5,6 +5,7 @@ import com.example.demo.domain.entity.UserGoldRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
@ -33,21 +34,29 @@ public interface StatisticsMapper {
//获取某地区当前永久金币余量
Integer sumCurrentTaskGold(@Param("market") String market);
//计算该天充值人数
int countRechargeNum(
Integer countRechargeNum(
@Param("market") String market,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
//计算该天首充人数
int countFirstRecharge(
Integer countFirstRecharge(
@Param("market") String market,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
//新增part1统计数据
void insertPart1(Statistics statistics);
//更新part1统计数据
void updatePart1(Statistics statistics);
//新增part2统计数据
void insertPart2(Statistics statistics);
//更新part2统计数据
void updatePart2(Statistics statistics);
//获取某地区某天的数据
//获取某地区某时间所在日期的数据仅一条
Statistics selectByMarketAndDate(@Param("market") String market,
@Param("startDate") Date startDate,
@Param("endDate") Date endDate);
//获取某地区某时间段的统计数据仅一条
Statistics selectSumByMarketAndDate(@Param("market") String market,
@Param("startDate") Date startDate,
@Param("endDate") Date endDate);
}

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

@ -3,6 +3,7 @@ package com.example.demo.mapper;
import com.example.demo.domain.vo.WorkbenchCard;
import org.apache.ibatis.annotations.Mapper;
import java.util.Date;
import java.util.List;
/**
@ -16,10 +17,20 @@ import java.util.List;
@Mapper
public interface WorkBenchMapper {
//工作台卡片一
public WorkbenchCard getCard1(List<String> areas);
//工作台卡片二
public WorkbenchCard getCard2(List<String> areas);
//工作台卡片三
public WorkbenchCard getCard3(List<String> areas);
//给定时间范围内的该地区充值金币数永久+免费
Integer sumRecharge(String market, Date startDate, Date endDate);
//给定时间范围内的该地区充值金额永久金币数
Integer sumMoney(String market, Date startDate, Date endDate);
//给定时间范围内的该地区消费金币数永久+免费+任务
Integer sumConsume(String market, Date startDate, Date endDate);
//给定时间范围内的该地区消费永久金币数
Integer sumCPermanent(String market, Date startDate, Date endDate);
//给定时间范围内的该地区消费免费金币数
Integer sumCFree(String market, Date startDate, Date endDate);
//给定时间范围内的该地区消费任务金币数
Integer sumCTask(String market, Date startDate, Date endDate);
//给定时间范围内的该地区退款金币数永久+免费+任务
Integer sumRefund(String market,Date startDate, Date endDate);
//给定时间范围内的该地区充值人头数根据精网号去重老数据有多人共用一个精网号的问题
Integer countRechargeNum(String market, Date startDate, Date endDate);
}

1
src/main/java/com/example/demo/service/GeneralService.java

@ -29,4 +29,5 @@ public interface GeneralService {
String formatDate(Date date) ;
//获取时间段内的所有日期包含起始和结束日
List<Date> getAllDatesBetween(Date start, Date end);
}

29
src/main/java/com/example/demo/service/PermissionService.java

@ -0,0 +1,29 @@
package com.example.demo.service;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.AdminRole;
import com.example.demo.domain.entity.Role;
import com.example.demo.domain.vo.Page;
import com.example.demo.domain.vo.Permission;
import com.github.pagehelper.PageInfo;
import javax.swing.*;
import java.util.List;
/**
* @program: GOLD
* @ClassName PermissionService
* @description:
* @author: huangqizhen
* @create: 202506-26 13:18
* @Version 1.0
**/
public interface PermissionService {
List<String> getposition(String token);
List<String> getmarket(String token);
PageInfo<Permission> getpermission(Integer pageNum, Integer pageSize, Permission permission);
Integer addpermission(Admin admin) throws Exception;
List<Role> getRole(String token);
Integer deleteAdmin(Integer id);
Integer updateAdminRole(AdminRole adminRole);
}

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

@ -15,15 +15,19 @@ import java.util.Date;
public interface StatisticsService {
//12点18点执行定时任务更新当天数据
public void runHourlyTask();
//0点执行定时任务更新近一周数据
public void runDailyTask();
//12点18点,23点30分执行定时任务更新当天part2数据
public void runHourlyTaskPart1();
//12点18点执行定时任务更新当天part2数据
public void runHourlyTaskPart2();
//0点执行定时任务更新近一周part2数据
public void runDailyTaskPart2();
//查询某地区某天是否已存在统计数据
public Statistics getExistStatistics(String market,Date date);
//新增或更新或不修改某地区某天统计数据
public void saveStatistics(String market, Date date);
//新增或更新或不修改某地区某天part1统计数据
public void saveStatisticsPart1(String market, Date date);
//新增或更新或不修改某地区某天part2统计数据
public void saveStatisticsPart2(String market, Date date);
//根据地区与日期获取part1(余量属性)统计数据
public Statistics getStatisticsPart1(String market, Date date);
//根据地区与日期获取part2(余量外属性)统计数据

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

@ -1,7 +1,9 @@
package com.example.demo.service;
import com.example.demo.domain.vo.WorkbenchCard;
import com.example.demo.domain.vo.WorkbenchMarketCard;
import java.util.Date;
import java.util.List;
/**
@ -15,7 +17,18 @@ import java.util.List;
public interface WorkbenchService {
WorkbenchCard getCard1(String token, List<String>areas);
WorkbenchCard getCard2(String token, List<String>areas);
WorkbenchCard getCard3(String token, List<String>areas);
//获取不同地区的工作台统计卡片
WorkbenchCard getCard(String token, List<String> markets);
//获取不同地区的工作台柱状图数据根据类型起止时间地区查询
WorkbenchCard getGraph(String token, Date startDate, Date endDate, List<String> markets);
//根据类型获取年初至今的统计数据
Integer calculateSum(String market, String type, Date startDate,Date endDate);
//获取该日期该市场的日同比
Integer calculateDayOverDay(String market,Date date);
//获取该日期该市场的周环比
Integer calculateWeekOverWeek(String market, Date date);
//获取与传入的日期相差XX天的日期
Date addDays(Date date, int days);
//获取传入时间所在周的第一天周一
Date getStartOfWeek(Date date);
}

3
src/main/java/com/example/demo/serviceImpl/GeneralServiceImpl.java

@ -93,4 +93,7 @@ public class GeneralServiceImpl implements GeneralService {
return dates;
}
}

1
src/main/java/com/example/demo/serviceImpl/GoldDetailServiceImpl.java

@ -41,6 +41,7 @@ public class GoldDetailServiceImpl implements GoldDetailService {
@Override
public PageInfo<User> getGold(Integer pageNum, Integer pageSize, User user) {
PageHelper.startPage(pageNum, pageSize);
List<User> list= goldDetailMapper.getGold(user);
return new PageInfo<>(list);
}

115
src/main/java/com/example/demo/serviceImpl/PermissionServiceImpl.java

@ -0,0 +1,115 @@
package com.example.demo.serviceImpl;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.AdminRole;
import com.example.demo.domain.entity.Role;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.Permission;
import com.example.demo.domain.vo.Result;
import com.example.demo.mapper.AdminMapper;
import com.example.demo.mapper.PermissionMapper;
import com.example.demo.service.PermissionService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.util.List;
/**
* @program: GOLD
* @ClassName PermissionServiceImpl
* @description:
* @author: huangqizhen
* @create: 202506-26 13:20
* @Version 1.0
**/
@Service
public class PermissionServiceImpl implements PermissionService {
@Autowired
private PermissionMapper permissionMapper;
@Autowired
private AdminMapper adminMapper;
@Override
public List<String> getposition(String token) {
return permissionMapper.getposition(token);
}
@Override
public List<String> getmarket(String token) {
return permissionMapper.getmarket(token);
}
@Override
public PageInfo<Permission> getpermission(Integer pageNum, Integer pageSize, Permission permission) {
PageHelper.startPage(pageNum, pageSize);
List<Permission> list= permissionMapper.getPermission(permission);
return new PageInfo<>(list);
}
@Override
@Transactional
public Integer addpermission(Admin admin) throws Exception {
if(!ObjectUtils.isEmpty(adminMapper.getAdmin(admin.getAccount()))){
throw new Exception("账号已存在");
}
if(ObjectUtils.isEmpty(admin.getAccount())){
throw new Exception("账号为空!");
}
if(ObjectUtils.isEmpty( admin.getMarket())){
throw new Exception("地区为空!");
}
if(ObjectUtils.isEmpty( admin.getPostiton())){
throw new Exception("职位为空!");
}
if (ObjectUtils.isEmpty( admin.getRoleId())){
throw new Exception("权限类别为空!");
}
if(ObjectUtils.isEmpty( admin.getAdminName())){
throw new Exception("用户名为空!");
}
if(ObjectUtils.isEmpty( admin.getMachineId())){
throw new Exception("机器编号为空!");
}
if (admin.getMachineId().contains(",")) {
throw new Exception("机器编号格式错误");
}
else {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
admin.setPassword(passwordEncoder.encode(("123456")));
permissionMapper.addPermission(admin);
AdminRole adminRole = new AdminRole();
adminRole.setAdminId(admin.getId());
adminRole.setRoleId(admin.getRoleId());
return permissionMapper.addadminRole(adminRole);
}
}
@Override
public List<Role> getRole(String token) {
return permissionMapper.getRole(token);
}
@Override
@Transactional
public Integer deleteAdmin(Integer id) {
if (id == null){
return -1;
}
permissionMapper.deleteAdminRole(id);
return permissionMapper.deleteAdmin(id);
}
@Override
public Integer updateAdminRole(AdminRole adminRole) {
return permissionMapper.updateAdminRole(adminRole);
}
}

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

@ -11,9 +11,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
@ -32,23 +34,37 @@ public class StatisticsServiceImpl implements StatisticsService {
private StatisticsMapper statisticsMapper;
@Autowired
private GeneralService generalService;
/*
12点18点执行定时任务更新当天数据
*/
12点18点23点30分执行定时任务更新当天part1数据
*/
@Override
@Scheduled(cron = "0 0 12,18 * * ?") // 分别在 12:00 18:00 执行
@Scheduled(cron = "0 30 23 * * ?") // 23:30 执行
public void runHourlyTaskPart1() {
Date today = new Date(); //取当天日期
for(String market : generalService.getMarket()){
saveStatisticsPart1(market,today);
}
}
/*
12点18点执行定时任务更新当天part2数据
*/
@Override
@Scheduled(cron = "0 0 12,18 * * ?")
public void runHourlyTask() {
public void runHourlyTaskPart2() {
Date today = new Date(); //取当天日期
for(String market : generalService.getMarket()){
saveStatistics(market,today);
saveStatisticsPart2(market,today);
}
}
/*
0点执行定时任务更新近一周数据
0点执行定时任务更新近一周part2数据
*/
@Override
@Scheduled(cron = "0 0 0 * * ?")
public void runDailyTask() {
public void runDailyTaskPart2() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, -7); // 一周前
Date startDate = cal.getTime();
@ -58,7 +74,7 @@ public class StatisticsServiceImpl implements StatisticsService {
for (Date date : dateList) {
for (String market : generalService.getMarket()) {
saveStatistics(market, date);
saveStatisticsPart2(market, date);
}
}
}
@ -74,11 +90,35 @@ public class StatisticsServiceImpl implements StatisticsService {
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("数据未发生改变");
}
}
}
/*
新增或更新或不修改某地区某天统计数据
新增或更新或不修改某地区某天part2统计数据
*/
@Override
public void saveStatistics(String market, Date date){
public void saveStatisticsPart2(String market, Date date){
//获取该地区该日期part2(余量外属性)统计数据
Statistics newStats=getStatisticsPart2(market,date);
//获取该地区该日期已存在的数据
@ -92,7 +132,7 @@ public class StatisticsServiceImpl implements StatisticsService {
if (!isSameStatisticsPart2(existStats,newStats)){
statisticsMapper.updatePart2(newStats);
}else{
log.atInfo().log("数据未发生改变");
System.out.println("数据未发生改变");
}
}
}
@ -100,9 +140,14 @@ public class StatisticsServiceImpl implements StatisticsService {
//根据地区与日期获取part1(余量属性)统计数据
@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)+
@ -110,6 +155,25 @@ public class StatisticsServiceImpl implements StatisticsService {
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);
@ -130,6 +194,10 @@ public class StatisticsServiceImpl implements StatisticsService {
*/
@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);
@ -143,7 +211,8 @@ public class StatisticsServiceImpl implements StatisticsService {
//初始化Statistics对象
Statistics statistics = new Statistics();
statistics.setMarket(market);
statistics.setCurrentDatetime(date);
statistics.setCurrentDatetime(localDate);
//计算属性
//充值相关-当日充值永久+免费
Integer recharge = records.stream()
@ -213,6 +282,18 @@ public class StatisticsServiceImpl implements StatisticsService {
statistics.setFirstRecharge(firstRecharge);
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(余量外属性)是否相同
*/

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

@ -1,11 +1,24 @@
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;
/**
@ -19,23 +32,206 @@ import java.util.List;
@Service
public class WorkbenchServiceImpl implements WorkbenchService {
@Autowired
private WorkBenchMapper workbenchMapper;
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 getCard1(String token, List<String> areas) {
return workbenchMapper.getCard1(areas);
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 WorkbenchCard getCard2(String token, List<String> areas) {
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);
}
return workbenchMapper.getCard2(areas);
@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 WorkbenchCard getCard3(String token, List<String> areas) {
public Date getStartOfWeek(Date date) {
// Date 转换为 LocalDate
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// 获取周一作为一周的第一天
DayOfWeek firstDayOfWeek = DayOfWeek.MONDAY;
return workbenchMapper.getCard3(areas);
// 返回所在周的第一天转换回Date格式
return Date.from(localDate.with(firstDayOfWeek)
.atStartOfDay(ZoneId.systemDefault())
.toInstant());
}
}

2
src/main/resources/application.yml

@ -62,7 +62,7 @@ spring:
data:
redis:
database: 0
host: 192.168.8.220
host: 192.168.8.94
port: 6379
password:
timeout: 1000

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

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.AdminMapper">
<select id="getAdmin" resultType="com.example.demo.domain.entity.Admin">
select * from admin
where account=#{account}
</select>
</mapper>

73
src/main/resources/mapper/PermissionMapper.xml

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.PermissionMapper">
<insert id="addPermission" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into admin(admin_name,machine_id,account,password,market,postiton,remark,admin_status)
values(#{adminName},#{machineId},#{account},#{password},#{market},#{postiton},#{remark},1)
</insert>
<insert id="addadminRole">
insert into admin_role(admin_id,role_id)
values(#{adminId},#{roleId})
</insert>
<update id="updatePermission">
update admin
<set>
<if test="name!=null">
admin_name=#{name},
</if>
<if test="market!=null">
market=#{market},
</if>
<if test="postiton!=null">
postiton=#{postiton},
</if>
<if test="role!=null">
roleId=#{role},
</if>
</set>
where id= #{id}
</update>
<update id="updateAdminRole">
update admin_role
<set>
<if test="roleId!=null">
role_id= #{roleId},
</if>
</set>
where admin_id= #{adminId}
</update>
<delete id="deleteAdmin">
delete from admin where id=#{id}
</delete>
<delete id="deleteAdminRole">
delete from admin_role where admin_id= #{id}
</delete>
<select id="getposition" resultType="java.lang.String">
select distinct postiton from admin
</select>
<select id="getmarket" resultType="java.lang.String">
select distinct market from admin
</select>
<select id="getPermission" resultType="com.example.demo.domain.vo.Permission">
select admin.id,admin.admin_name,admin.account,admin.market,admin.postiton,admin.remark,admin.admin_status,role.role_name
from admin
left join admin_role on admin.id=admin_role.admin_id
left join role on admin_role.role_id=role.id
<where>
<if test="account!=null and account.length>0">
admin.account=#{account}
</if>
<if test="market!=null and market.length>0">
admin.market=#{market}
</if>
<if test="postiton!=null and postiton.length>0">
admin.postiton=#{postiton}
</if>
</where>
</select>
<select id="getRole" resultType="com.example.demo.domain.entity.Role">
select * from role
</select>
</mapper>

68
src/main/resources/mapper/StatisticsMapper.xml

@ -21,8 +21,24 @@
#{rechargeNum}, #{firstRecharge}
)
</insert>
<!--新增part1统计数据-->
<insert id="insertPart1">
INSERT INTO statistics (
market, current_datetime,
current_gold, daily_change,
current_permanent, current_free_june,
current_free_december, current_task,
) VALUES (
#{market}, #{currentDatetime},
#{currentGold}, #{dailyChange},
#{currentPermanent}, #{currentFreeJune},
#{currentFreeDecember}, #{currentTask},
)
</insert>
<!--更新part2统计数据-->
<update id="updatePart2">
<update id="updatePart2" parameterType="map">
UPDATE statistics
SET
recharge = #{recharge},
@ -36,8 +52,20 @@
refund_free_december = #{refundFreeDecember},
refund_task = #{refundTask},
recharge_num = #{rechargeNum},
first_recharge = #{firstRecharge},
WHERE id = #{id}
first_recharge = #{firstRecharge}
WHERE market = #{market} and current_datetime = #{currentDatetime}
</update>
<!--更新part1统计数据-->
<update id="updatePart1" parameterType="map">
update statistics
SET
current_gold = #{currentGold},
daily_change = #{dailyChange},
current_permanent = #{currentPermanent},
current_free_june = #{currentFreeJune},
current_free_december = #{currentFreeDecember},
current_task = #{currentTask}
WHERE market = #{market} and current_datetime = #{currentDatetime}
</update>
<!--根据地区、审核状态、起止时间查询订单表数据-->
<select id="findByMarketAndAuditStatus"
@ -58,7 +86,7 @@
FROM user_gold_record ugr
INNER JOIN user u ON ugr.jwcode = u.jwcode
WHERE u.market = #{market}
AND ugr.audit_status = 1
AND ugr.audit_status IN (1,3)
AND ugr.pay_time BETWEEN #{startTime} AND #{endTime}
</select>
<!--计算该天首充人数-->
@ -80,23 +108,37 @@
LIMIT 1
</select>
<select id="sumCurrentPermanentGold" resultType="java.lang.Integer">
SELECT SUM(u.currentPermanentGold)
FROM user u
WHERE u.market = #{market}
SELECT SUM(user.current_permanent_gold)
FROM user
WHERE user.market = #{market}
</select>
<select id="sumCurrentFreeJune" resultType="java.lang.Integer">
SELECT SUM(u.currentFreeJune)
FROM user u
SELECT SUM(u.current_free_june)
FROM user as u
WHERE u.market = #{market}
</select>
<select id="sumCurrentFreeDecember" resultType="java.lang.Integer">
SELECT SUM(u.currentFreeDecember)
FROM user u
SELECT SUM(u.current_free_december)
FROM user as u
WHERE u.market = #{market}
</select>
<select id="sumCurrentTaskGold" resultType="java.lang.Integer">
SELECT SUM(u.currentTaskGold)
FROM user u
SELECT SUM(u.current_task_gold)
FROM user as u
WHERE u.market = #{market}
</select>
<select id="selectSumByMarketAndDate" resultType="com.example.demo.domain.entity.Statistics">
select sum(s.recharge) as recharge,
sum(s.money) as money,
sum(s.consume_permanent) as consume_permanent,
sum(s.consume_free_june) as consume_free_june,
sum(s.consume_free_december) as consume_free_december,
sum(s.consume_task) as consume_task,
sum(s.recharge_num) as recharge_num
from statistics as s
WHERE market = #{market}
AND current_datetime >= #{startDate}
AND current_datetime &lt;= #{endDate}
</select>
</mapper>

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

@ -1,5 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.WorkBenchMapper">
<!--起止时间内的该地区充值金币数(永久+免费)若为空则默认0-->
<select id="sumRecharge" resultType="java.lang.Integer">
select sum(
COALESCE(recharge, 0)
)
from statistics
where market = #{market}
and current_datetime
between #{startDate} and #{endDate}
</select>
<!--起止时间内的该地区充值金额(永久金币数)-->
<select id="sumMoney" resultType="java.lang.Integer">
SELECT SUM(money)
FROM statistics
WHERE market = #{market}
AND current_datetime BETWEEN #{startDate} and #{endDate}
</select>
<!-- 起止时间内该地区消费金币数(永久+免费+任务)-->
<select id="sumConsume" resultType="java.lang.Integer">
SELECT SUM(
COALESCE(consume_permanent, 0) +
COALESCE(consume_free_june, 0) +
COALESCE(consume_free_december, 0) +
COALESCE(consume_task, 0)
)
FROM statistics
WHERE market = #{market}
AND current_datetime BETWEEN
#{startDate} and #{endDate}
</select>
<!--起止时间内的该地区退款金币数(永久+免费+任务)-->
<select id="sumRefund" resultType="java.lang.Integer">
SELECT SUM(
COALESCE(refund_permanent, 0) +
COALESCE(refund_free_june, 0) +
COALESCE(refund_free_december, 0) +
COALESCE(refund_task, 0)
)
FROM statistics
WHERE market = #{market}
AND current_datetime BETWEEN
#{startDate} and #{endDate}
</select>
<!--起止时间内该地区充值人头数(根据精网号去重,老数据有多人共用一个精网号的问题)-->
<select id="countRechargeNum" resultType="java.lang.Integer">
SELECT COUNT(DISTINCT ugr.jwcode)
FROM user_gold_record ugr
INNER JOIN user u ON ugr.jwcode = u.jwcode
WHERE u.market = #{market}
AND ugr.pay_time BETWEEN
#{startDate} and #{endDate}
AND ugr.audit_status IN (1,3)
</select>
<!--给定时间范围内的该地区消费永久金币数-->
<select id="sumCPermanent" resultType="java.lang.Integer">
SELECT SUM(
COALESCE(consume_permanent, 0)
)
FROM statistics
WHERE market = #{market}
AND current_datetime BETWEEN
#{startDate} and #{endDate}
</select>
<!--给定时间范围内的该地区消费免费金币数-->
<select id="sumCFree" resultType="java.lang.Integer">
SELECT SUM(
COALESCE(refund_free_june, 0) +
COALESCE(refund_free_december, 0)
)
FROM statistics
WHERE market = #{market}
AND current_datetime BETWEEN
#{startDate} and #{endDate}
</select>
<!--给定时间范围内的该地区消费任务金币数-->
<select id="sumCTask" resultType="java.lang.Integer">
SELECT SUM(
COALESCE(refund_task, 0)
)
FROM statistics
WHERE market = #{market}
AND current_datetime BETWEEN
#{startDate} and #{endDate}
</select>
</mapper>
Loading…
Cancel
Save