yj
2025-09-03 f28ac0166536a2a4b68cac685a41ea667f60f7e9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
"""
主应用入口
"""
 
import uvicorn
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
from loguru import logger
import time
from config import settings
from app.api.callback import router as callback_router
from app.api.friend_ignore import router as friend_ignore_router
from app.api.message_aggregation import router as message_aggregation_router
from app.models.database import create_tables
from app.workers.message_worker import message_worker
from app.services.contact_sync import contact_sync_service
from app.services.message_aggregator import message_aggregator
 
 
@asynccontextmanager
async def lifespan(app: FastAPI):
    """应用生命周期管理"""
    # 启动时执行
    logger.info("正在启动应用...")
 
    # 创建数据库表
    try:
        create_tables()
        logger.info("数据库表创建成功")
    except Exception as e:
        logger.error(f"数据库表创建失败: {str(e)}")
 
    # 启动消息工作进程
    try:
        message_worker.start()
        logger.info("消息工作进程启动成功")
    except Exception as e:
        logger.error(f"消息工作进程启动失败: {str(e)}")
 
    # 同步联系人信息并建立好友忽略列表
    try:
        if settings.ecloud_w_id:
            logger.info("开始同步联系人信息...")
            success = contact_sync_service.sync_contacts_on_startup(settings.ecloud_w_id)
            if success:
                logger.info("联系人同步完成,好友忽略列表已建立")
            else:
                logger.warning("联系人同步失败")
        else:
            logger.warning("未配置ecloud_w_id,跳过联系人同步")
    except Exception as e:
        logger.error(f"联系人同步异常: {str(e)}")
 
    logger.info("应用启动完成")
 
    yield
 
    # 关闭时执行
    logger.info("正在关闭应用...")
 
    # 停止消息聚合服务
    try:
        message_aggregator.stop()
        logger.info("消息聚合服务已停止")
    except Exception as e:
        logger.error(f"消息聚合服务停止失败: {str(e)}")
 
    # 停止消息工作进程
    try:
        message_worker.stop()
        logger.info("消息工作进程已停止")
    except Exception as e:
        logger.error(f"消息工作进程停止失败: {str(e)}")
 
    logger.info("应用已关闭")
 
 
# 创建FastAPI应用
app = FastAPI(
    title="E云管家-DifyAI对接服务",
    description="将E云管家消息转发到DifyAI并返回AI回答",
    version="1.0.0",
    lifespan=lifespan,
)
 
# 添加CORS中间件
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
 
# 注册路由
app.include_router(callback_router, prefix="/api/v1", tags=["回调接口"])
app.include_router(friend_ignore_router, prefix="/api/v1", tags=["好友忽略管理"])
app.include_router(message_aggregation_router, prefix="/api/v1/aggregation", tags=["消息聚合管理"])
 
 
@app.get("/")
async def root():
    """根路径"""
    return {
        "message": "E云管家-DifyAI对接服务",
        "version": "1.0.0",
        "status": "running",
    }
 
 
@app.get("/health")
async def health_check():
    """健康检查接口"""
    return {
        "status": "healthy",
        "message": "E云管家-DifyAI对接服务运行正常",
        "timestamp": int(time.time()),
    }
 
 
if __name__ == "__main__":
    # 配置日志
    logger.add(
        settings.log_file,
        rotation="1 day",
        retention="7 days",
        level=settings.log_level,
        format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {name}:{function}:{line} - {message}",
    )
 
    logger.info("启动E云管家-DifyAI对接服务")
 
    # 启动服务
    uvicorn.run(
        "main:app",
        host=settings.server_host,
        port=settings.server_port,
        reload=settings.debug,
        log_level=settings.log_level.lower(),
    )