import logging import time from typing import Any, Optional import redis from config.settings import settings from .database import Database logger = logging.getLogger(__name__) class MockService: def __init__(self, db: Optional[Database] = None): self.db = db or Database() self._init_redis() def _init_redis(self): config = settings.redis_config self.redis = redis.Redis( host=config["host"], port=config["port"], db=config["db"], decode_responses=True, ) def payment_success(self, order_id: int, amount: float, delay: float = 0): if delay > 0: time.sleep(delay) self.db.execute( "UPDATE tb_order SET status = %s, paid_at = NOW(), paid_amount = %s WHERE id = %s", ("paid", int(amount * 100), order_id) ) logger.info(f"模拟支付成功: order_id={order_id}, amount={amount}") def payment_failed(self, order_id: int, reason: str = "支付失败"): self.db.execute( "UPDATE tb_order SET status = %s, fail_reason = %s WHERE id = %s", ("failed", reason, order_id) ) logger.info(f"模拟支付失败: order_id={order_id}, reason={reason}") def sms_code(self, phone: str, code: str, expire_seconds: int = 300): key = f"sms:code:{phone}" self.redis.setex(key, expire_seconds, code) logger.info(f"模拟短信验证码: phone={phone}, code={code}") def task_complete(self, task_type: str, task_id: int, result: Any = None): self.db.execute( "UPDATE tb_async_task SET status = %s, result = %s, completed_at = NOW() WHERE task_type = %s AND id = %s", ("completed", str(result) if result else None, task_type, task_id) ) logger.info(f"模拟任务完成: {task_type}#{task_id}") def task_failed(self, task_type: str, task_id: int, error: str): self.db.execute( "UPDATE tb_async_task SET status = %s, error = %s, completed_at = NOW() WHERE task_type = %s AND id = %s", ("failed", error, task_type, task_id) ) logger.info(f"模拟任务失败: {task_type}#{task_id}, error={error}") def card_data_balance(self, card_id: int, balance_mb: int): self.db.execute( "UPDATE tb_iot_card SET data_balance = %s WHERE id = %s", (balance_mb, card_id) ) logger.info(f"模拟卡片流量: card_id={card_id}, balance={balance_mb}MB") def external_api_response(self, api_name: str, response: dict): key = f"mock:api:{api_name}" import json self.redis.setex(key, 300, json.dumps(response)) logger.info(f"模拟外部 API: {api_name}")