Browse Source

试车导入支持图片

wangming 4 months ago
parent
commit
c4f7c9e8ec

+ 59 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxCommissionCheckServiceImpl.java

@@ -45,6 +45,7 @@ import com.rongwei.rwcommoncomponent.excel.aspose.ExcelExportUtil;
 import com.rongwei.rwcommoncomponent.excel.aspose.ExcelUtils;
 import com.rongwei.rwcommoncomponent.excel.utils.WordHelpUtils;
 import com.rongwei.rwcommoncomponent.excel.vo.FormData;
+import com.rongwei.rwcommoncomponent.file.dto.SysFileItemParamDto;
 import com.rongwei.rwcommoncomponent.file.service.SysFileItemService;
 import com.rongwei.rwcommonentity.commonservers.domain.SysFileItemDo;
 import jodd.util.StringUtil;
@@ -55,6 +56,7 @@ import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -1779,10 +1781,13 @@ public class ZhcxCommissionCheckServiceImpl extends ServiceImpl<ZhcxCommissionCh
         Map<String, SysDictDo> dictMap = new HashMap<>(list.size());
         list.stream().forEach(item -> dictMap.put(item.getName(), item));
 
+        final Map<String, List<String>> docImgMap = parseDocImage(doc); //word中图片
+
         final ParseDocBO docBO = ParseDocBO.builder()
                 .id(importDto.getId())
                 .dictMap(dictMap)
                 .project(project)
+                .docImgMap(docImgMap)
                 .build();
 
         //解析word文档
@@ -2458,6 +2463,60 @@ public class ZhcxCommissionCheckServiceImpl extends ServiceImpl<ZhcxCommissionCh
         return R.ok();
     }
 
+    /**
+     * 解析word中图片
+     *
+     * @param doc
+     * @return key:为标题,value: 系统图片格式
+     */
+    private Map<String, List<String>> parseDocImage(Document doc) {
+
+        // 创建一个 NodeCollection 对象,用于存储文档中的所有形状
+        NodeCollection shapes = doc.getChildNodes(NodeType.SHAPE, true);
+
+        Map<String, List<String>> docImgMap = new HashMap<>();
+        // 遍历所有形状
+        try {
+            for (int i = 0; i < shapes.getCount(); i++) {
+                Shape shape = (Shape) shapes.get(i);
+                // 检查形状是否包含图片
+                if (!shape.hasImage()) {
+                    continue;
+                }
+
+                // 查找图片所在的标题
+                String title = ImportCommissionHelp.findTitleForImage(shape, doc);
+                if(ObjectUtil.isEmpty(title)) {
+                    continue;
+                }
+
+                List<String> imgList = docImgMap.get(title);
+                if(ObjectUtil.isNull(imgList)) {
+                    imgList = new ArrayList<>();
+                }
+
+                //图片名称
+                SysFileItemParamDto itemParamDto = SysFileItemParamDto.builder()
+                        .fileName("img_word_".concat(String.valueOf(i)).concat(FileFormatUtil.imageTypeToExtension(shape.getImageData().getImageType())))
+                        .folderCode("driveinspection_files")
+                        .build();
+                final SysFileItemDo fileItemDo = sysFileItemService.assembleItem(itemParamDto, null);
+                fileItemDo.setFilename(String.format("img_word_%s.%s", fileItemDo.getId(), FileFormatUtil.imageTypeToExtension(shape.getImageData().getImageType())));
+                FileOutputStream out = new FileOutputStream(fileItemDo.getFullpath());
+                out.write(shape.getImageData().getImageBytes());
+                out.close();
+
+                imgList.add(fileItemDo.getFilename().concat("-;-").concat(fileItemDo.getId()));
+                docImgMap.put(title, imgList);
+            }
+        } catch (Exception e) {
+            log.error("图片解析失败, {}", e);
+            throw new CustomException("图片解析失败");
+        }
+
+        return docImgMap;
+    }
+
     private void insertDetailData(List<ZhcxCommissionCheckBaseInfoTreeDo> treeList, List<ZhcxCommissionCheckBaseInfoDetailDo> detailList) {
         //设置标准库子表的三级分类的id和树的全路径treefullid字段
         if (!treeList.isEmpty() && !detailList.isEmpty()) {

+ 50 - 2
business-common/src/main/java/com/rongwei/bscommon/sys/utils/ImportCommissionHelp.java

@@ -155,8 +155,8 @@ public class ImportCommissionHelp {
 //        int currentLevelNumber = paragraph.getListFormat().getListLevelNumber();
         String currentLevelStr = paragraph.getParagraphFormat().getStyle().getName().replace("Heading ", "");
         int currentLevelNumber = Integer.parseInt(currentLevelStr);
-        String cellVal = getNodeText(paragraph);
-        cellVal = replaceNo(cellVal);
+        String cellNoVal = getNodeText(paragraph);
+        String cellVal = replaceNo(cellNoVal);
 
         ZhcxCommissionCheckDetailTreeDo treeDo = new ZhcxCommissionCheckDetailTreeDo();
         treeDo.setId(SecurityUtil.getUUID());
@@ -165,6 +165,10 @@ public class ImportCommissionHelp {
         treeDo.setBaseinfoid(importDto.getId());
         treeDo.setLevel(currentLevelNumber);
 
+        if(ObjectUtil.isNotEmpty(importDto.getDocImgMap()) && ObjectUtil.isNotEmpty(importDto.getDocImgMap().get(cellNoVal))) {
+            treeDo.setAnnex(StringUtils.join(importDto.getDocImgMap().get(cellNoVal), "^_^"));
+        }
+
         if(treeList.size() == 0) {
             treeDo.setTreecode("1.1");
         } else {
@@ -320,4 +324,48 @@ public class ImportCommissionHelp {
 
         return StrUtil.trim(text.replace("\u0007", ""));
     }
+
+    /**
+     * 找出图片所在标题
+     *
+     * @param imageShape
+     * @param doc
+     * @return
+     */
+    public static String findTitleForImage(Shape imageShape, Document doc) {
+        Node currentNode = imageShape;
+        while (currentNode != null) {
+            if (currentNode.getNodeType() == NodeType.PARAGRAPH) {
+                Paragraph para = (Paragraph) currentNode;
+                if (isHeadingStyle(para)) {
+                    return para.getText().trim();
+                }
+            }
+            // 先尝试查找前一个兄弟节点
+            Node prevSibling = currentNode.getPreviousSibling();
+            if (prevSibling != null) {
+                currentNode = prevSibling;
+            } else {
+                // 如果没有前一个兄弟节点,向上查找父节点
+                currentNode = currentNode.getParentNode();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 判断是否为标题
+     *
+     * @param para
+     * @return
+     */
+    public static boolean isHeadingStyle(Paragraph para) {
+        int styleId = para.getParagraphFormat().getStyleIdentifier();
+        // 可以根据需要添加更多标题级别
+        return styleId == StyleIdentifier.HEADING_1 ||
+                styleId == StyleIdentifier.HEADING_2 ||
+                styleId == StyleIdentifier.HEADING_3 ||
+                styleId == StyleIdentifier.HEADING_4 ||
+                styleId == StyleIdentifier.HEADING_5;
+    }
 }

+ 8 - 0
business-entity/src/main/java/com/rongwei/bsentity/dto/commission/ParseDocBO.java

@@ -4,6 +4,7 @@ import com.rongwei.bsentity.domain.ZhcxProjectManageDo;
 import com.rongwei.rwadmincommon.system.domain.SysDictDo;
 import lombok.*;
 
+import java.util.List;
 import java.util.Map;
 
 @Setter
@@ -21,4 +22,11 @@ public class ParseDocBO {
     private Map<String, SysDictDo> dictMap;
 
     private ZhcxProjectManageDo project;
+
+    /**
+     * word中每个标题下的图片
+     * key:标题
+     * value: 标题下图片
+     */
+    private Map<String, List<String>> docImgMap;
 }