diff --git a/src/main/java/com/example/demo/Export/ExportServiceImpl.java b/src/main/java/com/example/demo/Export/ExportServiceImpl.java index 2c52080..bdce7f0 100644 --- a/src/main/java/com/example/demo/Export/ExportServiceImpl.java +++ b/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); diff --git a/src/main/java/com/example/demo/controller/RateController.java b/src/main/java/com/example/demo/controller/RateController.java index 1d34ac1..847c82c 100644 --- a/src/main/java/com/example/demo/controller/RateController.java +++ b/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("编辑成功"); } diff --git a/src/main/java/com/example/demo/domain/DTO/ConsumeDTO.java b/src/main/java/com/example/demo/domain/DTO/ConsumeDTO.java index d8a7b01..a2eb47a 100644 --- a/src/main/java/com/example/demo/domain/DTO/ConsumeDTO.java +++ b/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() { diff --git a/src/main/java/com/example/demo/domain/export/Goldmingxi.java b/src/main/java/com/example/demo/domain/export/Goldmingxi.java index 41dd026..5291dc1 100644 --- a/src/main/java/com/example/demo/domain/export/Goldmingxi.java +++ b/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; // 提交时间 } diff --git a/src/main/java/com/example/demo/domain/export/Goldyve.java b/src/main/java/com/example/demo/domain/export/Goldyve.java new file mode 100644 index 0000000..26f6878 --- /dev/null +++ b/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: 2025−07-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; +} diff --git a/src/main/java/com/example/demo/service/RateService.java b/src/main/java/com/example/demo/service/RateService.java index 685f6aa..0a14b2f 100644 --- a/src/main/java/com/example/demo/service/RateService.java +++ b/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); } diff --git a/src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java index 62c3838..851fc95 100644 --- a/src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java +++ b/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; } /* diff --git a/src/main/java/com/example/demo/serviceImpl/ConsumeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/ConsumeServiceImpl.java index 32a34ac..49ac168 100644 --- a/src/main/java/com/example/demo/serviceImpl/ConsumeServiceImpl.java +++ b/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, diff --git a/src/main/java/com/example/demo/serviceImpl/ExportExcelServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/ExportExcelServiceImpl.java index 98efdd1..9e425ed 100644 --- a/src/main/java/com/example/demo/serviceImpl/ExportExcelServiceImpl.java +++ b/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); + } + } + } \ No newline at end of file diff --git a/src/main/java/com/example/demo/serviceImpl/GoldDetailServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/GoldDetailServiceImpl.java index 022c5dc..4e73d24 100644 --- a/src/main/java/com/example/demo/serviceImpl/GoldDetailServiceImpl.java +++ b/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); diff --git a/src/main/java/com/example/demo/serviceImpl/RateServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/RateServiceImpl.java index 57f933a..e2b55aa 100644 --- a/src/main/java/com/example/demo/serviceImpl/RateServiceImpl.java +++ b/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("编辑成功"); + }} } diff --git a/src/main/java/com/example/demo/serviceImpl/RechargeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/RechargeServiceImpl.java index 81b344c..832db37 100644 --- a/src/main/java/com/example/demo/serviceImpl/RechargeServiceImpl.java +++ b/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()); diff --git a/src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java index db3e664..5b5ecc2 100644 --- a/src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java +++ b/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 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 = ""; diff --git a/src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java index d93852e..0cc29bd 100644 --- a/src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java +++ b/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) // 类型为退款 diff --git a/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java index afc3d8a..2f724b3 100644 --- a/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java +++ b/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 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);*/ } /* 获取卡片数据 diff --git a/src/main/resources/mapper/GoldDetailMapper.xml b/src/main/resources/mapper/GoldDetailMapper.xml index fe5b351..5961ff2 100644 --- a/src/main/resources/mapper/GoldDetailMapper.xml +++ b/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 + ugr.audit_status IN (1,3) and ugr.jwcode = #{jwcode} diff --git a/src/main/resources/mapper/PermissionMapper.xml b/src/main/resources/mapper/PermissionMapper.xml index 3f2b03e..b75e6d8 100644 --- a/src/main/resources/mapper/PermissionMapper.xml +++ b/src/main/resources/mapper/PermissionMapper.xml @@ -47,13 +47,13 @@ - admin.account=#{account} + and admin.account=#{account} - admin.market=#{market} + and admin.market=#{market} - admin.postiton=#{postiton} + and admin.postiton=#{postiton} order by admin.admin_status desc diff --git a/src/main/resources/mapper/RechargeMapper.xml b/src/main/resources/mapper/RechargeMapper.xml index e8405f8..3358e7a 100644 --- a/src/main/resources/mapper/RechargeMapper.xml +++ b/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) @@ -84,7 +84,7 @@ JOIN admin a ON ugr.admin_id = a.id JOIN rate r ON ugr.rate_id = r.id - ugr.type = 0 + ugr.type = 0 AND ugr.audit_status IN (1,3) AND ugr.jwcode = #{jwcode} diff --git a/src/main/resources/mapper/RefundMapper.xml b/src/main/resources/mapper/RefundMapper.xml index 032593d..df4aaea 100644 --- a/src/main/resources/mapper/RefundMapper.xml +++ b/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) @@ -82,7 +82,7 @@ JOIN admin a ON ugr.admin_id = a.id - ugr.type = 2 + ugr.type = 2 AND ugr.audit_status IN (1,3) AND ugr.jwcode = #{jwcode}