From 4c5c10124b023b9ab6bf1f55a7dcfe22a1c7b4b5 Mon Sep 17 00:00:00 2001 From: zzs Date: Mon, 3 Mar 2025 14:11:52 +0800 Subject: [PATCH] wip: bookmark replace --- .../wmyun-spring-boot-starter-word/pom.xml | 5 + .../farmwork/word/core/BookmarkExec.java | 139 ++++++++++++++++++ .../farmwork/word/core/BookmarkQuery.java | 89 +++++++++++ .../word/core/enums/BookmarkType.java | 24 +++ .../core/enums/PictureProvideDataType.java | 24 +++ .../word/core/model/AbstractExData.java | 14 ++ .../core/model/BookmarkQueryDataModel.java | 22 +++ .../core/model/BookmarkReplaceDataModel.java | 26 ++++ .../word/core/model/ext/PictureExData.java | 46 ++++++ .../word/core/model/ext/TextExData.java | 21 +++ .../config/DefaultConfig.java | 5 +- .../core/TemplateReplaceExecutor.java | 13 +- .../core/TemplateTagsGenerate.java | 11 +- .../core/model/constant/TagType.java | 3 +- .../model/exec/TemplateExecDataModel.java | 7 +- .../core/model/gen/TagsGenDataModel.java | 5 +- .../core/model/type/TypeImage.java | 3 +- .../core/model/type/TypeTable.java | 3 +- .../core/model/type/TypeText.java | 3 +- .../{ => deprecated}/core/utils/WPUtils.java | 2 +- .../src/main/resources/EHSP-MFX250222-A.docx | Bin 0 -> 46838 bytes .../admin/word/WordBookmarkController.java | 38 +++++ .../admin/word/WordTemplateController.java | 4 +- .../infra/service/file/FileService.java | 2 + .../infra/service/file/FileServiceImpl.java | 30 ++++ .../service/file/WordBookmarkService.java | 20 +++ .../service/file/WordBookmarkServiceImpl.java | 50 +++++++ .../service/file/WordTemplateTagService.java | 4 +- .../file/WordTemplateTagServiceImpl.java | 8 +- 29 files changed, 589 insertions(+), 32 deletions(-) create mode 100644 wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/BookmarkExec.java create mode 100644 wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/BookmarkQuery.java create mode 100644 wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/enums/BookmarkType.java create mode 100644 wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/enums/PictureProvideDataType.java create mode 100644 wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/AbstractExData.java create mode 100644 wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/BookmarkQueryDataModel.java create mode 100644 wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/BookmarkReplaceDataModel.java create mode 100644 wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/ext/PictureExData.java create mode 100644 wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/ext/TextExData.java rename wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/{ => deprecated}/config/DefaultConfig.java (79%) rename wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/{ => deprecated}/core/TemplateReplaceExecutor.java (83%) rename wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/{ => deprecated}/core/TemplateTagsGenerate.java (90%) rename wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/{ => deprecated}/core/model/constant/TagType.java (85%) rename wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/{ => deprecated}/core/model/exec/TemplateExecDataModel.java (56%) rename wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/{ => deprecated}/core/model/gen/TagsGenDataModel.java (81%) rename wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/{ => deprecated}/core/model/type/TypeImage.java (90%) rename wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/{ => deprecated}/core/model/type/TypeTable.java (83%) rename wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/{ => deprecated}/core/model/type/TypeText.java (92%) rename wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/{ => deprecated}/core/utils/WPUtils.java (92%) create mode 100644 wmyun-framework/wmyun-spring-boot-starter-word/src/main/resources/EHSP-MFX250222-A.docx create mode 100644 wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/controller/admin/word/WordBookmarkController.java create mode 100644 wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordBookmarkService.java create mode 100644 wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordBookmarkServiceImpl.java diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/pom.xml b/wmyun-framework/wmyun-spring-boot-starter-word/pom.xml index 2185f10..3de4ad1 100644 --- a/wmyun-framework/wmyun-spring-boot-starter-word/pom.xml +++ b/wmyun-framework/wmyun-spring-boot-starter-word/pom.xml @@ -84,6 +84,11 @@ spring-expression 5.3.18 + + + cn.hutool + hutool-all + 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 new file mode 100644 index 0000000..6926dc8 --- /dev/null +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/BookmarkExec.java @@ -0,0 +1,139 @@ +package com.wmyun.farmwork.word.core; + +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.model.AbstractExData; +import com.wmyun.farmwork.word.core.model.BookmarkReplaceDataModel; +import com.wmyun.farmwork.word.core.model.ext.PictureExData; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.util.Units; +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 java.io.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Description: TODO + * @Date: 2025/3/3 10:10 + * @Created: by ZZSLL + */ + +@Component +@Slf4j +public class BookmarkExec { + + public final static String tmpDir = System.getProperty("java.io.tmpdir") + File.separator; + + public static File replace(List data, byte[] word, File file) { + Map map = data.stream().collect(Collectors.toMap(BookmarkReplaceDataModel::getName, b -> b)); + try (XWPFDocument doc = new XWPFDocument(IoUtil.toStream(word))) { + // 收集所有段落 + + // 1. 正文中的段落 + List allParagraphs = new ArrayList<>(doc.getParagraphs()); + + // 2. 正文中表格内的段落 + for (XWPFTable table : doc.getTables()) { + for (XWPFTableRow row : table.getRows()) { + for (XWPFTableCell cell : row.getTableCells()) { + allParagraphs.addAll(cell.getParagraphs()); + } + } + } + + // 3. 页眉中的段落及页眉内表格中的段落 + for (XWPFHeader header : doc.getHeaderList()) { + allParagraphs.addAll(header.getParagraphs()); + for (XWPFTable table : header.getTables()) { + for (XWPFTableRow row : table.getRows()) { + for (XWPFTableCell cell : row.getTableCells()) { + allParagraphs.addAll(cell.getParagraphs()); + } + } + } + } + + // 4. 页脚中的段落及页脚内表格中的段落 + for (XWPFFooter footer : doc.getFooterList()) { + allParagraphs.addAll(footer.getParagraphs()); + for (XWPFTable table : footer.getTables()) { + for (XWPFTableRow row : table.getRows()) { + for (XWPFTableCell cell : row.getTableCells()) { + allParagraphs.addAll(cell.getParagraphs()); + } + } + } + } + + for (XWPFParagraph paragraph : allParagraphs) { + List bookmarkStartList = paragraph.getCTP().getBookmarkStartList(); + for (CTBookmark bookmark : bookmarkStartList) { + String name = bookmark.getName(); + if (map.containsKey(name)) { + List runs = paragraph.getRuns(); + XWPFRun run = null; + int idx = 0; + for (int i = 0; i < runs.size(); i++) { + Node previousSibling = runs.get(i).getCTR().getDomNode().getPreviousSibling(); + if (previousSibling != null) { + String nodeName = previousSibling.getNodeName(); + if ("w:bookmarkEnd".equals(nodeName)) { + Node bookmarkStartNode = previousSibling.getPreviousSibling(); + if (bookmarkStartNode != null) { + Node nameAttribute = bookmarkStartNode.getAttributes().getNamedItem("w:name"); + if (nameAttribute != null && name.equals(nameAttribute.getNodeValue())) { + idx = i - 1; + break; + } + } + } + } + } + if (idx >= 0 && idx < runs.size()) { + run = runs.get(idx); + } else { + run = paragraph.createRun(); + } + BookmarkReplaceDataModel model = map.get(name); + BookmarkType type = model.getType(); + if (BookmarkType.TEXT.equals(type)) { + run.setText(model.getValue()); + } + if (BookmarkType.PICTURE.equals(type)) { + AbstractExData extData = model.getExtData(); + if (extData instanceof PictureExData picture) { + try { + run.addPicture(new ByteArrayInputStream(picture.readAsByteArray()), XWPFDocument.PICTURE_TYPE_PNG, picture.getPictureName(), Units.toEMU(picture.getWidth()), Units.toEMU(picture.getHeight())); + } catch (InvalidFormatException e) { + log.error(e.getMessage(), e); + throw new RuntimeException(e); + } + } + } + } + } + } + + File outFile = FileUtil.newFile(tmpDir + "gen/" + FileNameUtil.getName(file)); + File parentDir = outFile.getParentFile(); + if (!parentDir.exists()) { + parentDir.mkdirs(); + } + try (FileOutputStream out = new FileOutputStream(outFile)) { + doc.write(out); + } + return outFile; + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/BookmarkQuery.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/BookmarkQuery.java new file mode 100644 index 0000000..91c7266 --- /dev/null +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/BookmarkQuery.java @@ -0,0 +1,89 @@ +package com.wmyun.farmwork.word.core; + +import cn.hutool.core.io.IoUtil; +import com.wmyun.farmwork.word.core.model.BookmarkQueryDataModel; +import org.apache.poi.xwpf.usermodel.*; +import org.apache.xmlbeans.impl.common.IOUtil; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark; +import org.springframework.stereotype.Component; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @Description: TODO + * @Date: 2025/3/3 9:47 + * @Created: by ZZSLL + */ + +@Component +public class BookmarkQuery { + + /** + * 查询word文件中所有书签 + */ + public static List queryAll(byte[] fileContent) { + InputStream in = new ByteArrayInputStream(fileContent); + Set results = new HashSet<>(); + List bookmarks = new ArrayList<>(); + try (XWPFDocument doc = new XWPFDocument(in)) { + for (XWPFParagraph paragraph : doc.getParagraphs()) { + bookmarks.addAll(paragraph.getCTP().getBookmarkStartList()); + } + + for (XWPFTable table : doc.getTables()) { + for (XWPFTableRow row : table.getRows()) { + for (XWPFTableCell cell : row.getTableCells()) { + for (XWPFParagraph para : cell.getParagraphs()) { + bookmarks.addAll(para.getCTP().getBookmarkStartList()); + } + } + } + } + + for (XWPFHeader header : doc.getHeaderList()) { + for (XWPFParagraph para : header.getParagraphs()) { + bookmarks.addAll(para.getCTP().getBookmarkStartList()); + } + for (XWPFTable table : header.getTables()) { + for (XWPFTableRow row : table.getRows()) { + for (XWPFTableCell cell : row.getTableCells()) { + for (XWPFParagraph para : cell.getParagraphs()) { + bookmarks.addAll(para.getCTP().getBookmarkStartList()); + } + } + } + } + } + + for (XWPFFooter footer : doc.getFooterList()) { + for (XWPFParagraph para : footer.getParagraphs()) { + bookmarks.addAll(para.getCTP().getBookmarkStartList()); + } + for (XWPFTable table : footer.getTables()) { + for (XWPFTableRow row : table.getRows()) { + for (XWPFTableCell cell : row.getTableCells()) { + for (XWPFParagraph para : cell.getParagraphs()) { + bookmarks.addAll(para.getCTP().getBookmarkStartList()); + } + } + } + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + + for (CTBookmark bookmark : bookmarks) { + String name = bookmark.getName(); + results.add(new BookmarkQueryDataModel(name, null)); + } + + return new ArrayList<>(results); + } +} diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/enums/BookmarkType.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/enums/BookmarkType.java new file mode 100644 index 0000000..4203c10 --- /dev/null +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/enums/BookmarkType.java @@ -0,0 +1,24 @@ +package com.wmyun.farmwork.word.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @Classname BookmarkType + * @Description TODO + * @Date 2025/3/3 9:46 + * @Created by violet + */ + +@AllArgsConstructor +@Getter +public enum BookmarkType { + + TEXT("TEXT"), + + PICTURE("PICTURE"); + + + private final String type; + +} diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/enums/PictureProvideDataType.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/enums/PictureProvideDataType.java new file mode 100644 index 0000000..88562d0 --- /dev/null +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/enums/PictureProvideDataType.java @@ -0,0 +1,24 @@ +package com.wmyun.farmwork.word.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @Classname ImageProvideType + * @Description TODO + * @Date 2025/3/3 10:59 + * @Created by violet + */ + +@AllArgsConstructor +@Getter +public enum PictureProvideDataType { + + DOWNLOAD_URL("DOWNLOAD_URL"), + + BASE64("BASE64"), + + ABSOLUTE_PATH("ABSOLUTE_PATH"); + + 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 new file mode 100644 index 0000000..13877b1 --- /dev/null +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/AbstractExData.java @@ -0,0 +1,14 @@ +package com.wmyun.farmwork.word.core.model; + +import lombok.Data; + +/** + * @Description: 扩展数据 + * @Date: 2025/3/3 10:58 + * @Created: by ZZSLL + */ + +@Data +public class AbstractExData { + +} diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/BookmarkQueryDataModel.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/BookmarkQueryDataModel.java new file mode 100644 index 0000000..dcc9f6a --- /dev/null +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/BookmarkQueryDataModel.java @@ -0,0 +1,22 @@ +package com.wmyun.farmwork.word.core.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.wmyun.farmwork.word.core.enums.BookmarkType; +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @Description: 查询word文件中所有书签,返回值数据结构 + * @Date: 2025/3/3 9:44 + * @Created: by ZZSLL + */ + +@Data +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class BookmarkQueryDataModel { + + private String name; + + private BookmarkType type; +} 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 new file mode 100644 index 0000000..b6d1b72 --- /dev/null +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/BookmarkReplaceDataModel.java @@ -0,0 +1,26 @@ +package com.wmyun.farmwork.word.core.model; + +import com.wmyun.farmwork.word.core.enums.BookmarkType; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.Map; + +/** + * @Description: 书签替换数据类型 + * @Date: 2025/3/3 10:04 + * @Created: by ZZSLL + */ + +@Data +@AllArgsConstructor +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 new file mode 100644 index 0000000..4230d7a --- /dev/null +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/ext/PictureExData.java @@ -0,0 +1,46 @@ +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.model.AbstractExData; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.SneakyThrows; + +import java.net.URL; +import java.util.Base64; + +/** + * @Description: 图片扩展数据 + * @Date: 2025/3/3 10:58 + * @Created: by ZZSLL + */ + +@Data +@AllArgsConstructor +public class PictureExData extends AbstractExData { + private Integer width; + + private Integer height; + + private String pictureName; + + private PictureProvideDataType dataType; + + private String data; + + @SneakyThrows + public byte[] readAsByteArray() { + if (PictureProvideDataType.BASE64.equals(dataType)) { + return Base64.getDecoder().decode(data); + } + if (PictureProvideDataType.DOWNLOAD_URL.equals(dataType)) { + return HttpUtil.downloadBytes(data); + } + if (PictureProvideDataType.ABSOLUTE_PATH.equals(dataType)) { + return FileUtil.readBytes(data); + } + return null; + } +} diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/ext/TextExData.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/ext/TextExData.java new file mode 100644 index 0000000..9acbbb1 --- /dev/null +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/ext/TextExData.java @@ -0,0 +1,21 @@ +package com.wmyun.farmwork.word.core.model.ext; + +import com.wmyun.farmwork.word.core.model.AbstractExData; +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @Description: 文字扩展数据 + * @Date: 2025/3/3 11:14 + * @Created: by ZZSLL + */ + + +@Data +@AllArgsConstructor +public class TextExData extends AbstractExData { + + private Boolean bold; + + private Boolean italic; +} diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/config/DefaultConfig.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/config/DefaultConfig.java similarity index 79% rename from wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/config/DefaultConfig.java rename to wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/config/DefaultConfig.java index 3f5fb0f..b1784a9 100644 --- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/config/DefaultConfig.java +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/config/DefaultConfig.java @@ -1,8 +1,8 @@ -package com.wmyun.farmwork.word.config; +package com.wmyun.farmwork.word.deprecated.config; import com.deepoove.poi.config.Configure; import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; -import com.wmyun.farmwork.word.core.model.constant.TagType; +import com.wmyun.farmwork.word.deprecated.core.model.constant.TagType; /** * @Description: TODO @@ -10,6 +10,7 @@ import com.wmyun.farmwork.word.core.model.constant.TagType; * @Created: by ZZSLL */ +@Deprecated public class DefaultConfig { public static Configure def() { return Configure.builder() diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/TemplateReplaceExecutor.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/TemplateReplaceExecutor.java similarity index 83% rename from wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/TemplateReplaceExecutor.java rename to wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/TemplateReplaceExecutor.java index 3c1f372..c4f18a4 100644 --- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/TemplateReplaceExecutor.java +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/TemplateReplaceExecutor.java @@ -1,14 +1,13 @@ -package com.wmyun.farmwork.word.core; +package com.wmyun.farmwork.word.deprecated.core; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.data.Pictures; import com.deepoove.poi.data.Texts; -import com.deepoove.poi.data.style.Style; -import com.wmyun.farmwork.word.config.DefaultConfig; -import com.wmyun.farmwork.word.core.model.exec.TemplateExecDataModel; -import com.wmyun.farmwork.word.core.model.type.TypeImage; -import com.wmyun.farmwork.word.core.model.type.TypeText; +import com.wmyun.farmwork.word.deprecated.config.DefaultConfig; +import com.wmyun.farmwork.word.deprecated.core.model.exec.TemplateExecDataModel; +import com.wmyun.farmwork.word.deprecated.core.model.type.TypeImage; +import com.wmyun.farmwork.word.deprecated.core.model.type.TypeText; import jakarta.validation.constraints.NotNull; import org.springframework.stereotype.Component; @@ -16,7 +15,6 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.Map; /** @@ -26,6 +24,7 @@ import java.util.Map; */ @Component +@Deprecated public class TemplateReplaceExecutor { public static String doReplace(@NotNull String absolutePath, TemplateExecDataModel data) { return doReplace(absolutePath, data, DefaultConfig.def()); diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/TemplateTagsGenerate.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/TemplateTagsGenerate.java similarity index 90% rename from wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/TemplateTagsGenerate.java rename to wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/TemplateTagsGenerate.java index f7a5c78..2fd18c0 100644 --- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/TemplateTagsGenerate.java +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/TemplateTagsGenerate.java @@ -1,14 +1,14 @@ -package com.wmyun.farmwork.word.core; +package com.wmyun.farmwork.word.deprecated.core; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.template.ElementTemplate; import com.deepoove.poi.template.MetaTemplate; import com.deepoove.poi.template.run.RunTemplate; -import com.wmyun.farmwork.word.config.DefaultConfig; -import com.wmyun.farmwork.word.core.model.constant.TagType; -import com.wmyun.farmwork.word.core.model.gen.TagsGenDataModel; -import com.wmyun.farmwork.word.core.utils.WPUtils; +import com.wmyun.farmwork.word.deprecated.config.DefaultConfig; +import com.wmyun.farmwork.word.deprecated.core.model.constant.TagType; +import com.wmyun.farmwork.word.deprecated.core.model.gen.TagsGenDataModel; +import com.wmyun.farmwork.word.deprecated.core.utils.WPUtils; import jakarta.validation.constraints.NotNull; import org.apache.poi.xwpf.usermodel.*; @@ -25,6 +25,7 @@ import java.util.regex.Pattern; +@Deprecated public class TemplateTagsGenerate { public static List execAllTags(@NotNull String absolutePath) { diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/constant/TagType.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/constant/TagType.java similarity index 85% rename from wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/constant/TagType.java rename to wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/constant/TagType.java index f862a78..65db7dc 100644 --- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/constant/TagType.java +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/constant/TagType.java @@ -1,4 +1,4 @@ -package com.wmyun.farmwork.word.core.model.constant; +package com.wmyun.farmwork.word.deprecated.core.model.constant; import lombok.AllArgsConstructor; import lombok.Getter; @@ -12,6 +12,7 @@ import lombok.Getter; @Getter @AllArgsConstructor +@Deprecated public enum TagType { TEXT("TEXT", ""), diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/exec/TemplateExecDataModel.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/exec/TemplateExecDataModel.java similarity index 56% rename from wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/exec/TemplateExecDataModel.java rename to wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/exec/TemplateExecDataModel.java index c3a5a97..3de25e5 100644 --- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/exec/TemplateExecDataModel.java +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/exec/TemplateExecDataModel.java @@ -1,7 +1,7 @@ -package com.wmyun.farmwork.word.core.model.exec; +package com.wmyun.farmwork.word.deprecated.core.model.exec; -import com.wmyun.farmwork.word.core.model.type.TypeImage; -import com.wmyun.farmwork.word.core.model.type.TypeText; +import com.wmyun.farmwork.word.deprecated.core.model.type.TypeImage; +import com.wmyun.farmwork.word.deprecated.core.model.type.TypeText; import lombok.*; import java.util.List; @@ -15,6 +15,7 @@ import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor +@Deprecated public class TemplateExecDataModel { private List text; diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/gen/TagsGenDataModel.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/gen/TagsGenDataModel.java similarity index 81% rename from wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/gen/TagsGenDataModel.java rename to wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/gen/TagsGenDataModel.java index 14121b8..eb8e716 100644 --- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/gen/TagsGenDataModel.java +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/gen/TagsGenDataModel.java @@ -1,6 +1,6 @@ -package com.wmyun.farmwork.word.core.model.gen; +package com.wmyun.farmwork.word.deprecated.core.model.gen; -import com.wmyun.farmwork.word.core.model.constant.TagType; +import com.wmyun.farmwork.word.deprecated.core.model.constant.TagType; import lombok.*; import java.util.List; @@ -14,6 +14,7 @@ import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor +@Deprecated public class TagsGenDataModel { /** diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/type/TypeImage.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/type/TypeImage.java similarity index 90% rename from wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/type/TypeImage.java rename to wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/type/TypeImage.java index d2c78fd..369f021 100644 --- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/type/TypeImage.java +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/type/TypeImage.java @@ -1,4 +1,4 @@ -package com.wmyun.farmwork.word.core.model.type; +package com.wmyun.farmwork.word.deprecated.core.model.type; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,6 +11,7 @@ import lombok.Data; @Data @AllArgsConstructor +@Deprecated public class TypeImage { /** diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/type/TypeTable.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/type/TypeTable.java similarity index 83% rename from wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/type/TypeTable.java rename to wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/type/TypeTable.java index 39d75b1..f4103e3 100644 --- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/type/TypeTable.java +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/type/TypeTable.java @@ -1,4 +1,4 @@ -package com.wmyun.farmwork.word.core.model.type; +package com.wmyun.farmwork.word.deprecated.core.model.type; import lombok.AllArgsConstructor; import lombok.Data; @@ -14,6 +14,7 @@ import java.util.Map; @Data @AllArgsConstructor +@Deprecated public class TypeTable { /** * 标签名称 diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/type/TypeText.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/type/TypeText.java similarity index 92% rename from wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/type/TypeText.java rename to wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/type/TypeText.java index e3932ae..85e6669 100644 --- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/model/type/TypeText.java +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/model/type/TypeText.java @@ -1,4 +1,4 @@ -package com.wmyun.farmwork.word.core.model.type; +package com.wmyun.farmwork.word.deprecated.core.model.type; import lombok.AllArgsConstructor; import lombok.Data; @@ -11,6 +11,7 @@ import lombok.Data; @Data @AllArgsConstructor +@Deprecated public class TypeText { /** diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/utils/WPUtils.java b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/utils/WPUtils.java similarity index 92% rename from wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/utils/WPUtils.java rename to wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/utils/WPUtils.java index 45f07b4..953dd0b 100644 --- a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/core/utils/WPUtils.java +++ b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/java/com/wmyun/farmwork/word/deprecated/core/utils/WPUtils.java @@ -1,4 +1,4 @@ -package com.wmyun.farmwork.word.core.utils; +package com.wmyun.farmwork.word.deprecated.core.utils; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import org.apache.poi.xwpf.usermodel.XWPFTableRow; diff --git a/wmyun-framework/wmyun-spring-boot-starter-word/src/main/resources/EHSP-MFX250222-A.docx b/wmyun-framework/wmyun-spring-boot-starter-word/src/main/resources/EHSP-MFX250222-A.docx new file mode 100644 index 0000000000000000000000000000000000000000..bb54c5c37bc293482ca36e0e9f5318394098bd9d GIT binary patch literal 46838 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%0AgU`qskR&kk1L}g{M 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 DA3T|` literal 0 HcmV?d00001 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 new file mode 100644 index 0000000..a832938 --- /dev/null +++ b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/controller/admin/word/WordBookmarkController.java @@ -0,0 +1,38 @@ +package com.wmyun.module.infra.controller.admin.word; + +import com.wmyun.farmwork.word.core.model.BookmarkQueryDataModel; +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.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Set; + +/** + * @Description: TODO + * @Date: 2025/3/3 9:36 + * @Created: by ZZSLL + */ + +@Tag(name = "管理后台 - Word bookmark替换") +@RestController +@RequestMapping("/infra/word/bookmark") +public class WordBookmarkController { + + @Autowired + private WordBookmarkService service; + + @PostMapping("/file/{fileId}") + public CommonResult> requestAllBookmarks(@PathVariable("fileId") String fileId) { + return CommonResult.success(service.queryAllBookmarks(fileId)); + } + + @PostMapping("/file/{fileId}/generate") + public CommonResult doGenerate(@PathVariable("fileId") String fileId, @RequestBody List 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/controller/admin/word/WordTemplateController.java b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/controller/admin/word/WordTemplateController.java index 0cb80b6..2f43b75 100644 --- a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/controller/admin/word/WordTemplateController.java +++ b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/controller/admin/word/WordTemplateController.java @@ -1,7 +1,7 @@ package com.wmyun.module.infra.controller.admin.word; -import com.wmyun.farmwork.word.core.model.exec.TemplateExecDataModel; -import com.wmyun.farmwork.word.core.model.gen.TagsGenDataModel; +import com.wmyun.farmwork.word.deprecated.core.model.exec.TemplateExecDataModel; +import com.wmyun.farmwork.word.deprecated.core.model.gen.TagsGenDataModel; import com.wmyun.framework.common.pojo.CommonResult; import com.wmyun.module.infra.service.file.WordTemplateTagService; import io.swagger.v3.oas.annotations.tags.Tag; diff --git a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/FileService.java b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/FileService.java index 879bd6c..f21906c 100644 --- a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/FileService.java +++ b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/FileService.java @@ -31,6 +31,8 @@ public interface FileService { */ String createFile(String name, String path, byte[] content); + FileDO createFileDO(String name, String path, byte[] content); + /** * 创建文件 * diff --git a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/FileServiceImpl.java b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/FileServiceImpl.java index 5bf0cd7..346cdb2 100644 --- a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/FileServiceImpl.java +++ b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/FileServiceImpl.java @@ -69,6 +69,36 @@ public class FileServiceImpl implements FileService { return url; } + @Override + @SneakyThrows + public FileDO createFileDO(String name, String path, byte[] content) { + // 计算默认的 path 名 + String type = FileTypeUtils.getMineType(content, name); + if (StrUtil.isEmpty(path)) { + path = FileUtils.generatePath(content, name); + } + // 如果 name 为空,则使用 path 填充 + if (StrUtil.isEmpty(name)) { + name = path; + } + + // 上传到文件存储器 + FileClient client = fileConfigService.getMasterFileClient(); + Assert.notNull(client, "客户端(master) 不能为空"); + String url = client.upload(content, path, type); + + // 保存到数据库 + FileDO file = new FileDO(); + file.setConfigId(client.getId()); + file.setName(name); + file.setPath(path); + file.setUrl(url); + file.setType(type); + file.setSize(content.length); + fileMapper.insert(file); + return file; + } + @Override public Long createFile(FileCreateReqVO createReqVO) { FileDO file = BeanUtils.toBean(createReqVO, FileDO.class); 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 new file mode 100644 index 0000000..9638393 --- /dev/null +++ b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordBookmarkService.java @@ -0,0 +1,20 @@ +package com.wmyun.module.infra.service.file; + +import com.wmyun.farmwork.word.core.model.BookmarkReplaceDataModel; + +import java.util.List; +import java.util.Set; + +/** + * @Classname WordBookmarkService + * @Description TODO + * @Date 2025/3/3 9:38 + * @Created by violet + */ + +public interface WordBookmarkService { + + Set queryAllBookmarks(String fileId); + + Long replaceBookmarkWithContent(String fileId, List 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 new file mode 100644 index 0000000..68d3dda --- /dev/null +++ b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordBookmarkServiceImpl.java @@ -0,0 +1,50 @@ +package com.wmyun.module.infra.service.file; + +import cn.hutool.core.io.FileUtil; +import com.wmyun.farmwork.word.core.BookmarkExec; +import com.wmyun.farmwork.word.core.BookmarkQuery; +import com.wmyun.farmwork.word.core.model.BookmarkQueryDataModel; +import com.wmyun.farmwork.word.core.model.BookmarkReplaceDataModel; +import com.wmyun.module.infra.dal.dataobject.file.FileDO; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @Description: TODO + * @Date: 2025/3/3 9:38 + * @Created: by ZZSLL + */ + +@Service +public class WordBookmarkServiceImpl implements WordBookmarkService { + + @Autowired + private FileService fileService; + + @Autowired + private FilePreviewService previewService; + + @SneakyThrows + @Override + public Set queryAllBookmarks(String fileId) { + FileDO fileDO = previewService.queryFileInfoByFileId(fileId); + return BookmarkQuery.queryAll(fileService.getFileContent(fileDO.getConfigId(), fileDO.getPath())).stream().map(BookmarkQueryDataModel::getName).collect(Collectors.toSet()); + } + + @SneakyThrows + @Override + public Long replaceBookmarkWithContent(String fileId, List data) { + FileDO fileDO = previewService.queryFileInfoByFileId(fileId); + byte[] content = fileService.getFileContent(fileDO.getConfigId(), fileDO.getPath()); + File file = FileUtil.newFile(BookmarkExec.tmpDir + fileDO.getName()); + FileUtil.writeBytes(content, file); + File outputFile = BookmarkExec.replace(data, content, file); + return fileService.createFileDO(outputFile.getName(), outputFile.getAbsolutePath(), FileUtil.readBytes(outputFile)).getId(); + } +} diff --git a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordTemplateTagService.java b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordTemplateTagService.java index 105d004..078cd23 100644 --- a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordTemplateTagService.java +++ b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordTemplateTagService.java @@ -1,7 +1,7 @@ package com.wmyun.module.infra.service.file; -import com.wmyun.farmwork.word.core.model.exec.TemplateExecDataModel; -import com.wmyun.farmwork.word.core.model.gen.TagsGenDataModel; +import com.wmyun.farmwork.word.deprecated.core.model.exec.TemplateExecDataModel; +import com.wmyun.farmwork.word.deprecated.core.model.gen.TagsGenDataModel; import java.util.List; diff --git a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordTemplateTagServiceImpl.java b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordTemplateTagServiceImpl.java index d0629f0..00ed8e7 100644 --- a/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordTemplateTagServiceImpl.java +++ b/wmyun-module-infra/wmyun-module-infra-biz/src/main/java/com/wmyun/module/infra/service/file/WordTemplateTagServiceImpl.java @@ -1,9 +1,9 @@ package com.wmyun.module.infra.service.file; -import com.wmyun.farmwork.word.core.TemplateReplaceExecutor; -import com.wmyun.farmwork.word.core.TemplateTagsGenerate; -import com.wmyun.farmwork.word.core.model.exec.TemplateExecDataModel; -import com.wmyun.farmwork.word.core.model.gen.TagsGenDataModel; +import com.wmyun.farmwork.word.deprecated.core.TemplateReplaceExecutor; +import com.wmyun.farmwork.word.deprecated.core.TemplateTagsGenerate; +import com.wmyun.farmwork.word.deprecated.core.model.exec.TemplateExecDataModel; +import com.wmyun.farmwork.word.deprecated.core.model.gen.TagsGenDataModel; import com.wmyun.module.infra.dal.dataobject.file.FileDO; import com.wmyun.module.infra.framework.file.core.client.FileClient; import org.springframework.beans.factory.annotation.Autowired;