CadHubManage/app/models/operation_log.py
root e6261532f7 feat: 添加软件停止功能并修复Creo进程检测问题
## 主要修复
- 修复Creo软件运行状态检测失败问题
- 添加完整的软件停止功能支持
- 改进多进程软件的进程管理逻辑

## 技术改进
- 更新软件配置支持多进程名称检测
- 优化进程停止逻辑,增加超时配置
- 新增 stop_software WebSocket消息类型
- 完善错误处理和日志记录

## 配置更新
- configs/software_config.yaml: 支持进程名称列表和停止超时
- 添加Revit 2017配置支持

## 文档更新
- README.md: 更新软件配置说明和API列表
- frontend-api-docs.md: 添加停止软件API文档
- CHECKPOINT.md: 记录修复进展和解决方案

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-24 17:24:49 +08:00

98 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
操作日志数据模型
用于记录用户操作和系统操作日志
"""
from typing import Optional, Dict, Any
from datetime import datetime
from enum import Enum
from pydantic import BaseModel
class LogType(str, Enum):
"""日志类型枚举"""
SYSTEM_OPERATION = "system_operation" # 系统操作(启动软件、重启等)
USER_OPERATION = "user_operation" # 用户自定义操作(前端发送的操作)
class LogLevel(str, Enum):
"""日志级别枚举"""
INFO = "info"
WARNING = "warning"
ERROR = "error"
DEBUG = "debug"
class ActionType(str, Enum):
"""行为类型枚举"""
CREATE = "create" # 创建
READ = "read" # 读取
UPDATE = "update" # 更新
DELETE = "delete" # 删除
EXECUTE = "execute" # 执行
EXPORT = "export" # 导出
IMPORT = "import" # 导入
class OperationStatus(str, Enum):
"""操作状态枚举"""
SUCCESS = "success" # 成功
FAILED = "failed" # 失败
PENDING = "pending" # 进行中
class OperationLog(BaseModel):
"""操作日志模型"""
# 基础信息
id: str # 日志唯一ID
log_type: LogType # 日志类型
level: LogLevel = LogLevel.INFO # 日志级别
# 用户信息
user_id: Optional[str] = None # 用户ID/用户名
client_id: Optional[str] = None # 客户端连接ID
session_id: Optional[str] = None # 会话ID
# 操作信息
operation: str # 具体操作名称
operation_category: Optional[str] = None # 操作分类
action_type: Optional[ActionType] = None # 行为类型
target_object: Optional[str] = None # 操作目标对象
details: str # 详细描述
# 时间信息
created_at: datetime # 操作时间
duration: Optional[int] = None # 操作耗时(毫秒)
# 环境信息
ip_address: Optional[str] = None # 客户端IP地址
user_agent: Optional[str] = None # 用户代理信息
software_version: Optional[str] = None # 软件版本
# 状态信息
status: OperationStatus = OperationStatus.SUCCESS # 操作状态
error_message: Optional[str] = None # 错误信息
# 扩展数据
extra_data: Optional[Dict[str, Any]] = None # 额外的结构化数据
class Config:
# 允许任意类型的字段用于extra_data
arbitrary_types_allowed = True
# JSON编码配置
json_encoders = {
datetime: lambda v: v.isoformat()
}
class LogFilter(BaseModel):
"""日志过滤条件"""
log_type: Optional[LogType] = None
operation: Optional[str] = None
user_id: Optional[str] = None
client_id: Optional[str] = None
level: Optional[LogLevel] = None
start_time: Optional[datetime] = None
end_time: Optional[datetime] = None
limit: int = 100 # 查询限制数量
offset: int = 0 # 查询偏移量