Quellcode durchsuchen

上传文件至 'routers/api'

许国洋 vor 9 Monaten
Ursprung
Commit
7288e46524
1 geänderte Dateien mit 241 neuen und 20 gelöschten Zeilen
  1. 241 20
      routers/api/__init__.py

+ 241 - 20
routers/api/__init__.py

@@ -1,24 +1,245 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-from fastapi import APIRouter, Depends
-from common.security import valid_access_token
-from .login import router as login_router
-from . import gateway
-from . import dataAnalysis
-from . import resourceMonitoring
-from . import OneShareProxyHandler
-from . import jobs
-from . import upload_file
-from . import videoResource
+from fastapi import APIRouter, Request, Depends, HTTPException
+from sqlalchemy.exc import IntegrityError
 
+from fastapi.responses import JSONResponse
+from database import get_db
+from sqlalchemy.orm import Session
+from models import *
+import json
+import random
+from sqlalchemy import create_engine, select
 router = APIRouter()
 
-router.include_router(login_router)
+# @router.post('/create')
+# async def create_knowledge(request:Request,db:Session = Depends(get_db)):
+#     data = await request.body()
+#     body = data.decode(encoding='utf-8')
+#     if len(body) > 0:
+#         body = json.loads(body)
+#     print(body)
+#     random_10_digit_number = random.randint(1000000000, 9999999999)
+#     # file_identifier = 'f'
+#     reportId = 'ZJBG'+str(random_10_digit_number)
+#     # file_identifier =
+#     reportName = body["reportName"]
+#     subject = body["subject"]
+#     eventType = body["eventType"]
+#     publishingUnit = body["publishingUnit"]
+#     publishDate = body["publishDate"]
+#     summary = body["summary"]
+#
+#     notificationType = body["notificationType"]
+#
+#     base_code = 'base'+str(random.randint(1000000000, 9999999999))
+#
+#     fileNames = body["fileName"]
+#     filePath = '/data/upload/mergefile/'
+#
+#
+#
+#     konwledge = KnowledgeBase(
+#         reportId=reportId,
+#
+#         reportName=reportName,
+#         subject=subject,
+#         eventType=eventType,
+#         publishingUnit=publishingUnit,
+#         publishDate=publishDate,
+#         summary = summary,
+#         notificationType = notificationType,
+#
+#         base_code = base_code
+#     )
+#     db.add(konwledge)
+#
+#     for fileName in fileNames:
+#         file_identifier='file'+str(random.randint(1000000000, 9999999999))
+#         knowledge_file = KnowledgeFile(
+#             file_identifier=file_identifier,
+#             file_path=filePath,
+#             file_name = fileName,
+#             is_deleted = 0,
+#             knowledge_base_code = base_code
+#         )
+#         db.add(knowledge_file)
+#
+#     db.commit()
+#     return {
+#         "code":0,
+#         "data":{
+#             "reportId": reportId,
+#             "status": "success",
+#             "message": "总结报告创建成功"
+#         }
+#     }
 
-router.include_router(gateway.router, prefix="/gateway") #, dependencies=[Depends(valid_access_token)]
-router.include_router(dataAnalysis.router, prefix="/dataAnalysis")
-router.include_router(resourceMonitoring.router, prefix="/resource")
-router.include_router(jobs.router, prefix="/jobs")
-router.include_router(OneShareProxyHandler.router, prefix="/oneShare")
-router.include_router(upload_file.router, prefix="/file")
-router.include_router(videoResource.router, prefix="/videoResource")
+
+@router.post('/create')
+async def create_knowledge(request: Request, db: Session = Depends(get_db)):
+    try:
+        data = await request.body()
+        body = json.loads(data.decode(encoding='utf-8'))
+
+        # 验证必需的字段
+        required_fields = ['reportName', 'subject', 'eventType', 'publishingUnit', 'publishDate', 'summary',
+                           'notificationType', 'fileNames']
+        missing_fields = [field for field in required_fields if field not in body]
+        print('missing_fields',missing_fields)
+        if missing_fields:
+            raise HTTPException(status_code=401, detail=f"Missing required fields: {', '.join(missing_fields)}")
+
+            # 生成随机的报告ID和基础知识代码
+        random_10_digit_number = random.randint(1000000000, 9999999999)
+        reportId = 'ZJBG' + str(random_10_digit_number)
+        base_code = 'base' + str(random.randint(1000000000, 9999999999))
+
+        # 从请求体中提取其他数据
+        reportName = body["reportName"]
+        subject = body["subject"]
+        eventType = body["eventType"]
+        publishingUnit = body["publishingUnit"]
+        publishDate = body["publishDate"]
+        summary = body["summary"]
+        notificationType = body["notificationType"]
+        fileNames = body["fileNames"]  # 注意:这里假设它是列表
+
+        # 创建 KnowledgeBase 实例
+        konwledge = KnowledgeBase(
+            reportId=reportId,
+            reportName=reportName,
+            subject=subject,
+            eventType=eventType,
+            publishingUnit=publishingUnit,
+            publishDate=publishDate,
+            summary=summary,
+            notificationType=notificationType,
+            base_code=base_code
+        )
+        db.add(konwledge)
+
+        # 创建 KnowledgeFile 实例
+        filePath = '/data/upload/mergefile/'
+        for fileName in fileNames:
+            file_identifier = 'file' + str(random.randint(1000000000, 9999999999))
+            knowledge_file = KnowledgeFile(
+                file_identifier=file_identifier,
+                file_path=filePath + fileName,  # 如果fileName是完整的路径,则可能不需要再次添加filePath
+                file_name=fileName,
+                is_deleted=0,
+                knowledge_base_code=base_code
+            )
+            db.add(knowledge_file)
+
+        db.commit()
+
+        return {
+            "code": 0,
+            "data": {
+                "reportId": reportId,
+                "status": "success",
+                "message": "总结报告创建成功"
+            }
+        }
+
+    except json.JSONDecodeError:
+        raise HTTPException(status_code=400, detail="Invalid JSON data")
+    except IntegrityError as e:
+        db.rollback()
+        raise HTTPException(status_code=409, detail=f"Database error: {str(e)}")
+    except Exception as e:
+        db.rollback()
+        print(e)
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+
+
+@router.post('/select')
+@router.get('/select')
+async def select_knowledge(request: Request, db: Session = Depends(get_db)):
+    # 尝试从请求体中解析 JSON 数据
+    data = await request.json()  # 注意:这里直接使用 request.json() 而不是 request.body()
+    try:
+        page = int(data.get('page', 1))  # 如果没有提供 page,则默认为 1
+        size = int(data.get('size', 10)) # 如果没有提供 size,则默认为 10
+        if size >100:
+            size = 100
+    except ValueError as e:
+        # 如果转换失败,则抛出 HTTPException
+        raise HTTPException(status_code=400, detail=f"Invalid pagination parameters: {e}")
+
+        # 计算 offset
+    offset = (page - 1) * size
+
+    # 使用 ORM 查询并应用分页
+    data = db.query(KnowledgeBase).offset(offset).limit(size).all()
+
+    # 打印结果(可选,用于调试)
+    # for i in data:
+    #     print(i)
+    print(f"Returned {len(data)} results from page {page} with size {size}")
+
+    # 计算总条数(注意:这可能会很慢,特别是对于大型数据集)
+    total_count = db.query(func.count(KnowledgeBase.reportId)).scalar()
+
+    # 计算总页数
+    total_pages = (total_count // size) + (1 if total_count % size else 0)
+
+    # 返回查询结果
+    result = {
+        "code": 0,
+        'msg': 'success',
+        'data': {
+            'pages': total_pages,
+            'total': total_count,
+            "currentPage":page,
+            "pageSize":size,
+            "list": data
+        }
+    }
+    return result
+
+
+
+
+
+@router.post('/detail')
+@router.get('/detail')
+async def get_knowledge_detail(request: Request, db: Session = Depends(get_db)):
+    # 尝试从请求体中解析 JSON 数据
+    data = await request.json()
+    report_id = data.get('reportID')
+    if not report_id:
+        raise HTTPException(status_code=400, detail="Missing required parameter 'reportID'")
+
+        # 查询 KnowledgeBase
+    kb_entry = db.query(KnowledgeBase).filter(KnowledgeBase.reportId == report_id).first()
+    if not kb_entry:
+        raise HTTPException(status_code=404, detail="No knowledge base found for the given report ID")
+
+    kf_entries = db.query(KnowledgeFile).filter(KnowledgeFile.knowledge_base_code == kb_entry.base_code).all()
+
+    # 准备返回的数据
+    result = {
+        "code": 0,
+        "msg": "success",
+        "data": {
+            "report_id": kb_entry.reportId,
+            "reportName": kb_entry.reportName,
+            "subject": kb_entry.subject,
+            "eventType": kb_entry.eventType,
+            "publishDate": kb_entry.publishDate,
+            "publishingUnit": kb_entry.publishingUnit,
+            "summary": kb_entry.summary,
+            "notificationType": kb_entry.notificationType,
+            # "knowledge_base_code": kb_entry.base_code,
+            "file": [
+                {
+                 "content": kf.file_name,
+                 "url": 'http://127.0.0.1:9988/api/file/download/'+kf.file_name
+                 }  # 根据需要调整返回的字段
+                for kf in kf_entries
+            ]
+            }
+    }
+
+    return result