|
|
@@ -20,6 +20,7 @@ import org.springframework.scheduling.annotation.Async;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
+import java.io.IOException;
|
|
|
import java.time.Instant;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.ZoneId;
|
|
|
@@ -93,7 +94,16 @@ public class WeighbridgeRecordManage {
|
|
|
private void updateImageUrls(WeighbridgePushRequest request, WeighbridgeRecord record) {
|
|
|
if (request.getImages() != null && request.getImages().length > 0) {
|
|
|
log.info("开始处理 {} 张图片上传,车牌号: {}", request.getImages().length, request.getLicensePlate());
|
|
|
- processImageFilesAsync(request.getImages())
|
|
|
+ // 将MultipartFile数组转换为字节数组,防止异步处理时临时文件被清理
|
|
|
+ List<byte[]> imageBytesList = new ArrayList<>();
|
|
|
+ for (MultipartFile image : request.getImages()) {
|
|
|
+ try {
|
|
|
+ imageBytesList.add(image.getBytes());
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error("读取图片文件失败,车牌号: {}", request.getLicensePlate(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ processImageFilesAsync(imageBytesList, request.getLicensePlate())
|
|
|
.thenAccept(photoUrls -> {
|
|
|
log.info("图片上传完成,车牌号: {},照片数量: {}", request.getLicensePlate(),
|
|
|
photoUrls != null ? photoUrls.split(",").length : 0);
|
|
|
@@ -151,54 +161,33 @@ public class WeighbridgeRecordManage {
|
|
|
* 为每个图片创建独立的异步任务,实现并行上传
|
|
|
*/
|
|
|
@Async("taskExecutor")
|
|
|
- public CompletableFuture<String> processImageFilesAsync(MultipartFile[] images) {
|
|
|
- log.info("开始并行上传 {} 张图片", images.length);
|
|
|
- long startTime = System.currentTimeMillis();
|
|
|
-
|
|
|
- // 为每个图片创建独立的异步上传任务
|
|
|
- List<CompletableFuture<String>> uploadTasks = Arrays.stream(images)
|
|
|
- .map(image -> CompletableFuture.supplyAsync(() -> {
|
|
|
- String fileName = image.getOriginalFilename();
|
|
|
- log.debug("开始上传图片: {}", fileName);
|
|
|
- try {
|
|
|
- String ossUrl = FileUtils.uploadFile1(image);
|
|
|
- if (StringUtils.isNotBlank(ossUrl)) {
|
|
|
- log.debug("图片上传成功: {} -> {}", fileName, ossUrl);
|
|
|
- return ossUrl;
|
|
|
- } else {
|
|
|
- log.warn("图片上传返回空URL: {}", fileName);
|
|
|
- return null;
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("上传图片失败: {}", fileName, e);
|
|
|
- // 不抛出异常,返回 null,让其他图片继续上传
|
|
|
- return null;
|
|
|
- }
|
|
|
- }, taskExecutor)) // 使用线程池执行
|
|
|
- .collect(Collectors.toList());
|
|
|
-
|
|
|
- // 等待所有上传任务完成
|
|
|
- CompletableFuture<Void> allOf = CompletableFuture.allOf(
|
|
|
- uploadTasks.toArray(new CompletableFuture[0])
|
|
|
- );
|
|
|
+ public CompletableFuture<String> processImageFilesAsync(List<byte[]> imageBytesList, String licensePlate) {
|
|
|
+ List<String> resultList = new ArrayList<>();
|
|
|
+ for (byte[] imageBytes : imageBytesList) {
|
|
|
+ String ossUrl = null;
|
|
|
+ try {
|
|
|
+ // 将字节数组包装成MultipartFile进行上传
|
|
|
+ String filename = "image" + System.currentTimeMillis() + ".jpg";
|
|
|
+ MultipartFile multipartFile = new CustomMockMultipartFile(
|
|
|
+ filename,
|
|
|
+ filename,
|
|
|
+ "image/jpeg",
|
|
|
+ imageBytes
|
|
|
+ );
|
|
|
+ ossUrl = FileUtils.uploadFile(multipartFile);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("上传文件异常,车牌号: {}", licensePlate, e);
|
|
|
+ throw new IotException(ErrorCodeEnum.SYSTEM_ERROR, "上传文件异常");
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(ossUrl)) {
|
|
|
+ resultList.add(ossUrl);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return CompletableFuture.completedFuture(String.join(",", resultList));
|
|
|
+ }
|
|
|
|
|
|
- // 收集所有成功上传的 URL
|
|
|
- return allOf.thenApply(v -> {
|
|
|
- List<String> successUrls = uploadTasks.stream()
|
|
|
- .map(CompletableFuture::join) // 获取每个任务的结果
|
|
|
- .filter(StringUtils::isNotBlank) // 过滤掉失败的(null)
|
|
|
- .collect(Collectors.toList());
|
|
|
|
|
|
- long endTime = System.currentTimeMillis();
|
|
|
- log.info("图片并行上传完成 - 总数: {}, 成功: {}, 失败: {}, 耗时: {}ms",
|
|
|
- images.length,
|
|
|
- successUrls.size(),
|
|
|
- images.length - successUrls.size(),
|
|
|
- endTime - startTime);
|
|
|
|
|
|
- return String.join(",", successUrls);
|
|
|
- });
|
|
|
- }
|
|
|
/**
|
|
|
* 异步更新图片URL
|
|
|
*/
|
|
|
@@ -263,7 +252,7 @@ public class WeighbridgeRecordManage {
|
|
|
log.info("车牌验证失败");
|
|
|
response.setStatus(Boolean.FALSE);
|
|
|
response.setCode(400);
|
|
|
- response.setMessage("车牌验证异常,请重新识别或联系管理员");
|
|
|
+ response.setMessage("车牌验证异常");
|
|
|
|
|
|
response.setData(new LicensePlateValidateResponse.Data());
|
|
|
response.getData().setTimestamp(System.currentTimeMillis());
|