feature:1.新增获取APP上传的图片列表接口

This commit is contained in:
pve-win10 2025-06-06 09:38:05 +08:00
parent da92479da0
commit 824a1e8492
8 changed files with 196 additions and 10 deletions

View File

@ -0,0 +1,23 @@
package com.dite.znpt.domain.bo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import com.dite.znpt.domain.entity.PartEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class PartFullInfoBo extends PartEntity {
@ApiModelProperty("机组名称")
private String turbineName;
@ApiModelProperty("项目id")
private String projectId;
@ApiModelProperty("机组名称")
private String projectName;
}

View File

@ -0,0 +1,29 @@
package com.dite.znpt.domain.vo;
import com.dite.znpt.domain.entity.ImageEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class AppImageResp extends ImageEntity {
@ApiModelProperty("部件名称")
private String partName;
@ApiModelProperty("机组号")
private String turbineId;
@ApiModelProperty("机组名称")
private String turbineName;
@ApiModelProperty("项目id")
private String projectId;
@ApiModelProperty("机组名称")
private String projectName;
@ApiModelProperty("上传用户")
private String uploadUser;
}

View File

@ -28,4 +28,10 @@ public interface ImageService extends IService<ImageEntity> {
List<String> batchUploadCommonImage(String imageSource, ImageWorkReq imageWorkReq, MultipartFile[] file) throws IOException; List<String> batchUploadCommonImage(String imageSource, ImageWorkReq imageWorkReq, MultipartFile[] file) throws IOException;
void delete(String imageId); void delete(String imageId);
/**
* 分页列出APP上传的图片并关联查询机组信息
* @return {@link List }<{@link AppImageResp }>
*/
List<AppImageResp> listAppUploadImages();
} }

View File

@ -1,6 +1,7 @@
package com.dite.znpt.service; package com.dite.znpt.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.dite.znpt.domain.bo.PartFullInfoBo;
import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.domain.entity.PartEntity;
import com.dite.znpt.domain.vo.PartListReq; import com.dite.znpt.domain.vo.PartListReq;
import com.dite.znpt.domain.vo.PartListResp; import com.dite.znpt.domain.vo.PartListResp;
@ -82,5 +83,11 @@ public interface PartService extends IService<PartEntity> {
**/ **/
void deleteByTurbineIds(List<String> turbineIds); void deleteByTurbineIds(List<String> turbineIds);
/**
* 查询完整部件信息包含机组项目
* @param partIds
* @return {@link List }<{@link PartFullInfoBo }>
*/
List<PartFullInfoBo> listInfos(List<String> partIds);
} }

View File

@ -1,14 +1,18 @@
package com.dite.znpt.service.impl; package com.dite.znpt.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.PathUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dite.znpt.constant.Message; import com.dite.znpt.constant.Message;
import com.dite.znpt.domain.bo.PartFullInfoBo;
import com.dite.znpt.domain.entity.ImageEntity; import com.dite.znpt.domain.entity.ImageEntity;
import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.domain.entity.PartEntity;
import com.dite.znpt.domain.page.PageDomain;
import com.dite.znpt.domain.vo.*; import com.dite.znpt.domain.vo.*;
import com.dite.znpt.enums.ImageSourceEnum; import com.dite.znpt.enums.ImageSourceEnum;
import com.dite.znpt.enums.ImageTypeEnum; import com.dite.znpt.enums.ImageTypeEnum;
@ -31,13 +35,16 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.net.URI;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function; import java.util.function.Function;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -172,8 +179,7 @@ public class ImageServiceImpl extends ServiceImpl<ImageMapper, ImageEntity> impl
for (MultipartFile multipartFile : files) { for (MultipartFile multipartFile : files) {
String path = path_prefix + multipartFile.getOriginalFilename(); String path = path_prefix + multipartFile.getOriginalFilename();
FileUtil.writeBytes(multipartFile.getBytes(),path); FileUtil.writeBytes(multipartFile.getBytes(),path);
String url = FileUtil.FILE_SEPARATOR.concat("static").concat(FileUtil.FILE_SEPARATOR).concat("image").concat(StrUtil.SLASH).concat(StrUtil.removePrefix(path, permPath)); result.add(getImageDownPath(StrUtil.removePrefix(path, permPath)));
result.add(StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH));
} }
return result; return result;
} }
@ -203,8 +209,7 @@ public class ImageServiceImpl extends ServiceImpl<ImageMapper, ImageEntity> impl
req.setCameraManufacturer(obj.getStr("Make")); req.setCameraManufacturer(obj.getStr("Make"));
req.setCameraModel(obj.getStr("Model")); req.setCameraModel(obj.getStr("Model"));
req.setImageName(obj.getStr("File Name")); req.setImageName(obj.getStr("File Name"));
String url = FileUtil.FILE_SEPARATOR.concat("static").concat(FileUtil.FILE_SEPARATOR).concat("image").concat(FileUtil.FILE_SEPARATOR).concat("temp").concat(StrUtil.SLASH).concat(StrUtil.removePrefix(path, tempPath)); req.setImagePath(getTmpImageDownPath(StrUtil.removePrefix(path, tempPath)));
req.setImagePath(StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH));
BigDecimal imageSize = new BigDecimal(extractDigit(obj.getStr("File Size"))).divide(new BigDecimal(1024*1024), 4, RoundingMode.HALF_UP); BigDecimal imageSize = new BigDecimal(extractDigit(obj.getStr("File Size"))).divide(new BigDecimal(1024*1024), 4, RoundingMode.HALF_UP);
req.setImageSize(imageSize.toString().concat("M")); req.setImageSize(imageSize.toString().concat("M"));
req.setImageWidth(extractDigit(obj.getStr("Image Width"))); req.setImageWidth(extractDigit(obj.getStr("Image Width")));
@ -258,4 +263,92 @@ public class ImageServiceImpl extends ServiceImpl<ImageMapper, ImageEntity> impl
} }
} }
/**
* 功能描述获取图像下载路径
*
* @param relativePath
* @return {@link String }
* @author cuizhibin
* @date 2025/06/06 09:07
**/
public static String getImageDownPath(String relativePath) {
String url = StrUtil.SLASH.concat("static").concat(StrUtil.SLASH).concat("image").concat(StrUtil.SLASH).concat(relativePath);
return StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH);
}
/**
* 功能描述获取tmp图像下载路径
*
* @param relativePath
* @return {@link String }
* @author cuizhibin
* @date 2025/06/06 09:07
**/
public static String getTmpImageDownPath(String relativePath) {
String url = StrUtil.SLASH.concat("static").concat(StrUtil.SLASH).concat("image").concat(StrUtil.SLASH).concat("temp").concat(StrUtil.SLASH).concat(relativePath);
return StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH);
}
@Override
public List<AppImageResp> listAppUploadImages() {
List<String> filePaths = new ArrayList<>();
PathUtil.walkFiles(Path.of(permPath), new SimpleFileVisitor<>() {
@Override
public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) {
if (path.toFile().isFile()) {
String relativePath = StrUtil.removePrefix(path.toFile().getAbsolutePath(), permPath);
filePaths.add(getImageDownPath(relativePath));
}
return FileVisitResult.CONTINUE;
}
});
// 查询图片关联记录
List<ImageEntity> imageList = new ArrayList<>();
CollUtil.split(filePaths, 1000).forEach(paths -> {
imageList.addAll(lambdaQuery().in(ImageEntity::getImagePath, paths).list());
});
Map<String, ImageEntity> imageMap = imageList.stream()
.collect(Collectors.toMap(ImageEntity::getImagePath, Function.identity(), (a, b) -> a));
// 查询部件信息
Map<String, PartFullInfoBo> partInfoMap = new HashMap<>();
CollUtil.split(imageList, 1000).forEach(images -> {
List<String> partIds = images.stream().map(ImageEntity::getPartId).collect(Collectors.toList());
List<PartFullInfoBo> partList = partService.listInfos(partIds);
partInfoMap.putAll(partList.stream().collect(Collectors.toMap(PartFullInfoBo::getPartId, Function.identity())));
});
// 将信息写入返回实体
List<AppImageResp> respList = new ArrayList<>();
for (String filePath : filePaths) {
AppImageResp resp = new AppImageResp();
resp.setImagePath(filePath);
List<String> split = StrUtil.split(filePath, StrUtil.SLASH, true, true);
ImageEntity image = imageMap.get(filePath);
if (image != null) {
BeanUtil.copyProperties(image, resp);
PartFullInfoBo part = partInfoMap.get(image.getPartId());
if (part != null) {
resp.setPartId(part.getPartId());
resp.setPartName(part.getPartName());
resp.setTurbineId(part.getTurbineId());
resp.setTurbineName(part.getTurbineName());
resp.setProjectId(part.getProjectId());
resp.setProjectName(part.getProjectName());
}
} else {
List<String> gps = StrUtil.split(split.get(5), " ");
resp.setLongitude(gps.get(0));
resp.setLatitude(gps.get(1));
resp.setAltitude(gps.get(2));
}
resp.setUploadUser(split.get(4));
resp.setImageType(split.get(2));
respList.add(resp);
}
return respList;
}
} }

View File

@ -1,10 +1,12 @@
package com.dite.znpt.service.impl; package com.dite.znpt.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dite.znpt.constant.Message; import com.dite.znpt.constant.Message;
import com.dite.znpt.converts.Converts; import com.dite.znpt.converts.Converts;
import com.dite.znpt.domain.bo.PartFullInfoBo;
import com.dite.znpt.domain.entity.PartEntity; import com.dite.znpt.domain.entity.PartEntity;
import com.dite.znpt.domain.entity.ProjectEntity; import com.dite.znpt.domain.entity.ProjectEntity;
import com.dite.znpt.domain.entity.TurbineEntity; import com.dite.znpt.domain.entity.TurbineEntity;
@ -15,6 +17,7 @@ import com.dite.znpt.domain.vo.PartResp;
import com.dite.znpt.enums.PartTypeEnum; import com.dite.znpt.enums.PartTypeEnum;
import com.dite.znpt.exception.ServiceException; import com.dite.znpt.exception.ServiceException;
import com.dite.znpt.mapper.PartMapper; import com.dite.znpt.mapper.PartMapper;
import com.dite.znpt.mapper.TurbineMapper;
import com.dite.znpt.service.PartService; import com.dite.znpt.service.PartService;
import com.dite.znpt.service.ProjectService; import com.dite.znpt.service.ProjectService;
import com.dite.znpt.service.TurbineService; import com.dite.znpt.service.TurbineService;
@ -25,6 +28,9 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/** /**
* @author huise23 * @author huise23
@ -160,5 +166,19 @@ public class PartServiceImpl extends ServiceImpl<PartMapper, PartEntity> impleme
this.baseMapper.delete(Wrappers.<PartEntity>lambdaQuery().in(PartEntity::getTurbineId, turbineIds)); this.baseMapper.delete(Wrappers.<PartEntity>lambdaQuery().in(PartEntity::getTurbineId, turbineIds));
} }
@Override
public List<PartFullInfoBo> listInfos(List<String> partIds) {
List<PartEntity> list = lambdaQuery().in(PartEntity::getPartId, partIds).list();
List<TurbineEntity> turbineList = turbineService.lambdaQuery().in(TurbineEntity::getTurbineId, list.stream().map(PartEntity::getTurbineId).collect(Collectors.toList())).list();
Map<String, TurbineEntity> turbineMap = turbineList.stream().collect(Collectors.toMap(TurbineEntity::getTurbineId, Function.identity()));
Map<String, ProjectEntity> projectMap = projectService.lambdaQuery().in(ProjectEntity::getProjectId, turbineList.stream().map(TurbineEntity::getProjectId).collect(Collectors.toList())).list()
.stream().collect(Collectors.toMap(ProjectEntity::getProjectId, Function.identity()));
return BeanUtil.copyToList(list, PartFullInfoBo.class).stream().peek(partBo -> {
TurbineEntity turbineEntity = turbineMap.get(partBo.getTurbineId());
ProjectEntity projectEntity = projectMap.get(turbineEntity.getProjectId());
partBo.setTurbineName(turbineEntity.getTurbineName());
partBo.setProjectId(projectEntity.getProjectId());
partBo.setProjectName(projectEntity.getProjectName());
}).collect(Collectors.toList());
}
} }

View File

@ -2,6 +2,7 @@ package com.dite.znpt.web.controller;
import com.dite.znpt.constant.Message; import com.dite.znpt.constant.Message;
import com.dite.znpt.domain.Result; import com.dite.znpt.domain.Result;
import com.dite.znpt.domain.vo.AppImageResp;
import com.dite.znpt.domain.vo.ImageWorkReq; import com.dite.znpt.domain.vo.ImageWorkReq;
import com.dite.znpt.enums.*; import com.dite.znpt.enums.*;
import com.dite.znpt.exception.ServiceException; import com.dite.znpt.exception.ServiceException;
@ -14,6 +15,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.IOException; import java.io.IOException;
import java.util.List;
/** /**
* @Author: gaoxiong * @Author: gaoxiong
@ -141,6 +143,12 @@ public class CommonController {
return Result.ok(imageService.batchUploadCommonImage(imageSource, workReq, files)); return Result.ok(imageService.batchUploadCommonImage(imageSource, workReq, files));
} }
@ApiOperation(value = "获取APP上传的图片列表", httpMethod = "POST")
@GetMapping("/list/app-upload-images")
public Result<List<AppImageResp>> listAppUploadImages() throws IOException {
return Result.ok(imageService.listAppUploadImages());
}
@ApiOperation(value = "查询菜单类型", httpMethod = "GET") @ApiOperation(value = "查询菜单类型", httpMethod = "GET")
@GetMapping("/list/menu-type") @GetMapping("/list/menu-type")
public Result listMenuType(){ public Result listMenuType(){

View File

@ -39,7 +39,7 @@ public class DeptController {
return Result.ok(deptService.detail(deptId)); return Result.ok(deptService.detail(deptId));
} }
@ApiOperation(value = "新增部门信息", httpMethod = "Post") @ApiOperation(value = "新增部门信息", httpMethod = "POST")
@PostMapping @PostMapping
public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody DeptReq req) { public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody DeptReq req) {
deptService.save(req); deptService.save(req);