221 lines
11 KiB
Python
221 lines
11 KiB
Python
from datetime import datetime
|
|
from typing import List, Optional, Union
|
|
|
|
from pydantic import BaseModel, EmailStr, Field
|
|
|
|
class BaseWeixinUser(BaseModel):
|
|
userid: Optional[str] = None
|
|
corp_id: Optional[str] = None
|
|
vid: Optional[str] = None
|
|
wx_id_hash: Optional[str] = None
|
|
is_quit: Optional[bool] = None
|
|
crmid: Optional[int] = None
|
|
depart_ids: Optional[List[int]] = None
|
|
position: Optional[str] = None
|
|
role: Optional[str] = None
|
|
realname: Optional[str] = None
|
|
username: Optional[str] = None
|
|
english_name: Optional[str] = None
|
|
name: Optional[str] = None
|
|
# 将所有属性映射为可选属性
|
|
alias: Optional[str] = None
|
|
avatar: Optional[str] = None
|
|
department: Optional[int] = None
|
|
mobile: Optional[str] = None
|
|
email: Optional[EmailStr] = None
|
|
gender: Optional[int] = None
|
|
has_external_user_permit: Optional[bool] = None
|
|
erpid: Optional[int] = None
|
|
erp_name: Optional[str] = None
|
|
crmid: Optional[int] = None
|
|
crm_name: Optional[str] = None
|
|
|
|
class WeixinUserCreate(BaseWeixinUser):
|
|
userid: str = Field(example="julia")
|
|
name: str = Field(example='用户姓名')
|
|
role: str = Field(example='用户角色')
|
|
|
|
|
|
class WeixinUserUpdate(BaseModel):
|
|
id: int
|
|
crmid: Optional[int] = None
|
|
erpid: Optional[int] = None
|
|
is_quit: Optional[bool] = None
|
|
|
|
|
|
class Member(BaseModel):
|
|
userid: Optional[str] = Field(description="用户ID")
|
|
name: Optional[str] = Field(description="用户姓名")
|
|
type: Optional[int] = Field(description="用户类型: 1-外部成员, 2-内部成员")
|
|
join_time: Optional[int] = Field(description="加入时间")
|
|
# join_scene: Optional[int] = Field(description="加入场景")
|
|
# unionid: Optional[str] = Field(description="微信UnionID")
|
|
# invitor: Optional[dict] = Field(description="邀请人")
|
|
group_nickname: Optional[str] = Field(description="群内昵称")
|
|
|
|
class BaseWeixinGroupChat(BaseModel):
|
|
chat_id: Optional[str] = Field(description="企业微信中的群聊ID")
|
|
name: Optional[str] = Field(description="群聊名称")
|
|
admin_list: Optional[List[Member]] = Field(description="群聊管理员列表")
|
|
create_time: Optional[int] = Field(description="群聊创建时间")
|
|
owner: Optional[str] = Field(description="群聊群主")
|
|
member_version: Optional[str] = Field(description="群聊成员版本")
|
|
external_member_list: Optional[List[Member]] = Field(description="群聊外部成员列表")
|
|
internal_member_list: Optional[List[Member]] = Field(description="群聊内部成员列表")
|
|
|
|
class WeixinGroupChatEvent(BaseWeixinGroupChat):
|
|
external_user_count: Optional[int] = Field(description="群聊外部成员数量")
|
|
internal_member_count: Optional[int] = Field(description="群聊内部成员数量")
|
|
|
|
__exclude_filter__ = ["admin_list", "member_version", "id"]
|
|
|
|
|
|
class TriggerWeixinGroupChat(BaseModel):
|
|
group_name: str = Field(alias="groupName", description="群聊名称")
|
|
order_id: Optional[str] = Field(alias="orderId", description="订单ID", default=None)
|
|
user_ids: Optional[List[str]] = Field(alias="userIds", description="群聊成员列表")
|
|
external_user_ids: Optional[List[str]] = Field(alias="externalUserIds", description="群聊外部成员列表")
|
|
|
|
class WeixinGroupChatCreate(BaseWeixinGroupChat):
|
|
pass
|
|
|
|
class WeixinGroupChatUpdate(BaseWeixinGroupChat):
|
|
pass
|
|
|
|
class BaseWeixinGroupChatXingyun(BaseModel):
|
|
xingyun_chat_id: Optional[int] = Field(alias="chatId")
|
|
avatars: Optional[List[Union[str, None]]] = Field(alias="avatars")
|
|
chat_id: Optional[str] = Field(alias="groupChatId")
|
|
name: Optional[str] = Field(alias="chatName")
|
|
admin_list: Optional[List[str]] = Field(alias="admins")
|
|
create_time: Optional[int] = Field(alias="createTime")
|
|
owner: Optional[str] = Field(alias="ownerName")
|
|
member_version: Optional[str] = Field(default=None)
|
|
external_member_list: Optional[List[str]] = Field(default=None)
|
|
internal_member_list: Optional[List[str]] = Field(default=None)
|
|
|
|
class WeixinGroupChatXingyunCreate(BaseWeixinGroupChatXingyun):
|
|
chat_id: str = Field(alias="groupChatId")
|
|
name: str = Field(alias="chatName")
|
|
xingyun_chat_id: int = Field(alias="chatId")
|
|
|
|
|
|
class BaseWeixinCustomer(BaseModel):
|
|
order_id: Optional[str] = Field(alias="orderId", description="订单ID", default=None)
|
|
shop_name: Optional[str] = Field(alias="shopName", description="店铺名称", default=None)
|
|
weixin_id: Optional[str] = Field(alias="weixinId", description="微信用户ID", default=None)
|
|
weixin_name: Optional[str] = Field(alias="weixinName", description="微信用户名", default=None)
|
|
weixin_unionid: Optional[str] = Field(alias="weixinUnionid", description="微信用户UnionID", default=None)
|
|
weixin_avatar: Optional[str] = Field(alias="weixinAvatar", description="微信用户头像", default=None)
|
|
xingyun_id: Optional[int] = Field(alias="xingyunId", description="星云用户ID", default=None)
|
|
xingyun_sex: Optional[int] = Field(alias="xingyunSex", description="星云用户性别", default=None)
|
|
xingyun_name: Optional[str] = Field(alias="xingyunName", description="星云用户名", default=None)
|
|
xingyun_avatar: Optional[str] = Field(alias="xingyunAvatar", description="星云用户头像", default=None)
|
|
xingyun_tags: Optional[list] = Field(alias="xingyunTags", description="星云用户标签", default=None)
|
|
xingyun_external_userid: Optional[str] = Field(alias="xingyunExternalUserid", description="星云用户外部ID", default=None)
|
|
xingyun_sync: Optional[bool] = Field(alias="xingyunSync", description="是否已同步到星云", default=False)
|
|
taobao_id: Optional[str] = Field(alias="taobaoId", description="淘宝用户ID", default=None)
|
|
taobao_name: Optional[str] = Field(alias="taobaoName", description="淘宝用户名", default=None)
|
|
taobao_avatar: Optional[str] = Field(alias="taobaoAvatar", description="淘宝用户头像", default=None)
|
|
need_confirm: Optional[bool] = Field(alias="needConfirm", description="是否需要确认", default=None)
|
|
extra: Optional[dict] = Field(alias="extra", description="额外信息", default=None)
|
|
|
|
class WeixinCustomerCreate(BaseWeixinCustomer):
|
|
pass
|
|
|
|
class WeixinCustomerUpdate(BaseWeixinCustomer):
|
|
pass
|
|
|
|
class WeixinCustomerFilter(BaseModel):
|
|
order_id: Optional[str] = Field(description="订单ID", default=None)
|
|
has_order: Optional[bool] = Field(description="是否有订单", default=None)
|
|
shop_name: Optional[str] = Field(description="店铺名称", default=None)
|
|
# weixin_id: Optional[str] = Field(description="微信用户ID", default=None)
|
|
# weixin_unionid: Optional[str] = Field(description="微信用户UnionID", default=None)
|
|
# xingyun_id: Optional[int] = Field(description="星云用户ID", default=None)
|
|
# xingyun_name: Optional[str] = Field(description="星云用户名", default=None)
|
|
xingyun_tags: Optional[str] = Field(description="星云用户标签", default=None)
|
|
xingyun_sync: Optional[bool] = Field(description="是否已同步到星云", default=False)
|
|
# taobao_id: Optional[str] = Field(description="淘宝用户ID", default=None)
|
|
# taobao_name: Optional[str] = Field(description="淘宝用户名", default=None)
|
|
union_id: Optional[str] = Field(description="联合用户ID", default=None)
|
|
union_name: Optional[str] = Field(description="联合用户名", default=None)
|
|
|
|
|
|
class BaseWeixinCustomerXingyun(BaseModel):
|
|
weixin_id: Optional[str] = Field(alias="external_userid", description="微信用户ID", default=None)
|
|
weixin_name: Optional[str] = Field(alias="weixin_name", description="微信用户名", default=None)
|
|
xingyun_id: Optional[int] = Field(alias="cid", description="星云用户ID")
|
|
xingyun_name: Optional[str] = Field(alias="name", description="星云用户名")
|
|
xingyun_avatar: Optional[str] = Field(alias="avatar", description="星云用户头像")
|
|
xingyun_external_userid: Optional[str] = Field(alias="externalUserid", description="星云用户外部ID")
|
|
xingyun_sex: Optional[int] = Field(alias="sex", description="星云用户性别", default=None)
|
|
xingyun_tags: Optional[list] = Field(alias="tags", description="星云用户标签", default=None)
|
|
# 移除这些字段,因为它们将被存储在 extra 中
|
|
exclusive_member_info: Optional[dict] = Field(alias="exclusiveMemberInfo", description=" exclusiveMemberInfo", default=None)
|
|
extra: Optional[dict] = Field(alias="extra", description="额外信息", default=None)
|
|
|
|
def transform_to_extra(self):
|
|
new_obj = self.model_dump(exclude_unset=True, by_alias=True)
|
|
extra = {
|
|
'exclusive_member_info': new_obj.pop('exclusiveMemberInfo', None),
|
|
}
|
|
new_name = new_obj.get('name', None)
|
|
if new_name: new_obj['weixin_name'] = new_name
|
|
return self.__class__(**new_obj, extra=extra)
|
|
|
|
class WeixinCustomerXingyunCreate(BaseWeixinCustomerXingyun):
|
|
pass
|
|
|
|
|
|
class WeixinUserBindInfo(BaseModel):
|
|
userid: str = Field(description="微信用户ID")
|
|
username: Optional[str] = Field(description="微信用户名", alias="name")
|
|
role: Optional[str] = Field(description="用户角色", default=None)
|
|
erp_id: Optional[int] = Field(description="ERP用户ID", default=None)
|
|
avatar: Optional[str] = Field(description="微信用户头像", default=None)
|
|
taobao_id: Optional[str] = None
|
|
|
|
|
|
class WeixinOrderBindInfo(BaseModel):
|
|
userid: str = Field(description="微信用户ID")
|
|
order_id: str = Field(description="订单ID")
|
|
remark: Optional[str] = Field(description="企业微信向ERP同步订单时的备注", default=None)
|
|
|
|
class WeixinOrderRemark(BaseModel):
|
|
order_id: str = Field(description="订单ID")
|
|
remark: Optional[str] = Field(description="企业微信向ERP同步订单时的备注", default=None)
|
|
|
|
|
|
class OrderUser(BaseModel):
|
|
role: Optional[str] = Field(description="用户角色", default=None)
|
|
taobao_id: Optional[str] = Field(description="旺旺名称", alias="id", default=None)
|
|
taobao_name: Optional[str] = Field(description="旺旺名称", alias="name", default=None)
|
|
userid: Optional[str] = Field(description="微信用户ID", default=None)
|
|
|
|
class BindOrderResultEvent(BaseModel):
|
|
shop_name: Optional[str] = Field(description="店铺名称")
|
|
price: Optional[int] = Field(description="订单金额")
|
|
discount_fee: Optional[int] = Field(description="折扣金额")
|
|
real_payment: Optional[int] = Field(description="实付金额")
|
|
remark: Optional[str] = Field(description="企业微信向ERP同步订单时的备注", default=None)
|
|
status_string: Optional[str] = Field(description="订单状态")
|
|
pay_time: Optional[str] = Field(description="支付时间")
|
|
users: Optional[List[OrderUser]] = Field(description="绑定的用户信息")
|
|
|
|
# __exclude_filter__ = ["member_version", "id"]
|
|
|
|
|
|
class CustomerRepeatPurchaseEvent(BindOrderResultEvent):
|
|
has_service_group: Optional[bool] = Field(description="是否有服务群", default=None)
|
|
__exclude_filter__ = ["remark", "status_string", "pay_time"]
|
|
|
|
# CUSTOMER_SERVICE_ASSIGN_ORDER
|
|
class CustomerAssignOrderEvent(BindOrderResultEvent):
|
|
__exclude_filter__ = ["remark", "status_string"]
|
|
|
|
# CUSTOMER_SERVICE_ASSIGN_ORDER
|
|
class CustomerRefundOrderEvent(BindOrderResultEvent):
|
|
__exclude_filter__ = ["status_string"]
|
|
|