所有发送消息,采用异步方式

This commit is contained in:
aaron 2025-02-25 13:29:29 +08:00
parent c0ec42ca8a
commit 5fc1acfbf9
3 changed files with 106 additions and 55 deletions

View File

@ -39,6 +39,8 @@ from app.core.point_manager import PointManager
from datetime import time from datetime import time
from app.core.wecombot import WecomBot from app.core.wecombot import WecomBot
from app.models.config import ConfigDB from app.models.config import ConfigDB
from app.core.mpmessage import sent_order_status_change_message
from fastapi import BackgroundTasks
router = APIRouter() router = APIRouter()
@ -170,6 +172,7 @@ async def pre_order(
@router.post("", response_model=ResponseModel) @router.post("", response_model=ResponseModel)
async def create_order( async def create_order(
background_tasks: BackgroundTasks,
order: OrderCreate, order: OrderCreate,
db: Session = Depends(get_db), db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user) current_user: UserDB = Depends(get_current_user)
@ -296,24 +299,29 @@ async def create_order(
# 发送企业微信消息 # 发送企业微信消息
wecom_bot = WecomBot() wecom_bot = WecomBot()
await wecom_bot.send_order_notification(db, db_order, OrderStatus.CREATED) background_tasks.add_task(
wecom_bot.send_order_notification,
db,
db_order,
OrderStatus.CREATED
)
#发送订单创建成功的消息 #发送订单创建成功的消息
if current_user.mp_openid: if current_user.mp_openid:
await mp_client.send_template_message( data={
openid=current_user.mp_openid,
template_id=settings.DELIVERY_ORDER_CREATED_TEMPLATE_ID,
data={
"character_string13": db_order.orderid, "character_string13": db_order.orderid,
"time4": db_order.create_time.strftime("%Y-%m-%d %H:%M:%S"), "time4": db_order.create_time.strftime("%Y-%m-%d %H:%M:%S"),
"thing10": db_order.address_customer_name, "thing10": db_order.address_customer_name,
"thing15": f"{db_order.address_community_name} {db_order.address_community_building_name} {db_order.address_detail}", "thing15": f"{db_order.address_community_name} {db_order.address_community_building_name} {db_order.address_detail}",
"thing9": db_order.status.status_text "thing9": db_order.status.status_text
}, miniprogram={ }
"appid": settings.WECHAT_APPID,
"path": f"/pages/order/detail/index?id={db_order.orderid}" background_tasks.add_task(
}) sent_order_status_change_message,
openid=current_user.mp_openid,
template_id=settings.DELIVERY_ORDER_CREATED_TEMPLATE_ID,
data=data
)
# 超过晚上8点则使用明天送达的文案 # 超过晚上8点则使用明天送达的文案
if datetime.now() > datetime.now().replace(hour=settings.ORDER_SPLIT_TIME_HOUR, minute=0, second=0): if datetime.now() > datetime.now().replace(hour=settings.ORDER_SPLIT_TIME_HOUR, minute=0, second=0):
@ -643,6 +651,7 @@ async def get_user_orders(
@router.post("/{orderid}/user/cancel", response_model=ResponseModel) @router.post("/{orderid}/user/cancel", response_model=ResponseModel)
async def cancel_order( async def cancel_order(
background_tasks: BackgroundTasks,
orderid: str, orderid: str,
db: Session = Depends(get_db), db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user) current_user: UserDB = Depends(get_current_user)
@ -711,22 +720,26 @@ async def cancel_order(
# 发送企业微信消息 # 发送企业微信消息
wecom_bot = WecomBot() wecom_bot = WecomBot()
await wecom_bot.send_order_notification(db, order, OrderStatus.CANCELLED) background_tasks.add_task(
wecom_bot.send_order_notification,
db,
order,
OrderStatus.CANCELLED
)
# 发送模板消息 # 发送模板消息
if current_user.mp_openid: if current_user.mp_openid:
await mp_client.send_template_message( data={
openid=current_user.mp_openid,
template_id=settings.DELIVERY_ORDER_CANCELLED_TEMPLATE_ID,
data={
"character_string1": order.orderid, "character_string1": order.orderid,
"time19": CommonUtils.get_current_time(), "time19": CommonUtils.get_current_time(),
"thing5": "用户主动取消订单" "thing5": "用户主动取消订单"
}, }
miniprogram={
"appid": settings.WECHAT_APPID, background_tasks.add_task(
"path": f"/pages/order/detail/index?id={order.orderid}" sent_order_status_change_message,
} openid=current_user.mp_openid,
template_id=settings.DELIVERY_ORDER_CANCELLED_TEMPLATE_ID,
data=data
) )
return success_response( return success_response(
@ -850,6 +863,7 @@ async def get_deliveryman_orders(
@router.post("/{orderid}/deliveryman/cancel", response_model=ResponseModel) @router.post("/{orderid}/deliveryman/cancel", response_model=ResponseModel)
async def deliveryman_cancel_order( async def deliveryman_cancel_order(
background_tasks: BackgroundTasks,
orderid: str, orderid: str,
cancel_data: OrderCancel, cancel_data: OrderCancel,
db: Session = Depends(get_db), db: Session = Depends(get_db),
@ -917,27 +931,34 @@ async def deliveryman_cancel_order(
# 发送企业微信消息 # 发送企业微信消息
wecom_bot = WecomBot() wecom_bot = WecomBot()
await wecom_bot.send_order_notification(db, order, OrderStatus.CANCELLED)
background_tasks.add_task(
wecom_bot.send_order_notification,
db,
order,
OrderStatus.CANCELLED
)
# 发送模板消息 # 发送模板消息
if order.userid: if order.userid:
order_user = db.query(UserDB).filter( order_user = db.query(UserDB).filter(
UserDB.userid == order.userid UserDB.userid == order.userid
).first() ).first()
if order_user.mp_openid: if order_user.mp_openid:
await mp_client.send_template_message(
openid=order_user.mp_openid,
template_id=settings.DELIVERY_ORDER_CANCELLED_TEMPLATE_ID,
data={ data={
"character_string1": order.orderid, "character_string1": order.orderid,
"time19": CommonUtils.get_current_time(), "time19": CommonUtils.get_current_time(),
"thing5": order.cancel_reason "thing5": order.cancel_reason
}, }
miniprogram={
"appid": settings.WECHAT_APPID, background_tasks.add_task(
"path": f"/pages/order/detail/index?id={order.orderid}" sent_order_status_change_message,
} openid=order_user.mp_openid,
) template_id=settings.DELIVERY_ORDER_CANCELLED_TEMPLATE_ID,
data=data
)
return success_response( return success_response(
message="订单取消成功", message="订单取消成功",
data=OrderInfo.model_validate(order) data=OrderInfo.model_validate(order)
@ -948,6 +969,7 @@ async def deliveryman_cancel_order(
@router.post("/{orderid}/deliveryman/complete", response_model=ResponseModel) @router.post("/{orderid}/deliveryman/complete", response_model=ResponseModel)
async def complete_order( async def complete_order(
background_tasks: BackgroundTasks,
orderid: str, orderid: str,
complete_data: OrderComplete, complete_data: OrderComplete,
db: Session = Depends(get_db), db: Session = Depends(get_db),
@ -997,7 +1019,12 @@ async def complete_order(
# 发送企业微信消息 # 发送企业微信消息
wecom_bot = WecomBot() wecom_bot = WecomBot()
await wecom_bot.send_order_notification(db, order, OrderStatus.COMPLETED) background_tasks.add_task(
wecom_bot.send_order_notification,
db,
order,
OrderStatus.COMPLETED
)
# 发送模板消息 # 发送模板消息
if order.userid: if order.userid:
@ -1009,18 +1036,17 @@ async def complete_order(
UserDB.userid == order.deliveryman_user_id UserDB.userid == order.deliveryman_user_id
).first() ).first()
await mp_client.send_template_message( data={
"character_string13": order.orderid,
"thing3": deliveryman_user.nickname,
"time5" : CommonUtils.get_current_time()
}
background_tasks.add_task(
sent_order_status_change_message,
openid=order_user.mp_openid, openid=order_user.mp_openid,
template_id=settings.DELIVERY_ORDER_COMPLETED_TEMPLATE_ID, template_id=settings.DELIVERY_ORDER_COMPLETED_TEMPLATE_ID,
data={ data=data
"character_string13": order.orderid,
"thing3": deliveryman_user.nickname,
"time5" : CommonUtils.get_current_time()
},
miniprogram={
"appid": settings.WECHAT_APPID,
"path": f"/pages/order/detail/index?id={order.orderid}"
}
) )
return success_response( return success_response(
@ -1033,6 +1059,7 @@ async def complete_order(
@router.post("/{orderid}/deliveryman/receive", response_model=ResponseModel) @router.post("/{orderid}/deliveryman/receive", response_model=ResponseModel)
async def receive_order( async def receive_order(
background_tasks: BackgroundTasks,
orderid: str, orderid: str,
db: Session = Depends(get_db), db: Session = Depends(get_db),
deliveryman: UserDB = Depends(get_deliveryman_user) deliveryman: UserDB = Depends(get_deliveryman_user)
@ -1069,7 +1096,13 @@ async def receive_order(
# 发送企业微信消息 # 发送企业微信消息
wecom_bot = WecomBot() wecom_bot = WecomBot()
await wecom_bot.send_order_notification(db, order, OrderStatus.RECEIVED)
background_tasks.add_task(
wecom_bot.send_order_notification,
db,
order,
OrderStatus.RECEIVED
)
# 发送模板消息 # 发送模板消息
if order.userid: if order.userid:
@ -1081,19 +1114,19 @@ async def receive_order(
UserDB.userid == order.deliveryman_user_id UserDB.userid == order.deliveryman_user_id
).first() ).first()
await mp_client.send_template_message( data={
"character_string9": order.orderid,
"time8": CommonUtils.get_current_time(),
"thing3": deliveryman_user.nickname
}
background_tasks.add_task(
sent_order_status_change_message,
openid=order_user.mp_openid, openid=order_user.mp_openid,
template_id=settings.DELIVERY_ORDER_RECEIVED_TEMPLATE_ID, template_id=settings.DELIVERY_ORDER_RECEIVED_TEMPLATE_ID,
data={ data=data
"character_string9": order.orderid,
"time8": CommonUtils.get_current_time(),
"thing3": deliveryman_user.nickname
},
miniprogram={
"appid": settings.WECHAT_APPID,
"path": f"/pages/order/detail/index?id={order.orderid}"
}
) )
return success_response( return success_response(
message="接单成功", message="接单成功",
data=OrderInfo.model_validate(order) data=OrderInfo.model_validate(order)

View File

@ -24,7 +24,7 @@ from app.core.qcloud import qcloud_manager
from app.models.merchant import MerchantDB from app.models.merchant import MerchantDB
from app.models.address import AddressDB, AddressInfo from app.models.address import AddressDB, AddressInfo
from app.models.user import UserUpdateRoles, UserUpdateDeliveryCommissionRate from app.models.user import UserUpdateRoles, UserUpdateDeliveryCommissionRate
from app.models.order import ShippingOrderDB from app.models.order import ShippingOrderDB, OrderStatus
router = APIRouter() router = APIRouter()
@ -368,7 +368,8 @@ async def get_referral_users(
u = ReferralUserInfo.model_validate(user).model_dump() u = ReferralUserInfo.model_validate(user).model_dump()
order_count = db.query(ShippingOrderDB).filter( order_count = db.query(ShippingOrderDB).filter(
ShippingOrderDB.userid == user.userid ShippingOrderDB.userid == user.userid,
ShippingOrderDB.status == OrderStatus.COMPLETED
).count() ).count()
u['is_place_order'] = order_count > 0 u['is_place_order'] = order_count > 0

17
app/core/mpmessage.py Normal file
View File

@ -0,0 +1,17 @@
from app.core.config import settings
from app.core.mpclient import mp_client
from app.core.config import settings
# 发送订单状态改变消息
async def sent_order_status_change_message(openid: str, template_id: str, data: dict):
await mp_client.send_template_message(
openid=openid,
template_id=template_id,
data=data,
miniprogram={
"appid": settings.WECHAT_APPID,
"path": f"/pages/order/detail/index?id={data.orderid}"
}
)