增加模板消息。

This commit is contained in:
aaron 2025-02-19 00:09:53 +08:00
parent 302a038d27
commit 3fe908cbfc
4 changed files with 170 additions and 8 deletions

View File

@ -9,7 +9,7 @@ import hashlib
import time import time
from app.core.config import settings from app.core.config import settings
import logging import logging
from typing import Optional
router = APIRouter() router = APIRouter()
def check_signature(signature: str, timestamp: str, nonce: str) -> bool: def check_signature(signature: str, timestamp: str, nonce: str) -> bool:
@ -82,3 +82,21 @@ async def handle_server(request: Request):
logging.exception("处理微信消息异常") logging.exception("处理微信消息异常")
# 返回空字符串表示接收成功 # 返回空字符串表示接收成功
return Response(content="", media_type="text/plain") return Response(content="", media_type="text/plain")
# 发送模板消息接口传入参数openid,template_id,data,url,miniprogram
@router.post("/template/send")
async def send_template_message(
openid: str,
template_id: str,
data: dict,
url: Optional[str] = None,
miniprogram: Optional[dict] = None
):
# {"data":{"phrase2":"快递代取","character_string13":"123","time4":"2025-02-25 11:11:11","thing15":"天悦龙庭10栋","thing10":"周龙"}}
"""发送模板消息"""
await mp_client.send_template_message(openid, template_id, data, url, miniprogram)
return success_response(message="模板消息发送成功")

View File

@ -31,6 +31,7 @@ from app.models.point import PointRecordDB, PointRecordType
from app.core.utils import CommonUtils from app.core.utils import CommonUtils
import logging import logging
from sqlalchemy import func from sqlalchemy import func
from app.core.mpclient import mp_client
router = APIRouter() router = APIRouter()
@ -238,6 +239,22 @@ async def create_order(
ShippingOrderPackageDB.orderid == orderid ShippingOrderPackageDB.orderid == orderid
).all() ).all()
#发送订单创建成功的消息
if current_user.mp_openid:
await mp_client.send_template_message(
openid=current_user.mp_openid,
template_id=settings.DELIVERY_ORDER_CREATED_TEMPLATE_ID,
data={
"character_string13": db_order.orderid,
"time4": db_order.create_time,
"thing10": db_order.address_customer_name,
"thing15": f"{db_order.address_community_name} {db_order.address_community_building_name} {db_order.address_detail}",
"thing9": db_order.status.status_text
}, miniprogram={
"appid": settings.WECHAT_APPID,
"path": f"/pages/order/detail/index?id={db_order.orderid}"
})
return success_response( return success_response(
message="订单创建成功", message="订单创建成功",
data={ data={
@ -248,6 +265,7 @@ async def create_order(
) )
except Exception as e: except Exception as e:
db.rollback() db.rollback()
logging.exception(f"订单创建失败: {str(e)}")
return error_response(code=500, message=f"订单创建失败: {str(e)}") return error_response(code=500, message=f"订单创建失败: {str(e)}")
@router.get("/{orderid}", response_model=ResponseModel) @router.get("/{orderid}", response_model=ResponseModel)
@ -295,8 +313,8 @@ async def get_order_detail(
ShippingOrderDB.status == OrderStatus.COMPLETED ShippingOrderDB.status == OrderStatus.COMPLETED
).count() ).count()
else: else:
deliveryman_user_name = None
delivery_count = 0 delivery_count = 0
deliveryman_user_name = None
deliveryman_user_avatar = None deliveryman_user_avatar = None
deliveryman_user_phone = None deliveryman_user_phone = None
@ -555,8 +573,20 @@ async def cancel_order(
description=f"订单取消返还积分" description=f"订单取消返还积分"
) )
db.add(point_record) db.add(point_record)
db.commit() db.commit()
# 发送模板消息
if current_user.mp_openid:
await mp_client.send_template_message(
openid=current_user.mp_openid,
template_id=settings.DELIVERY_ORDER_CANCELLED_TEMPLATE_ID,
data={
"character_string1": order.orderid,
"time19": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"thing5": "用户主动取消订单"
}
)
return success_response( return success_response(
message="订单取消成功", message="订单取消成功",
data=OrderInfo.model_validate(order) data=OrderInfo.model_validate(order)
@ -706,6 +736,22 @@ async def deliveryman_cancel_order(
db.add(point_record) db.add(point_record)
db.commit() db.commit()
# 发送模板消息
if order.userid:
order_user = db.query(UserDB).filter(
UserDB.userid == order.userid
).first()
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={
"character_string1": order.orderid,
"time19": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"thing5": order.cancel_reason
}
)
return success_response( return success_response(
message="订单取消成功", message="订单取消成功",
data=OrderInfo.model_validate(order) data=OrderInfo.model_validate(order)
@ -763,6 +809,32 @@ async def complete_order(
order.completed_time = datetime.now() order.completed_time = datetime.now()
db.commit() db.commit()
# 发送模板消息
if order.userid:
order_user = db.query(UserDB).filter(
UserDB.userid == order.userid
).first()
if order_user.mp_openid:
deliveryman_user = db.query(UserDB).filter(
UserDB.userid == order.deliveryman_user_id
).first()
await mp_client.send_template_message(
openid=order_user.mp_openid,
template_id=settings.DELIVERY_ORDER_COMPLETED_TEMPLATE_ID,
data={
"character_string13": order.orderid,
"thing3": deliveryman_user.nickname,
"phone_number15": deliveryman_user.phone,
"time5" : datetime.now().strftime("%Y-%m-%d %H:%M:%S")
},
miniprogram={
"appid": settings.WECHAT_APPID,
"path": f"/pages/order/detail/index?id={order.orderid}"
}
)
return success_response( return success_response(
message="订单已完成" if order.final_amount == 0 else "请继续支付", message="订单已完成" if order.final_amount == 0 else "请继续支付",
data=OrderInfo.model_validate(order) data=OrderInfo.model_validate(order)
@ -801,6 +873,31 @@ async def receive_order(
order.received_time = datetime.now() order.received_time = datetime.now()
db.commit() db.commit()
# 发送模板消息
if order.userid:
order_user = db.query(UserDB).filter(
UserDB.userid == order.userid
).first()
if order_user.mp_openid:
deliveryman_user = db.query(UserDB).filter(
UserDB.userid == order.deliveryman_user_id
).first()
await mp_client.send_template_message(
openid=order_user.mp_openid,
template_id=settings.DELIVERY_ORDER_RECEIVED_TEMPLATE_ID,
data={
"character_string1": order.orderid,
"time2": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"thing7": deliveryman_user.nickname,
"phone_number5" : deliveryman_user.phone
},
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)
@ -835,6 +932,33 @@ async def pickup_order(
order.pickup_time = datetime.now() order.pickup_time = datetime.now()
db.commit() db.commit()
# 发送模板消息
if order.userid:
order_user = db.query(UserDB).filter(
UserDB.userid == order.userid
).first()
if order_user.mp_openid:
order_deliveryman = db.query(UserDB).filter(
UserDB.userid == order.deliveryman_user_id
).first()
await mp_client.send_template_message(
openid=order_user.mp_openid,
template_id=settings.DELIVERY_ORDER_DELIVERING_TEMPLATE_ID,
data={
"number1": order.orderid,
"thing3": order_deliveryman.nickname,
"phone_number8": order_deliveryman.phone,
"time5" : datetime.now().strftime("%Y-%m-%d %H:%M:%S")
},
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

@ -76,13 +76,15 @@ class Settings(BaseSettings):
# 微信模板消息ID # 微信模板消息ID
#配送订单创建成功 #配送订单创建成功
WECHAT_DELIVERY_ORDER_CREATED_TEMPLATE_ID: str = "-aFOuC2dv1E6Opn9auB39bSiU4p0DbKOrUtOFgS-AaA" DELIVERY_ORDER_CREATED_TEMPLATE_ID: str = "N8sMeoBG6biUjWO1PbxBol6akEI6O9isSvCiB1MlVuY"
#配送订单接单 #配送订单接单
WECHAT_DELIVERY_ORDER_RECEIVED_TEMPLATE_ID: str = "zBdw3OQoZ4RQ9Yau-kpHJ-iGo6cjm7Q-dEh4Luzs2ww" DELIVERY_ORDER_RECEIVED_TEMPLATE_ID: str = "-HJ-9uiSI8hyHD3zWEZ3Gh72LLf_qffrhJk9kTmgQU4"
#配送订单配送中
DELIVERY_ORDER_DELIVERING_TEMPLATE_ID: str = "31KA432gVcnPUxIu6eKWWxMhacPS_v3svzqwN7uTI-w"
#配送订单完成 #配送订单完成
WECHAT_DELIVERY_ORDER_COMPLETED_TEMPLATE_ID: str = "Yr4BuHkwUw1LTWYfSz7MTEBWcqaqKGojqHlxt14moCU" DELIVERY_ORDER_COMPLETED_TEMPLATE_ID: str = "eR7UlBRWRXEuQdVNNU6AByAOUqZd4fzxiVEYcRtXrLU"
#配送订单取消 #配送订单取消
WECHAT_DELIVERY_ORDER_CANCELLED_TEMPLATE_ID: str = "5sS4wKt7jyoFGYMKQHGweIDB6UHrikF_ith0swd8z5Y" DELIVERY_ORDER_CANCELLED_TEMPLATE_ID: str = "iGR0rPtOFC_u8Xj5-R730zoDD_4Kbswkf_jSTnSSd6E"
class Config: class Config:
case_sensitive = True case_sensitive = True

View File

@ -16,6 +16,19 @@ class OrderStatus(str, enum.Enum):
UNPAID = "UNPAID" # 未支付 UNPAID = "UNPAID" # 未支付
COMPLETED = "COMPLETED" # 已完成 COMPLETED = "COMPLETED" # 已完成
# 订单状态转化成中文
@property
def status_text(self) -> str:
status_map = {
OrderStatus.CREATED: "待接单",
OrderStatus.CANCELLED: "已取消",
OrderStatus.RECEIVED: "已接单",
OrderStatus.DELIVERING: "配送中",
OrderStatus.UNPAID: "待支付",
OrderStatus.COMPLETED: "已完成"
}
return status_map.get(self, "未知状态")
class DeliveryMethod(str, enum.Enum): class DeliveryMethod(str, enum.Enum):
DELIVERY_AT_DOORSTEP = "DELIVERY_AT_DOORSTEP" # 放在门口 DELIVERY_AT_DOORSTEP = "DELIVERY_AT_DOORSTEP" # 放在门口
DELIVERY_TO_ROOM = "DELIVERY_TO_ROOM" # 投递到家 DELIVERY_TO_ROOM = "DELIVERY_TO_ROOM" # 投递到家
@ -53,7 +66,10 @@ class ShippingOrderDB(Base):
completed_time = Column(DateTime(timezone=True), nullable=True) # 完成时间 completed_time = Column(DateTime(timezone=True), nullable=True) # 完成时间
complete_images = Column(String(1000), nullable=True) # 完成订单的图片URL多个URL用逗号分隔 complete_images = Column(String(1000), nullable=True) # 完成订单的图片URL多个URL用逗号分隔
create_time = Column(DateTime(timezone=True), server_default=func.now()) create_time = Column(DateTime(timezone=True), server_default=func.now())
# 配送员信息
deliveryman_user_id = Column(Integer, ForeignKey("users.userid"), nullable=True) deliveryman_user_id = Column(Integer, ForeignKey("users.userid"), nullable=True)
cancel_user_id = Column(Integer, ForeignKey("users.userid"), nullable=True) cancel_user_id = Column(Integer, ForeignKey("users.userid"), nullable=True)
pay_status = Column(Boolean, default=False) # 支付状态 pay_status = Column(Boolean, default=False) # 支付状态
prepay_id = Column(String(64)) # 微信支付预支付ID prepay_id = Column(String(64)) # 微信支付预支付ID
@ -118,7 +134,9 @@ class OrderInfo(BaseModel):
optimized_complete_images: Optional[List[str]] = None optimized_complete_images: Optional[List[str]] = None
create_time: datetime create_time: datetime
delivery_method: DeliveryMethod delivery_method: DeliveryMethod
deliveryman_user_id: Optional[int] = None deliveryman_user_id: Optional[int] = None
cancel_reason: Optional[str] = None cancel_reason: Optional[str] = None
cancel_user_id: Optional[int] = None cancel_user_id: Optional[int] = None