You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1102 lines
53 KiB
1102 lines
53 KiB
package com.example.demo.serviceImpl;
|
|
|
|
import cn.hutool.log.AbstractLog;
|
|
import com.alibaba.excel.EasyExcel;
|
|
import com.alibaba.excel.ExcelWriter;
|
|
import com.alibaba.excel.write.metadata.WriteSheet;
|
|
import com.example.demo.Util.ExcelUploadUtil;
|
|
import com.example.demo.controller.ConsumeController;
|
|
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.export.Goldmingxi;
|
|
import com.example.demo.domain.vo.*;
|
|
|
|
import com.example.demo.mapper.ExportMapper;
|
|
import com.example.demo.service.ExportExcelService;
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
|
|
|
|
import com.example.demo.service.AiEmotionService;
|
|
|
|
import com.github.pagehelper.PageInfo;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import java.io.*;
|
|
import java.util.List;
|
|
|
|
|
|
@Service
|
|
@Slf4j
|
|
public class ExportExcelServiceImpl implements ExportExcelService {
|
|
|
|
private static final ObjectMapper objectMapper = new ObjectMapper();
|
|
|
|
//注入AiEmotionService
|
|
@Autowired
|
|
private AiEmotionService aiEmotionService;
|
|
//注入GoldDetailController
|
|
@Autowired
|
|
private GoldDetailController goldDetailController;
|
|
@Autowired
|
|
private RechargeController rechargeController;
|
|
@Autowired
|
|
private RefundController refundController;
|
|
@Autowired
|
|
private ConsumeController consumeController;
|
|
|
|
// 每页查询的数据量
|
|
private static final int PAGE_SIZE = 1000;
|
|
@Autowired
|
|
private ExportMapper exportMapper;
|
|
|
|
|
|
@Transactional
|
|
@Override
|
|
public Exception handleExcelExportData(String message) throws Exception {
|
|
System.out.println("明细导出excel数据开始执行:" + message);
|
|
long startTime = 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");
|
|
// 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写入器(指向本地文件流)
|
|
excelWriter = initExcelWriter(outputStream, "user");
|
|
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();
|
|
// 7. 分页查询并写入数据
|
|
Page page = new Page();
|
|
page.setPageNum(1);
|
|
page.setPageSize(1000);
|
|
Integer totalCount = 0;
|
|
boolean hasMore = true;
|
|
while (hasMore) {
|
|
Result pageResult = goldDetailController.getGoldDetail(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<GoldDetail> pageInfo = (PageInfo<GoldDetail>) data;
|
|
|
|
Long total = (long) pageInfo.getTotal(); // 转换为 long
|
|
List<GoldDetail> 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 = "http://39.101.133.168:8828/hljw/api/aws/upload";
|
|
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 endTime = System.currentTimeMillis();
|
|
log.info("导出任务完成,耗时: {}毫秒", (endTime - startTime));
|
|
}
|
|
return null;
|
|
}
|
|
|
|
|
|
|
|
@Transactional
|
|
@Override
|
|
public Exception handleExcel(String message) throws Exception {
|
|
System.out.println("明细导出excel数据开始执行:" + message);
|
|
long startTime = 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");
|
|
// 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写入器(指向本地文件流)
|
|
excelWriter = initExcelWriter(outputStream, "user");
|
|
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();
|
|
// 7. 分页查询并写入数据
|
|
Page page = new Page();
|
|
page.setPageNum(1);
|
|
page.setPageSize(1000);
|
|
Integer totalCount = 0;
|
|
boolean hasMore = true;
|
|
while (hasMore) {
|
|
Result pageResult = goldDetailController.getGold(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<GoldDetail> pageInfo = (PageInfo<GoldDetail>) data;
|
|
|
|
Long total = (long) pageInfo.getTotal(); // 转换为 long
|
|
List<GoldDetail> 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 = "http://39.101.133.168:8828/hljw/api/aws/upload";
|
|
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 endTime = System.currentTimeMillis();
|
|
log.info("导出任务完成,耗时: {}毫秒", (endTime - startTime));
|
|
}
|
|
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;
|
|
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");
|
|
// 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写入器(指向本地文件流)
|
|
excelWriter = initExcelWriter(outputStream, "user");
|
|
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();
|
|
// 7. 分页查询并写入数据
|
|
Page page = new Page();
|
|
page.setPageNum(1);
|
|
page.setPageSize(1000);
|
|
Integer totalCount = 0;
|
|
boolean hasMore = true;
|
|
while (hasMore) {
|
|
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<GoldDetail> pageInfo = (PageInfo<GoldDetail>) data;
|
|
|
|
Long total = (long) pageInfo.getTotal(); // 转换为 long
|
|
List<GoldDetail> 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 = "http://39.101.133.168:8828/hljw/api/aws/upload";
|
|
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 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;
|
|
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");
|
|
// 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写入器(指向本地文件流)
|
|
excelWriter = initExcelWriter(outputStream, "user");
|
|
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();
|
|
// 7. 分页查询并写入数据
|
|
Page page = new Page();
|
|
page.setPageNum(1);
|
|
page.setPageSize(1000);
|
|
Integer totalCount = 0;
|
|
boolean hasMore = true;
|
|
while (hasMore) {
|
|
Result pageResult = refundController.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<GoldDetail> pageInfo = (PageInfo<GoldDetail>) data;
|
|
|
|
Long total = (long) pageInfo.getTotal(); // 转换为 long
|
|
List<GoldDetail> 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 = "http://39.101.133.168:8828/hljw/api/aws/upload";
|
|
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 endTime = System.currentTimeMillis();
|
|
log.info("导出任务完成,耗时: {}毫秒", (endTime - startTime));
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Transactional
|
|
@Override
|
|
public Exception refundExcel(String message) throws Exception {
|
|
System.out.println("明细导出excel数据开始执行:" + message);
|
|
long startTime = 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");
|
|
// 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写入器(指向本地文件流)
|
|
excelWriter = initExcelWriter(outputStream, "user");
|
|
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();
|
|
// 7. 分页查询并写入数据
|
|
Page page = new Page();
|
|
page.setPageNum(1);
|
|
page.setPageSize(1000);
|
|
Integer totalCount = 0;
|
|
boolean hasMore = true;
|
|
while (hasMore) {
|
|
Result pageResult = consumeController.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<GoldDetail> pageInfo = (PageInfo<GoldDetail>) data;
|
|
|
|
Long total = (long) pageInfo.getTotal(); // 转换为 long
|
|
List<GoldDetail> 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 = "http://39.101.133.168:8828/hljw/api/aws/upload";
|
|
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 endTime = System.currentTimeMillis();
|
|
log.info("导出任务完成,耗时: {}毫秒", (endTime - startTime));
|
|
}
|
|
return null;
|
|
}
|
|
|
|
|
|
@Override
|
|
public List<Export> getExcel(Export export) {
|
|
List<Export> list = exportMapper.getExportRecord(export.getAccount());
|
|
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);
|
|
}
|
|
}
|
|
}
|