Browse Source

Merge branch 'milestone-20250702-金币重构一期' of http://39.101.133.168:8807/huangqizhen/gold-java into milestone-20250702-金币重构一期

lihuilin/hotfix-20250810160509-余额地区传参
lihuilin 1 month ago
parent
commit
14dcd1cd53
  1. 40
      src/main/java/com/example/demo/Export/ExportServiceImpl.java
  2. 8
      src/main/java/com/example/demo/controller/RateController.java
  3. 2
      src/main/java/com/example/demo/domain/DTO/ConsumeDTO.java
  4. 1
      src/main/java/com/example/demo/domain/export/Goldmingxi.java
  5. 24
      src/main/java/com/example/demo/domain/export/Goldyve.java
  6. 3
      src/main/java/com/example/demo/service/RateService.java
  7. 98
      src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java
  8. 39
      src/main/java/com/example/demo/serviceImpl/ConsumeServiceImpl.java
  9. 77
      src/main/java/com/example/demo/serviceImpl/ExportExcelServiceImpl.java
  10. 26
      src/main/java/com/example/demo/serviceImpl/GoldDetailServiceImpl.java
  11. 11
      src/main/java/com/example/demo/serviceImpl/RateServiceImpl.java
  12. 14
      src/main/java/com/example/demo/serviceImpl/RechargeServiceImpl.java
  13. 13
      src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java
  14. 17
      src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java
  15. 58
      src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java
  16. 1
      src/main/resources/mapper/GoldDetailMapper.xml
  17. 6
      src/main/resources/mapper/PermissionMapper.xml
  18. 4
      src/main/resources/mapper/RechargeMapper.xml
  19. 4
      src/main/resources/mapper/RefundMapper.xml

40
src/main/java/com/example/demo/Export/ExportServiceImpl.java

@ -1,15 +1,21 @@
package com.example.demo.Export;
import com.example.demo.Util.JWTUtil;
import com.example.demo.domain.DTO.ConsumeDTO;
import com.example.demo.domain.DTO.RechargeDTO;
import com.example.demo.domain.DTO.RefundDTO;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.vo.Result;
import com.example.demo.exception.SystemException;
import com.example.demo.mapper.GoldDetailMapper;
import com.example.demo.Util.RedisUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@ -33,13 +39,21 @@ public class ExportServiceImpl implements ExportService{
@Override
public Result addExportRecharge(RechargeDTO dto) {
// 获取操作者 jwcode
HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
try {
UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
dto.setAccount(Integer.valueOf(token1.getUsername()));
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
// 生成文件名
String fileName = String.format("%s_%s_%s.xlsx",
"充值明细",
"操作人",
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
System.out.println(fileName);
dto.setAccount(123456);
dto.setUrl("");
dto.setFileName(fileName);
dto.setDataNum(0);
@ -81,13 +95,21 @@ public class ExportServiceImpl implements ExportService{
@Override
public Result addExportRefund(RefundDTO dto) {
// 获取操作者 jwcode
HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
try {
UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
dto.setAccount(Integer.valueOf(token1.getUsername()));
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
// 生成文件名
String fileName = String.format("%s_%s_%s.xlsx",
"退款明细",
"操作人",
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
System.out.println(fileName);
dto.setAccount(123456);
dto.setUrl("");
dto.setFileName(fileName);
dto.setDataNum(0);
@ -129,13 +151,21 @@ public class ExportServiceImpl implements ExportService{
@Override
public Result addExportConsume(ConsumeDTO dto) {
// 获取操作者 jwcode
HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
try {
UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
dto.setAccount(Integer.valueOf(token1.getUsername()));
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
// 生成文件名
String fileName = String.format("%s_%s_%s.xlsx",
"消费明细",
"消明细",
"操作人",
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
System.out.println(fileName);
dto.setAccount(123456);
dto.setUrl("");
dto.setFileName(fileName);
dto.setDataNum(0);
@ -167,7 +197,7 @@ public class ExportServiceImpl implements ExportService{
// 3. 发送到 Redis 消息队列
String jsonData = new ObjectMapper().writeValueAsString(exportData);
redisUtil.sendMessage("refund:queue:export_queue", jsonData);
redisUtil.sendMessage("consume:queue:export_queue", jsonData);
}catch (Exception e){
e.printStackTrace();
throw new SystemException("导出数据异常,请稍后重试", e);

8
src/main/java/com/example/demo/controller/RateController.java

@ -13,6 +13,7 @@ import org.springframework.util.ObjectUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.Map;
@ -59,10 +60,13 @@ public class RateController {
if (ObjectUtils.isEmpty(rate.getRateName())) {
return Result.error("汇率名称不能为空");
}
if (rate.getNum() == null) {
return Result.error("汇率数值不能为空");
if(rate.getNum()==null || rate.getNum().compareTo(BigDecimal.ZERO) <= 0){
return Result.error(("汇率数值不能小于等于0"));
}
rateService.update(rate);
if (rate.getNum() == null || rate.getNum().equals(BigDecimal.ZERO)) {
return Result.error("汇率数值存在异常");
}else
return Result.success("编辑成功");
}

2
src/main/java/com/example/demo/domain/DTO/ConsumeDTO.java

@ -1,5 +1,6 @@
package com.example.demo.domain.DTO;
import com.example.demo.domain.vo.ConsumeUser;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -31,6 +32,7 @@ public class ConsumeDTO {
private Integer page = 1;
@NotNull(message = "pageSize不能为空")
private Integer pageSize = 20;
private ConsumeUser consumeUser;
@Override
public String toString() {

1
src/main/java/com/example/demo/domain/export/Goldmingxi.java

@ -25,4 +25,5 @@ public class Goldmingxi {
private Integer freeDecember; // 免费金币七月到期
private Integer taskGold; // 任务金币
private String adminName; //提交人
private String createTime; // 提交时间
}

24
src/main/java/com/example/demo/domain/export/Goldyve.java

@ -0,0 +1,24 @@
package com.example.demo.domain.export;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: GOLD
* @ClassName Goldyve
* @description:
* @author: huangqizhen
* @create: 202507-07 15:27
* @Version 1.0
**/
@Data
@NoArgsConstructor
public class Goldyve {
private String name;
private Integer jwcode;
private String market;
private String currentPermanentGold ;
private String currentFreeJune;
private String currentFreeDecember;
private String currentTaskGold;
}

3
src/main/java/com/example/demo/service/RateService.java

@ -2,6 +2,7 @@ package com.example.demo.service;
import com.example.demo.domain.entity.Rate;
import com.example.demo.domain.vo.RateDetail;
import com.example.demo.domain.vo.Result;
import com.github.pagehelper.PageInfo;
public interface RateService {
@ -12,5 +13,5 @@ public interface RateService {
void add(Rate rate);
void update(Rate rate);
Result update(Rate rate);
}

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

@ -47,7 +47,8 @@ public class AuditServiceImpl implements AuditService {
updateOrder.setAuditStatus(2);
updateOrder.setRejectReason(rejectReason);
updateOrder.setAuditTime(new Date());
// 执行审核更新
auditMapper.updateOrder(updateOrder);
if (order.getType()==2) { //退款
//2.获取对应的消费订单退款订单号去掉开头"TK"即为对应消费订单
String consumeOrderCode = order.getOrderCode().replaceFirst("TK", "");
@ -62,55 +63,56 @@ public class AuditServiceImpl implements AuditService {
}else if (action==1) { //通过
updateOrder.setAuditStatus(1);
updateOrder.setAuditTime(new Date());
}
// 执行审核更新
auditMapper.updateOrder(updateOrder);
//判断是充值还是退款
if (order.getType()==0){ //充值
//更新用户余额
User update = new User();
update.setJwcode(order.getJwcode()); //精网号
update.setSumPermanentGold(order.getPermanentGold()); //历史永久金币
update.setSumFreeJune(order.getFreeJune()); //历史六月免费金币
update.setSumFreeDecember(order.getFreeDecember()); //历史十二月免费金币
update.setSumTaskGold(order.getTaskGold()); //历史任务金币
update.setCurrentPermanentGold(order.getPermanentGold()); //当前永久金币
update.setCurrentFreeJune(order.getFreeJune()); //当前六月免费金币
update.setCurrentFreeDecember(order.getFreeDecember()); //当前十二月免费金币
update.setCurrentTaskGold(order.getTaskGold()); //当前任务金币
auditMapper.updateUserGold(update);
//erp增加充值数据
if(update.getJwcode().equals(94226013)){
GoldTistV2.addCoinNew(order.getJwcode().toString(), 64, //充值永久金币
(double) (order.getPermanentGold() ) /100,
order.getRemark(),0, order.getPayPlatform(), "金币充值");
GoldTistV2.addCoinNew(order.getJwcode().toString(), 63, //充值免费
(double) (order.getFreeDecember()+order.getFreeJune() ) /100,
order.getRemark(),0, order.getPayPlatform(), "金币充值");
}
}else if (order.getType()==2) { //退款
//更新用户余额
User update = new User();
update.setJwcode(order.getJwcode());
update.setCurrentPermanentGold(order.getPermanentGold()); //当前永久金币
update.setCurrentFreeJune(order.getFreeJune()); //当前六月免费金币
update.setCurrentFreeDecember(order.getFreeDecember()); //当前十二月免费金币
update.setCurrentTaskGold(order.getTaskGold()); //当前任务金币
auditMapper.updateUserGold(update);
//erp增加退款数据
if(update.getJwcode().equals(94226013)){
GoldTistV2.addCoinNew(order.getJwcode().toString(), 56, //退款永久金币
(double) (order.getPermanentGold() ) /100,
order.getRemark(),0, order.getPayPlatform(), "退款商品"+order.getGoodsName());
GoldTistV2.addCoinNew(order.getJwcode().toString(), 55, //退款免费
(double) (order.getFreeDecember()+order.getFreeJune() ) /100,
order.getRemark(),0, order.getPayPlatform(), "退款商品"+order.getGoodsName());
GoldTistV2.addCoinNew(order.getJwcode().toString(), 57, //退款任务
(double) (order.getTaskGold() ) /100,
order.getRemark(),0, order.getPayPlatform(), "退款商品"+order.getGoodsName());
}
// 执行审核更新
auditMapper.updateOrder(updateOrder);
//判断是充值还是退款
if (order.getType()==0){ //充值
//更新用户余额
User update = new User();
update.setJwcode(order.getJwcode()); //精网号
update.setSumPermanentGold(order.getPermanentGold()); //历史永久金币
update.setSumFreeJune(order.getFreeJune()); //历史六月免费金币
update.setSumFreeDecember(order.getFreeDecember()); //历史十二月免费金币
update.setSumTaskGold(order.getTaskGold()); //历史任务金币
update.setCurrentPermanentGold(order.getPermanentGold()); //当前永久金币
update.setCurrentFreeJune(order.getFreeJune()); //当前六月免费金币
update.setCurrentFreeDecember(order.getFreeDecember()); //当前十二月免费金币
update.setCurrentTaskGold(order.getTaskGold()); //当前任务金币
auditMapper.updateUserGold(update);
//erp增加充值数据
if(update.getJwcode().equals(94226013)){
GoldTistV2.addCoinNew(order.getJwcode().toString(), 64, //充值永久金币
(double) (order.getPermanentGold() ) /100,
order.getRemark(),0, order.getPayPlatform(), "金币充值");
GoldTistV2.addCoinNew(order.getJwcode().toString(), 63, //充值免费
(double) (order.getFreeDecember()+order.getFreeJune() ) /100,
order.getRemark(),0, order.getPayPlatform(), "金币充值");
}
}else if (order.getType()==2) { //退款
//更新用户余额
User update = new User();
update.setJwcode(order.getJwcode());
update.setCurrentPermanentGold(order.getPermanentGold()); //当前永久金币
update.setCurrentFreeJune(order.getFreeJune()); //当前六月免费金币
update.setCurrentFreeDecember(order.getFreeDecember()); //当前十二月免费金币
update.setCurrentTaskGold(order.getTaskGold()); //当前任务金币
auditMapper.updateUserGold(update);
//erp增加退款数据
if(update.getJwcode().equals(94226013)){
GoldTistV2.addCoinNew(order.getJwcode().toString(), 56, //退款永久金币
(double) (order.getPermanentGold() ) /100,
order.getRemark(),0, order.getPayPlatform(), "退款商品"+order.getGoodsName());
GoldTistV2.addCoinNew(order.getJwcode().toString(), 55, //退款免费
(double) (order.getFreeDecember()+order.getFreeJune() ) /100,
order.getRemark(),0, order.getPayPlatform(), "退款商品"+order.getGoodsName());
GoldTistV2.addCoinNew(order.getJwcode().toString(), 57, //退款任务
(double) (order.getTaskGold() ) /100,
order.getRemark(),0, order.getPayPlatform(), "退款商品"+order.getGoodsName());
}
}
}
return true;
}
/*

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

@ -102,24 +102,23 @@ public class ConsumeServiceImpl implements ConsumeService {
if(consumeUser.getTaskGold()<0||consumeUser.getFreeGold()<0||consumeUser.getPermanentGold()<0){
return Result.error("金币不能为负数");
}
GoldUser goldUser = userMapper.selectUser(consumeUser.getJwcode().toString());
if(goldUser==null){
return Result.error("用户不存在");
}
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 randomNumber = random.nextInt(900) + 100;
//订单号生成
userGoldRecord.setOrderCode("XF" + timestampPart + counterPart);
userGoldRecord.setOrderCode("XF" + timestampPart + randomNumber);
userGoldRecord.setJwcode(consumeUser.getJwcode());
userGoldRecord.setGoodsName(consumeUser.getGoodsName());
userGoldRecord.setSumGold(consumeUser.getSumGold());
userGoldRecord.setPermanentGold(consumeUser.getPermanentGold());
userGoldRecord.setSumGold(-consumeUser.getSumGold());
userGoldRecord.setPermanentGold(-consumeUser.getPermanentGold());
// 获取当前月份1-12
int currentMonth = LocalDate.now().getMonthValue();
GoldUser gold = userMapper.selectGold(consumeUser.getJwcode().toString());
@ -131,23 +130,23 @@ public class ConsumeServiceImpl implements ConsumeService {
if (currentMonth >= 1 && currentMonth <= 6) {
// 1-6月设置6月额度12月保持默认值
if (consumeUser.getFreeGold() > gold.getNowFreeJune()) {
userGoldRecord.setFreeJune(gold.getNowFreeJune());
userGoldRecord.setFreeDecember(consumeUser.getFreeGold() - gold.getNowFreeJune());
userGoldRecord.setFreeJune(-gold.getNowFreeJune());
userGoldRecord.setFreeDecember(-(consumeUser.getFreeGold() - gold.getNowFreeJune()));
} else {
userGoldRecord.setFreeJune(consumeUser.getFreeGold());
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());
userGoldRecord.setFreeDecember(-gold.getNowFreeDecember());
userGoldRecord.setFreeJune(-(consumeUser.getFreeGold() - gold.getNowFreeDecember()));
} else {
userGoldRecord.setFreeDecember(consumeUser.getFreeGold());
userGoldRecord.setFreeDecember(-consumeUser.getFreeGold());
userGoldRecord.setFreeJune(0);
}
}
userGoldRecord.setTaskGold(consumeUser.getTaskGold());
userGoldRecord.setTaskGold(-consumeUser.getTaskGold());
userGoldRecord.setRemark(consumeUser.getRemark());
userGoldRecord.setType((byte) 1);
userGoldRecord.setIsRefund((byte) 0);
@ -160,11 +159,11 @@ public class ConsumeServiceImpl implements ConsumeService {
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.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());
user.setSumConsume(-(consumeUser.getPermanentGold() + consumeUser.getFreeGold() + consumeUser.getTaskGold()));
userMapper.updateGold(user);
if(consumeUser.getJwcode().equals(94226013)){
GoldTistV2.addCoinNew(userGoldRecord.getJwcode().toString(), 65,

77
src/main/java/com/example/demo/serviceImpl/ExportExcelServiceImpl.java

@ -10,6 +10,7 @@ import com.example.demo.controller.GoldDetailController;
import com.example.demo.controller.RechargeController;
import com.example.demo.controller.RefundController;
import com.example.demo.domain.entity.Export;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.export.Goldmingxi;
import com.example.demo.domain.vo.*;
@ -294,7 +295,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
try {
// 6. 初始化Excel写入器指向本地文件流
excelWriter = initExcelWriter(outputStream, "user");
excelWriter = ExcelWriter(outputStream, "user");
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();
// 7. 分页查询并写入数据
Page page = new Page();
@ -493,7 +494,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
try {
// 6. 初始化Excel写入器指向本地文件流
excelWriter = initExcelWriter(outputStream, "user");
excelWriter = RechargeExcelWriter(outputStream, "user");
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();
// 7. 分页查询并写入数据
Page page = new Page();
@ -692,7 +693,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
try {
// 6. 初始化Excel写入器指向本地文件流
excelWriter = initExcelWriter(outputStream, "user");
excelWriter = ConExcelWriter(outputStream, "user");
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();
// 7. 分页查询并写入数据
Page page = new Page();
@ -701,7 +702,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
Integer totalCount = 0;
boolean hasMore = true;
while (hasMore) {
Result pageResult = refundController.selcetBy(page);
Result pageResult = consumeController.selcetBy(page);
Integer code = pageResult.getCode();
Object data = pageResult.getData();
@ -891,7 +892,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
try {
// 6. 初始化Excel写入器指向本地文件流
excelWriter = initExcelWriter(outputStream, "user");
excelWriter = RefundExcelWriter(outputStream, "user");
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();
// 7. 分页查询并写入数据
Page page = new Page();
@ -900,7 +901,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
Integer totalCount = 0;
boolean hasMore = true;
while (hasMore) {
Result pageResult = consumeController.selcetBy(page);
Result pageResult = refundController.selcetBy(page);
Integer code = pageResult.getCode();
Object data = pageResult.getData();
@ -1099,4 +1100,68 @@ public class ExportExcelServiceImpl implements ExportExcelService {
throw new IllegalArgumentException("不支持的导出类型: " + exportType);
}
}
/**
* 初始化excel文件
* @param os
* @param exportType
* @return
*/
private ExcelWriter ExcelWriter(OutputStream os, String exportType) {
switch (exportType) {
case "user":
return EasyExcel.write(os, User.class)
.inMemory(Boolean.TRUE)
.build();
default:
throw new IllegalArgumentException("不支持的导出类型: " + exportType);
}
}
/**
* 初始化excel文件
* @param os
* @param exportType
* @return
*/
private ExcelWriter RechargeExcelWriter(OutputStream os, String exportType) {
switch (exportType) {
case "user":
return EasyExcel.write(os, RechargeUser.class)
.inMemory(Boolean.TRUE)
.build();
default:
throw new IllegalArgumentException("不支持的导出类型: " + exportType);
}
}
/**
* 初始化excel文件
* @param os
* @param exportType
* @return
*/
private ExcelWriter ConExcelWriter(OutputStream os, String exportType) {
switch (exportType) {
case "user":
return EasyExcel.write(os, ConsumeUser.class)
.inMemory(Boolean.TRUE)
.build();
default:
throw new IllegalArgumentException("不支持的导出类型: " + exportType);
}
}/**
* 初始化excel文件
* @param os
* @param exportType
* @return
*/
private ExcelWriter RefundExcelWriter(OutputStream os, String exportType) {
switch (exportType) {
case "user":
return EasyExcel.write(os, RefundUser.class)
.inMemory(Boolean.TRUE)
.build();
default:
throw new IllegalArgumentException("不支持的导出类型: " + exportType);
}
}
}

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

@ -1,8 +1,10 @@
package com.example.demo.serviceImpl;
import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.RedisUtil;
import com.example.demo.domain.DTO.GoldDetailDTO;
import com.example.demo.domain.DTO.GoldUserDTO;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.*;
import com.example.demo.exception.SystemException;
@ -11,8 +13,12 @@ import com.example.demo.service.GoldDetailService;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.io.IOException;
import java.time.LocalDateTime;
@ -110,14 +116,20 @@ public class GoldDetailServiceImpl implements GoldDetailService {
@Override
public Result addExportRecord(GoldDetailDTO dto) {
// 获取操作者 jwcode
HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
try {
UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
dto.setAccount(Integer.valueOf(token1.getUsername()));
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
// 生成文件名
String fileName = String.format("%s_%s_%s.xlsx",
"客户金币明细",
"操作人",
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
System.out.println(fileName);
dto.setAccount(123456);
dto.setUrl("");
dto.setFileName(fileName);
dto.setDataNum(0);
@ -159,13 +171,21 @@ public class GoldDetailServiceImpl implements GoldDetailService {
@Override
public Result addExportRecordGold(GoldUserDTO dto) {
// 获取操作者 jwcode
HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
try {
UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
dto.setAccount(Integer.valueOf(token1.getUsername()));
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
// 生成文件名
String fileName = String.format("%s_%s_%s.xlsx",
"金币余额明细",
"操作人",
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
System.out.println(fileName);
dto.setAccount(123456);
dto.setUrl("");
dto.setFileName(fileName);
dto.setDataNum(0);

11
src/main/java/com/example/demo/serviceImpl/RateServiceImpl.java

@ -3,6 +3,7 @@ package com.example.demo.serviceImpl;
import com.example.demo.domain.entity.Rate;
import com.example.demo.domain.vo.ConsumeUser;
import com.example.demo.domain.vo.RateDetail;
import com.example.demo.domain.vo.Result;
import com.example.demo.mapper.RateMapper;
import com.example.demo.service.RateService;
import com.github.pagehelper.PageHelper;
@ -10,6 +11,7 @@ import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
@ -37,7 +39,12 @@ public class RateServiceImpl implements RateService {
}
@Override
public void update(Rate rate) {
public Result update(Rate rate) {
rateMapper.update(rate);
}
if (rate.getNum() == null || rate.getNum().equals(BigDecimal.ZERO)) {
return Result.error("汇率数值存在异常");
}else {
return Result.success("编辑成功");
}}
}

14
src/main/java/com/example/demo/serviceImpl/RechargeServiceImpl.java

@ -17,6 +17,7 @@ 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;
/**
@ -89,20 +90,21 @@ public class RechargeServiceImpl implements RechargeService {
if(rechargeUser.getFreeGold()<0||rechargeUser.getPermanentGold()<=0||rechargeUser.getMoney()<=0){
return Result.error("充值不能为负数或0");
}
GoldUser goldUser = userMapper.selectUser(rechargeUser.getJwcode().toString());
if(goldUser==null){
return Result.error("用户不存在");
}
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 randomNumber = random.nextInt(900) + 100;
//订单号生成
userGoldRecord.setOrderCode("CZ" + timestampPart + counterPart);
userGoldRecord.setOrderCode("CZ" + timestampPart + randomNumber);
userGoldRecord.setJwcode(rechargeUser.getJwcode());
userGoldRecord.setActivity(rechargeUser.getActivity());
userGoldRecord.setPermanentGold(rechargeUser.getPermanentGold());

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

@ -1,10 +1,7 @@
package com.example.demo.serviceImpl;
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.RefundUser;
import com.example.demo.domain.vo.Result;
import com.example.demo.domain.vo.*;
import com.example.demo.mapper.ConsumeMapper;
import com.example.demo.mapper.RefundMapper;
import com.example.demo.mapper.UserMapper;
@ -43,6 +40,10 @@ public class RefundServiceImpl implements RefundService {
@Autowired
private ConsumeMapper consumeMapper;
@Autowired
private UserMapper userMapper;
@Override
public PageInfo<RefundUser> selectAll(Integer pageNum, Integer pageSize, RefundUser refundUser) {
PageHelper.startPage(pageNum, pageSize);
@ -100,6 +101,10 @@ public class RefundServiceImpl implements RefundService {
if (refundUser.getTaskGold() < 0 || refundUser.getFreeGold() < 0 || refundUser.getPermanentGold() < 0) {
return Result.error("金币不能为负数");
}
GoldUser goldUser = userMapper.selectUser(refundUser.getJwcode().toString());
if(goldUser==null){
return Result.error("用户不存在");
}
UserGoldRecord userGoldRecord = new UserGoldRecord();
String goodsNameWithOrder = refundUser.getGoodsName();
String orderCode = "";

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

@ -36,11 +36,10 @@ public class StatisticsServiceImpl implements StatisticsService {
private GeneralService generalService;
/*
12点18点23点30分执行定时任务更新当天part1数据
每小时执行定时任务更新当天part1数据
*/
@Override
@Scheduled(cron = "0 0 1,12,18 * * ?") // 分别在 1:00 12:00 18:00 执行
@Scheduled(cron = "0 30 23 * * ?") // 23:30 执行
@Scheduled(cron = "0 0 * * * ?") // 每小时执行一次
public void runHourlyTaskPart1() {
Date today = new Date(); //取当天日期
for(String market : generalService.getMarket()){
@ -49,10 +48,10 @@ public class StatisticsServiceImpl implements StatisticsService {
}
/*
12点18点执行定时任务更新当天part2数据
每小时执行定时任务更新当天part2数据
*/
@Override
@Scheduled(cron = "0 0 12,18 * * ?")
@Scheduled(cron = "0 0 * * * ?") // 每小时执行一次
public void runHourlyTaskPart2() {
Date today = new Date(); //取当天日期
for(String market : generalService.getMarket()){
@ -241,25 +240,25 @@ public class StatisticsServiceImpl implements StatisticsService {
.filter(record -> record.getType() == 1) // 类型为消费
.mapToInt(UserGoldRecord::getPermanentGold)
.sum();
statistics.setConsumePermanent(consumePermanent);
statistics.setConsumePermanent(Math.abs(consumePermanent));
//消费相关-当日新增消费六月免费
Integer consumeFreeJune = records.stream()
.filter(record -> record.getType() == 1) // 类型为消费
.mapToInt(UserGoldRecord::getFreeJune)
.sum();
statistics.setConsumeFreeJune(consumeFreeJune);
statistics.setConsumeFreeJune(Math.abs(consumeFreeJune));
//消费相关-当日新增消费十二月免费
Integer consumeFreeDecember = records.stream()
.filter(record -> record.getType() == 1) // 类型为消费
.mapToInt(UserGoldRecord::getFreeDecember)
.sum();
statistics.setConsumeFreeDecember(consumeFreeDecember);
statistics.setConsumeFreeDecember(Math.abs(consumeFreeDecember));
//消费相关-当日新增消费任务
Integer consumeTask = records.stream()
.filter(record -> record.getType() == 1) // 类型为消费
.mapToInt(UserGoldRecord::getTaskGold)
.sum();
statistics.setConsumeTask(consumeTask);
statistics.setConsumeTask(Math.abs(consumeTask)); // 使用 Math.abs 确保为正数
//退款相关-当日退款永久
Integer refundPermanent = records.stream()
.filter(record -> record.getType() == 2) // 类型为退款

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

@ -84,65 +84,7 @@ public class WorkbenchServiceImpl implements WorkbenchService {
.collect(Collectors.toList());
return new WorkbenchCard(token, marketCards,new ArrayList<>(), markets, date, date);
/* 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.setDailyReduce(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);*/
}
/*
获取卡片数据

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

@ -13,6 +13,7 @@
left join `user` on `user`.jwcode = `ugr`.jwcode
left join `admin` on `admin`.id = `ugr`.admin_id
<where>
ugr.audit_status IN (1,3)
<if test="jwcode != null">
and ugr.jwcode = #{jwcode}
</if>

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

@ -47,13 +47,13 @@
<where>
<if test="account!=null and account.length>0">
admin.account=#{account}
and admin.account=#{account}
</if>
<if test="market!=null and market.length>0">
admin.market=#{market}
and admin.market=#{market}
</if>
<if test="postiton!=null and postiton.length>0">
admin.postiton=#{postiton}
and admin.postiton=#{postiton}
</if>
</where>
order by admin.admin_status desc

4
src/main/resources/mapper/RechargeMapper.xml

@ -24,7 +24,7 @@
JOIN user_gold_record ugr ON u.jwcode = ugr.jwcode
JOIN admin a ON ugr.admin_id = a.id
JOIN rate r ON ugr.rate_id = r.id
WHERE ugr.type = 0
WHERE ugr.type = 0 AND ugr.audit_status IN (1,3)
<trim prefix="ORDER BY" suffixOverrides=",">
<choose>
@ -84,7 +84,7 @@
JOIN admin a ON ugr.admin_id = a.id
JOIN rate r ON ugr.rate_id = r.id
<where>
ugr.type = 0
ugr.type = 0 AND ugr.audit_status IN (1,3)
<if test="jwcode != null and jwcode != ''">
AND ugr.jwcode = #{jwcode}
</if>

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

@ -23,7 +23,7 @@
user_gold_record ugr ON u.jwcode = ugr.jwcode
JOIN
admin a ON ugr.admin_id = a.id
WHERE ugr.type = 2
WHERE ugr.type = 2 AND ugr.audit_status IN (1,3)
<trim prefix="ORDER BY" suffixOverrides=",">
<choose>
<!-- 当指定排序字段时使用指定字段排序 -->
@ -82,7 +82,7 @@
JOIN
admin a ON ugr.admin_id = a.id
<where>
ugr.type = 2
ugr.type = 2 AND ugr.audit_status IN (1,3)
<if test="jwcode != null and jwcode != ''">
AND ugr.jwcode = #{jwcode}
</if>

Loading…
Cancel
Save