From 1d53f09b0601fa577995dacab69747f9c5d60cd9 Mon Sep 17 00:00:00 2001
From: zzs <hi@vio.vin>
Date: Wed, 5 Mar 2025 15:07:13 +0800
Subject: [PATCH] feat: change bookmark data type

---
 .../farmwork/word/core/BookmarkExec.java      | 26 ++++++++++---------
 .../core/enums/PictureProvideNameType.java    | 22 ----------------
 .../word/core/model/AbstractExData.java       |  2 ++
 .../core/model/BookmarkReplaceDataModel.java  |  4 ---
 .../word/core/model/ext/PictureExData.java    | 12 +++------
 .../admin/word/WordBookmarkController.java    |  8 +++++-
 .../service/file/WordBookmarkService.java     |  4 +--
 .../service/file/WordBookmarkServiceImpl.java |  6 ++---
 8 files changed, 30 insertions(+), 54 deletions(-)
 delete mode 100644 wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/enums/PictureProvideNameType.java

diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/BookmarkExec.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/BookmarkExec.java
index 8859c5a..d9443fa 100644
--- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/BookmarkExec.java
+++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/BookmarkExec.java
@@ -4,10 +4,9 @@ import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.io.file.FileNameUtil;
 import com.wmyun.farmwork.word.core.enums.BookmarkType;
-import com.wmyun.farmwork.word.core.enums.PictureProvideNameType;
-import com.wmyun.farmwork.word.core.model.AbstractExData;
 import com.wmyun.farmwork.word.core.model.BookmarkReplaceDataModel;
 import com.wmyun.farmwork.word.core.model.ext.PictureExData;
+import com.wmyun.farmwork.word.core.model.ext.TextExData;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.util.Units;
@@ -15,7 +14,6 @@ import org.apache.poi.xwpf.usermodel.*;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark;
 import org.springframework.stereotype.Component;
 import org.w3c.dom.Node;
-import org.w3c.dom.Text;
 
 import java.io.*;
 import java.util.ArrayList;
@@ -126,17 +124,21 @@ public class BookmarkExec {
                         continue;
                     }
                     BookmarkReplaceDataModel model = dataMap.get(name);
-                    BookmarkType type = model.getType();
-                    // 处理文本
-                    if (BookmarkType.TEXT.equals(type)) {
-                        run.setText(model.getValue());
+                    if (model.getExtData() instanceof TextExData textExData) {
+                        BookmarkType type = textExData.getType();
+
+                        // 处理文本
+                        if (BookmarkType.TEXT.equals(type)) {
+                            run.setText(textExData.getValue());
+                        }
+
                     }
-                    // 处理图片,以嵌入式插入图片
-                    if (BookmarkType.PICTURE.equals(type)) {
-                        AbstractExData extData = model.getExtData();
-                        if (extData instanceof PictureExData picture && PictureProvideNameType.BOOKMARK.equals(picture.getNameType())) {
+                    if (model.getExtData() instanceof PictureExData pictureData) {
+                        BookmarkType type = pictureData.getType();
+                        // 处理图片,以嵌入式插入图片
+                        if (BookmarkType.PICTURE.equals(type)) {
                             try {
-                                run.addPicture(new ByteArrayInputStream(picture.readAsByteArray()), XWPFDocument.PICTURE_TYPE_PNG, picture.getPictureName(), Units.toEMU(picture.getWidth()), Units.toEMU(picture.getHeight()));
+                                run.addPicture(new ByteArrayInputStream(pictureData.readAsByteArray()), pictureData.readPictureType(), pictureData.getPictureName(), Units.toEMU(pictureData.getWidth()), Units.toEMU(pictureData.getHeight()));
                             } catch (InvalidFormatException e) {
                                 log.error(e.getMessage(), e);
                                 throw new RuntimeException(e);
diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/enums/PictureProvideNameType.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/enums/PictureProvideNameType.java
deleted file mode 100644
index 0559468..0000000
--- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/enums/PictureProvideNameType.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.wmyun.farmwork.word.core.enums;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * @Classname PictureProvideNameType
- * @Description TODO
- * @Date 2025/3/4 10:06
- * @Created by violet
- */
-
-@AllArgsConstructor
-@Getter
-public enum PictureProvideNameType {
-
-    BOOKMARK("BOOKMARK"),
-
-    DESCRIPTOR("DESCRIPTOR");
-
-    private final String type;
-}
diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/AbstractExData.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/AbstractExData.java
index e5eec79..7d7d30f 100644
--- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/AbstractExData.java
+++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/AbstractExData.java
@@ -24,4 +24,6 @@ import lombok.Data;
 })
 public class AbstractExData {
     private BookmarkType type;
+
+    private String value;
 }
diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/BookmarkReplaceDataModel.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/BookmarkReplaceDataModel.java
index b6d1b72..3867626 100644
--- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/BookmarkReplaceDataModel.java
+++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/BookmarkReplaceDataModel.java
@@ -18,9 +18,5 @@ public class BookmarkReplaceDataModel {
 
     private String name;
 
-    private BookmarkType type;
-
-    private String value;
-
     private AbstractExData extData;
 }
diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/ext/PictureExData.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/ext/PictureExData.java
index d4b68a3..e31f935 100644
--- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/ext/PictureExData.java
+++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/ext/PictureExData.java
@@ -3,14 +3,12 @@ package com.wmyun.farmwork.word.core.model.ext;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.http.HttpUtil;
 import com.wmyun.farmwork.word.core.enums.PictureProvideDataType;
-import com.wmyun.farmwork.word.core.enums.PictureProvideNameType;
 import com.wmyun.farmwork.word.core.model.AbstractExData;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.SneakyThrows;
 import org.apache.poi.xwpf.usermodel.Document;
 
-import java.net.URL;
 import java.util.Base64;
 
 /**
@@ -30,20 +28,16 @@ public class PictureExData extends AbstractExData {
 
     private PictureProvideDataType dataType;
 
-    private PictureProvideNameType nameType;
-
-    private String data;
-
     @SneakyThrows
     public byte[] readAsByteArray() {
         if (PictureProvideDataType.BASE64.equals(dataType)) {
-            return Base64.getDecoder().decode(data);
+            return Base64.getDecoder().decode(this.getValue());
         }
         if (PictureProvideDataType.DOWNLOAD_URL.equals(dataType)) {
-            return HttpUtil.downloadBytes(data);
+            return HttpUtil.downloadBytes(this.getValue());
         }
         if (PictureProvideDataType.ABSOLUTE_PATH.equals(dataType)) {
-            return FileUtil.readBytes(data);
+            return FileUtil.readBytes(this.getValue());
         }
         return null;
     }
diff --git a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/controller/admin/word/WordBookmarkController.java b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/controller/admin/word/WordBookmarkController.java
index a832938..c902edc 100644
--- a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/controller/admin/word/WordBookmarkController.java
+++ b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/controller/admin/word/WordBookmarkController.java
@@ -5,8 +5,10 @@ import com.wmyun.farmwork.word.core.model.BookmarkReplaceDataModel;
 import com.wmyun.farmwork.word.deprecated.core.model.gen.TagsGenDataModel;
 import com.wmyun.framework.common.pojo.CommonResult;
 import com.wmyun.module.infra.service.file.WordBookmarkService;
+import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -27,11 +29,15 @@ public class WordBookmarkController {
     private WordBookmarkService service;
 
     @PostMapping("/file/{fileId}")
-    public CommonResult<Set<String>> requestAllBookmarks(@PathVariable("fileId") String fileId) {
+    @Operation(summary = "书签替换 - 获取文件中所有书签")
+    @PreAuthorize("@ss.hasPermission('infra:file:bookmark:query')")
+    public CommonResult<List<BookmarkQueryDataModel>> requestAllBookmarks(@PathVariable("fileId") String fileId) {
         return CommonResult.success(service.queryAllBookmarks(fileId));
     }
 
     @PostMapping("/file/{fileId}/generate")
+    @Operation(summary = "书签替换 - 生成替换后文件")
+    @PreAuthorize("@ss.hasPermission('infra:file:bookmark:generate')")
     public CommonResult<Object> doGenerate(@PathVariable("fileId") String fileId, @RequestBody List<BookmarkReplaceDataModel> data) {
         return CommonResult.success(service.replaceBookmarkWithContent(fileId, data));
     }
diff --git a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordBookmarkService.java b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordBookmarkService.java
index 9638393..93949aa 100644
--- a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordBookmarkService.java
+++ b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordBookmarkService.java
@@ -1,9 +1,9 @@
 package com.wmyun.module.infra.service.file;
 
+import com.wmyun.farmwork.word.core.model.BookmarkQueryDataModel;
 import com.wmyun.farmwork.word.core.model.BookmarkReplaceDataModel;
 
 import java.util.List;
-import java.util.Set;
 
 /**
  * @Classname WordBookmarkService
@@ -14,7 +14,7 @@ import java.util.Set;
 
 public interface WordBookmarkService {
 
-    Set<String> queryAllBookmarks(String fileId);
+    List<BookmarkQueryDataModel> queryAllBookmarks(String fileId);
 
     Long replaceBookmarkWithContent(String fileId, List<BookmarkReplaceDataModel> data);
 }
diff --git a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordBookmarkServiceImpl.java b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordBookmarkServiceImpl.java
index 68d3dda..984045c 100644
--- a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordBookmarkServiceImpl.java
+++ b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordBookmarkServiceImpl.java
@@ -12,8 +12,6 @@ import org.springframework.stereotype.Service;
 
 import java.io.File;
 import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * @Description: TODO
@@ -32,9 +30,9 @@ public class WordBookmarkServiceImpl implements WordBookmarkService {
 
     @SneakyThrows
     @Override
-    public Set<String> queryAllBookmarks(String fileId) {
+    public List<BookmarkQueryDataModel> queryAllBookmarks(String fileId) {
         FileDO fileDO = previewService.queryFileInfoByFileId(fileId);
-        return BookmarkQuery.queryAll(fileService.getFileContent(fileDO.getConfigId(), fileDO.getPath())).stream().map(BookmarkQueryDataModel::getName).collect(Collectors.toSet());
+        return BookmarkQuery.queryAll(fileService.getFileContent(fileDO.getConfigId(), fileDO.getPath()));
     }
 
     @SneakyThrows