From 824a1e849210a5d1d2ea8eccfa006b906d4f5b5f Mon Sep 17 00:00:00 2001 From: pve-win10 Date: Fri, 6 Jun 2025 09:38:05 +0800 Subject: [PATCH] =?UTF-8?q?feature:1.=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96A?= =?UTF-8?q?PP=E4=B8=8A=E4=BC=A0=E7=9A=84=E5=9B=BE=E7=89=87=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/domain/bo/PartFullInfoBo.java | 23 ++++ .../com/dite/znpt/domain/vo/AppImageResp.java | 29 +++++ .../com/dite/znpt/service/ImageService.java | 6 + .../com/dite/znpt/service/PartService.java | 7 ++ .../znpt/service/impl/ImageServiceImpl.java | 109 ++++++++++++++++-- .../znpt/service/impl/PartServiceImpl.java | 22 +++- .../znpt/web/controller/CommonController.java | 8 ++ .../znpt/web/controller/DeptController.java | 2 +- 8 files changed, 196 insertions(+), 10 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/bo/PartFullInfoBo.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/AppImageResp.java diff --git a/core/src/main/java/com/dite/znpt/domain/bo/PartFullInfoBo.java b/core/src/main/java/com/dite/znpt/domain/bo/PartFullInfoBo.java new file mode 100644 index 0000000..e9c3103 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/bo/PartFullInfoBo.java @@ -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; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AppImageResp.java b/core/src/main/java/com/dite/znpt/domain/vo/AppImageResp.java new file mode 100644 index 0000000..83303cf --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/AppImageResp.java @@ -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; +} diff --git a/core/src/main/java/com/dite/znpt/service/ImageService.java b/core/src/main/java/com/dite/znpt/service/ImageService.java index 15d902b..49e594b 100644 --- a/core/src/main/java/com/dite/znpt/service/ImageService.java +++ b/core/src/main/java/com/dite/znpt/service/ImageService.java @@ -28,4 +28,10 @@ public interface ImageService extends IService { List batchUploadCommonImage(String imageSource, ImageWorkReq imageWorkReq, MultipartFile[] file) throws IOException; void delete(String imageId); + + /** + * 分页列出APP上传的图片,并关联查询机组信息 + * @return {@link List }<{@link AppImageResp }> + */ + List listAppUploadImages(); } diff --git a/core/src/main/java/com/dite/znpt/service/PartService.java b/core/src/main/java/com/dite/znpt/service/PartService.java index 1c7c4ed..1eba964 100644 --- a/core/src/main/java/com/dite/znpt/service/PartService.java +++ b/core/src/main/java/com/dite/znpt/service/PartService.java @@ -1,6 +1,7 @@ package com.dite.znpt.service; 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.vo.PartListReq; import com.dite.znpt.domain.vo.PartListResp; @@ -82,5 +83,11 @@ public interface PartService extends IService { **/ void deleteByTurbineIds(List turbineIds); + /** + * 查询完整部件信息,包含机组、项目 + * @param partIds + * @return {@link List }<{@link PartFullInfoBo }> + */ + List listInfos(List partIds); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 886c7de..1052508 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -1,14 +1,18 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.file.PathUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.PartEntity; +import com.dite.znpt.domain.page.PageDomain; import com.dite.znpt.domain.vo.*; import com.dite.znpt.enums.ImageSourceEnum; import com.dite.znpt.enums.ImageTypeEnum; @@ -31,13 +35,16 @@ import java.io.File; import java.io.IOException; import java.math.BigDecimal; 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.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -172,8 +179,7 @@ public class ImageServiceImpl extends ServiceImpl impl for (MultipartFile multipartFile : files) { String path = path_prefix + multipartFile.getOriginalFilename(); 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(StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH)); + result.add(getImageDownPath(StrUtil.removePrefix(path, permPath))); } return result; } @@ -203,8 +209,7 @@ public class ImageServiceImpl extends ServiceImpl impl req.setCameraManufacturer(obj.getStr("Make")); req.setCameraModel(obj.getStr("Model")); 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(StrUtil.replace(url, FileUtil.FILE_SEPARATOR, StrUtil.SLASH)); + req.setImagePath(getTmpImageDownPath(StrUtil.removePrefix(path, tempPath))); 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.setImageWidth(extractDigit(obj.getStr("Image Width"))); @@ -258,4 +263,92 @@ public class ImageServiceImpl extends ServiceImpl 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 listAppUploadImages() { + List 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 imageList = new ArrayList<>(); + CollUtil.split(filePaths, 1000).forEach(paths -> { + imageList.addAll(lambdaQuery().in(ImageEntity::getImagePath, paths).list()); + }); + Map imageMap = imageList.stream() + .collect(Collectors.toMap(ImageEntity::getImagePath, Function.identity(), (a, b) -> a)); + +// 查询部件信息 + Map partInfoMap = new HashMap<>(); + CollUtil.split(imageList, 1000).forEach(images -> { + List partIds = images.stream().map(ImageEntity::getPartId).collect(Collectors.toList()); + List partList = partService.listInfos(partIds); + partInfoMap.putAll(partList.stream().collect(Collectors.toMap(PartFullInfoBo::getPartId, Function.identity()))); + }); + +// 将信息写入返回实体 + List respList = new ArrayList<>(); + for (String filePath : filePaths) { + AppImageResp resp = new AppImageResp(); + resp.setImagePath(filePath); + + List 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 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; + } } diff --git a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java index b32ac99..f4df3a7 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java @@ -1,10 +1,12 @@ package com.dite.znpt.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; 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.ProjectEntity; 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.exception.ServiceException; import com.dite.znpt.mapper.PartMapper; +import com.dite.znpt.mapper.TurbineMapper; import com.dite.znpt.service.PartService; import com.dite.znpt.service.ProjectService; import com.dite.znpt.service.TurbineService; @@ -25,6 +28,9 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @author huise23 @@ -160,5 +166,19 @@ public class PartServiceImpl extends ServiceImpl impleme this.baseMapper.delete(Wrappers.lambdaQuery().in(PartEntity::getTurbineId, turbineIds)); } - + @Override + public List listInfos(List partIds) { + List list = lambdaQuery().in(PartEntity::getPartId, partIds).list(); + List turbineList = turbineService.lambdaQuery().in(TurbineEntity::getTurbineId, list.stream().map(PartEntity::getTurbineId).collect(Collectors.toList())).list(); + Map turbineMap = turbineList.stream().collect(Collectors.toMap(TurbineEntity::getTurbineId, Function.identity())); + Map 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()); + } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index 0405b14..b206679 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -2,6 +2,7 @@ package com.dite.znpt.web.controller; import com.dite.znpt.constant.Message; import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.AppImageResp; import com.dite.znpt.domain.vo.ImageWorkReq; import com.dite.znpt.enums.*; import com.dite.znpt.exception.ServiceException; @@ -14,6 +15,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.IOException; +import java.util.List; /** * @Author: gaoxiong @@ -141,6 +143,12 @@ public class CommonController { return Result.ok(imageService.batchUploadCommonImage(imageSource, workReq, files)); } + @ApiOperation(value = "获取APP上传的图片列表", httpMethod = "POST") + @GetMapping("/list/app-upload-images") + public Result> listAppUploadImages() throws IOException { + return Result.ok(imageService.listAppUploadImages()); + } + @ApiOperation(value = "查询菜单类型", httpMethod = "GET") @GetMapping("/list/menu-type") public Result listMenuType(){ diff --git a/web/src/main/java/com/dite/znpt/web/controller/DeptController.java b/web/src/main/java/com/dite/znpt/web/controller/DeptController.java index 1e63893..64bad82 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/DeptController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/DeptController.java @@ -39,7 +39,7 @@ public class DeptController { return Result.ok(deptService.detail(deptId)); } - @ApiOperation(value = "新增部门信息", httpMethod = "Post") + @ApiOperation(value = "新增部门信息", httpMethod = "POST") @PostMapping public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody DeptReq req) { deptService.save(req);