From 59f3fa5301c5f2ecbd723d39deb068fda9da2968 Mon Sep 17 00:00:00 2001 From: zhanglei Date: Fri, 7 Aug 2026 10:42:02 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BA=BF=E4=B8=8A:=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/web/H5OpenController.java | 30 +++++++- .../safetyeval/app/executor/WpsExecutor.java | 68 ++++++++++++++----- .../qinan/safetyeval/client/api/WpsApi.java | 4 +- .../gatewayimpl/WpsDocGatewayImpl.java | 2 +- 4 files changed, 83 insertions(+), 21 deletions(-) diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/H5OpenController.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/H5OpenController.java index 97b300b..af4b41a 100644 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/H5OpenController.java +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/H5OpenController.java @@ -48,9 +48,29 @@ public class H5OpenController { @ApiOperation("wps回调-文档权限") @GetMapping(value = "/v3/3rd/files/{file_id}/permission", produces = MediaType.APPLICATION_JSON_VALUE) - public String getWpsPermissionByFileId(@PathVariable("file_id") String fileId) { + public String getWpsPermissionByFileId(@PathVariable("file_id") String fileId, @RequestHeader("X-User-Query") String xUserQuery) { log.info("wps回调权限信息:{}", fileId); - return toJson(wpsApi.getPermission(fileId)); + String readOnlyValue = getReadOnlyValue(xUserQuery); + return toJson(wpsApi.getPermission(fileId, readOnlyValue)); + } + + /** + * 获取文件权限值 + * @param query + * @return + */ + private String getReadOnlyValue(String query) { + if (query == null || query.isEmpty()) { + return null; + } + String[] pairs = query.split("&"); + for (String pair : pairs) { + String[] keyValue = pair.split("=", 2); + if (keyValue.length == 2 && "readOnly".equals(keyValue[0])) { + return keyValue[1]; + } + } + return null; // 未找到 } @ApiOperation("wps回调-批量用户信息") @@ -128,6 +148,12 @@ public class H5OpenController { return SingleResponse.of(wpsApi.myOrCreate(docxUrl, projectId)); } + @ApiOperation("查询项目文档") + @GetMapping(value = "/doc/getDocByProjectId") + public SingleResponse getDocByProjectId(@RequestParam("projectId") String projectId) { + return SingleResponse.of(wpsApi.getDocByProjectId(projectId)); + } + @ApiOperation("始终新建一份空白docx") @PostMapping(value = "/doc/create", produces = MediaType.APPLICATION_JSON_VALUE) public SingleResponse createBlank(@RequestBody Req> req) { diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/WpsExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/WpsExecutor.java index cf4dad8..a35d9c9 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/WpsExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/WpsExecutor.java @@ -1,6 +1,7 @@ package org.qinan.safetyeval.app.executor; import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.dromara.x.file.storage.core.FileInfo; import org.dromara.x.file.storage.core.FileStorageService; @@ -23,6 +24,9 @@ import org.qinan.safetyeval.domain.service.ProjectStageSyncService; import org.qinan.safetyeval.domain.service.WpsDocDomainService; import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter; import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter; +import org.qinan.safetyeval.infrastructure.convertor.WpsDocDoConvertor; +import org.qinan.safetyeval.infrastructure.dataobject.WpsDocDO; +import org.qinan.safetyeval.infrastructure.mapper.WpsDocMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -64,6 +68,10 @@ public class WpsExecutor implements WpsApi { private String defDocxUrl; @Autowired private ProjectStageSyncService projectStageSyncService; + @Autowired + private WpsDocMapper wpsDocMapper; + @Autowired + private WpsDocDoConvertor wpsDocDoConvertor; @Override public Map getFileInfo(String fileId) { @@ -88,25 +96,36 @@ public class WpsExecutor implements WpsApi { } @Override - public Map getPermission(String fileId) { + public Map getPermission(String fileId, String readOnlyValue) { try { - wpsDocDomainService.getByFileId(fileId); - Long userId = AuthUserContextAdapter.getCurrentUserId(); - if (userId == null) { - throw new BizException(ErrorCode.WPS_USER_NOT_LOGIN); - } WpsPermissionCO permission = new WpsPermissionCO(); - permission.setUserId(String.valueOf(userId)); - permission.setRead(1); - permission.setUpdate(1); - permission.setDownload(1); - permission.setPrint(1); - permission.setCopy(1); - permission.setComment(1); - // 未实现重命名回调,保持 0 - permission.setRename(1); - permission.setHistory(1); - permission.setSaveas(1); + if (StringUtils.hasText(readOnlyValue) && "true".equals(readOnlyValue)) { + permission.setRead(1); + permission.setUpdate(0); + permission.setDownload(1); + permission.setPrint(0); + permission.setCopy(0); + permission.setComment(0); + permission.setRename(0); + permission.setHistory(0); + permission.setSaveas(0); + } else { + wpsDocDomainService.getByFileId(fileId); + Long userId = AuthUserContextAdapter.getCurrentUserId(); + if (userId == null) { + throw new BizException(ErrorCode.WPS_USER_NOT_LOGIN); + } + permission.setUserId(String.valueOf(userId)); + permission.setRead(1); + permission.setUpdate(1); + permission.setDownload(1); + permission.setPrint(1); + permission.setCopy(1); + permission.setComment(1); + permission.setRename(1); + permission.setHistory(1); + permission.setSaveas(1); + } return ok(permission); } catch (BizException e) { return fail(e); @@ -345,6 +364,21 @@ public class WpsExecutor implements WpsApi { } } + @Override + public WpsDocOpenCO getDocByProjectId(String projectId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(WpsDocDO::getProjectId, projectId); + wrapper.eq(WpsDocDO::getDeleteEnum, "false"); + wrapper.orderByDesc(WpsDocDO::getId); + wrapper.last("limit 1"); + WpsDocDO wpsDocDO = wpsDocMapper.selectOne(wrapper); + WpsDocEntity entity = wpsDocDoConvertor.toEntity(wpsDocDO); + if (entity != null) { + return toOpenCO(entity, false); + } + return null; + } + protected WpsDocEntity doCreateBlankDoc(Long userId, String docxUrl, Long projectId) { if(Objects.isNull(projectId)) { throw new BizException(ErrorCode.EVAL_PROJECT_ERROR); diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/WpsApi.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/WpsApi.java index c471dac..00ed6a7 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/WpsApi.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/WpsApi.java @@ -17,7 +17,7 @@ public interface WpsApi { Map getDownload(String fileId); - Map getPermission(String fileId); + Map getPermission(String fileId, String readOnlyValue); Map getUsers(List userIds); @@ -46,4 +46,6 @@ public interface WpsApi { * 始终新建一份空白 docx(即使用户已有文档) */ WpsDocOpenCO createBlank(String docxUrl, Long projectId); + + WpsDocOpenCO getDocByProjectId(String projectId); } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/WpsDocGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/WpsDocGatewayImpl.java index 31c975b..86da0f1 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/WpsDocGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/WpsDocGatewayImpl.java @@ -37,7 +37,7 @@ public class WpsDocGatewayImpl implements WpsDocGateway { @Override public WpsDocEntity getLatestByCreatorId(String creatorId, Long projectId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(WpsDocDO::getCreatorId, creatorId); +// wrapper.eq(WpsDocDO::getCreatorId, creatorId); 目前只做项目级查询, 人员+项目查询待定 wrapper.eq(WpsDocDO::getProjectId, projectId); wrapper.eq(WpsDocDO::getDeleteEnum, "false"); wrapper.orderByDesc(WpsDocDO::getId);