Merge remote-tracking branch 'origin/master'

This commit is contained in:
caozehui
2025-10-23 13:27:56 +08:00
2 changed files with 25 additions and 20 deletions

View File

@@ -42,6 +42,8 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -452,7 +454,17 @@ public class AdPlanController extends BaseController {
fileTypeError.setMessage("请上传zip文件"); fileTypeError.setMessage("请上传zip文件");
throw new BusinessException(fileTypeError); throw new BusinessException(fileTypeError);
} }
asyncPlanHandler.importAndMergePlanCheckData(file, getUserId(), planId); // 创建临时文件
File tempFile = cn.hutool.core.io.FileUtil.createTempFile();
// 将MultipartFile内容写入临时文件
try {
file.transferTo(tempFile);
} catch (IOException e) {
throw new BusinessException(CommonResponseEnum.FAIL, "文件保存失败");
}
// 获取文件路径
String filePath = tempFile.getAbsolutePath();
asyncPlanHandler.importAndMergePlanCheckData(filePath, getUserId(), planId);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
} }

View File

@@ -37,10 +37,8 @@ import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.time.Duration; import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
@@ -65,6 +63,8 @@ public class AsyncPlanHandler {
private final IAdPariService adPairService; private final IAdPariService adPairService;
private final JdbcTemplate jdbcTemplate; private final JdbcTemplate jdbcTemplate;
@Value("${report.reportDir}") @Value("${report.reportDir}")
private String reportPath; private String reportPath;
@Value("${data.homeDir}") @Value("${data.homeDir}")
@@ -235,35 +235,28 @@ public class AsyncPlanHandler {
} }
@Transactional
@Async @Async
public void importAndMergePlanCheckData(MultipartFile file, String uid, String planId) { public void importAndMergePlanCheckData(String zipFilePath, String uid, String planId) {
importAndMergePlanCheckDataLogic(zipFilePath, uid, planId);
}
@Transactional
public void importAndMergePlanCheckDataLogic(String zipFilePath, String uid, String planId) {
NonWebAutoFillValueHandler.setCurrentUserId(uid); NonWebAutoFillValueHandler.setCurrentUserId(uid);
LocalDateTime startTime = LocalDateTime.now(); LocalDateTime startTime = LocalDateTime.now();
AtomicInteger progress = new AtomicInteger(0); AtomicInteger progress = new AtomicInteger(0);
AtomicInteger currentProgress = new AtomicInteger(0); AtomicInteger currentProgress = new AtomicInteger(0);
AtomicInteger dataCount = new AtomicInteger(0); AtomicInteger dataCount = new AtomicInteger(0);
try { try {
sseClient.sendMessage(uid, planId, HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), progress, "开始保存文件,请耐心等待..."));
// 创建临时目录用于解压文件 // 创建临时目录用于解压文件
File tempDir = FileUtil.mkdir(FileUtil.getTmpDirPath() + "import_plan_check_data_" + System.currentTimeMillis() + "/"); File tempDir = FileUtil.mkdir(FileUtil.getTmpDirPath() + "import_plan_check_data_" + System.currentTimeMillis() + "/");
// 将上传的zip文件保存到临时目录
File zipFile = FileUtil.file(tempDir, file.getOriginalFilename());
try {
// 直接获取文件字节避免依赖Tomcat临时文件
byte[] fileBytes = file.getBytes();
FileUtil.writeBytes(fileBytes, zipFile);
} catch (IOException e) {
log.error("保存上传文件失败", e);
throw e;
}
progress.addAndGet(1); progress.addAndGet(1);
sseClient.sendMessage(uid, planId, HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), progress, "开始解压文件,请耐心等待...")); sseClient.sendMessage(uid, planId, HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), progress, "开始解压文件,请耐心等待..."));
// 解压zip文件 // 解压zip文件
File unzipDir = FileUtil.mkdir(FileUtil.file(tempDir, "unzip")); File unzipDir = FileUtil.mkdir(FileUtil.file(tempDir, "unzip"));
ZipUtil.unzip(zipFile.getAbsolutePath(), unzipDir.getAbsolutePath()); ZipUtil.unzip(zipFilePath, unzipDir.getAbsolutePath());
// 查找解压目录中的json文件 // 查找解压目录中的json文件
File[] files = unzipDir.listFiles(); File[] files = unzipDir.listFiles();
@@ -464,14 +457,14 @@ public class AsyncPlanHandler {
sseClient.sendMessage(uid, planId, HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), progress, "数据合并完成")); sseClient.sendMessage(uid, planId, HttpResultUtil.assembleResult(CommonResponseEnum.SUCCESS.getCode(), progress, "数据合并完成"));
} catch (Exception e) { } catch (Exception e) {
log.error("导入数据失败", e); log.error("导入数据失败", e);
sseClient.sendMessage(uid, planId, HttpResultUtil.assembleResult(CommonResponseEnum.FAIL.getCode(), progress.get() + currentProgress.get(), "导入失败")); sseClient.sendMessage(uid, planId, HttpResultUtil.assembleResult(CommonResponseEnum.FAIL.getCode(), progress.get() + currentProgress.get(), "导入失败"));
} finally { } finally {
NonWebAutoFillValueHandler.clearCurrentUserId(); NonWebAutoFillValueHandler.clearCurrentUserId();
} }
FileUtil.del(zipFilePath);
sseClient.closeSse(uid); sseClient.closeSse(uid);
} }
// 构建分页查询SQL // 构建分页查询SQL