From c2f590d6c43680a6b0b1a38425b80efca686a7d5 Mon Sep 17 00:00:00 2001 From: huangqizhen <15552608129@163.com> Date: Thu, 31 Jul 2025 16:45:26 +0800 Subject: [PATCH] =?UTF-8?q?7.30=E5=9C=B0=E5=8C=BA=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A5=E5=8F=8A=E5=AF=BC=E5=87=BA=E7=9A=84?= =?UTF-8?q?=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/demo/DemoApplication.java | 1 + .../com/example/demo/Export/ExportServiceImpl.java | 272 ++--- .../demo/config/Mysql2DataSourceConfig.java | 5 +- .../demo/controller/coin/ConsumeController.java | 57 +- .../demo/controller/coin/GoldDetailController.java | 8 +- .../demo/controller/coin/RechargeController.java | 51 +- .../demo/controller/coin/RefundController.java | 52 +- .../demo/controller/coin/WorkbenchController.java | 2 +- .../example/demo/domain/vo/coin/ConsumeUser.java | 2 +- .../example/demo/domain/vo/coin/GoldDetail.java | 2 +- .../example/demo/domain/vo/coin/RechargeUser.java | 42 +- .../example/demo/domain/vo/coin/RefundUser.java | 2 +- .../demo/service/coin/ExportExcelService.java | 7 + .../demo/service/listen/BaseMessageListener.java | 66 ++ .../serviceImpl/coin/ExportExcelServiceImpl.java | 1211 ++------------------ .../demo/serviceImpl/coin/GeneralServiceImpl.java | 10 +- .../demo/serviceImpl/coin/MarketServiceImpl.java | 2 +- .../serviceImpl/coin/PermissionServiceImpl.java | 4 +- .../serviceImpl/coin/WorkbenchServiceImpl.java | 6 +- src/main/resources/mapper/AuditMapper.xml | 4 +- src/main/resources/mapper/ConsumeMapper.xml | 11 +- src/main/resources/mapper/PermissionMapper.xml | 2 +- src/main/resources/mapper/RechargeMapper.xml | 20 +- src/main/resources/mapper/RefundMapper.xml | 11 +- src/main/resources/mapper/RoleMapper.xml | 4 +- src/main/resources/mapper/UserMapper.xml | 2 +- 26 files changed, 493 insertions(+), 1363 deletions(-) create mode 100644 src/main/java/com/example/demo/service/listen/BaseMessageListener.java diff --git a/src/main/java/com/example/demo/DemoApplication.java b/src/main/java/com/example/demo/DemoApplication.java index 4118dbf..dd35ee5 100644 --- a/src/main/java/com/example/demo/DemoApplication.java +++ b/src/main/java/com/example/demo/DemoApplication.java @@ -8,6 +8,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling // 启用调度功能 @MapperScan(basePackages = "com.example.demo.mapper", sqlSessionTemplateRef = "mysql1SqlSessionTemplate") +@MapperScan(basePackages = "com.example.demo.mapper.bean", sqlSessionTemplateRef = "mysql2SqlSessionTemplate") public class DemoApplication { public static void main(String[] args) { diff --git a/src/main/java/com/example/demo/Export/ExportServiceImpl.java b/src/main/java/com/example/demo/Export/ExportServiceImpl.java index adf13eb..4d14a12 100644 --- a/src/main/java/com/example/demo/Export/ExportServiceImpl.java +++ b/src/main/java/com/example/demo/Export/ExportServiceImpl.java @@ -32,7 +32,7 @@ import java.util.Map; * @Version 1.0 **/ @Service -public class ExportServiceImpl implements ExportService{ +public class ExportServiceImpl implements ExportService { @Autowired private GoldDetailMapper goldDetailMapper; @Autowired @@ -40,174 +40,150 @@ public class ExportServiceImpl implements ExportService{ @Autowired private AdminService adminService; - @Override - public Result addExportRecharge(RechargeDTO dto) { - // 获取操作者 jwcode - HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + /** + * 通用导出逻辑 + * + * @param dto 数据传输对象 (RechargeDTO, RefundDTO, ConsumeDTO) + * @param exportType 导出类型 ("充值明细", "退款明细", "消耗明细") + * @param queueName Redis 队列名称 + * @param requestData 请求数据字段名 ("rechargeUser", "refundUser", "consumeUser") + * @return Result + */ + private Result addExport(Object dto, String exportType, String queueName, String requestData) { + 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 admin = adminService.getName(String.valueOf(dto.getAccount())); - // 生成文件名 - String fileName = String.format("%s_%s_%s.xlsx", - "充值明细", - admin, - LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); -// System.out.println(fileName); - dto.setUrl(""); - dto.setFileName(fileName); - dto.setDataNum(0); + // 获取操作者信息 + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + Integer account = Integer.valueOf(admin.getAccount()); + String adminName = admin.getAdminName(); - try{ - // 调用方式 + // 设置 DTO 的通用字段 + setCommonFields(dto, account, adminName); + + // 插入导出记录并获取主键 GoldDetailMapper.ExportRecordIdHolder idHolder = new GoldDetailMapper.ExportRecordIdHolder(); - goldDetailMapper.insertExportRecord( - idHolder, // 用于接收主键 - dto.getAccount(), - dto.getType(), - dto.getState(), - dto.getUrl(), - dto.getFileName(), - dto.getDataNum() - ); - // 获取主键 + insertExportRecord(dto, idHolder, account); Long recordId = idHolder.getId(); - // 2. 构造完整的 JSON 数据(包含所有请求参数) - Map exportData = new HashMap<>(); - exportData.put("recordId", recordId); - // 添加 token 到 exportData - exportData.put("token", token); - - // 手动构造请求数据(避免 toString() 只返回部分字段) - Map requestData = new HashMap<>(); - requestData.put("rechargeUser", dto.getRechargeUser()); - exportData.put("requestData", requestData); - - // 3. 发送到 Redis 消息队列 + + // 构造完整的 JSON 数据 + Map exportData = constructExportData(recordId, token, dto, requestData); + + // 发送到 Redis 消息队列 String jsonData = new ObjectMapper().writeValueAsString(exportData); - redisUtil.sendMessage("recharge:queue:export_queue", jsonData); - }catch (Exception e){ + redisUtil.sendMessage(queueName, jsonData); + + } catch (Exception e) { e.printStackTrace(); throw new SystemException("导出数据异常,请稍后重试", e); } + return Result.success(); } - @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()); + /** + * 设置 DTO 的通用字段 + */ + private void setCommonFields(Object dto, Integer account,String adminName) throws Exception { + if (dto instanceof RechargeDTO rechargeDTO) { + rechargeDTO.setAccount(Integer.valueOf(account)); + rechargeDTO.setUrl(""); + rechargeDTO.setFileName(generateFileName("充值明细", adminName)); + rechargeDTO.setDataNum(0); + } else if (dto instanceof RefundDTO refundDTO) { + refundDTO.setAccount(Integer.valueOf(account)); + refundDTO.setUrl(""); + refundDTO.setFileName(generateFileName("退款明细", adminName)); + refundDTO.setDataNum(0); + } else if (dto instanceof ConsumeDTO consumeDTO) { + consumeDTO.setAccount(Integer.valueOf(account)); + consumeDTO.setUrl(""); + consumeDTO.setFileName(generateFileName("消耗明细", adminName)); + consumeDTO.setDataNum(0); } - String admin = adminService.getName(String.valueOf(dto.getAccount())); - // 生成文件名 - String fileName = String.format("%s_%s_%s.xlsx", - "退款明细", - admin, - LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - System.out.println(fileName); - dto.setUrl(""); - dto.setFileName(fileName); - dto.setDataNum(0); + } - try{ - // 调用方式 - GoldDetailMapper.ExportRecordIdHolder idHolder = new GoldDetailMapper.ExportRecordIdHolder(); + /** + * 插入导出记录 + */ + private void insertExportRecord(Object dto, GoldDetailMapper.ExportRecordIdHolder idHolder, Integer account) throws Exception { + if (dto instanceof RechargeDTO rechargeDTO) { goldDetailMapper.insertExportRecord( - idHolder, // 用于接收主键 - dto.getAccount(), - dto.getType(), - dto.getState(), - dto.getUrl(), - dto.getFileName(), - dto.getDataNum() + idHolder, + account, + rechargeDTO.getType(), + rechargeDTO.getState(), + rechargeDTO.getUrl(), + rechargeDTO.getFileName(), + rechargeDTO.getDataNum() + ); + } else if (dto instanceof RefundDTO refundDTO) { + goldDetailMapper.insertExportRecord( + idHolder, + account, + refundDTO.getType(), + refundDTO.getState(), + refundDTO.getUrl(), + refundDTO.getFileName(), + refundDTO.getDataNum() + ); + } else if (dto instanceof ConsumeDTO consumeDTO) { + goldDetailMapper.insertExportRecord( + idHolder, + account, + consumeDTO.getType(), + consumeDTO.getState(), + consumeDTO.getUrl(), + consumeDTO.getFileName(), + consumeDTO.getDataNum() ); - // 获取主键 - Long recordId = idHolder.getId(); - // 2. 构造完整的 JSON 数据(包含所有请求参数) - Map exportData = new HashMap<>(); - exportData.put("recordId", recordId); - // 添加 token 到 exportData - exportData.put("token", token); - - // 手动构造请求数据(避免 toString() 只返回部分字段) - Map requestData = new HashMap<>(); - requestData.put("refundUser", dto.getRefundUser()); - exportData.put("requestData", requestData); - - // 3. 发送到 Redis 消息队列 - String jsonData = new ObjectMapper().writeValueAsString(exportData); - redisUtil.sendMessage("refund:queue:export_queue", jsonData); - }catch (Exception e){ - e.printStackTrace(); - throw new SystemException("导出数据异常,请稍后重试", e); } - return Result.success(); } - @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()); + /** + * 构造导出数据 + */ + private Map constructExportData(Long recordId, String token, Object dto, String requestDataKey) throws Exception { + Map exportData = new HashMap<>(); + exportData.put("recordId", recordId); + exportData.put("token", token); + + Map requestData = new HashMap<>(); + if (dto instanceof RechargeDTO rechargeDTO) { + requestData.put(requestDataKey, rechargeDTO.getRechargeUser()); + } else if (dto instanceof RefundDTO refundDTO) { + requestData.put(requestDataKey, refundDTO.getRefundUser()); + } else if (dto instanceof ConsumeDTO consumeDTO) { + requestData.put(requestDataKey, consumeDTO.getConsumeUser()); } - String admin = adminService.getName(String.valueOf(dto.getAccount())); - // 生成文件名 - String fileName = String.format("%s_%s_%s.xlsx", - "消耗明细", - admin, + exportData.put("requestData", requestData); + + return exportData; + } + + /** + * 生成文件名 + */ + private String generateFileName(String exportType, String adminName) { + return String.format("%s_%s_%s.xlsx", + exportType, + adminName, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - System.out.println(fileName); - dto.setUrl(""); - dto.setFileName(fileName); - dto.setDataNum(0); + } - try{ - // 调用方式 - GoldDetailMapper.ExportRecordIdHolder idHolder = new GoldDetailMapper.ExportRecordIdHolder(); - goldDetailMapper.insertExportRecord( - idHolder, // 用于接收主键 - dto.getAccount(), - dto.getType(), - dto.getState(), - dto.getUrl(), - dto.getFileName(), - dto.getDataNum() - ); - // 获取主键 - Long recordId = idHolder.getId(); - // 2. 构造完整的 JSON 数据(包含所有请求参数) - Map exportData = new HashMap<>(); - exportData.put("recordId", recordId); - // 添加 token 到 exportData - exportData.put("token", token); - - // 手动构造请求数据(避免 toString() 只返回部分字段) - Map requestData = new HashMap<>(); - requestData.put("consumeUser", dto.getConsumeUser()); - exportData.put("requestData", requestData); - - // 3. 发送到 Redis 消息队列 - String jsonData = new ObjectMapper().writeValueAsString(exportData); - redisUtil.sendMessage("consume:queue:export_queue", jsonData); - }catch (Exception e){ - e.printStackTrace(); - throw new SystemException("导出数据异常,请稍后重试", e); - } - return Result.success(); + @Override + public Result addExportRecharge(RechargeDTO dto) { + return addExport(dto, "充值明细", "recharge:queue:export_queue", "rechargeUser"); + } + + @Override + public Result addExportRefund(RefundDTO dto) { + return addExport(dto, "退款明细", "refund:queue:export_queue", "refundUser"); + } + + @Override + public Result addExportConsume(ConsumeDTO dto) { + return addExport(dto, "消耗明细", "consume:queue:export_queue", "consumeUser"); } } \ No newline at end of file diff --git a/src/main/java/com/example/demo/config/Mysql2DataSourceConfig.java b/src/main/java/com/example/demo/config/Mysql2DataSourceConfig.java index 225424b..1693570 100644 --- a/src/main/java/com/example/demo/config/Mysql2DataSourceConfig.java +++ b/src/main/java/com/example/demo/config/Mysql2DataSourceConfig.java @@ -17,10 +17,7 @@ import javax.sql.DataSource; @Slf4j @Configuration -@MapperScan( - basePackages = "com.example.demo.mapper.bean", // 扫描coin包 - sqlSessionTemplateRef = "mysql2SqlSessionTemplate" -) + public class Mysql2DataSourceConfig { @Bean(name = "mysql2DataSource") diff --git a/src/main/java/com/example/demo/controller/coin/ConsumeController.java b/src/main/java/com/example/demo/controller/coin/ConsumeController.java index f89a901..e07de1d 100644 --- a/src/main/java/com/example/demo/controller/coin/ConsumeController.java +++ b/src/main/java/com/example/demo/controller/coin/ConsumeController.java @@ -10,6 +10,7 @@ import com.example.demo.service.coin.ConsumeService; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; @@ -85,15 +86,15 @@ public class ConsumeController { return Result.error("页大小为空!"); } else { //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - List list = Arrays.asList(admin.getMarkets().split(",")); - page.getConsumeUser().setMarkets(list); - } - else{ - return Result.error("角色为空"); + if(page.getConsumeUser().getMarkets()==null||page.getConsumeUser().getMarkets().isEmpty()) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); + + if(!markets.contains("1")) { + page.getConsumeUser().setMarkets(markets); + } } return Result.success(consumeService.selectBy(page.getPageNum(), page.getPageSize(), page.getConsumeUser())); } @@ -108,16 +109,15 @@ public class ConsumeController { @PostMapping("/statsGold") public Result statsGold(@RequestBody ConsumeUser consumeUser) { try { - //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - List list = Arrays.asList(admin.getMarkets().split(",")); - consumeUser.setMarkets(list); - } - else{ - return Result.error("角色为空"); + if(consumeUser.getMarkets()==null||consumeUser.getMarkets().isEmpty()) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); + + if(!markets.contains("1")) { + consumeUser.setMarkets(markets); + } } Gold gold = consumeService.statsGold(consumeUser); return Result.success(gold); @@ -144,6 +144,25 @@ public class ConsumeController { } } + public Result select(@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) { + e.printStackTrace(); + return Result.error("请检查筛选数据的格式"); + } + + } } diff --git a/src/main/java/com/example/demo/controller/coin/GoldDetailController.java b/src/main/java/com/example/demo/controller/coin/GoldDetailController.java index e3ace4b..f890b29 100644 --- a/src/main/java/com/example/demo/controller/coin/GoldDetailController.java +++ b/src/main/java/com/example/demo/controller/coin/GoldDetailController.java @@ -65,7 +65,7 @@ public class GoldDetailController { String token = request.getHeader("token"); Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));; - if(!markets.contains("总部")) { + if(!markets.contains("1")) { page.getGoldDetail().setMarkets(markets); } } @@ -82,7 +82,7 @@ public class GoldDetailController { String token = request.getHeader("token"); Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); - if(!markets.contains("总部")) { + if(!markets.contains("1")) { page.getGoldDetail().setMarkets(markets); } } @@ -96,7 +96,7 @@ public class GoldDetailController { Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); - if(!markets.contains("总部")) { + if(!markets.contains("1")) { user.setMarkets(markets); } } @@ -117,7 +117,7 @@ public class GoldDetailController { Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); - if(!markets.contains("总部")) { + if(!markets.contains("1")) { page.getUser().setMarkets(markets); } } diff --git a/src/main/java/com/example/demo/controller/coin/RechargeController.java b/src/main/java/com/example/demo/controller/coin/RechargeController.java index 9552fb5..7fcbfa2 100644 --- a/src/main/java/com/example/demo/controller/coin/RechargeController.java +++ b/src/main/java/com/example/demo/controller/coin/RechargeController.java @@ -7,6 +7,7 @@ import com.example.demo.service.coin.RechargeService; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; @@ -78,15 +79,14 @@ public class RechargeController { return Result.error("页大小为空!"); } else { //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - List list = Arrays.asList(admin.getMarkets().split(",")); - page.getRechargeUser().setMarkets(list); - } - else{ - return Result.error("角色为空"); + if(page.getRechargeUser().getMarkets()==null||page.getRechargeUser().getMarkets().isEmpty()){ + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));; + if(!markets.contains("1")) { + page.getRechargeUser().setMarkets(markets); + } } return Result.success(rechargeService.selectBy(page.getPageNum(), page.getPageSize(), page.getRechargeUser())); } @@ -101,15 +101,14 @@ public class RechargeController { public Result statsGold(@RequestBody RechargeUser rechargeUser) { try { //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - List list = Arrays.asList(admin.getMarkets().split(",")); - rechargeUser.setMarkets(list); - } - else{ - return Result.error("角色为空"); + if(rechargeUser.getMarkets()==null||rechargeUser.getMarkets().isEmpty()){ + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));; + if(!markets.contains("1")) { + rechargeUser.setMarkets(markets); + } } Gold gold = rechargeService.statsGold(rechargeUser); return Result.success(gold); @@ -129,5 +128,21 @@ public class RechargeController { } + public Result selcet(@RequestBody Page page) { + try { + if (ObjectUtils.isEmpty(page.getPageNum())) { + return Result.error("页码数为空!"); + } + if (ObjectUtils.isEmpty(page.getPageSize())) { + return Result.error("页大小为空!"); + } else { + //解token权限 + return Result.success(rechargeService.selectBy(page.getPageNum(), page.getPageSize(), page.getRechargeUser())); + } + } catch (Exception e) { + return Result.error("请检查筛选数据的格式"); + } + + } } diff --git a/src/main/java/com/example/demo/controller/coin/RefundController.java b/src/main/java/com/example/demo/controller/coin/RefundController.java index e730265..ef1f6ba 100644 --- a/src/main/java/com/example/demo/controller/coin/RefundController.java +++ b/src/main/java/com/example/demo/controller/coin/RefundController.java @@ -6,6 +6,7 @@ import com.example.demo.service.coin.RefundService; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; @@ -73,14 +74,15 @@ public class RefundController { return Result.error("页大小为空!"); } else { //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - List list = Arrays.asList(admin.getMarkets().split(",")); - page.getRefundUser().setMarkets(list); - } else { - return Result.error("角色为空"); + if(page.getRefundUser().getMarkets()==null||page.getRefundUser().getMarkets().isEmpty()) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); + + if(!markets.contains("1")) { + page.getRefundUser().setMarkets(markets); + } } return Result.success(refundService.selectBy(page.getPageNum(), page.getPageSize(), page.getRefundUser())); } @@ -95,15 +97,15 @@ public class RefundController { public Result statsGold(@RequestBody RefundUser refundUser) { try { //解token权限 - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - List list = Arrays.asList(admin.getMarkets().split(",")); - refundUser.setMarkets(list); - } - else{ - return Result.error("角色为空"); + if(refundUser.getMarkets()==null||refundUser.getMarkets().isEmpty()) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); + + if(!markets.contains("1")) { + refundUser.setMarkets(markets); + } } Gold gold = refundService.statsGold(refundUser); return Result.success(gold); @@ -135,4 +137,20 @@ public class RefundController { return Result.error("请检查数据的格式"); } } + public Result selcet(@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("请检查筛选数据的格式"); + } + + } } diff --git a/src/main/java/com/example/demo/controller/coin/WorkbenchController.java b/src/main/java/com/example/demo/controller/coin/WorkbenchController.java index 8029bce..7e5d3da 100644 --- a/src/main/java/com/example/demo/controller/coin/WorkbenchController.java +++ b/src/main/java/com/example/demo/controller/coin/WorkbenchController.java @@ -57,7 +57,7 @@ public class WorkbenchController { List markets = workbenchService.getAdminMarket(account); WorkbenchCard result; //判断是否是总部 - if (markets != null && markets.contains("总部")) { + if (markets != null && markets.contains("1")) { result = workbenchService.getCardCache(markets);//走缓存,拿全部市场的缓存数据 } else { result = workbenchService.getCard(markets);//不走缓存,计算卡片属性 diff --git a/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java b/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java index d00c03a..31cae1f 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java @@ -68,6 +68,6 @@ public class ConsumeUser implements Serializable { private String sortField; //排序字段 @ExcelIgnore private String sortOrder; //排序顺序 - + @ExcelIgnore private List markets; // 地区列表 } diff --git a/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java b/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java index 668167f..5f5af0e 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java +++ b/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java @@ -57,7 +57,7 @@ public class GoldDetail { private String sortField; //排序字段 @ExcelIgnore private String sortOrder; //排序顺序 - @ExcelIgnore + @ExcelProperty("更新时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date auditTime; @ExcelIgnore diff --git a/src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java b/src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java index 60f12d8..fb540a2 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java @@ -25,64 +25,64 @@ public class RechargeUser { private static final long serialVersionUID = 1L; -// @ExcelProperty("客户姓名") + @ExcelProperty("客户姓名") private String name; // 客户姓名 -// @ExcelProperty("精网号") + @ExcelProperty("精网号") private Integer jwcode; // 精网号 -// @ExcelProperty("所属地区") + @ExcelProperty("所属地区") private String market; // 所属地区 -// @ExcelProperty("活动名称") + @ExcelProperty("活动名称") private String activity; // 活动名称 -// @ExcelProperty("汇率ID") + @ExcelProperty("汇率ID") private Integer rateId; // 汇率ID -// @ExcelProperty("汇率名称") + @ExcelProperty("汇率名称") private String rateName; // 汇率名称 -// @ExcelProperty("金额[分]") + @ExcelProperty("金额[分]") private Integer money; // 金额[分] -// @ExcelProperty("永久金币") + @ExcelProperty("永久金币") private Integer permanentGold; // 永久金币 -// @ExcelProperty("免费金币") + @ExcelProperty("免费金币") private Integer freeGold; // 免费金币 -// @ExcelProperty("支付方式") + @ExcelProperty("支付方式") private String payModel; // 支付方式 -// @ExcelProperty("支付平台") + @ExcelProperty("支付平台") private String payPlatform; // 支付平台 -// @ExcelProperty("支付凭证") + @ExcelProperty("支付凭证") private String voucher; // 支付凭证 -// @ExcelProperty("备注") + @ExcelProperty("备注") private String remark; // 备注 -// @ExcelProperty("提交人Id") + @ExcelProperty("提交人Id") private Integer adminId; // 提交人Id -// @ExcelProperty("提交人姓名") + @ExcelProperty("提交人姓名") private String adminName; // 提交人姓名 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") -// @ExcelProperty("创建时间") + @ExcelProperty("创建时间") private Date payTime; // 创建时间 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") -// @ExcelIgnore + @ExcelIgnore private Date startTime; // 开始时间 -// @ExcelIgnore + @ExcelIgnore @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date endTime; // 结束时间 -// @ExcelIgnore + @ExcelIgnore private String sortField; //排序字段 -// @ExcelIgnore + @ExcelIgnore private String sortOrder; //排序顺序 - + @ExcelIgnore private List markets; // 地区列表 } diff --git a/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java b/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java index 3575ae3..548e784 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java @@ -68,6 +68,6 @@ public class RefundUser { private String sortField; //排序字段 @ExcelIgnore private String sortOrder; //排序顺序 - + @ExcelIgnore private List markets; // 地区列表 } diff --git a/src/main/java/com/example/demo/service/coin/ExportExcelService.java b/src/main/java/com/example/demo/service/coin/ExportExcelService.java index 3001598..7e7ada1 100644 --- a/src/main/java/com/example/demo/service/coin/ExportExcelService.java +++ b/src/main/java/com/example/demo/service/coin/ExportExcelService.java @@ -1,8 +1,12 @@ package com.example.demo.service.coin; import com.example.demo.domain.entity.Export; +import com.example.demo.domain.vo.coin.Page; +import com.example.demo.domain.vo.coin.Result; +import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.function.Function; /** * @program: GOLD @@ -19,4 +23,7 @@ public interface ExportExcelService { Exception consumeExcel(String message) throws Exception; Exception refundExcel(String message) throws Exception; List getExcel(Export export); + + @Transactional + Exception exportExcelGeneric(String message, String exportType, Function dataFetcher) throws Exception; } \ No newline at end of file diff --git a/src/main/java/com/example/demo/service/listen/BaseMessageListener.java b/src/main/java/com/example/demo/service/listen/BaseMessageListener.java new file mode 100644 index 0000000..b3f3d9f --- /dev/null +++ b/src/main/java/com/example/demo/service/listen/BaseMessageListener.java @@ -0,0 +1,66 @@ +package com.example.demo.service.listen; + +import cn.hutool.core.util.StrUtil; +import com.example.demo.Util.ExecutionContextUtil; +import com.example.demo.Util.FeiShuAlertUtil; +import com.example.demo.Util.RedisUtil; +import com.example.demo.domain.vo.coin.ExecutionContext; +import com.example.demo.service.queue.AbstractMessageListener; + +public abstract class BaseMessageListener extends AbstractMessageListener { + + protected BaseMessageListener(RedisUtil redisQueueUtil, String queueName) { + super(redisQueueUtil, queueName); + System.out.println("监听器已启动,队列: " + queueName); + } + + @Override + protected void handleError(Exception e, T message) { + handleException(e, message.toString()); // 统一异常处理 + } + + /** + * 验证消息是否为空 + */ + protected void validateMessage(T message) { + if (message == null || (message instanceof String && StrUtil.isBlank((String) message))) { + throw new IllegalArgumentException("Redis消息队列数据为空: " + message); + } + } + + /** + * 统一异常处理 + */ + protected void handleException(Exception e, String message) { + logError(e, message); // 记录错误日志 + sendAlert(e, message); // 发送告警通知 + throw new RuntimeException("Failed to process message: " + e.getMessage(), e); + } + + /** + * 记录错误日志 + */ + protected void logError(Exception e, String message) { + System.err.println("Message listener exception: " + e.getMessage()); + e.printStackTrace(); + } + + /** + * 发送告警通知 + */ + protected void sendAlert(Exception e, String message) { + try { + ExecutionContext context = ExecutionContextUtil.getExecutionContext(); + String cause = e.getCause() != null ? e.getCause().getMessage() : ""; + FeiShuAlertUtil.sendAlertMessage( + context, + e.getStackTrace()[0].getFileName(), + e.getStackTrace()[0].getLineNumber(), + "Message Listener Error: " + e.getMessage() + " 底层错误: " + cause, + "Failed message: " + message + ); + } catch (Exception alertEx) { + System.err.println("Failed to send Feishu alert: " + alertEx.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java index b2895f1..3f17182 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java @@ -42,6 +42,7 @@ import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.List; +import java.util.function.Function; @Service @@ -76,921 +77,95 @@ public class ExportExcelServiceImpl implements ExportExcelService { @Transactional @Override public Exception handleExcelExportData(String message) throws Exception { - System.out.println("明细导出excel数据开始执行:" + message); - long sTime = System.currentTimeMillis(); - Long recordId = null; - String fileName = null; - File tempFile = null; - OutputStream outputStream = null; - ExcelWriter excelWriter = null; - - - try { - // 1. 解析JSON任务 - JsonNode rootNode = objectMapper.readTree(message); - // 2. 获取基本参数 - recordId = rootNode.path("recordId").asLong(); - JsonNode requestDataNode = rootNode.path("requestData"); - JsonNode token = requestDataNode.path("token"); - String tokenValue = token.asText(); - JsonNode goldDetailNode = requestDataNode.path("goldDetail"); - GoldDetail goldDetail = objectMapper.treeToValue(goldDetailNode, GoldDetail.class); - - // 3. 验证导出记录 - AiEmotionExportRecordVO record = validateExportRecord(recordId); - if (record == null) return null; - //4. 更新状态为处理中 - aiEmotionService.updateStatus(recordId, 1, "", "", 0); - // 5. 准备Excel文件 - fileName = record.getFileName(); - // 初始化临时文件(保存到本地临时目录) - tempFile = File.createTempFile("export_", ".xlsx"); - outputStream = new FileOutputStream(tempFile); // 使用文件输出流 - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - // 从JSON中提取单个值 - - Date startTime = null; - if (goldDetailNode.has("startTime") && goldDetailNode.get("startTime") != null) { - String startTimeStr = goldDetailNode.get("startTime").asText(); - if (!"null".equalsIgnoreCase(startTimeStr) && !startTimeStr.trim().isEmpty()) { - try { - startTime = dateFormat.parse(startTimeStr); - } catch (ParseException e) { - System.err.println("无法解析 startTime: " + startTimeStr); - e.printStackTrace(); - } - } - } - - // 解析 endTime - Date endTime = null; - - if (goldDetailNode.has("endTime") && goldDetailNode.get("endTime") != null) { - String endTimeStr = goldDetailNode.get("endTime").asText(); - if (!"null".equalsIgnoreCase(endTimeStr) && !endTimeStr.trim().isEmpty()) { - try { - endTime = dateFormat.parse(endTimeStr); - } catch (ParseException e) { - System.err.println("无法解析 endTime: " + endTimeStr); - e.printStackTrace(); - } - } - } - - try { - // 6. 初始化Excel写入器(指向本地文件流) - excelWriter = EasyExcel.write(outputStream, GoldDetail.class).build(); - WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build(); - // 7. 分页查询并写入数据 - Page page = new Page(); - page.setGoldDetail(goldDetail); - if(goldDetail.getMarkets()==null||goldDetail.getMarkets().isEmpty()){ - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(tokenValue), Admin.class); - List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); - if(!markets.contains("总部")) { - page.getGoldDetail().setMarkets(markets); - } - } - page.setPageNum(1); - page.setPageSize(5000); - Integer totalCount = 0; - - boolean hasMore = true; - while (hasMore) { - Result pageResult = goldDetailController.ExcelGoldDetail(page); - Integer code = pageResult.getCode(); - Object data = pageResult.getData(); - - if (code == 200) { - // 判断 data 是否是 PageInfo 类型 - if (!(data instanceof PageInfo)) { - log.error("返回数据类型错误,期望 PageInfo,实际为:{}", data.getClass()); - hasMore = false; - continue; - } - - @SuppressWarnings("unchecked") - PageInfo pageInfo = (PageInfo) data; - - Long total = (long) pageInfo.getTotal(); // 转换为 long - List list = pageInfo.getList(); - - if (list == null || list.isEmpty()) { - hasMore = false; - } else { - // 写入 Excel 数据 - excelWriter.write(list, writeSheet); - - page.setPageNum(page.getPageNum() + 1); - totalCount += list.size(); - log.info("导出进度 recordId: {}, 已处理: {}条", recordId, totalCount); - - hasMore = totalCount < total; - } - } else { - hasMore = false; - log.error("获取数据失败,状态码: {}", code); - } - } - // 7. 完成Excel写入(所有数据写入后关闭写入器) - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.flush(); // 确保所有数据写入 - outputStream.close(); // 关闭文件流 - } - // 检查文件是否存在且不为空 - if (tempFile != null && tempFile.exists() && tempFile.length() > 0) { - // 8. 上传到OSS(读取本地临时文件) - // 获取接口的基础 URL - String uploadUrl = this.uploadUrl; - try { - // 1. 创建上传工具实例 - ExcelUploadUtil uploadUtil = new ExcelUploadUtil(uploadUrl); - - // 2. 准备要上传的文件 - File excelFile = new File(tempFile.toURI()); - try { - // 3. 执行上传 - String result = uploadUtil.uploadExcel(excelFile, "export/excel/"); - // 1. 解析JSON任务 -// JsonNode uploadResult = objectMapper.readTree(result); -// System.out.println(uploadResult+"11111111111111111111111"); -// long code = uploadResult.path("code").asLong(); -// String url = String.valueOf(uploadResult.path("data")); -// url = url.replace("\"", ""); -// if (code == 1) { -// // 3. 验证导出记录decodecode -// aiEmotionService.updateStatus(recordId, 2, url, "", totalCount); -// } else { -// //更新失败 -// aiEmotionService.updateStatus(recordId, 3, "", url, 0); -// } - JsonNode uploadResult = objectMapper.readTree(result); - long code = uploadResult.path("code").asLong(); - - String fileUrl = ""; - JsonNode dataNode = uploadResult.path("data"); - if (dataNode.isObject()) { - fileUrl = dataNode.path("url").asText(); - } else if (dataNode.isTextual()) { - fileUrl = dataNode.asText(); // 如果 data 是直接字符串 URL - } - - log.info("解析到的URL: {}", fileUrl); - - if (code == 200 && !fileUrl.isEmpty()) { - aiEmotionService.updateStatus(recordId, 2, fileUrl, "", totalCount); - } else { - aiEmotionService.updateStatus(recordId, 3, "", "上传成功但URL为空或解析失败", 0); - } - } catch (Exception e) { - //更新失败 - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - throw new Exception("文件上传云端失败1", e); - } - } catch (Exception e) { - log.error("上传文件失败 recordId: {}, 文件名: {}", recordId, fileName, e); - //更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("文件上传云端失败2", e); - } - } else { - throw new Exception("导出的Excel文件不存在或为空"); - } - - } catch (Exception e) { - System.out.println("导出异常" + e.getMessage()); - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("导出异常", e); - } finally { - // 确保资源被关闭 - try { - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.close(); - } - } catch (Exception e) { - log.error("关闭资源失败", e); - throw new Exception("excel文件关闭资源失败", e); - } - } - } catch (Exception e) { - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - System.out.println("<导出失败>" + e.getMessage()); - throw new Exception("导出任务处理失败", e); - } finally { - // 清理临时文件 - if (tempFile != null && tempFile.exists()) { - try { - if (tempFile.delete()) { - log.info("临时文件已删除: {}", tempFile.getAbsolutePath()); - } else { - log.warn("无法删除临时文件: {}", tempFile.getAbsolutePath()); - } - } catch (Exception e) { - log.error("删除临时文件失败", e.getMessage()); - throw new Exception("删除临时文件失败", e); - } - } - long eTime = System.currentTimeMillis(); - log.info("导出任务完成,耗时: {}毫秒", (eTime - sTime)); - } - return null; - } - - - - @Transactional - @Override - public Exception handleExcel(String message) throws Exception { - System.out.println("明细导出excel数据开始执行:" + message); - long stTime = System.currentTimeMillis(); - Long recordId = null; - String fileName = null; - File tempFile = null; - OutputStream outputStream = null; - ExcelWriter excelWriter = null; - - try { - // 1. 解析JSON任务 - JsonNode rootNode = objectMapper.readTree(message); - // 2. 获取基本参数 - recordId = rootNode.path("recordId").asLong(); - JsonNode requestDataNode = rootNode.path("requestData"); - JsonNode token = requestDataNode.path("token"); - String tokenValue = token.asText(); - JsonNode userNode = requestDataNode.path("user"); - User user = objectMapper.treeToValue(userNode, User.class); - // 3. 验证导出记录 - AiEmotionExportRecordVO record = validateExportRecord(recordId); - if (record == null) return null; - //4. 更新状态为处理中 - aiEmotionService.updateStatus(recordId, 1, "", "", 0); - // 5. 准备Excel文件 - fileName = record.getFileName(); - // 初始化临时文件(保存到本地临时目录) - tempFile = File.createTempFile("export_", ".xlsx"); - outputStream = new FileOutputStream(tempFile); // 使用文件输出流 - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - // 从JSON中提取单个值 -// String text = requestDataNode.has("text") ? requestDataNode.get("text").asText() : null; -// Integer sort = requestDataNode.has("sort") ? requestDataNode.get("sort").asInt() : null; -// String field = requestDataNode.has("field") ? requestDataNode.get("field").asText() : null; -// String deptId = requestDataNode.has("deptId") ? requestDataNode.get("deptId").asText() : null; - - Date startTime = null; - if (userNode.has("startTime") && userNode.get("startTime") != null) { - String startTimeStr = userNode.get("startTime").asText(); - if (!"null".equalsIgnoreCase(startTimeStr) && !startTimeStr.trim().isEmpty()) { - try { - startTime = dateFormat.parse(startTimeStr); - } catch (ParseException e) { - System.err.println("无法解析 startTime: " + startTimeStr); - e.printStackTrace(); - } - } - } - - // 解析 endTime - Date endTime = null; - - if (userNode.has("endTime") && userNode.get("endTime") != null) { - String endTimeStr = userNode.get("endTime").asText(); - if (!"null".equalsIgnoreCase(endTimeStr) && !endTimeStr.trim().isEmpty()) { - try { - endTime = dateFormat.parse(endTimeStr); - } catch (ParseException e) { - System.err.println("无法解析 endTime: " + endTimeStr); - e.printStackTrace(); - } - } - } - - try { - // 6. 初始化Excel写入器(指向本地文件流) - excelWriter = EasyExcel.write(outputStream, User.class).build(); - WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build(); - // 7. 分页查询并写入数据 - Page page = new Page(); - page.setUser(user); - if(user.getMarkets()==null||user.getMarkets().isEmpty()){ - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(tokenValue), Admin.class); - List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); - if(!markets.contains("总部")) { - page.getUser().setMarkets(markets); - } - } - page.setPageNum(1); - page.setPageSize(5000); - Integer totalCount = 0; - boolean hasMore = true; - while (hasMore) { - Result pageResult = goldDetailController.ExcelGold(page); - Integer code = pageResult.getCode(); - Object data = pageResult.getData(); - - if (code == 200) { - // 判断 data 是否是 PageInfo 类型 - if (!(data instanceof PageInfo)) { - log.error("返回数据类型错误,期望 PageInfo,实际为:{}", data.getClass()); - hasMore = false; - continue; - } - - @SuppressWarnings("unchecked") - PageInfo pageInfo = (PageInfo) data; - - Long total = (long) pageInfo.getTotal(); // 转换为 long - List list = pageInfo.getList(); - - if (list == null || list.isEmpty()) { - hasMore = false; - } else { - // 写入 Excel 数据 - excelWriter.write(list, writeSheet); - - page.setPageNum(page.getPageNum() + 1); - totalCount += list.size(); - log.info("导出进度 recordId: {}, 已处理: {}条", recordId, totalCount); - - hasMore = totalCount < total; - } - } else { - hasMore = false; - log.error("获取数据失败,状态码: {}", code); - } - } - // 7. 完成Excel写入(所有数据写入后关闭写入器) - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.flush(); // 确保所有数据写入 - outputStream.close(); // 关闭文件流 - } - // 检查文件是否存在且不为空 - if (tempFile != null && tempFile.exists() && tempFile.length() > 0) { - // 8. 上传到OSS(读取本地临时文件) - // 获取接口的基础 URL - String uploadUrl = this.uploadUrl; - try { - // 1. 创建上传工具实例 - ExcelUploadUtil uploadUtil = new ExcelUploadUtil(uploadUrl); - - // 2. 准备要上传的文件 - File excelFile = new File(tempFile.toURI()); - try { - // 3. 执行上传 - String result = uploadUtil.uploadExcel(excelFile, "export/excel/"); - // 1. 解析JSON任务 -// JsonNode uploadResult = objectMapper.readTree(result); -// System.out.println(uploadResult+"11111111111111111111111"); -// long code = uploadResult.path("code").asLong(); -// String url = String.valueOf(uploadResult.path("data")); -// url = url.replace("\"", ""); -// if (code == 1) { -// // 3. 验证导出记录decodecode -// aiEmotionService.updateStatus(recordId, 2, url, "", totalCount); -// } else { -// //更新失败 -// aiEmotionService.updateStatus(recordId, 3, "", url, 0); -// } - JsonNode uploadResult = objectMapper.readTree(result); - long code = uploadResult.path("code").asLong(); - - String fileUrl = ""; - JsonNode dataNode = uploadResult.path("data"); - if (dataNode.isObject()) { - fileUrl = dataNode.path("url").asText(); - } else if (dataNode.isTextual()) { - fileUrl = dataNode.asText(); // 如果 data 是直接字符串 URL - } - - log.info("解析到的URL: {}", fileUrl); - - if (code == 200 && !fileUrl.isEmpty()) { - aiEmotionService.updateStatus(recordId, 2, fileUrl, "", totalCount); - } else { - aiEmotionService.updateStatus(recordId, 3, "", "上传成功但URL为空或解析失败", 0); - } - } catch (Exception e) { - //更新失败 - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - throw new Exception("文件上传云端失败1", e); - } - } catch (Exception e) { - log.error("上传文件失败 recordId: {}, 文件名: {}", recordId, fileName, e); - //更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("文件上传云端失败2", e); - } - } else { - throw new Exception("导出的Excel文件不存在或为空"); - } - - } catch (Exception e) { - System.out.println("导出异常" + e.getMessage()); - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("导出异常", e); - } finally { - // 确保资源被关闭 - try { - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.close(); - } - } catch (Exception e) { - log.error("关闭资源失败", e); - throw new Exception("excel文件关闭资源失败", e); - } - } - } catch (Exception e) { - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - System.out.println("<导出失败>" + e.getMessage()); - throw new Exception("导出任务处理失败", e); - } finally { - // 清理临时文件 - if (tempFile != null && tempFile.exists()) { - try { - if (tempFile.delete()) { - log.info("临时文件已删除: {}", tempFile.getAbsolutePath()); - } else { - log.warn("无法删除临时文件: {}", tempFile.getAbsolutePath()); - } - } catch (Exception e) { - log.error("删除临时文件失败", e.getMessage()); - throw new Exception("删除临时文件失败", e); - } - } - long eTime = System.currentTimeMillis(); - log.info("导出任务完成,耗时: {}毫秒", (eTime - stTime)); - } - return null; - } - - @Transactional - @Override - public Exception rechargeExcel(String message) throws Exception { - System.out.println("明细导出excel数据开始执行:" + message); - long startTime = System.currentTimeMillis(); - Long recordId = null; - String fileName = null; - String token = null; - File tempFile = null; - OutputStream outputStream = null; - ExcelWriter excelWriter = null; - - try { - // 1. 解析JSON任务 - JsonNode rootNode = objectMapper.readTree(message); - // 2. 获取基本参数 - recordId = rootNode.path("recordId").asLong(); - token = rootNode.path("token").asText(); - JsonNode requestDataNode = rootNode.path("requestData"); - JsonNode rechargeNode = requestDataNode.path("rechargeUser"); - RechargeUser rechargeUser = objectMapper.treeToValue(rechargeNode, RechargeUser.class); - // 3. 验证导出记录 - AiEmotionExportRecordVO record = validateExportRecord(recordId); - if (record == null) return null; - //4. 更新状态为处理中 - aiEmotionService.updateStatus(recordId, 1, "", "", 0); - // 5. 准备Excel文件 - fileName = record.getFileName(); - // 初始化临时文件(保存到本地临时目录) - tempFile = File.createTempFile("export_", ".xlsx"); - outputStream = new FileOutputStream(tempFile); // 使用文件输出流 - // 从JSON中提取单个值 -// String text = requestDataNode.has("text") ? requestDataNode.get("text").asText() : null; -// Integer sort = requestDataNode.has("sort") ? requestDataNode.get("sort").asInt() : null; -// String field = requestDataNode.has("field") ? requestDataNode.get("field").asText() : null; -// String deptId = requestDataNode.has("deptId") ? requestDataNode.get("deptId").asText() : null; - - try { - // 6. 初始化Excel写入器(指向本地文件流) - try { - excelWriter = EasyExcel.write(outputStream, RechargeUser.class).build(); - } catch (Exception e) { - log.error("Excel 写入器初始化失败", e); - throw new RuntimeException("Excel 写入器初始化失败", e); - } - WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build(); - // 7. 分页查询并写入数据 - Page page = new Page(); - page.setPageNum(1); - page.setPageSize(5000); - Integer totalCount = 0; - page.setRechargeUser(rechargeUser); - boolean hasMore = true; - while (hasMore) { - try { - Authentication authentication = JWTUtil.getAuthenticationFromToken(token, Admin.class); - if (authentication != null) { - System.out.println("Authentication: " + authentication); - SecurityContextHolder.getContext().setAuthentication(authentication); // 存储认证信息 - } - } catch (Exception e) { - e.printStackTrace(); - } - Result pageResult = rechargeController.selcetBy(page); - Integer code = pageResult.getCode(); - Object data = pageResult.getData(); - - if (code == 200) { - // 判断 data 是否是 PageInfo 类型 - if (!(data instanceof PageInfo)) { - log.error("返回数据类型错误,期望 PageInfo,实际为:{}", data.getClass()); - hasMore = false; - continue; - } - - @SuppressWarnings("unchecked") - PageInfo pageInfo = (PageInfo) data; - - Long total = (long) pageInfo.getTotal(); // 转换为 long - List list = pageInfo.getList(); - - if (list == null || list.isEmpty()) { - hasMore = false; - } else { - // 写入 Excel 数据 - excelWriter.write(list, writeSheet); - - page.setPageNum(page.getPageNum() + 1); - totalCount += list.size(); - log.info("导出进度 recordId: {}, 已处理: {}条", recordId, totalCount); - - hasMore = totalCount < total; - } - } else { - hasMore = false; - log.error("获取数据失败,状态码: {}", code); - } - } - // 7. 完成Excel写入(所有数据写入后关闭写入器) - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.flush(); // 确保所有数据写入 - outputStream.close(); // 关闭文件流 - } - // 检查文件是否存在且不为空 - if (tempFile != null && tempFile.exists() && tempFile.length() > 0) { - // 8. 上传到OSS(读取本地临时文件) - // 获取接口的基础 URL - String uploadUrl = this.uploadUrl; - try { - // 1. 创建上传工具实例 - ExcelUploadUtil uploadUtil = new ExcelUploadUtil(uploadUrl); - - // 2. 准备要上传的文件 - File excelFile = new File(tempFile.toURI()); - try { - // 3. 执行上传 - String result = uploadUtil.uploadExcel(excelFile, "export/excel/"); - // 1. 解析JSON任务 -// JsonNode uploadResult = objectMapper.readTree(result); -// System.out.println(uploadResult+"11111111111111111111111"); -// long code = uploadResult.path("code").asLong(); -// String url = String.valueOf(uploadResult.path("data")); -// url = url.replace("\"", ""); -// if (code == 1) { -// // 3. 验证导出记录decodecode -// aiEmotionService.updateStatus(recordId, 2, url, "", totalCount); -// } else { -// //更新失败 -// aiEmotionService.updateStatus(recordId, 3, "", url, 0); -// } - JsonNode uploadResult = objectMapper.readTree(result); - long code = uploadResult.path("code").asLong(); - - String fileUrl = ""; - JsonNode dataNode = uploadResult.path("data"); - if (dataNode.isObject()) { - fileUrl = dataNode.path("url").asText(); - } else if (dataNode.isTextual()) { - fileUrl = dataNode.asText(); // 如果 data 是直接字符串 URL - } - - log.info("解析到的URL: {}", fileUrl); - - if (code == 200 && !fileUrl.isEmpty()) { - aiEmotionService.updateStatus(recordId, 2, fileUrl, "", totalCount); - } else { - aiEmotionService.updateStatus(recordId, 3, "", "上传成功但URL为空或解析失败", 0); - } - } catch (Exception e) { - //更新失败 - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - throw new Exception("文件上传云端失败1", e); - } - } catch (Exception e) { - log.error("上传文件失败 recordId: {}, 文件名: {}", recordId, fileName, e); - //更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("文件上传云端失败2", e); - } - } else { - throw new Exception("导出的Excel文件不存在或为空"); - } - - } catch (Exception e) { - System.out.println("导出异常" + e.getMessage()); - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("导出异常", e); - } finally { - // 确保资源被关闭 - try { - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.close(); - } - } catch (Exception e) { - log.error("关闭资源失败", e); - throw new Exception("excel文件关闭资源失败", e); - } - } - } catch (Exception e) { - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - System.out.println("<导出失败>" + e.getMessage()); - throw new Exception("导出任务处理失败", e); - } finally { - // 清理临时文件 - if (tempFile != null && tempFile.exists()) { - try { - if (tempFile.delete()) { - log.info("临时文件已删除: {}", tempFile.getAbsolutePath()); - } else { - log.warn("无法删除临时文件: {}", tempFile.getAbsolutePath()); - } - } catch (Exception e) { - log.error("删除临时文件失败", e.getMessage()); - throw new Exception("删除临时文件失败", e); - } + return exportExcelGeneric(message, "goldDetail", page -> { + try { + return goldDetailController.ExcelGoldDetail(page); + } catch (Exception e) { + throw new RuntimeException(e); } - long endTime = System.currentTimeMillis(); - log.info("导出任务完成,耗时: {}毫秒", (endTime - startTime)); - } - return null; + }); } @Transactional @Override - public Exception consumeExcel(String message) throws Exception { - System.out.println("明细导出excel数据开始执行:" + message); - long startTime = System.currentTimeMillis(); - Long recordId = null; - String fileName = null; - File tempFile = null; - String token = null; - OutputStream outputStream = null; - ExcelWriter excelWriter = null; - - try { - // 1. 解析JSON任务 - JsonNode rootNode = objectMapper.readTree(message); - // 2. 获取基本参数 - recordId = rootNode.path("recordId").asLong(); - JsonNode requestDataNode = rootNode.path("requestData"); - token = rootNode.path("token").asText(); - JsonNode consumeUserNode = requestDataNode.path("consumeUser"); - ConsumeUser consumeUser = objectMapper.treeToValue(consumeUserNode, ConsumeUser.class); - // 3. 验证导出记录 - AiEmotionExportRecordVO record = validateExportRecord(recordId); - if (record == null) return null; - //4. 更新状态为处理中 - aiEmotionService.updateStatus(recordId, 1, "", "", 0); - // 5. 准备Excel文件 - fileName = record.getFileName(); - log.info("到这了---------------------------------------------"); - // 初始化临时文件(保存到本地临时目录) - tempFile = File.createTempFile("export_", ".xlsx"); - outputStream = new FileOutputStream(tempFile); // 使用文件输出流 - // 从JSON中提取单个值 - - + public Exception handleExcel(String message) throws Exception { + return exportExcelGeneric(message, "user", page -> { try { - // 6. 初始化Excel写入器(指向本地文件流) - excelWriter = EasyExcel.write(outputStream, ConsumeUser.class).build(); - WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build(); - // 7. 分页查询并写入数据 - Page page = new Page(); - page.setPageNum(1); - page.setPageSize(5000); - page.setConsumeUser(consumeUser); - Integer totalCount = 0; - boolean hasMore = true; - while (hasMore) { - try { - Authentication authentication = JWTUtil.getAuthenticationFromToken(token, Admin.class); - if (authentication != null) { - System.out.println("Authentication: " + authentication); - SecurityContextHolder.getContext().setAuthentication(authentication); // 存储认证信息 - } - } catch (Exception e) { - e.printStackTrace(); - } - Result pageResult = consumeController.selectBy(page); - Integer code = pageResult.getCode(); - Object data = pageResult.getData(); - - if (code == 200) { - // 判断 data 是否是 PageInfo 类型 - if (!(data instanceof PageInfo)) { - log.error("返回数据类型错误,期望 PageInfo,实际为:{}", data.getClass()); - hasMore = false; - continue; - } - - @SuppressWarnings("unchecked") - PageInfo pageInfo = (PageInfo) data; - - Long total = (long) pageInfo.getTotal(); // 转换为 long - List list = pageInfo.getList(); - - if (list == null || list.isEmpty()) { - hasMore = false; - } else { - // 写入 Excel 数据 - excelWriter.write(list, writeSheet); - - page.setPageNum(page.getPageNum() + 1); - totalCount += list.size(); - log.info("导出进度 recordId: {}, 已处理: {}条", recordId, totalCount); + return goldDetailController.ExcelGold(page); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } - hasMore = totalCount < total; - } - } else { - hasMore = false; - log.error("获取数据失败,状态码: {}", code); - } - } - // 7. 完成Excel写入(所有数据写入后关闭写入器) - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.flush(); // 确保所有数据写入 - outputStream.close(); // 关闭文件流 - } - // 检查文件是否存在且不为空 - if (tempFile != null && tempFile.exists() && tempFile.length() > 0) { - // 8. 上传到OSS(读取本地临时文件) - // 获取接口的基础 URL - String uploadUrl = this.uploadUrl; - try { - // 1. 创建上传工具实例 - ExcelUploadUtil uploadUtil = new ExcelUploadUtil(uploadUrl); + @Transactional + @Override + public Exception rechargeExcel(String message) throws Exception { + return exportExcelGeneric(message, "rechargeUser", page -> { + try { + return rechargeController.selcet(page); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } + @Transactional + @Override + public Exception consumeExcel(String message) throws Exception { + return exportExcelGeneric(message, "consumeUser", page -> { + try { + return consumeController.select(page); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } - // 2. 准备要上传的文件 - File excelFile = new File(tempFile.toURI()); - try { - // 3. 执行上传 - String result = uploadUtil.uploadExcel(excelFile, "export/excel/"); - // 1. 解析JSON任务 -// JsonNode uploadResult = objectMapper.readTree(result); -// System.out.println(uploadResult+"11111111111111111111111"); -// long code = uploadResult.path("code").asLong(); -// String url = String.valueOf(uploadResult.path("data")); -// url = url.replace("\"", ""); -// if (code == 1) { -// // 3. 验证导出记录decodecode -// aiEmotionService.updateStatus(recordId, 2, url, "", totalCount); -// } else { -// //更新失败 -// aiEmotionService.updateStatus(recordId, 3, "", url, 0); -// } - JsonNode uploadResult = objectMapper.readTree(result); - long code = uploadResult.path("code").asLong(); + @Transactional + @Override + public Exception refundExcel(String message) throws Exception { + return exportExcelGeneric(message, "refundUser", page -> { + try { + return refundController.selcet(page); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } - String fileUrl = ""; - JsonNode dataNode = uploadResult.path("data"); - if (dataNode.isObject()) { - fileUrl = dataNode.path("url").asText(); - } else if (dataNode.isTextual()) { - fileUrl = dataNode.asText(); // 如果 data 是直接字符串 URL - } + @Override + public List getExcel(Export export) { + List list = exportMapper.getExportRecord(export.getAccount(),export.getType()); + System.out.println(list+"-------------------------------"); + return list; + } - log.info("解析到的URL: {}", fileUrl); - if (code == 200 && !fileUrl.isEmpty()) { - aiEmotionService.updateStatus(recordId, 2, fileUrl, "", totalCount); - } else { - aiEmotionService.updateStatus(recordId, 3, "", "上传成功但URL为空或解析失败", 0); - } - } catch (Exception e) { - //更新失败 - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - throw new Exception("文件上传云端失败1", e); - } - } catch (Exception e) { - log.error("上传文件失败 recordId: {}, 文件名: {}", recordId, fileName, e); - //更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("文件上传云端失败2", e); - } - } else { - throw new Exception("导出的Excel文件不存在或为空"); - } + /** + * 验证导出记录 + */ + private AiEmotionExportRecordVO validateExportRecord(Long recordId) throws Exception { + AiEmotionExportRecordVO record = aiEmotionService.getRecordById(recordId); + AbstractLog log = null; + if (record == null) { + log.error("导出记录不存在 recordId: {}", recordId); + return null; + } - } catch (Exception e) { - System.out.println("导出异常" + e.getMessage()); - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("导出异常", e); - } finally { - // 确保资源被关闭 - try { - if (excelWriter != null) { - excelWriter.finish(); - } - if (outputStream != null) { - outputStream.close(); - } - } catch (Exception e) { - log.error("关闭资源失败", e); - throw new Exception("excel文件关闭资源失败", e); - } - } - } catch (Exception e) { - log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - System.out.println("<导出失败>" + e.getMessage()); - throw new Exception("导出任务处理失败", e); - } finally { - // 清理临时文件 - if (tempFile != null && tempFile.exists()) { - try { - if (tempFile.delete()) { - log.info("临时文件已删除: {}", tempFile.getAbsolutePath()); - } else { - log.warn("无法删除临时文件: {}", tempFile.getAbsolutePath()); - } - } catch (Exception e) { - log.error("删除临时文件失败", e.getMessage()); - throw new Exception("删除临时文件失败", e); - } - } - long endTime = System.currentTimeMillis(); - log.info("导出任务完成,耗时: {}毫秒", (endTime - startTime)); + // 检查是否已经处理过 + if (record.getState() != 0) { + log.warn("导出记录已处理 recordId: {}, status: {}", recordId, record.getState()); + return null; } - return null; + return record; } @Transactional @Override - public Exception refundExcel(String message) throws Exception { + public Exception exportExcelGeneric(String message, String exportType, Function dataFetcher) throws Exception { System.out.println("明细导出excel数据开始执行:" + message); long startTime = System.currentTimeMillis(); Long recordId = null; - String fileName = null; - String token = null; File tempFile = null; OutputStream outputStream = null; ExcelWriter excelWriter = null; @@ -998,51 +173,41 @@ public class ExportExcelServiceImpl implements ExportExcelService { try { // 1. 解析JSON任务 JsonNode rootNode = objectMapper.readTree(message); - // 2. 获取基本参数 recordId = rootNode.path("recordId").asLong(); - token = rootNode.path("token").asText(); JsonNode requestDataNode = rootNode.path("requestData"); - JsonNode refundUserNode = requestDataNode.path("refundUser"); - RefundUser refundUser = objectMapper.treeToValue(refundUserNode, RefundUser.class); - // 3. 验证导出记录 + String tokenValue = requestDataNode.path("token").asText(); + + // 2. 验证导出记录 AiEmotionExportRecordVO record = validateExportRecord(recordId); if (record == null) return null; - //4. 更新状态为处理中 + + // 3. 更新状态为处理中 aiEmotionService.updateStatus(recordId, 1, "", "", 0); - // 5. 准备Excel文件 - fileName = record.getFileName(); - // 初始化临时文件(保存到本地临时目录) + + // 4. 准备Excel文件 + String fileName = record.getFileName(); tempFile = File.createTempFile("export_", ".xlsx"); - outputStream = new FileOutputStream(tempFile); // 使用文件输出流 - // 从JSON中提取单个值 + outputStream = new FileOutputStream(tempFile); try { - // 6. 初始化Excel写入器(指向本地文件流) - excelWriter = EasyExcel.write(outputStream, RefundUser.class).build(); + // 5. 初始化Excel写入器 + Class clazz = getExportClass(exportType); // 动态获取导出类 + excelWriter = EasyExcel.write(outputStream, clazz).build(); WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build(); - // 7. 分页查询并写入数据 + + // 6. 分页查询并写入数据 Page page = new Page(); page.setPageNum(1); - page.setPageSize(5000); - page.setRefundUser(refundUser); + page.setPageSize(PAGE_SIZE); Integer totalCount = 0; boolean hasMore = true; + while (hasMore) { - try { - Authentication authentication = JWTUtil.getAuthenticationFromToken(token, Admin.class); - if (authentication != null) { - System.out.println("Authentication: " + authentication); - SecurityContextHolder.getContext().setAuthentication(authentication); // 存储认证信息 - } - } catch (Exception e) { - e.printStackTrace(); - } - Result pageResult = refundController.selcetBy(page); + Result pageResult = dataFetcher.apply(page); Integer code = pageResult.getCode(); Object data = pageResult.getData(); if (code == 200) { - // 判断 data 是否是 PageInfo 类型 if (!(data instanceof PageInfo)) { log.error("返回数据类型错误,期望 PageInfo,实际为:{}", data.getClass()); hasMore = false; @@ -1050,21 +215,17 @@ public class ExportExcelServiceImpl implements ExportExcelService { } @SuppressWarnings("unchecked") - PageInfo pageInfo = (PageInfo) data; - - Long total = (long) pageInfo.getTotal(); // 转换为 long - List list = pageInfo.getList(); + PageInfo pageInfo = (PageInfo) data; + Long total = pageInfo.getTotal(); + List list = pageInfo.getList(); if (list == null || list.isEmpty()) { hasMore = false; } else { - // 写入 Excel 数据 excelWriter.write(list, writeSheet); - page.setPageNum(page.getPageNum() + 1); totalCount += list.size(); log.info("导出进度 recordId: {}, 已处理: {}条", recordId, totalCount); - hasMore = totalCount < total; } } else { @@ -1072,80 +233,49 @@ public class ExportExcelServiceImpl implements ExportExcelService { log.error("获取数据失败,状态码: {}", code); } } - // 7. 完成Excel写入(所有数据写入后关闭写入器) + + // 7. 完成Excel写入 if (excelWriter != null) { excelWriter.finish(); } if (outputStream != null) { - outputStream.flush(); // 确保所有数据写入 - outputStream.close(); // 关闭文件流 + outputStream.flush(); + outputStream.close(); } - // 检查文件是否存在且不为空 + + // 8. 检查文件是否存在且不为空 if (tempFile != null && tempFile.exists() && tempFile.length() > 0) { - // 8. 上传到OSS(读取本地临时文件) - // 获取接口的基础 URL - String uploadUrl = this.uploadUrl; + // 9. 上传到OSS try { - // 1. 创建上传工具实例 ExcelUploadUtil uploadUtil = new ExcelUploadUtil(uploadUrl); - - // 2. 准备要上传的文件 File excelFile = new File(tempFile.toURI()); - try { - // 3. 执行上传 - String result = uploadUtil.uploadExcel(excelFile, "export/excel/"); - // 1. 解析JSON任务 -// JsonNode uploadResult = objectMapper.readTree(result); -// System.out.println(uploadResult+"11111111111111111111111"); -// long code = uploadResult.path("code").asLong(); -// String url = String.valueOf(uploadResult.path("data")); -// url = url.replace("\"", ""); -// if (code == 1) { -// // 3. 验证导出记录decodecode -// aiEmotionService.updateStatus(recordId, 2, url, "", totalCount); -// } else { -// //更新失败 -// aiEmotionService.updateStatus(recordId, 3, "", url, 0); -// } - JsonNode uploadResult = objectMapper.readTree(result); - long code = uploadResult.path("code").asLong(); + String result = uploadUtil.uploadExcel(excelFile, "export/excel/"); - String fileUrl = ""; - JsonNode dataNode = uploadResult.path("data"); - if (dataNode.isObject()) { - fileUrl = dataNode.path("url").asText(); - } else if (dataNode.isTextual()) { - fileUrl = dataNode.asText(); // 如果 data 是直接字符串 URL - } + JsonNode uploadResult = objectMapper.readTree(result); + long code = uploadResult.path("code").asLong(); + String fileUrl = ""; + JsonNode dataNode = uploadResult.path("data"); - log.info("解析到的URL: {}", fileUrl); + if (dataNode.isObject()) { + fileUrl = dataNode.path("url").asText(); + } else if (dataNode.isTextual()) { + fileUrl = dataNode.asText(); + } - if (code == 200 && !fileUrl.isEmpty()) { - aiEmotionService.updateStatus(recordId, 2, fileUrl, "", totalCount); - } else { - aiEmotionService.updateStatus(recordId, 3, "", "上传成功但URL为空或解析失败", 0); - } - } catch (Exception e) { - //更新失败 - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - throw new Exception("文件上传云端失败1", e); + if (code == 200 && !fileUrl.isEmpty()) { + aiEmotionService.updateStatus(recordId, 2, fileUrl, "", totalCount); + } else { + aiEmotionService.updateStatus(recordId, 3, "", "上传成功但URL为空或解析失败", 0); } } catch (Exception e) { - log.error("上传文件失败 recordId: {}, 文件名: {}", recordId, fileName, e); - //更新状态为失败 - if (recordId != null) { - aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); - } - throw new Exception("文件上传云端失败2", e); + aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); + throw new Exception("文件上传云端失败", e); } } else { throw new Exception("导出的Excel文件不存在或为空"); } - } catch (Exception e) { - System.out.println("导出异常" + e.getMessage()); log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 if (recordId != null) { aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); } @@ -1166,11 +296,9 @@ public class ExportExcelServiceImpl implements ExportExcelService { } } catch (Exception e) { log.error("导出任务处理失败 recordId: {}", recordId, e); - // 更新状态为失败 if (recordId != null) { aiEmotionService.updateStatus(recordId, 3, "", StringUtils.substring(e.getMessage(), 0, 500), 0); } - System.out.println("<导出失败>" + e.getMessage()); throw new Exception("导出任务处理失败", e); } finally { // 清理临时文件 @@ -1191,113 +319,20 @@ public class ExportExcelServiceImpl implements ExportExcelService { } return null; } - - - @Override - public List getExcel(Export export) { - List list = exportMapper.getExportRecord(export.getAccount(),export.getType()); - System.out.println(list+"-------------------------------"); - return list; - } - - - /** - * 验证导出记录 - */ - private AiEmotionExportRecordVO validateExportRecord(Long recordId) throws Exception { - AiEmotionExportRecordVO record = aiEmotionService.getRecordById(recordId); - AbstractLog log = null; - if (record == null) { - log.error("导出记录不存在 recordId: {}", recordId); - return null; - } - - // 检查是否已经处理过 - if (record.getState() != 0) { - log.warn("导出记录已处理 recordId: {}, status: {}", recordId, record.getState()); - return null; - } - return record; - } - - /** - * 初始化excel文件 - * @param os - * @param exportType - * @return - */ - private ExcelWriter initExcelWriter(OutputStream os, String exportType) { - switch (exportType) { - case "user": - return EasyExcel.write(os, Goldmingxi.class) - .inMemory(Boolean.TRUE) - .build(); - default: - 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) { + private Class getExportClass(String exportType) { switch (exportType) { + case "goldDetail": + return GoldDetail.class; case "user": - return EasyExcel.write(os, RefundUser.class) - .inMemory(Boolean.TRUE) - .build(); + return User.class; + case "rechargeUser": + return RechargeUser.class; + case "consumeUser": + return ConsumeUser.class; + case "refundUser": + return RefundUser.class; default: throw new IllegalArgumentException("不支持的导出类型: " + exportType); } } - } \ No newline at end of file diff --git a/src/main/java/com/example/demo/serviceImpl/coin/GeneralServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/GeneralServiceImpl.java index 25ea11f..b827a95 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/GeneralServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/GeneralServiceImpl.java @@ -130,10 +130,10 @@ public class GeneralServiceImpl implements GeneralService { } List list = Arrays.asList(market.split(",")); //判断是否是总部 - if (list != null && list.contains("总部")) { + if (list != null && list.contains("1")) { List allMarkets = getMarket(); // 获取所有地区 - allMarkets.remove("总部"); // 先移除可能存在的总部 - allMarkets.add(0, "总部"); // 将总部添加到列表第一位 + allMarkets.remove("1"); // 先移除可能存在的总部 + allMarkets.add(0, "1"); // 将总部添加到列表第一位 list = allMarkets; // 更新list } return list; @@ -156,7 +156,7 @@ public class GeneralServiceImpl implements GeneralService { } List list = Arrays.asList(market.split(",")); //判断是否是总部 - if (list != null && list.contains("总部")) { + if (list != null && list.contains("1")) { list=getMarket();//总部有所有地区的权限 } return list; @@ -181,7 +181,7 @@ public class GeneralServiceImpl implements GeneralService { } List list = Arrays.asList(market.split(",")); //判断是否是总部 - if (list != null && list.contains("总部")) { + if (list != null && list.contains("1")) { list=getAllRoleMarket();//总部有所有地区的权限 } return list; diff --git a/src/main/java/com/example/demo/serviceImpl/coin/MarketServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/MarketServiceImpl.java index f0c9424..31d028c 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/MarketServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/MarketServiceImpl.java @@ -20,7 +20,7 @@ public class MarketServiceImpl implements MarketService { List markets = marketMapper.getMarket(); // 2. 构建树形结构(根节点parentId=1) - return buildTree(markets, 1); + return buildTree(markets, -1); } private List buildTree(List markets, Integer parentId) { // 过滤出当前父节点的子菜单 diff --git a/src/main/java/com/example/demo/serviceImpl/coin/PermissionServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/PermissionServiceImpl.java index 8931a28..aaa66ec 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/PermissionServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/PermissionServiceImpl.java @@ -75,7 +75,7 @@ public class PermissionServiceImpl implements PermissionService { if (ObjectUtils.isEmpty(admin.getMarket())) { throw new Exception("地区为空!"); } - if (admin.getMarket().contains("总部") && admin.getMarket().size() > 1) { + if (admin.getMarket().contains("1") && admin.getMarket().size() > 1) { throw new Exception("总部不可与其他地区共存"); } if (ObjectUtils.isEmpty(admin.getPostiton())) { @@ -148,7 +148,7 @@ public class PermissionServiceImpl implements PermissionService { if (ObjectUtils.isEmpty(adminVo.getMarket())) { throw new Exception("地区为空!"); } - if (adminVo.getMarket().contains("总部") && adminVo.getMarket().size() > 1) { + if (adminVo.getMarket().contains("1") && adminVo.getMarket().size() > 1) { throw new Exception("总部不可与其他地区共存"); } // 校验职位是否为空(管理员职位为必填项) diff --git a/src/main/java/com/example/demo/serviceImpl/coin/WorkbenchServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/WorkbenchServiceImpl.java index a123b13..f9d8c7b 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/WorkbenchServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/WorkbenchServiceImpl.java @@ -60,10 +60,10 @@ public class WorkbenchServiceImpl implements WorkbenchService { } List list = Arrays.asList(market.split(",")); //判断是否是总部 - if (list != null && list.contains("总部")) { + if (list != null && list.contains("1")) { List allMarkets = workBenchMapper.getMarket(); // 获取所有地区 - allMarkets.remove("总部"); // 先移除可能存在的总部 - allMarkets.add(0, "总部"); // 将总部添加到列表第一位 + allMarkets.remove("1"); // 先移除可能存在的总部 + allMarkets.add(0, "1"); // 将总部添加到列表第一位 list = allMarkets; // 更新list } return list; diff --git a/src/main/resources/mapper/AuditMapper.xml b/src/main/resources/mapper/AuditMapper.xml index 7ab53f9..2e5bb5e 100644 --- a/src/main/resources/mapper/AuditMapper.xml +++ b/src/main/resources/mapper/AuditMapper.xml @@ -61,7 +61,7 @@ AND ugr.activity = #{rechargeAudit.activity} - + AND ( u.market LIKE CONCAT('%', #{market}, '%') @@ -122,7 +122,7 @@ AND u.market = #{refundAudit.market} - + AND ( u.market LIKE CONCAT('%', #{market}, '%') diff --git a/src/main/resources/mapper/ConsumeMapper.xml b/src/main/resources/mapper/ConsumeMapper.xml index 79f0bda..38d429b 100644 --- a/src/main/resources/mapper/ConsumeMapper.xml +++ b/src/main/resources/mapper/ConsumeMapper.xml @@ -24,7 +24,7 @@ ugr.type = 1 AND ugr.flag = 1 - + AND ( u.market LIKE CONCAT('%', #{market}, '%') @@ -92,12 +92,11 @@ admin a ON ugr.admin_id = a.id ugr.type = 1 AND ugr.flag = 1 - - AND ( - - u.market LIKE CONCAT('%', #{market}, '%') + + AND u.market IN + + #{market} - ) AND ugr.jwcode = #{jwcode} diff --git a/src/main/resources/mapper/PermissionMapper.xml b/src/main/resources/mapper/PermissionMapper.xml index 3740d89..eded8b8 100644 --- a/src/main/resources/mapper/PermissionMapper.xml +++ b/src/main/resources/mapper/PermissionMapper.xml @@ -84,7 +84,7 @@ and admin.postiton=#{postiton} - + AND ( admin.market LIKE CONCAT('%', #{market}, '%') diff --git a/src/main/resources/mapper/RechargeMapper.xml b/src/main/resources/mapper/RechargeMapper.xml index 08d3527..5ee4e84 100644 --- a/src/main/resources/mapper/RechargeMapper.xml +++ b/src/main/resources/mapper/RechargeMapper.xml @@ -27,13 +27,12 @@ ugr.type = 0 AND ugr.audit_status IN (1,3) AND ugr.flag = 1 - - - AND ( - - u.market LIKE CONCAT('%', #{market}, '%') + + + AND user.market IN + + #{markets} - ) @@ -97,12 +96,11 @@ ugr.type = 0 AND ugr.audit_status IN (1,3) AND ugr.flag = 1 - - AND ( - - u.market LIKE CONCAT('%', #{market}, '%') + + AND u.market IN + + #{market} - ) AND ugr.jwcode = #{jwcode} diff --git a/src/main/resources/mapper/RefundMapper.xml b/src/main/resources/mapper/RefundMapper.xml index eae9331..1c12cf7 100644 --- a/src/main/resources/mapper/RefundMapper.xml +++ b/src/main/resources/mapper/RefundMapper.xml @@ -26,7 +26,7 @@ ugr.type = 2 AND ugr.audit_status IN (1,3) AND ugr.flag = 1 - + AND ( u.market LIKE CONCAT('%', #{market}, '%') @@ -95,12 +95,11 @@ admin a ON ugr.admin_id = a.id ugr.type = 2 AND ugr.audit_status IN (1,3) AND ugr.flag = 1 - - AND ( - - u.market LIKE CONCAT('%', #{market}, '%') + + AND u.market IN + + #{market} - ) AND ugr.jwcode = #{jwcode} diff --git a/src/main/resources/mapper/RoleMapper.xml b/src/main/resources/mapper/RoleMapper.xml index c176265..125c3be 100644 --- a/src/main/resources/mapper/RoleMapper.xml +++ b/src/main/resources/mapper/RoleMapper.xml @@ -37,7 +37,7 @@ SELECT id,role_name FROM role - + AND market IN #{market} @@ -91,7 +91,7 @@ r.market LIKE CONCAT('%', #{market}, '%') - + AND r.market IN #{market} diff --git a/src/main/resources/mapper/UserMapper.xml b/src/main/resources/mapper/UserMapper.xml index 11478d8..c288009 100644 --- a/src/main/resources/mapper/UserMapper.xml +++ b/src/main/resources/mapper/UserMapper.xml @@ -57,7 +57,7 @@ jwcode = #{jwcode} - + AND ( market LIKE CONCAT('%', #{market}, '%')