Просмотр исходного кода

feat(backend): 优化附件解析和项目服务

何文松 4 дней назад
Родитель
Сommit
0d68ec258e

+ 10 - 0
backend/lingyue-graph/src/main/java/com/lingyue/graph/service/PropertyService.java

@@ -95,6 +95,16 @@ public class PropertyService {
         return prop != null ? prop.getPropValue() : null;
     }
 
+    /**
+     * 获取节点属性字符串值(优先返回 propValue,其次 propJson)
+     */
+    public String getNodePropertyString(Long nodeId, String key) {
+        NodeProperty prop = nodePropertyMapper.selectByNodeAndKey(nodeId, key);
+        if (prop == null) return null;
+        if (prop.getPropValue() != null) return prop.getPropValue();
+        return prop.getPropJson();
+    }
+
     public String getNodePropertyJson(Long nodeId, String key) {
         NodeProperty prop = nodePropertyMapper.selectByNodeAndKey(nodeId, key);
         return prop != null ? prop.getPropJson() : null;

+ 7 - 2
backend/lingyue-project/src/main/java/com/lingyue/project/attachment/controller/AttachmentController.java

@@ -116,8 +116,13 @@ public class AttachmentController {
     @PostMapping("/api/v1/tools/parse-docx")
     public Result<Map<String, String>> parseDocx(@RequestParam("file") MultipartFile file) {
         String fileName = file.getOriginalFilename();
-        if (fileName == null || (!fileName.toLowerCase().endsWith(".docx"))) {
-            return Result.fail(400, "仅支持 .docx 格式文件");
+        String contentType = file.getContentType();
+        log.info("parse-docx 收到文件: fileName={}, contentType={}, size={}", fileName, contentType, file.getSize());
+        boolean isDocx = (fileName != null && fileName.toLowerCase().endsWith(".docx"))
+                || "application/vnd.openxmlformats-officedocument.wordprocessingml.document".equals(contentType)
+                || (file.getSize() > 0 && fileName != null && !fileName.toLowerCase().endsWith(".pdf") && !fileName.toLowerCase().endsWith(".png"));
+        if (!isDocx) {
+            return Result.fail(400, "仅支持 .docx 格式文件, 收到: " + fileName);
         }
         try {
             String html = docxParseService.parseToHtmlBody(file.getInputStream());

+ 1 - 0
backend/lingyue-project/src/main/java/com/lingyue/project/project/dto/ProjectDetailVO.java

@@ -15,5 +15,6 @@ public class ProjectDetailVO {
     public static class ProjectFullVO extends ProjectVO {
         private String contentHtml;
         private String contentMarkdown;
+        private Object contentJson;
     }
 }

+ 2 - 1
backend/lingyue-project/src/main/java/com/lingyue/project/project/service/ProjectService.java

@@ -54,7 +54,7 @@ public class ProjectService {
     }
 
     public ProjectDetailVO getProjectDetail(Long projectId) {
-        VProject vp = projectViewMapper.selectById(projectId);
+        VProject vp = projectViewMapper.selectProjectWithContent(projectId);
         if (vp == null) {
             throw new BusinessException(404, "项目不存在");
         }
@@ -70,6 +70,7 @@ public class ProjectService {
         fullVO.setTemplateType(vp.getTemplateType());
         fullVO.setContentHtml(vp.getContentHtml());
         fullVO.setContentMarkdown(vp.getContentMarkdown());
+        fullVO.setContentJson(vp.getContentJson());
         fullVO.setElementCount(vp.getElementCount());
         fullVO.setAttachmentCount(vp.getAttachmentCount());
         fullVO.setRuleCount(vp.getRuleCount());

+ 3 - 0
backend/lingyue-project/src/main/java/com/lingyue/project/project/viewmapper/ProjectViewMapper.java

@@ -10,6 +10,9 @@ import java.util.List;
 @Mapper
 public interface ProjectViewMapper extends BaseMapper<VProject> {
 
+    @Select("SELECT id, title, project_code, status, description, template_type, content_html, content_markdown, content_json::text as content_json, element_count, attachment_count, rule_count, filled_count, source_project_id, created_by, created_by_name, created_at, updated_at FROM v_projects WHERE id = #{id}")
+    VProject selectProjectWithContent(@Param("id") Long id);
+
     @Select("SELECT * FROM v_project_elements WHERE project_id = #{projectId} ORDER BY sort_order")
     List<VProjectElement> selectElementsByProjectId(@Param("projectId") Long projectId);
 

+ 6 - 1
backend/lingyue-project/src/main/java/com/lingyue/project/project/viewmapper/VProject.java

@@ -3,11 +3,14 @@ package com.lingyue.project.project.viewmapper;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
 @Data
-@TableName("v_projects")
+@TableName(value = "v_projects", autoResultMap = true)
 public class VProject implements Serializable {
 
     private Long id;
@@ -18,6 +21,8 @@ public class VProject implements Serializable {
     private String templateType;
     private String contentHtml;
     private String contentMarkdown;
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private Object contentJson;
     private Long elementCount;
     private Long attachmentCount;
     private Long ruleCount;