kboss/b/bz_order/affirmbz_order.dspy
2025-07-16 14:27:17 +08:00

158 lines
8.5 KiB
Plaintext

async def cal_expire_time(chargeduration=None, unit=None):
chargeduration = int(chargeduration)
# 当前时间
now = datetime.datetime.now()
if unit == 'day':
expire_time = now + dateutil.relativedelta.relativedelta(days=chargeduration)
elif unit == 'week':
expire_time = now + dateutil.relativedelta.relativedelta(weeks=chargeduration)
elif unit == 'month':
expire_time = now + dateutil.relativedelta.relativedelta(months=chargeduration)
elif unit == 'quarter':
expire_time = now + dateutil.relativedelta.relativedelta(months=chargeduration * 3)
elif unit == 'year':
expire_time = now + dateutil.relativedelta.relativedelta(years=chargeduration)
else:
expire_time = None
if expire_time:
return str(expire_time)
else:
return None
async def affirmbz_order(ns):
"""确认支付"""
db = DBPools()
async with db.sqlorContext('kboss') as sor:
if ns:
# 查询产品说明是否是product_sync
order_productid_providerid = await sor.R('order_goods', {'orderid': ns['orderid']})
order_productid = order_productid_providerid[0]['productid']
order_providerid = order_productid_providerid[0]['providerid']
description_li = await sor.R('product', {'id': order_productid})
description = description_li[0]['description'] if description_li else []
classify_li = await sor.R('product', {'id': order_productid})
classify = classify_li[0]['classify'] if classify_li else ''
if description == 'product_sync':
# 根据orderid在order_goods里查询对应账单
# order_providerid = (await sor.R('order_goods', {'orderid': ns['orderid']}))[0]['providerid']
# 查询阿里云得id
ali_id_li = await sor.R('organization', {'orgname': '阿里云'})
if ali_id_li:
ali_id = ali_id_li[0]['id']
else:
ali_id = None
# 查询开元云得id
k_id_li = await sor.R('organization', {'orgname': '开元云'})
if k_id_li:
k_id = k_id_li[0]['id']
else:
k_id = None
target_id = None
if order_providerid == ali_id:
target_id = ali_id
if order_providerid == k_id:
target_id = k_id
if target_id:
# 查询业主机构针对所有客户的普通协议
protocolid = (await sor.R('saleprotocol', {'offer_orgid': 'mIWUHBeeDM8mwAFPIQ8pS', 'bid_orgid': '*', 'salemode': '2', 'del_flg': '0'}))[0]['id']
# 在产品价格表中更新价格配置
id_sql = """select id, price from product_salemode where protocolid = '%s' and providerid = '%s' and productid = '%s' order by price desc limit 1;""" % (protocolid, target_id, order_productid)
id_find = (await sor.sqlExe(id_sql, {}))[0]['id']
# 查询价格
current_price = (await sor.R('bz_order', {'id': ns['orderid']}))[0]['amount']
await sor.U('product_salemode', {'id': id_find, 'price': current_price})
orgid = await sor.R('bz_order', {'id': ns['orderid']})
date = await get_business_date(sor=None)
await sor.U('bz_order',{'id':ns['orderid'],'order_date': date})
count = await getCustomerBalance(sor, orgid[0]['customerid'])
if count == None:
count = 0
if count - float(orgid[0]['amount']) < 0:
pricedifference = count - round(orgid[0]['amount'],2)
return {'status': False, 'msg': '账户余额不足','pricedifference': round(pricedifference,2)}
await order2bill(ns['orderid'], sor)
bills = await sor.R('bill', {'orderid': ns['orderid'], 'del_flg': '0'})
try:
# 需要加事务
for i in bills:
ba = BillAccounting(i)
r = await ba.accounting(sor)
dates = datetime.datetime.now()
await sor.U('bz_order', {'id': ns['orderid'], 'order_status': '1','create_at':dates})
await sor.U('bill', {'id': ns['orderid'], 'bill_state': '1'})
order_goods = await sor.R('order_goods', {'orderid': ns['orderid']})
for j in order_goods:
# 计算过期时间
chargeduration = j.get('chargeduration')
unit = j.get('unit')
if chargeduration and unit:
expire_time = await cal_expire_time(chargeduration=chargeduration, unit=unit)
else:
expire_time = None
product = await sor.R('product', {'id': j['productid']})
nss = {}
nss['id'] = uuid()
# nss['id'] = UUID()
nss['providerrid'] = product[0]['providerid']
nss['productname'] = product[0]['name']
nss['productdesc'] = product[0]['description']
nss['customerid'] = orgid[0]['customerid']
nss['productid'] = product[0]['id']
nss['specdataid'] = j['spec_id']
nss['orderid'] = orgid[0]['id']
nss['start_date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if expire_time:
nss['expire_date'] = expire_time
if ns.get('product_url'):
nss['product_url'] = ns.get('product_url')
await sor.C('customer_goods', nss)
v = {}
v['orderid'] = orgid[0]['id']
v['customerid'] = orgid[0]['customerid']
v['providerid'] = product[0]['providerid']
v['productid'] = product[0]['id']
v['quantity'] = j['quantity']
await path_call('../pub/hpc_save_bill.dspy', v)
# k8s产品 支付成功后创建实例
if classify == 'E':
spec = json.loads(product[0]['spec_note']) if isinstance(product[0]['spec_note'], str) else product[0]['spec_note']
# 映射表,用于将中文字段名转换为英文
mapping = {
"CPU": "cpu",
"内存": "memory",
"存储": "storage",
"GPU": "gpu",
"显存": "gpumem"
}
# 转换成目标格式的字典
k8s_pod_create_ns = {mapping[item["configName"]]: int(item["value"]) for item in spec}
k8s_pod_create_ns['orgid'] = orgid[0]['customerid']
k8s_pod_create_ns['image'] = 'ubuntu'
k8s_pod_create_ns['productid'] = product[0]['id']
k8s_pod_create_ns['productname'] = product[0]['name']
k8s_pod_create_ns['customer_goods_id'] = nss['id']
ks8_result = await path_call('../pub/user_create_pod.dspy', k8s_pod_create_ns)
if ks8_result['status']:
return {
'status': True,
'msg': '实例创建成功, 支付操作成功'
}
else:
await sor.rollback()
print('k8s实例创建失败, 回滚支付操作')
return {
'status': False,
'msg': '实例创建失败, 回滚支付操作'
}
return {'status': True, 'msg': '支付成功'}
except Exception as error:
raise error
else:
return {'status': False, 'msg': '参数错误'}
return {'status': False, 'msg': '支付失败'}
ret = await affirmbz_order(params_kw)
return ret