修复bug, 实现订单分页搜索功能
This commit is contained in:
parent
6686308e3b
commit
5da63e23cc
|
|
@ -47,7 +47,7 @@ def create_order():
|
||||||
|
|
||||||
wallet_address = data.get('wallet_address', None)
|
wallet_address = data.get('wallet_address', None)
|
||||||
if wallet_address is None:
|
if wallet_address is None:
|
||||||
wallet_addresses = user_service.get_wallet_addresses(name, phone, email)
|
wallet_addresses = user_service.get_wallet_addresses(name, phone, email, payment_method)
|
||||||
|
|
||||||
if not wallet_addresses:
|
if not wallet_addresses:
|
||||||
return jsonify({
|
return jsonify({
|
||||||
|
|
@ -60,9 +60,12 @@ def create_order():
|
||||||
}), 200
|
}), 200
|
||||||
# 单个地址
|
# 单个地址
|
||||||
wallet_address = wallet_addresses[0]
|
wallet_address = wallet_addresses[0]
|
||||||
|
else:
|
||||||
|
user_service.update_or_create(name, phone, email, wallet_address, payment_method)
|
||||||
|
|
||||||
order_id, create_timestamp = order_service.create_order(name=name, phone=phone, email=email,
|
order_id, create_timestamp = order_service.create_order(name=name, phone=phone, email=email,
|
||||||
quant=quant, wallet_address=wallet_address)
|
quant=quant, payment_method=payment_method,
|
||||||
|
wallet_address=wallet_address)
|
||||||
|
|
||||||
return jsonify({"orderID": order_id,
|
return jsonify({"orderID": order_id,
|
||||||
"amount": quant,
|
"amount": quant,
|
||||||
|
|
@ -83,8 +86,7 @@ def query_order():
|
||||||
offset = (page - 1) * page_size
|
offset = (page - 1) * page_size
|
||||||
limit = page_size
|
limit = page_size
|
||||||
|
|
||||||
|
orders = order_service.query_order(name, phone, email, wallet_address, offset, limit)
|
||||||
orders = order_service.queryOrder(name, phone, email, wallet_address, offset, limit)
|
|
||||||
return jsonify({"orders": orders}), 200
|
return jsonify({"orders": orders}), 200
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,19 +12,22 @@ class User:
|
||||||
|
|
||||||
def insert_sql(self, params_format="list"):
|
def insert_sql(self, params_format="list"):
|
||||||
params_sql, params = pack_params(params_format=params_format, param_sql="{param}", join_str=",",
|
params_sql, params = pack_params(params_format=params_format, param_sql="{param}", join_str=",",
|
||||||
name=self.name, phone=self.phone, email=self.email, wallet_address=self.wallet_address,
|
name=self.name, phone=self.phone, email=self.email,
|
||||||
|
wallet_address=self.wallet_address,
|
||||||
payment_method=self.payment_method)
|
payment_method=self.payment_method)
|
||||||
return f"INSERT INTO users ({params_sql}) VALUES ({','.join('%s' for _ in params)})", params
|
return f"INSERT INTO users ({params_sql}) VALUES ({','.join('%s' for _ in params)})", params
|
||||||
|
|
||||||
def select_sql(self, condition="AND", params_format="list"):
|
def select_sql(self, condition="AND", params_format="list"):
|
||||||
params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ",
|
params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ",
|
||||||
name=self.name, phone=self.phone, email=self.email, wallet_address=self.wallet_address,
|
name=self.name, phone=self.phone, email=self.email,
|
||||||
|
wallet_address=self.wallet_address,
|
||||||
payment_method=self.payment_method)
|
payment_method=self.payment_method)
|
||||||
return f"SELECT id, name, phone, email, wallet_address, payment_method FROM users WHERE {params_sql}", params
|
return f"SELECT id, name, phone, email, wallet_address, payment_method FROM users WHERE {params_sql}", params
|
||||||
|
|
||||||
def exists_sql(self, condition="AND", params_format="list"):
|
def exists_sql(self, condition="AND", params_format="list"):
|
||||||
params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ",
|
params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ",
|
||||||
name=self.name, phone=self.phone, email=self.email, wallet_address=self.wallet_address,
|
name=self.name, phone=self.phone, email=self.email,
|
||||||
|
wallet_address=self.wallet_address,
|
||||||
payment_method=self.payment_method)
|
payment_method=self.payment_method)
|
||||||
return f"SELECT id FROM users WHERE {params_sql} LIMIT 1", params
|
return f"SELECT id FROM users WHERE {params_sql} LIMIT 1", params
|
||||||
|
|
||||||
|
|
@ -85,15 +88,17 @@ class User:
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return hash((self.name, self.phone, self.email, self.wallet_address, self.payment_method))
|
return hash((self.name, self.phone, self.email, self.wallet_address, self.payment_method))
|
||||||
|
|
||||||
|
|
||||||
class Order:
|
class Order:
|
||||||
def __init__(self, id_=None, order_id=None, name=None, phone=None, email=None, quant=None, from_address=None,
|
def __init__(self, id_=None, order_id=None, name=None, phone=None, email=None, quant=None, payment_method=None,
|
||||||
to_address=None, create_timestamp=None, update_timestamp=None, status=None):
|
from_address=None, to_address=None, create_timestamp=None, update_timestamp=None, status=None):
|
||||||
self.id = id_
|
self.id = id_
|
||||||
self.order_id = order_id
|
self.order_id = order_id
|
||||||
self.name = name
|
self.name = name
|
||||||
self.phone = phone
|
self.phone = phone
|
||||||
self.email = email
|
self.email = email
|
||||||
self.quant = quant
|
self.quant = quant
|
||||||
|
self.payment_method = payment_method
|
||||||
self.from_address = from_address
|
self.from_address = from_address
|
||||||
self.to_address = to_address
|
self.to_address = to_address
|
||||||
self.create_timestamp = create_timestamp
|
self.create_timestamp = create_timestamp
|
||||||
|
|
@ -103,24 +108,28 @@ class Order:
|
||||||
def insert_sql(self, params_format="list"):
|
def insert_sql(self, params_format="list"):
|
||||||
params_sql, params = pack_params(params_format=params_format, param_sql="{param}", join_str=",",
|
params_sql, params = pack_params(params_format=params_format, param_sql="{param}", join_str=",",
|
||||||
order_id=self.order_id, name=self.name, phone=self.phone, email=self.email,
|
order_id=self.order_id, name=self.name, phone=self.phone, email=self.email,
|
||||||
quant=self.quant,
|
quant=self.quant, payment_method=self.payment_method,
|
||||||
from_address=self.from_address, to_address=self.to_address,
|
from_address=self.from_address, to_address=self.to_address,
|
||||||
create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp,
|
create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp,
|
||||||
status=self.status)
|
status=self.status)
|
||||||
return f"INSERT INTO orders ({params_sql}) VALUES ({','.join('%s' for _ in params)})", params
|
return f"INSERT INTO orders ({params_sql}) VALUES ({','.join('%s' for _ in params)})", params
|
||||||
|
|
||||||
def select_sql(self, condition="AND", params_format="list"):
|
def select_sql(self, query_columns=None, condition="AND", params_format="list"):
|
||||||
|
if query_columns is None:
|
||||||
|
query_columns = ['order_id', 'name', 'phone', 'email', 'quant', 'payment_method', 'from_address']
|
||||||
params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ",
|
params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ",
|
||||||
order_id=self.order_id, name=self.name, phone=self.phone, email=self.email, quant=self.quant,
|
order_id=self.order_id, name=self.name, phone=self.phone, email=self.email,
|
||||||
|
quant=self.quant, payment_method=self.payment_method,
|
||||||
from_address=self.from_address, to_address=self.to_address,
|
from_address=self.from_address, to_address=self.to_address,
|
||||||
create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp,
|
create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp,
|
||||||
status=self.status)
|
status=self.status)
|
||||||
return f"SELECT id, name, phone, email, wallet_address, payment_method FROM orders WHERE {params_sql}", params
|
return f'SELECT {",".join(query_columns)} FROM orders WHERE {params_sql}', params
|
||||||
|
|
||||||
def exists_sql(self, condition="AND", params_format="list"):
|
def exists_sql(self, condition="AND", params_format="list"):
|
||||||
params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ",
|
params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ",
|
||||||
order_id=self.order_id, name=self.name, phone=self.phone, email=self.email, quant=self.quant,
|
order_id=self.order_id, name=self.name, phone=self.phone, email=self.email,
|
||||||
|
quant=self.quant, payment_method=self.payment_method,
|
||||||
from_address=self.from_address, to_address=self.to_address,
|
from_address=self.from_address, to_address=self.to_address,
|
||||||
create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp,
|
create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp,
|
||||||
status=self.status)
|
status=self.status)
|
||||||
return f"SELECT id FROM orders WHERE {params_sql} LIMIT 1", params
|
return f"SELECT id FROM orders WHERE {params_sql} LIMIT 1", params
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,10 @@ class OrderRepository:
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def query(self, order, offset, limit):
|
def query(self, order, offset, limit):
|
||||||
select_sql, params = order.select_sql()
|
select_sql, params = order.select_sql(
|
||||||
|
query_columns=['order_id', 'name', 'phone', 'email', 'quant', 'payment_method', 'from_address',
|
||||||
|
'create_timestamp', 'update_timestamp', 'status']
|
||||||
|
)
|
||||||
select_sql = f"{select_sql} LIMIT %s OFFSET %s"
|
select_sql = f"{select_sql} LIMIT %s OFFSET %s"
|
||||||
params = params + [limit, offset]
|
params = params + [limit, offset]
|
||||||
cursor = self.db.execute_query(select_sql, params)
|
cursor = self.db.execute_query(select_sql, params)
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ class UserRepository:
|
||||||
def __init__(self, config):
|
def __init__(self, config):
|
||||||
self.db = Database(config['MYSQL'])
|
self.db = Database(config['MYSQL'])
|
||||||
|
|
||||||
def get_or_create(self, user):
|
def get_and_update(self, user):
|
||||||
users = []
|
users = []
|
||||||
cursor = self.db.execute_query(*user.select_sql(condition="OR"))
|
cursor = self.db.execute_query(*user.select_sql(condition="OR"))
|
||||||
same_users = cursor.fetchall()
|
same_users = cursor.fetchall()
|
||||||
|
|
@ -72,3 +72,9 @@ class UserRepository:
|
||||||
raise
|
raise
|
||||||
users.append(user)
|
users.append(user)
|
||||||
return users
|
return users
|
||||||
|
|
||||||
|
def exist(self, user):
|
||||||
|
cursor = self.db.execute_query(*user.exists_sql())
|
||||||
|
exist = cursor.fetchone()
|
||||||
|
cursor.close()
|
||||||
|
return bool(exist)
|
||||||
|
|
|
||||||
|
|
@ -4,27 +4,57 @@ from custom_decorators import singleton
|
||||||
from models import Order
|
from models import Order
|
||||||
from repositories.order import OrderRepository
|
from repositories.order import OrderRepository
|
||||||
from services.payment import PaymentService
|
from services.payment import PaymentService
|
||||||
from utils.datetime import current, current_timestamp, is_time_difference_greater_than
|
from utils.datetime import current, current_timestamp, is_time_difference_greater_than, timestamp2datetime
|
||||||
|
|
||||||
|
|
||||||
@singleton
|
@singleton
|
||||||
class OrderService:
|
class OrderService:
|
||||||
def __init__(self, config):
|
def __init__(self, config):
|
||||||
self.config = config
|
self.config = config
|
||||||
|
self.order_status = self.config.order.order_status
|
||||||
self.payment_service = PaymentService(config.APIKey.tronscan)
|
self.payment_service = PaymentService(config.APIKey.tronscan)
|
||||||
self.order_repo = OrderRepository(config)
|
self.order_repo = OrderRepository(config)
|
||||||
|
|
||||||
def queryOrder(self, name, phone, email, wallet_address, offset, limit):
|
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),
|
orders = self.order_repo.query(Order(name=name, phone=phone, email=email, from_address=wallet_address),
|
||||||
offset, limit)
|
offset, limit)
|
||||||
return orders
|
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, wallet_address):
|
def create_order(self, name, phone, email, quant, payment_method, wallet_address):
|
||||||
date_str = current().strftime('%Y%m%d%H%M%S')
|
date_str = current().strftime('%Y%m%d%H%M%S')
|
||||||
unique_id = str(uuid.uuid4()).split('-')[0]
|
unique_id = str(uuid.uuid4()).split('-')[0]
|
||||||
order_id = f"{date_str}-{unique_id}"
|
order_id = f"{date_str}-{unique_id}"
|
||||||
order = Order(order_id=order_id, name=name, phone=phone, email=email, quant=quant,
|
try:
|
||||||
from_address=wallet_address, to_address=self.config['PaymentAddresses']['usdt'])
|
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)
|
create_timestamp = self.order_repo.create(order)
|
||||||
return order_id, create_timestamp
|
return order_id, create_timestamp
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,15 @@ class UserService:
|
||||||
self.config = config
|
self.config = config
|
||||||
self.user_repo = UserRepository(config)
|
self.user_repo = UserRepository(config)
|
||||||
|
|
||||||
def get_wallet_addresses(self, name=None, phone=None, email=None):
|
def get_wallet_addresses(self, name=None, phone=None, email=None, payment_method=None):
|
||||||
if phone or email:
|
if phone or email:
|
||||||
users = self.user_repo.get_or_create(User(name=name, phone=phone, email=email))
|
users = self.user_repo.get_and_update(User(name=name, phone=phone, email=email,
|
||||||
|
payment_method=payment_method))
|
||||||
addresses = set(user.address for user in users if user.address)
|
addresses = set(user.address for user in users if user.address)
|
||||||
return list(addresses)
|
return list(addresses)
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
def update_or_create(self, name=None, phone=None, email=None, wallet_address=None, payment_method=None):
|
||||||
|
self.user_repo.get_and_update(User(name=name, phone=phone, email=email, wallet_address=wallet_address,
|
||||||
|
payment_method=payment_method))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,10 @@ def current_timestamp():
|
||||||
return int(datetime.datetime.now().timestamp() * 1000)
|
return int(datetime.datetime.now().timestamp() * 1000)
|
||||||
|
|
||||||
|
|
||||||
|
def timestamp2datetime(timestamp):
|
||||||
|
return datetime.datetime.fromtimestamp(timestamp / 1000.0)
|
||||||
|
|
||||||
|
|
||||||
def is_time_difference_greater_than(timestamp1, timestamp2, hours=0, minutes=0, seconds=0, milliseconds=0):
|
def is_time_difference_greater_than(timestamp1, timestamp2, hours=0, minutes=0, seconds=0, milliseconds=0):
|
||||||
"""
|
"""
|
||||||
判断两个时间戳的时间差是否大于指定的小时、分钟和秒数
|
判断两个时间戳的时间差是否大于指定的小时、分钟和秒数
|
||||||
|
|
@ -25,8 +29,8 @@ def is_time_difference_greater_than(timestamp1, timestamp2, hours=0, minutes=0,
|
||||||
bool: 如果时间差大于指定的小时、分钟和秒数返回True,否则返回False
|
bool: 如果时间差大于指定的小时、分钟和秒数返回True,否则返回False
|
||||||
"""
|
"""
|
||||||
# 将时间戳转换为 datetime 对象
|
# 将时间戳转换为 datetime 对象
|
||||||
time1 = datetime.datetime.fromtimestamp(timestamp1 / 1000.0)
|
time1 = timestamp2datetime(timestamp1)
|
||||||
time2 = datetime.datetime.fromtimestamp(timestamp2 / 1000.0)
|
time2 = timestamp2datetime(timestamp2)
|
||||||
|
|
||||||
# 计算时间差
|
# 计算时间差
|
||||||
time_difference = abs(time2 - time1)
|
time_difference = abs(time2 - time1)
|
||||||
|
|
@ -63,5 +67,6 @@ def parse_time_string(time_str):
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def to_milliseconds(days=0, hours=0, minutes=0, seconds=0, milliseconds=0):
|
def to_milliseconds(days=0, hours=0, minutes=0, seconds=0, milliseconds=0):
|
||||||
return days * 24 * 60 * 60 * 1000 + hours * 60 * 60 * 1000 + minutes * 60 * 1000 + seconds * 1000 + milliseconds
|
return days * 24 * 60 * 60 * 1000 + hours * 60 * 60 * 1000 + minutes * 60 * 1000 + seconds * 1000 + milliseconds
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue