salescrm/b/provider/cpcc_kehu_kan_chanpin.dspy
2025-10-27 15:50:44 +08:00

208 lines
9.4 KiB
Plaintext

async def determine_product_launch(ns={}):
sor = ns['sor']
productid = ns['productid']
orgid = ns['orgid']
parentid = ns['parentid']
# 获取协议
saleprotocol_to_person = await sor.R('saleprotocol',
{'bid_orgid': orgid, 'offer_orgid': parentid,
'del_flg': '0'})
# 等于空就代表这个客户没有特殊折扣,就要找到买方为*的协议
saleprotocol_to_all = await sor.R('saleprotocol', {'bid_orgid': '*', 'offer_orgid': parentid,
'del_flg': '0', 'salemode': '0'})
if saleprotocol_to_person:
product_salemode = await sor.R('product_salemode',
{'protocolid': saleprotocol_to_person[0]['id'],
'productid': productid,
'del_flg': '0'})
if not product_salemode:
product_salemode = await sor.R('product_salemode',
{'protocolid': saleprotocol_to_all[0]['id'],
'productid': productid,
'del_flg': '0'})
else:
product_salemode = await sor.R('product_salemode',
{'protocolid': saleprotocol_to_all[0]['id'],
'productid': productid,
'del_flg': '0'})
if not product_salemode:
# print('product_salemode', '还未上线这个产品的协议配置')
return {
'status': False,
'msg': '还未上线这个产品的协议配置'
}
else:
return {
'status': True,
'msg': 'success'
}
async def cpcc_kehu_kan_chanpin(ns={}):
"""
mIWUHBeeDM8mwAFPIQ8pS
:param ns:
:return:
"""
if ns.get('userid'):
userid = ns.get('userid')
else:
userid = await get_user()
db = DBPools()
async with db.sqlorContext('kboss') as sor:
data = {}
data['products'] = []
# 获取用户orgid
orgid_li = await sor.R('users', {'id': userid})
orgid = orgid_li[0]['orgid']
# 获取用户parentid
parentid_li = await sor.R('organization', {'id': orgid, 'del_flg': '0'})
parentid = parentid_li[0]['parentid']
# 获取这个parentid下所有可用 已配置算力中心
cpcc_find_sql = """select o.id, o.orgname, o.orgcode from cpclist as c left join organization as o on c.id = o.orgcode where c.orgid = '%s' and o.del_flg = '0';""" % parentid
cpcc_li = await sor.sqlExe(cpcc_find_sql, {})
domain_url = ns.get('domain_url')
if ('https://www.opencomputing.cn/dev' in domain_url) or ('localhost' in domain_url):
base_url = 'https://www.opencomputing.cn/dev'
elif 'https://www.opencomputing.cn' in domain_url:
base_url = 'https://www.opencomputing.cn'
else:
base_url = domain_url.split('://')[0] + '://' + domain_url.split('://')[1].split('/')[0]
# 一次性查找所有集群名称
cluster_data = await sor.R('cpccluster', {})
clusters = {item['id']: item['name'] for item in cluster_data}
for cpcc in cpcc_li:
provider_info = {}
provider_info['cpccid'] = cpcc['orgcode']
provider_info['cpccname'] = cpcc['orgname']
provider_info['providerid'] = cpcc['id']
provider_info['products'] = await sor.R('product', {'providerid': provider_info['providerid'], 'classify': 'CPCC-COMBINATION', 'del_flg': '0'})
for product in provider_info['products']:
# 查看产品是否配置了公共折扣
determine_ns = {
'sor': sor,
'productid': product['id'],
'orgid': orgid,
'parentid': parentid
}
determine_prd = await determine_product_launch(determine_ns)
if not determine_prd['status']:
# provider_info['products'].remove(product)
continue
clusterid = product['name'].split('.')[-1]
product['clusterid'] = clusterid
product['clustername'] = clusters.get(clusterid)
# 没有找到集群名称 可能是集群重装ID变了 删除对应产品 并在后台重新组合新产品
if not product['clustername']:
product_detele_sql = """UPDATE product set del_flg = '1' WHERE id = '%s';""" % product['id']
await sor.sqlExe(product_detele_sql, {})
continue
product['cpccname'] = provider_info['cpccname']
rs_type = product['name'].split('.')[0]
if ('-' != rs_type) and ('-' in rs_type):
product['gpumemory'] = rs_type.split('-')[1]
else:
product['gpumemory'] = None
# 先询价 再验证有没有库存
price_inquiry_url = base_url + '/cpcc/cpcwidget/accrual_price.dspy'
price_payload = {
'cpcid': cpcc['orgcode'],
'resources': json.loads(product['spec_note']),
'duration': ns['duration'],
'duration_unit': ns['duration_unit']
}
try:
async with aiohttp_client.request(
method='POST',
url=price_inquiry_url,
json=price_payload) as res:
price_inquiry = await res.json()
if price_inquiry.get('status') and price_inquiry['data']['status'] and price_inquiry['data']['message'] == '汇算正常':
product['price'] = price_inquiry['data']['total_price']
product['duration'] = ns['duration']
product['duration_unit'] = ns['duration_unit']
else:
product['price'] = '售罄'
data['products'].append(product)
continue
# 验证库存
stock_url = base_url + '/cpcc/cpcbuy/determine_accommodat.dspy'
payload = {
'cpcid': provider_info['cpccid'],
'clusterid': clusterid,
'resources': {'aa': json.loads(product['spec_note'])}
}
async with aiohttp_client.request(
method='POST',
url=stock_url,
json=payload) as res:
data_stock = await res.json()
if data_stock.get('data'):
product['price'] = '售罄'
except Exception as e:
product['price'] = '售罄'
data['products'].append(product)
# 筛选出所有产品相关站点
data['cluster_info'] = list({item['clusterid']: {'clusterid': item['clusterid'], 'clustername': item['cpccname'] + '-' + item['clustername'], 'resource_type': []} for item in data['products']}.values())
for i in data['cluster_info']:
for j in data['products']:
if j['clusterid'] == i['clusterid']:
r_type = j['name'].split('.')[0]
j['resource_type'] = r_type
resource_type = {'name': r_type, 'type': 'GPU'}
if r_type == '-' or r_type == 'STANDARD':
r_type = 'CPU计算型'
j['resource_type'] = r_type
resource_type = {'name': r_type, 'type': 'CPU'}
if resource_type in i['resource_type']:
j['resource_type'] = r_type
continue
i['resource_type'].append(resource_type)
# 第一次查找 默认第一个集群及相关产品
if (not ns.get('clusterid')) and (not ns.get('resource_type')):
clusterid_fir = data['cluster_info'][0]['clusterid']
resource_tp = data['cluster_info'][0]['resource_type'][0]['name']
data['products'] = [i for i in data['products'] if i['clusterid'] == clusterid_fir and i['resource_type'] == resource_tp]
if ns.get('clusterid') and ns.get('resource_type'):
data['products'] = [i for i in data['products'] if
i['clusterid'] == ns.get('clusterid') and i['resource_type'] == ns.get('resource_type')]
if ns.get('clusterid'):
data['products'] = [i for i in data['products'] if
i['clusterid'] == ns.get('clusterid')]
for i in range(len(data['cluster_info'])):
if data['cluster_info'][i]["clusterid"] == ns.get('clusterid'):
# 找到元素,移除并插入到开头
element = data['cluster_info'].pop(i)
data['cluster_info'].insert(0, element)
break
return {
'status': True,
'msg': 'get cpcc product success',
'data': data
}
ret = await cpcc_kehu_kan_chanpin(params_kw)
return ret