99 lines
4.1 KiB
Python
99 lines
4.1 KiB
Python
from loguru import logger
|
|
|
|
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):
|
|
order_obj = Order(name=name, phone=phone, email=email, from_address=wallet_address)
|
|
orders = self.order_repo.query(order_obj, offset, limit)
|
|
order_count = self.order_repo.count(order_obj)
|
|
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, order_count
|
|
|
|
def create_order(self, name, phone, email, quant, payment_method, wallet_address):
|
|
try:
|
|
to_address = self.config['PaymentAddresses'][payment_method]
|
|
except KeyError:
|
|
raise ValueError("Payment method not supported")
|
|
order = Order(name=name, phone=phone, email=email,
|
|
quant=quant, payment_method=payment_method,
|
|
from_address=wallet_address, to_address=to_address,
|
|
status=2)
|
|
result = self.order_repo.get_last(order)
|
|
if not result:
|
|
result = self.order_repo.create(order)
|
|
elif not self.check_order_efficiency(result[1]):
|
|
self.order_repo.update_status(result[0], status=0)
|
|
result = self.order_repo.create(order)
|
|
return result
|
|
|
|
|
|
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 not self.check_order_efficiency(create_timestamp, now=now):
|
|
logger.debug('Timed Out')
|
|
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:
|
|
logger.debug('Paid')
|
|
status = 1
|
|
elif confirmed:
|
|
logger.debug('Wrong Amount')
|
|
status = 3
|
|
elif correct_quant:
|
|
logger.debug('Pending')
|
|
status = 4
|
|
else:
|
|
logger.debug('Unpaid')
|
|
if status != 2:
|
|
self.order_repo.update_status(order_id, status)
|
|
return status
|
|
|
|
def check_order_efficiency(self, timestamp, now=None):
|
|
if now is None:
|
|
now = current_timestamp()
|
|
efficiency = not is_time_difference_greater_than(timestamp, now, milliseconds=self.config.order.lifetime)
|
|
return efficiency
|