| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- from fastapi import APIRouter, Depends, Request
- from sqlalchemy.orm import Session
- from pydantic import BaseModel
- from typing import Optional
- from database import get_db
- from models.total import PolicyFile
- import time
- router = APIRouter()
- @router.get("/get_chromadb_document")
- async def get_chromadb_document(
- query: str,
- n: int = 5,
- request: Request = None
- ):
- """获取ChromaDB文档"""
- from services.chromadb_service import chromadb_service
-
- try:
- results = await chromadb_service.query(query, n)
- return {
- "statusCode": 200,
- "msg": "success",
- "data": results
- }
- except Exception as e:
- # 如果 ChromaDB 服务不可用,返回模拟数据
- results = [
- {
- "content": f"关于{query}的文档内容{i}",
- "score": 0.9 - i * 0.1,
- "metadata": {"source": f"doc_{i}.pdf"}
- }
- for i in range(1, min(n + 1, 6))
- ]
- return {
- "statusCode": 200,
- "msg": "success (fallback)",
- "data": results
- }
- @router.get("/knowledge/files/advanced-search")
- async def advanced_search(
- keyword: Optional[str] = None,
- category: Optional[str] = None,
- date_from: Optional[str] = None,
- date_to: Optional[str] = None,
- page: int = 1,
- page_size: int = 20,
- request: Request = None,
- db: Session = Depends(get_db)
- ):
- """知识库高级搜索"""
- query = db.query(PolicyFile)
-
- # 关键词搜索
- if keyword:
- query = query.filter(PolicyFile.policy_name.like(f"%{keyword}%"))
-
- # 分类筛选
- if category:
- category_map = {
- "国家规范": 1,
- "行业规范": 2,
- "地方规范": 3,
- "内部条例": 4
- }
- if category in category_map:
- query = query.filter(PolicyFile.policy_type == category_map[category])
-
- # 日期筛选
- if date_from:
- query = query.filter(PolicyFile.created_at >= int(time.mktime(time.strptime(date_from, "%Y-%m-%d"))))
- if date_to:
- query = query.filter(PolicyFile.created_at <= int(time.mktime(time.strptime(date_to, "%Y-%m-%d"))))
-
- # 分页
- total = query.count()
- files = query.offset((page - 1) * page_size).limit(page_size).all()
-
- return {
- "statusCode": 200,
- "msg": "success",
- "data": {
- "total": total,
- "page": page,
- "page_size": page_size,
- "items": [
- {
- "id": f.id,
- "policy_name": f.policy_name,
- "policy_file_url": f.policy_file_url,
- "policy_type": f.policy_type,
- "view_count": f.view_count,
- "file_type": f.file_type,
- "created_at": f.created_at
- }
- for f in files
- ]
- }
- }
|