Эх сурвалжийг харах

fix: 修复文件上传时外键约束失败问题

- 在 FileUploadService 中添加 DocumentService 依赖
- 上传文件时先在 documents 表中创建记录,满足 parse_tasks 表的外键约束
- 更新测试脚本,添加用户注册步骤以满足 documents 表对 users 表的外键约束
- parse-service 添加对 document-service 的依赖
何文松 1 сар өмнө
parent
commit
b22a18c3d3

+ 8 - 0
backend/parse-service/pom.xml

@@ -68,6 +68,14 @@
             <optional>true</optional>
         </dependency>
         
+        <!-- Document Service (单体应用模式直接依赖) -->
+        <dependency>
+            <groupId>com.lingyue</groupId>
+            <artifactId>document-service</artifactId>
+            <version>${project.version}</version>
+            <optional>true</optional>
+        </dependency>
+        
         <!-- Lombok -->
         <dependency>
             <groupId>org.projectlombok</groupId>

+ 41 - 2
backend/parse-service/src/main/java/com/lingyue/parse/service/FileUploadService.java

@@ -1,6 +1,8 @@
 package com.lingyue.parse.service;
 
 import com.lingyue.common.exception.ServiceException;
+import com.lingyue.document.entity.Document;
+import com.lingyue.document.service.DocumentService;
 import com.lingyue.parse.config.FileStorageProperties;
 import com.lingyue.parse.dto.FileUploadResponse;
 import com.lingyue.parse.enums.FileType;
@@ -33,6 +35,7 @@ public class FileUploadService {
     
     private final FileStorageProperties fileStorageProperties;
     private final ParseTaskExecutor parseTaskExecutor;
+    private final DocumentService documentService;
     
     /**
      * 上传文件
@@ -64,10 +67,24 @@ public class FileUploadService {
             throw new ServiceException("文件保存失败: " + e.getMessage());
         }
 
-        // 6. 提交解析任务(异步执行)
+        // 6. 在 documents 表中创建记录(满足外键约束)
+        Document document = new Document();
+        document.setId(documentId);
+        document.setUserId(userId);
+        document.setName(file.getOriginalFilename());
+        document.setType(mapFileTypeToDocType(fileType));
+        document.setStatus("parsing");
+        document.setFileSize(file.getSize());
+        document.setFileUrl(filePath);
+        document.setParseStatus("pending");
+        document.setParseProgress(0);
+        documentService.saveDocument(document);
+        log.info("文档记录创建成功, documentId={}", documentId);
+
+        // 7. 提交解析任务(异步执行)
         parseTaskExecutor.submitParseTask(documentId, filePath, fileType);
         
-        // 7. 构建响应
+        // 8. 构建响应
         return FileUploadResponse.builder()
                 .documentId(documentId)
                 .fileName(file.getOriginalFilename())
@@ -79,6 +96,28 @@ public class FileUploadService {
                 .build();
     }
     
+    /**
+     * 将 FileType 转换为文档类型字符串
+     */
+    private String mapFileTypeToDocType(FileType fileType) {
+        switch (fileType) {
+            case PDF:
+                return "pdf";
+            case WORD:
+            case WORD_OLD:
+                return "word";
+            case EXCEL:
+            case EXCEL_OLD:
+                return "excel";
+            case IMAGE_JPG:
+            case IMAGE_PNG:
+            case IMAGE_GIF:
+                return "image";
+            default:
+                return "other";
+        }
+    }
+    
     /**
      * 验证文件
      */

+ 65 - 6
test/test_upload_api.sh

@@ -4,22 +4,27 @@
 # 文件上传接口测试脚本
 # ============================================
 # 使用方法: ./test_upload_api.sh [host] [port]
-# 示例: ./test_upload_api.sh localhost 8003
+# 示例: ./test_upload_api.sh localhost 5232
 # ============================================
 
 # 配置参数
 HOST=${1:-localhost}
-PORT=${2:-8003}
+PORT=${2:-5232}
 BASE_URL="http://${HOST}:${PORT}"
 UPLOAD_URL="${BASE_URL}/api/v1/parse/upload"
 STATUS_URL="${BASE_URL}/parse/status"
+REGISTER_URL="${BASE_URL}/auth/register"
 
 # 测试文件路径(相对于脚本所在目录)
 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 TEST_FILE="${SCRIPT_DIR}/test.docx"
 
-# 测试用户ID
-USER_ID="test-user-$(date +%s)"
+# 测试用户信息
+TIMESTAMP=$(date +%s)
+TEST_USERNAME="testuser_${TIMESTAMP}"
+TEST_EMAIL="testuser_${TIMESTAMP}@test.com"
+TEST_PASSWORD="Test123456!"
+USER_ID=""
 
 # 颜色定义
 RED='\033[0;31m'
@@ -99,6 +104,58 @@ check_service() {
     fi
 }
 
+# 注册测试用户
+register_test_user() {
+    print_header "注册测试用户"
+    
+    print_info "用户名: $TEST_USERNAME"
+    print_info "邮箱: $TEST_EMAIL"
+    print_info "注册URL: $REGISTER_URL"
+    
+    RESPONSE=$(curl -s -w "\n%{http_code}" \
+        -X POST "$REGISTER_URL" \
+        -H "Content-Type: application/json" \
+        -d "{\"username\":\"${TEST_USERNAME}\",\"email\":\"${TEST_EMAIL}\",\"password\":\"${TEST_PASSWORD}\",\"confirmPassword\":\"${TEST_PASSWORD}\"}" \
+        --connect-timeout 10)
+    
+    HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
+    BODY=$(echo "$RESPONSE" | sed '$d')
+    
+    echo -e "\n${YELLOW}响应状态码:${NC} $HTTP_CODE"
+    
+    if [ "$JQ_AVAILABLE" = true ]; then
+        echo "$BODY" | jq . 2>/dev/null || echo "$BODY"
+    else
+        echo "$BODY"
+    fi
+    
+    # 解析用户ID
+    if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "201" ]; then
+        print_success "用户注册成功!"
+        
+        if [ "$JQ_AVAILABLE" = true ]; then
+            USER_ID=$(echo "$BODY" | jq -r '.data.user.id // .data.userId // .userId // empty' 2>/dev/null)
+            if [ -z "$USER_ID" ] || [ "$USER_ID" = "null" ]; then
+                # 尝试其他可能的字段
+                USER_ID=$(echo "$BODY" | jq -r '.data.id // .id // empty' 2>/dev/null)
+            fi
+            
+            if [ -n "$USER_ID" ] && [ "$USER_ID" != "null" ]; then
+                print_info "用户ID: $USER_ID"
+                echo "$USER_ID" > "${SCRIPT_DIR}/.last_user_id"
+            else
+                print_error "无法从响应中获取用户ID"
+                echo "响应内容: $BODY"
+                exit 1
+            fi
+        fi
+    else
+        print_error "用户注册失败 (HTTP $HTTP_CODE)"
+        print_info "响应: $BODY"
+        exit 1
+    fi
+}
+
 # 测试文件上传
 test_upload() {
     print_header "测试文件上传接口"
@@ -231,8 +288,8 @@ show_help() {
     echo "  -s, --status    仅查询上次上传的文档状态"
     echo ""
     echo "示例:"
-    echo "  $0                      # 使用默认配置 (localhost:8003)"
-    echo "  $0 192.168.1.100 8003   # 指定服务器地址"
+    echo "  $0                      # 使用默认配置 (localhost:5232)"
+    echo "  $0 192.168.1.100 5232   # 指定服务器地址"
     echo "  $0 -p                   # 上传并轮询状态"
     echo "  $0 -s                   # 查询上次上传的状态"
 }
@@ -272,6 +329,7 @@ main() {
     BASE_URL="http://${HOST}:${PORT}"
     UPLOAD_URL="${BASE_URL}/api/v1/parse/upload"
     STATUS_URL="${BASE_URL}/parse/status"
+    REGISTER_URL="${BASE_URL}/auth/register"
     
     print_header "文件上传接口测试"
     echo "目标服务: $BASE_URL"
@@ -292,6 +350,7 @@ main() {
     
     check_test_file
     check_service
+    register_test_user
     test_upload
     
     if [ "$POLL_STATUS" = true ] && [ -f "${SCRIPT_DIR}/.last_document_id" ]; then