diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/manager/FileRelationManager.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/manager/FileRelationManager.java new file mode 100644 index 00000000..1f72d57e --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/manager/FileRelationManager.java @@ -0,0 +1,233 @@ +package com.ruoyi.web.controller.manager; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.config.ServerConfig; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.file.FileUploadUtils; +import com.ruoyi.common.utils.file.FileUtils; +import com.ruoyi.system.domain.file.TdFileRelation; +import com.ruoyi.system.service.file.TdFileRelationService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * packageName com.hyp.web.controller.manager + * + * @author wangxy + * @version JDK 8 + * @className FileRelationManager + * @date 2024/4/12 + * @description 文件 + */ +@Component +public class FileRelationManager { + + @Resource + private TdFileRelationService fileRelationService; + + + @Resource + private ServerConfig serverConfig; + + /** + * 未通过 + * + */ + private static final Integer FILE_STATE_WTG = 2; + + /** + * + * 删除文件 + * @return boolean + */ + public boolean delFile(String fileId){ + TdFileRelation fileRelation = fileRelationService.getById(fileId); + if(Objects.isNull(fileRelation)){ + throw new ServiceException("文件不存在"); + } + FileUtil.del(fileRelation.getFilePath()); + return fileRelationService.removeById(fileId); + + } + /** + * + * 材料审核 + * @param applyId + * @param fileCode + * @param fileState + * @return boolean + */ + public boolean filePass( String applyId, String fileCode, Integer fileState){ + return fileRelationService.lambdaUpdate() + .eq(TdFileRelation::getApplyId,applyId) + .eq(TdFileRelation::getFileCode,fileCode) + .set(TdFileRelation::getFileState,fileState) + .update(); + + + } + + /** + * + * 材料审核 + * @param fileId + * @param fileState + * @return boolean + */ + public boolean pass( String fileId, Integer fileState){ + return fileRelationService.lambdaUpdate() + .eq(TdFileRelation::getFileId,fileId) + .set(TdFileRelation::getFileState,fileState) + .update(); + } + + /** + * + * 验证文件是否审查 + * @param applyId + * @return com.hyp.common.core.domain.AjaxResult + */ + public AjaxResult checkFile(String applyId){ + List list = fileRelationService.lambdaQuery() + .eq(TdFileRelation::getApplyId, applyId) + .list(); + if(CollUtil.isNotEmpty(list)){ + for(TdFileRelation rewFileRelation : list){ + if(Objects.equals(rewFileRelation.getFileState(),FILE_STATE_WTG) || Objects.isNull(rewFileRelation.getFileState())){ + return AjaxResult.error("材料存在未审核情况,请检查"); + } + } + } + return AjaxResult.success(); + } + + /** + * + * 单个保存 + * @param applyId + * @param filename + * @param fileCode + * @param url + * @param originalFilename + * @return com.hyp.system.domain.RewFileRelation + */ + @Transactional(rollbackFor = Exception.class) + public TdFileRelation save(String applyId,String filename,String fileCode,String url,String originalFilename){ + TdFileRelation rewFileRelation = new TdFileRelation(); + rewFileRelation.setApplyId(applyId); + rewFileRelation.setFileName(filename); + rewFileRelation.setFileCode(fileCode); + rewFileRelation.setFilePath(url); + rewFileRelation.setRealName(originalFilename); + fileRelationService.save(rewFileRelation); + return rewFileRelation; + } + + + + /** + * + * 批量保存文件 + * @param files + * @param applyId + * @param filename + * @param fileCode + * @return java.util.List + */ + @Transactional(rollbackFor = Exception.class) + public List saveBatch(List files, + String applyId, + String filename, + String fileCode) throws IOException { + List fileRelations = new ArrayList<>(); + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + for (MultipartFile file : files) { + if (!file.isEmpty()) { + // 上传并返回新文件名称 + String fileNames = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileNames; + if(StringUtils.isBlank(filename)){ + filename = fileNames; + } + TdFileRelation rewFileRelation = new TdFileRelation(); + rewFileRelation.setApplyId(applyId); + rewFileRelation.setFileName(filename); + rewFileRelation.setFileCode(fileCode); + rewFileRelation.setFilePath(url); + rewFileRelation.setRealName(FileUtils.getNameNotSuffix(file.getOriginalFilename())); + fileRelations.add(rewFileRelation); + } + } + fileRelationService.saveBatch(fileRelations); + return fileRelations; + } + + /** + * + * 获取文件路劲 + * @param fileId + * @return java.lang.String + */ + public String getFilePath(String fileId){ + TdFileRelation fileRelation = fileRelationService.getById(fileId); + if(Objects.nonNull(fileRelation)){ + return fileRelation.getFilePath(); + } + return null; + } + + /** + * + * 获取文件名 + * @param fileId + * @return java.lang.String + */ + public String getRealName(String fileId){ + TdFileRelation fileRelation = fileRelationService.getById(fileId); + if(Objects.nonNull(fileRelation)){ + return fileRelation.getRealName(); + } + return null; + } + + /** + * + * 文件列表啥 + * @param applyId + * @param fileCode + * @return java.util.List + */ + public List getFileInfo(String applyId,String fileCode){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TdFileRelation::getApplyId,applyId); + queryWrapper.eq(Objects.nonNull(fileCode), TdFileRelation::getFileCode, fileCode); + return fileRelationService.list(queryWrapper); + } + + + /** + * + * 文件列表啥 + * @return java.util.List + */ + public TdFileRelation getRewFileRelation(String fileId){ + return fileRelationService.getById(fileId); + } + + + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/file/FileRelationController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/file/FileRelationController.java new file mode 100644 index 00000000..300a856f --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/file/FileRelationController.java @@ -0,0 +1,196 @@ +package com.ruoyi.web.controller.system.file; + + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.config.ServerConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.file.FileUploadUtils; +import com.ruoyi.common.utils.file.FileUtils; +import com.ruoyi.system.domain.file.TdFileRelation; +import com.ruoyi.web.controller.manager.FileRelationManager; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.List; +import java.util.Objects; + + +/** + * packageName com.hyp.web.controller.reward + * + * @author wangxy + * @version JDK 8 + * @className FileRelationController + * @date 2024/4/12 + * @description 文件 + */ +@Api("文件") +@RestController +@RequestMapping("/system/file") +@Slf4j +public class FileRelationController extends BaseController { + + + @Resource + private FileRelationManager fileRelationManager; + + @Resource + private ServerConfig serverConfig; + + @ApiOperation("文件上传") + @PostMapping("/upload") + public AjaxResult uploadFile(MultipartFile file, + @RequestParam String applyId, + @RequestParam(required = false) String filename, + @RequestParam String fileCode) { + try { + if(file.isEmpty()){ + throw new ServiceException("上传文件不能为空"); + } + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + // 上传并返回新文件名称 + String fileNames = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileNames; + if(StringUtils.isBlank(filename)){ + filename = fileNames; + } + String originalFilename = FileUtils.getNameNotSuffix(file.getOriginalFilename()) ; + return AjaxResult.success(fileRelationManager.save(applyId,filename,fileCode,url,originalFilename)); + } catch (Exception e) { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 通用上传请求(多个) + */ + @ApiOperation("多文件上传") + @PostMapping("/uploads") + public AjaxResult uploadFiles(List files, + @RequestParam String applyId, + @RequestParam(required = false) String filename, + @RequestParam String fileCode){ + try { + return AjaxResult.success(fileRelationManager.saveBatch(files,applyId,filename,fileCode)); + } catch (Exception e) { + return AjaxResult.error(e.getMessage()); + } + } + + @ApiOperation("材料预览") + @GetMapping("fileView/{fileId}") + public void fileView(@PathVariable String fileId, HttpServletResponse response) throws IOException { + String filePath = fileRelationManager.getFilePath(fileId); + String fileName = fileRelationManager.getRealName(fileId); + String encodedFileName = new String(fileName.getBytes(StandardCharsets.UTF_8),StandardCharsets.ISO_8859_1); + InputStream in = null; + OutputStream out = null; + try { + response.setHeader("content-disposition", "attachment;filename=" + encodedFileName + ".pdf"); + // 设置文件ContentType类型,这样设置,会自动判断下载文件类型 + response.setContentType("application/octet-stream;charset=utf-8"); + File file = new File(filePath); + in = Files.newInputStream(file.toPath()); + // 从response对象获取输出流 + out = response.getOutputStream(); + // 将输入流中的数据读取出来,写到输出流中 + for (int b = -1; (b = in.read()) != -1; ) { + out.write(b); + } + } catch (Exception e) { + log.error("获取文件流失败:", e.getMessage(), e); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } finally { + if (out != null) { + out.close(); + } + } + } + } + } + + @ApiOperation("材料删除") + @Log(title = "材料删除", businessType = BusinessType.DELETE) + @GetMapping("/delFile/{fileId}") + public AjaxResult delFile(@PathVariable String fileId){ + return toAjax(fileRelationManager.delFile(fileId)); + } + + + @ApiOperation("材料审核通过id") + @GetMapping("/filePass") + public AjaxResult pass(@RequestParam String fileId, + @RequestParam Integer fileState){ + return toAjax(fileRelationManager.pass(fileId,fileState)); + } + + + @ApiOperation("材料校验") + @GetMapping("/checkFile/{applyId}") + public AjaxResult checkFile(@PathVariable String applyId){ + return fileRelationManager.checkFile(applyId); + } + + @ApiOperation("文件查询") + @GetMapping("/getFileInfo") + public AjaxResult getFileInfo(@RequestParam String applyId, + @RequestParam(required = false) String fileCode) { + return success(fileRelationManager.getFileInfo(applyId,fileCode)); + } + + @ApiOperation("文件下载") + @GetMapping("/download") + public void fileDownload(String fileId, HttpServletResponse response, HttpServletRequest request) { + try { + TdFileRelation rewFileRelation = fileRelationManager.getRewFileRelation(fileId); + if(Objects.isNull(rewFileRelation)){ + throw new ServiceException("下载文件不存在"); + } + String fileName = rewFileRelation.getFilePath(); + if (!FileUtils.checkAllowDownload(fileName)) { + throw new ServiceException(com.ruoyi.common.utils.StringUtils.format("资源文件({})非法,不允许下载。 ", fileName)); + } + // 本地资源路径 + String localPath = RuoYiConfig.getProfile(); + // 数据库资源地址 + String downloadPath = localPath + StringUtils.substringAfter(fileName, Constants.RESOURCE_PREFIX); + // 下载名称 + String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, downloadName); + FileUtils.writeBytes(downloadPath, response.getOutputStream()); + } catch (Exception e) { + log.error("下载文件失败", e); + } + } + + + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/file/TdFileRelation.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/file/TdFileRelation.java new file mode 100644 index 00000000..6227dd04 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/file/TdFileRelation.java @@ -0,0 +1,49 @@ +package com.ruoyi.system.domain.file; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author 13560 + * 奖项文件表 + * @TableName td_file_relation + */ +@Data +public class TdFileRelation implements Serializable { + /** + * 主键 + */ + @TableId + private String fileId; + + /** + * sm人员表id + */ + private String applyId; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 文件类型 + */ + private String fileCode; + + /** + * 文件路劲 + */ + private String filePath; + + /** + * 文件原有名称 + */ + private String realName; + + /** + * 文件核准状态(1:通过2:不通过) + */ + private Integer fileState; +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/file/TdFileRelationMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/file/TdFileRelationMapper.java new file mode 100644 index 00000000..002c107c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/file/TdFileRelationMapper.java @@ -0,0 +1,18 @@ +package com.ruoyi.system.mapper.file; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.system.domain.file.TdFileRelation; + +/** +* @author Administrator +* @description 针对表【td_file_relation(奖项文件表)】的数据库操作Mapper +* @createDate 2025-05-14 08:44:27 +* @Entity generator.domain.TdFileRelation +*/ +public interface TdFileRelationMapper extends BaseMapper { + +} + + + + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/file/TdFileRelationService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/file/TdFileRelationService.java new file mode 100644 index 00000000..5480c2d6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/file/TdFileRelationService.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.service.file; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.system.domain.file.TdFileRelation; + +/** +* @author Administrator +* @description 针对表【td_file_relation(奖项文件表)】的数据库操作Service +* @createDate 2025-05-14 08:44:27 +*/ +public interface TdFileRelationService extends IService { + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/file/impl/TdFileRelationServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/file/impl/TdFileRelationServiceImpl.java new file mode 100644 index 00000000..ee13f783 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/file/impl/TdFileRelationServiceImpl.java @@ -0,0 +1,22 @@ +package com.ruoyi.system.service.file.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.system.domain.file.TdFileRelation; +import com.ruoyi.system.mapper.file.TdFileRelationMapper; +import com.ruoyi.system.service.file.TdFileRelationService; +import org.springframework.stereotype.Service; + +/** +* @author Administrator +* @description 针对表【td_file_relation(奖项文件表)】的数据库操作Service实现 +* @createDate 2025-05-14 08:44:27 +*/ +@Service +public class TdFileRelationServiceImpl extends ServiceImpl + implements TdFileRelationService { + +} + + + + diff --git a/ruoyi-system/src/main/resources/mapper/system/file/TdFileRelationMapper.xml b/ruoyi-system/src/main/resources/mapper/system/file/TdFileRelationMapper.xml new file mode 100644 index 00000000..40fa4620 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/file/TdFileRelationMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + file_id,apply_id,file_name, + file_code,file_path,real_name, + file_state + +