后端新增员工行为画像算法模块,支持标签规则引擎和评分计算, 完善员工模型、银行信息、序列化和导入逻辑,优化报销审批流 和工作流常量,增强 Hermes 同步和知识同步能力,前端新增费 用画像详情弹窗、雷达图和风险卡片组件,完善登录页和工作台 样式,优化文档中心和归档中心交互,补充单元测试。
79 lines
2.8 KiB
Python
79 lines
2.8 KiB
Python
import os
|
||
import sys
|
||
import time
|
||
import logging
|
||
|
||
# Ensure src is in the python path
|
||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../src")))
|
||
|
||
from app.core.logging import setup_logging
|
||
from app.db.session import get_session_factory
|
||
from app.models.hermes_config import HermesTaskConfig
|
||
from app.services.hermes_scheduler import hermes_scheduler
|
||
|
||
logger = logging.getLogger("hermes_daemon")
|
||
|
||
def init_default_config():
|
||
"""Ensure there is at least one active global_risk_scan task in the database."""
|
||
session_factory = get_session_factory()
|
||
db = session_factory()
|
||
try:
|
||
# 初始化 global_risk_scan
|
||
existing_risk = db.query(HermesTaskConfig).filter_by(task_type="global_risk_scan").first()
|
||
if not existing_risk:
|
||
logger.info("No global_risk_scan config found. Initializing default config.")
|
||
db.add(HermesTaskConfig(
|
||
task_type="global_risk_scan",
|
||
cron_expression="0 2 * * *",
|
||
is_enabled=True
|
||
))
|
||
|
||
# 初始化 weekly_expense_report
|
||
existing_report = db.query(HermesTaskConfig).filter_by(task_type="weekly_expense_report").first()
|
||
if not existing_report:
|
||
logger.info("No weekly_expense_report config found. Initializing default config.")
|
||
db.add(HermesTaskConfig(
|
||
task_type="weekly_expense_report",
|
||
cron_expression="0 9 * * 1", # 每周一早9点(在简化版中暂时代表周报频率)
|
||
is_enabled=True
|
||
))
|
||
|
||
# 初始化 employee_behavior_profile_scan:默认关闭,避免全员画像过频。
|
||
existing_profile = db.query(HermesTaskConfig).filter_by(task_type="employee_behavior_profile_scan").first()
|
||
if not existing_profile:
|
||
logger.info("No employee_behavior_profile_scan config found. Initializing default config.")
|
||
db.add(HermesTaskConfig(
|
||
task_type="employee_behavior_profile_scan",
|
||
cron_expression="0 8 * * 1",
|
||
is_enabled=False
|
||
))
|
||
|
||
db.commit()
|
||
except Exception as e:
|
||
logger.error(f"Failed to initialize default config: {e}")
|
||
finally:
|
||
db.close()
|
||
|
||
|
||
def main():
|
||
setup_logging()
|
||
logger.info("Initializing Hermes Background Daemon...")
|
||
|
||
# 注入默认配置
|
||
init_default_config()
|
||
|
||
# 启动调度器
|
||
hermes_scheduler.start()
|
||
|
||
logger.info("Hermes Daemon is running. Press Ctrl+C to stop.")
|
||
try:
|
||
while True:
|
||
time.sleep(1) # 主线程保持存活
|
||
except KeyboardInterrupt:
|
||
logger.info("Keyboard interrupt received. Shutting down...")
|
||
hermes_scheduler.shutdown()
|
||
logger.info("Shutdown complete.")
|
||
|
||
if __name__ == "__main__":
|
||
main()
|