|
|
|
from functools import reduce
|
|
|
|
|
|
|
|
from dspt_api.util.general.handle_redis import get_data_from_redis, get_param_from_redis
|
|
|
|
from dspt_api.util.general.handle_ecard import get_ecard_level, get_ecard
|
|
|
|
from dspt_api.util.general.handle_card import get_card_type
|
|
|
|
from dspt_api.util.general.handle_float import f2
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
|
|
# 将接口请求的数据中卖品信息整理成列表结构
|
|
|
|
def format_goods(_data):
|
|
|
|
goods_list = []
|
|
|
|
for cate in _data['res']['data']:
|
|
|
|
for g in cate['goods']:
|
|
|
|
goods_list.append(g)
|
|
|
|
return {'res': {'status': _data['res']['status'], 'data': goods_list}}
|
|
|
|
|
|
|
|
|
|
|
|
# 将接口获取的卖品数据转化成请求参数格式
|
|
|
|
def general_goods_field(_data, ecard_level=None):
|
|
|
|
params = []
|
|
|
|
total_cash = 0
|
|
|
|
for g in _data:
|
|
|
|
_num = g.get('buy_num', 1)
|
|
|
|
info = {
|
|
|
|
'id': g['id'],
|
|
|
|
'type': g['type'],
|
|
|
|
'price': str(get_goods_price(g, _num, ecard_level=ecard_level)),
|
|
|
|
'num': _num
|
|
|
|
}
|
|
|
|
if g['type'] == 'package' and g['packageType'] == '2':
|
|
|
|
add_price = f2(0)
|
|
|
|
optional_package = []
|
|
|
|
for key, val in g['user_select'].items():
|
|
|
|
member = []
|
|
|
|
member_id = []
|
|
|
|
for m in val['data']:
|
|
|
|
if m['id'] in member_id:
|
|
|
|
for item in member:
|
|
|
|
if item['id'] == m['id']:
|
|
|
|
item['num'] = item['num'] + 1
|
|
|
|
add_price += f2(m['addPrice'])
|
|
|
|
else:
|
|
|
|
member.append({'id': m['id'], 'num': 1, 'add_price': m['addPrice']})
|
|
|
|
member_id.append(m['id'])
|
|
|
|
add_price += f2(m['addPrice'])
|
|
|
|
optional_package.append({'index': key, 'members': member})
|
|
|
|
info['optional_package'] = optional_package
|
|
|
|
info['price'] = str(f2(info['price']) + add_price)
|
|
|
|
total_cash = f2(total_cash) + f2(info['price']*info['num'])
|
|
|
|
params.append(info)
|
|
|
|
if g.get('discount1', False):
|
|
|
|
total_discount = f2(0)
|
|
|
|
discount_list = []
|
|
|
|
if g['discount1'] > 0:
|
|
|
|
total_discount += f2(g['discount1'])
|
|
|
|
discount_list.append(
|
|
|
|
{"discount_price": g['discount1'], "discount_name": f"现金优惠券{str(g['discount1'])}元"})
|
|
|
|
if g['discount2'] > 0:
|
|
|
|
total_discount += f2(g['discount2'])
|
|
|
|
discount_list.append(
|
|
|
|
{"discount_price": g['discount2'], "discount_name": f"现金优惠券{str(g['discount2'])}元"})
|
|
|
|
if len(discount_list) > 0:
|
|
|
|
info['discount_price'] = str(total_discount)
|
|
|
|
info['discount_detail'] = discount_list
|
|
|
|
total_cash -= total_discount
|
|
|
|
|
|
|
|
print('general_goods_param---------params', params)
|
|
|
|
return params, str(total_cash)
|
|
|
|
|
|
|
|
|
|
|
|
def get_goods_price(goods, num, ecard_level=None):
|
|
|
|
price = goods.get('partnerPrice', goods['onlinePrice']) if ecard_level is None else get_ecard_price(goods,
|
|
|
|
ecard_level)
|
|
|
|
return f2(price)
|
|
|
|
|
|
|
|
|
|
|
|
def get_ecard_price(goods, ecard_level):
|
|
|
|
if ecard_price_list := goods.get('ecardPrices', False):
|
|
|
|
for ecard_price_item in ecard_price_list:
|
|
|
|
if ecard_price_item['ecardLevelNo'] == ecard_level:
|
|
|
|
return ecard_price_item['ecardLevelPrice']
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
def general_goods_params(pay_type, data, ticket_cash=f2(0)):
|
|
|
|
# 券信息
|
|
|
|
quan = ''
|
|
|
|
# redis_key 前缀
|
|
|
|
redis_key_prefix = f'dspt_api_{data["ip"]}_{data["env"]}_{data["member_type"]}_{data["pid"]}_{data["cid"]}'
|
|
|
|
# 获取卖品数据
|
|
|
|
request_api = {'name': '3.2.1 获取卖品列表', 'path': 'cinema/goods'}
|
|
|
|
redis_key_api = f'{redis_key_prefix}_{request_api["path"]}'
|
|
|
|
result, _format, goods_data, _timestamp = get_data_from_redis(redis_key_api)
|
|
|
|
if result is False:
|
|
|
|
return False, None, None, None, None
|
|
|
|
if pay_type == 'cash':
|
|
|
|
goods_field, goods_cash = general_goods_field(goods_data)
|
|
|
|
goods_cash = f2(goods_cash)
|
|
|
|
goods_cash += ticket_cash
|
|
|
|
elif pay_type == 'ecard':
|
|
|
|
ecard_num = get_ecard(data['ip'], data["env"], data["pid"], data["cid"])
|
|
|
|
ecard_level = get_ecard_level(ecard_num)
|
|
|
|
goods_field, goods_cash = general_goods_field(goods_data, ecard_level)
|
|
|
|
goods_cash = f2(goods_cash)
|
|
|
|
goods_cash += ticket_cash
|
|
|
|
elif pay_type in ['yushouquan', 'equan']:
|
|
|
|
goods_field, goods_cash = general_goods_field(goods_data)
|
|
|
|
# 获取券价格
|
|
|
|
request_api_yushouquan = {'name': '3.6.1 添加券', 'path': 'seat/check-coupon'}
|
|
|
|
redis_key_api_yushouquan = f'{redis_key_prefix}_{request_api_yushouquan["path"]}'
|
|
|
|
result_yushouquan, _format_yushouquan, cash_from_yushouquan, _timestamp_yushouquan = get_data_from_redis(
|
|
|
|
redis_key_api_yushouquan)
|
|
|
|
if not result_yushouquan:
|
|
|
|
return False, None, None, None, None
|
|
|
|
# 获取券码
|
|
|
|
req_params = get_param_from_redis(redis_key_api_yushouquan)
|
|
|
|
if pay_type == 'yushouquan':
|
|
|
|
quan = req_params['coupons'] if req_params.get('coupons', False) else '3.6.1添加券接口中选择的券类型为会员卡赠券,与当前设置不符合'
|
|
|
|
elif pay_type == 'equan':
|
|
|
|
quan = req_params['card_coupons'] if req_params.get('equan', False) else '3.6.1添加券接口中选择的券类型为扫码券,与当前设置不符合'
|
|
|
|
else:
|
|
|
|
quan = '请检查3.6.1添加券接口'
|
|
|
|
goods_cash = cash_from_yushouquan['balance']
|
|
|
|
return True, goods_field, goods_cash, quan, _timestamp_yushouquan
|
|
|
|
else:
|
|
|
|
pass
|
|
|
|
return True, goods_field, str(goods_cash), quan, _timestamp
|
|
|
|
|
|
|
|
|
|
|
|
# 将接口获取的卖品数据转化成请求参数格式
|
|
|
|
def general_goods_field_member(_goods_data, _data):
|
|
|
|
# 获取会员价
|
|
|
|
redis_key_prefix = f'dspt_api_{_data["ip"]}_{_data["env"]}_{_data["member_type"]}_{_data["pid"]}_{_data["cid"]}'
|
|
|
|
request_api_get_goods_price = {'name': '3.3.2 获取卖品折扣信息', 'path': 'card/get-goods-price'}
|
|
|
|
redis_key_api_get_goods_price = f'{redis_key_prefix}_{request_api_get_goods_price["path"]}'
|
|
|
|
result, _format, _goods_price, _timestamp = get_data_from_redis(redis_key_api_get_goods_price, True)
|
|
|
|
params = []
|
|
|
|
total_cash = 0
|
|
|
|
for g in _goods_data:
|
|
|
|
_num = g.get('buy_num', 1)
|
|
|
|
price = f2(g['counterPrice'] if g['cardDiscountType'] == "1" else g['onlinePrice'])
|
|
|
|
if result:
|
|
|
|
for gp in _goods_price:
|
|
|
|
if gp['id'] == str(g['id']):
|
|
|
|
price = f2(gp['discountPrice'])
|
|
|
|
info = {
|
|
|
|
'id': g['id'],
|
|
|
|
'type': g['type'],
|
|
|
|
'price': price,
|
|
|
|
'num': _num
|
|
|
|
}
|
|
|
|
if g['type'] == 'package' and g['packageType'] == '2':
|
|
|
|
add_price = f2(0)
|
|
|
|
optional_package = []
|
|
|
|
for key, val in g['user_select'].items():
|
|
|
|
member = []
|
|
|
|
member_id = []
|
|
|
|
for m in val['data']:
|
|
|
|
if m['id'] in member_id:
|
|
|
|
for item in member:
|
|
|
|
if item['id'] == m['id']:
|
|
|
|
item['num'] = item['num'] + 1
|
|
|
|
add_price += f2(m['addPrice'])
|
|
|
|
else:
|
|
|
|
member.append({'id': m['id'], 'num': 1, 'add_price': m['addPrice']})
|
|
|
|
member_id.append(m['id'])
|
|
|
|
add_price += f2(m['addPrice'])
|
|
|
|
optional_package.append({'index': key, 'members': member})
|
|
|
|
info['optional_package'] = optional_package
|
|
|
|
info['price'] += add_price
|
|
|
|
total_cash = f2(total_cash) + f2(info['price']*info['num'])
|
|
|
|
params.append(info)
|
|
|
|
|
|
|
|
print('general_goods_param---------params', params)
|
|
|
|
return params, total_cash
|
|
|
|
|
|
|
|
|
|
|
|
def general_goods_params_member(data, pay_type, card, ticket_cash=f2(0)):
|
|
|
|
# 返回值 result, goods_field, goods_card_balance_pay, goods_cash, cash, timestamp
|
|
|
|
goods_card_balance_pay = 0
|
|
|
|
goods_cash = 0
|
|
|
|
third_pay = f2(ticket_cash)
|
|
|
|
quan_num = int(pay_type['goods_quan']['goods_quan_num'])
|
|
|
|
quan_val = f2(pay_type['goods_quan']['goods_quan_value'])
|
|
|
|
quan_type = pay_type['goods_quan']['goods_quan_type']
|
|
|
|
|
|
|
|
# 获取卡类型
|
|
|
|
card_type = get_card_type(data["env"], data["pid"], data["cid"], card)
|
|
|
|
if card_type is False:
|
|
|
|
return_str = '此会员卡在该影院无法使用,请使用3.1.3 查询会员卡的详细信息接口查看卡信息'
|
|
|
|
return False, return_str, return_str, return_str, third_pay, int(time.time() * 1000)
|
|
|
|
|
|
|
|
# 券信息
|
|
|
|
quan = ''
|
|
|
|
# redis_key 前缀
|
|
|
|
redis_key_prefix = f'dspt_api_{data["ip"]}_{data["env"]}_{data["member_type"]}_{data["pid"]}_{data["cid"]}'
|
|
|
|
# 获取卖品数据
|
|
|
|
request_api = {'name': '3.2.1 获取卖品列表', 'path': 'cinema/goods'}
|
|
|
|
redis_key_api = f'{redis_key_prefix}_{request_api["path"]}'
|
|
|
|
result, _format, goods_data, _timestamp = get_data_from_redis(redis_key_api)
|
|
|
|
if result is False:
|
|
|
|
return False, None, None, None, third_pay, int(time.time() * 1000)
|
|
|
|
|
|
|
|
goods_field_list, total_goods_val = general_goods_field_member(goods_data, data)
|
|
|
|
|
|
|
|
if pay_type['select_price_type'] == 'cinema_price':
|
|
|
|
goods_card_balance_pay = str(total_goods_val)
|
|
|
|
if card_type == '权益卡(积分卡)':
|
|
|
|
third_pay += total_goods_val
|
|
|
|
return True, change_goods_price_str(goods_field_list), goods_card_balance_pay, goods_cash, third_pay, _timestamp
|
|
|
|
if pay_type['select_price_type'] == 'third_price':
|
|
|
|
if pay_type['goods_quan_check'] is False:
|
|
|
|
goods_card_balance_pay = str(total_goods_val)
|
|
|
|
if card_type == '权益卡(积分卡)':
|
|
|
|
third_pay += total_goods_val
|
|
|
|
return True, change_goods_price_str(
|
|
|
|
goods_field_list), goods_card_balance_pay, goods_cash, third_pay, _timestamp
|
|
|
|
else:
|
|
|
|
quan_per_goods_list = quan_num_pre_goods(int(pay_type['goods_quan']['goods_quan_num']),
|
|
|
|
len(goods_field_list))
|
|
|
|
if quan_type == '兑换券':
|
|
|
|
total_goods_pay = 0
|
|
|
|
for i, goods in enumerate(goods_field_list):
|
|
|
|
goods['coupons'] = []
|
|
|
|
for n in range(quan_per_goods_list[i]):
|
|
|
|
goods['coupons'].append(
|
|
|
|
{'name': 'Rog卖品接口兑换券', 'code': f'rog{str(time.time_ns())}{goods["id"]}',
|
|
|
|
'show_price': 0, 'sell_price': 0, 'coupon_type': 1})
|
|
|
|
if n == 0:
|
|
|
|
goods['price'] = f2(pay_type['goods_quan']['goods_quan_value'])
|
|
|
|
else:
|
|
|
|
goods['price'] += f2(pay_type['goods_quan']['goods_quan_value'])
|
|
|
|
total_goods_pay += goods['price']
|
|
|
|
goods_card_balance_pay = str(total_goods_pay)
|
|
|
|
if card_type == '权益卡(积分卡)':
|
|
|
|
third_pay += total_goods_pay
|
|
|
|
return True, change_goods_price_str(
|
|
|
|
goods_field_list), goods_card_balance_pay, goods_cash, third_pay, _timestamp
|
|
|
|
if quan_type == '代金券':
|
|
|
|
total_quan_val = quan_val * quan_num
|
|
|
|
remain_quan_val = total_quan_val
|
|
|
|
total_goods_pay = 0
|
|
|
|
for i, goods in enumerate(goods_field_list):
|
|
|
|
if i + 1 < len(goods_field_list):
|
|
|
|
goods_val = f2(f2(goods['price']) - remain_quan_val)
|
|
|
|
goods['price'] = goods_val if goods_val > 0 else 0
|
|
|
|
total_goods_pay += goods['price']
|
|
|
|
else:
|
|
|
|
quan_val = f2((f2(goods['price']) / total_goods_val) * total_quan_val)
|
|
|
|
remain_quan_val -= quan_val
|
|
|
|
goods_val = f2(f2(goods['price']) - quan_val)
|
|
|
|
goods['price'] = goods_val if goods_val > 0 else 0
|
|
|
|
total_goods_pay += goods['price']
|
|
|
|
goods_card_balance_pay = str(total_goods_pay)
|
|
|
|
if card_type == '权益卡(积分卡)':
|
|
|
|
third_pay += total_goods_pay
|
|
|
|
return True, change_goods_price_str(
|
|
|
|
goods_field_list), goods_card_balance_pay, goods_cash, third_pay, _timestamp
|
|
|
|
if quan_type == '抵值兑换券':
|
|
|
|
total_goods_pay = 0
|
|
|
|
total_quan_pay = 0
|
|
|
|
for i, goods in enumerate(goods_field_list):
|
|
|
|
if quan_per_goods_list[i] == 0:
|
|
|
|
total_goods_pay += f2(goods['price'])
|
|
|
|
else:
|
|
|
|
goods['coupons'] = []
|
|
|
|
for n in range(quan_per_goods_list[i]):
|
|
|
|
goods['coupons'].append(
|
|
|
|
{'name': 'Rog卖品接口抵值兑换券', 'code': f'rog{str(time.time_ns())}{goods["id"]}',
|
|
|
|
'show_price': str(quan_val), 'sell_price': str(quan_val), 'coupon_type': 3})
|
|
|
|
if n == 0:
|
|
|
|
goods['price'] = f2(quan_val)
|
|
|
|
else:
|
|
|
|
goods['price'] += f2(quan_val)
|
|
|
|
total_quan_pay += goods['price']
|
|
|
|
goods_card_balance_pay = str(total_goods_pay)
|
|
|
|
goods_cash = str(total_quan_pay)
|
|
|
|
if card_type == '权益卡(积分卡)':
|
|
|
|
third_pay += total_goods_pay
|
|
|
|
return True, change_goods_price_str(
|
|
|
|
goods_field_list), goods_card_balance_pay, goods_cash, third_pay, _timestamp
|
|
|
|
return False, None, None, None, third_pay, int(time.time() * 1000)
|
|
|
|
|
|
|
|
|
|
|
|
def quan_num_pre_goods(quan_total_num, goods_num):
|
|
|
|
quan_average_num = int(quan_total_num / goods_num) # 计算个卖品平均用几张券
|
|
|
|
result = [quan_average_num] * goods_num # 生成每个卖品的用券数量列表
|
|
|
|
for i in range(quan_total_num % goods_num): # 用券与卖品的余数作为范围,为卖品添加券
|
|
|
|
result[i] += 1
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
def change_goods_price_str(goods_list):
|
|
|
|
for goods in goods_list:
|
|
|
|
goods['price'] = str(goods['price'])
|
|
|
|
return goods_list
|