import uuid from custom_decorators import singleton from models import Order from repositories.order import OrderRepository from services.payment import PaymentService from utils.datetime import current, current_timestamp, is_time_difference_greater_than, timestamp2datetime @singleton class OrderService: def __init__(self, config): self.config = config self.order_status = self.config.order.order_status self.payment_service = PaymentService(config.APIKey.tronscan) self.order_repo = OrderRepository(config) def query_order(self, name=None, phone=None, email=None, wallet_address=None, offset=0, limit=10): orders = self.order_repo.query(Order(name=name, phone=phone, email=email, from_address=wallet_address), offset, limit) cleaned_orders = [] for order in orders: cleaned_order = [] for i, v in enumerate(order): if i == 4: # 交易数量 if v is None: v = 0 else: v = int(v) elif i == 7 or i == 8: # 时间戳 if v is None: v = '' else: v = timestamp2datetime(v).strftime("%m/%d/%Y %I:%M:%S %p") elif i == 9: # 订单状态 if v is None or v > len(self.order_status): v = 0 v = self.order_status[v] else: if v is None: v = '' cleaned_order.append(v) cleaned_orders.append(cleaned_order) return cleaned_orders def create_order(self, name, phone, email, quant, payment_method, wallet_address): date_str = current().strftime('%Y%m%d%H%M%S') unique_id = str(uuid.uuid4()).split('-')[0] order_id = f"{date_str}-{unique_id}" try: to_address = self.config['PaymentAddresses'][payment_method] except KeyError: raise ValueError("Payment method not supported") order = Order(order_id=order_id, name=name, phone=phone, email=email, quant=quant, payment_method=payment_method, from_address=wallet_address, to_address=to_address) create_timestamp = self.order_repo.create(order) return order_id, create_timestamp def finish_order(self, order_id): # 判断支付时间是否超过订单存活时间 status = 2 now = current_timestamp() quant, from_address, to_address, create_timestamp = self.order_repo.get_order_info(order_id) if is_time_difference_greater_than(create_timestamp, now, milliseconds=self.config.order.lifetime): # 订单超时 status = 0 else: correct_quant, confirmed = self.payment_service.check_payment(int(quant), from_address, to_address, # 减去十秒, 避免网络延迟导致的订单创建时间太晚 create_timestamp - 10000, now) if correct_quant and confirmed: # 支付成功 status = 1 elif confirmed: # 金额不对 status = 3 elif correct_quant: # 支付尚未成功 status = 4 if status != 2: self.order_repo.update_status(order_id, status) return status