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'] 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': 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: 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") 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'] try: user = await sor.R('users', {'id': await get_user()}) orgid = await sor.R('organization', {'id': user[0]['orgid']}) amountadll = 0 bz_ns = {} # bz_ns['id'] = UUID() bz_ns['id'] = uuid() 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") 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'] = bz_ns['id'] 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('amount') nss['spec_id'] = ns.get('spec_id') 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']) await sor.C('order_goods', nss) await sor.U('bz_order', {'id': bz_ns['id'], 'amount': amountadll}) return {'status': True, 'msg': '添加成功', 'bz_id': bz_ns['id']} except Exception as error: raise error async def create_uhost_instance(ns={}): import aiohttp ns['amount'] = float(ns['amount']) server_name = ns.get('Name') if ns.get('Name') else time.strftime('%Y%m%d%H%M%S') ns['Name'] = ns['orgid'] + '0_____0' + server_name db = DBPools() async with db.sqlorContext('kboss') as sor: # 比对账户余额和账单金额 # 11885.9626 balance_yuan = await getCustomerBalance(sor, ns['orgid']) print('%s orgid: %s, 余额为: %s' % (time.strftime('%Y-%m-%d %H:%M:%S'), ns['orgid'], balance_yuan)) print('将要扣除的金额: %s' % ns['amount']) if not balance_yuan: print('%s 用户%s 余额为空' % (time.strftime('%Y-%m-%d %H:%M:%S'), ns['orgid'])) return { 'status': False, 'msg': '余额不足, 请及时充值' } if balance_yuan < ns['amount']: print('%s 用户%s 余额不足' % (time.strftime('%Y-%m-%d %H:%M:%S'), ns['orgid'])) return { 'status': False, 'msg': '余额不足, 请及时充值' } 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['GpuType'], '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['GPU']) == spec_dic['GPU']: 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') } ucloud_user_li = await sor.R('ucloud_users', {'orgid': 'main_user', 'del_flg': '0'}) if ucloud_user_li: uc_client = U_Client({ "project_id": ucloud_user_li[0]['projectid'], "public_key": ucloud_user_li[0]['accesskey'], "private_key": ucloud_user_li[0]['accesskeysecret'], }) else: return { 'status': False, 'msg': 'can not find u cloud user' } # 创建实例前直接扣费 addbz_order_ns = { 'sor': sor, "userid": await get_user(), "productid": productid, "quantity": "1", "providerid": providerid, "list_price": ns['amount'], "amount": ns['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, 'Quantity': ns['Quantity'] } affirmbz_order_res = await affirmbz_order(affirmbz_order_ns) if not affirmbz_order_res['status']: await sor.rollback() return { 'status': False, 'msg': '支付错误, 请联系售后' } try: Disks = ns.get('Disks') NetworkInterface = ns.get('NetworkInterface') resp = uc_client.uhost().create_uhost_instance({ "Region": ns.get('Region'), "Zone": ns.get('Zone'), "ImageId": ns.get('ImageId'), "LoginMode": ns.get('LoginMode'), "Password": ns.get('Password'), "Name": ns.get('Name'), "Tag": "Default", "ChargeType": ns.get('ChargeType'), "Quantity": int(ns.get('Quantity')) if ns.get('Quantity') else 1, "CPU": ns['CPU'], "Memory": ns['Memory'], "GpuType": ns.get('GpuType'), "GPU": ns['GPU'], "NetCapability": ns.get('NetCapability'), "HotplugFeature": False, "MachineType": ns.get('MachineType'), 'SecurityGroupId': ns.get('SecurityGroupId'), 'MinimalCpuPlatform': ns.get('MinimalCpuPlatform'), "MaxCount": ns['MaxCount'] if ns.get('MaxCount') else 1, "Disks": json.loads(Disks) if isinstance(Disks, str) else Disks, "NetworkInterface": json.loads(NetworkInterface) if isinstance(NetworkInterface, str) else NetworkInterface }) if not resp.get('UHostIds'): await sor.rollback() return { 'status': False, 'msg': 'create instance price failed', 'data': resp } return { 'status': True, 'msg': 'create instance price success', 'data': resp } except exc.UCloudException as e: await sor.rollback() if 'Lack of balance' in str(e): return { 'status': False, 'msg': '余额不足, 请及时充值' } elif 'Resource not existeduimage' in str(e): return { 'status': False, 'msg': '镜像不存在/不匹配' } elif 'Resource not enough' in str(e): return { 'status': False, 'msg': '当前配置资源不足,请选择其他配置。' } elif 'Password Invalid' in str(e): return { 'status': False, 'msg': '密码格式错误' } else: return { 'status': False, 'msg': 'create instance failed, %s' % str(e) } ret = await create_uhost_instance(params_kw) return ret