From 2a4ac18052601cb38b49479fa895c96690a37095 Mon Sep 17 00:00:00 2001 From: ybb <2532447764@qq.com> Date: Thu, 7 Aug 2025 09:50:34 +0800 Subject: [PATCH 01/15] =?UTF-8?q?8/7,ybb=E6=96=87=E4=BB=B6=E5=A4=B9?= =?UTF-8?q?=E5=92=8C=E6=96=87=E4=BB=B6=E9=83=BD=E5=AE=9E=E7=8E=B0=E4=BA=86?= =?UTF-8?q?=E8=AE=B0=E5=BD=95Id=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/entity/BusinessDataEntity.java | 2 +- .../domain/entity/BusinessDataFileEntity.java | 2 +- .../impl/BusinessDataFileServiceImpl.java | 4 +- .../service/impl/BusinessDataServiceImpl.java | 130 ++++++++---------- .../BusinessDataFileController.java | 9 +- web/src/main/resources/application-dev.yml | 1 - 6 files changed, 66 insertions(+), 82 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataEntity.java index 4b88a8e..c769f0a 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataEntity.java @@ -25,7 +25,7 @@ public class BusinessDataEntity { // 父级文件夹 private Long parentId = null; // 创建人 - private Long creatorId = null; + private String creatorId = null; // 创建时间 private LocalDateTime createTime = null; // 更新时间 diff --git a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java index c9c589d..9fc787f 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java @@ -30,7 +30,7 @@ public class BusinessDataFileEntity { //上传时间 private Date uploadTime = null; //上传人id - private Long uploaderId = null; + private String uploaderId = null; //是否删除 private Boolean isDeleted = false; diff --git a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java index c138abf..b02db41 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java @@ -43,9 +43,7 @@ public class BusinessDataFileServiceImpl implements BusinessDataFileService { //删除数据库数据 if (folderId != null){ businessDataFileMapper.delete(null,folderId); - System.out.println("888888888走对了"); - - return Result.okM("删除,走对了,成功"); + return Result.okM("删除成功"); } //删除文件 diff --git a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataServiceImpl.java index e5b60ce..2f17a2b 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataServiceImpl.java @@ -1,5 +1,6 @@ package com.dite.znpt.service.impl; +import cn.dev33.satoken.stp.StpUtil; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.entity.BusinessDataEntity; import com.dite.znpt.domain.page.PageBean; @@ -54,12 +55,13 @@ public class BusinessDataServiceImpl implements BusinessDataService { @ApiOperation(value = "创建文件夹") @Override public Result createFolder(String folderName, Long parentId) { - //获取ID - Long loginIdAsLong = 888L; -// loginIdAsLong = StpUtil.getLoginIdAsLong(); -// + // 获取ID + String loginIdAsLong = "未登录用户"; + if(StpUtil.isLogin()){ + loginIdAsLong = StpUtil.getLoginIdAsString(); + } // 文件夹名称不能为空 - //TODO: 添加文件夹名称校验,后续最好更规范些,写个工具类专门校验,用正则表达式 + // TODO: 添加文件夹名称校验,后续最好更规范些,写个工具类专门校验,用正则表达式 if (folderName == null || folderName.trim().isEmpty()) { return Result.error("文件夹名称不能为空"); } @@ -70,10 +72,19 @@ public class BusinessDataServiceImpl implements BusinessDataService { // 文件夹名称前置一个/ String folderName1 = "/" + folderName; // 目标文件夹 - File targetDir=Paths.get(businessDataPath, folderName1).toFile(); - if(parentId != 0L){ + File targetDir = Paths.get(businessDataPath, folderName1).toFile(); + if (parentId != 0L) { // 获取父文件夹路径 targetDir = Paths.get(businessDataMapper.getPath(parentId), folderName1).toFile(); + } else { + // 如果是根目录,检查默认路径是否存在,不存在则创建 + File defaultPathDir = new File(businessDataPath); + if (!defaultPathDir.exists()) { + boolean created = defaultPathDir.mkdirs(); + if (!created) { + return Result.error("默认路径创建失败: " + businessDataPath); + } + } } // 创建文件夹和新增文件夹路径 if (!targetDir.exists()) { @@ -82,7 +93,7 @@ public class BusinessDataServiceImpl implements BusinessDataService { if (!created) { throw new RuntimeException("文件夹创建失败: " + targetDir.getAbsolutePath()); } - //上面是新增文件夹功能,但没有往数据库插入文件夹相关数据,所以下面新增 + // 上面是新增文件夹功能,但没有往数据库插入文件夹相关数据,所以下面新增 // 创建BusinessDataEntity对象并设置属性 BusinessDataEntity businessDataEntity = new BusinessDataEntity( null, @@ -92,11 +103,10 @@ public class BusinessDataServiceImpl implements BusinessDataService { LocalDateTime.now(), LocalDateTime.now(), false, - targetDir.getAbsolutePath() - ); + targetDir.getAbsolutePath()); // 插入到数据库 businessDataMapper.insert(businessDataEntity); - return Result.okM( "文件夹创建成功"); + return Result.okM("文件夹创建成功"); } else { return Result.error("文件夹已存在: "); } @@ -107,75 +117,50 @@ public class BusinessDataServiceImpl implements BusinessDataService { return businessDataMapper.getPath(parentId); } -// @ApiOperation("删除文件夹") -// @Override -// public Result delete(Long folderId) { -// // 获取文件夹路径 -// String folderPath = businessDataMapper.getPath(folderId); -// -// // 创建File对象并删除文件夹 -// File folder = new File(folderPath); -// if (folder.exists()) { -// boolean deleted = folder.delete(); -// if (!deleted) { -// // throw new RuntimeException("文件夹删除失败: " + folderPath); -// // TODO: 以后可以用全局异常处理器捕获,或者用try catch捕获 -// return Result.error("文件夹删除失败: " + folderPath); -// } -// //删除数据库中文件夹的数据 -// businessDataMapper.delete(folderId); -// //删除文件夹下文件的数据 -// businessDataFileService.delete(folderId); -// return Result.okM("删除成功"); -// } else { -// // throw new RuntimeException("文件夹不存在: " + folderPath); -// return Result.error("文件夹不存在: " + folderPath); -// } -// } - @ApiOperation("删除文件夹") - @Override - public Result delete(Long folderId) { - // 获取文件夹路径 - String folderPath = businessDataMapper.getPath(folderId); + @ApiOperation("删除文件夹") + @Override + public Result delete(Long folderId) { + // 获取文件夹路径 + String folderPath = businessDataMapper.getPath(folderId); - // 创建Path对象并删除文件夹 - Path folder = Paths.get(folderPath); - if (Files.exists(folder)) { - try { - // 使用Files.walk获取所有文件和目录,按深度排序后删除 - java.util.stream.Stream filePaths = Files.walk(folder); - filePaths.sorted(Comparator.reverseOrder()) - .map(Path::toFile) - .forEach(File::delete); - filePaths.close(); + // 创建Path对象并删除文件夹 + Path folder = Paths.get(folderPath); + if (Files.exists(folder)) { + try { + // 使用Files.walk获取所有文件和目录,按深度排序后删除 + java.util.stream.Stream filePaths = Files.walk(folder); + filePaths.sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + filePaths.close(); - //删除数据库中文件夹的数据 - businessDataMapper.delete(folderId); - //删除文件夹下文件的数据 - businessDataFileService.delete(null , folderId); - return Result.okM("删除成功"); - } catch (Exception e) { - return Result.okM("删除成功"); - } - } else { - return Result.error("文件夹不存在: " + folderPath); + // 删除数据库中文件夹的数据 + businessDataMapper.delete(folderId); + // 删除文件夹下文件的数据 + businessDataFileService.delete(null, folderId); + return Result.okM("删除成功"); + } catch (Exception e) { + return Result.okM("删除成功"); } + } else { + return Result.error("文件夹不存在: " + folderPath); } + } + @ApiOperation("重命名文件夹") @Override public Result reName(Long folderId, String newName) { // 获取文件夹路径 String folderPath = businessDataMapper.getPath(folderId); - String newPath = folderPath.substring(0, folderPath.lastIndexOf('\\'))+"\\" + newName; - System.out.printf("7777777"+newPath); -// -// //想命名的原文件的路径 -// File file = new File("f:/a/a.xlsx"); -// //将原文件更改为f:\a\b.xlsx,其中路径是必要的。注意 -// file.renameTo(new File("f:/a/b.xlsx")); - //想命名的原文件夹的路径 + String newPath = folderPath.substring(0, folderPath.lastIndexOf('\\')) + "\\" + newName; + // + // //想命名的原文件的路径 + // File file = new File("f:/a/a.xlsx"); + // //将原文件更改为f:\a\b.xlsx,其中路径是必要的。注意 + // file.renameTo(new File("f:/a/b.xlsx")); + // 想命名的原文件夹的路径 File file1 = new File(folderPath); - //将原文件夹更改为A,其中路径是必要的。注意 + // 将原文件夹更改为A,其中路径是必要的。注意 file1.renameTo(new File(newPath)); LocalDateTime now = LocalDateTime.now(); @@ -187,11 +172,8 @@ public class BusinessDataServiceImpl implements BusinessDataService { null, now, null, - newPath - ); - System.out.println(businessDataEntity); + newPath); businessDataMapper.reName(businessDataEntity); return Result.okM("重命名成功"); } - } diff --git a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java index 6e1acb4..580e0b8 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java @@ -1,5 +1,6 @@ package com.dite.znpt.web.controller; +import cn.dev33.satoken.stp.StpUtil; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.entity.BusinessDataFileEntity; import com.dite.znpt.domain.page.PageBean; @@ -53,6 +54,10 @@ public class BusinessDataFileController { @PostMapping("/add") public Result add(@RequestParam("file") MultipartFile file, @RequestParam Long folderId) { + String loginIdAsLong = "未登录用户"; + if(StpUtil.isLogin()){ + loginIdAsLong = StpUtil.getLoginIdAsString(); + } if (file.isEmpty()) { return Result.error("上传文件为空"); @@ -75,9 +80,9 @@ public class BusinessDataFileController { fileEntity.setFileName(file.getOriginalFilename()); fileEntity.setFilePath(uploadDir + "\\" + file.getOriginalFilename()); fileEntity.setFileType(file.getContentType()); - fileEntity.setFileSize(file.getSize()); + fileEntity.setFileSize(file.getSize()/1024); fileEntity.setUploadTime(new Date()); - fileEntity.setUploaderId(0L); + fileEntity.setUploaderId(loginIdAsLong); System.out.println(uploadDir + "\\" + file.getOriginalFilename()); businessDataFileService.add(fileEntity); diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index cba9a5f..f9bda52 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -1,7 +1,6 @@ # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 - port: 8888 # 数据源配置 -- 2.34.1 From 50659ef1a716d7f5c352e32d4a18bcf2bf67cc0d Mon Sep 17 00:00:00 2001 From: ybb <2532447764@qq.com> Date: Thu, 7 Aug 2025 11:26:02 +0800 Subject: [PATCH 02/15] =?UTF-8?q?8/7,ybb=E6=96=87=E4=BB=B6=E5=A4=B9?= =?UTF-8?q?=E5=92=8C=E6=96=87=E4=BB=B6=E9=83=BD=E5=AE=9E=E7=8E=B0=E4=BA=86?= =?UTF-8?q?=E8=AE=B0=E5=BD=95Id=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/service/BusinessDataFileService.java | 12 +++ .../znpt/service/BusinessDataService.java | 3 + .../impl/BusinessDataFileServiceImpl.java | 85 ++++++++++++++++++- .../BusinessDataFileController.java | 73 +--------------- 4 files changed, 102 insertions(+), 71 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java b/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java index 031a4c3..a5d995d 100644 --- a/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java +++ b/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java @@ -6,6 +6,7 @@ import com.dite.znpt.domain.page.PageBean; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; @@ -13,17 +14,28 @@ import javax.servlet.http.HttpServletResponse; @Service public interface BusinessDataFileService { + @ApiOperation("分页查询文件") PageBean pageSelect(Integer page, Integer pageSize, Long folderId, String fileName); + @ApiOperation("删除文件") Result delete(@RequestParam(value = "fileId", required = false) Long fileId,@RequestParam(value = "foldelId", required = false) Long folderId); + @ApiOperation("增加数据库文件信息") void add(BusinessDataFileEntity businessDataFileEntity); + @ApiOperation("获取文件路径") String getPath(Long fileId); + @ApiOperation("删除文件") // 在接口中添加重命名方法 Result reName(Long fileId, String newFileName); + @ApiOperation("下载文件") + void upload(Long fileId, HttpServletResponse response); + + @ApiOperation("上传文件") + Result addfile(MultipartFile file, Long folderId); + // 在接口中添加预览方法 // Result preview(Long fileId, HttpServletResponse response); } diff --git a/core/src/main/java/com/dite/znpt/service/BusinessDataService.java b/core/src/main/java/com/dite/znpt/service/BusinessDataService.java index 0aa585d..f4a826c 100644 --- a/core/src/main/java/com/dite/znpt/service/BusinessDataService.java +++ b/core/src/main/java/com/dite/znpt/service/BusinessDataService.java @@ -4,6 +4,8 @@ import com.dite.znpt.domain.Result; import com.dite.znpt.domain.page.PageBean; import io.swagger.annotations.ApiOperation; +import javax.servlet.http.HttpServletResponse; + @ApiOperation("商务资料文件夹service") public interface BusinessDataService { @@ -12,4 +14,5 @@ public interface BusinessDataService { String getPath(Long parentId); Result delete(Long folderId); Result reName(Long folderId, String newName); + } diff --git a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java index b02db41..95b343c 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java @@ -2,20 +2,26 @@ package com.dite.znpt.service.impl; +import cn.dev33.satoken.stp.StpUtil; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.entity.BusinessDataFileEntity; import com.dite.znpt.domain.page.PageBean; import com.dite.znpt.mapper.BusinessDataFileMapper; +import com.dite.znpt.mapper.BusinessDataMapper; import com.dite.znpt.service.BusinessDataFileService; +import com.dite.znpt.service.BusinessDataService; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import java.io.File; -import java.io.IOException; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Date; import java.util.List; import static jodd.io.FileUtil.deleteFile; @@ -27,6 +33,8 @@ import static org.apache.tomcat.util.http.fileupload.FileUtils.deleteDirectory; public class BusinessDataFileServiceImpl implements BusinessDataFileService { @Resource private BusinessDataFileMapper businessDataFileMapper; + @Resource + private BusinessDataService businessDataService; @ApiOperation("分页查询文件") @@ -156,6 +164,79 @@ public class BusinessDataFileServiceImpl implements BusinessDataFileService { } } + @ApiOperation("下载文件") + @Override + public void upload(Long fileId, HttpServletResponse response) { + String path = getPath(fileId); + try { + // path是指想要下载的文件的路径 + File file = new File(path); + // 获取文件名 + String filename = file.getName(); + // 获取文件后缀名 + String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase(); + // 将文件写入输入流 + FileInputStream fileInputStream = new FileInputStream(file); + InputStream fis = new BufferedInputStream(fileInputStream); + byte[] buffer = new byte[fis.available()]; + fis.read(buffer); + fis.close(); + // 清空response + response.reset(); + // 设置response的Header + response.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); + // 告知浏览器文件的大小 + response.addHeader("Content-Length", "" + file.length()); + OutputStream outputStream = new BufferedOutputStream(response.getOutputStream()); + response.setContentType("application/octet-stream"); + outputStream.write(buffer); + outputStream.flush(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + @ApiOperation("上传文件") + @Override + public Result addfile(MultipartFile file, Long folderId) { + String loginIdAsLong = "未登录用户"; + if(StpUtil.isLogin()){ + loginIdAsLong = StpUtil.getLoginIdAsString(); + } + + if (file.isEmpty()) { + return Result.error("上传文件为空"); + } + // TODO 以后可以优化,就算文件名一样,加个(1),(2)这种 + + try { + byte[] bytes = file.getBytes(); + String uploadDir = businessDataService.getPath(folderId); + + File uploadedFile = new File(uploadDir + "\\" + file.getOriginalFilename()); + if (uploadedFile.exists()) { + return Result.error("文件已存在"); + } + file.transferTo(uploadedFile); + + // 保存文件信息到数据 + BusinessDataFileEntity fileEntity = new BusinessDataFileEntity(); + fileEntity.setFolderId(folderId); + fileEntity.setFileName(file.getOriginalFilename()); + fileEntity.setFilePath(uploadDir + "\\" + file.getOriginalFilename()); + fileEntity.setFileType(file.getContentType()); + fileEntity.setFileSize(file.getSize()/1024); + fileEntity.setUploadTime(new Date()); + fileEntity.setUploaderId(loginIdAsLong); + System.out.println(uploadDir + "\\" + file.getOriginalFilename()); + add(fileEntity); + + return Result.okM("上传成功"); + } catch (IOException e) { + e.printStackTrace(); + return Result.error("上传失败"); + } + } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java index 580e0b8..eb647e7 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java @@ -6,8 +6,10 @@ import com.dite.znpt.domain.entity.BusinessDataFileEntity; import com.dite.znpt.domain.page.PageBean; import com.dite.znpt.mapper.BusinessDataFileMapper; import com.dite.znpt.mapper.BusinessDataMapper; + import com.dite.znpt.service.BusinessDataFileService; import com.dite.znpt.service.BusinessDataService; +import com.dite.znpt.service.impl.BusinessDataFileServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -54,43 +56,7 @@ public class BusinessDataFileController { @PostMapping("/add") public Result add(@RequestParam("file") MultipartFile file, @RequestParam Long folderId) { - String loginIdAsLong = "未登录用户"; - if(StpUtil.isLogin()){ - loginIdAsLong = StpUtil.getLoginIdAsString(); - } - - if (file.isEmpty()) { - return Result.error("上传文件为空"); - } - // TODO 以后可以优化,就算文件名一样,加个(1),(2)这种 - - try { - byte[] bytes = file.getBytes(); - String uploadDir = businessDataService.getPath(folderId); - - File uploadedFile = new File(uploadDir + "\\" + file.getOriginalFilename()); - if (uploadedFile.exists()) { - return Result.error("文件已存在"); - } - file.transferTo(uploadedFile); - - // 保存文件信息到数据 - BusinessDataFileEntity fileEntity = new BusinessDataFileEntity(); - fileEntity.setFolderId(folderId); - fileEntity.setFileName(file.getOriginalFilename()); - fileEntity.setFilePath(uploadDir + "\\" + file.getOriginalFilename()); - fileEntity.setFileType(file.getContentType()); - fileEntity.setFileSize(file.getSize()/1024); - fileEntity.setUploadTime(new Date()); - fileEntity.setUploaderId(loginIdAsLong); - System.out.println(uploadDir + "\\" + file.getOriginalFilename()); - businessDataFileService.add(fileEntity); - - return Result.okM("上传成功"); - } catch (IOException e) { - e.printStackTrace(); - return Result.error("上传失败"); - } + return businessDataFileService.addfile(file, folderId); } @ApiOperation(value = "删除文件") @@ -103,38 +69,7 @@ public class BusinessDataFileController { @ApiOperation(value = "下载文件") @GetMapping("/download") public void download(@RequestParam("fileId") Long fileId, HttpServletResponse response) { - String path = businessDataFileService.getPath(fileId); - try { - // path是指想要下载的文件的路径 - File file = new File(path); - log.info(file.getPath()); - // 获取文件名 - String filename = file.getName(); - // 获取文件后缀名 - String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase(); - log.info("文件后缀名:" + ext); - - // 将文件写入输入流 - FileInputStream fileInputStream = new FileInputStream(file); - InputStream fis = new BufferedInputStream(fileInputStream); - byte[] buffer = new byte[fis.available()]; - fis.read(buffer); - fis.close(); - - // 清空response - response.reset(); - // 设置response的Header - response.setCharacterEncoding("UTF-8"); - response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); - // 告知浏览器文件的大小 - response.addHeader("Content-Length", "" + file.length()); - OutputStream outputStream = new BufferedOutputStream(response.getOutputStream()); - response.setContentType("application/octet-stream"); - outputStream.write(buffer); - outputStream.flush(); - } catch (IOException ex) { - ex.printStackTrace(); - } + businessDataFileService.upload(fileId, response); } @ApiOperation(value = "重命名文件", httpMethod = "PUT") -- 2.34.1 From c6d44f17873d10ed80efe6583feb775f3181a271 Mon Sep 17 00:00:00 2001 From: "Mr.j" <2221464500@qq.com> Date: Thu, 7 Aug 2025 08:37:30 +0800 Subject: [PATCH 03/15] =?UTF-8?q?=E5=BF=BD=E7=95=A5=E6=8F=90=E4=BA=A4pom.x?= =?UTF-8?q?ml=EF=BC=8Cyaml=E6=96=87=E4=BB=B6=EF=BC=8C=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E9=87=87=E8=B4=AD=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=92=8C=E7=BC=96=E8=BE=91=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 8 +++++++- .../com/dite/znpt/domain/vo/EquipmentResp.java | 17 ++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 5c11c82..fa488e5 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,10 @@ build/ ### VS Code ### .vscode/ target/ -logs/ \ No newline at end of file +logs/ + +### Maven ### +pom.xml + +### YAML ### +*.yaml diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java index 4aac551..d936b01 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -29,7 +30,7 @@ public class EquipmentResp implements Serializable { @ApiModelProperty("设备名称") private String equipmentName; - @ApiModelProperty("设备类型") + @ApiModelProperty("类型") private String equipmentType; @ApiModelProperty("设备类型描述") @@ -75,21 +76,27 @@ public class EquipmentResp implements Serializable { private String healthStatusLabel; @ApiModelProperty("采购时间") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime purchaseTime; @ApiModelProperty("入库时间") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime inStockTime; @ApiModelProperty("启用时间") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime activationTime; @ApiModelProperty("预计报废时间") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime expectedScrapTime; @ApiModelProperty("实际报废时间") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime actualScrapTime; @ApiModelProperty("状态变更时间") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime statusChangeTime; @ApiModelProperty("采购订单") @@ -115,12 +122,15 @@ public class EquipmentResp implements Serializable { private BigDecimal salvageValue; @ApiModelProperty("保修截止日期") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime warrantyExpireDate; @ApiModelProperty("上次维护日期") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime lastMaintenanceDate; @ApiModelProperty("下次维护日期") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime nextMaintenanceDate; @ApiModelProperty("维护人员") @@ -168,12 +178,15 @@ public class EquipmentResp implements Serializable { private String usingDepartment; @ApiModelProperty("领用时间") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime borrowingTime; @ApiModelProperty("归还时间") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime returnTime; @ApiModelProperty("出库时间") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime outStockTime; @ApiModelProperty("总使用时间") @@ -234,8 +247,10 @@ public class EquipmentResp implements Serializable { private String name; @ApiModelProperty("创建时间") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime createTime; @ApiModelProperty("更新时间") + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime updateTime; } -- 2.34.1 From e356368b62def8e7434e4b7b8acfccc74e2349b6 Mon Sep 17 00:00:00 2001 From: ybb <2532447764@qq.com> Date: Thu, 7 Aug 2025 16:06:15 +0800 Subject: [PATCH 04/15] =?UTF-8?q?8/7,ybb=E6=96=87=E4=BB=B6=E5=A4=B9?= =?UTF-8?q?=E5=92=8C=E6=96=87=E4=BB=B6=E9=83=BD=E5=AE=9E=E7=8E=B0=E4=BA=86?= =?UTF-8?q?=E8=AE=B0=E5=BD=95Id=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/pom.xml | 7 + .../domain/entity/BusinessDataFileEntity.java | 2 + .../znpt/mapper/BusinessDataFileMapper.java | 4 + .../dite/znpt/mapper/BusinessDataMapper.java | 5 +- .../znpt/service/BusinessDataFileService.java | 4 +- .../impl/BusinessDataFileServiceImpl.java | 246 +++++++++++++++++- .../BusinessDataFileController.java | 7 + web/src/main/resources/application.yml | 6 +- 8 files changed, 271 insertions(+), 10 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 94afd03..599d2b6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -161,6 +161,13 @@ opencv 4.7.0-0 + + + + commons-io + commons-io + 2.11.0 + diff --git a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java index 9fc787f..8daf3cf 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java @@ -33,5 +33,7 @@ public class BusinessDataFileEntity { private String uploaderId = null; //是否删除 private Boolean isDeleted = false; +// //有效日期 +// private Date validDate = null; } diff --git a/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java b/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java index 0420931..73e7191 100644 --- a/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java @@ -11,6 +11,10 @@ import java.util.List; @ApiOperation("商务资料文件对象") public interface BusinessDataFileMapper { + + // 新增文件预览方法 + + public List List(@Param("folderId") Long folderId, @Param("fileName") String fileName); void delete(@Param("fileId") Long fileId,@Param("folderId") Long folderId); diff --git a/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java b/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java index 9d1d686..b7e4bae 100644 --- a/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java @@ -4,9 +4,9 @@ import com.baomidou.mybatisplus.core.injector.methods.SelectList; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.BusinessDataEntity; import io.swagger.annotations.ApiOperation; +import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; -import com.dite.znpt.domain.entity.BusinessDataEntity; import java.time.LocalDateTime; import java.util.List; @@ -16,7 +16,8 @@ import java.util.List; @ApiOperation("商务资料文件夹对象") -public interface BusinessDataMapper { +@Mapper +public interface BusinessDataMapper { public String getPath(Long parentId); public List List(); diff --git a/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java b/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java index a5d995d..7cb636f 100644 --- a/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java +++ b/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java @@ -36,6 +36,6 @@ public interface BusinessDataFileService { @ApiOperation("上传文件") Result addfile(MultipartFile file, Long folderId); - // 在接口中添加预览方法 -// Result preview(Long fileId, HttpServletResponse response); + @ApiOperation("预览文件") + Result preview(Long fileId, HttpServletResponse response); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java index 95b343c..cda9ef8 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java @@ -1,7 +1,22 @@ package com.dite.znpt.service.impl; - +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import org.springframework.util.MimeTypeUtils; +import org.springframework.http.MediaType; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import java.util.Base64; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +// import cn.dev33.satoken.stp.StpUtil; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.entity.BusinessDataFileEntity; @@ -82,8 +97,6 @@ public class BusinessDataFileServiceImpl implements BusinessDataFileService { return Result.okM("删除成功"); } } - - } @ApiOperation("增加文件") @@ -239,4 +252,231 @@ public class BusinessDataFileServiceImpl implements BusinessDataFileService { return Result.error("上传失败"); } } + + + @ApiOperation("文件预览") + public Result preview(Long fileId, HttpServletResponse response) { + try { + // 获取文件路径 + String filePath = businessDataFileMapper.getPath(fileId); + if (filePath == null || filePath.isEmpty()) { + return Result.error("文件不存在"); + } + + File file = new File(filePath); + if (!file.exists()) { + return Result.error("文件不存在"); + } + + // 获取文件扩展名 + String extension = getFileExtension(filePath); + + // 根据文件类型处理预览 + switch (extension) { + case "pdf": + return previewPdf(file, response); + case "jpg": + case "jpeg": + case "png": + case "gif": + case "bmp": + case "webp": + return previewImage(file, response); + case "txt": + case "md": + case "log": + return previewText(file, response); + case "doc": + case "docx": + case "xls": + case "xlsx": + case "ppt": + case "pptx": + return previewOffice(file, response); + case "mp4": + case "avi": + case "mov": + case "wmv": + case "flv": + return previewVideo(file, response); + case "mp3": + case "wav": + case "flac": + case "aac": + return previewAudio(file, response); + default: + return Result.error("暂不支持该文件类型的预览"); + } + } catch (Exception e) { + return Result.error("文件预览失败: " + e.getMessage()); + } + } + + private String getFileExtension(String fileName) { + if (fileName == null || fileName.isEmpty()) { + return ""; + } + int lastDotIndex = fileName.lastIndexOf('.'); + if (lastDotIndex == -1) { + return ""; + } + return fileName.substring(lastDotIndex + 1).toLowerCase(); + } + + private Result previewPdf(File file, HttpServletResponse response) { + try { + response.setContentType("application/pdf"); + response.setHeader("Content-Disposition", "inline; filename=" + file.getName()); + + try (FileInputStream fis = new FileInputStream(file); + OutputStream os = response.getOutputStream()) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } + return Result.ok("PDF预览成功"); + } catch (Exception e) { + return Result.error("PDF预览失败: " + e.getMessage()); + } + } + + private Result previewImage(File file, HttpServletResponse response) { + try { + String contentType = getImageContentType(file.getName()); + response.setContentType(contentType); + response.setHeader("Content-Disposition", "inline; filename=" + file.getName()); + + try (FileInputStream fis = new FileInputStream(file); + OutputStream os = response.getOutputStream()) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } + return Result.ok("图片预览成功"); + } catch (Exception e) { + return Result.error("图片预览失败: " + e.getMessage()); + } + } + + private Result previewText(File file, HttpServletResponse response) { + try { + response.setContentType("text/plain; charset=UTF-8"); + response.setHeader("Content-Disposition", "inline; filename=" + file.getName()); + + try (FileInputStream fis = new FileInputStream(file); + OutputStream os = response.getOutputStream()) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } + return Result.ok("文本预览成功"); + } catch (Exception e) { + return Result.error("文本预览失败: " + e.getMessage()); + } + } + + private Result previewOffice(File file, HttpServletResponse response) { + // Office文件预览比较复杂,这里返回提示信息 + return Result.error("Office文件预览功能暂未实现,请下载后查看"); + } + + private Result previewVideo(File file, HttpServletResponse response) { + try { + String contentType = getVideoContentType(file.getName()); + response.setContentType(contentType); + response.setHeader("Content-Disposition", "inline; filename=" + file.getName()); + + try (FileInputStream fis = new FileInputStream(file); + OutputStream os = response.getOutputStream()) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } + return Result.ok("视频预览成功"); + } catch (Exception e) { + return Result.error("视频预览失败: " + e.getMessage()); + } + } + + private Result previewAudio(File file, HttpServletResponse response) { + try { + String contentType = getAudioContentType(file.getName()); + response.setContentType(contentType); + response.setHeader("Content-Disposition", "inline; filename=" + file.getName()); + + try (FileInputStream fis = new FileInputStream(file); + OutputStream os = response.getOutputStream()) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } + return Result.ok("音频预览成功"); + } catch (Exception e) { + return Result.error("音频预览失败: " + e.getMessage()); + } + } + + private String getImageContentType(String fileName) { + String extension = getFileExtension(fileName); + switch (extension) { + case "jpg": + case "jpeg": + return "image/jpeg"; + case "png": + return "image/png"; + case "gif": + return "image/gif"; + case "bmp": + return "image/bmp"; + case "webp": + return "image/webp"; + default: + return "application/octet-stream"; + } + } + + private String getVideoContentType(String fileName) { + String extension = getFileExtension(fileName); + switch (extension) { + case "mp4": + return "video/mp4"; + case "avi": + return "video/x-msvideo"; + case "mov": + return "video/quicktime"; + case "wmv": + return "video/x-ms-wmv"; + case "flv": + return "video/x-flv"; + default: + return "application/octet-stream"; + } + } + + private String getAudioContentType(String fileName) { + String extension = getFileExtension(fileName); + switch (extension) { + case "mp3": + return "audio/mpeg"; + case "wav": + return "audio/wav"; + case "flac": + return "audio/flac"; + case "aac": + return "audio/aac"; + default: + return "application/octet-stream"; + } + } + } diff --git a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java index eb647e7..f42b8fa 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java @@ -27,6 +27,7 @@ import org.springframework.web.multipart.MultipartFile; /* * @Description: 商务资料管理,文件夹层 + * 袁彬彬写的,其他人合并的时候,不允许改我的部分。 */ @Api(tags = "文件接口") @@ -78,4 +79,10 @@ public class BusinessDataFileController { return businessDataFileService.reName(fileId, newFileName); } + @ApiOperation(value = "文件预览") + @GetMapping("/preview") + public Result preview(@RequestParam("fileId") Long fileId, HttpServletResponse response) { + return businessDataFileService.preview(fileId, response); + } + } diff --git a/web/src/main/resources/application.yml b/web/src/main/resources/application.yml index 694c057..11a5b40 100644 --- a/web/src/main/resources/application.yml +++ b/web/src/main/resources/application.yml @@ -10,9 +10,9 @@ spring: servlet: multipart: # 单个文件大小 - max-file-size: 100MB + max-file-size: 1000MB # 设置总上传的文件大小 - max-request-size: 200MB + max-request-size: 2000MB application: name: znpt mvc: @@ -27,4 +27,4 @@ flowable: # true 会对数据库中所有表进行更新操作。如果表不存在,则自动创建(建议开发时使用) database-schema-update: false # 关闭定时任务JOB - async-executor-activate: false \ No newline at end of file + async-executor-activate: false -- 2.34.1 From 40c11dd9748d4d9cb43b1866ed344690b8e4e0f5 Mon Sep 17 00:00:00 2001 From: "Mr.j" <2221464500@qq.com> Date: Thu, 7 Aug 2025 16:47:42 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E5=8F=B0=E7=9A=84=E5=9F=BA=E7=A1=80=E6=9F=A5=E8=AF=A2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/EquipmentApprovalEntity.java | 91 ++++++++ .../mapper/EquipmentApprovalMapper.java | 14 ++ .../domain/vo/EquipmentApprovalListReq.java | 54 +++++ .../znpt/domain/vo/EquipmentApprovalReq.java | 33 +++ .../znpt/domain/vo/EquipmentApprovalResp.java | 86 ++++++++ .../service/EquipmentApprovalService.java | 44 ++++ .../impl/EquipmentApprovalServiceImpl.java | 199 ++++++++++++++++++ .../EquipmentApprovalController.java | 73 +++++++ 8 files changed, 594 insertions(+) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/EquipmentApprovalEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/mapper/EquipmentApprovalMapper.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/EquipmentApprovalListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/EquipmentApprovalReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/EquipmentApprovalResp.java create mode 100644 core/src/main/java/com/dite/znpt/service/EquipmentApprovalService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/EquipmentApprovalServiceImpl.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/EquipmentApprovalController.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/EquipmentApprovalEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/EquipmentApprovalEntity.java new file mode 100644 index 0000000..69eded6 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/EquipmentApprovalEntity.java @@ -0,0 +1,91 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/1/8/周三 17:26 + * @description 设备审批实体 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("equipment_approval") +@ApiModel(value="EquipmentApprovalEntity对象", description="设备审批信息表") +public class EquipmentApprovalEntity extends AuditableEntity implements Serializable { + private static final long serialVersionUID = -6665040704562461286L; + + @ApiModelProperty("审批ID") + @TableId(type = IdType.ASSIGN_ID) + private String approvalId; + + @ApiModelProperty("设备ID") + private String equipmentId; + + @ApiModelProperty("设备名称") + private String equipmentName; + + @ApiModelProperty("设备类型") + private String equipmentType; + + @ApiModelProperty("设备型号") + private String equipmentModel; + + @ApiModelProperty("品牌") + private String brand; + + @ApiModelProperty("供应商名称") + private String supplierName; + + @ApiModelProperty("采购价格") + private BigDecimal purchasePrice; + + @ApiModelProperty("总价") + private BigDecimal totalPrice; + + @ApiModelProperty("数量") + private Integer quantity; + + @ApiModelProperty("申请人") + private String applicantName; + + @ApiModelProperty("申请人ID") + private String applicantId; + + @ApiModelProperty("申请时间") + private LocalDateTime applyTime; + + @ApiModelProperty("申请原因") + private String applyReason; + + @ApiModelProperty("业务类型,PROCUREMENT-采购,BORROW-借用,RETURN-归还") + private String businessType; + + @ApiModelProperty("审批状态,PENDING-待审批,APPROVED-已通过,REJECTED-已拒绝") + private String approvalStatus; + + @ApiModelProperty("审批人") + private String approverName; + + @ApiModelProperty("审批人ID") + private String approverId; + + @ApiModelProperty("审批时间") + private LocalDateTime approvalTime; + + @ApiModelProperty("审批意见") + private String approvalComment; + + @ApiModelProperty("删除标志(0代表存在 1代表删除)") + @TableLogic + private String delFlag; +} diff --git a/core/src/main/java/com/dite/znpt/domain/mapper/EquipmentApprovalMapper.java b/core/src/main/java/com/dite/znpt/domain/mapper/EquipmentApprovalMapper.java new file mode 100644 index 0000000..92a9818 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/mapper/EquipmentApprovalMapper.java @@ -0,0 +1,14 @@ +package com.dite.znpt.domain.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.EquipmentApprovalEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author Bear.G + * @date 2025/1/8/周三 17:30 + * @description 设备审批Mapper接口 + */ +@Mapper +public interface EquipmentApprovalMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentApprovalListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentApprovalListReq.java new file mode 100644 index 0000000..39b5833 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentApprovalListReq.java @@ -0,0 +1,54 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/1/8/周三 17:45 + * @description 设备审批列表查询请求VO + */ +@Data +@ApiModel(value="EquipmentApprovalListReq对象", description="设备审批列表查询请求") +public class EquipmentApprovalListReq implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("设备名称") + private String equipmentName; + + @ApiModelProperty("申请人") + private String applicantName; + + @ApiModelProperty("业务类型,PROCUREMENT-采购,BORROW-借用,RETURN-归还") + private String businessType; + + @ApiModelProperty("审批状态") + private String approvalStatus; + + @ApiModelProperty("申请时间开始") + private String applyTimeStart; + + @ApiModelProperty("申请时间结束") + private String applyTimeEnd; + + @ApiModelProperty("审批时间开始") + private String approvalTimeStart; + + @ApiModelProperty("审批时间结束") + private String approvalTimeEnd; + + @ApiModelProperty("当前页码") + private Integer page; + + @ApiModelProperty("每页大小") + private Integer pageSize; + + @ApiModelProperty("排序字段") + private String orderBy; + + @ApiModelProperty("排序方向") + private String orderDirection; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentApprovalReq.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentApprovalReq.java new file mode 100644 index 0000000..e1ff546 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentApprovalReq.java @@ -0,0 +1,33 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/1/8/周三 17:35 + * @description 设备审批请求VO + */ +@Data +@ApiModel(value="EquipmentApprovalReq对象", description="设备审批请求") +public class EquipmentApprovalReq implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("审批意见") + private String approvalComment; + + @ApiModelProperty("审批结果,APPROVED-通过,REJECTED-拒绝") + @NotBlank(message = "审批结果不能为空") + private String approvalResult; + + @ApiModelProperty("审批人") + private String approverName; + + @ApiModelProperty("审批人ID") + private String approverId; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentApprovalResp.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentApprovalResp.java new file mode 100644 index 0000000..3fc8e50 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentApprovalResp.java @@ -0,0 +1,86 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/1/8/周三 17:40 + * @description 设备审批响应VO + */ +@Data +@ApiModel(value="EquipmentApprovalResp对象", description="设备审批响应") +public class EquipmentApprovalResp implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("审批ID") + private String approvalId; + + @ApiModelProperty("设备ID") + private String equipmentId; + + @ApiModelProperty("设备名称") + private String equipmentName; + + @ApiModelProperty("设备类型") + private String equipmentType; + + @ApiModelProperty("设备型号") + private String equipmentModel; + + @ApiModelProperty("品牌") + private String brand; + + @ApiModelProperty("供应商名称") + private String supplierName; + + @ApiModelProperty("采购价格") + private BigDecimal purchasePrice; + + @ApiModelProperty("总价") + private BigDecimal totalPrice; + + @ApiModelProperty("数量") + private Integer quantity; + + @ApiModelProperty("申请人") + private String applicantName; + + @ApiModelProperty("申请人ID") + private String applicantId; + + @ApiModelProperty("申请时间") + private LocalDateTime applyTime; + + @ApiModelProperty("申请原因") + private String applyReason; + + @ApiModelProperty("业务类型,PROCUREMENT-采购,BORROW-借用,RETURN-归还") + private String businessType; + + @ApiModelProperty("审批状态") + private String approvalStatus; + + @ApiModelProperty("审批人") + private String approverName; + + @ApiModelProperty("审批人ID") + private String approverId; + + @ApiModelProperty("审批时间") + private LocalDateTime approvalTime; + + @ApiModelProperty("审批意见") + private String approvalComment; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + private LocalDateTime updateTime; +} diff --git a/core/src/main/java/com/dite/znpt/service/EquipmentApprovalService.java b/core/src/main/java/com/dite/znpt/service/EquipmentApprovalService.java new file mode 100644 index 0000000..685c7c4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/EquipmentApprovalService.java @@ -0,0 +1,44 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dite.znpt.domain.vo.EquipmentApprovalListReq; +import com.dite.znpt.domain.vo.EquipmentApprovalReq; +import com.dite.znpt.domain.vo.EquipmentApprovalResp; + +/** + * @author Bear.G + * @date 2025/1/8/周三 17:50 + * @description 设备审批服务接口 + */ +public interface EquipmentApprovalService { + + /** + * 分页查询待审批的设备采购申请 + */ + IPage getPendingApprovals(EquipmentApprovalListReq req); + + /** + * 分页查询已审批的设备采购申请 + */ + IPage getApprovedApprovals(EquipmentApprovalListReq req); + + /** + * 审批通过 + */ + void approve(String approvalId, EquipmentApprovalReq req); + + /** + * 审批拒绝 + */ + void reject(String approvalId, EquipmentApprovalReq req); + + /** + * 获取审批详情 + */ + EquipmentApprovalResp getApprovalDetail(String approvalId); + + /** + * 获取审批统计信息 + */ + Object getApprovalStats(); +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/EquipmentApprovalServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/EquipmentApprovalServiceImpl.java new file mode 100644 index 0000000..6d1fced --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/EquipmentApprovalServiceImpl.java @@ -0,0 +1,199 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dite.znpt.domain.entity.EquipmentApprovalEntity; +import com.dite.znpt.domain.mapper.EquipmentApprovalMapper; +import com.dite.znpt.domain.vo.EquipmentApprovalListReq; +import com.dite.znpt.domain.vo.EquipmentApprovalReq; +import com.dite.znpt.domain.vo.EquipmentApprovalResp; +import com.dite.znpt.service.EquipmentApprovalService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author Bear.G + * @date 2025/1/8/周三 17:55 + * @description 设备审批服务实现类 + */ +@Service +public class EquipmentApprovalServiceImpl implements EquipmentApprovalService { + + @Resource + private EquipmentApprovalMapper equipmentApprovalMapper; + + @Override + public IPage getPendingApprovals(EquipmentApprovalListReq req) { + // 创建分页对象,处理null值 + Integer pageNum = req.getPage() != null ? req.getPage() : 1; + Integer pageSize = req.getPageSize() != null ? req.getPageSize() : 10; + Page page = new Page<>(pageNum, pageSize); + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(EquipmentApprovalEntity::getApprovalStatus, "PENDING"); + + // 添加查询条件 + addQueryConditions(wrapper, req); + + IPage result = equipmentApprovalMapper.selectPage(page, wrapper); + + return convertToRespPage(result); + } + + @Override + public IPage getApprovedApprovals(EquipmentApprovalListReq req) { + // 创建分页对象,处理null值 + Integer pageNum = req.getPage() != null ? req.getPage() : 1; + Integer pageSize = req.getPageSize() != null ? req.getPageSize() : 10; + Page page = new Page<>(pageNum, pageSize); + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(EquipmentApprovalEntity::getApprovalStatus, "APPROVED", "REJECTED"); + + // 添加查询条件 + addQueryConditions(wrapper, req); + + IPage result = equipmentApprovalMapper.selectPage(page, wrapper); + + return convertToRespPage(result); + } + + @Override + public void approve(String approvalId, EquipmentApprovalReq req) { + EquipmentApprovalEntity entity = equipmentApprovalMapper.selectById(approvalId); + if (entity == null) { + throw new RuntimeException("审批记录不存在"); + } + + entity.setApprovalStatus("APPROVED"); + entity.setApproverName(req.getApproverName()); + entity.setApproverId(req.getApproverId()); + entity.setApprovalTime(LocalDateTime.now()); + entity.setApprovalComment(req.getApprovalComment()); + + equipmentApprovalMapper.updateById(entity); + } + + @Override + public void reject(String approvalId, EquipmentApprovalReq req) { + EquipmentApprovalEntity entity = equipmentApprovalMapper.selectById(approvalId); + if (entity == null) { + throw new RuntimeException("审批记录不存在"); + } + + entity.setApprovalStatus("REJECTED"); + entity.setApproverName(req.getApproverName()); + entity.setApproverId(req.getApproverId()); + entity.setApprovalTime(LocalDateTime.now()); + entity.setApprovalComment(req.getApprovalComment()); + + equipmentApprovalMapper.updateById(entity); + } + + @Override + public EquipmentApprovalResp getApprovalDetail(String approvalId) { + EquipmentApprovalEntity entity = equipmentApprovalMapper.selectById(approvalId); + if (entity == null) { + return null; + } + + return convertToResp(entity); + } + + @Override + public Object getApprovalStats() { + Map stats = new HashMap<>(); + + // 待审批数量 + LambdaQueryWrapper pendingWrapper = new LambdaQueryWrapper<>(); + pendingWrapper.eq(EquipmentApprovalEntity::getApprovalStatus, "PENDING"); + long pendingCount = equipmentApprovalMapper.selectCount(pendingWrapper); + stats.put("pendingCount", pendingCount); + + // 已通过数量 + LambdaQueryWrapper approvedWrapper = new LambdaQueryWrapper<>(); + approvedWrapper.eq(EquipmentApprovalEntity::getApprovalStatus, "APPROVED"); + long approvedCount = equipmentApprovalMapper.selectCount(approvedWrapper); + stats.put("approvedCount", approvedCount); + + // 已拒绝数量 + LambdaQueryWrapper rejectedWrapper = new LambdaQueryWrapper<>(); + rejectedWrapper.eq(EquipmentApprovalEntity::getApprovalStatus, "REJECTED"); + long rejectedCount = equipmentApprovalMapper.selectCount(rejectedWrapper); + stats.put("rejectedCount", rejectedCount); + + return stats; + } + + /** + * 添加查询条件 + */ + private void addQueryConditions(LambdaQueryWrapper wrapper, EquipmentApprovalListReq req) { + if (StringUtils.hasText(req.getEquipmentName())) { + wrapper.like(EquipmentApprovalEntity::getEquipmentName, req.getEquipmentName()); + } + + if (StringUtils.hasText(req.getApplicantName())) { + wrapper.like(EquipmentApprovalEntity::getApplicantName, req.getApplicantName()); + } + + if (StringUtils.hasText(req.getBusinessType())) { + wrapper.eq(EquipmentApprovalEntity::getBusinessType, req.getBusinessType()); + } + + if (StringUtils.hasText(req.getApprovalStatus())) { + wrapper.eq(EquipmentApprovalEntity::getApprovalStatus, req.getApprovalStatus()); + } + + if (StringUtils.hasText(req.getApplyTimeStart())) { + wrapper.ge(EquipmentApprovalEntity::getApplyTime, req.getApplyTimeStart()); + } + + if (StringUtils.hasText(req.getApplyTimeEnd())) { + wrapper.le(EquipmentApprovalEntity::getApplyTime, req.getApplyTimeEnd()); + } + + if (StringUtils.hasText(req.getApprovalTimeStart())) { + wrapper.ge(EquipmentApprovalEntity::getApprovalTime, req.getApprovalTimeStart()); + } + + if (StringUtils.hasText(req.getApprovalTimeEnd())) { + wrapper.le(EquipmentApprovalEntity::getApprovalTime, req.getApprovalTimeEnd()); + } + + // 排序 + wrapper.orderByDesc(EquipmentApprovalEntity::getCreateTime); + } + + /** + * 转换为响应对象 + */ + private EquipmentApprovalResp convertToResp(EquipmentApprovalEntity entity) { + EquipmentApprovalResp resp = new EquipmentApprovalResp(); + BeanUtils.copyProperties(entity, resp); + return resp; + } + + /** + * 转换为响应分页对象 + */ + private IPage convertToRespPage(IPage page) { + List records = page.getRecords().stream() + .map(this::convertToResp) + .collect(Collectors.toList()); + + Page respPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal()); + respPage.setRecords(records); + + return respPage; + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/EquipmentApprovalController.java b/web/src/main/java/com/dite/znpt/web/controller/EquipmentApprovalController.java new file mode 100644 index 0000000..a49fa5f --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/EquipmentApprovalController.java @@ -0,0 +1,73 @@ +package com.dite.znpt.web.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.EquipmentApprovalListReq; +import com.dite.znpt.domain.vo.EquipmentApprovalReq; +import com.dite.znpt.domain.vo.EquipmentApprovalResp; +import com.dite.znpt.service.EquipmentApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Bear.G + * @date 2025/1/8/周三 18:00 + * @description 设备审批控制器 + */ +@Api(tags = "设备审批管理") +@RestController +@RequestMapping("/equipment/approval") +public class EquipmentApprovalController { + + private static final Logger log = LoggerFactory.getLogger(EquipmentApprovalController.class); + + @Resource + private EquipmentApprovalService equipmentApprovalService; + + @ApiOperation(value = "分页查询待审批的设备采购申请", httpMethod = "GET") + @GetMapping("/pending") + public PageResult getPendingApprovals(EquipmentApprovalListReq req) { + IPage page = equipmentApprovalService.getPendingApprovals(req); + return PageResult.ok(page.getRecords(), page.getTotal()); + } + + @ApiOperation(value = "分页查询已审批的设备采购申请", httpMethod = "GET") + @GetMapping("/approved") + public PageResult getApprovedApprovals(EquipmentApprovalListReq req) { + IPage page = equipmentApprovalService.getApprovedApprovals(req); + return PageResult.ok(page.getRecords(), page.getTotal()); + } + + @ApiOperation(value = "审批通过", httpMethod = "POST") + @PostMapping("/{approvalId}/approve") + public Result approve(@PathVariable String approvalId, @Validated @RequestBody EquipmentApprovalReq req) { + equipmentApprovalService.approve(approvalId, req); + return Result.ok(); + } + + @ApiOperation(value = "审批拒绝", httpMethod = "POST") + @PostMapping("/{approvalId}/reject") + public Result reject(@PathVariable String approvalId, @Validated @RequestBody EquipmentApprovalReq req) { + equipmentApprovalService.reject(approvalId, req); + return Result.ok(); + } + + @ApiOperation(value = "获取审批详情", httpMethod = "GET") + @GetMapping("/{approvalId}") + public Result getApprovalDetail(@PathVariable String approvalId) { + return Result.ok(equipmentApprovalService.getApprovalDetail(approvalId)); + } + + @ApiOperation(value = "获取审批统计信息", httpMethod = "GET") + @GetMapping("/stats") + public Result getApprovalStats() { + return Result.ok(equipmentApprovalService.getApprovalStats()); + } +} -- 2.34.1 From e1259d904acef31b7a928bdc0d8e9741831668bc Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Wed, 6 Aug 2025 20:26:47 +0800 Subject: [PATCH 06/15] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=B1=BB=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E5=86=B2=E7=AA=81=E8=A7=A3=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/vo/ProjectMemberListReq.java | 45 ---- .../dite/znpt/domain/vo/ProjectMemberReq.java | 62 ----- .../dite/znpt/mapper/ProjectMemberMapper.java | 31 --- .../znpt/service/ProjectMemberService.java | 72 +---- .../impl/ProjectMemberServiceImpl.java | 173 +----------- .../resources/mapper/ProjectMemberMapper.xml | 247 ------------------ .../controller/ProjectMemberController.java | 109 +------- 7 files changed, 19 insertions(+), 720 deletions(-) delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberListReq.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberReq.java diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberListReq.java deleted file mode 100644 index 92eda45..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberListReq.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.dite.znpt.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @author wangna - * @date 2025/08/05 - * @Description: 项目人员查询请求VO - */ -@Data -@ApiModel(value="ProjectMemberListReq对象", description="项目人员查询请求") -public class ProjectMemberListReq { - - @ApiModelProperty("项目ID") - private String projectId; - - @ApiModelProperty("机组ID") - private String turbineId; - - @ApiModelProperty("任务组ID") - private String taskGroupId; - - @ApiModelProperty("任务ID") - private String taskId; - - @ApiModelProperty("用户ID") - private String userId; - - @ApiModelProperty("角色类型") - private String roleType; - - @ApiModelProperty("岗位代码") - private String jobCode; - - @ApiModelProperty("状态") - private String status; - - @ApiModelProperty("用户姓名(模糊查询)") - private String userName; - - @ApiModelProperty("用户账号(模糊查询)") - private String userAccount; -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberReq.java deleted file mode 100644 index d2ffb17..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberReq.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.dite.znpt.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import java.time.LocalDate; - -/** - * @author wangna - * @date 2025/08/05 - * @Description: 项目人员请求VO - */ -@Data -@ApiModel(value="ProjectMemberReq对象", description="项目人员请求") -public class ProjectMemberReq { - - @ApiModelProperty("关联ID(更新时必填)") - private String memberId; - - @NotBlank(message = "项目ID不能为空") - @ApiModelProperty("项目ID") - private String projectId; - - @ApiModelProperty("机组ID(可选)") - private String turbineId; - - @ApiModelProperty("任务组ID(可选)") - private String taskGroupId; - - @ApiModelProperty("任务ID(可选)") - private String taskId; - - @NotBlank(message = "用户ID不能为空") - @ApiModelProperty("用户ID") - private String userId; - - @NotBlank(message = "角色类型不能为空") - @ApiModelProperty("角色类型") - private String roleType; - - @ApiModelProperty("岗位代码") - private String jobCode; - - @ApiModelProperty("岗位描述") - private String jobDesc; - - @NotNull(message = "加入时间不能为空") - @ApiModelProperty("加入时间") - private LocalDate joinDate; - - @ApiModelProperty("离开时间") - private LocalDate leaveDate; - - @ApiModelProperty("状态") - private String status; - - @ApiModelProperty("备注") - private String remark; -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java index d514e90..a66a598 100644 --- a/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java @@ -2,7 +2,6 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.ProjectMemberEntity; -import com.dite.znpt.domain.vo.ProjectMemberListReq; import com.dite.znpt.domain.vo.ProjectMemberResp; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -17,38 +16,8 @@ import java.util.List; @Mapper public interface ProjectMemberMapper extends BaseMapper { - /** - * 根据条件查询项目人员列表 - */ - List queryBySelective(ProjectMemberListReq req); - /** * 根据项目ID查询项目人员列表 */ List queryByProjectId(@Param("projectId") String projectId); - - /** - * 根据机组ID查询机组人员列表 - */ - List queryByTurbineId(@Param("turbineId") String turbineId); - - /** - * 根据任务组ID查询任务组人员列表 - */ - List queryByTaskGroupId(@Param("taskGroupId") String taskGroupId); - - /** - * 根据任务ID查询任务人员列表 - */ - List queryByTaskId(@Param("taskId") String taskId); - - /** - * 根据用户ID查询用户参与的项目列表 - */ - List queryByUserId(@Param("userId") String userId); - - /** - * 根据项目ID和角色类型查询人员列表 - */ - List queryByProjectIdAndRoleType(@Param("projectId") String projectId, @Param("roleType") String roleType); } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java b/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java index 9004093..b743cd2 100644 --- a/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java +++ b/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java @@ -14,80 +14,10 @@ import java.util.List; public interface ProjectMemberService extends IService { /** - * 查询项目人员列表 - */ - List selectList(ProjectMemberListReq req); - - /** - * 根据项目ID查询项目人员列表 + * 根据项目ID查询项目人员列表(看板功能需要) */ List selectByProjectId(String projectId); - /** - * 根据机组ID查询机组人员列表 - */ - List selectByTurbineId(String turbineId); - - /** - * 根据任务组ID查询任务组人员列表 - */ - List selectByTaskGroupId(String taskGroupId); - - /** - * 根据任务ID查询任务人员列表 - */ - List selectByTaskId(String taskId); - - /** - * 根据用户ID查询用户参与的项目列表 - */ - List selectByUserId(String userId); - - /** - * 根据项目ID和角色类型查询人员列表 - */ - List selectByProjectIdAndRoleType(String projectId, String roleType); - - /** - * 新增项目人员 - */ - void saveData(ProjectMemberReq req); - - /** - * 更新项目人员 - */ - void updateData(ProjectMemberReq req); - - /** - * 删除项目人员 - */ - void deleteById(String memberId); - - /** - * 批量添加项目人员 - */ - void batchAddMembers(List reqList); - - /** - * 根据项目ID删除所有项目人员 - */ - void deleteByProjectId(String projectId); - - /** - * 根据机组ID删除所有机组人员 - */ - void deleteByTurbineId(String turbineId); - - /** - * 根据任务组ID删除所有任务组人员 - */ - void deleteByTaskGroupId(String taskGroupId); - - /** - * 根据任务ID删除所有任务人员 - */ - void deleteByTaskId(String taskId); - // ========================== 项目看板相关方法 ========================== /** diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java index 9ee100e..68a9e1f 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java @@ -6,18 +6,17 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.domain.entity.*; -import com.dite.znpt.domain.vo.*; -import com.dite.znpt.enums.ProjectJobCodeEnum; -import com.dite.znpt.enums.ProjectRoleTypeEnum; +import com.dite.znpt.domain.vo.ProjectDetailResp; +import com.dite.znpt.domain.vo.ProjectKanbanDataResp; +import com.dite.znpt.domain.vo.ProjectKanbanStatsResp; +import com.dite.znpt.domain.vo.ProjectMemberResp; import com.dite.znpt.enums.ProjectStatusEnum; import com.dite.znpt.enums.ProjectTaskStateEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ProjectMemberMapper; import com.dite.znpt.service.*; -import com.dite.znpt.util.PageUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.List; @@ -43,14 +42,6 @@ public class ProjectMemberServiceImpl extends ServiceImpl selectList(ProjectMemberListReq req) { - PageUtil.startPage(); - List list = this.baseMapper.queryBySelective(req); - enrichMemberInfo(list); - return list; - } - @Override public List selectByProjectId(String projectId) { List list = this.baseMapper.queryByProjectId(projectId); @@ -58,139 +49,8 @@ public class ProjectMemberServiceImpl extends ServiceImpl selectByTurbineId(String turbineId) { - List list = this.baseMapper.queryByTurbineId(turbineId); - enrichMemberInfo(list); - return list; - } - - @Override - public List selectByTaskGroupId(String taskGroupId) { - List list = this.baseMapper.queryByTaskGroupId(taskGroupId); - enrichMemberInfo(list); - return list; - } - - @Override - public List selectByTaskId(String taskId) { - List list = this.baseMapper.queryByTaskId(taskId); - enrichMemberInfo(list); - return list; - } - - @Override - public List selectByUserId(String userId) { - List list = this.baseMapper.queryByUserId(userId); - enrichMemberInfo(list); - return list; - } - - @Override - public List selectByProjectIdAndRoleType(String projectId, String roleType) { - List list = this.baseMapper.queryByProjectIdAndRoleType(projectId, roleType); - enrichMemberInfo(list); - return list; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void saveData(ProjectMemberReq req) { - // 验证用户是否存在 - UserEntity user = userService.getById(req.getUserId()); - if (user == null) { - throw new ServiceException(Message.USER_ID_NOT_EXIST_OR_ILLEGAL); - } - - // 检查是否已存在相同的关联 - boolean exists = lambdaQuery() - .eq(ProjectMemberEntity::getProjectId, req.getProjectId()) - .eq(ProjectMemberEntity::getUserId, req.getUserId()) - .eq(StrUtil.isNotEmpty(req.getTurbineId()), ProjectMemberEntity::getTurbineId, req.getTurbineId()) - .eq(StrUtil.isNotEmpty(req.getTaskGroupId()), ProjectMemberEntity::getTaskGroupId, req.getTaskGroupId()) - .eq(StrUtil.isNotEmpty(req.getTaskId()), ProjectMemberEntity::getTaskId, req.getTaskId()) - .eq(ProjectMemberEntity::getRoleType, req.getRoleType()) - .exists(); - - if (exists) { - throw new ServiceException("该用户在此项目中已存在相同角色"); - } - - ProjectMemberEntity entity = BeanUtil.copyProperties(req, ProjectMemberEntity.class); - if (StrUtil.isEmpty(entity.getStatus())) { - entity.setStatus("ACTIVE"); - } - save(entity); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateData(ProjectMemberReq req) { - if (StrUtil.isEmpty(req.getMemberId())) { - throw new ServiceException("关联ID不能为空"); - } - - ProjectMemberEntity entity = getById(req.getMemberId()); - if (entity == null) { - throw new ServiceException(Message.PROJECT_ID_IS_NOT_EXIST); - } - - BeanUtil.copyProperties(req, entity); - updateById(entity); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteById(String memberId) { - removeById(memberId); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void batchAddMembers(List reqList) { - if (CollUtil.isEmpty(reqList)) { - return; - } - - for (ProjectMemberReq req : reqList) { - saveData(req); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteByProjectId(String projectId) { - lambdaUpdate() - .eq(ProjectMemberEntity::getProjectId, projectId) - .remove(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteByTurbineId(String turbineId) { - lambdaUpdate() - .eq(ProjectMemberEntity::getTurbineId, turbineId) - .remove(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteByTaskGroupId(String taskGroupId) { - lambdaUpdate() - .eq(ProjectMemberEntity::getTaskGroupId, taskGroupId) - .remove(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteByTaskId(String taskId) { - lambdaUpdate() - .eq(ProjectMemberEntity::getTaskId, taskId) - .remove(); - } - /** - * 丰富成员信息(用户信息、角色描述、岗位描述) + * 丰富成员信息 */ private void enrichMemberInfo(List list) { if (CollUtil.isEmpty(list)) { @@ -200,31 +60,26 @@ public class ProjectMemberServiceImpl extends ServiceImpl userIds = list.stream() .map(ProjectMemberResp::getUserId) + .filter(StrUtil::isNotBlank) .distinct() .collect(Collectors.toList()); - // 查询用户信息 - Map userMap = userService.listByIds(userIds) - .stream() + if (CollUtil.isEmpty(userIds)) { + return; + } + + // 批量查询用户信息 + List users = userService.listByIds(userIds); + Map userMap = users.stream() .collect(Collectors.toMap(UserEntity::getUserId, Function.identity())); - // 填充用户信息和描述 + // 填充用户信息 list.forEach(member -> { - // 填充用户信息 UserEntity user = userMap.get(member.getUserId()); if (user != null) { member.setUserName(user.getName()); - member.setUserAccount(user.getAccount()); member.setUserAvatar(user.getAvatar()); } - - // 填充角色类型描述 - member.setRoleTypeDesc(ProjectRoleTypeEnum.getDescByCode(member.getRoleType())); - - // 填充岗位代码描述 - if (StrUtil.isNotEmpty(member.getJobCode())) { - member.setJobCodeDesc(ProjectJobCodeEnum.getDescByCode(member.getJobCode())); - } }); } diff --git a/core/src/main/resources/mapper/ProjectMemberMapper.xml b/core/src/main/resources/mapper/ProjectMemberMapper.xml index f8925d6..bb1a416 100644 --- a/core/src/main/resources/mapper/ProjectMemberMapper.xml +++ b/core/src/main/resources/mapper/ProjectMemberMapper.xml @@ -28,72 +28,6 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java index 4a670f7..7b9c7bd 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java @@ -1,18 +1,16 @@ package com.dite.znpt.web.controller; -import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.vo.*; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.ProjectKanbanStatsResp; +import com.dite.znpt.domain.vo.ProjectKanbanDataResp; +import com.dite.znpt.domain.vo.ProjectDetailResp; import com.dite.znpt.service.ProjectMemberService; -import com.dite.znpt.util.PageUtil; -import com.dite.znpt.util.ValidationGroup; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import java.util.List; /** * @author wangna @@ -28,105 +26,6 @@ public class ProjectMemberController { @Resource private ProjectMemberService projectMemberService; - @ApiOperation(value = "查询项目人员列表", httpMethod = "GET") - @GetMapping("/list") - public PageResult list(ProjectMemberListReq req) { - PageUtil.startPage(); - return PageResult.ok(projectMemberService.selectList(req)); - } - - @ApiOperation(value = "根据项目ID查询项目人员", httpMethod = "GET") - @GetMapping("/project/{projectId}") - public Result> getByProjectId(@PathVariable String projectId) { - return Result.ok(projectMemberService.selectByProjectId(projectId)); - } - - @ApiOperation(value = "根据机组ID查询机组人员", httpMethod = "GET") - @GetMapping("/turbine/{turbineId}") - public Result> getByTurbineId(@PathVariable String turbineId) { - return Result.ok(projectMemberService.selectByTurbineId(turbineId)); - } - - @ApiOperation(value = "根据任务组ID查询任务组人员", httpMethod = "GET") - @GetMapping("/task-group/{taskGroupId}") - public Result> getByTaskGroupId(@PathVariable String taskGroupId) { - return Result.ok(projectMemberService.selectByTaskGroupId(taskGroupId)); - } - - @ApiOperation(value = "根据任务ID查询任务人员", httpMethod = "GET") - @GetMapping("/task/{taskId}") - public Result> getByTaskId(@PathVariable String taskId) { - return Result.ok(projectMemberService.selectByTaskId(taskId)); - } - - @ApiOperation(value = "根据用户ID查询用户参与的项目", httpMethod = "GET") - @GetMapping("/user/{userId}") - public Result> getByUserId(@PathVariable String userId) { - return Result.ok(projectMemberService.selectByUserId(userId)); - } - - @ApiOperation(value = "根据项目ID和角色类型查询人员", httpMethod = "GET") - @GetMapping("/project/{projectId}/role/{roleType}") - public Result> getByProjectIdAndRoleType(@PathVariable String projectId, @PathVariable String roleType) { - return Result.ok(projectMemberService.selectByProjectIdAndRoleType(projectId, roleType)); - } - - @ApiOperation(value = "新增项目人员", httpMethod = "POST") - @PostMapping - public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody ProjectMemberReq req) { - projectMemberService.saveData(req); - return Result.ok(); - } - - @ApiOperation(value = "修改项目人员", httpMethod = "PUT") - @PutMapping - public Result edit(@Validated(ValidationGroup.Update.class) @RequestBody ProjectMemberReq req) { - projectMemberService.updateData(req); - return Result.ok(); - } - - @ApiOperation(value = "删除项目人员", httpMethod = "DELETE") - @DeleteMapping("/{memberId}") - public Result remove(@PathVariable String memberId) { - projectMemberService.deleteById(memberId); - return Result.ok(); - } - - @ApiOperation(value = "批量添加项目人员", httpMethod = "POST") - @PostMapping("/batch") - public Result batchAdd(@RequestBody List reqList) { - projectMemberService.batchAddMembers(reqList); - return Result.ok(); - } - - @ApiOperation(value = "根据项目ID删除所有项目人员", httpMethod = "DELETE") - @DeleteMapping("/project/{projectId}") - public Result removeByProjectId(@PathVariable String projectId) { - projectMemberService.deleteByProjectId(projectId); - return Result.ok(); - } - - @ApiOperation(value = "根据机组ID删除所有机组人员", httpMethod = "DELETE") - @DeleteMapping("/turbine/{turbineId}") - public Result removeByTurbineId(@PathVariable String turbineId) { - projectMemberService.deleteByTurbineId(turbineId); - return Result.ok(); - } - - @ApiOperation(value = "根据任务组ID删除所有任务组人员", httpMethod = "DELETE") - @DeleteMapping("/task-group/{taskGroupId}") - public Result removeByTaskGroupId(@PathVariable String taskGroupId) { - projectMemberService.deleteByTaskGroupId(taskGroupId); - return Result.ok(); - } - - @ApiOperation(value = "根据任务ID删除所有任务人员", httpMethod = "DELETE") - @DeleteMapping("/task/{taskId}") - public Result removeByTaskId(@PathVariable String taskId) { - projectMemberService.deleteByTaskId(taskId); - return Result.ok(); - } - // ========================== 项目看板相关接口 ========================== @ApiOperation(value = "获取项目看板统计数据", httpMethod = "GET") -- 2.34.1 From 32d43e5a3b2903ea05631d4bdbd146de03f6a3a2 Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Thu, 7 Aug 2025 17:56:30 +0800 Subject: [PATCH 07/15] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20ProjectMemberControl?= =?UTF-8?q?ler=20=E7=9A=84=E5=90=88=E5=B9=B6=E5=86=B2=E7=AA=81=E5=B9=B6?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/web/controller/ProjectMemberController.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java index 7b9c7bd..85a2c6c 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java @@ -1,14 +1,16 @@ package com.dite.znpt.web.controller; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.vo.ProjectKanbanStatsResp; -import com.dite.znpt.domain.vo.ProjectKanbanDataResp; import com.dite.znpt.domain.vo.ProjectDetailResp; +import com.dite.znpt.domain.vo.ProjectKanbanDataResp; +import com.dite.znpt.domain.vo.ProjectKanbanStatsResp; import com.dite.znpt.service.ProjectMemberService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; -- 2.34.1 From 386561125ef6a67cac044508bdacdaad3f27350d Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Thu, 7 Aug 2025 11:17:49 +0800 Subject: [PATCH 08/15] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/vo/ProjectMemberResp.java | 42 ++++++++--- .../dite/znpt/domain/vo/TeamMemberQuery.java | 39 ++++++++++ .../dite/znpt/mapper/ProjectMemberMapper.java | 6 +- .../znpt/service/ProjectMemberService.java | 7 +- .../impl/ProjectMemberServiceImpl.java | 75 ++++++++++++++++--- .../resources/mapper/ProjectMemberMapper.xml | 70 ++++++++--------- .../controller/ProjectMemberController.java | 12 +++ 7 files changed, 190 insertions(+), 61 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TeamMemberQuery.java diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java index a633545..c69e49c 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java @@ -1,5 +1,6 @@ package com.dite.znpt.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -45,8 +46,34 @@ public class ProjectMemberResp { @ApiModelProperty("用户ID") private String userId; - @ApiModelProperty("用户姓名") - private String userName; + // ========================== 前端需要的字段 ========================== + + @ApiModelProperty("姓名") + private String name; + + @ApiModelProperty("联系电话") + private String phone; + + @ApiModelProperty("邮箱") + private String email; + + @ApiModelProperty("项目岗位") + private String position; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("技能标签") + private String skills; + + @ApiModelProperty("入职日期") + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate joinDate; + + @ApiModelProperty("备注") + private String remark; + + // ========================== 保留的原有字段(用于内部处理) ========================== @ApiModelProperty("用户账号") private String userAccount; @@ -69,15 +96,10 @@ public class ProjectMemberResp { @ApiModelProperty("岗位描述") private String jobDesc; - @ApiModelProperty("加入时间") - private LocalDate joinDate; - @ApiModelProperty("离开时间") + @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate leaveDate; - @ApiModelProperty("状态") - private String status; - - @ApiModelProperty("备注") - private String remark; + @ApiModelProperty("状态描述") + private String statusDesc; } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TeamMemberQuery.java b/core/src/main/java/com/dite/znpt/domain/vo/TeamMemberQuery.java new file mode 100644 index 0000000..c147e51 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TeamMemberQuery.java @@ -0,0 +1,39 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 团队成员查询参数(支持筛选、分页、搜索) + */ +@Data +@ApiModel(value="TeamMemberQuery对象", description="团队成员查询参数") +public class TeamMemberQuery { + + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("姓名搜索") + private String name; + + @ApiModelProperty("岗位筛选") + private String position; + + @ApiModelProperty("状态筛选") + private String status; + + @ApiModelProperty("当前页码") + private Integer pageNum = 1; + + @ApiModelProperty("每页大小") + private Integer pageSize = 10; + + @ApiModelProperty("排序列") + private String orderByColumn; + + @ApiModelProperty("排序方向") + private String isAsc = "asc"; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java index a66a598..106a33d 100644 --- a/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java @@ -3,8 +3,8 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.ProjectMemberEntity; import com.dite.znpt.domain.vo.ProjectMemberResp; +import com.dite.znpt.domain.vo.TeamMemberQuery; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; import java.util.List; @@ -17,7 +17,7 @@ import java.util.List; public interface ProjectMemberMapper extends BaseMapper { /** - * 根据项目ID查询项目人员列表 + * 获取项目团队成员列表(支持筛选、分页、搜索) */ - List queryByProjectId(@Param("projectId") String projectId); + List queryTeamMembers(TeamMemberQuery query); } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java b/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java index b743cd2..7640640 100644 --- a/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java +++ b/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java @@ -1,11 +1,10 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.entity.ProjectMemberEntity; import com.dite.znpt.domain.vo.*; -import java.util.List; - /** * @author wangna * @date 2025/08/05 @@ -14,9 +13,9 @@ import java.util.List; public interface ProjectMemberService extends IService { /** - * 根据项目ID查询项目人员列表(看板功能需要) + * 获取项目团队成员列表(支持筛选、分页、搜索) */ - List selectByProjectId(String projectId); + PageResult getProjectTeamMembers(TeamMemberQuery query); // ========================== 项目看板相关方法 ========================== diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java index 68a9e1f..06705f0 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java @@ -5,16 +5,19 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; +import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.entity.*; import com.dite.znpt.domain.vo.ProjectDetailResp; import com.dite.znpt.domain.vo.ProjectKanbanDataResp; import com.dite.znpt.domain.vo.ProjectKanbanStatsResp; import com.dite.znpt.domain.vo.ProjectMemberResp; +import com.dite.znpt.domain.vo.TeamMemberQuery; import com.dite.znpt.enums.ProjectStatusEnum; import com.dite.znpt.enums.ProjectTaskStateEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ProjectMemberMapper; import com.dite.znpt.service.*; +import com.dite.znpt.util.PageUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -43,10 +46,18 @@ public class ProjectMemberServiceImpl extends ServiceImpl selectByProjectId(String projectId) { - List list = this.baseMapper.queryByProjectId(projectId); + public PageResult getProjectTeamMembers(TeamMemberQuery query) { + // 设置分页参数 + PageUtil.startPage(); + + // 查询团队成员列表 + List list = this.baseMapper.queryTeamMembers(query); + + // 丰富成员信息 enrichMemberInfo(list); - return list; + + // 返回分页结果 + return PageResult.ok(list); } /** @@ -77,9 +88,47 @@ public class ProjectMemberServiceImpl extends ServiceImpl { UserEntity user = userMap.get(member.getUserId()); if (user != null) { - member.setUserName(user.getName()); + // 映射前端需要的字段 + member.setName(user.getName()); + member.setPhone(user.getMobile()); + member.setEmail(user.getEmail()); + + // 保留原有字段用于内部处理 + member.setUserAccount(user.getAccount()); member.setUserAvatar(user.getAvatar()); } + + // 映射岗位信息 - 使用角色类型描述作为岗位 + member.setPosition(member.getRoleTypeDesc()); + + // 映射技能标签 - 暂时设为空,因为数据库中没有这个字段 + member.setSkills(""); + + // 设置状态描述 + if ("ACTIVE".equals(member.getStatus())) { + member.setStatusDesc("在职"); + } else if ("INACTIVE".equals(member.getStatus())) { + member.setStatusDesc("离职"); + } else if ("PENDING".equals(member.getStatus())) { + member.setStatusDesc("待入职"); + } else { + member.setStatusDesc("未知"); + } + + // 设置角色类型描述 + if ("PROJECT_MANAGER".equals(member.getRoleType())) { + member.setRoleTypeDesc("项目经理"); + } else if ("SAFETY_OFFICER".equals(member.getRoleType())) { + member.setRoleTypeDesc("安全员"); + } else if ("QUALITY_OFFICER".equals(member.getRoleType())) { + member.setRoleTypeDesc("质量员"); + } else if ("CONSTRUCTOR".equals(member.getRoleType())) { + member.setRoleTypeDesc("施工员"); + } else if ("TEAM_LEADER".equals(member.getRoleType())) { + member.setRoleTypeDesc("施工组长"); + } else { + member.setRoleTypeDesc("其他"); + } }); } @@ -148,8 +197,11 @@ public class ProjectMemberServiceImpl extends ServiceImpl projectMembers = selectByProjectId(projectId); + // 获取项目人员信息 - 使用新的查询方法 + TeamMemberQuery query = new TeamMemberQuery(); + query.setProjectId(projectId); + PageResult memberResult = getProjectTeamMembers(query); + List projectMembers = memberResult.getRows(); resp.setProjectMembers(projectMembers); // 计算团队规模 @@ -158,7 +210,7 @@ public class ProjectMemberServiceImpl extends ServiceImpl "PROJECT_MANAGER".equals(member.getRoleType())) - .map(ProjectMemberResp::getUserName) + .map(ProjectMemberResp::getName) .findFirst() .orElse(""); resp.setManager(managerName); @@ -253,15 +305,18 @@ public class ProjectMemberServiceImpl extends ServiceImpl members = selectByProjectId(project.getProjectId()); + // 获取项目人员信息 - 使用新的查询方法 + TeamMemberQuery query = new TeamMemberQuery(); + query.setProjectId(project.getProjectId()); + PageResult memberResult = getProjectTeamMembers(query); + List members = memberResult.getRows(); // 按角色类型分组,并去重用户名 Map memberNames = members.stream() .collect(Collectors.groupingBy( ProjectMemberResp::getRoleType, Collectors.mapping( - ProjectMemberResp::getUserName, + ProjectMemberResp::getName, Collectors.collectingAndThen( Collectors.toSet(), // 使用Set去重 set -> String.join(",", set) diff --git a/core/src/main/resources/mapper/ProjectMemberMapper.xml b/core/src/main/resources/mapper/ProjectMemberMapper.xml index bb1a416..81892d0 100644 --- a/core/src/main/resources/mapper/ProjectMemberMapper.xml +++ b/core/src/main/resources/mapper/ProjectMemberMapper.xml @@ -2,35 +2,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + SELECT DISTINCT pm.member_id, pm.project_id, p.project_name, @@ -41,26 +15,54 @@ pm.task_id, pt.task_name, pm.user_id, - u.name as user_name, + u.name as name, u.account as user_account, u.avatar as user_avatar, + u.mobile as phone, + u.email as email, pm.role_type, - pm.role_type as role_type_desc, + CASE + WHEN pm.role_type = 'PROJECT_MANAGER' THEN '项目经理' + WHEN pm.role_type = 'SAFETY_OFFICER' THEN '安全员' + WHEN pm.role_type = 'QUALITY_OFFICER' THEN '质量员' + WHEN pm.role_type = 'CONSTRUCTOR' THEN '施工员' + WHEN pm.role_type = 'TEAM_LEADER' THEN '施工组长' + ELSE '其他' + END as role_type_desc, pm.job_code, pm.job_code as job_code_desc, pm.job_desc, pm.join_date, pm.leave_date, pm.status, - pm.remark + CASE + WHEN pm.status = 'ACTIVE' THEN '在职' + WHEN pm.status = 'INACTIVE' THEN '离职' + WHEN pm.status = 'PENDING' THEN '待入职' + ELSE '未知' + END as status_desc, + pm.remark, + pm.create_time FROM project_member pm LEFT JOIN project p ON pm.project_id COLLATE utf8mb4_general_ci = p.project_id COLLATE utf8mb4_general_ci LEFT JOIN turbine t ON pm.turbine_id COLLATE utf8mb4_general_ci = t.turbine_id COLLATE utf8mb4_general_ci LEFT JOIN project_task_group ptg ON pm.task_group_id COLLATE utf8mb4_general_ci = ptg.group_id COLLATE utf8mb4_general_ci LEFT JOIN project_task pt ON pm.task_id COLLATE utf8mb4_general_ci = pt.task_id COLLATE utf8mb4_general_ci LEFT JOIN user u ON pm.user_id COLLATE utf8mb4_general_ci = u.user_id COLLATE utf8mb4_general_ci - WHERE pm.project_id = #{projectId} - AND pm.status = 'ACTIVE' + + + AND pm.project_id = #{projectId} + + + AND u.name LIKE CONCAT('%', #{name}, '%') + + + AND pm.role_type = #{position} + + + AND pm.status = #{status} + + ORDER BY pm.create_time DESC diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java index 85a2c6c..f785c18 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java @@ -1,9 +1,12 @@ package com.dite.znpt.web.controller; +import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.vo.ProjectDetailResp; import com.dite.znpt.domain.vo.ProjectKanbanDataResp; import com.dite.znpt.domain.vo.ProjectKanbanStatsResp; +import com.dite.znpt.domain.vo.ProjectMemberResp; +import com.dite.znpt.domain.vo.TeamMemberQuery; import com.dite.znpt.service.ProjectMemberService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -28,6 +31,15 @@ public class ProjectMemberController { @Resource private ProjectMemberService projectMemberService; + @ApiOperation(value = "获取项目团队成员列表(支持筛选、分页、搜索)", httpMethod = "GET") + @GetMapping("/project/{projectId}/team-members") + public PageResult getProjectTeamMembers( + @PathVariable String projectId, + TeamMemberQuery query) { + query.setProjectId(projectId); + return projectMemberService.getProjectTeamMembers(query); + } + // ========================== 项目看板相关接口 ========================== @ApiOperation(value = "获取项目看板统计数据", httpMethod = "GET") -- 2.34.1 From b45766d377245a42c8395ea78f2996007468bd3e Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Fri, 8 Aug 2025 09:17:54 +0800 Subject: [PATCH 09/15] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/domain/vo/TeamMemberReq.java | 60 +++++++ .../znpt/service/ProjectMemberService.java | 15 ++ .../impl/ProjectMemberServiceImpl.java | 148 +++++++++++++++++- .../controller/ProjectMemberController.java | 33 ++-- 4 files changed, 242 insertions(+), 14 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TeamMemberReq.java diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TeamMemberReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TeamMemberReq.java new file mode 100644 index 0000000..be6af52 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TeamMemberReq.java @@ -0,0 +1,60 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 团队成员请求类(用于创建和更新) + */ +@Data +@ApiModel(value="TeamMemberReq对象", description="团队成员请求类") +public class TeamMemberReq implements Serializable { + + @NotBlank(message = "项目ID不能为空") + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("机组ID(可选)") + private String turbineId; + + @ApiModelProperty("任务组ID(可选)") + private String taskGroupId; + + @ApiModelProperty("任务ID(可选)") + private String taskId; + + @NotBlank(message = "用户ID不能为空") + @ApiModelProperty("用户ID") + private String userId; + + @NotBlank(message = "角色类型不能为空") + @ApiModelProperty("项目角色类型:PROJECT_MANAGER-项目经理,SAFETY_OFFICER-安全员,QUALITY_OFFICER-质量员,CONSTRUCTOR-施工人员,TEAM_LEADER-施工组长") + private String roleType; + + @ApiModelProperty("具体岗位代码(如:GROUND_SERVICE-地勤,DRIVER-司机,ASCENDING-登高等)") + private String jobCode; + + @ApiModelProperty("岗位描述") + private String jobDesc; + + @NotNull(message = "加入时间不能为空") + @ApiModelProperty("加入时间") + private LocalDate joinDate; + + @ApiModelProperty("离开时间") + private LocalDate leaveDate; + + @ApiModelProperty("状态:ACTIVE-在职,INACTIVE-离职,PENDING-待入职") + private String status = "ACTIVE"; + + @ApiModelProperty("备注") + private String remark; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java b/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java index 7640640..939ff8a 100644 --- a/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java +++ b/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java @@ -17,6 +17,21 @@ public interface ProjectMemberService extends IService { */ PageResult getProjectTeamMembers(TeamMemberQuery query); + /** + * 创建团队成员 + */ + ProjectMemberResp createTeamMember(TeamMemberReq req); + + /** + * 更新团队成员信息 + */ + ProjectMemberResp updateTeamMember(String memberId, TeamMemberReq req); + + /** + * 删除团队成员(支持单个或批量删除) + */ + boolean deleteTeamMembers(String... memberIds); + // ========================== 项目看板相关方法 ========================== /** diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java index 06705f0..cdb1428 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java @@ -7,11 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.entity.*; -import com.dite.znpt.domain.vo.ProjectDetailResp; -import com.dite.znpt.domain.vo.ProjectKanbanDataResp; -import com.dite.znpt.domain.vo.ProjectKanbanStatsResp; -import com.dite.znpt.domain.vo.ProjectMemberResp; -import com.dite.znpt.domain.vo.TeamMemberQuery; +import com.dite.znpt.domain.vo.*; import com.dite.znpt.enums.ProjectStatusEnum; import com.dite.znpt.enums.ProjectTaskStateEnum; import com.dite.znpt.exception.ServiceException; @@ -42,6 +38,7 @@ public class ProjectMemberServiceImpl extends ServiceImpl members = this.listByIds(CollUtil.toList(memberIds)); + if (members.size() != memberIds.length) { + throw new ServiceException("部分成员不存在"); + } + + // 批量删除 + return this.removeByIds(CollUtil.toList(memberIds)); + } + + /** + * 根据成员ID获取成员信息 + */ + private ProjectMemberResp getTeamMemberById(String memberId) { + ProjectMemberEntity entity = this.getById(memberId); + if (entity == null) { + return null; + } + + // 构建查询条件 + TeamMemberQuery query = new TeamMemberQuery(); + query.setProjectId(entity.getProjectId()); + + // 查询并返回单个成员信息 + List list = this.baseMapper.queryTeamMembers(query); + return list.stream() + .filter(member -> member.getMemberId().equals(memberId)) + .findFirst() + .orElse(null); + } + // ========================== 项目看板相关方法实现 ========================== @Override @@ -340,7 +475,10 @@ public class ProjectMemberServiceImpl extends ServiceImpl teamMembers = members.stream() .map(member -> { ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp teamMember = new ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp(); + // 先复制所有同名字段 BeanUtil.copyProperties(member, teamMember); + // 手动处理字段名不一致的字段 + teamMember.setUserName(member.getName()); // name -> userName return teamMember; }) .collect(Collectors.toList()); diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java index f785c18..220ccfa 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java @@ -2,20 +2,15 @@ package com.dite.znpt.web.controller; import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.vo.ProjectDetailResp; -import com.dite.znpt.domain.vo.ProjectKanbanDataResp; -import com.dite.znpt.domain.vo.ProjectKanbanStatsResp; -import com.dite.znpt.domain.vo.ProjectMemberResp; -import com.dite.znpt.domain.vo.TeamMemberQuery; +import com.dite.znpt.domain.vo.*; import com.dite.znpt.service.ProjectMemberService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; /** * @author wangna @@ -40,6 +35,26 @@ public class ProjectMemberController { return projectMemberService.getProjectTeamMembers(query); } + @ApiOperation(value = "创建团队成员", httpMethod = "POST") + @PostMapping("/team-member") + public Result createTeamMember(@Valid @RequestBody TeamMemberReq req) { + return Result.ok(projectMemberService.createTeamMember(req)); + } + + @ApiOperation(value = "更新团队成员信息", httpMethod = "PUT") + @PutMapping("/team-member/{memberId}") + public Result updateTeamMember( + @PathVariable String memberId, + @Valid @RequestBody TeamMemberReq req) { + return Result.ok(projectMemberService.updateTeamMember(memberId, req)); + } + + @ApiOperation(value = "删除团队成员(支持单个或批量删除)", httpMethod = "DELETE") + @DeleteMapping("/team-member/batch") + public Result deleteTeamMembers(@RequestBody List ids) { + return Result.ok(projectMemberService.deleteTeamMembers(ids.toArray(new String[0]))); + } + // ========================== 项目看板相关接口 ========================== @ApiOperation(value = "获取项目看板统计数据", httpMethod = "GET") -- 2.34.1 From d4b06d9c662c9e617d2356965042efc9bbd10cfb Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Fri, 8 Aug 2025 14:52:14 +0800 Subject: [PATCH 10/15] =?UTF-8?q?=E6=B6=88=E9=99=A4=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E9=87=8D=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ProjectMemberServiceImpl.java | 244 ++++++++++-------- .../resources/mapper/ProjectMemberMapper.xml | 2 +- 2 files changed, 140 insertions(+), 106 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java index cdb1428..1c03097 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java @@ -18,6 +18,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -50,11 +51,22 @@ public class ProjectMemberServiceImpl extends ServiceImpl list = this.baseMapper.queryTeamMembers(query); + // 按用户ID去重,保留第一个记录 + Map uniqueMembers = list.stream() + .collect(Collectors.toMap( + ProjectMemberResp::getUserId, + member -> member, + (existing, replacement) -> existing // 如果有重复,保留第一个 + )); + + // 转换为列表 + List uniqueList = new ArrayList<>(uniqueMembers.values()); + // 丰富成员信息 - enrichMemberInfo(list); + enrichMemberInfo(uniqueList); // 返回分页结果 - return PageResult.ok(list); + return PageResult.ok(uniqueList); } /** @@ -86,43 +98,81 @@ public class ProjectMemberServiceImpl extends ServiceImpl teamMembers = members.stream() - .map(member -> { - ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp teamMember = new ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp(); - // 先复制所有同名字段 - BeanUtil.copyProperties(member, teamMember); - // 手动处理字段名不一致的字段 - teamMember.setUserName(member.getName()); // name -> userName - return teamMember; - }) + .collect(Collectors.toMap( + ProjectMemberResp::getUserId, // 按用户ID去重 + member -> { + ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp teamMember = new ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp(); + // 先复制所有同名字段 + BeanUtil.copyProperties(member, teamMember); + // 手动处理字段名不一致的字段 + teamMember.setUserName(member.getName()); // name -> userName + return teamMember; + }, + (existing, replacement) -> existing // 如果有重复,保留第一个 + )) + .values() + .stream() .collect(Collectors.toList()); item.setTeamMembers(teamMembers); diff --git a/core/src/main/resources/mapper/ProjectMemberMapper.xml b/core/src/main/resources/mapper/ProjectMemberMapper.xml index 81892d0..9d2ef2e 100644 --- a/core/src/main/resources/mapper/ProjectMemberMapper.xml +++ b/core/src/main/resources/mapper/ProjectMemberMapper.xml @@ -4,7 +4,7 @@