Compare commits

...

31 Commits

Author SHA1 Message Date
lihuilin 41e1fd7c23 改一下映射 3 days ago
huangqizhen 31d62c576c 6.26 查询接口修复 4 days ago
jianlin f09eb9bc92 Merge remote-tracking branch 'refs/remotes/origin/lijianlin/feature-20250623120104-工作台与审核' into milestone-20250702-金币重构一期 5 days ago
jianlin 98bb1296e1 6-27工作台卡片及图表数据(缺图表统计) 5 days ago
sunjiabei 88c6492230 bug修改 5 days ago
sunjiabei 637be279e9 退款接口 5 days ago
sunjiabei 18e3c4521e 修改bug 6 days ago
sunjiabei fd6ecaf537 新增消耗修改和退款框架 6 days ago
sunjiabei e8921ddca0 新增消耗金币校验 7 days ago
sunjiabei 339410fc7c 新增消耗 7 days ago
sunjiabei 2ed53a5326 消耗更正以及用户卡片信息 7 days ago
sunjiabei c61f9f6eaf 用户信息 7 days ago
huangqizhen 58f24b11fd Merge remote-tracking branch 'origin/milestone-20250702-金币重构一期' into milestone-20250702-金币重构一期 1 week ago
huangqizhen ceb65f8110 6.24 合并冲突部分修复 1 week ago
jianlin 67508049dc Merge remote-tracking branch 'origin/milestone-20250702-金币重构一期' into milestone-20250702-金币重构一期 1 week ago
huangqizhen ed6ef8996e Merge remote-tracking branch 'origin/milestone-20250702-金币重构一期' into milestone-20250702-金币重构一期 1 week ago
huangqizhen cdd1c51dbd Merge remote-tracking branch 'refs/remotes/origin/huangqizheng/feature-20250623110001-客户金币明细' into milestone-20250702-金币重构一期 1 week ago
jianlin a4c8cb6875 Merge branch 'refs/heads/lijianlin/feature-20250623120104-工作台与审核' into milestone-20250702-金币重构一期 1 week ago
huangqizhen 3dcdb9f7b5 6.24 客户金币余额,异步部分 1 week ago
jianlin 5496460df7 6-24更新统计数据part2(余量外属性) 1 week ago
sunjiabei 9ad7f3af69 消费模块,筛选查询详情 1 week ago
sunjiabei 99a0b0f800 消费模块,消费详情分页,商品查询 1 week ago
sunjiabei 0341bc2ab3 Merge remote-tracking branch 'origin/milestone-20250702-金币重构一期' into milestone-20250702-金币重构一期 1 week ago
huangqizhen f827e86e7a Merge branch 'refs/heads/huangqizheng/feature-20250623110001-客户金币明细' into milestone-20250702-金币重构一期 1 week ago
huangqizhen e885ab526a 6.23 客户金币明细页面查询与合计 1 week ago
sunjiabei be8c77e80e 消费模块,消费金币统计接口 1 week ago
sunjiabei b8a58b038a 消费模块,消费金币统计接口 1 week ago
sunjiabei 9cffd95b79 消费模块,消息详情接口 1 week ago
sunjiabei d4c77f990d 消费模块,消息详情接口 1 week ago
sunjiabei 4fddb8ad5f 消费模块,消息详情接口 1 week ago
sunjiabei e9464c8998 测试 1 week ago
  1. 5
      pom.xml
  2. 2
      src/main/java/com/example/demo/DemoApplication.java
  3. 31
      src/main/java/com/example/demo/Util/BusinessException.java
  4. 190
      src/main/java/com/example/demo/Util/RedisUtil.java
  5. 2
      src/main/java/com/example/demo/config/RedisConfig.java
  6. 94
      src/main/java/com/example/demo/controller/ConsumeController.java
  7. 6
      src/main/java/com/example/demo/controller/GeneralController.java
  8. 61
      src/main/java/com/example/demo/controller/GoldDetailController.java
  9. 66
      src/main/java/com/example/demo/controller/PermissionController.java
  10. 78
      src/main/java/com/example/demo/controller/RefundController.java
  11. 23
      src/main/java/com/example/demo/controller/StatisticsController.java
  12. 41
      src/main/java/com/example/demo/controller/UserController.java
  13. 49
      src/main/java/com/example/demo/controller/WorkbenchController.java
  14. 1
      src/main/java/com/example/demo/domain/entity/Admin.java
  15. 33
      src/main/java/com/example/demo/domain/entity/Export.java
  16. 8
      src/main/java/com/example/demo/domain/entity/Statistics.java
  17. 3
      src/main/java/com/example/demo/domain/entity/User.java
  18. 46
      src/main/java/com/example/demo/domain/vo/ConsumeUser.java
  19. 26
      src/main/java/com/example/demo/domain/vo/Gold.java
  20. 42
      src/main/java/com/example/demo/domain/vo/GoldDetail.java
  21. 41
      src/main/java/com/example/demo/domain/vo/GoldUser.java
  22. 27
      src/main/java/com/example/demo/domain/vo/Page.java
  23. 27
      src/main/java/com/example/demo/domain/vo/Permission.java
  24. 46
      src/main/java/com/example/demo/domain/vo/RefundUser.java
  25. 64
      src/main/java/com/example/demo/domain/vo/Result.java
  26. 17
      src/main/java/com/example/demo/domain/vo/TestRequest.java
  27. 25
      src/main/java/com/example/demo/domain/vo/Total.java
  28. 45
      src/main/java/com/example/demo/domain/vo/WorkbenchCard.java
  29. 65
      src/main/java/com/example/demo/domain/vo/WorkbenchMarketCard.java
  30. 17
      src/main/java/com/example/demo/mapper/AdminMapper.java
  31. 26
      src/main/java/com/example/demo/mapper/ConsumeMapper.java
  32. 1
      src/main/java/com/example/demo/mapper/GeneralMapper.java
  33. 25
      src/main/java/com/example/demo/mapper/GoldDetailMapper.java
  34. 31
      src/main/java/com/example/demo/mapper/PermissionMapper.java
  35. 27
      src/main/java/com/example/demo/mapper/RefundMapper.java
  36. 62
      src/main/java/com/example/demo/mapper/StatisticsMapper.java
  37. 25
      src/main/java/com/example/demo/mapper/UserMapper.java
  38. 23
      src/main/java/com/example/demo/mapper/WorkBenchMapper.java
  39. 6
      src/main/java/com/example/demo/security/TokenFilter.java
  40. 28
      src/main/java/com/example/demo/service/ConsumeService.java
  41. 16
      src/main/java/com/example/demo/service/GeneralService.java
  42. 22
      src/main/java/com/example/demo/service/GoldDetailService.java
  43. 29
      src/main/java/com/example/demo/service/PermissionService.java
  44. 28
      src/main/java/com/example/demo/service/RefundService.java
  45. 22
      src/main/java/com/example/demo/service/StatisticsService.java
  46. 19
      src/main/java/com/example/demo/service/UserService.java
  47. 19
      src/main/java/com/example/demo/service/WorkbenchService.java
  48. 165
      src/main/java/com/example/demo/serviceImpl/ConsumeServiceImpl.java
  49. 64
      src/main/java/com/example/demo/serviceImpl/GeneralServiceImpl.java
  50. 53
      src/main/java/com/example/demo/serviceImpl/GoldDetailServiceImpl.java
  51. 115
      src/main/java/com/example/demo/serviceImpl/PermissionServiceImpl.java
  52. 88
      src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java
  53. 303
      src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java
  54. 38
      src/main/java/com/example/demo/serviceImpl/UserServiceImpl.java
  55. 212
      src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java
  56. 10
      src/main/resources/application.yml
  57. 9
      src/main/resources/mapper/AdminMapper.xml
  58. 104
      src/main/resources/mapper/ConsumeMapper.xml
  59. 3
      src/main/resources/mapper/GeneralMapper.xml
  60. 94
      src/main/resources/mapper/GoldDetailMapper.xml
  61. 73
      src/main/resources/mapper/PermissionMapper.xml
  62. 106
      src/main/resources/mapper/RefundMapper.xml
  63. 144
      src/main/resources/mapper/StatisticsMapper.xml
  64. 52
      src/main/resources/mapper/UserMapper.xml
  65. 86
      src/main/resources/mapper/WorkBenchMapper.xml

5
pom.xml

@ -84,6 +84,11 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
</dependencies>
<build>

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) {

31
src/main/java/com/example/demo/Util/BusinessException.java

@ -0,0 +1,31 @@
package com.example.demo.Util;
/**
* @program: GOLD
* @ClassName BusinessException
* @description:
* @author: huangqizhen
* @create: 202506-23 14:58
* @Version 1.0
**/
import lombok.Getter;
/**
* 业务异常可抛出到前端
*/
@Getter
public class BusinessException extends RuntimeException {
private int code; // 业务状态码
// 使用默认状态码0的构造方法
public BusinessException(String message) {
this(400, message); // 默认状态码400
}
// 指定状态码的构造方法
public BusinessException(int code, String message) {
super(message);
this.code = code;
}
}

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

@ -0,0 +1,190 @@
/*
package com.example.demo.Util;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Set;
import java.util.concurrent.*;
@Component
public class RedisUtil {
@Resource
private RedisTemplate<String, Object> redisTemplate;
// 线程池用于处理延迟消息
private ExecutorService delayMessageExecutor;
// 延迟消息处理线程数
private static final int DELAY_THREAD_POOL_SIZE = 4;
// 延迟队列轮询间隔(毫秒)
private static final long DELAY_QUEUE_POLL_INTERVAL = 1000L;
@PostConstruct
public void init() {
// 初始化线程池
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;
while (System.currentTimeMillis() < endTime) {
Object message = redisTemplate.opsForList().leftPop(queueName, 1, TimeUnit.SECONDS);
if (message != null) {
return message;
}
}
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();
redisTemplate.execute(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) {
connection.openPipeline();
// 直接存储消息内容到ZSet的value中
connection.zAdd(
delayQueueKey.getBytes(),
System.currentTimeMillis() + delay * 1000,
serializeMessage(messageId, message)
);
connection.closePipeline();
return null;
}
});
}
*/
/**
* 启动延迟消息处理任务
*//*
@Scheduled(fixedRate = DELAY_QUEUE_POLL_INTERVAL)
public void processDelayMessages() {
Set<String> delayQueues = redisTemplate.keys("delay:*");
if (delayQueues != null) {
for (String delayQueue : delayQueues) {
delayMessageExecutor.execute(() -> {
String queueName = delayQueue.substring(6); // 去掉"delay:"前缀
processSingleDelayQueue(queueName);
});
}
}
}
*/
/**
* 处理单个延迟队列
*//*
private void processSingleDelayQueue(String queueName) {
String delayQueueKey = getDelayQueueKey(queueName);
long now = System.currentTimeMillis();
// 获取所有已到期的消息
Set<ZSetOperations.TypedTuple<Object>> messages = redisTemplate.opsForZSet()
.rangeByScoreWithScores(delayQueueKey, 0, now);
if (messages != null && !messages.isEmpty()) {
for (ZSetOperations.TypedTuple<Object> tuple : messages) {
Object messageWithId = tuple.getValue();
if (messageWithId != null) {
// 反序列化消息
Object message = deserializeMessage(messageWithId.toString());
// 发送到实际队列
sendMessage(queueName, message);
// 从延迟队列中移除
redisTemplate.opsForZSet().remove(delayQueueKey, messageWithId);
}
}
}
}
// 生成消息ID
private String generateMessageId() {
return java.util.UUID.randomUUID().toString();
}
// 获取延迟队列key
private String getDelayQueueKey(String queueName) {
return "delay:" + queueName;
}
// 序列化消息(可根据实际需求实现)
private byte[] serializeMessage(String messageId, Object message) {
// 这里简单实现实际项目中可以使用JSON序列化等
return (messageId + ":" + message.toString()).getBytes();
}
// 反序列化消息(可根据实际需求实现)
private Object deserializeMessage(String serialized) {
// 简单实现根据实际序列化方式调整
int separatorIndex = serialized.indexOf(':');
if (separatorIndex > 0) {
return serialized.substring(separatorIndex + 1);
}
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 {
}
*/

94
src/main/java/com/example/demo/controller/ConsumeController.java

@ -0,0 +1,94 @@
package com.example.demo.controller;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.ConsumeUser;
import com.example.demo.domain.vo.Gold;
import com.example.demo.domain.vo.Page;
import com.example.demo.domain.vo.Result;
import com.example.demo.service.ConsumeService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
/**
* @program: gold-java
* @ClassName ConsumeController
* @description:消费模块
* @author: Double
* @create: 202506-23 13:06
* @Version 1.0
**/
@RestController
@RequestMapping("/consume")
@RequiredArgsConstructor
@Slf4j
@CrossOrigin
public class ConsumeController {
@Autowired
private ConsumeService consumeService;
//消耗明细
@PostMapping("/selectAll")
public Result selcetAll(@RequestBody Page page) {
try {
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
} else {
return Result.success(consumeService.selectAll(page.getPageNum(), page.getPageSize()));
}
} catch (Exception e) {
return Result.error("接口调用失败");
}
}
//消耗明细筛选
@PostMapping("/selectBy")
public Result selcetBy(@RequestBody Page page) {
try {
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
} else {
return Result.success(consumeService.selectBy(page.getPageNum(), page.getPageSize(), page.getConsumeUser()));
}
} catch (Exception e) {
return Result.error("接口调用失败");
}
}
//消耗金币统计
@PostMapping("/statsGold")
public Result statsGold() {
try {
Gold gold = consumeService.statsGold();
return Result.success(gold);
} catch (Exception e) {
return Result.error("接口调用失败");
}
}
//消耗金币增加
@PostMapping("/add")
public Result add(@RequestBody ConsumeUser consumeUser) {
try {
return consumeService.add(consumeUser);
} catch (Exception e) {
return Result.error("接口调用失败");
}
}
}

6
src/main/java/com/example/demo/controller/GeneralController.java

@ -41,4 +41,10 @@ public class GeneralController {
List<String> list = generalService.getPlatform();
return Result.success(list);
}
@PostMapping("/goods")
public Result getGoods()
{
List<String> list = generalService.getGoods();
return Result.success(list);
}
}

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

@ -0,0 +1,61 @@
package com.example.demo.controller;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.GoldDetail;
import com.example.demo.domain.vo.Page;
import com.example.demo.domain.vo.Result;
import com.example.demo.service.GoldDetailService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
/**
* @program: GOLD
* @ClassName GoldDetailController
* @description:
* @author: huangqizhen
* @create: 202506-23 14:41
* @Version 1.0
**/
@RestController
@RequestMapping("/goldDetail")
@RequiredArgsConstructor
@Slf4j
@CrossOrigin
public class GoldDetailController {
private final GoldDetailService goldDetailService;
@PostMapping("/getGoldDetail")
public Result getGoldDetail(@RequestBody Page page){
if(ObjectUtils.isEmpty(page.getPageNum())){
return Result.error("页码数为空!");
}
if(ObjectUtils.isEmpty(page.getPageSize())){
return Result.error("页大小为空!");
}
else{
return Result.success(goldDetailService.getGoldDetail(page.getPageNum(), page.getPageSize(), page.getGoldDetail()));
}
}
@PostMapping("/getTotal")
public Result getTotal(@RequestBody GoldDetail goldDetail) {
return Result.success(goldDetailService.getTotal(goldDetail));
}
@PostMapping("/goldTotal")
public Result GoldTotal(@RequestBody User user) {
return Result.success(goldDetailService.GoldTotal(user));
}
@PostMapping("/getGold")
public Result getGold(@RequestBody Page page) {
System.out.println( page);
if(ObjectUtils.isEmpty(page.getPageNum())){
return Result.error("页码数为空!");
}
if(ObjectUtils.isEmpty(page.getPageSize())){
return Result.error("页大小为空!");
}
return Result.success(goldDetailService.getGold(page.getPageNum(), page.getPageSize(), page.getUser()));
}
}

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));
}
}

78
src/main/java/com/example/demo/controller/RefundController.java

@ -0,0 +1,78 @@
package com.example.demo.controller;
import com.example.demo.domain.vo.Gold;
import com.example.demo.domain.vo.Page;
import com.example.demo.domain.vo.Result;
import com.example.demo.service.ConsumeService;
import com.example.demo.service.RefundService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
/**
* @program: gold-java
* @ClassName RefundMapper.xml
* @description:
* @author: Double
* @create: 202506-26 11:28
* @Version 1.0
**/
@RestController
@RequestMapping("/refund")
@RequiredArgsConstructor
@Slf4j
@CrossOrigin
public class RefundController {
@Autowired
private RefundService refundService;
//退款明细
@PostMapping("/selectAll")
public Result selcetAll(@RequestBody Page page) {
try {
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
} else {
return Result.success(refundService.selectAll(page.getPageNum(), page.getPageSize()));
}
} catch (Exception e) {
return Result.error("接口调用失败");
}
}
@PostMapping("/selectBy")
public Result selcetBy(@RequestBody Page page) {
try {
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
} else {
return Result.success(refundService.selectBy(page.getPageNum(), page.getPageSize(), page.getRefundUser()));
}
} catch (Exception e) {
return Result.error("接口调用失败");
}
}
@PostMapping("/statsGold")
public Result statsGold() {
try {
Gold gold = refundService.statsGold();
return Result.success(gold);
} catch (Exception e) {
return Result.error("接口调用失败");
}
}
}

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

@ -1,13 +1,20 @@
package com.example.demo.controller;
import com.example.demo.domain.entity.Statistics;
import com.example.demo.domain.vo.Result;
import com.example.demo.service.GeneralService;
import com.example.demo.service.StatisticsService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.List;
/**
* @program: gold-java
* @ClassName StatisticsController
@ -25,4 +32,20 @@ import org.springframework.web.bind.annotation.RestController;
public class StatisticsController {
@Autowired
private StatisticsService statisticsService;
@Autowired
private GeneralService generalService;
//测试定时任务part1
@PostMapping("/Hourly1")
public void HourlyTask1() {
statisticsService.runHourlyTaskPart1();
}
//测试定时任务part2
@PostMapping("/Hourly2")
public void HourlyTask2() {
statisticsService.runHourlyTaskPart2();
}
}

41
src/main/java/com/example/demo/controller/UserController.java

@ -0,0 +1,41 @@
package com.example.demo.controller;
import com.example.demo.domain.vo.Gold;
import com.example.demo.domain.vo.GoldUser;
import com.example.demo.domain.vo.Result;
import com.example.demo.service.ConsumeService;
import com.example.demo.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @program: gold-java
* @ClassName UserController
* @description:
* @author: Double
* @create: 202506-25 10:25
* @Version 1.0
**/
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
@Slf4j
@CrossOrigin
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/selectUser")
public Result selectUser(@RequestBody GoldUser user) {
try {
user = userService.selectUser(user.getJwcode().toString());
return Result.success(user);
} catch (Exception e) {
return Result.error("接口调用失败");
}
}
}

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;
}

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

@ -0,0 +1,33 @@
package com.example.demo.domain.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @program: GOLD
* @ClassName Export
* @description:
* @author: huangqizhen
* @create: 202506-24 16:17
* @Version 1.0
**/
@Data
@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; // 失败原因
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime; // 创建时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
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;

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

@ -27,6 +27,7 @@ public class User implements Serializable {
private Integer currentFreeDecember; // 当前十二月免费金币
private Integer currentTaskGold; // 当前任务金币
private Integer rechargeNum; // 充值次数
private Integer sumConsume; // 历史消费
private Integer consumeNum; // 消费次数
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "Asia/Shanghai")
@ -37,4 +38,6 @@ public class User implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date updateTime; // 更新时间
private String sortField; //排序字段
private String sortOrder; //排序顺序
}

46
src/main/java/com/example/demo/domain/vo/ConsumeUser.java

@ -0,0 +1,46 @@
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;
/**
* @program: gold-java
* @ClassName Consume
* @description: 消费明细
* @author: Double
* @create: 202506-23 11:53
* @Version 1.0
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ConsumeUser implements Serializable {
private static final long serialVersionUID = 1L;
private String name; // 客户姓名
private Integer jwcode; // 精网号
private String market; // 所属地区
private String goodsName; // 商品名称
private String payPlatform; // 消费平台
private Integer sumGold; // 金币总数
private Integer permanentGold; // 永久金币
private Integer freeGold; // 免费金币
private Integer taskGold; // 任务金币
private String remark; // 备注
private Integer adminId; //提交人Id
private String adminName; //提交人姓名
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime; // 消费时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date startTime; // 开始时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date endTime; // 结束时间
}

26
src/main/java/com/example/demo/domain/vo/Gold.java

@ -0,0 +1,26 @@
package com.example.demo.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @program: gold-java
* @ClassName Gold
* @description: 金币信息
* @author: Double
* @create: 202506-23 15:53
* @Version 1.0
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Gold implements Serializable {
private static final long serialVersionUID = 1L;
private Integer permanentGolds; // 永久金币总数
private Integer freeGolds; // 免费金币总数
private Integer taskGolds; // 任务金币总数
}

42
src/main/java/com/example/demo/domain/vo/GoldDetail.java

@ -0,0 +1,42 @@
package com.example.demo.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @program: GOLD
* @ClassName GoldDetail
* @description:
* @author: huangqizhen
* @create: 202506-23 13:03
* @Version 1.0
**/
@Data
@NoArgsConstructor
public class GoldDetail {
private static final long serialVersionUID = 1L;
private String token;
private String name; // 名称
private Integer jwcode; // 精网号
private String market; // 所属地区
private String payPlatform; // 支付平台
private Integer type; // 类型
private Integer sumGold; // 总金币
private Integer permentGold; //永久金币
private Integer freeJune; // 免费金币六月到期
private Integer freeDecember; // 免费金币七月到期
private Integer taskGold; // 任务金币
private String adminName; //提交人
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date startTime; // 开始时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date endTime; // 结束时间
private String sortField; //排序字段
private String sortOrder; //排序顺序
}

41
src/main/java/com/example/demo/domain/vo/GoldUser.java

@ -0,0 +1,41 @@
package com.example.demo.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @program: gold-java
* @ClassName ConsumeUser
* @description:
* @author: Double
* @create: 202506-24 18:30
* @Version 1.0
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GoldUser {
private String name; // 客户姓名
private Integer jwcode; // 精网号
private String market; // 所属地区
private Integer NowSumGold; // 当前金币总数
private Integer NowPermanentGold; // 当前永久金币
private Integer NowFreeGold; // 当前免费金币
private Integer NowFreeJune; // 免费金币6月
private Integer NowFreeDecember; // 免费金币12月
private Integer NowTaskGold; // 当前任务金币
private Integer historySumGold; // 历史金币总数
private Integer historyPermanentGold; // 历史永久金币
private Integer historyFreeGold; // 历史免费金币
private Integer historyTaskGold; // 历史任务金币
private Integer rechargeNum; // 充值次数
private Integer consumeNum; // 消费次数
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "Asia/Shanghai")
private Date firstRecharge; // 首充日期
}

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

@ -0,0 +1,27 @@
package com.example.demo.domain.vo;
import com.example.demo.domain.entity.User;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: GOLD
* @ClassName Page
* @description:
* @author: huangqizhen
* @create: 202506-23 16:23
* @Version 1.0
**/
@Data
@NoArgsConstructor
public class Page {
private static final long serialVersionUID = 1L;
private Integer pageNum;
private Integer pageSize;
private GoldDetail goldDetail;
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
}

46
src/main/java/com/example/demo/domain/vo/RefundUser.java

@ -0,0 +1,46 @@
package com.example.demo.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @program: gold-java
* @ClassName RefundUser
* @description:
* @author: Double
* @create: 202506-26 11:29
* @Version 1.0
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RefundUser {
private static final long serialVersionUID = 1L;
private String name; // 客户姓名
private Integer jwcode; // 精网号
private String market; // 所属地区
private String goodsName; // 商品名称
private String refundType; // 退款类型
private Byte refundModel; // 退款方式0全部/1部分退款
private Integer sumGold; // 金币总数
private Integer permanentGold; // 永久金币
private Integer freeGold; // 免费金币
private Integer taskGold; // 任务金币
private String remark; // 退款原因
private Integer adminId; //提交人Id
private String adminName; //提交人姓名
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime; // 创建时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date startTime; // 开始时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date endTime; // 结束时间
}

64
src/main/java/com/example/demo/domain/vo/Result.java

@ -1,5 +1,6 @@
package com.example.demo.domain.vo;
import com.example.demo.Util.BusinessException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
@ -8,40 +9,67 @@ import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.HashMap;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result implements Serializable {
private static final long serialVersionUID = 1L;
private Integer code;
private String msg;
private Object data;
private Integer code; // 响应码200 代表成功401 代表未授权
private String msg; // 响应消息
private Object data; // 返回的数据
public static Result success(Integer code, String msg, Object data) {
return new Result(code, msg, data);
// 成功响应不需要给前端返回数据
public static Result success() {
return new Result(200, "success", new HashMap<>());
}
public static Result success(Integer code, Object data) {
return success(code, "操作成功", data);
// 查询成功响应把查询结果作为返回数据响应给前端
public static Result success(Object data) {
return new Result(200, "success", data);
}
public static Result success(String msg, Object data) {return success(200, msg, data);}
public static Result success(Object data){
return success(200, data);
// 失败响应
public static Result error(String msg) {
return new Result(0, msg, new HashMap<>());
}
public static Result success(){
return success(null);
// 失败响应可以自定义错误码
public static Result error(int code, String msg) {
return new Result(code, msg, new HashMap<>());
}
public static Result error(Integer code, String msg, Object data){
return new Result(code, msg, data);
// 成功响应可以自定义消息和数据
public static Result success(String msg, HashMap<String, Object> resultData) {
return new Result(200, msg, resultData); // 返回成功响应状态码为 200
}
public static Result error(Integer code, String msg){
return error(code, msg, null);
// 未授权响应可以自定义错误码
public static Result unauthorized(int code, String msg) {
return new Result(code, msg, new HashMap<>());
}
public static Result error(String msg){
return error(0, msg);
// 错误响应状态码为200code为401
public static Result unauthorized(String msg) {
return new Result(401, msg, new HashMap<>());
}
//失败响应 自定义状态码 默认为500
public static Result error(BusinessException e) {
Result response = new Result();
// 定义默认错误码映射
final int defaultErrorCode = 400;
// 检查 getCode() 是否为 null如果是 Integer
Integer code = e.getCode();
if (code == null || code == 0) {
response.setCode(defaultErrorCode); // 默认错误码
} else {
response.setCode(code);
}
response.setMsg(e.getMessage());
return response;
}
public String toJson() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(this);

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;
}

25
src/main/java/com/example/demo/domain/vo/Total.java

@ -0,0 +1,25 @@
package com.example.demo.domain.vo;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: GOLD
* @ClassName Total
* @description:
* @author: huangqizhen
* @create: 202506-23 16:53
* @Version 1.0
**/
@Data
@NoArgsConstructor
public class Total {
private static final long serialVersionUID = 1L;
private String token;
private Integer Goldtotal;
private Integer permanentGold;
private Integer freeGold;
private Integer taskGold;
}

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);
}

26
src/main/java/com/example/demo/mapper/ConsumeMapper.java

@ -0,0 +1,26 @@
package com.example.demo.mapper;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.ConsumeUser;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @program: gold-java
* @ClassName ConsumeMapper
* @description:
* @author: Double
* @create: 202506-23 13:45
* @Version 1.0
**/
@Mapper
public interface ConsumeMapper {
List<ConsumeUser> selectAll();
List<ConsumeUser> selectBy(ConsumeUser consumeUser);
void add(UserGoldRecord userGoldRecord);
}

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

@ -16,4 +16,5 @@ import java.util.List;
public interface GeneralMapper {
List<String> getMarket();
List<String> getPlatform();
List<String> getGoods();
}

25
src/main/java/com/example/demo/mapper/GoldDetailMapper.java

@ -0,0 +1,25 @@
package com.example.demo.mapper;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.GoldDetail;
import com.example.demo.domain.vo.Total;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @program: GOLD
* @ClassName GoldDetailMapper
* @description:
* @author: huangqizhen
* @create: 202506-23 13:47
* @Version 1.0
**/
@Mapper
public interface GoldDetailMapper {
List<GoldDetail> getGoldDetail(GoldDetail goldDetail);
Total getTotal(GoldDetail goldDetail);
List<User> getGold(User user);
Total GoldTotal(User user);
}

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);
}

27
src/main/java/com/example/demo/mapper/RefundMapper.java

@ -0,0 +1,27 @@
package com.example.demo.mapper;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.ConsumeUser;
import com.example.demo.domain.vo.RefundUser;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @program: gold-java
* @ClassName RefundMapper
* @description:
* @author: Double
* @create: 202506-27 11:31
* @Version 1.0
**/
@Mapper
public interface RefundMapper {
List<RefundUser> selectAll();
List<RefundUser> selectBy(RefundUser refundUser);
void add(UserGoldRecord userGoldRecord);
}

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

@ -0,0 +1,62 @@
package com.example.demo.mapper;
import com.example.demo.domain.entity.Statistics;
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;
/**
* @program: gold-java
* @ClassName StatisticsMapper
* @description:
* @author: Ethan
* @create: 202506-23 14:08
* @Version 1.0
**/
@Mapper
public interface StatisticsMapper {
//根据地区审核状态起止时间查询订单表数据
List<UserGoldRecord> findByMarketAndAuditStatus(@Param("market") String market,
@Param("auditStatusList") List<Integer> auditStatusList,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
//获取某地区当前永久金币余量
Integer sumCurrentPermanentGold(@Param("market") String market);
//获取某地区当前六月免费金币余量
Integer sumCurrentFreeJune(@Param("market") String market);
//获取某地区当前永久金币余量
Integer sumCurrentFreeDecember(@Param("market") String market);
//获取某地区当前永久金币余量
Integer sumCurrentTaskGold(@Param("market") String market);
//计算该天充值人数
Integer countRechargeNum(
@Param("market") String market,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
//计算该天首充人数
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);
}

25
src/main/java/com/example/demo/mapper/UserMapper.java

@ -0,0 +1,25 @@
package com.example.demo.mapper;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.Gold;
import com.example.demo.domain.vo.GoldUser;
import org.apache.ibatis.annotations.Mapper;
/**
* @program: gold-java
* @ClassName UserMapper
* @description:
* @author: Double
* @create: 202506-25 10:40
* @Version 1.0
**/
@Mapper
public interface UserMapper {
GoldUser selectUser(String jwcode);
GoldUser selectGold(String jwcode);
void updateGold(User user);
}

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);
}

6
src/main/java/com/example/demo/security/TokenFilter.java

@ -228,8 +228,8 @@ public class TokenFilter extends OncePerRequestFilter {
// 检查是否是上传请求
boolean isErpRequest = request.getRequestURI().startsWith("/ERP") || request.getRequestURI().contains("ERP");
boolean isUploadRequest = request.getRequestURI().startsWith("/upload");
System.out.println(request.getRequestURI());
System.out.println(isUploadRequest);
// System.out.println(request.getRequestURI());
// System.out.println(isUploadRequest);
if (isUploadRequest ) {
// 如果是上传请求直接将请求传递给下一个过滤器或目标资源
filterChain.doFilter(request, response);
@ -237,7 +237,7 @@ public class TokenFilter extends OncePerRequestFilter {
} else {
// 使用RequestWrapper包装原始的HttpServletRequest使其输入流可以被重复读取
RequestWrapper requestWrapper = new RequestWrapper(request);
System.out.println(request);
// System.out.println(request);
// 确保请求体只被读取一次
boolean hasRequestBody = "POST".equals(requestWrapper.getMethod());

28
src/main/java/com/example/demo/service/ConsumeService.java

@ -0,0 +1,28 @@
package com.example.demo.service;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.ConsumeUser;
import com.example.demo.domain.vo.Gold;
import com.example.demo.domain.vo.Result;
import com.github.pagehelper.PageInfo;
/**
* @program: gold-java
* @ClassName ConsumeService
* @description: 消费模块
* @author: Double
* @create: 202506-23 13:58
* @Version 1.0
**/
public interface ConsumeService {
PageInfo<ConsumeUser> selectAll(Integer pageNum, Integer pageSize);
Gold statsGold();
PageInfo<ConsumeUser> selectBy(Integer pageNum, Integer pageSize, ConsumeUser consumeUser);
Result add(ConsumeUser consumeUser);
}

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

@ -1,5 +1,9 @@
package com.example.demo.service;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
/**
@ -12,6 +16,18 @@ import java.util.List;
**/
public interface GeneralService {
//获取所有市场地区
List<String> getMarket();
//获取平台
List<String> getPlatform();
List<String> getGoods();
//获取昨天的日期
Date getYesterday();
//获取某天的开始时间(00:00:00)
Date getStartOfDay(Date date);
//转换日期格式为yyyy-MM-dd
String formatDate(Date date) ;
//获取时间段内的所有日期包含起始和结束日
List<Date> getAllDatesBetween(Date start, Date end);
}

22
src/main/java/com/example/demo/service/GoldDetailService.java

@ -0,0 +1,22 @@
package com.example.demo.service;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.GoldDetail;
import com.example.demo.domain.vo.Total;
import com.github.pagehelper.PageInfo;
/**
* @program: GOLD
* @ClassName GoldDetailService
* @description:
* @author: huangqizhen
* @create: 202506-23 11:59
* @Version 1.0
**/
public interface GoldDetailService {
PageInfo<GoldDetail> getGoldDetail(Integer pageNum, Integer pageSize, GoldDetail goldDetail);
Total getTotal(GoldDetail goldDetail);
PageInfo<User> getGold(Integer pageNum, Integer pageSize, User user);
Total GoldTotal(User user);
}

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);
}

28
src/main/java/com/example/demo/service/RefundService.java

@ -0,0 +1,28 @@
package com.example.demo.service;
import com.example.demo.domain.vo.ConsumeUser;
import com.example.demo.domain.vo.Gold;
import com.example.demo.domain.vo.RefundUser;
import com.example.demo.domain.vo.Result;
import com.github.pagehelper.PageInfo;
/**
* @program: gold-java
* @ClassName RefundService
* @description:
* @author: Double
* @create: 202506-27 11:50
* @Version 1.0
**/
public interface RefundService {
PageInfo<RefundUser> selectAll(Integer pageNum, Integer pageSize);
Gold statsGold();
PageInfo<RefundUser> selectBy(Integer pageNum, Integer pageSize, RefundUser refundUser);
Result add(RefundUser refundUser);
}

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

@ -1,5 +1,9 @@
package com.example.demo.service;
import com.example.demo.domain.entity.Statistics;
import java.util.Date;
/**
* @program: gold-java
* @ClassName StatisticsService
@ -11,4 +15,22 @@ package com.example.demo.service;
public interface StatisticsService {
//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);
//新增或更新或不修改某地区某天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(余量外属性)统计数据
public Statistics getStatisticsPart2(String market, Date date);
}

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

@ -0,0 +1,19 @@
package com.example.demo.service;
import com.example.demo.domain.vo.Gold;
import com.example.demo.domain.vo.GoldUser;
/**
* @program: gold-java
* @ClassName UserService
* @description:
* @author: Double
* @create: 202506-25 10:30
* @Version 1.0
**/
public interface UserService {
GoldUser selectUser(String jwcode);
GoldUser selectgold(String jwcode);
}

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);
}

165
src/main/java/com/example/demo/serviceImpl/ConsumeServiceImpl.java

@ -0,0 +1,165 @@
package com.example.demo.serviceImpl;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.ConsumeUser;
import com.example.demo.domain.vo.Gold;
import com.example.demo.domain.vo.GoldUser;
import com.example.demo.domain.vo.Result;
import com.example.demo.mapper.ConsumeMapper;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.ConsumeService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @program: gold-java
* @ClassName ConsumeServiceImpl
* @description: 消费模块
* @author: Double
* @create: 202506-23 13:58
* @Version 1.0
**/
@Service
public class ConsumeServiceImpl implements ConsumeService {
@Autowired
private ConsumeMapper consumeMapper;
@Autowired
private UserMapper userMapper;
//消耗明细
@Override
public PageInfo<ConsumeUser> selectAll(Integer pageNum, Integer pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<ConsumeUser> consumeUsers = consumeMapper.selectAll();
return new PageInfo<>(consumeUsers);
}
//消耗金币统计
@Override
public Gold statsGold() {
Gold gold = new Gold();
List<ConsumeUser> consumeUsers = consumeMapper.selectAll();
// 初始化累加器
int permanentGoldSum = 0;
int freeGoldSum = 0;
int taskGoldSum = 0;
// 遍历消费记录并累加金币
for (ConsumeUser consumeUser : consumeUsers) {
// 累加永久金币
if (consumeUser.getPermanentGold() != null) {
permanentGoldSum += consumeUser.getPermanentGold();
}
// 累加免费金币
if (consumeUser.getFreeGold() != null) {
freeGoldSum += consumeUser.getFreeGold();
}
// 累加任务金币
if (consumeUser.getTaskGold() != null) {
taskGoldSum += consumeUser.getTaskGold();
}
}
// 将累加结果设置到Gold对象
gold.setPermanentGolds(permanentGoldSum);
gold.setFreeGolds(freeGoldSum);
gold.setTaskGolds(taskGoldSum);
return gold;
}
//消耗明细筛选
@Override
public PageInfo<ConsumeUser> selectBy(Integer pageNum, Integer pageSize, ConsumeUser consumeUser) {
PageHelper.startPage(pageNum, pageSize);
List<ConsumeUser> consumeUsers = consumeMapper.selectBy(consumeUser);
return new PageInfo<>(consumeUsers);
}
//新增消耗
@Override
public Result add(ConsumeUser consumeUser) {
UserGoldRecord userGoldRecord = new UserGoldRecord();
// 获取当前时间戳部分
String timestampPart = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
// 获取自增计数器部分三位数不足补零
AtomicInteger atomicInteger = new AtomicInteger(0);
int count = atomicInteger.getAndUpdate(c -> (c >= 999) ? 0 : c + 1);
String counterPart = String.format("%03d", count);
// 生成随机数部分四位数
Random RANDOM = new Random();
int randomNum = RANDOM.nextInt(9000) + 1000;
//订单号生成
userGoldRecord.setOrderCode(timestampPart + counterPart + randomNum);
userGoldRecord.setJwcode(consumeUser.getJwcode());
userGoldRecord.setGoodsName(consumeUser.getGoodsName());
userGoldRecord.setSumGold(consumeUser.getSumGold());
userGoldRecord.setPermanentGold(consumeUser.getPermanentGold());
// 获取当前月份1-12
int currentMonth = LocalDate.now().getMonthValue();
GoldUser gold = userMapper.selectGold(consumeUser.getJwcode().toString());
if (consumeUser.getFreeGold() > (gold.getNowFreeDecember() + gold.getNowFreeJune()) || consumeUser.getPermanentGold() > gold.getNowPermanentGold()
|| consumeUser.getTaskGold() > gold.getNowTaskGold()) {
return Result.error("金币数量不足");
}
// 根据当前月份设置对应字段
if (currentMonth >= 1 && currentMonth <= 6) {
// 1-6月设置6月额度12月保持默认值
if (consumeUser.getFreeGold() > gold.getNowFreeJune()) {
userGoldRecord.setFreeJune(gold.getNowFreeJune());
userGoldRecord.setFreeDecember(consumeUser.getFreeGold() - gold.getNowFreeJune());
} else {
userGoldRecord.setFreeJune(consumeUser.getFreeGold());
userGoldRecord.setFreeDecember(0);
}
} else {
// 7-12月设置12月额度6月保持默认值
if (consumeUser.getFreeGold() > gold.getNowFreeDecember()) {
userGoldRecord.setFreeDecember(gold.getNowFreeDecember());
userGoldRecord.setFreeJune(consumeUser.getFreeGold() - gold.getNowFreeDecember());
} else {
userGoldRecord.setFreeDecember(consumeUser.getFreeGold());
userGoldRecord.setFreeJune(0);
}
}
userGoldRecord.setTaskGold(consumeUser.getTaskGold());
userGoldRecord.setRemark(consumeUser.getRemark());
userGoldRecord.setType((byte) 1);
userGoldRecord.setIsRefund((byte) 0);
userGoldRecord.setPayPlatform("金币系统");
userGoldRecord.setAdminId(consumeUser.getAdminId());
userGoldRecord.setCreateTime(new Date());
userGoldRecord.setPayTime(new Date());
consumeMapper.add(userGoldRecord);
User user = new User();
user.setJwcode(userGoldRecord.getJwcode());
user.setCurrentPermanentGold(gold.getNowPermanentGold() - consumeUser.getPermanentGold());
user.setCurrentFreeJune(gold.getNowFreeJune() - userGoldRecord.getFreeJune());
user.setCurrentFreeDecember(gold.getNowFreeDecember() - userGoldRecord.getFreeDecember());
user.setCurrentTaskGold(gold.getNowTaskGold() - consumeUser.getTaskGold());
user.setConsumeNum(gold.getConsumeNum() + 1);
user.setSumConsume(consumeUser.getPermanentGold() + consumeUser.getFreeGold() + consumeUser.getTaskGold());
userMapper.updateGold(user);
return Result.success();
}
}

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

@ -5,6 +5,12 @@ import com.example.demo.service.GeneralService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
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;
/**
@ -32,4 +38,62 @@ public class GeneralServiceImpl implements GeneralService {
List<String> list = generalMapper.getPlatform();
return list;
}
@Override
public List<String> getGoods() {
List<String> list = generalMapper.getGoods();
return list;
}
/*
获取昨天的日期
*/
@Override
public Date getYesterday() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, -1); //当前天数-1
return getStartOfDay(cal.getTime()); //昨天的00:00:00
}
/*
获取某天的开始时间(00:00:00)
*/
@Override
public Date getStartOfDay(Date date) {
LocalDateTime localDate = date.toInstant()
.atZone(ZoneId.systemDefault()) // 转换为本地时区
.toLocalDateTime()
.with(LocalTime.MIN); // 设置时间为当天 00:00:00
return Date.from(localDate.atZone(ZoneId.systemDefault()).toInstant());
}
/*
转换日期格式为yyyy-MM-dd
*/
@Override
public String formatDate(Date date) {
return date.toInstant()
.atZone(ZoneId.systemDefault())
.format(java.time.format.DateTimeFormatter.ISO_LOCAL_DATE); // 输出格式如 "2025-10-01"
}
/*
获取时间段内的所有日期包含起始和结束日
*/
@Override
public List<Date> getAllDatesBetween(Date start, Date end) {
List<Date> dates = new ArrayList<>();
//初始化日历对象
Calendar tempStart = Calendar.getInstance();
tempStart.setTime(start);
Calendar tempEnd = Calendar.getInstance();
tempEnd.setTime(end);
while (!tempStart.after(tempEnd)) {
dates.add(tempStart.getTime()); // 将当前日期添加到列表中
tempStart.add(Calendar.DAY_OF_YEAR, 1); // 每次增加一天
}
return dates;
}
}

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

@ -0,0 +1,53 @@
package com.example.demo.serviceImpl;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.GoldDetail;
import com.example.demo.domain.vo.Total;
import com.example.demo.mapper.GoldDetailMapper;
import com.example.demo.service.GoldDetailService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @program: GOLD
* @ClassName GoldDetailServiceImpl
* @description:
* @author: huangqizhen
* @create: 202506-23 13:44
* @Version 1.0
**/
@Service
public class GoldDetailServiceImpl implements GoldDetailService {
@Autowired
private GoldDetailMapper goldDetailMapper;
@Override
public PageInfo<GoldDetail> getGoldDetail(Integer pageNum, Integer pageSize, GoldDetail goldDetail) {
PageHelper.startPage(pageNum, pageSize);
List<GoldDetail> list= goldDetailMapper.getGoldDetail(goldDetail);
return new PageInfo<>(list);
}
@Override
public Total getTotal(GoldDetail goldDetail) {
return goldDetailMapper.getTotal(goldDetail);
}
@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);
}
@Override
public Total GoldTotal(User user) {
return goldDetailMapper.GoldTotal(user);
}
}

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);
}
}

88
src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java

@ -0,0 +1,88 @@
package com.example.demo.serviceImpl;
import com.example.demo.domain.vo.ConsumeUser;
import com.example.demo.domain.vo.Gold;
import com.example.demo.domain.vo.RefundUser;
import com.example.demo.domain.vo.Result;
import com.example.demo.mapper.ConsumeMapper;
import com.example.demo.mapper.RefundMapper;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.RefundService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @program: gold-java
* @ClassName RefundServiceImpl
* @description:
* @author: Double
* @create: 202506-27 11:50
* @Version 1.0
**/
@Service
public class RefundServiceImpl implements RefundService {
@Autowired
private RefundMapper refundMapper;
@Autowired
private UserMapper userMapper;
@Override
public PageInfo<RefundUser> selectAll(Integer pageNum, Integer pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<RefundUser> refundUsers = refundMapper.selectAll();
return new PageInfo<>(refundUsers);
}
@Override
public Gold statsGold() {
Gold gold = new Gold();
List<RefundUser> refundUsers = refundMapper.selectAll();
// 初始化累加器
int permanentGoldSum = 0;
int freeGoldSum = 0;
int taskGoldSum = 0;
// 遍历推开记录并累加金币
for (RefundUser refundUser : refundUsers) {
// 累加永久金币
if (refundUser.getPermanentGold() != null) {
permanentGoldSum += refundUser.getPermanentGold();
}
// 累加免费金币
if (refundUser.getFreeGold() != null) {
freeGoldSum += refundUser.getFreeGold();
}
// 累加任务金币
if (refundUser.getTaskGold() != null) {
taskGoldSum += refundUser.getTaskGold();
}
}
// 将累加结果设置到Gold对象
gold.setPermanentGolds(permanentGoldSum);
gold.setFreeGolds(freeGoldSum);
gold.setTaskGolds(taskGoldSum);
return gold;
}
@Override
public PageInfo<RefundUser> selectBy(Integer pageNum, Integer pageSize, RefundUser refundUser) {
PageHelper.startPage(pageNum, pageSize);
List<RefundUser> refundUsers = refundMapper.selectBy(refundUser);
return new PageInfo<>(refundUsers);
}
@Override
public Result add(RefundUser refundUser) {
return null;
}
}

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

@ -1,8 +1,23 @@
package com.example.demo.serviceImpl;
import com.example.demo.domain.entity.Statistics;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.mapper.StatisticsMapper;
import com.example.demo.service.GeneralService;
import com.example.demo.service.StatisticsService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.*;
/**
* @program: gold-java
* @ClassName StatisticsServiceImpl
@ -14,4 +29,292 @@ import org.springframework.stereotype.Service;
@Service
public class StatisticsServiceImpl implements StatisticsService {
private static final Logger log = LoggerFactory.getLogger(StatisticsServiceImpl.class);
@Autowired
private StatisticsMapper statisticsMapper;
@Autowired
private GeneralService generalService;
/*
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 runHourlyTaskPart2() {
Date today = new Date(); //取当天日期
for(String market : generalService.getMarket()){
saveStatisticsPart2(market,today);
}
}
/*
0点执行定时任务更新近一周part2数据
*/
@Override
@Scheduled(cron = "0 0 0 * * ?")
public void runDailyTaskPart2() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, -7); // 一周前
Date startDate = cal.getTime();
Date endDate = generalService.getYesterday(); // 昨天
//近一周的日期列表
List<Date> dateList =generalService.getAllDatesBetween(startDate, endDate);
for (Date date : dateList) {
for (String market : generalService.getMarket()) {
saveStatisticsPart2(market, date);
}
}
}
/*
查询某地区某天已存在的统计数据
*/
@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("数据未发生改变");
}
}
}
/*
新增或更新或不修改某地区某天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{
System.out.println("数据未发生改变");
}
}
}
//根据地区与日期获取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)+
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(consumePermanent);
//消费相关-当日新增消费六月免费
Integer consumeFreeJune = records.stream()
.filter(record -> record.getType() == 1) // 类型为消费
.mapToInt(UserGoldRecord::getFreeJune)
.sum();
statistics.setConsumeFreeJune(consumeFreeJune);
//消费相关-当日新增消费十二月免费
Integer consumeFreeDecember = records.stream()
.filter(record -> record.getType() == 1) // 类型为消费
.mapToInt(UserGoldRecord::getFreeDecember)
.sum();
statistics.setConsumeFreeDecember(consumeFreeDecember);
//消费相关-当日新增消费任务
Integer consumeTask = records.stream()
.filter(record -> record.getType() == 1) // 类型为消费
.mapToInt(UserGoldRecord::getTaskGold)
.sum();
statistics.setConsumeTask(consumeTask);
//退款相关-当日退款永久
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;
}
/*
* 判断两个统计对象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());
}
}

38
src/main/java/com/example/demo/serviceImpl/UserServiceImpl.java

@ -0,0 +1,38 @@
package com.example.demo.serviceImpl;
import com.example.demo.domain.vo.Gold;
import com.example.demo.domain.vo.GoldUser;
import com.example.demo.mapper.ConsumeMapper;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @program: gold-java
* @ClassName UserServiceImpl
* @description:
* @author: Double
* @create: 202506-25 10:32
* @Version 1.0
**/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public GoldUser selectUser(String jwcode) {
GoldUser user = userMapper.selectUser(jwcode);
return user;
}
@Override
public GoldUser selectgold(String jwcode) {
GoldUser gold = userMapper.selectGold(jwcode);
return gold;
}
}

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());
}
}

10
src/main/resources/application.yml

@ -4,7 +4,7 @@ spring:
fail-on-unknown-properties: false
datasource:
mysql1:
jdbc-url: jdbc:mysql://localhost:3306/hwgold?serverTimezone=Asia/Shanghai
jdbc-url: jdbc:mysql://192.168.8.220:3306/hwgold?serverTimezone=Asia/Shanghai
username: hwgold
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
@ -62,9 +62,9 @@ spring:
data:
redis:
database: 0
host: 54.251.137.151
port: 10703
password: 8912h12jhhajsd
host: 192.168.8.94
port: 6379
password:
timeout: 1000
lettuce:
pool:
@ -91,7 +91,7 @@ upload:
server:
port: 8080
port: 8081
logging:
level:

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>

104
src/main/resources/mapper/ConsumeMapper.xml

@ -0,0 +1,104 @@
<?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.ConsumeMapper">
<!-- 查询所有消费记录 -->
<select id="selectAll" resultType="com.example.demo.domain.vo.ConsumeUser">
SELECT u.name AS name,
u.jwcode AS jwcode,
u.market AS market,
ugr.goods_name AS goodsName,
ugr.pay_platform AS payPlatform,
ugr.sum_gold AS sumGold,
ugr.permanent_gold AS permanentGold,
(COALESCE(ugr.free_june, 0) + COALESCE(ugr.free_december, 0)) AS freeGold,
ugr.task_gold AS taskGold,
ugr.remark AS remark,
a.admin_name AS adminName,
ugr.create_time AS createTime
FROM user u
JOIN
user_gold_record ugr ON u.jwcode = ugr.jwcode
JOIN
admin a ON ugr.admin_id = a.id
WHERE ugr.type = 1
</select>
<!-- 查询筛选后消费记录 -->
<select id="selectBy" resultType="com.example.demo.domain.vo.ConsumeUser">
SELECT u.name AS name,
u.jwcode AS jwcode,
u.market AS market,
ugr.goods_name AS goodsName,
ugr.pay_platform AS payPlatform,
ugr.sum_gold AS sumGold,
ugr.permanent_gold AS permanentGold,
(COALESCE(ugr.free_june, 0) + COALESCE(ugr.free_december, 0)) AS freeGold,
ugr.task_gold AS taskGold,
ugr.remark AS remark,
a.admin_name AS adminName,
ugr.create_time AS createTime
FROM user u
JOIN
user_gold_record ugr ON u.jwcode = ugr.jwcode
JOIN
admin a ON ugr.admin_id = a.id
<where>
ugr.type = 1
<if test="jwcode != null and jwcode != ''">
AND ugr.jwcode = #{jwcode}
</if>
<if test="goodsName != null and goodsName != ''">
AND ugr.goods_name = #{goodsName}
</if>
<if test="market != null and market != ''">
AND u.market = #{market}
</if>
<if test="payPlatform != null and payPlatform != ''">
AND ugr.pay_platform = #{payPlatform}
</if>
<if test="startTime != null and endTime != null">
AND ugr.create_time BETWEEN #{startTime} AND #{endTime}
</if>
</where>
</select>
<insert id="add" parameterType="com.example.demo.domain.entity.UserGoldRecord" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user_gold_record
<trim prefix="(" suffix=")" suffixOverrides=",">
order_code,
jwcode,
sum_gold,
permanent_gold,
free_june,
free_december,
task_gold,
goods_name,
remark,
type,
pay_platform,
is_refund,
admin_id,
create_time,
pay_time
</trim>
VALUES
<trim prefix="(" suffix=")" suffixOverrides=",">
#{orderCode},
#{jwcode},
#{sumGold},
#{permanentGold},
#{freeJune},
#{freeDecember},
#{taskGold},
#{goodsName},
#{remark},
#{type},
#{payPlatform},
#{isRefund},
#{adminId},
#{createTime},
#{payTime}
</trim>
</insert>
</mapper>

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

@ -8,4 +8,7 @@
<select id="getPlatform" resultType="java.lang.String">
select DISTINCT pay_platform from user_gold_record
</select>
<select id="getGoods" resultType="java.lang.String">
select DISTINCT goods_name from user_gold_record
</select>
</mapper>

94
src/main/resources/mapper/GoldDetailMapper.xml

@ -0,0 +1,94 @@
<?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.GoldDetailMapper">
<select id="getGoldDetail" resultType="com.example.demo.domain.vo.GoldDetail">
select `user`.name, `user`.jwcode, `user`.market, `ugr`.pay_platform, `ugr`.type, `ugr`.sum_gold, `ugr`.permanent_gold, `ugr`.free_june, `ugr`.free_december, `ugr`.task_gold, `admin`.admin_name, `ugr`.audit_time
from user_gold_record ugr
left join `user` on `user`.jwcode = `ugr`.jwcode
left join `admin` on `admin`.id = `ugr`.admin_id
<where>
<if test="jwcode != null and jwcode.length > 0">
and `ugr`.jwcode = #{jwcode}
</if>
<if test="payPlatform != null and payPlatform.length > 0">
and `ugr`.pay_platform = #{payPlatform}
</if>
<if test="type != null and type.length > 0">
and `ugr`.type = #{type}
</if>
<if test="market != null and market.length > 0">
and `user`.market = #{market}
</if>
<if test="startTime != null and endTime != null">
and ugr.`audit_time` BETWEEN #{startTime} AND #{endTime}
</if>
</where>
<choose>
<when test="sortField != null and sortField.length > 0 or sortOrder != null and sortOrder.length > 0">
ORDER BY ${sortField} ${sortOrder}
</when>
<otherwise>
ORDER BY audit_time DESC
</otherwise>
</choose>
</select>
<select id="getTotal" resultType="com.example.demo.domain.vo.Total">
select sum(sum_gold) as Goldtotal, sum(permanent_gold) as permanentGold, sum(free_june+free_december) as freeGold, sum(task_gold) as taskGold
from user_gold_record
<where>
<if test="jwcode != null and jwcode.length > 0">
and `ugr`.jwcode = #{jwcode}
</if>
<if test="payPlatform != null and payPlatform.length > 0">
and `ugr`.pay_platform = #{payPlatform}
</if>
<if test="type != null and type.length > 0">
and `ugr`.type = #{type}
</if>
<if test="market != null and market.length > 0">
and `user`.market = #{market}
</if>
<if test="startTime != null and endTime != null">
and ugr.`audit_time` BETWEEN #{startTime} AND #{endTime}
</if>
</where>
</select>
<select id="getGold" resultType="com.example.demo.domain.entity.User">
select * from user
<where>
<if test="jwcode != null and jwcode.length > 0">
and jwcode = #{jwcode}
</if>
<if test="market != null and market.length > 0">
and market = #{market}
</if>
</where>
<choose>
<when test="sortField != null and sortField.length > 0 or sortOrder != null and sortOrder.length > 0">
ORDER BY ${sortField} ${sortOrder}
</when>
<otherwise>
ORDER BY create_time DESC
</otherwise>
</choose>
</select>
<select id="GoldTotal" resultType="com.example.demo.domain.vo.Total">
select
sum(current_permanent_gold) as permanentGold,
sum(current_free_june + current_free_december) as freeGold,
sum(current_task_gold) as taskGold,
sum(current_permanent_gold) + sum(current_free_june + current_free_december) + sum(current_task_gold) as Goldtotal
from `user`
<where>
<if test="jwcode != null and jwcode.length > 0">
and jwcode = #{jwcode}
</if>
<if test="market != null and market.length > 0">
and market = #{market}
</if>
</where>
</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 as 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>

106
src/main/resources/mapper/RefundMapper.xml

@ -0,0 +1,106 @@
<?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.RefundMapper">
<!-- 查询所有退款记录 -->
<select id="selectAll" resultType="com.example.demo.domain.vo.RefundUser">
SELECT u.name AS name,
u.jwcode AS jwcode,
u.market AS market,
ugr.goods_name AS goodsName,
ugr.refund_model AS refundModel,
ugr.refund_type AS refundType,
ugr.sum_gold AS sumGold,
ugr.permanent_gold AS permanentGold,
(COALESCE(ugr.free_june, 0) + COALESCE(ugr.free_december, 0)) AS freeGold,
ugr.task_gold AS taskGold,
ugr.remark AS remark,
a.admin_name AS adminName,
ugr.create_time AS createTime
FROM user u
JOIN
user_gold_record ugr ON u.jwcode = ugr.jwcode
JOIN
admin a ON ugr.admin_id = a.id
WHERE ugr.type = 2
</select>
<!-- 查询筛选后消费记录 -->
<select id="selectBy" resultType="com.example.demo.domain.vo.RefundUser">
SELECT u.name AS name,
u.jwcode AS jwcode,
u.market AS market,
ugr.goods_name AS goodsName,
ugr.refund_model AS refundModel,
ugr.refund_type AS refundType,
ugr.sum_gold AS sumGold,
ugr.permanent_gold AS permanentGold,
(COALESCE(ugr.free_june, 0) + COALESCE(ugr.free_december, 0)) AS freeGold,
ugr.task_gold AS taskGold,
ugr.remark AS remark,
a.admin_name AS adminName,
ugr.create_time AS createTime
FROM user u
JOIN
user_gold_record ugr ON u.jwcode = ugr.jwcode
JOIN
admin a ON ugr.admin_id = a.id
<where>
ugr.type = 2
<if test="jwcode != null and jwcode != ''">
AND ugr.jwcode = #{jwcode}
</if>
<if test="goodsName != null and goodsName != ''">
AND ugr.goods_name = #{goodsName}
</if>
<if test="market != null and market != ''">
AND u.market = #{market}
</if>
<if test="refundModel != null and refundModel != ''">
AND ugr.refund_model = #{refundModel}
</if>
<if test="startTime != null and endTime != null">
AND ugr.create_time BETWEEN #{startTime} AND #{endTime}
</if>
</where>
</select>
<insert id="add" parameterType="com.example.demo.domain.entity.UserGoldRecord" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user_gold_record
<trim prefix="(" suffix=")" suffixOverrides=",">
order_code,
jwcode,
sum_gold,
permanent_gold,
free_june,
free_december,
task_gold,
goods_name,
remark,
type,
pay_platform,
is_refund,
admin_id,
create_time,
pay_time
</trim>
VALUES
<trim prefix="(" suffix=")" suffixOverrides=",">
#{orderCode},
#{jwcode},
#{sumGold},
#{permanentGold},
#{freeJune},
#{freeDecember},
#{taskGold},
#{goodsName},
#{remark},
#{type},
#{payPlatform},
#{isRefund},
#{adminId},
#{createTime},
#{payTime}
</trim>
</insert>
</mapper>

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

@ -0,0 +1,144 @@
<?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.StatisticsMapper">
<!--新增part2统计数据-->
<insert id="insertPart2">
INSERT INTO statistics (
market, current_datetime,
recharge, money,
consume_permanent, consume_free_june,
consume_free_december, consume_task,
refund_permanent, refund_free_june,
refund_free_december,refund_task,
recharge_num, first_recharge
) VALUES (
#{market}, #{currentDatetime},
#{recharge}, #{money},
#{consumePermanent}, #{consumeFreeJune},
#{consumeFreeDecember}, #{consumeTask},
#{refundPermanent}, #{refundFreeJune},
#{refundFreeDecember}, #{refundTask},
#{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" parameterType="map">
UPDATE statistics
SET
recharge = #{recharge},
money = #{money},
consume_permanent = #{consumePermanent},
consume_free_june = #{consumeFreeJune},
consume_free_december = #{consumeFreeDecember},
consume_task = #{consumeTask},
refund_permanent = #{refundPermanent},
refund_free_june = #{refundFreeJune},
refund_free_december = #{refundFreeDecember},
refund_task = #{refundTask},
recharge_num = #{rechargeNum},
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"
resultType="com.example.demo.domain.entity.UserGoldRecord">
SELECT u.market, ugr.*
FROM user_gold_record ugr
INNER JOIN user u ON ugr.jwcode = u.jwcode
WHERE u.market = #{market}
AND ugr.audit_status IN
<foreach item="status" collection="auditStatusList" open="(" separator="," close=")">
#{status}
</foreach>
AND ugr.pay_time BETWEEN #{startTime} AND #{endTime}
</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.audit_status IN (1,3)
AND ugr.pay_time BETWEEN #{startTime} AND #{endTime}
</select>
<!--计算该天首充人数-->
<select id="countFirstRecharge" 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.audit_status = 1
AND ugr.pay_time BETWEEN #{startTime} AND #{endTime}
AND u.first_recharge = #{startTime}
</select>
<select id="selectByMarketAndDate" resultType="com.example.demo.domain.entity.Statistics">
SELECT *
FROM statistics
WHERE market = #{market}
AND current_datetime >= #{startDate}
AND current_datetime &lt;= #{endDate}
LIMIT 1
</select>
<select id="sumCurrentPermanentGold" resultType="java.lang.Integer">
SELECT SUM(user.current_permanent_gold)
FROM user
WHERE user.market = #{market}
</select>
<select id="sumCurrentFreeJune" resultType="java.lang.Integer">
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.current_free_december)
FROM user as u
WHERE u.market = #{market}
</select>
<select id="sumCurrentTaskGold" resultType="java.lang.Integer">
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>

52
src/main/resources/mapper/UserMapper.xml

@ -0,0 +1,52 @@
<?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.UserMapper">
<!-- 根据精网号查询用户信息 -->
<select id="selectUser" resultType="com.example.demo.domain.vo.GoldUser">
SELECT
name AS "name",
jwcode AS "jwcode",
market AS "market",
(COALESCE(current_permanent_gold, 0) + COALESCE(current_free_june, 0) + COALESCE(current_free_december, 0) + COALESCE(current_task_gold, 0)) AS "nowSumGold",
current_permanent_gold AS "nowPermanentGold",
(COALESCE(current_free_june, 0) + COALESCE(current_free_december, 0)) AS "nowFreeGold",
current_task_gold AS "nowTaskGold",
(COALESCE(sum_permanent_gold, 0) + COALESCE(sum_free_june, 0) + COALESCE(sum_free_december, 0) + COALESCE(sum_task_gold, 0)) AS "historySumGold",
sum_permanent_gold AS "historyPermanentGold",
(COALESCE(sum_free_june, 0) + COALESCE(sum_free_december, 0)) AS "historyFreeGold",
sum_task_gold AS "historyTaskGold",
recharge_num AS "rechargeNum",
consume_num AS "consumeNum",
first_recharge AS "firstRecharge"
FROM user
WHERE jwcode = #{jwcode}
</select>
<!-- 根据精网号查询金币余额 -->
<select id="selectGold" resultType="com.example.demo.domain.vo.GoldUser">
SELECT
current_permanent_gold AS "NowPermanentGold",
(COALESCE(current_free_june, 0) + COALESCE(current_free_december, 0)) AS "NowFreeGold",
current_free_june AS "NowFreeJune",
current_free_december AS "NowFreeDecember",
current_task_gold AS "NowTaskGold",
consume_num AS "consumeNum"
FROM user
WHERE jwcode = #{jwcode}
</select>
<!-- 根据精网号更新数据 -->
<update id="updateGold" parameterType="com.example.demo.domain.entity.User">
UPDATE user
SET
current_permanent_gold = #{currentPermanentGold},
current_free_june = #{currentFreeJune},
current_free_december = #{currentFreeDecember},
current_task_gold = #{currentTaskGold},
consume_num = #{consumeNum},
sum_consume = sum_consume + #{sumConsume},
update_time = NOW()
WHERE jwcode = #{jwcode}
</update>
</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