From 297c3fb486eec26d2df71e33ce05ac8601275901 Mon Sep 17 00:00:00 2001 From: zengchenxi Date: Sat, 13 Jan 2024 10:21:49 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E3=80=91=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=96=87=E4=BB=B6=E6=89=B9=E9=87=8F=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E4=BB=A5=E5=8F=8A=E5=AE=9E=E7=8E=B0+?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=9A=E5=8A=A1=E7=B1=BB=E5=9E=8B=E4=B8=8E?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/module/infra/api/file/FileApi.java | 11 ++ .../module/infra/api/file/FileApiImpl.java | 7 +- .../controller/admin/file/FileController.java | 14 +- .../admin/file/vo/file/FilePageReqVO.java | 22 ++- .../admin/file/vo/file/FileRespVO.java | 6 + .../file/vo/file/FileUploadBatchReqVO.java | 25 +++ .../admin/file/vo/file/FileUploadReqVO.java | 6 + .../app/file/AppFileController.java | 2 +- .../app/file/vo/AppFileUploadReqVO.java | 6 + .../infra/dal/dataobject/file/FileDO.java | 8 + .../infra/dal/mysql/file/FileMapper.java | 10 +- .../infra/service/file/FileService.java | 12 +- .../infra/service/file/FileServiceImpl.java | 4 +- mes-ui/mes-ui-admin-vue3/.env.base | 3 + mes-ui/mes-ui-admin-vue3/.env.dev | 3 + .../UploadFile/src/UploadFileBatch.vue | 149 ++++++++++++++++++ 16 files changed, 275 insertions(+), 13 deletions(-) create mode 100644 mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadBatchReqVO.java create mode 100644 mes-ui/mes-ui-admin-vue3/src/components/UploadFile/src/UploadFileBatch.vue diff --git a/mes-module-infra/mes-module-infra-api/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApi.java b/mes-module-infra/mes-module-infra-api/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApi.java index 2c6cffb4..660c3754 100644 --- a/mes-module-infra/mes-module-infra-api/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApi.java +++ b/mes-module-infra/mes-module-infra-api/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApi.java @@ -38,4 +38,15 @@ public interface FileApi { */ String createFile(String name, String path, byte[] content); + /** + * 保存文件,并返回文件的访问路径 + * @param name + * @param path + * @param content + * @param businessType + * @param businessId + * @return + */ + String createFile(String name, String path, byte[] content, String businessType, Long businessId); + } diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApiImpl.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApiImpl.java index 94a0ed7f..5beb1b24 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApiImpl.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApiImpl.java @@ -20,7 +20,12 @@ public class FileApiImpl implements FileApi { @Override public String createFile(String name, String path, byte[] content) { - return fileService.createFile(name, path, content); + return fileService.createFile(name, path, content, null, null); + } + + @Override + public String createFile(String name, String path, byte[] content, String businessType, Long businessId) { + return fileService.createFile(name, path, content, businessType, businessId); } } diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/FileController.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/FileController.java index c496fca7..b2f37da3 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/FileController.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/FileController.java @@ -10,6 +10,7 @@ import com.chanko.yunxi.mes.framework.common.util.servlet.ServletUtils; import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog; import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FilePageReqVO; import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FileRespVO; +import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FileUploadBatchReqVO; import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FileUploadReqVO; import com.chanko.yunxi.mes.module.infra.dal.dataobject.file.FileDO; import com.chanko.yunxi.mes.module.infra.service.file.FileService; @@ -47,7 +48,18 @@ public class FileController { public CommonResult uploadFile(FileUploadReqVO uploadReqVO) throws Exception { MultipartFile file = uploadReqVO.getFile(); String path = uploadReqVO.getPath(); - return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()))); + return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()), uploadReqVO.getBusinessType(), uploadReqVO.getBusinessId())); + } + + @PostMapping("/uploadBatch") + @Operation(summary = "上传文件(批量)") + @OperateLog(logArgs = false) // 上传文件,没有记录操作日志的必要 + public CommonResult uploadFileBatch(FileUploadBatchReqVO uploadReqVO) throws Exception { + MultipartFile[] files = uploadReqVO.getFiles(); + for (MultipartFile file : files) { + fileService.createFile(file.getOriginalFilename(), null, IoUtil.readBytes(file.getInputStream()), uploadReqVO.getBusinessType(), uploadReqVO.getBusinessId()); + } + return success(null); } @DeleteMapping("/delete") diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FilePageReqVO.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FilePageReqVO.java index 3bb1df8c..6935eb7f 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FilePageReqVO.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FilePageReqVO.java @@ -17,12 +17,30 @@ import static com.chanko.yunxi.mes.framework.common.util.date.DateUtils.FORMAT_Y @ToString(callSuper = true) public class FilePageReqVO extends PageParam { - @Schema(description = "文件路径,模糊匹配", example = "mes") + @Schema(description = "配置编号", example = "6911") + private Long configId; + + @Schema(description = "业务类型 用于业务关联", example = "1") + private String businessType; + + @Schema(description = "业务id", example = "18052") + private Long businessId; + + @Schema(description = "文件名", example = "芋艿") + private String name; + + @Schema(description = "文件路径") private String path; - @Schema(description = "文件类型,模糊匹配", example = "jpg") + @Schema(description = "文件 URL", example = "https://www.iocoder.cn") + private String url; + + @Schema(description = "文件类型", example = "1") private String type; + @Schema(description = "文件大小") + private Integer size; + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00, 2022-07-01 23:59:59]") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileRespVO.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileRespVO.java index 69624a8e..04baaf88 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileRespVO.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileRespVO.java @@ -15,6 +15,12 @@ public class FileRespVO { @Schema(description = "配置编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11") private Long configId; + @Schema(description = "业务类型 用于业务关联", example = "1") + private String businessType; + + @Schema(description = "业务id", example = "18052") + private Long businessId; + @Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED, example = "mes.jpg") private String path; diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadBatchReqVO.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadBatchReqVO.java new file mode 100644 index 00000000..086ba3ce --- /dev/null +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadBatchReqVO.java @@ -0,0 +1,25 @@ +package com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 上传文件 Request VO") +@Data +public class FileUploadBatchReqVO { + + @Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "上传文件不能为空") + @NotEmpty(message = "上传文件不能为空") + private MultipartFile[] files; + + @Schema(description = "文件业务类型") + private String businessType; + + @Schema(description = "文件业务id") + private Long businessId; + +} diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadReqVO.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadReqVO.java index 392d96cf..8f60a19b 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadReqVO.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadReqVO.java @@ -17,4 +17,10 @@ public class FileUploadReqVO { @Schema(description = "文件附件", example = "mesyuanma.png") private String path; + @Schema(description = "文件业务类型") + private String businessType; + + @Schema(description = "文件业务id") + private Long businessId; + } diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/AppFileController.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/AppFileController.java index a1b39f36..b13e0b51 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/AppFileController.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/AppFileController.java @@ -32,7 +32,7 @@ public class AppFileController { public CommonResult uploadFile(AppFileUploadReqVO uploadReqVO) throws Exception { MultipartFile file = uploadReqVO.getFile(); String path = uploadReqVO.getPath(); - return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()))); + return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()), uploadReqVO.getBusinessType(), uploadReqVO.getBusinessId())); } } diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/vo/AppFileUploadReqVO.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/vo/AppFileUploadReqVO.java index eb8e3734..1c9e220b 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/vo/AppFileUploadReqVO.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/vo/AppFileUploadReqVO.java @@ -14,6 +14,12 @@ public class AppFileUploadReqVO { @NotNull(message = "文件附件不能为空") private MultipartFile file; + @Schema(description = "文件业务类型") + private String businessType; + + @Schema(description = "文件业务id") + private Long businessId; + @Schema(description = "文件附件", example = "mesyuanma.png") private String path; diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/dal/dataobject/file/FileDO.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/dal/dataobject/file/FileDO.java index 5a875efb..7ff0e629 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/dal/dataobject/file/FileDO.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/dal/dataobject/file/FileDO.java @@ -31,6 +31,14 @@ public class FileDO extends BaseDO { * 关联 {@link FileConfigDO#getId()} */ private Long configId; + /** + * 业务类型 用于业务关联 + */ + private String businessType; + /** + * 业务id + */ + private Long businessId; /** * 原文件名 */ diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/dal/mysql/file/FileMapper.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/dal/mysql/file/FileMapper.java index 1db364a0..8df37ab2 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/dal/mysql/file/FileMapper.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/dal/mysql/file/FileMapper.java @@ -17,8 +17,14 @@ public interface FileMapper extends BaseMapperX { default PageResult selectPage(FilePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(FileDO::getPath, reqVO.getPath()) - .likeIfPresent(FileDO::getType, reqVO.getType()) + .eqIfPresent(FileDO::getConfigId, reqVO.getConfigId()) + .eqIfPresent(FileDO::getBusinessType, reqVO.getBusinessType()) + .eqIfPresent(FileDO::getBusinessId, reqVO.getBusinessId()) + .likeIfPresent(FileDO::getName, reqVO.getName()) + .eqIfPresent(FileDO::getPath, reqVO.getPath()) + .eqIfPresent(FileDO::getUrl, reqVO.getUrl()) + .eqIfPresent(FileDO::getType, reqVO.getType()) + .eqIfPresent(FileDO::getSize, reqVO.getSize()) .betweenIfPresent(FileDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(FileDO::getId)); } diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileService.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileService.java index 12ed631a..8966e109 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileService.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileService.java @@ -1,7 +1,7 @@ package com.chanko.yunxi.mes.module.infra.service.file; -import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FilePageReqVO; import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FilePageReqVO; import com.chanko.yunxi.mes.module.infra.dal.dataobject.file.FileDO; /** @@ -22,12 +22,14 @@ public interface FileService { /** * 保存文件,并返回文件的访问路径 * - * @param name 文件名称 - * @param path 文件路径 - * @param content 文件内容 + * @param name 文件名称 + * @param path 文件路径 + * @param content 文件内容 + * @param businessType + * @param businessId * @return 文件路径 */ - String createFile(String name, String path, byte[] content); + String createFile(String name, String path, byte[] content, String businessType, Long businessId); /** * 删除文件 diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileServiceImpl.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileServiceImpl.java index c1fa8040..787cab51 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileServiceImpl.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileServiceImpl.java @@ -38,7 +38,7 @@ public class FileServiceImpl implements FileService { @Override @SneakyThrows - public String createFile(String name, String path, byte[] content) { + public String createFile(String name, String path, byte[] content, String businessType, Long businessId) { // 计算默认的 path 名 String type = FileTypeUtils.getMineType(content, name); if (StrUtil.isEmpty(path)) { @@ -56,6 +56,8 @@ public class FileServiceImpl implements FileService { // 保存到数据库 FileDO file = new FileDO(); + file.setBusinessId(businessId); + file.setBusinessType(businessType); file.setConfigId(client.getId()); file.setName(name); file.setPath(path); diff --git a/mes-ui/mes-ui-admin-vue3/.env.base b/mes-ui/mes-ui-admin-vue3/.env.base index ab4c5d83..f8f0caa3 100644 --- a/mes-ui/mes-ui-admin-vue3/.env.base +++ b/mes-ui/mes-ui-admin-vue3/.env.base @@ -9,6 +9,9 @@ VITE_BASE_URL='http://192.168.0.137:8080' # 上传路径 VITE_UPLOAD_URL='http://192.168.0.137:8080/admin-api/infra/file/upload' +# 上传路径 +VITE_UPLOAD_BATCH_URL='http://192.168.0.137:8080/admin-api/infra/file/uploadBatch' + # 接口前缀 VITE_API_BASEPATH=/dev-api diff --git a/mes-ui/mes-ui-admin-vue3/.env.dev b/mes-ui/mes-ui-admin-vue3/.env.dev index da371c70..d4b18af8 100644 --- a/mes-ui/mes-ui-admin-vue3/.env.dev +++ b/mes-ui/mes-ui-admin-vue3/.env.dev @@ -9,6 +9,9 @@ VITE_BASE_URL='http://222.71.165.187:9010' # 上传路径 VITE_UPLOAD_URL='http://222.71.165.187:9010/admin-api/infra/file/upload' +# 上传路径 +VITE_UPLOAD_BATCH_URL='http://222.71.165.187:9010/admin-api/infra/file/uploadBatch' + # 接口前缀 VITE_API_BASEPATH=/dev-api diff --git a/mes-ui/mes-ui-admin-vue3/src/components/UploadFile/src/UploadFileBatch.vue b/mes-ui/mes-ui-admin-vue3/src/components/UploadFile/src/UploadFileBatch.vue new file mode 100644 index 00000000..1cfe25a1 --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/components/UploadFile/src/UploadFileBatch.vue @@ -0,0 +1,149 @@ + + +