From 6398a28974c3f5608b02cfea12ecc6e822d61a8d Mon Sep 17 00:00:00 2001 From: zt Date: Wed, 15 Oct 2025 20:36:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/DesDesignChangeServiceImpl.java | 3 +- .../impl/DesVolumeFileServiceImpl.java | 18 +- .../service/impl/MatMaterialsServiceImpl.java | 2 + .../app/BusWorkWageAppController.java | 51 ++++ .../dto/workwage/BusWorkWageQueryReq.java | 3 + .../domain/vo/workwage/BusWorkWageVo.java | 8 + .../service/impl/BusLeaveServiceImpl.java | 1 + .../impl/BusReissueCardServiceImpl.java | 12 +- .../controller/HseFileFolderController.java | 22 +- .../dto/fileFolder/FileFolderCreateDTO.java | 8 + .../domain/dto/fileFolder/ListQueryDto.java | 4 + .../safety/service/IHseFileFolderService.java | 13 + .../impl/HseFileFolderServiceImpl.java | 285 +++++++++++++++++- .../mapper/safety/HseFileFolderMapper.xml | 2 +- 14 files changed, 404 insertions(+), 28 deletions(-) create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/app/BusWorkWageAppController.java diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesDesignChangeServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesDesignChangeServiceImpl.java index 30ccf7cc..709abae7 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesDesignChangeServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesDesignChangeServiceImpl.java @@ -628,6 +628,7 @@ public class DesDesignChangeServiceImpl extends ServiceImpl wrapper = new LambdaUpdateWrapper<>(); wrapper.set(DesVolumeFile::getType, DesVolumeFile.WASTE) + .eq(DesVolumeFile::getType, DesVolumeFile.BLUEPRINT) .eq(DesVolumeFile::getVolumeCatalogId, volumeCatalog.getDesign()); String saveFile = designChange.getSaveFile(); if (StringUtils.isNotBlank(saveFile)) { @@ -658,7 +659,7 @@ public class DesDesignChangeServiceImpl extends ServiceImpl blueprintFiles = baseMapper.selectList(new LambdaQueryWrapper() diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsServiceImpl.java index c3272099..8c8b6ab9 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/materials/service/impl/MatMaterialsServiceImpl.java @@ -330,6 +330,8 @@ public class MatMaterialsServiceImpl extends ServiceImpl> list(BusWorkWageQueryReq req) { + return R.ok(busWorkWageService.queryList(req)); + } + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/workwage/BusWorkWageQueryReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/workwage/BusWorkWageQueryReq.java index 6004064d..425352fb 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/workwage/BusWorkWageQueryReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/workwage/BusWorkWageQueryReq.java @@ -1,6 +1,8 @@ package org.dromara.project.domain.dto.workwage; import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; import java.io.Serial; import java.io.Serializable; @@ -31,6 +33,7 @@ public class BusWorkWageQueryReq implements Serializable { */ private String workType; + /** * 是否是特种兵(1是 2否) */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/workwage/BusWorkWageVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/workwage/BusWorkWageVo.java index cccae135..8a2ba1b1 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/workwage/BusWorkWageVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/workwage/BusWorkWageVo.java @@ -6,6 +6,8 @@ import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; import org.dromara.project.domain.BusWorkWage; import java.io.Serial; @@ -47,6 +49,12 @@ public class BusWorkWageVo implements Serializable { @ExcelDictFormat(dictType = "type_of_work") private String workType; + /** + * 工种 + */ + @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "workType",other = "type_of_work") + private String workTypeName; + /** * 是否是特种兵(1是 2否) */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusLeaveServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusLeaveServiceImpl.java index 3b8132e6..60fb1112 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusLeaveServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusLeaveServiceImpl.java @@ -505,6 +505,7 @@ public class BusLeaveServiceImpl extends ServiceImpl @Override public TableDataInfo listByLoginUser(BusLeaveQueryReq req, PageQuery pageQuery) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.orderByDesc(BusLeave::getCreateTime); lqw.eq(ObjectUtils.isNotEmpty(req.getUserId()), BusLeave::getUserId, req.getUserId()); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusReissueCardServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusReissueCardServiceImpl.java index 74040f47..1db35ad8 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusReissueCardServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusReissueCardServiceImpl.java @@ -214,9 +214,9 @@ public class BusReissueCardServiceImpl extends ServiceImpl { try { chatServerHandler.sendSystemMessageToUser(bean.getUserId(),"补卡申请已通过","1"); @@ -511,9 +511,9 @@ public class BusReissueCardServiceImpl extends ServiceImpl { try { chatServerHandler.sendSystemMessageToUser(bean.getUserId(),"补卡申请已通过","1"); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/HseFileFolderController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/HseFileFolderController.java index f1ca736c..f808546b 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/HseFileFolderController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/HseFileFolderController.java @@ -13,6 +13,7 @@ import org.dromara.safety.domain.dto.fileFolder.FileFolderCreateDTO; import org.dromara.safety.domain.dto.fileFolder.FileFolderMoveDTO; import org.dromara.safety.domain.dto.fileFolder.ListQueryDto; import org.dromara.safety.domain.vo.fileFolder.FileFolderTreeVO; +import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; @@ -29,6 +30,7 @@ import org.dromara.safety.domain.vo.HseFileFolderVo; import org.dromara.safety.domain.bo.HseFileFolderBo; import org.dromara.safety.service.IHseFileFolderService; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; /** * 会议纪要 @@ -61,6 +63,7 @@ public class HseFileFolderController extends BaseController { // 1. 查询所有子项(利用path前缀匹配,一次性加载所有层级) List allItems = hseFileFolderService.list(new LambdaQueryWrapper() + .eq(HseFileFolder::getProjectId, dto.getProjectId()) .like(HseFileFolder::getPath, "," + dto.getParentId() + ",") // 包含父ID的所有子项 .eq(dto.getType()!=null,HseFileFolder::getType, dto.getType()) .orderByDesc(HseFileFolder::getId) @@ -122,8 +125,25 @@ public class HseFileFolderController extends BaseController { return R.ok(hseFileFolderService.moveFileOrFolder(dto.getId(), dto.getTargetParentId())); } + /** + * 上传ZIP文件并自动解压到指定目录(支持多层级) + */ + @PostMapping("/uploadAndUnzip") + public R uploadAndUnzip( + @RequestParam("file") MultipartFile file, + @RequestParam("parentId") Long parentId, + @RequestParam("projectId") Long projectId) { - + try { + // 实际应用中,userId和deptId通常从登录信息中获取 + String result = hseFileFolderService.uploadAndUnzip(file, parentId, projectId); + return R.ok(result); + } catch (IllegalArgumentException e) { + return R.fail(e.getMessage()); + } catch (Exception e) { + return R.fail("文件处理失败:" + e.getMessage()); + } + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/fileFolder/FileFolderCreateDTO.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/fileFolder/FileFolderCreateDTO.java index ed883521..6761b24b 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/fileFolder/FileFolderCreateDTO.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/fileFolder/FileFolderCreateDTO.java @@ -16,6 +16,8 @@ public class FileFolderCreateDTO { @NotBlank(message = "名称不能为空") private String name; + private Long projectId; + /** * 父级ID(0表示根目录) */ @@ -32,6 +34,12 @@ public class FileFolderCreateDTO { */ private Integer sort=0; + + /** + * 文件id + */ + private Long fileId; + /** * 文件后缀 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/fileFolder/ListQueryDto.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/fileFolder/ListQueryDto.java index b0f9a631..fa43cee7 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/fileFolder/ListQueryDto.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/domain/dto/fileFolder/ListQueryDto.java @@ -19,4 +19,8 @@ public class ListQueryDto { private Integer type; + @NotNull(message = "项目不能为空") + private Long projectId; + + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/IHseFileFolderService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/IHseFileFolderService.java index 178923bf..07fb38de 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/IHseFileFolderService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/IHseFileFolderService.java @@ -9,6 +9,8 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; + import java.util.Collection; import java.util.List; @@ -87,4 +89,15 @@ public interface IHseFileFolderService extends IService{ * 移动文件或文件夹到指定目录 */ boolean moveFileOrFolder(Long id, Long targetParentId); + + /** + * 上传并解压ZIP文件 + */ + String uploadAndUnzip(MultipartFile file, Long parentId, Long projectId) throws Exception; + + /** + * 获取指定目录的树形结构(一次性加载所有层级) + * @return 树形结构列表 + */ + String unzip(Long id, Long parentId); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseFileFolderServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseFileFolderServiceImpl.java index 5f3cb302..9375b72e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseFileFolderServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseFileFolderServiceImpl.java @@ -19,11 +19,14 @@ import org.dromara.safety.domain.HseFileFolder; import org.dromara.safety.mapper.HseFileFolderMapper; import org.dromara.safety.service.IHseFileFolderService; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; -import java.util.Collection; +import java.io.File; +import java.io.FileInputStream; +import java.nio.charset.Charset; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; /** * 会议纪要Service业务层处理 @@ -44,7 +47,7 @@ public class HseFileFolderServiceImpl extends ServiceImpl ids, Boolean isValid) { - if(isValid){ + if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; @@ -151,8 +154,9 @@ public class HseFileFolderServiceImpl extends ServiceImpl folderQuery = Wrappers.lambdaQuery(); + folderQuery.eq(HseFileFolder::getProjectId, projectId) + .eq(HseFileFolder::getParentId, currentParentId) + .eq(HseFileFolder::getName, folderName) + .eq(HseFileFolder::getType, 1); // 文件夹类型 + + HseFileFolder existingFolder = getOne(folderQuery); + + if (existingFolder == null) { + // 创建新的文件夹 + HseFileFolder newFolder = new HseFileFolder(); + newFolder.setProjectId(projectId); + newFolder.setName(folderName); + newFolder.setParentId(currentParentId); + newFolder.setType(1); // 文件夹 + newFolder.setLevel(parentLevel + i + 1); + newFolder.setSort(0); + newFolder.setPath(currentPath); + + // 先保存获取ID + save(newFolder); + + // 更新路径,格式为 ,parentId,childId, + newFolder.setPath(currentPath + newFolder.getId() + ","); + updateById(newFolder); + + currentParentId = newFolder.getId(); + currentPath = newFolder.getPath(); + folderCount++; + } else { + currentParentId = existingFolder.getId(); + currentPath = existingFolder.getPath(); + } + } + + // 创建文件记录 + HseFileFolder fileRecord = new HseFileFolder(); + fileRecord.setProjectId(projectId); + fileRecord.setName(fileName); + fileRecord.setParentId(currentParentId); + fileRecord.setType(2); // 文件类型 + fileRecord.setLevel(parentLevel + pathParts.length); + // 文件路径格式为 ,parentId,fileId, + fileRecord.setPath(currentPath + fileRecord.getId() + ","); + + // 设置文件扩展名 + int dotIndex = fileName.lastIndexOf("."); + if (dotIndex > 0 && dotIndex < fileName.length() - 1) { + fileRecord.setFileSuffix(fileName.substring(dotIndex + 1)); + } + + // TODO: 这里应该与实际文件存储服务集成,设置真实的文件路径 + fileRecord.setFilePath(""); // 实际应用中应设置真实文件存储路径 + + save(fileRecord); + + // 更新文件的路径(因为ID是自增的,需要先保存再更新路径) + fileRecord.setPath(currentPath + fileRecord.getId() + ","); + updateById(fileRecord); + + fileCount++; + + zis.closeEntry(); + } + } + + return String.format("解压完成,共创建 %d 个文件夹,%d 个文件", folderCount, fileCount); + } + + + @Override + @Transactional + public String unzip(Long id, Long parentId) { + // 1. 参数验证 + if (id == null) { + throw new ServiceException("文件ID不能为空"); + } + + // 2. 获取要解压的ZIP文件 + HseFileFolder zipFile = getById(id); + if (zipFile == null) { + throw new ServiceException("指定的文件不存在"); + } + + // 3. 验证是否为ZIP文件 + if (!"zip".equalsIgnoreCase(zipFile.getFileSuffix())) { + throw new ServiceException("只能解压ZIP格式的文件"); + } + + // 4. 验证文件路径是否存在 + if (StringUtils.isBlank(zipFile.getFilePath())) { + throw new ServiceException("文件存储路径不存在"); + } + + // 5. 验证目标目录是否存在且为文件夹 + HseFileFolder parentFolder = null; + if (parentId != null && parentId != 0) { + parentFolder = getById(parentId); + if (parentFolder == null || parentFolder.getType() != 1) { + throw new ServiceException("指定的目标目录不存在或不是文件夹"); + } + } + + // 6. 下载ZIP文件到临时位置 + try { + // 从URL下载文件 + String fileUrl = zipFile.getFilePath(); + File tempZipFile = downloadFileToTemp(fileUrl); + + if (tempZipFile == null || !tempZipFile.exists()) { + throw new ServiceException("下载文件失败"); + } + + try { + // 7. 解压ZIP文件 + String unzipResult = doUnzipFile(tempZipFile, parentId, zipFile.getProjectId(), parentFolder); + return unzipResult; + } finally { + // 8. 清理临时文件 + if (tempZipFile.exists()) { + tempZipFile.delete(); + } + } + } catch (Exception e) { + throw new ServiceException("解压文件失败: " + e.getMessage()); + } + } + + /** + * 从URL下载文件到临时位置 + * + * @param fileUrl 文件URL + * @return 临时文件 + * @throws Exception 下载过程中的异常 + */ + private File downloadFileToTemp(String fileUrl) throws Exception { + // 创建临时文件 + File tempFile = File.createTempFile("download_", ".zip"); + + // 使用Apache HttpClient或其他HTTP客户端下载文件 + // 这里简化处理,实际项目中应根据具体文件存储服务实现 + + // 示例实现(需要根据实际文件存储服务调整): + /* + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + HttpGet httpGet = new HttpGet(fileUrl); + try (CloseableHttpResponse response = httpClient.execute(httpGet)) { + HttpEntity entity = response.getEntity(); + if (entity != null) { + try (InputStream inputStream = entity.getContent(); + FileOutputStream outputStream = new FileOutputStream(tempFile)) { + byte[] buffer = new byte[8192]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + } + } + } + } + */ + + // 如果使用MinIO或其他存储服务,需要相应调整实现 + + // 占位实现,实际需要根据文件存储服务来实现 + throw new ServiceException("未实现文件下载功能,请根据实际文件存储服务完善此方法"); + } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/safety/HseFileFolderMapper.xml b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/safety/HseFileFolderMapper.xml index 2745bb26..f5b9356b 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/safety/HseFileFolderMapper.xml +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/safety/HseFileFolderMapper.xml @@ -13,6 +13,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_time = NOW() WHERE path LIKE CONCAT(#{oldPath}, '%') - AND parent_id != #{parentId} + AND id != #{parentId}