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

836 lines
38 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

async def get_discount_or_price(ns={}):
# ns = {
# 'orgname': '北京首都在线科技股份有限公司',
# 'productname': '云硬盘',
# 'user_orgid': 'gKG8UaYPjA_29K7puzaTM'
# }
db = DBPools()
async with db.sqlorContext('kboss') as sor:
try:
# 查找供应商id
providerid_li = await sor.R('organization', {'orgname': ns.get('orgname'), 'del_flg': '0'})
if providerid_li:
providerid = providerid_li[0]['id']
provider_parentid = providerid_li[0]['parentid']
else:
return {
'status': False,
'msg': '没有找到指定名字的供应商'
}
# 查找产品id
productid_li = await sor.R('product', {'providerid': providerid, 'name': ns.get('productname')})
if productid_li:
productid = productid_li[0]['id']
else:
return {
'status': False,
'msg': '没有找到provider: %s对应的产品' % providerid
}
# 查找用户id, orgid, parentid
if ns.get('user_orgid'):
user_orgid = ns.get('user_orgid')
else:
user_orgid = (await sor.R('users', {'id': await get_user(), 'del_flg': '0'}))[0]['orgid']
user_parentid_li = await sor.R('organization', {'id': user_orgid, 'del_flg': '0'})
if user_parentid_li:
user_parentid = user_parentid_li[0]['parentid']
else:
return {
'status': False,
'msg': '没有找到对应用户的机构'
}
# 查找供应商和所属机构得协议
init_protocol_li = await sor.R('saleprotocol', {'offer_orgid': providerid, 'bid_orgid': provider_parentid, 'del_flg': '0'})
if init_protocol_li:
init_protocol = init_protocol_li[0]['salemode']
init_protocolid = init_protocol_li[0]['id']
origin_zi_search_li = await sor.R('product_salemode',
{'protocolid': init_protocolid, 'providerid': providerid, 'productid': productid, 'del_flg': '0'})
if init_protocol == '2':
origin_price = origin_zi_search_li[0]['price']
else:
origin_price = origin_zi_search_li[0]['discount']
else:
return {
'status': False,
'msg': '没有找到供应商: %s和用户所在机构: %s的协议' % (providerid, user_parentid)
}
if init_protocol == '2':
real_price = 1000000000000.0
person_price_sql = """select * from saleprotocol where offer_orgid = '%s' and bid_orgid = '%s' and
salemode = '2' and del_flg = '0' and CURRENT_DATE <= end_date and
CURRENT_DATE >= start_date""" % (user_parentid, user_orgid)
tongyi_price_sql = """select * from saleprotocol where offer_orgid = '%s' and bid_orgid = '*' and
salemode = '2' and del_flg = '0' and CURRENT_DATE <= end_date and
CURRENT_DATE >= start_date""" % user_parentid
for sql_detail in [person_price_sql, tongyi_price_sql]:
person_price_li = await sor.sqlExe(sql_detail, {})
for person_price in person_price_li:
protocolid = person_price['id']
xieyi_zi_search_li = await sor.R('product_salemode', {'protocolid': protocolid, 'providerid': providerid, 'del_flg': '0'})
for xieyi_zi in xieyi_zi_search_li:
provider_zi_id = xieyi_zi['providerid']
zi_price = xieyi_zi['price']
zi_productid = xieyi_zi['productid']
if provider_zi_id == providerid and zi_productid == productid:
# 判断产品是否存在 有可能在产品表已经删除
prd_res_exists_li = await sor.R('product', {'id': xieyi_zi['productid'], 'del_flg': '0'})
if not prd_res_exists_li:
continue
real_price = float(zi_price)
break
if real_price != 1000000000000.0:
break
if real_price == 1000000000000.0:
return {'status': False, 'msg': '没有找到产品价格'}
else:
return {'status': True, 'price': real_price, 'productid': productid, 'origin_price': origin_price}
# 如果签属的协议是折扣
if init_protocol == '0':
# 查找对应的产品id
if ns.get('prefix'):
productid_li = await sor.R('product', {'providerid': ns.get('providerid'), 'providerpid': ns.get('prefix') + '_' + ns.get('servicetype'), 'del_flg': '0'})
if productid_li:
productid_soure = productid_li[0]['id']
else:
return {'discount': 1.0}
else:
productid_soure = ns.get('productid')
real_discount = 1.0
person_discount_sql = """select * from saleprotocol where offer_orgid = '%s' and bid_orgid = '%s' and
salemode = '0' and del_flg = '0' and CURRENT_DATE <= end_date and
CURRENT_DATE >= start_date""" % (user_parentid, user_orgid)
tongyi_discount_sql = """select * from saleprotocol where offer_orgid = '%s' and bid_orgid = '*' and
salemode = '0' and del_flg = '0' and CURRENT_DATE <= end_date and
CURRENT_DATE >= start_date""" % user_parentid
# 没有个人配置 获取产品统一配置折扣
for sql_detail in [person_discount_sql, tongyi_discount_sql]:
person_discount_li = await sor.sqlExe(sql_detail, {})
for person_discount in person_discount_li:
protocolid = person_discount['id']
xieyi_zi_search_li = await sor.R('product_salemode', {'protocolid': protocolid, 'del_flg': '0'})
for xieyi_zi in xieyi_zi_search_li:
provider_zi_id = xieyi_zi['providerid']
zi_discount = xieyi_zi['discount']
zi_productid = xieyi_zi['productid']
if provider_zi_id == ns.get('providerid') and zi_productid == productid_soure:
# 判断产品是否存在 有可能在产品表已经删除
prd_res_exists_li = await sor.R('product', {'id': xieyi_zi['productid'], 'del_flg': '0'})
if not prd_res_exists_li:
continue
real_discount = float(zi_discount)
break
if real_discount != 1.0:
break
return {'status': True, 'discount': real_discount, 'productid': productid, 'origin_discount': origin_price}
if init_protocol == '2':
pass
except Exception as e:
return {'status': False, 'discount_price': 1.0, 'error_msg': str(e)}
async def get_eip_price(ns={}):
'''
获取弹性ip价格
:return:
'''
# ns = {
# 'user_orgid': 'gKG8UaYPjA_29K7puzaTM',
# "duration": "1",
# # "isMounth": "1",
# # "size": "1",
# # "siteId": "e5aa47be-da46-11ec-bad2-defff767b3b5",
# # "bandwidthConfIdStr": "10289",
# "qos": "2",
# # "isToMonth": "0",
# # "requestId": "6bca6bbd-xxxx-4xxx-xxxx-xxxxxxxxxxx1"
# }
import aiohttp
CCS_URL = 'http://cdsapi.capitalonline.net/gcw'
action = "GetEipPrice"
method = "GET"
param = {
"duration": ns.get('duration'),
"isMounth": ns.get('isMounth'),
"size": ns.get('size'),
"siteId": ns.get('siteId'),
"bandwidthConfIdStr": ns.get('bandwidthConfIdStr'),
"qos": ns.get('qos'),
"isToMonth": ns.get('isToMonth'),
"requestId": "6bca6bbd-1000-4x10-4xx1-1xxxxxxxxxx1"
}
nss = {
'orgname': '北京首都在线科技股份有限公司',
'user_orgid': ns.get('user_orgid'),
'productname': '宽带'
}
bandwidth_price_dic = await get_discount_or_price(nss)
if bandwidth_price_dic['status']:
bandwidth_price = float(bandwidth_price_dic['price']) * int(ns.get('duration')) * int(ns.get('qos'))
bandwidth_productid = bandwidth_price_dic.get('productid')
else:
return {
'status': False,
'msg': '无法获取配置的宽带价格 %s' % bandwidth_price_dic.get('msg')
}
nss['productname'] = '弹性IP'
eip_price_dic = await get_discount_or_price(nss)
if eip_price_dic['status']:
eip_price = float(eip_price_dic['price']) * int(ns.get('duration'))
eip_productid = eip_price_dic.get('productid')
else:
return {
'status': False,
'msg': '无法获取配置的弹性IP价格 %s' % eip_price_dic.get('msg')
}
if eip_price < 10:
price_unit = '/天'
else:
price_unit = "/%s个月" % ns.get('duration')
return {
"status": True,
"data": {
"bandwidth_price": {
"config_name": "bandwidth",
"cycle": price_unit,
"end_time": "",
"peak_qos_list": "[]",
"price": bandwidth_price,
"sale_price_unit": float(bandwidth_price_dic['price']),
"price_str": "%s" % bandwidth_price,
"sign": "¥",
"productid": bandwidth_productid,
'orgin': bandwidth_price_dic['origin_price']
},
"eip_price": {
"config_name": "eip",
"cycle": price_unit,
"end_time": "",
"peak_qos_list": "",
"price": eip_price,
"sale_price_unit": float(eip_price_dic['price']),
"price_str": "%s" % eip_price,
"sign": "¥",
"productid": eip_productid,
'orgin': eip_price_dic['origin_price']
},
"total_price": {
"cycle": price_unit,
"end_time": "",
"peak_qos_list": "",
"price": bandwidth_price + eip_price,
"price_str": "%s" % (bandwidth_price + eip_price),
"sign": "¥"
}
},
"msg": ""
}
# url = get_signature(action, method, CCS_URL, param=param)
# async with aiohttp.ClientSession() as session:
# async with session.request(method, url) as response:
# resp = await response.text()
# result = json.loads(resp)
# if result['Code'] == 'Success':
# result['status'] = True
# result.pop('Code')
# result['data'] = result.pop('Data')
# result['msg'] = result.pop('Message')
# else:
# result['status'] = False
# result['msg'] = result.pop('Message')
# return result
async def get_ecs_price(ns={}):
# ns = {
# 'user_orgid': 'gKG8UaYPjA_29K7puzaTM', # new
# # 'user_orgid': 'Oz80lKmjotfWYsMILloMb', # new
# "IsToMonth": 0,
# "AvailableZoneCode": "CN_Qingyang_A",
# "EcsFamilyName": "推理型智算云主机igch.c8.nr4",
# "Cpu": 16,
# "Ram": 64,
# "Gpu": 1,
# # "EcsFamilyName": "CPU计算型C8",
# # "Cpu": 4,
# # "Ram": 8,
# # "Gpu": 0,
#
# "BillingMethod": "1",
# "Duration": 2,
# "SystemDiskInfo": {
# "DiskFeature": "ssd",
# "Size": 40
# },
# "Number": 1,
# "DataDiskInfo": [
# {
# "DiskFeature": "ssd",
# "Size": 24
# },
# {
# "DiskFeature": "ssd",
# "Size": 32
# }
# ]
# }
import aiohttp
"""
获取云服务器价格
"""
ecs_url = 'http://api.capitalonline.net/ecs/v1'
action = "DescribePrice"
method = "POST"
param = {}
if ns.get('IsToMonth') == 0 or ns.get('IsToMonth') == '0':
istomonth = 0
else:
istomonth = 1
if ns.get('BillingMethod') == 0 or ns.get('BillingMethod') == '0':
time_unit = '天'
else:
time_unit = '个月'
systemdiskinfo = ns.get('SystemDiskInfo')
if isinstance(systemdiskinfo, str):
systemdiskinfo = json.loads(systemdiskinfo)
datadiskinfo = ns.get('DataDiskInfo')
if datadiskinfo:
if isinstance(datadiskinfo, str):
datadiskinfo = json.loads(datadiskinfo)
db = DBPools()
async with db.sqlorContext('kboss') as sor:
# 查找供应商id
providerid_li = await sor.R('organization', {'orgname': '北京首都在线科技股份有限公司', 'del_flg': '0'})
if providerid_li:
providerid = providerid_li[0]['id']
provider_parentid = providerid_li[0]['parentid']
else:
return {
'status': False,
'msg': '没有找到指定名字的供应商'
}
exist_prducts = await sor.R('product', {'providerid': providerid, 'name': ns['EcsFamilyName'], 'del_flg': '0'})
if exist_prducts:
productid = None
for exist_prduct in exist_prducts:
spec_notes = json.loads(exist_prduct['spec_note'])
spec_dic = {}
for note in spec_notes:
spec_dic.update({note['configName']: note['value']})
if str(ns['Cpu']) == spec_dic['CPU'] and str(ns['Ram']) == spec_dic['内存']:
productid = exist_prduct['id']
nss = {
'orgname': '北京首都在线科技股份有限公司',
'user_orgid': ns.get('user_orgid'),
'productname': ns['EcsFamilyName']
}
ecs_price_dic = await get_discount_or_price(nss)
if ecs_price_dic['status']:
ecs_productid = ecs_price_dic['productid']
ecs_price = float(ecs_price_dic['price']) * int(ns.get('Duration'))
else:
return {
'status': False,
'msg': '无法获取配置的ecs价格 %s' % ecs_price_dic.get('msg')
}
nss['productname'] = '云硬盘'
disk_price_dic = await get_discount_or_price(nss)
print('disk_price_dic', disk_price_dic)
if disk_price_dic['status']:
disk_productid = disk_price_dic['productid']
disk_price = float(disk_price_dic['price']) * int(ns.get('Duration'))
else:
return {
'status': False,
'msg': '无法获取配置的云硬盘价格 %s' % disk_price_dic.get('msg')
}
datadisk_total = sum([int(datadisk['Size']) for datadisk in datadiskinfo])
disk_total = int(systemdiskinfo['Size']) + int(datadisk_total)
return {
"RequestId": "7eedccd5-4c14-43a9-9afb-ef3a66dc1af0",
"status": True,
"data": {
"PriceUnit": "%s%s" % (ns.get('Duration'), time_unit),
"PriceSymbol": "¥",
"TotalPrice": float(ecs_price) + (float(disk_price) * disk_total),
"EcsPrice": ecs_price,
'price_detail': [
{
'config_name': 'disk',
'productid': disk_productid,
'price': float(disk_price) * disk_total,
'orgin': disk_price_dic['origin_price'],
'sale_price_unit': float(disk_price_dic['price'])
},
{
'config_name': 'ecs',
'productid': ecs_productid,
'price': ecs_price,
'orgin': ecs_price_dic['origin_price'],
'sale_price_unit': float(ecs_price_dic['price'])
}
]
},
"msg": "获取计费信息成功!"
}
# else:
# return {
# 'status': False,
# 'msg': '有产品名称, 没有对应配置'
# }
# else:
# return {
# 'status': False,
# 'msg': '没有找到对应产品'
# }
body = {
"AvailableZoneCode": ns.get("AvailableZoneCode"),
"EcsFamilyName": ns.get("EcsFamilyName") or '',
"Cpu": int(ns.get("Cpu")),
"Ram": int(ns.get("Ram")),
"Gpu": int(ns.get("Gpu")) if ns.get("Gpu") else 0,
"BillingMethod": ns.get('BillingMethod'),
"Duration": int(ns.get("Duration")) if ns.get("Duration") else 1,
"IsToMonth": istomonth,
"SystemDiskInfo": systemdiskinfo,
"Number": int(ns.get("Number")) if ns.get("Number") else 1,
"DataDiskInfo": datadiskinfo if datadiskinfo else [],
}
url = get_signature(action, method, ecs_url, param)
async with aiohttp.ClientSession() as session:
async with session.request(method, url, json=body) as response:
resp = await response.text()
result = json.loads(resp)
if 'Message' in result.keys():
key_word = 'Message'
else:
key_word = 'Msg'
if result['Code'] == 'Success':
result['status'] = True
result.pop('Code')
result['data'] = result.pop('Data')
result['msg'] = result.pop(key_word)
else:
result['status'] = False
result['msg'] = result.pop(key_word)
return result
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={}):
"""确认支付"""
sor = ns['sor']
# history_price = None
# target_protocol_id = None
# # 查询产品说明是否是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 = (await sor.R('product', {'id': order_productid}))[0]['description']
# if ns['providername'] == '北京首都在线科技股份有限公司':
# target_id = ns['providerid']
# 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']
# target_protocol_id = id_find
# history_price = (await sor.sqlExe(id_sql, {}))[0]['price']
# # 查询价格
# 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': time.strftime('%Y-%m-%d %H:%M:%S')})
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']})
if len(product[0]['name']) < 6:
continue
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)
# await sor.U('product_salemode', {'id': target_protocol_id, 'price': history_price})
return {'status': True, 'msg': '支付成功'}
except Exception as error:
raise error
async def addbz_order(ns={}):
"""
生成订单 立即下单
userid : 用户id
`goods`'产品id',
`spec_id` '规格id',
`quantity`'数量',
`transname` '交易名称',
`providerid` '供应商id',
`order_status` '0:未支付1:已交付2:已关闭3:已取消4:后付费',
"""
sor = ns['sor']
chargeduration = ns['chargeduration']
unit = ns['unit']
orderid = ns.get('orderid')
total_amount = ns.get('total_amount')
try:
user = await sor.R('users', {'id': await get_user()})
orgid = await sor.R('organization', {'id': user[0]['orgid']})
amountadll = 0
if not orderid:
bz_ns = {}
# bz_ns['id'] = UUID()
bz_ns['id'] = uuid()
orderid = bz_ns['id']
bz_ns['order_status'] = '0'
bz_ns['business_op'] = 'BUY'
bz_ns['userid'] = await get_user()
bz_ns['customerid'] = orgid[0]['id']
bz_ns['order_date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if ns.get('specdataid'):
bz_ns['specdataid'] = ns['specdataid']
await sor.C('bz_order', bz_ns)
# 添加账户表
nss = {}
nss['id'] = uuid()
# nss['id'] = UUID()
nss['orderid'] = orderid
nss['productid'] = ns.get('productid')
nss['providerid'] = ns.get('providerid')
nss['list_price'] = ns.get('list_price')
nss['discount'] = ns.get('discount')
nss['quantity'] = ns.get('quantity')
nss['price'] = ns.get('price')
nss['spec_id'] = ns.get('spec_id')
nss['unit'] = unit
nss['chargeduration'] = chargeduration
# if int(ns.get('quantity')) > 1:
# nss['amount'] = float(ns['amount']) * int(ns['quantity'])
# amountadll += nss['amount']
# else:
nss['amount'] = ns['amount']
amountadll += float(nss['amount'])
print('amountadll', amountadll)
await sor.C('order_goods', nss)
await sor.U('bz_order', {'id': orderid, 'amount': total_amount})
return {'status': True, 'msg': '添加成功', 'bz_id': orderid}
except Exception as error:
raise error
async def create_ecs(ns={}):
"""
创建云服务器
没有传递测试账号返回 'Code': 'Success', 'Msg': '下发创建云服务器任务:账户余额不足,账户余额=[0.00] 当前订单金额=[1.33]'
传递测试账号返回 CN_Hohhot_B {'Code': 'OrderError', 'Msg': '下发创建云服务器任务:测试项目不能在此站点使用!', 'Data': {}, 'RequestId': 'd8cf83c0-ac81-4735-8174-f9dc8a9ae113'
传递测试账号返回 CN_Qingyang_A {'Code': 'Success', 'Msg': '创建云服务器任务下发成功!', 'Data': {'EventId': 'd803af66-4028-11ef-bc71-928234ad6a6f', 'EcsIdSet': ['ins-jpyk8i1trba4nvp5']}, 'RequestId': '750f7bab-e1a0-48dc-afb2-cb3aa5be71b9'}
BillingMethod: 1 包年包月
{'Code': 'MaxEcsCountExceed', 'Msg': '当前类型云服务器最多可创建0台', 'Data': {}, 'RequestId': '98cdc84c-9a7c-40e9-a315-0e51ebdafead'}
{'RequestId': 'c06f6cdb-8287-4a4a-9230-4ddfe306b845', 'status': True, 'data': {'EventId': 'c8c0e80e-87ec-4293-8fd5-b77adb5e1f01', 'EcsIdSet': ['ins-vom49t1t6hox8bvh']}, 'msg': '创建云服务器任务下发成功!'}
"""
ns['DataDisk'] = ns['DataDisk'] if ns.get('DataDisk') else []
import aiohttp
server_name = ns.get('Name') if ns.get('Name') else time.strftime('%Y%m%d%H%M%S')
ns['Name'] = ns['user_orgid'] + '0_____0' + server_name
ecs_url = 'http://api.capitalonline.net/ecs/v1'
action = "CreateInstance"
method = "POST"
param = {}
body = {
"AvailableZoneCode": ns.get('AvailableZoneCode'),
"EcsFamilyName": ns.get('EcsFamilyName'),
"Cpu": ns['Cpu'],
"Ram": ns['Ram'],
"Gpu": ns['Gpu'],
"Number": ns['Number'],
"BillingMethod": str(ns['BillingMethod']) if str(ns.get('BillingMethod')) == '1' else '0',
"ImageId": ns.get('ImageId'),
"SystemDisk": json.loads(ns['SystemDisk']) if isinstance(ns['SystemDisk'], str) else ns['SystemDisk'],
"DataDisk": json.loads(ns['DataDisk']) if isinstance(ns['DataDisk'], str) else ns['DataDisk'],
"VpcInfo": json.loads(ns['VpcInfo']) if isinstance(ns['VpcInfo'], str) else ns['VpcInfo'],
"SubnetInfo": json.loads(ns['SubnetInfo']) if isinstance(ns['SubnetInfo'], str) else ns['SubnetInfo'],
"PubnetInfo": json.loads(ns['PubnetInfo']) if isinstance(ns.get('PubnetInfo'), str) else ns.get('PubnetInfo'),
"SecurityGroups": json.loads(ns['SecurityGroups']) if isinstance(ns['SecurityGroups'], str) else ns['SecurityGroups'],
"Name": ns.get('Name'),
"StartNumber": ns.get('StartNumber') if ns.get('StartNumber') else 1,
"Password": ns.get('Password'),
"Duration": ns['Duration'],
"IsToMonth": ns['IsToMonth'] if str(ns.get('IsToMonth')) == '1' else 0,
"IsAutoRenewal": ns['IsAutoRenewal'] if str(ns.get('IsAutoRenewal')) == '1' else 0
# "TestAccount": '按需调度接口开关机测试'
}
systemdisk = int(body['SystemDisk']['Size'])
datadisk = sum([int(i['Size']) for i in body['DataDisk']]) if body.get('DataDisk') else 0
disksize = systemdisk + datadisk
qos_num = body['PubnetInfo'][0]['Qos'] if body['PubnetInfo'] else 0
# 如果不是指定的服务器 联系售后创建
# if str(ns.get('Cpu')) != '16' or str(ns.get('Ram')) != '64' or ns.get('EcsFamilyName') != '推理型智算云主机igch.c8.nr4':
# return {
# 'status': False,
# 'msg': '[%s]对应产品服务资源紧张!请联系售后开通!' % ns.get('EcsFamilyName')
# }
# 查找本地配置是否有对应资源
db = DBPools()
async with db.sqlorContext('kboss') as sor:
providerid_li = await sor.R('organization', {'orgname': '北京首都在线科技股份有限公司', 'del_flg': '0'})
if providerid_li:
providerid = providerid_li[0]['id']
else:
return {
'status': False,
'msg': '[%s] 供应资源紧张!请联系售后开通!' % ns.get('EcsFamilyName')
}
exist_prducts = await sor.R('product', {'providerid': providerid, 'name': ns['EcsFamilyName'], 'del_flg': '0'})
if exist_prducts:
productid = None
for exist_prduct in exist_prducts:
spec_notes = json.loads(exist_prduct['spec_note'])
spec_dic = {}
for note in spec_notes:
spec_dic.update({note['configName']: note['value']})
if str(ns['Cpu']) == spec_dic['CPU'] and str(ns['Ram']) == spec_dic['内存']:
productid = exist_prduct['id']
if not productid:
return {
'status': False,
'msg': '[%s] 产品ID资源紧张请联系售后开通' % ns.get('EcsFamilyName')
}
else:
return {
'status': False,
'msg': '[%s] 产品资源DI紧张请联系售后开通' % ns.get('EcsFamilyName')
}
ns_get_price_dic = {
'user_orgid': ns['user_orgid'],
"IsToMonth": ns['IsToMonth'],
"AvailableZoneCode": ns['AvailableZoneCode'],
"EcsFamilyName": ns['EcsFamilyName'],
"Cpu": int(ns['Cpu']),
"Ram": int(ns['Ram']),
"Gpu": int(ns['Gpu']),
"BillingMethod": ns['BillingMethod'],
"Duration": int(ns['Duration']),
"SystemDiskInfo": ns['SystemDisk'],
"Number": int(ns['Number']),
"DataDiskInfo": ns['DataDisk']
}
price_ecs_dic = await get_ecs_price(ns_get_price_dic)
print('price_ecs_dic', price_ecs_dic)
if price_ecs_dic['status']:
total_ecs_amount = price_ecs_dic['data']['TotalPrice']
else:
return {
'status': False,
'msg': '获取价格失败'
}
if ns.get('PubnetInfo'):
pubnetinfo = json.loads(ns['PubnetInfo']) if isinstance(ns['PubnetInfo'], str) else ns['PubnetInfo']
ns_eip = {
'user_orgid': ns['user_orgid'],
"duration": ns['Duration'],
"qos": pubnetinfo[0]['Qos']
}
price_eip_dic = await get_eip_price(ns_eip)
print('price_eip_dic', price_eip_dic)
if price_eip_dic['status']:
total_eip_amount = price_eip_dic['data']['total_price']['price']
price_ecs_dic['data']['price_detail'].append(price_eip_dic['data']['bandwidth_price'])
price_ecs_dic['data']['price_detail'].append(price_eip_dic['data']['eip_price'])
else:
return {
'status': False,
'msg': '获取EIP价格失败'
}
else:
total_eip_amount = 0
total_amount = round(float(total_ecs_amount) + float(total_eip_amount), 3)
# 比对账户余额和账单金额
# 9326.0326
balance_yuan = await getCustomerBalance(sor, ns['user_orgid'])
print('%s orgid: %s, 余额为: %s' % (time.strftime('%Y-%m-%d %H:%M:%S'), ns['user_orgid'], balance_yuan))
print('将要扣除的金额: %s' % total_amount)
if not balance_yuan:
print('%s 用户%s 余额为空' % (time.strftime('%Y-%m-%d %H:%M:%S'), ns['user_orgid']))
return {
'status': False,
'msg': '余额不足, 请及时充值'
}
if balance_yuan < total_amount:
print('%s 用户%s 余额不足' % (time.strftime('%Y-%m-%d %H:%M:%S'), ns['user_orgid']))
return {
'status': False,
'msg': '余额不足, 请及时充值'
}
if body['BillingMethod'] == '0':
chargeduration = 1
unit = 'day'
else:
chargeduration = ns['Duration']
unit = 'month'
# 插入传入字典 用于续费
ns_spec = {
'id': uuid(),
'spec_data': json.dumps(ns)
}
await sor.C('specificdata', ns_spec)
orderid = None
for ser in price_ecs_dic['data']['price_detail']:
if ser['config_name'] == 'disk_unit':
continue
amount = ser['price']
productid = ser['productid']
if ser.get('config_name') and ser.get('config_name') == 'disk':
quantity = disksize
elif ser.get('config_name') and ser.get('config_name') == 'bandwidth':
quantity = qos_num
else:
quantity = '1'
addbz_order_ns = {
'sor': sor,
"userid": await get_user(), # TODO await get_user()
"productid": productid,
"quantity": quantity,
"providerid": providerid,
"list_price": ser['sale_price_unit'],
"price": ser['sale_price_unit'],
"amount": amount,
"chargeduration": chargeduration,
"unit": unit,
'specdataid': ns_spec['id'],
'spec_id': ns_spec['id'],
'orderid': orderid,
'total_amount': total_amount
}
addbz_order_res = await addbz_order(addbz_order_ns)
if addbz_order_res['status']:
orderid = addbz_order_res['bz_id']
else:
await sor.rollback()
return {
'status': False,
'msg': '账单错误,请联系售后'
}
affirmbz_order_ns = {
'sor': sor,
'orderid': orderid,
'providername': '北京首都在线科技股份有限公司',
'providerid': providerid
}
affirmbz_order_res = await affirmbz_order(affirmbz_order_ns)
if not affirmbz_order_res['status']:
await sor.rollback()
return {
'status': False,
'msg': '支付错误, 请联系售后'
}
return {'1': 2}
url = get_signature(action, method, ecs_url, param=param)
async with aiohttp.ClientSession() as session:
async with session.request(method, url, json=body) as response:
resp = await response.text()
result = json.loads(resp)
if result['Code'] == 'Success':
result['status'] = True
result.pop('Code')
result['data'] = result.pop('Data')
if result.get('Message'):
result['msg'] = result.pop('Message')
else:
result['msg'] = result.pop('Msg')
resourceid = result['data']['EcsIdSet'][0]
update_resource_sql = """UPDATE customer_goods set resourceid = '%s' WHERE orderid = '%s';""" \
% (resourceid, orderid)
await sor.sqlExe(update_resource_sql, {})
else:
result['status'] = False
if result.get('Message'):
result['msg'] = result.pop('Message')
else:
result['msg'] = result.pop('Msg')
await sor.rollback()
# raise ValueError('首都云服务器创建失败!, %s' % result)
return result
ret = await create_ecs(params_kw)
return ret