modify: massage_item 完善 content 字段 from_dict 转换操作
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user