modify: massage_item 完善 content 字段 from_dict 转换操作

This commit is contained in:
2025-09-12 16:50:43 +08:00
parent 82dc57eae1
commit 2f68ecac71
+105 -92
View File
@@ -13,70 +13,70 @@ class MessageItem:
content: dict = field( content: dict = field(
metadata={"description": "消息内容,包含具体的任务数据或信息"} metadata={"description": "消息内容,包含具体的任务数据或信息"}
) )
# 可选字段 # 可选字段
status: MessageStatus = field( status: MessageStatus = field(
default=MessageStatus.PENDING, default=MessageStatus.PENDING,
metadata={"description": "消息状态:PENDING(待处理)、PROCESSING(处理中)、COMPLETED(已完成)、FAILED(失败)"} metadata={
"description": "消息状态:PENDING(待处理)、PROCESSING(处理中)、COMPLETED(已完成)、FAILED(失败)"
},
) )
type: MessageType = field( type: MessageType = field(
default=MessageType.TASK, default=MessageType.TASK,
metadata={"description": "消息类型:TASK(任务)、NOTIFICATION(通知)、RESPONSE(响应)"} metadata={
"description": "消息类型:TASK(任务)、NOTIFICATION(通知)、RESPONSE(响应)"
},
) )
createtime: datetime = field( createtime: datetime = field(
default_factory=datetime.now, # type: ignore default_factory=datetime.now, # type: ignore
metadata={"description": "消息创建时间"} metadata={"description": "消息创建时间"},
) )
updatetime: datetime = field( updatetime: datetime = field(
default_factory=datetime.now, # type: ignore default_factory=datetime.now, # type: ignore
metadata={"description": "消息最后更新时间"} metadata={"description": "消息最后更新时间"},
) )
result: dict = field( result: dict = field(
default_factory=dict, default_factory=dict,
metadata={"description": "消息处理结果,存储任务执行后的输出数据"} metadata={"description": "消息处理结果,存储任务执行后的输出数据"},
) )
id: str = field( id: str = field(
default_factory=lambda: str(uuid.uuid4()), default_factory=lambda: str(uuid.uuid4()),
metadata={"description": "消息唯一标识符"} metadata={"description": "消息唯一标识符"},
) )
priority: MessagePriority = field( priority: MessagePriority = field(
default=MessagePriority.NORMAL, default=MessagePriority.NORMAL,
metadata={"description": "消息优先级:LOW(低)、NORMAL(普通)、HIGH(高)、URGENT(紧急)"} metadata={
"description": "消息优先级:LOW(低)、NORMAL(普通)、HIGH(高)、URGENT(紧急)"
},
) )
source: str = field( source: str = field(
default="client", default="client", metadata={"description": "消息来源,标识发送方"}
metadata={"description": "消息来源,标识发送方"}
) )
destination: str = field( destination: str = field(
default="client", default="client", metadata={"description": "消息目标,标识接收方(即task函数名)"}
metadata={"description": "消息目标,标识接收方(即task函数名)"}
) )
retry_count: int = field( retry_count: int = field(
default=0, default=0, metadata={"description": "重试次数,记录消息处理失败后的重试次数"}
metadata={"description": "重试次数,记录消息处理失败后的重试次数"}
) )
expire_time: Optional[datetime] = field( expire_time: Optional[datetime] = field(
default=None, default=None, metadata={"description": "消息过期时间,超过此时间消息将不再处理"}
metadata={"description": "消息过期时间,超过此时间消息将不再处理"}
) )
tags: Optional[str] = field( tags: Optional[str] = field(
default=None, default=None, metadata={"description": "消息标签,用于分类和筛选"}
metadata={"description": "消息标签,用于分类和筛选"}
) )
metadata: dict = field( metadata: dict = field(
default_factory=dict, default_factory=dict,
metadata={"description": "额外元数据,存储自定义的扩展信息"} metadata={"description": "额外元数据,存储自定义的扩展信息"},
) )
@classmethod @classmethod
def from_dict(cls, data: Dict[str, Any]) -> "MessageItem": def from_dict(cls, data: Dict[str, Any]) -> "MessageItem":
"""从字典创建消息对象""" """从字典创建消息对象"""
# 处理日期时间字段 # 处理日期时间字段
datetime_fields = ['createtime', 'updatetime', 'expire_time'] datetime_fields = ["createtime", "updatetime", "expire_time"]
for field in datetime_fields: for field in datetime_fields:
if field in data: if field in data:
if data[field] == 'null': if data[field] == "null":
data[field] = None data[field] = None
continue continue
if isinstance(data[field], str): if isinstance(data[field], str):
@@ -86,90 +86,103 @@ class MessageItem:
elif data[field] is None: elif data[field] is None:
data[field] = None data[field] = None
else: else:
raise ValueError(f"请使用 'str' 或 'datetime' 类型设置 {field} 字段") raise ValueError(
f"请使用 'str' 或 'datetime' 类型设置 {field} 字段"
if 'result' in data: )
if data['result'] == 'null':
data['result'] = {}
elif isinstance(data['result'], str):
data['result'] = json.loads(data['result'])
if 'tags' in data: if "content" in data:
if data['tags'] == 'null': if data["content"] == "null":
data['tags'] = None data["content"] = {}
elif isinstance(data["content"], str):
data["content"] = json.loads(data["content"])
if "metadata" in data:
if data["metadata"] == "null":
data["metadata"] = {}
elif isinstance(data["metadata"], str):
data["metadata"] = json.loads(data["metadata"])
if "result" in data:
if data["result"] == "null":
data["result"] = {}
elif isinstance(data["result"], str):
data["result"] = json.loads(data["result"])
if "tags" in data:
if data["tags"] == "null":
data["tags"] = None
# 处理枚举字段 # 处理枚举字段
if 'type' in data: if "type" in data:
if isinstance(data['type'], str): if isinstance(data["type"], str):
data['type'] = MessageType(data['type']) # 使用枚举名称 data["type"] = MessageType(data["type"]) # 使用枚举名称
elif isinstance(data['type'], MessageType): elif isinstance(data["type"], MessageType):
pass # 已经是枚举类型 pass # 已经是枚举类型
else: else:
raise ValueError(f"请使用 'str' 或 'MessageType' 类型设置 type 字段") raise ValueError(f"请使用 'str' 或 'MessageType' 类型设置 type 字段")
if 'status' in data: if "status" in data:
if isinstance(data['status'], str): if isinstance(data["status"], str):
data['status'] = MessageStatus(data['status']) # 使用枚举名称 data["status"] = MessageStatus(data["status"]) # 使用枚举名称
elif isinstance(data['status'], int): elif isinstance(data["status"], int):
data['status'] = MessageStatus(data['status']) # 使用枚举值 data["status"] = MessageStatus(data["status"]) # 使用枚举值
elif isinstance(data['status'], MessageStatus): elif isinstance(data["status"], MessageStatus):
pass # 已经是枚举类型 pass # 已经是枚举类型
else: else:
raise ValueError(f"Invalid message status: {data['status']}") raise ValueError(f"Invalid message status: {data['status']}")
if 'priority' in data: if "priority" in data:
if isinstance(data['priority'], (int, str)): if isinstance(data["priority"], (int, str)):
data['priority'] = MessagePriority(data['priority']) # type: ignore data["priority"] = MessagePriority(data["priority"]) # type: ignore
elif isinstance(data['priority'], MessagePriority): elif isinstance(data["priority"], MessagePriority):
pass pass
else: else:
raise ValueError("请使用 'int' 或 'str' 类型设置 priority 字段") raise ValueError("请使用 'int' 或 'str' 类型设置 priority 字段")
return cls(**data) return cls(**data)
def to_dict(self) -> Dict[str, Any]: def to_dict(self) -> Dict[str, Any]:
"""转换为字典 """转换为字典
Returns: Returns:
Dict[str, Any]: 消息数据字典 Dict[str, Any]: 消息数据字典
""" """
return { return {
'id': self.id, "id": self.id,
'type': self.type.value, "type": self.type.value,
'status': self.status.value, "status": self.status.value,
'content': self.content, "content": self.content,
'createtime': self.createtime.isoformat(), "createtime": self.createtime.isoformat(),
'updatetime': self.updatetime.isoformat(), "updatetime": self.updatetime.isoformat(),
'priority': self.priority.value, "priority": self.priority.value,
'source': self.source, "source": self.source,
'retry_count': self.retry_count, "retry_count": self.retry_count,
'expire_time': self.expire_time.isoformat() if self.expire_time else None, "expire_time": self.expire_time.isoformat() if self.expire_time else None,
'tags': self.tags, "tags": self.tags,
'metadata': self.metadata, "metadata": self.metadata,
'result': self.result, "result": self.result,
"destination": self.destination "destination": self.destination,
} }
def to_dict_by_core(self) -> Dict[str, Any]: def to_dict_by_core(self) -> Dict[str, Any]:
"""转换为核心库需要的字典格式""" """转换为核心库需要的字典格式"""
return { return {
'id': self.id, "id": self.id,
'type': self.type.value, "type": self.type.value,
'status': self.status.value, "status": self.status.value,
'content': json.dumps(self.content), "content": json.dumps(self.content),
'createtime': self.createtime.isoformat(), "createtime": self.createtime.isoformat(),
'updatetime': self.updatetime.isoformat(), "updatetime": self.updatetime.isoformat(),
'priority': self.priority.value, "priority": self.priority.value,
'source': self.source, "source": self.source,
'retry_count': self.retry_count, "retry_count": self.retry_count,
'expire_time': self.expire_time.isoformat() if self.expire_time else 'null', "expire_time": self.expire_time.isoformat() if self.expire_time else "null",
'tags': self.tags if self.tags else 'null', "tags": self.tags if self.tags else "null",
'metadata': json.dumps(self.metadata), "metadata": json.dumps(self.metadata),
'result': json.dumps(self.result), "result": json.dumps(self.result),
"destination": self.destination "destination": self.destination,
} }
def to_json(self) -> str: def to_json(self) -> str:
"""转换为json字符串""" """转换为json字符串"""
# 将枚举类型转换为字符串 # 将枚举类型转换为字符串
@@ -183,17 +196,17 @@ class MessageItem:
def is_expired(self) -> bool: def is_expired(self) -> bool:
"""检查消息是否过期 """检查消息是否过期
Returns: Returns:
bool: 是否过期 bool: 是否过期
""" """
if self.expire_time is None: if self.expire_time is None:
return False return False
return datetime.now() > self.expire_time return datetime.now() > self.expire_time
def can_retry(self) -> bool: def can_retry(self) -> bool:
"""检查消息是否可以重试 """检查消息是否可以重试
Returns: Returns:
bool: 是否可以重试 bool: 是否可以重试
""" """
@@ -202,26 +215,26 @@ class MessageItem:
@classmethod @classmethod
def get_field_descriptions(cls) -> Dict[str, str]: def get_field_descriptions(cls) -> Dict[str, str]:
"""获取所有字段的描述信息 """获取所有字段的描述信息
Returns: Returns:
Dict[str, str]: 字段名到描述信息的映射 Dict[str, str]: 字段名到描述信息的映射
""" """
from dataclasses import fields from dataclasses import fields
descriptions = {} descriptions = {}
for field_info in fields(cls): for field_info in fields(cls):
if 'description' in field_info.metadata: if "description" in field_info.metadata:
descriptions[field_info.name] = field_info.metadata['description'] descriptions[field_info.name] = field_info.metadata["description"]
else: else:
descriptions[field_info.name] = "无描述信息" descriptions[field_info.name] = "无描述信息"
return descriptions return descriptions
@classmethod @classmethod
def print_field_info(cls): def print_field_info(cls):
"""打印所有字段的信息,包括类型、默认值和描述""" """打印所有字段的信息,包括类型、默认值和描述"""
from dataclasses import fields from dataclasses import fields
print(f"=== {cls.__name__} 字段信息 ===") print(f"=== {cls.__name__} 字段信息 ===")
for field_info in fields(cls): for field_info in fields(cls):
print(f"字段名: {field_info.name}") print(f"字段名: {field_info.name}")
@@ -229,6 +242,6 @@ class MessageItem:
print(f"默认值: {field_info.default}") print(f"默认值: {field_info.default}")
if field_info.default_factory is not None: if field_info.default_factory is not None:
print(f"默认工厂: {field_info.default_factory}") print(f"默认工厂: {field_info.default_factory}")
if 'description' in field_info.metadata: if "description" in field_info.metadata:
print(f"描述: {field_info.metadata['description']}") print(f"描述: {field_info.metadata['description']}")
print("-" * 50) print("-" * 50)