diff --git a/app/api/endpoints/order.py b/app/api/endpoints/order.py index ba34140..f0cc4d1 100644 --- a/app/api/endpoints/order.py +++ b/app/api/endpoints/order.py @@ -42,6 +42,7 @@ from app.models.config import ConfigDB from app.core.mpmessage import sent_order_status_change_message from fastapi import BackgroundTasks from app.core.coupon_manager import CouponManager +from app.core.redis_client import redis_client router = APIRouter() @@ -331,6 +332,10 @@ async def create_order( else: success_text = settings.ORDER_SUCCESS_TODAY_TEXT + # 添加到新订单队列 + if db_order.address_community_id: + redis_client.push_order_to_queue(db_order.address_community_id, db_order.orderid) + return success_response( message="订单创建成功", data={ @@ -1356,4 +1361,18 @@ async def get_deliveryman_order_summary( "total_count": total, "yesterday_count": yesterday_total, "today_count": today_total - }) \ No newline at end of file + }) + +@router.get("/deliveryman/check_new/orders", response_model=ResponseModel) +async def check_new_orders( + db: Session = Depends(get_db), + deliveryman: UserDB = Depends(get_deliveryman_user) +): + """检查新订单""" + + # 从Redis获取新订单ID列表 + order_ids = redis_client.pop_orders_from_queue(deliveryman.community_id, 10) + + return success_response(data={ + "has_new_order": len(order_ids) > 0 + }) diff --git a/app/api/endpoints/wecom.py b/app/api/endpoints/wecom.py index b568c35..df0cb34 100644 --- a/app/api/endpoints/wecom.py +++ b/app/api/endpoints/wecom.py @@ -124,18 +124,19 @@ async def wechat_corp_callback( change_type = msg_root.find('ChangeType').text if change_type == 'add_member': - # 获取数据库会话 + + # # 获取数据库会话 db = next(get_db()) - # 查找对应的小区 - community = db.query(CommunityDB).filter( - CommunityDB.webot_webhook.isnot(None) - ).first() + # # 查找对应的小区 + # community = db.query(CommunityDB).filter( + # CommunityDB.webot_webhook.isnot(None) + # ).first() - if community and community.webot_webhook: - # 发送欢迎消息 - wecom_bot = WecomBot() - await wecom_bot.send_welcome_message(community.webot_webhook) + # if community and community.webot_webhook: + # # 发送欢迎消息 + # wecom_bot = WecomBot() + # await wecom_bot.send_welcome_message(community.webot_webhook) return Response(content="success", media_type="text/plain") diff --git a/app/core/redis_client.py b/app/core/redis_client.py new file mode 100644 index 0000000..59451f8 --- /dev/null +++ b/app/core/redis_client.py @@ -0,0 +1,98 @@ +import redis +import json +import logging +from app.core.config import settings +from typing import List, Dict, Any, Optional + +class RedisClient: + """Redis 客户端""" + + _instance = None + + def __new__(cls): + if cls._instance is None: + cls._instance = super(RedisClient, cls).__new__(cls) + try: + cls._instance.client = redis.Redis( + host=settings.REDIS_HOST, + port=settings.REDIS_PORT, + db=settings.REDIS_DB, + password=settings.REDIS_PASSWORD, + decode_responses=True # 自动解码为字符串 + ) + # 测试连接 + cls._instance.client.ping() + logging.info("Redis 连接成功") + except Exception as e: + logging.error(f"Redis 连接失败: {str(e)}") + cls._instance.client = None + return cls._instance + + def get_client(self) -> redis.Redis: + """获取 Redis 客户端""" + return self.client + + def push_order_to_queue(self, community_id: int, order_id: str) -> bool: + """ + 添加新订单到社区队列 + + Args: + community_id: 社区ID + order_id: 订单ID + + Returns: + bool: 是否添加成功 + """ + try: + key = f"community:{community_id}:new_orders" + # 使用 LPUSH 将订单ID添加到列表头部 + self.client.lpush(key, order_id) + # 设置过期时间为24小时 + self.client.expire(key, 86400) + return True + except Exception as e: + logging.error(f"添加新订单到队列失败: {str(e)}") + return False + + def pop_orders_from_queue(self, community_id: int, count: int = 10) -> List[str]: + """ + 获取社区新订单列表 + + Args: + community_id: 社区ID + count: 获取数量,默认10个 + + Returns: + List[str]: 订单ID列表 + """ + try: + key = f"community:{community_id}:new_orders" + # 获取订单列表,并移除 + orders = self.client.lpop(key, count) + return orders + except Exception as e: + logging.error(f"获取社区新订单列表失败: {str(e)}") + return [] + + def remove_order(self, community_id: int, order_id: str) -> bool: + """ + 从社区队列中移除订单 + + Args: + community_id: 社区ID + order_id: 订单ID + + Returns: + bool: 是否移除成功 + """ + try: + key = f"community:{community_id}:new_orders" + # 使用 LREM 移除列表中的元素 + self.client.lrem(key, 0, order_id) + return True + except Exception as e: + logging.error(f"从队列中移除订单失败: {str(e)}") + return False + +# 创建全局实例 +redis_client = RedisClient() \ No newline at end of file