From c079f6767af0d99f287fa136e9bbcbc3d79c3702 Mon Sep 17 00:00:00 2001 From: xudawei Date: Mon, 7 Apr 2025 15:37:12 +0800 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20(REQ-3540)=20=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=9A=84fileKey=E9=A2=84=E8=A7=88=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doc/integration/DocOssGateway.java | 18 +++++ .../nanopart/doc/wps/support/OssSupport.java | 80 +++++++++++++++++++ .../doc/wps/wpsbase/WpsBaseManager.java | 49 +++++------- 3 files changed, 120 insertions(+), 27 deletions(-) create mode 100644 doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/integration/DocOssGateway.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/integration/DocOssGateway.java index 5572f975..e288e22e 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/integration/DocOssGateway.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/integration/DocOssGateway.java @@ -8,6 +8,8 @@ import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest; import cn.axzo.oss.http.model.ApiSignUrlDownloadResponse; import cn.axzo.oss.http.model.ApiSignUrlUploadRequest; import cn.axzo.oss.http.model.ApiSignUrlUploadResponse; +import cn.axzo.oss.http.model.file.FetchFileInfoRequest; +import cn.axzo.oss.http.model.file.FetchFileInfoResponse; import cn.axzo.oss.http.model.file.UpdateFileInfoRequest; import cn.axzo.oss.http.model.file.UpdateFileInfoResponse; import cn.azxo.framework.common.model.CommonResponse; @@ -82,4 +84,20 @@ public class DocOssGateway { } + /** + * 获取文件基础信息 + */ + public FetchFileInfoResponse fetchFileInfo(FetchFileInfoRequest request) { + try { + log.info("DocOssGateway-fetchFileInfo request:{}", JSON.toJSONString(request)); + CommonResponse response = serverFileServiceApi.fetchFileInfo(request); + log.info("DocOssGateway-fetchFileInfo result:{}", JSON.toJSONString(response)); + return response.getData(); + } catch (Exception e) { + log.warn("DocOssGateway-fetchFileInfo exception", e); + throw new WpsException(WpsErrorCodeEnum.UPLOAD_ERROR); + } + + } + } diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java new file mode 100644 index 00000000..f9852a86 --- /dev/null +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java @@ -0,0 +1,80 @@ +package cn.axzo.nanopart.doc.wps.support; + +import cn.axzo.nanopart.doc.api.enums.WpsErrorCodeEnum; +import cn.axzo.nanopart.doc.api.wps.response.WpsFetchDownloadResponse; +import cn.axzo.nanopart.doc.api.wps.response.WpsFetchFileResponse; +import cn.axzo.nanopart.doc.integration.DocOssGateway; +import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest; +import cn.axzo.oss.http.model.ApiSignUrlDownloadResponse; +import cn.axzo.oss.http.model.file.FetchFileInfoRequest; +import cn.axzo.oss.http.model.file.FetchFileInfoResponse; +import cn.hutool.core.collection.CollectionUtil; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; + +/** + * @author xudawei@axzo.cn + * @date 2025/3/21 + * @description wps支持 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class OssSupport { + + private final DocOssGateway docOssGateway; + + public WpsFetchFileResponse fetchFileInfo(String fileKey) { + FetchFileInfoResponse response = docOssGateway.fetchFileInfo(FetchFileInfoRequest.builder().fileKey(fileKey).build()); + if (Objects.isNull(response) || Objects.isNull(response.getId())) { + return null; + } + return WpsFetchFileResponse.builder() + .docCode(response.getFileUuid()) + .name(response.getFileName()) + .version(1) + .size(response.getStorageSize()) + .createAt(response.getCreateAt()) + .updateAt(response.getUpdateAt()) + .creatorId(response.getCreateBy()) + .modifierId(response.getUpdateBy()) + .build(); + + } + + public WpsFetchDownloadResponse fetchDownload(String fileKey) { + FetchFileInfoResponse response = docOssGateway.fetchFileInfo(FetchFileInfoRequest.builder().fileKey(fileKey).build()); + if (Objects.isNull(response) || Objects.isNull(response.getId())) { + return null; + } + + return WpsFetchDownloadResponse.builder() + .url(this.downloadUrl(response.getFileUuid())) + .digest("") + .digestType("") + .headers(null) + .build(); + } + + /** + * 获取文件下载地址 + */ + public String downloadUrl(String fileKey) { + if (StringUtils.isEmpty(fileKey)) { + return StringUtils.EMPTY; + } + ApiSignUrlDownloadRequest request = new ApiSignUrlDownloadRequest(); + request.setFileKeys(Lists.newArrayList(fileKey)); + List responseList = docOssGateway.signUrlFetchDownload(request); + + WpsAssertUtil.isFalse(CollectionUtil.isEmpty(responseList) || StringUtils.isBlank(responseList.get(0).getSignUrl()), WpsErrorCodeEnum.UPLOAD_ERROR); + + return responseList.get(0).getSignUrl(); + } +} diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java index 80be71cc..59048773 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java @@ -1,14 +1,5 @@ package cn.axzo.nanopart.doc.wps.wpsbase; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import com.google.common.collect.Lists; - import cn.axzo.basics.common.util.AssertUtil; import cn.axzo.basics.profiles.dto.basic.PersonProfileDto; import cn.axzo.nanopart.doc.api.enums.WpsErrorCodeEnum; @@ -27,14 +18,19 @@ import cn.axzo.nanopart.doc.file.index.IndexManager; import cn.axzo.nanopart.doc.file.index.domain.NameUsedException; import cn.axzo.nanopart.doc.integration.DocOssGateway; import cn.axzo.nanopart.doc.integration.DocUserProfileGateway; +import cn.axzo.nanopart.doc.wps.support.OssSupport; import cn.axzo.nanopart.doc.wps.support.WpsAssertUtil; import cn.axzo.nanopart.doc.wps.support.WpsSupport; -import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest; -import cn.axzo.oss.http.model.ApiSignUrlDownloadResponse; import cn.axzo.oss.http.model.file.UpdateFileInfoRequest; import cn.axzo.oss.http.model.file.UpdateFileInfoResponse; import cn.hutool.core.collection.CollectionUtil; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; /** * wps对接基础信息 @@ -52,11 +48,19 @@ public class WpsBaseManager { private final DocPermissionProps docPermissionProps; private final WpsSupport wpsSupport; + + private final OssSupport ossSupport; /** * 获取文件基础信息 * @param docCode 文件编码 */ public WpsFetchFileResponse fetchFileBase(String docCode) { + + WpsFetchFileResponse wpsFetchFileResponse = ossSupport.fetchFileInfo(docCode); + if (Objects.nonNull(wpsFetchFileResponse) && Objects.nonNull(wpsFetchFileResponse.getDocCode())) { + return wpsFetchFileResponse; + } + IndexNode node = wpsSupport.findAndCheckByCode(docCode); return WpsFetchFileResponse.builder() .docCode(docCode) @@ -75,30 +79,21 @@ public class WpsBaseManager { * @param docCode 文件编码 */ public WpsFetchDownloadResponse fetchDownload(String docCode) { + WpsFetchDownloadResponse wpsFetchDownloadResponse = ossSupport.fetchDownload(docCode); + if (Objects.nonNull(wpsFetchDownloadResponse) && StringUtils.isNotBlank(wpsFetchDownloadResponse.getUrl())) { + return wpsFetchDownloadResponse; + } + IndexNode node = wpsSupport.findAndCheckByCode(docCode); return WpsFetchDownloadResponse.builder() - .url(this.downloadUrl(node.getAttributes().getFileAttributes().getOssFileKey())) + .url(ossSupport.downloadUrl(node.getAttributes().getFileAttributes().getOssFileKey())) .digest("") .digestType("") .headers(null) .build(); } - /** - * 获取文件下载地址 - */ - private String downloadUrl(String fileKey) { - if (StringUtils.isEmpty(fileKey)) { - return StringUtils.EMPTY; - } - ApiSignUrlDownloadRequest request = new ApiSignUrlDownloadRequest(); - request.setFileKeys(Lists.newArrayList(fileKey)); - List responseList = docOssGateway.signUrlFetchDownload(request); - WpsAssertUtil.isFalse(CollectionUtil.isEmpty(responseList) || StringUtils.isBlank(responseList.get(0).getSignUrl()), WpsErrorCodeEnum.UPLOAD_ERROR); - - return responseList.get(0).getSignUrl(); - } /** * 文档权限 @@ -107,7 +102,7 @@ public class WpsBaseManager { public WpsPermissionResponse permission(WpsPermissionRequest request) { IndexNode indexNode = indexManager.findOrNull(request.getDocCode()); - if (StringUtils.isNotBlank(indexNode.getOrCreateFileAttributes().getFileExtension()) + if (Objects.nonNull(indexNode) && StringUtils.isNotBlank(indexNode.getOrCreateFileAttributes().getFileExtension()) && indexNode.getOrCreateFileAttributes().getFileExtension().equalsIgnoreCase("pdf")) { return WpsPermissionResponse.preview(request.getPersonId()); } From a44c0f533eea851110fb48a7d6b7b72af798b64a Mon Sep 17 00:00:00 2001 From: xudawei Date: Mon, 7 Apr 2025 19:37:10 +0800 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20(REQ-3540)=20=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=9A=84fileKey=E9=A2=84=E8=A7=88=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/nanopart/doc/wps/support/OssSupport.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java index f9852a86..df954c3b 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java @@ -42,8 +42,8 @@ public class OssSupport { .size(response.getStorageSize()) .createAt(response.getCreateAt()) .updateAt(response.getUpdateAt()) - .creatorId(response.getCreateBy()) - .modifierId(response.getUpdateBy()) + .creatorId(StringUtils.isNotBlank(response.getCreateBy()) ? response.getCreateBy() : "0") + .modifierId(StringUtils.isNotBlank(response.getUpdateBy()) ? response.getUpdateBy() : "0") .build(); } From e06aecc51da044fb88ad21250b7481247ce557aa Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 10 Apr 2025 15:07:55 +0800 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20(REQ-3846)=20=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E9=93=BE=E6=8E=A5=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/enums/WpsPermissionStatusEnum.java | 63 +++++++++++++++++++ .../api/wps/request/WpsPermissionRequest.java | 6 ++ .../wps/response/WpsPermissionResponse.java | 18 ------ .../doc/wps/wpsbase/WpsBaseManager.java | 8 ++- 4 files changed, 76 insertions(+), 19 deletions(-) create mode 100644 doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/enums/WpsPermissionStatusEnum.java diff --git a/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/enums/WpsPermissionStatusEnum.java b/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/enums/WpsPermissionStatusEnum.java new file mode 100644 index 00000000..89e55522 --- /dev/null +++ b/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/enums/WpsPermissionStatusEnum.java @@ -0,0 +1,63 @@ + +package cn.axzo.nanopart.doc.api.enums; + +import cn.axzo.nanopart.doc.api.wps.response.WpsPermissionResponse; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.experimental.Accessors; + +/** + * @author xudawei + */ +@Getter +@Accessors(fluent = true) +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +public enum WpsPermissionStatusEnum { + + EDIT("edit", "编辑"), + PREVIEW("preview", "预览"), + ; + + private final String code; + private final String desc; + + /** + * 预览 + * @param personId + * @return + */ + public static WpsPermissionResponse preview(String personId) { + return WpsPermissionResponse.builder() + .personId(personId) + .read(1) + .update(0) + .download(0) + .rename(0) + .history(0) + .copy(1) + .print(0) + .saveas(0) + .comment(0) + .build(); + } + + /** + * 编辑 + */ + public static WpsPermissionResponse edit(String personId) { + return WpsPermissionResponse.builder() + .personId(personId) + .read(1) + .update(1) + .download(0) + .rename(0) + .history(0) + .copy(1) + .print(0) + .saveas(0) + .comment(0) + .build(); + } + +} diff --git a/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/wps/request/WpsPermissionRequest.java b/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/wps/request/WpsPermissionRequest.java index 700014d3..b2616841 100644 --- a/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/wps/request/WpsPermissionRequest.java +++ b/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/wps/request/WpsPermissionRequest.java @@ -1,6 +1,7 @@ package cn.axzo.nanopart.doc.api.wps.request; +import cn.axzo.nanopart.doc.api.enums.WpsPermissionStatusEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -27,4 +28,9 @@ public class WpsPermissionRequest { */ private String personId; + /** + * 权限状态 + */ + private WpsPermissionStatusEnum wpsPermissionStatus; + } diff --git a/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/wps/response/WpsPermissionResponse.java b/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/wps/response/WpsPermissionResponse.java index 02ee199f..39dede43 100644 --- a/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/wps/response/WpsPermissionResponse.java +++ b/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/wps/response/WpsPermissionResponse.java @@ -67,22 +67,4 @@ public class WpsPermissionResponse { */ private Integer comment; - /** - * 预览文档权限 - */ - public static WpsPermissionResponse preview(String personId) { - return WpsPermissionResponse.builder() - .personId(personId) - .read(1) - .update(0) - .download(0) - .rename(0) - .history(0) - .copy(0) - .print(0) - .saveas(0) - .comment(0) - .build(); - } - } diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java index 59048773..05ee9771 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java @@ -3,6 +3,7 @@ package cn.axzo.nanopart.doc.wps.wpsbase; import cn.axzo.basics.common.util.AssertUtil; import cn.axzo.basics.profiles.dto.basic.PersonProfileDto; import cn.axzo.nanopart.doc.api.enums.WpsErrorCodeEnum; +import cn.axzo.nanopart.doc.api.enums.WpsPermissionStatusEnum; import cn.axzo.nanopart.doc.api.wps.exception.WpsException; import cn.axzo.nanopart.doc.api.wps.request.WpsPermissionRequest; import cn.axzo.nanopart.doc.api.wps.request.WpsRenameRequest; @@ -104,7 +105,12 @@ public class WpsBaseManager { if (Objects.nonNull(indexNode) && StringUtils.isNotBlank(indexNode.getOrCreateFileAttributes().getFileExtension()) && indexNode.getOrCreateFileAttributes().getFileExtension().equalsIgnoreCase("pdf")) { - return WpsPermissionResponse.preview(request.getPersonId()); + return WpsPermissionStatusEnum.preview(request.getPersonId()); + } + if (Objects.nonNull(request.getWpsPermissionStatus())) { + if (request.getWpsPermissionStatus() == WpsPermissionStatusEnum.PREVIEW) { + return WpsPermissionStatusEnum.preview(request.getPersonId()); + } } return WpsPermissionResponse.builder() From 7dbfd68a30d4054ca0e56dd22c2e5a245de46c06 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 10 Apr 2025 15:15:48 +0800 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20(REQ-3540)=20WPS=E6=9D=83=E9=99=90?= =?UTF-8?q?=E6=9E=9A=E4=B8=BE=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doc/api/enums/WpsPermissionStatusEnum.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/enums/WpsPermissionStatusEnum.java b/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/enums/WpsPermissionStatusEnum.java index 89e55522..1a9b9a9c 100644 --- a/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/enums/WpsPermissionStatusEnum.java +++ b/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/enums/WpsPermissionStatusEnum.java @@ -7,6 +7,10 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.experimental.Accessors; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + /** * @author xudawei */ @@ -22,6 +26,20 @@ public enum WpsPermissionStatusEnum { private final String code; private final String desc; + + + private static final Map map = Stream.of(WpsPermissionStatusEnum.values()).collect(Collectors.toMap(key -> key.code, key -> key)); + + + public static WpsPermissionStatusEnum getByCode(String code) { + return map.get(code); + } + + public static void main(String[] args) { + WpsPermissionStatusEnum preview = WpsPermissionStatusEnum.getByCode("preview"); + System.out.println("preview = " + preview); + } + /** * 预览 * @param personId From d368c706f78ec448bb20834a46bf90235f29c34e Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 10 Apr 2025 16:30:38 +0800 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20(REQ-3540)=20WPS=E4=B8=8EOSSFileKey?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5=EF=BC=8C=E5=8C=85=E5=90=AB=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E4=BA=BA=E4=B8=BA0=E6=97=B6=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/nanopart/doc/api/util/Constants.java | 15 ++++++ .../nanopart/doc/wps/support/OssSupport.java | 39 +++++++++++++- .../doc/wps/wpsbase/WpsBaseManager.java | 53 ++++++++++++++++--- 3 files changed, 97 insertions(+), 10 deletions(-) diff --git a/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/util/Constants.java b/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/util/Constants.java index 59cc4d22..d4878b43 100644 --- a/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/util/Constants.java +++ b/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/util/Constants.java @@ -33,4 +33,19 @@ public class Constants { */ public static final String WPS_UPLOAD_PREPARE_SHA1 = "sha1"; + + /** + * http开头 + */ + public static final String WPS_HTTP_START = "http://"; + + /** + * https开头 + */ + public static final String WPS_HTTPS_START = "https://"; + + /** + * wps默认用户Id + */ + public static final String WPS_DEFAULT_USER_ID = "0"; } diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java index df954c3b..f6ee8e6b 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java @@ -1,6 +1,7 @@ package cn.axzo.nanopart.doc.wps.support; import cn.axzo.nanopart.doc.api.enums.WpsErrorCodeEnum; +import cn.axzo.nanopart.doc.api.util.Constants; import cn.axzo.nanopart.doc.api.wps.response.WpsFetchDownloadResponse; import cn.axzo.nanopart.doc.api.wps.response.WpsFetchFileResponse; import cn.axzo.nanopart.doc.integration.DocOssGateway; @@ -31,6 +32,7 @@ public class OssSupport { private final DocOssGateway docOssGateway; public WpsFetchFileResponse fetchFileInfo(String fileKey) { + fileKey = url2FileKey(fileKey); FetchFileInfoResponse response = docOssGateway.fetchFileInfo(FetchFileInfoRequest.builder().fileKey(fileKey).build()); if (Objects.isNull(response) || Objects.isNull(response.getId())) { return null; @@ -42,13 +44,14 @@ public class OssSupport { .size(response.getStorageSize()) .createAt(response.getCreateAt()) .updateAt(response.getUpdateAt()) - .creatorId(StringUtils.isNotBlank(response.getCreateBy()) ? response.getCreateBy() : "0") - .modifierId(StringUtils.isNotBlank(response.getUpdateBy()) ? response.getUpdateBy() : "0") + .creatorId(StringUtils.isNotBlank(response.getCreateBy()) ? response.getCreateBy() : Constants.WPS_DEFAULT_USER_ID) + .modifierId(StringUtils.isNotBlank(response.getUpdateBy()) ? response.getUpdateBy() : Constants.WPS_DEFAULT_USER_ID) .build(); } public WpsFetchDownloadResponse fetchDownload(String fileKey) { + fileKey = url2FileKey(fileKey); FetchFileInfoResponse response = docOssGateway.fetchFileInfo(FetchFileInfoRequest.builder().fileKey(fileKey).build()); if (Objects.isNull(response) || Objects.isNull(response.getId())) { return null; @@ -69,6 +72,7 @@ public class OssSupport { if (StringUtils.isEmpty(fileKey)) { return StringUtils.EMPTY; } + fileKey = url2FileKey(fileKey); ApiSignUrlDownloadRequest request = new ApiSignUrlDownloadRequest(); request.setFileKeys(Lists.newArrayList(fileKey)); List responseList = docOssGateway.signUrlFetchDownload(request); @@ -77,4 +81,35 @@ public class OssSupport { return responseList.get(0).getSignUrl(); } + + /** + * 从链接中提取fileKey,比如如下链接,获取fileKey:b4148fbee6954c2fa3139471f18a2dcd + * https://xx/identity/b4148fbee6954c2fa3139471f18a2dcd.docx?AccessKeyId=xx&Expires=xx&response-content-disposition=xx&Signature=xx + * https://xx/identity/b4148fbee6954c2fa3139471f18a2dcd.doc?AccessKeyId=xx&Expires=xx&response-content-disposition=xx&Signature=xx + * https://xxx/app/app/b4148fbee6954c2fa3139471f18a2dcd.docx + * https://xxx/app/app/b4148fbee6954c2fa3139471f18a2dcd.doc + */ + public String url2FileKey(String url) { + if (!url.startsWith(Constants.WPS_HTTP_START) && !url.startsWith(Constants.WPS_HTTPS_START)) { + return url; + } + + if (url.contains("/") && url.contains("?")) { + url = url.split("\\?")[0]; + String fileName = url.substring(url.lastIndexOf("/") + 1); + if (fileName.contains(".")) { + return fileName.substring(0, fileName.indexOf(".")); + } + return fileName; + } + + if (url.contains("/") ) { + String fileName = url.substring(url.lastIndexOf("/") + 1); + if (fileName.contains(".")) { + return fileName.substring(0, fileName.indexOf(".")); + } + return fileName; + } + return url; + } } diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java index 05ee9771..8d9e2bea 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java @@ -4,6 +4,7 @@ import cn.axzo.basics.common.util.AssertUtil; import cn.axzo.basics.profiles.dto.basic.PersonProfileDto; import cn.axzo.nanopart.doc.api.enums.WpsErrorCodeEnum; import cn.axzo.nanopart.doc.api.enums.WpsPermissionStatusEnum; +import cn.axzo.nanopart.doc.api.util.Constants; import cn.axzo.nanopart.doc.api.wps.exception.WpsException; import cn.axzo.nanopart.doc.api.wps.request.WpsPermissionRequest; import cn.axzo.nanopart.doc.api.wps.request.WpsRenameRequest; @@ -25,6 +26,7 @@ import cn.axzo.nanopart.doc.wps.support.WpsSupport; import cn.axzo.oss.http.model.file.UpdateFileInfoRequest; import cn.axzo.oss.http.model.file.UpdateFileInfoResponse; import cn.hutool.core.collection.CollectionUtil; +import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -132,19 +134,54 @@ public class WpsBaseManager { */ public WpsUsersResponse users(WpsUsersRequest request) { WpsAssertUtil.isFalse(Objects.isNull(request) || CollectionUtil.isEmpty(request.getPersonIds()), WpsErrorCodeEnum.REQUEST_PARAMETER_ERROR); - //查询人员档案 - List personProfiles = this.docUserProfileGateway.personProfileByPersonIds(request.getPersonIds().stream().map(Long::parseLong).collect(Collectors.toList())); - WpsAssertUtil.isFalse(CollectionUtil.isEmpty(personProfiles), WpsErrorCodeEnum.USER_NOT_EXIST); + + List allWpsUsers = Lists.newArrayList(); + //构建默认用户信息 + allWpsUsers.addAll(this.buildDefaultWpsUsers(request.getPersonIds())); + //构建正常用户信息 + allWpsUsers.addAll(this.buildNormalWpsUsers(request.getPersonIds())); return WpsUsersResponse.builder() - .users(personProfiles.stream() - .map(item -> WpsUsersResponse.WpsUser.builder() - .personId(item.getId().toString()) - .name(item.getRealName()) - .avatarUrl(item.getAvatarUrl()).build()).collect(Collectors.toList())) + .users(allWpsUsers) .build(); } + /** + * 构建正常用户信息 + */ + private List buildNormalWpsUsers(List personIds) { + List normalUserList = personIds.stream().filter(item -> !item.equalsIgnoreCase(Constants.WPS_DEFAULT_USER_ID)).map(Long::parseLong).collect(Collectors.toList()); + + if (CollectionUtil.isEmpty(normalUserList)) { + return Lists.newArrayList(); + } + //查询人员档案 + List personProfiles = this.docUserProfileGateway.personProfileByPersonIds(normalUserList); + WpsAssertUtil.isFalse(CollectionUtil.isEmpty(personProfiles), WpsErrorCodeEnum.USER_NOT_EXIST); + return personProfiles.stream() + .map(item -> WpsUsersResponse.WpsUser.builder() + .personId(item.getId().toString()) + .name(item.getRealName()) + .avatarUrl(item.getAvatarUrl()).build()).collect(Collectors.toList()); + } + + /** + * 构建默认用户信息 + */ + private List buildDefaultWpsUsers(List personIds) { + List defaultUserList = personIds.stream().filter(item -> item.equalsIgnoreCase(Constants.WPS_DEFAULT_USER_ID)).map(Long::parseLong).collect(Collectors.toList()); + + if (CollectionUtil.isEmpty(defaultUserList)) { + return Lists.newArrayList(); + } + return defaultUserList.stream().map(item -> + WpsUsersResponse.WpsUser.builder() + .personId(item.toString()) + .name(StringUtils.EMPTY) + .avatarUrl(StringUtils.EMPTY).build() + ).collect(Collectors.toList()); + } + /** * 文件重命名 */ From d2a2857625eb2d4c232e0a0cef605f75c9966668 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 10 Apr 2025 18:08:36 +0800 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20(REQ-3540)=20WPS=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=BF=A1=E6=81=AF=E7=9A=84owner=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E6=B2=A1=E6=9C=89=E5=88=99=E5=8F=96=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nanopart/doc/api/wps/request/WpsFetchFileRequest.java | 5 +++++ .../java/cn/axzo/nanopart/doc/wps/support/OssSupport.java | 6 +++--- .../cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseController.java | 2 +- .../cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java | 4 ++-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/wps/request/WpsFetchFileRequest.java b/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/wps/request/WpsFetchFileRequest.java index 9c19166c..4aa4b1e9 100644 --- a/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/wps/request/WpsFetchFileRequest.java +++ b/doc/doc-api/src/main/java/cn/axzo/nanopart/doc/api/wps/request/WpsFetchFileRequest.java @@ -22,4 +22,9 @@ public class WpsFetchFileRequest { */ private String docCode; + /** + * 用户Id + */ + private String personId; + } diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java index f6ee8e6b..7c5854b2 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/support/OssSupport.java @@ -31,7 +31,7 @@ public class OssSupport { private final DocOssGateway docOssGateway; - public WpsFetchFileResponse fetchFileInfo(String fileKey) { + public WpsFetchFileResponse fetchFileInfo(String fileKey, String personId) { fileKey = url2FileKey(fileKey); FetchFileInfoResponse response = docOssGateway.fetchFileInfo(FetchFileInfoRequest.builder().fileKey(fileKey).build()); if (Objects.isNull(response) || Objects.isNull(response.getId())) { @@ -44,8 +44,8 @@ public class OssSupport { .size(response.getStorageSize()) .createAt(response.getCreateAt()) .updateAt(response.getUpdateAt()) - .creatorId(StringUtils.isNotBlank(response.getCreateBy()) ? response.getCreateBy() : Constants.WPS_DEFAULT_USER_ID) - .modifierId(StringUtils.isNotBlank(response.getUpdateBy()) ? response.getUpdateBy() : Constants.WPS_DEFAULT_USER_ID) + .creatorId(StringUtils.isNotBlank(response.getCreateBy()) ? response.getCreateBy() : personId) + .modifierId(StringUtils.isNotBlank(response.getUpdateBy()) ? response.getUpdateBy() : personId) .build(); } diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseController.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseController.java index 898633e6..2586379b 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseController.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseController.java @@ -37,7 +37,7 @@ public class WpsBaseController implements WpsBaseApi { */ @Override public ApiResult fetchFile(@Validated @RequestBody WpsFetchFileRequest request) { - return ApiResult.ok(wpsBaseManager.fetchFileBase(request.getDocCode())); + return ApiResult.ok(wpsBaseManager.fetchFileBase(request.getDocCode(), request.getPersonId())); } /** diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java index 8d9e2bea..3853299b 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseManager.java @@ -57,9 +57,9 @@ public class WpsBaseManager { * 获取文件基础信息 * @param docCode 文件编码 */ - public WpsFetchFileResponse fetchFileBase(String docCode) { + public WpsFetchFileResponse fetchFileBase(String docCode, String personId) { - WpsFetchFileResponse wpsFetchFileResponse = ossSupport.fetchFileInfo(docCode); + WpsFetchFileResponse wpsFetchFileResponse = ossSupport.fetchFileInfo(docCode, personId); if (Objects.nonNull(wpsFetchFileResponse) && Objects.nonNull(wpsFetchFileResponse.getDocCode())) { return wpsFetchFileResponse; } From e9c6b561febed74817bfc40fcba49b096b863445 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 10 Apr 2025 20:52:45 +0800 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20(REQ-3540)=20WPS=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=BF=A1=E6=81=AF=E7=9A=84owner=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E6=B2=A1=E6=9C=89=E5=88=99=E5=8F=96=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doc/wps/wpsbase/WpsBaseController.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseController.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseController.java index 2586379b..8fc6a68d 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseController.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseController.java @@ -12,6 +12,7 @@ import cn.axzo.nanopart.doc.api.wps.response.WpsFetchFileResponse; import cn.axzo.nanopart.doc.api.wps.response.WpsPermissionResponse; import cn.axzo.nanopart.doc.api.wps.response.WpsRenameResponse; import cn.axzo.nanopart.doc.api.wps.response.WpsUsersResponse; +import com.alibaba.fastjson.JSON; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; @@ -37,7 +38,10 @@ public class WpsBaseController implements WpsBaseApi { */ @Override public ApiResult fetchFile(@Validated @RequestBody WpsFetchFileRequest request) { - return ApiResult.ok(wpsBaseManager.fetchFileBase(request.getDocCode(), request.getPersonId())); + log.info("WpsBaseController-fetchFile-params: {}", JSON.toJSONString(request)); + WpsFetchFileResponse wpsFetchFileResponse = wpsBaseManager.fetchFileBase(request.getDocCode(), request.getPersonId()); + log.info("WpsBaseController-fetchFile-result: {}", JSON.toJSONString(wpsFetchFileResponse)); + return ApiResult.ok(wpsFetchFileResponse); } /** @@ -58,7 +62,10 @@ public class WpsBaseController implements WpsBaseApi { */ @Override public ApiResult permission(@Validated @RequestBody WpsPermissionRequest request) { - return ApiResult.ok(wpsBaseManager.permission(request)); + log.info("WpsBaseController-permission-params: {}", JSON.toJSONString(request)); + WpsPermissionResponse permission = wpsBaseManager.permission(request); + log.info("WpsBaseController-permission-params:{},result: {}", JSON.toJSONString(request),JSON.toJSONString(permission)); + return ApiResult.ok(permission); } /** @@ -68,7 +75,10 @@ public class WpsBaseController implements WpsBaseApi { */ @Override public ApiResult users(@Validated @RequestBody WpsUsersRequest request) { - return ApiResult.ok(wpsBaseManager.users(request)); + log.info("WpsBaseController-users-params: {}", JSON.toJSONString(request)); + WpsUsersResponse users = wpsBaseManager.users(request); + log.info("WpsBaseController-users-params:{},result: {}", JSON.toJSONString(request), JSON.toJSONString(users)); + return ApiResult.ok(); } /** From 3e673fbad474bae9f92b77db997a21ae6cac4e42 Mon Sep 17 00:00:00 2001 From: xudawei Date: Fri, 11 Apr 2025 10:04:20 +0800 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20(REQ-3540)=20WPS=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=BF=A1=E6=81=AF=E7=9A=84owner=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E6=B2=A1=E6=9C=89=E5=88=99=E5=8F=96=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseController.java b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseController.java index 8fc6a68d..28d23b9a 100644 --- a/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseController.java +++ b/doc/doc-server/src/main/java/cn/axzo/nanopart/doc/wps/wpsbase/WpsBaseController.java @@ -78,7 +78,7 @@ public class WpsBaseController implements WpsBaseApi { log.info("WpsBaseController-users-params: {}", JSON.toJSONString(request)); WpsUsersResponse users = wpsBaseManager.users(request); log.info("WpsBaseController-users-params:{},result: {}", JSON.toJSONString(request), JSON.toJSONString(users)); - return ApiResult.ok(); + return ApiResult.ok(users); } /**