From 5a95271bb8460b39192aced2db1ed86279e63219 Mon Sep 17 00:00:00 2001 From: ping <1017253325@qq.com> Date: Wed, 19 Aug 2026 11:18:37 +0800 Subject: [PATCH 1/6] update --- b/baiduc/baidu_confirm_auto_renew_order.dspy | 834 ------------------- b/baiduc/baidu_users_get_post_pay.dspy | 2 +- b/cntoai/model_management_pin_top.dspy | 6 + b/cntoai/test_chat.py | 12 + 4 files changed, 19 insertions(+), 835 deletions(-) delete mode 100644 b/baiduc/baidu_confirm_auto_renew_order.dspy diff --git a/b/baiduc/baidu_confirm_auto_renew_order.dspy b/b/baiduc/baidu_confirm_auto_renew_order.dspy deleted file mode 100644 index 2f22643..0000000 --- a/b/baiduc/baidu_confirm_auto_renew_order.dspy +++ /dev/null @@ -1,834 +0,0 @@ -async def user_action_record(ns={}): - ns_dic = { - 'id': uuid(), - 'source': '百度智能云', - 'orderid': ns.get('orderid'), - 'ordertype': ns.get('ordertype'), - 'userid': ns.get('userid'), - 'reason': ns.get('reason') - } - db = DBPools() - async with db.sqlorContext('kboss') as sor: - await sor.C('user_action', ns_dic) - -async def time_convert(resoucetime=None): - if not resoucetime: - return - utc_time = datetime.datetime.strptime(resoucetime, "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=datetime.timezone.utc) - beijing_time = utc_time.astimezone(datetime.timezone(datetime.timedelta(hours=8))) - return beijing_time.strftime("%Y-%m-%d %H:%M:%S") - -async def cal_expire_time(history_time=None, chargeduration=None, unit=None): - chargeduration = int(chargeduration) - # 当前时间 - # now = datetime.datetime.now() - now = datetime.datetime.strptime(history_time, '%Y-%m-%d %H:%M:%S') - if unit == 'MONTH': - expire_time = now + dateutil.relativedelta.relativedelta(months=chargeduration) - 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={}): - """确认支付""" - order_type = ns.get('order_type') - sor = ns['sor'] - orgid = await sor.R('bz_order', {'id': ns['orderid']}) - - servicename = orgid[0]['servicename'] - product_url = None - # if ('BCC' in servicename) or ('GPU' in servicename): - # product_url = 'https://console.vcp.baidu.com/bcc/#/bcc/instance/list' - - 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: - # 处理退订逻辑 - if order_type == 'REFUND': - # 找到资源并更新时间 - resource_find_sql = """select id from customer_goods where resourceid = '%s';""" % j['resourceids'] - resource_find_li = await sor.sqlExe(resource_find_sql, {}) - resource_find_id = resource_find_li[0]['id'] - await sor.U('customer_goods', {'id': resource_find_id, 'del_flg': '1'}) - - # 处理续费逻辑 - elif order_type == 'RENEW': - # 找到资源并更新时间 - resource_find_sql = """select id from customer_goods where FIND_IN_SET('%s', resourceid) and del_flg = '0';""" % j['resourceids'] - resource_find_li = await sor.sqlExe(resource_find_sql, {}) - resource_find_id = resource_find_li[0]['id'] - await sor.U('customer_goods', {'id': resource_find_id, 'start_date': j['resourcestarttime'], 'expire_date': j['resourceendtime']}) - - # 处理购买逻辑 - else: - 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'] = j['resourcestarttime'] - nss['expire_date'] = j['resourceendtime'] - nss['resourceid'] = j['resourceids'] - nss['orderkey'] = j['orderkey'] - - if product_url: - nss['product_url'] = product_url - else: - spec = json.loads(product[0]['spec_note']) if isinstance(product[0]['spec_note'], str) else product[0]['spec_note'] - spec_list_url = [item['value'] for item in spec if item['configName'] == 'listUrl'] - nss['product_url'] = spec_list_url[0] if spec_list_url else 'https://console.vcp.baidu.com/bcc/#/bcc/instance/list' - - await sor.C('customer_goods', nss) - return {'status': True, 'msg': '支付成功'} - except Exception as error: - return {'status': False, 'msg': str(error)} - -async def baidu_new_update_resouce(ns={}): - - # 增加延迟 - import asyncio - await asyncio.sleep(12) - - db = DBPools() - async with db.sqlorContext('kboss') as sor: - baidu_users = await sor.R('baidu_users', {'user_id': ns.get('userid'),'del_flg':'0'}) - user = await sor.R('users', {'id': ns.get('userid')}) - orgid = await sor.R('organization', {'id': user[0]['orgid']}) - nss = {'uuids': [ns.get('order_id')], 'queryAccountId': baidu_users[0]['baidu_id']} - ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) - url = 'https://billing.baidubce.com/v1/order/getByUuid?%s' % ns_format - method = 'POST' - header = { - "Host": "billing.baidubce.com", - "ContentType": "application/json;charset=UTF-8" - } - header = await get_auth_header(method=method, url=url, header=header) - async with aiohttp_client.request( - method=method, - url=url, - headers=header, - json=nss) as res: - data_ = await res.json() - with open('baidu_new_order_after_confirm.txt', 'a+') as f: - f.write(json.dumps(data_) + '\n') - orders = data_['orders'] - - for item in orders: - order_items = item['orderItems'] - for order_info in order_items: - resourceids = ','.join(order_info['shortIds']) if order_info.get('shortIds') else '' - if not resourceids: - continue - resourcestarttime = await time_convert(order_info.get('resourceStartTime')) if order_info.get( - 'resourceStartTime') else None - resourceendtime = await time_convert(order_info.get('resourceEndTime')) if order_info.get( - 'resourceEndTime') else None - - order_key = order_info['key'] - update_order_goods_sql = """ UPDATE order_goods og - JOIN bz_order o ON og.orderid = o.id - SET - og.resourceids = '%s', - og.resourcestarttime = '%s', - og.resourceendtime = '%s' - WHERE - og.orderkey = '%s' - AND o.provider_orderid = '%s'; """ \ - % (resourceids, resourcestarttime, resourceendtime, order_key, ns.get('order_id')) - await sor.sqlExe(update_order_goods_sql, {}) - update_customer_goods_sql = """ UPDATE customer_goods og - JOIN bz_order o ON og.orderid = o.id - SET - og.resourceid = '%s', - og.start_date = '%s', - og.expire_date = '%s' - WHERE - og.orderkey = '%s' - AND o.provider_orderid = '%s'; """ \ - % (resourceids, resourcestarttime, resourceendtime, order_key, ns.get('order_id')) - await sor.sqlExe(update_customer_goods_sql, {}) - -async def baidu_order_cancel(ns={}): - baidu_id = ns['baidu_id'] - order_id = ns['order_id'] - paydata = {'queryAccountId': baidu_id, 'orderIds': [order_id]} - ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) - url = 'https://billing.baidubce.com/v1/order/cancel?%s' % ns_format - method = 'POST' - header = { - "Host": "billing.baidubce.com" - } - header = await get_auth_header(method=method, url=url, header=header) - async with aiohttp_client.request( - method=method, - url=url, - headers=header, - json=paydata) as res: - await res.json() - return { - 'status': True, - 'msg': 'order cancel success' - } - -async def get_time_diff(time_old=None, time_new=None): - - # # 定义两个时间字符串 - # time_old = '2023-12-01 09:40:00' - # time_new = '2023-12-01 23:15:00' - - # 将时间字符串解析为datetime对象 - time_dt1 = datetime.datetime.strptime(time_old, '%Y-%m-%d %H:%M:%S') - time_dt2 = datetime.datetime.strptime(time_new, '%Y-%m-%d %H:%M:%S') - - # 计算时间差 - time_difference = time_dt2 - time_dt1 - - # 提取时间差中的分钟数 - minutes_difference = time_difference.total_seconds() / 60 - # day = time_difference.days - # hour = time_difference.total_seconds() / 3600 - return minutes_difference - -async def diff_sms_send_save(sor=None, productname=None, time_interval=24*60, send_type='用户欠费通知', user_orgid=None, sms_send_dict=None): - sms_should_send = False - send_type = send_type - # 记录到欠费表中 - # 首先查询欠费表中时间是否再范围内 - db = DBPools() - async with db.sqlorContext('kboss') as sor: - try: - print('引用发送短信...') - customer_phone = (await sor.R('organization', {'id': user_orgid}))[0]['contactor_phone'] - # customer_name = (await sor.R('organization', {'id': user_orgid}))[0]['orgname'] - sms_exist_li = await sor.R('sms_record', {'mobile': customer_phone, 'send_type': send_type, 'send_status': '1', - 'sort': ['send_time desc']}) - if sms_exist_li: - # 如果原来发送成功 时间范围大于24小时 再次发送 - if sms_exist_li[0]['send_status']: - sms_exist_time = sms_exist_li[0]['send_time'] - time_diff = await get_time_diff(sms_exist_time, time.strftime('%Y-%m-%d %H:%M:%S')) - # 如果发送过的短信在一天范围内 不再发送短信 - if time_diff >= time_interval: - sms_should_send = True - else: - print('%s %s短信已经发送过, 但是没有超过阈值时间, 不再发送...' % (send_type, customer_phone)) - else: - print('%s %s短信没有发送过, 发送...' % (send_type, customer_phone)) - sms_should_send = True - - if sms_should_send or not sms_exist_li: - # 给个人发送短信 - await send_vcode(customer_phone, send_type, sms_send_dict) - except Exception as e: - print('发送短信失败: %s' % str(e)) - return { - 'status': False, - 'msg': '发送短信失败', - 'data': e - } - -async def get_baidu_orderlist(ns={}): - """ - 百度支付 - 1、获取订单 - 2、算出购买的产品折扣 - 3、比对账号余额 - """ - # 增加延迟 - import asyncio - await asyncio.sleep(2) - db = DBPools() - async with db.sqlorContext('kboss') as sor: - baidu_users = await sor.R('baidu_users', {'user_id': ns.get('userid'),'del_flg':'0'}) - user = await sor.R('users', {'id': ns.get('userid')}) - orgid = await sor.R('organization', {'id': user[0]['orgid']}) - nss = {'uuids': [ns.get('order_id')], 'queryAccountId': baidu_users[0]['baidu_id']} - ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) - url = 'https://billing.baidubce.com/v1/order/getByUuid?%s' % ns_format - method = 'POST' - header = { - "Host": "billing.baidubce.com", - "ContentType": "application/json;charset=UTF-8" - } - header = await get_auth_header(method=method, url=url, header=header) - async with aiohttp_client.request( - method=method, - url=url, - headers=header, - json=nss) as res: - data_ = await res.json() - with open('baidu_new_order.txt', 'a+') as f: - f.write(json.dumps(data_) + '\n') - orders = data_['orders'] - serviceType = orders[0]['orderItems'] - - # 可能获取得到的是延迟订单 - if orders[0]['type'] == 'REFUND' and orders[0]['status'] != 'CREATED': - return { - 'status': False, - 'msg': 'delay_order' - } - - # 避免重复退订 - if orders[0]['type'] == 'REFUND' and orders[0]['status'] == 'CREATED': - order_history = await sor.R('bz_order', {'provider_orderid': ns.get('order_id'), 'business_op': 'BUY_REVERSE', 'order_status': '1'}) - if order_history: - print('此订单之前已经退费成功') - return { - 'status': True, - 'msg': '此订单之前已经退费成功' - } - - # 如果是退款 更新数据库状态 - if orders[0]['type'] == 'REFUND': - updatetime = await time_convert(orders[0]['updateTime']) if orders[0].get('updateTime') else None - update_refund_sql = """UPDATE baidu_orders SET price = '%s', status = '%s', updatetime = '%s' WHERE orderid = '%s';""" % \ - (float(orders[0]['price']), orders[0]['status'], updatetime, ns.get('order_id')) - await sor.sqlExe(update_refund_sql, {}) - - productType = 'prepay' - # 判断订单item中productType是否有后付费的产品 - for item in orders: - order_items = item['orderItems'] - for order_info in order_items: - postpay_price = order_info['itemFee']['price'] if order_info.get('itemFee') else order_info['catalogPrice'] - if not postpay_price: - # cpt1Price: 固定配置,按分钟计费 - postpay_price = order_info['pricingDetail'].get('cpt1Price') if order_info.get('pricingDetail') else 0 - - # 确定是否是后付费订单 - if order_info['productType'] == 'postpay' and postpay_price != 0: - productType = 'postpay' - # 获取余额 - user_balance = await getCustomerBalance(sor, orgid[0]['id']) - # 判断余额是否大于50 - if user_balance < 50: - await sor.rollback() - paydata = {'queryAccountId': baidu_users[0]['baidu_id'], 'orderIds': [ns.get('order_id')]} - ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) - url = 'https://billing.baidubce.com/v1/order/cancel?%s' % ns_format - method = 'POST' - header = { - "Host": "billing.baidubce.com" - } - header = await get_auth_header(method=method, url=url, header=header) - async with aiohttp_client.request( - method=method, - url=url, - headers=header, - json=paydata) as res: - await res.json() - ns_record = { - 'orderid': ns.get('order_id'), - 'ordertype': orders[0]['type'], - 'userid': ns.get('userid'), - 'reason': '后付费 该账号余额不足50,无法完成购买' - } - await user_action_record(ns_record) - return { - 'status': False, - 'msg': '您的余额小于该产品的起购金额50元, 目前无法购买立即充值' - } - # 实付价格 - total_price = 0 - # productType = '' - - # 买/续/退 字段映射 - order_type = orders[0]['type'] - if order_type == 'NEW': - business_op = 'BUY' - elif order_type == 'RENEW': - business_op = 'RENEW' - elif order_type == 'REFUND': - business_op = 'BUY_REVERSE' - else: - ns_record = { - 'orderid': ns.get('order_id'), - 'ordertype': orders[0]['type'], - 'userid': ns.get('userid'), - 'reason': '支付形式目前仅包含购买,续费,退订' - } - await user_action_record(ns_record) - return { - 'status': False, - 'msg': '线上暂不支持, 请联系售后' - } - try: - # 生成本地订单 - bz_ns = {} - bz_ns['id'] = uuid() - bz_ns['order_status'] = '0' - bz_ns['business_op'] = business_op - bz_ns['userid'] = ns.get('userid') - bz_ns['customerid'] = orgid[0]['id'] - bz_ns['order_date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - bz_ns['thirdparty_order'] = ns.get('order_id') - bz_ns['source'] = '百度智能云' - # bz_ns['originalprice'] = orders[0]['price'] - bz_ns['originalprice'] = sum(i['catalogPrice'] for i in serviceType) - bz_ns['provider_orderid'] = ns.get('order_id') - bz_ns['ordertype'] = orders[0]['productType'] - bz_ns['servicename'] = orders[0]['serviceType'] - bz_ns['autoreneworder'] = '1' if orders[0]['autoRenewOrder'] else '0' - if ns.get('specdataid'): - bz_ns['specdataid'] = ns['specdataid'] - await sor.C('bz_order', bz_ns) - for i in serviceType: - # if i['productType'] == 'prepay': - # # 预付费 - # productType = 'prepay' - # financePrice = 0 - # 获取产品id - product = await sor.R('product', {'providerpid': 'baidu_' + i['serviceType'], 'del_flg': '0'}) - if not product: - return { - 'status': False, - 'msg': '未配置该产品, 请联系售后处理' - } - # 获取协议 - saleprotocol_to_person = await sor.R('saleprotocol', - {'bid_orgid': orgid[0]['id'], 'offer_orgid': orgid[0]['parentid'], - 'del_flg': '0'}) - # 等于空就代表这个客户没有特殊折扣,就要找到买方为*的协议 - saleprotocol_to_all = await sor.R('saleprotocol', {'bid_orgid': '*', 'offer_orgid': orgid[0]['parentid'], - 'del_flg': '0', 'salemode': '0'}) - - if saleprotocol_to_person: - product_salemode = await sor.R('product_salemode', - {'protocolid': saleprotocol_to_person[0]['id'], - 'productid': product[0]['id'], - 'del_flg': '0'}) - if not product_salemode: - product_salemode = await sor.R('product_salemode', - {'protocolid': saleprotocol_to_all[0]['id'], - 'productid': product[0]['id'], - 'del_flg': '0'}) - else: - product_salemode = await sor.R('product_salemode', - {'protocolid': saleprotocol_to_all[0]['id'], - 'productid': product[0]['id'], - 'del_flg': '0'}) - if not product_salemode: - return { - 'status': False, - 'msg': '还未上线这个产品的协议配置' - } - supply_price = i['itemFee']['price'] if i.get('itemFee') else i['catalogPrice'] - financePrice = abs(supply_price * product_salemode[0]['discount']) - total_price += financePrice - - # 添加订单子表 - nss = {} - nss['id'] = uuid() - nss['orderid'] = bz_ns['id'] - nss['productid'] = product[0]['id'] - nss['providerid'] = product[0]['providerid'] - if i['count'] > 1: - nss['list_price'] = abs(i['realCatalogPrice'] / i['count']) - else: - nss['list_price'] = abs(i['realCatalogPrice']) - nss['discount'] = product_salemode[0]['discount'] - nss['quantity'] = i['count'] - nss['price'] = abs(round(nss['list_price'] * product_salemode[0]['discount'], 2)) - # 计算总价 - # nss['amount'] = round(total_price, 2) - nss['amount'] = abs(round(nss['price'] * nss['quantity'], 2)) - nss['chargemode'] = i.get('productType') - nss['servicename'] = i.get('serviceType') - nss['chargeduration'] = i.get('time') - nss['unit'] = i.get('timeUnit') - nss['resourceids'] = ','.join(i['shortIds']) if i.get('shortIds') else '' - nss['orderkey'] = i.get('key') - - # 如果是续费订单 由于没有返回日期, 重新计算日期 - if order_type == 'RENEW': - history_time_sql = "select resourcestarttime, resourceendtime from order_goods where FIND_IN_SET('%s', resourceids) order by resourceendtime desc;" % \ - nss['resourceids'] - history_time = await sor.sqlExe(history_time_sql, {}) - new_end_time = await cal_expire_time(history_time=history_time[0]['resourceendtime'], - chargeduration=nss['chargeduration'], unit=nss['unit']) - # 开始日期不变 更新到期日期 - nss['resourcestarttime'] = history_time[0]['resourcestarttime'] - nss['resourceendtime'] = new_end_time - else: - if i.get('resourceStartTime'): - nss['resourcestarttime'] = await time_convert(i.get('resourceStartTime')) - else: - nss['resourcestarttime'] = await time_convert(orders[0]['updateTime']) - - if i.get('resourceEndTime'): - nss['resourceendtime'] = await time_convert(i.get('resourceEndTime')) - - # 后付费没有资源结束时间 - if i.get('productType') == 'prepay': - end_time = await time_convert(orders[0]['updateTime']) - nss['resourceendtime'] = await cal_expire_time(history_time=end_time, - chargeduration=nss['chargeduration'], - unit=nss['unit']) - else: - nss['resourceendtime'] = None - - await sor.C('order_goods', nss) - - # 循环后更新订单中总价 - await sor.U('bz_order', {'id': bz_ns['id'], 'amount': round(total_price, 2)}) - except Exception as e: - await baidu_order_cancel({'baidu_id': baidu_users[0]['baidu_id'], 'order_id': ns.get('order_id')}) - ns_record = { - 'orderid': ns.get('order_id'), - 'ordertype': orders[0]['type'], - 'userid': ns.get('userid'), - 'reason': '发生错误, %s' % str(e)[:100] - } - await user_action_record(ns_record) - import traceback - with open('baiducloud_err.txt', 'w') as f: - f.write(str(e)+ traceback.format_exc()) - traceback.print_exc() - await sor.rollback() - return { - 'status': False, - 'msg': '产品错误, 请联系售后' - } - - # 判断用户账户余额是否足够支付 - try: - count = await getCustomerBalance(sor, orgid[0]['id']) - if order_type == 'REFUND': - count = total_price + 0.1 - - if round(total_price,2) <= count: - #判断预付费或者后付费 - if productType == 'prepay' or productType == 'postpay': - # 调用扣费接口 - affirmbz_order_ns = { - 'sor': sor, - 'orderid': bz_ns['id'], - 'order_type': order_type - } - affirmbz_order_res = await affirmbz_order(affirmbz_order_ns) - if not affirmbz_order_res['status']: - # if True: - await sor.rollback() - ns_record = { - 'orderid': ns.get('order_id'), - 'ordertype': orders[0]['type'], - 'userid': ns.get('userid'), - 'reason': '支付错误, 请联系售后, %s' % affirmbz_order_res.get('msg') - } - await user_action_record(ns_record) - return { - 'status': False, - 'msg': '支付错误, 请联系售后' - } - - # 预配置local_refund用于本地操作 - if order_type == 'REFUND' and not ns.get('local_refund'): - return { - 'status': True, - 'msg': '本地退费成功' - } - else: - # 调用支付订单接口 - paydata = {'queryAccountId':baidu_users[0]['baidu_id'],'orderId':ns.get('order_id')} - ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) - url = 'https://billing.baidubce.com/v1/order/pay?%s' % ns_format - method = 'POST' - header = { - "Host": "billing.baidubce.com" - } - header = await get_auth_header(method=method, url=url, header=header) - async with aiohttp_client.request( - method=method, - url=url, - headers=header, - json=paydata) as res: - data_ = await res.json() - if data_ == {'success': True}: - ns_record = { - 'orderid': ns.get('order_id'), - 'ordertype': orders[0]['type'], - 'userid': ns.get('userid'), - 'reason': '购买成功' - } - await user_action_record(ns_record) - ns_cron_job = { - 'id': uuid(), - 'source': 'baidu', - 'orderid': ns.get('order_id'), - 'ordertype': orders[0]['type'], - 'userid': ns.get('userid'), - 'reason': 'buy success' - } - await sor.C('baidu_cron_job', ns_cron_job) - # return { - # 'status': True, - # 'orderid': bz_ns['id'] - # } - else: - await sor.rollback() - await baidu_order_cancel( - {'baidu_id': baidu_users[0]['baidu_id'], 'order_id': ns.get('order_id')}) - ns_record = { - 'orderid': ns.get('order_id'), - 'ordertype': orders[0]['type'], - 'userid': ns.get('userid'), - 'reason': '支付成功后, order_pay接口错误, 回滚, %s' % str(data_)[:400] - } - await user_action_record(ns_record) - return { - 'status': False, - 'msg': '产品分配排队中, 请联系售后详询' - } - else: - # 取消订单 - await sor.rollback() - paydata = {'queryAccountId': baidu_users[0]['baidu_id'], 'orderIds': [ns.get('order_id')]} - ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) - url = 'https://billing.baidubce.com/v1/order/cancel?%s' % ns_format - method = 'POST' - header = { - "Host": "billing.baidubce.com" - } - header = await get_auth_header(method=method, url=url, header=header) - async with aiohttp_client.request( - method=method, - url=url, - headers=header, - json=paydata) as res: - await res.json() - ns_record = { - 'orderid': ns.get('order_id'), - 'ordertype': orders[0]['type'], - 'userid': ns.get('userid'), - 'reason': '无法购买后付费产品' - } - await user_action_record(ns_record) - return {'status': False, 'msg': '无法购买后付费产品'} - else: - #取消订单 - await sor.rollback() - # 余额不足不cancle订单 - # paydata = {'queryAccountId':baidu_users[0]['baidu_id'],'orderIds':[ns.get('order_id')]} - # ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) - # url = 'https://billing.baidubce.com/v1/order/cancel?%s' % ns_format - # method = 'POST' - # header = { - # "Host": "billing.baidubce.com" - # } - # header = await get_auth_header(method=method, url=url, header=header) - # async with aiohttp_client.request( - # method=method, - # url=url, - # headers=header, - # json=paydata) as res: - # await res.json() - ns_record = { - 'orderid': ns.get('order_id'), - 'ordertype': orders[0]['type'], - 'userid': ns.get('userid'), - 'reason': '该账号余额不足,无法完成购买' - } - await user_action_record(ns_record) - - # 发送短信 - sms_send_dict = { - 'time': time.strftime('%Y-%m-%d %H:') + '00:00', - 'productname': '相关服务' - } - await diff_sms_send_save(sor=sor, time_interval=24*60, send_type='用户欠费通知', user_orgid=orgid[0]['id'], sms_send_dict=sms_send_dict) - - return {'status': False,'msg': '该账号余额不足,无法完成购买'} - except Exception as e: - await baidu_order_cancel({'baidu_id': baidu_users[0]['baidu_id'], 'order_id': ns.get('order_id')}) - import traceback - with open('baiducloud_err.txt', 'w') as f: - f.write(str(e)+ traceback.format_exc()) - traceback.print_exc() - await sor.rollback() - return { - 'status': False, - 'msg': '产品错误, 请联系售后' - } - # 更新资源时间 资源id - # if order_type == 'NEW': - # await baidu_new_update_resouce(ns) - return { - 'status': True, - 'orderid': bz_ns['id'], - 'originalprice': bz_ns.get('originalprice'), - 'servicename': bz_ns.get('servicename'), - 'amount': total_price - } - -async def get_order_list_base_page(baidu_id, pageNo=1, pageSize=500): - ns = {'queryAccountId': baidu_id, 'pageNo': pageNo, 'pageSize': pageSize} - method = 'POST' - ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) - url = 'https://billing.baidubce.com/v1/order/list?%s' % ns_format - header = { - "Host": "billing.baidubce.com", - "ContentType": "application/json;charset=UTF-8" - } - header = await get_auth_header(method=method, url=url, header=header) - async with aiohttp_client.request( - method=method, - url=url, - headers=header, - json=ns) as res: - data_orders = await res.json() - return data_orders - - -async def update_baidu_order_list(ns={}): - """ - ns = {'queryAccountId': '139fc7a23b314596ad78b6bb8e7c1503', 'orderType': 'REFUND'} - :return: - """ - db = DBPools() - async with db.sqlorContext('kboss') as sor: - username = None - # 更新机构下全部用户订单信息 - if ns.get('orgid'): - users_find_sql = """SELECT DISTINCT b.baidu_id FROM organization o INNER JOIN users u ON o.id = u.orgid INNER JOIN baidu_users b ON u.id = b.user_id WHERE o.parentid = '%s' AND b.del_flg = '0';""" % ns.get('orgid') - users = await sor.sqlExe(users_find_sql, {}) - - # 更新个人订单信息 - elif ns.get('userid'): - users = await sor.R('baidu_users', {'user_id': ns['userid']}) - username_li = await sor.R('users', {'id': ns['userid']}) - username = username_li[0]['username'] if username_li else None - else: - users = [] - - update_count = 0 - add_count = 0 - for baidu_id in users: - data_orders = await get_order_list_base_page(baidu_id['baidu_id'], pageNo=1, pageSize=1000) - page_num_count = int(data_orders['totalCount'] / data_orders['pageSize']) + 1 - for page_num in range(1, page_num_count + 1): - data_orders = await get_order_list_base_page(baidu_id['baidu_id'], pageNo=page_num, pageSize=1000) - orders = data_orders['orders'] - for item in orders: - updatetime = await time_convert(item.get('updateTime')) if item.get('updateTime') else None - ns_dic = { - "id": uuid(), - "orderid": item.get("uuid"), - "ordertype": item.get("type"), - "accountid": item.get("accountId"), - "servicetype": item.get("serviceType"), - "producttype": item.get("productType"), - "shortids": ','.join(item['shortIds']) if item.get('shortIds') else '', - "price": item.get("price"), - "status": item.get("status"), - "autoreneworder": '1' if item.get("autoRenewOrder") else '0', - "createtime": await time_convert(item.get('createTime')) if item.get( - 'createTime') else None, - "updatetime": updatetime - } - ns_exist_order = { - 'orderid': item.get("uuid") - } - exist_order = await sor.R('baidu_orders', ns_exist_order) - if exist_order and exist_order[0]['updatetime'] != updatetime: - update_refund_sql = """UPDATE baidu_orders SET price = '%s', status = '%s', updatetime = '%s' WHERE orderid = '%s';""" % \ - (item.get("price"), item.get("status"), updatetime, - item.get("uuid")) - await sor.sqlExe(update_refund_sql, {}) - update_count += 1 - - if not exist_order: - await sor.C('baidu_orders', ns_dic) - add_count += 1 - - return { - 'status': True, - 'msg': '同步数据成功, 新增 %s 条, 更新 %s 条' % (add_count, update_count), - 'data': { - 'username': username - } - } - -async def baidu_confirm_auto_renew_order(ns={}): - if ns.get('domain_name'): - orgid_li = await sor.R('reseller', {'domain_name': ns.get('domain_name'), 'del_flg': '0'}) - orgid = orgid_li[0]['orgid'] - else: - orgid = 'mIWUHBeeDM8mwAFPIQ8pS' - - # 读取baidu_orders表格 确定状态是renew的订单ID - renew_results = [] - # return {'1': 2} - db = DBPools() - async with db.sqlorContext('kboss') as sor: - renew_sql = """ SELECT bo.*, bs.user_id FROM baidu_orders AS bo LEFT JOIN baidu_users AS bs ON bo.accountid = bs.baidu_id WHERE bo.ordertype = 'RENEW' AND bo.status = 'NEED_CONFIRM' AND bo.del_flg = '0'; """ - # return {'1': renew_sql} - renew_results = await sor.sqlExe(renew_sql, {}) - - try: - renew_status_count = 0 - # 执行 get_baidu_orderlist sor分开运行 - for renew_res in renew_results: - order_id = renew_res.get('orderid') - user_id = renew_res.get('user_id') - - renew_status = await get_baidu_orderlist({'order_id': order_id, 'userid': user_id}) - if renew_status.get('status'): - renew_status_count += 1 - else: - db = DBPools() - async with db.sqlorContext('kboss') as sor: - ns_err_log = { - 'id': uuid(), - 'log_level': 'ERROR', - 'log_content': '续费订单 %s 失败 %s' % (order_id, str(renew_status)), - 'user_id': user_id, - 'request_url': '/baiduc/baidu_confirm_auto_renew_order.dspy' - } - await sor.C('warn_error_log', ns_err_log) - - except Exception as e: - print(e) - - # 并触发update函数 - update_msg = await update_baidu_order_list({'orgid': orgid}) - - return { - 'status': True, - 'msg': '续费订单执行结束, 触发了%s条数据' % len(renew_results), - 'data': { - 'renew_status_count': renew_status_count, - 'update_msg': update_msg, - } - } - -ret = await baidu_confirm_auto_renew_order(params_kw) -return ret \ No newline at end of file diff --git a/b/baiduc/baidu_users_get_post_pay.dspy b/b/baiduc/baidu_users_get_post_pay.dspy index 6820347..e699c56 100644 --- a/b/baiduc/baidu_users_get_post_pay.dspy +++ b/b/baiduc/baidu_users_get_post_pay.dspy @@ -652,7 +652,7 @@ async def baidu_users_get_post_pay(ns={}): # if baidu_id != 'f61b662bcd684499b6403371365715b9': # continue try: - user_orgid = (await sor.R('users', {'id': userid}))[0]['orgid'] + user_orgid = (await sor.R('users', {'id': userid}))[0]['orgid'][1] user_parentid = (await sor.R('organization', {'id': user_orgid}))[0]['parentid'] await get_resourcechargeitem_billlist(userid=userid, baidu_id=baidu_id, user_orgid=user_orgid, user_parentid=user_parentid, pageno=1, sor=sor) except Exception as e: diff --git a/b/cntoai/model_management_pin_top.dspy b/b/cntoai/model_management_pin_top.dspy index 3a47250..44dc8e9 100644 --- a/b/cntoai/model_management_pin_top.dspy +++ b/b/cntoai/model_management_pin_top.dspy @@ -31,6 +31,12 @@ async def model_management_pin_top(ns={}): if current_order <= min_order: return {'status': True, 'msg': 'already at top', 'data': {'sort_order': current_order}} + if current_order == 'min_order': + return {'status': True, 'msg': 'already at top', 'data': {'sort_order': current_order}} + + if current_order == 'max_order': + return {'status': True, 'msg': 'already at bottom', 'data': {'sort_order': current_order}} + new_order = min_order - 1 update_sql = """ UPDATE model_management SET sort_order = %s WHERE id = '%s'; diff --git a/b/cntoai/test_chat.py b/b/cntoai/test_chat.py index 3432eac..962b55e 100644 --- a/b/cntoai/test_chat.py +++ b/b/cntoai/test_chat.py @@ -61,6 +61,18 @@ class ChatApiClient: path = path if path.startswith("/") else f"/{path}" return f"{self.base_url}{path}" + def _auth_headers(self, extra: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: + headers: Dict[str, Any] = {} + if USERID: + headers["X-User-Id"] = USERID + if API_KEY: + headers["X-Api-Key"] = API_KEY + if API_URL: + headers["X-Api-Url"] = API_URL + if extra: + headers.update(extra) + return headers + def _auth(self, extra: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: params: Dict[str, Any] = {} if USERID: From 50db2df5868976682335a354f4ae3771a554269b Mon Sep 17 00:00:00 2001 From: ping <1017253325@qq.com> Date: Wed, 19 Aug 2026 16:16:15 +0800 Subject: [PATCH 2/6] update --- b/capital/change_ecs_name.dspy | 2 ++ b/capital/delete_eip.dspy | 4 ++++ b/customer/addinvitecode.dspy | 6 ++++++ b/customer/get_customer_mailcode.dspy | 7 +++++++ 4 files changed, 19 insertions(+) diff --git a/b/capital/change_ecs_name.dspy b/b/capital/change_ecs_name.dspy index 9da0230..4e9cf57 100644 --- a/b/capital/change_ecs_name.dspy +++ b/b/capital/change_ecs_name.dspy @@ -11,6 +11,8 @@ async def change_ecs_name(ns={}): "EcsId": ns.get("EcsId"), "Name": ns.get("Name") } + print(body) + print(get_signature(action, method, ecs_url, param)) url = get_signature(action, method, ecs_url, param) async with aiohttp.ClientSession() as session: async with session.request(method, url, json=body) as response: diff --git a/b/capital/delete_eip.dspy b/b/capital/delete_eip.dspy index e31a9a7..15b51c9 100644 --- a/b/capital/delete_eip.dspy +++ b/b/capital/delete_eip.dspy @@ -6,6 +6,10 @@ async def delete_eip(ns={}): param = {} url = get_signature(action, method, NETWORK_URL, param=param) body = {'EIPId': ns.get('EIPId')} + + print(body) + print(url) + async with aiohttp.ClientSession() as session: async with session.request(method, url, json=body) as response: resp = await response.text() diff --git a/b/customer/addinvitecode.dspy b/b/customer/addinvitecode.dspy index 909e802..854cef5 100644 --- a/b/customer/addinvitecode.dspy +++ b/b/customer/addinvitecode.dspy @@ -2,6 +2,12 @@ async def addinvitecode(ns): """ 生成邀请码 """ + import datetime + + now = datetime.datetime.now() + start_of_day = now.replace(hour=0, minute=0, second=0, microsecond=0) + end_of_day = now.replace(hour=23, minute=59, second=59, microsecond=999999) + db = DBPools() async with db.sqlorContext('kboss') as sor: if ns['promotingid'] and ns['iusserid']: diff --git a/b/customer/get_customer_mailcode.dspy b/b/customer/get_customer_mailcode.dspy index ea25b28..f57534a 100644 --- a/b/customer/get_customer_mailcode.dspy +++ b/b/customer/get_customer_mailcode.dspy @@ -1,4 +1,11 @@ async def get_customer_mailcode(ns): + + import datetime + now = datetime.datetime.now() + + if now.hour < 10: + print('now.hour < 10') + db = DBPools() async with db.sqlorContext('kboss') as sor: user = await sor.R('users', {'id': ns.get('user_id')}) From 44a87867158e6eac0a1240777c4a7ab14ac02d07 Mon Sep 17 00:00:00 2001 From: ping <1017253325@qq.com> Date: Wed, 19 Aug 2026 18:00:49 +0800 Subject: [PATCH 3/6] update --- b/capital/describe_eip.dspy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/b/capital/describe_eip.dspy b/b/capital/describe_eip.dspy index 77789f1..9e76ff4 100644 --- a/b/capital/describe_eip.dspy +++ b/b/capital/describe_eip.dspy @@ -28,6 +28,8 @@ async def describe_eip(ns={}): else: result['status'] = False result['msg'] = result.pop('Message') + print(result) + result['price'] = 0.001 return result ret = await describe_eip(params_kw) From f85767c53cdd6a22ec5ac34ae915200cc7297dfa Mon Sep 17 00:00:00 2001 From: ping <1017253325@qq.com> Date: Fri, 21 Aug 2026 10:00:58 +0800 Subject: [PATCH 4/6] update --- b/baiduc/info_test_.dspy | 836 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 836 insertions(+) create mode 100644 b/baiduc/info_test_.dspy diff --git a/b/baiduc/info_test_.dspy b/b/baiduc/info_test_.dspy new file mode 100644 index 0000000..50bf764 --- /dev/null +++ b/b/baiduc/info_test_.dspy @@ -0,0 +1,836 @@ +# 弃用接口 不再读取整个文件逻辑 +async def user_action_record(ns={}): + ns_dic = { + 'id': uuid(), + 'source': '百度智能云', + 'orderid': ns.get('orderid'), + 'ordertype': ns.get('ordertype'), + 'userid': ns.get('userid'), + 'reason': ns.get('reason') + } + db = DBPools() + async with db.sqlorContext('kboss') as sor: + await sor.C('user_action', ns_dic) + +async def time_convert(resoucetime=None): + if not resoucetime: + return + utc_time = datetime.datetime.strptime(resoucetime, "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=datetime.timezone.utc) + beijing_time = utc_time.astimezone(datetime.timezone(datetime.timedelta(hours=8))) + return beijing_time.strftime("%Y-%m-%d %H:%M:%S") + +async def cal_expire_time(history_time=None, chargeduration=None, unit=None): + chargeduration = int(chargeduration) + # 当前时间 + # now = datetime.datetime.now() + now = datetime.datetime.strptime(history_time, '%Y-%m-%d %H:%M:%S') + if unit == 'MONTH': + expire_time = now + dateutil.relativedelta.relativedelta(months=chargeduration) + 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={}): + """确认支付""" + order_type = ns.get('order_type') + sor = ns['sor'] + orgid = await sor.R('bz_order', {'id': ns['orderid']}) + + servicename = orgid[0]['servicename'] + product_url = None + # if ('BCC' in servicename) or ('GPU' in servicename): + # product_url = 'https://console.vcp.baidu.com/bcc/#/bcc/instance/list' + + 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: + # 处理退订逻辑 + if order_type == 'REFUND': + # 找到资源并更新时间 + resource_find_sql = """select id from customer_goods where resourceid = '%s';""" % j['resourceids'] + resource_find_li = await sor.sqlExe(resource_find_sql, {}) + resource_find_id = resource_find_li[0]['id'] + await sor.U('customer_goods', {'id': resource_find_id, 'del_flg': '1'}) + + # 处理续费逻辑 + elif order_type == 'RENEW': + # 找到资源并更新时间 + resource_find_sql = """select id from customer_goods where FIND_IN_SET('%s', resourceid) and del_flg = '0';""" % j['resourceids'] + resource_find_li = await sor.sqlExe(resource_find_sql, {}) + resource_find_id = resource_find_li[0]['id'] + await sor.U('customer_goods', {'id': resource_find_id, 'start_date': j['resourcestarttime'], 'expire_date': j['resourceendtime']}) + + # 处理购买逻辑 + else: + 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'] = j['resourcestarttime'] + nss['expire_date'] = j['resourceendtime'] + nss['resourceid'] = j['resourceids'] + nss['orderkey'] = j['orderkey'] + + if product_url: + nss['product_url'] = product_url + else: + spec = json.loads(product[0]['spec_note']) if isinstance(product[0]['spec_note'], str) else product[0]['spec_note'] + spec_list_url = [item['value'] for item in spec if item['configName'] == 'listUrl'] + nss['product_url'] = spec_list_url[0] if spec_list_url else 'https://console.vcp.baidu.com/bcc/#/bcc/instance/list' + + await sor.C('customer_goods', nss) + return {'status': True, 'msg': '支付成功'} + except Exception as error: + return {'status': False, 'msg': str(error)} + +async def baidu_new_update_resouce(ns={}): + + # 增加延迟 + import asyncio + await asyncio.sleep(12) + + db = DBPools() + async with db.sqlorContext('kboss') as sor: + baidu_users = await sor.R('baidu_users', {'user_id': ns.get('userid'),'del_flg':'0'}) + user = await sor.R('users', {'id': ns.get('userid')}) + orgid = await sor.R('organization', {'id': user[0]['orgid']}) + nss = {'uuids': [ns.get('order_id')], 'queryAccountId': baidu_users[0]['baidu_id']} + ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) + url = 'https://billing.baidubce.com/v1/order/getByUuid?%s' % ns_format + method = 'POST' + header = { + "Host": "billing.baidubce.com", + "ContentType": "application/json;charset=UTF-8" + } + header = await get_auth_header(method=method, url=url, header=header) + async with aiohttp_client.request( + method=method, + url=url, + headers=header, + json=nss) as res: + data_ = await res.json() + with open('baidu_new_order_after_confirm.txt', 'a+') as f: + f.write(json.dumps(data_) + '\n') + orders = data_['orders'] + + for item in orders: + order_items = item['orderItems'] + for order_info in order_items: + resourceids = ','.join(order_info['shortIds']) if order_info.get('shortIds') else '' + if not resourceids: + continue + resourcestarttime = await time_convert(order_info.get('resourceStartTime')) if order_info.get( + 'resourceStartTime') else None + resourceendtime = await time_convert(order_info.get('resourceEndTime')) if order_info.get( + 'resourceEndTime') else None + + order_key = order_info['key'] + update_order_goods_sql = """ UPDATE order_goods og + JOIN bz_order o ON og.orderid = o.id + SET + og.resourceids = '%s', + og.resourcestarttime = '%s', + og.resourceendtime = '%s' + WHERE + og.orderkey = '%s' + AND o.provider_orderid = '%s'; """ \ + % (resourceids, resourcestarttime, resourceendtime, order_key, ns.get('order_id')) + await sor.sqlExe(update_order_goods_sql, {}) + update_customer_goods_sql = """ UPDATE customer_goods og + JOIN bz_order o ON og.orderid = o.id + SET + og.resourceid = '%s', + og.start_date = '%s', + og.expire_date = '%s' + WHERE + og.orderkey = '%s' + AND o.provider_orderid = '%s'; """ \ + % (resourceids, resourcestarttime, resourceendtime, order_key, ns.get('order_id')) + await sor.sqlExe(update_customer_goods_sql, {}) + +async def baidu_order_cancel(ns={}): + baidu_id = ns['baidu_id'] + order_id = ns['order_id'] + paydata = {'queryAccountId': baidu_id, 'orderIds': [order_id]} + ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) + url = 'https://billing.baidubce.com/v1/order/cancel?%s' % ns_format + method = 'POST' + header = { + "Host": "billing.baidubce.com" + } + header = await get_auth_header(method=method, url=url, header=header) + async with aiohttp_client.request( + method=method, + url=url, + headers=header, + json=paydata) as res: + await res.json() + return { + 'status': True, + 'msg': 'order cancel success' + } + +async def get_time_diff(time_old=None, time_new=None): + + # # 定义两个时间字符串 + # time_old = '2023-12-01 09:40:00' + # time_new = '2023-12-01 23:15:00' + + # 将时间字符串解析为datetime对象 + time_dt1 = datetime.datetime.strptime(time_old, '%Y-%m-%d %H:%M:%S') + time_dt2 = datetime.datetime.strptime(time_new, '%Y-%m-%d %H:%M:%S') + + # 计算时间差 + time_difference = time_dt2 - time_dt1 + + # 提取时间差中的分钟数 + minutes_difference = time_difference.total_seconds() / 60 + # day = time_difference.days + # hour = time_difference.total_seconds() / 3600 + return minutes_difference + +async def diff_sms_send_save(sor=None, productname=None, time_interval=24*60, send_type='用户欠费通知', user_orgid=None, sms_send_dict=None): + sms_should_send = False + send_type = send_type + # 记录到欠费表中 + # 首先查询欠费表中时间是否再范围内 + db = DBPools() + async with db.sqlorContext('kboss') as sor: + try: + print('引用发送短信...') + customer_phone = (await sor.R('organization', {'id': user_orgid}))[0]['contactor_phone'] + # customer_name = (await sor.R('organization', {'id': user_orgid}))[0]['orgname'] + sms_exist_li = await sor.R('sms_record', {'mobile': customer_phone, 'send_type': send_type, 'send_status': '1', + 'sort': ['send_time desc']}) + if sms_exist_li: + # 如果原来发送成功 时间范围大于24小时 再次发送 + if sms_exist_li[0]['send_status']: + sms_exist_time = sms_exist_li[0]['send_time'] + time_diff = await get_time_diff(sms_exist_time, time.strftime('%Y-%m-%d %H:%M:%S')) + # 如果发送过的短信在一天范围内 不再发送短信 + if time_diff >= time_interval: + sms_should_send = True + else: + print('%s %s短信已经发送过, 但是没有超过阈值时间, 不再发送...' % (send_type, customer_phone)) + else: + print('%s %s短信没有发送过, 发送...' % (send_type, customer_phone)) + sms_should_send = True + + if sms_should_send or not sms_exist_li: + # 给个人发送短信 + await send_vcode(customer_phone, send_type, sms_send_dict) + except Exception as e: + print('发送短信失败: %s' % str(e)) + return { + 'status': False, + 'msg': '发送短信失败', + 'data': e + } + +async def get_baidu_orderlist(ns={}): + """ + 百度支付 + 1、获取订单 + 2、算出购买的产品折扣 + 3、比对账号余额 + """ + # 增加延迟 + import asyncio + await asyncio.sleep(2) + db = DBPools() + async with db.sqlorContext('kboss') as sor: + baidu_users = await sor.R('baidu_users', {'user_id': ns.get('userid'),'del_flg':'0'}) + user = await sor.R('users', {'id': ns.get('userid')}) + orgid = await sor.R('organization', {'id': user[0]['orgid']}) + nss = {'uuids': [ns.get('order_id')], 'queryAccountId': baidu_users[0]['baidu_id']} + ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) + url = 'https://billing.baidubce.com/v1/order/getByUuid?%s' % ns_format + method = 'POST' + header = { + "Host": "billing.baidubce.com", + "ContentType": "application/json;charset=UTF-8" + } + header = await get_auth_header(method=method, url=url, header=header) + async with aiohttp_client.request( + method=method, + url=url, + headers=header, + json=nss) as res: + data_ = await res.json() + with open('baidu_new_order.txt', 'a+') as f: + f.write(json.dumps(data_) + '\n') + orders = data_['orders'] + serviceType = orders[0]['orderItems'] + + # 可能获取得到的是延迟订单 + if orders[0]['type'] == 'REFUND' and orders[0]['status'] != 'CREATED': + return { + 'status': False, + 'msg': 'delay_order' + } + + # 避免重复退订 + if orders[0]['type'] == 'REFUND' and orders[0]['status'] == 'CREATED': + order_history = await sor.R('bz_order', {'provider_orderid': ns.get('order_id'), 'business_op': 'BUY_REVERSE', 'order_status': '1'}) + if order_history: + print('此订单之前已经退费成功') + return { + 'status': True, + 'msg': '此订单之前已经退费成功' + } + + # 如果是退款 更新数据库状态 + if orders[0]['type'] == 'REFUND': + updatetime = await time_convert(orders[0]['updateTime']) if orders[0].get('updateTime') else None + update_refund_sql = """UPDATE baidu_orders SET price = '%s', status = '%s', updatetime = '%s' WHERE orderid = '%s';""" % \ + (float(orders[0]['price']), orders[0]['status'], updatetime, ns.get('order_id')) + await sor.sqlExe(update_refund_sql, {}) + + productType = 'prepay' + # 判断订单item中productType是否有后付费的产品 + for item in orders: + order_items = item['orderItems'] + for order_info in order_items: + postpay_price = order_info['itemFee']['price'] if order_info.get('itemFee') else order_info['catalogPrice'] + if not postpay_price: + # cpt1Price: 固定配置,按分钟计费 + postpay_price = order_info['pricingDetail'].get('cpt1Price') if order_info.get('pricingDetail') else 0 + + # 确定是否是后付费订单 + if order_info['productType'] == 'postpay' and postpay_price != 0: + productType = 'postpay' + # 获取余额 + user_balance = await getCustomerBalance(sor, orgid[0]['id']) + # 判断余额是否大于50 + if user_balance < 50: + await sor.rollback() + paydata = {'queryAccountId': baidu_users[0]['baidu_id'], 'orderIds': [ns.get('order_id')]} + ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) + url = 'https://billing.baidubce.com/v1/order/cancel?%s' % ns_format + method = 'POST' + header = { + "Host": "billing.baidubce.com" + } + header = await get_auth_header(method=method, url=url, header=header) + async with aiohttp_client.request( + method=method, + url=url, + headers=header, + json=paydata) as res: + await res.json() + ns_record = { + 'orderid': ns.get('order_id'), + 'ordertype': orders[0]['type'], + 'userid': ns.get('userid'), + 'reason': '后付费 该账号余额不足50,无法完成购买' + } + await user_action_record(ns_record) + return { + 'status': False, + 'msg': '您的余额小于该产品的起购金额50元, 目前无法购买立即充值' + } + # 实付价格 + total_price = 0 + # productType = '' + + # 买/续/退 字段映射 + order_type = orders[0]['type'] + if order_type == 'NEW': + business_op = 'BUY' + elif order_type == 'RENEW': + business_op = 'RENEW' + elif order_type == 'REFUND': + business_op = 'BUY_REVERSE' + else: + ns_record = { + 'orderid': ns.get('order_id'), + 'ordertype': orders[0]['type'], + 'userid': ns.get('userid'), + 'reason': '支付形式目前仅包含购买,续费,退订' + } + await user_action_record(ns_record) + return { + 'status': False, + 'msg': '线上暂不支持, 请联系售后' + } + try: + # 生成本地订单 + bz_ns = {} + bz_ns['id'] = uuid() + bz_ns['order_status'] = '0' + bz_ns['business_op'] = business_op + bz_ns['userid'] = ns.get('userid') + bz_ns['customerid'] = orgid[0]['id'] + bz_ns['order_date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + bz_ns['thirdparty_order'] = ns.get('order_id') + bz_ns['source'] = '百度智能云' + # bz_ns['originalprice'] = orders[0]['price'] + bz_ns['originalprice'] = sum(i['catalogPrice'] for i in serviceType) + bz_ns['provider_orderid'] = ns.get('order_id') + bz_ns['ordertype'] = orders[0]['productType'] + bz_ns['servicename'] = orders[0]['serviceType'] + bz_ns['autoreneworder'] = '1' if orders[0]['autoRenewOrder'] else '0' + if ns.get('specdataid'): + bz_ns['specdataid'] = ns['specdataid'] + await sor.C('bz_order', bz_ns) + for i in serviceType: + # if i['productType'] == 'prepay': + # # 预付费 + # productType = 'prepay' + # financePrice = 0 + # 获取产品id + product = await sor.R('product', {'providerpid': 'baidu_' + i['serviceType'], 'del_flg': '0'}) + if not product: + return { + 'status': False, + 'msg': '未配置该产品, 请联系售后处理' + } + # 获取协议 + saleprotocol_to_person = await sor.R('saleprotocol', + {'bid_orgid': orgid[0]['id'], 'offer_orgid': orgid[0]['parentid'], + 'del_flg': '0'}) + # 等于空就代表这个客户没有特殊折扣,就要找到买方为*的协议 + saleprotocol_to_all = await sor.R('saleprotocol', {'bid_orgid': '*', 'offer_orgid': orgid[0]['parentid'], + 'del_flg': '0', 'salemode': '0'}) + + if saleprotocol_to_person: + product_salemode = await sor.R('product_salemode', + {'protocolid': saleprotocol_to_person[0]['id'], + 'productid': product[0]['id'], + 'del_flg': '0'}) + if not product_salemode: + product_salemode = await sor.R('product_salemode', + {'protocolid': saleprotocol_to_all[0]['id'], + 'productid': product[0]['id'], + 'del_flg': '0'}) + else: + product_salemode = await sor.R('product_salemode', + {'protocolid': saleprotocol_to_all[0]['id'], + 'productid': product[0]['id'], + 'del_flg': '0'}) + if not product_salemode: + return { + 'status': False, + 'msg': '还未上线这个产品的协议配置' + } + supply_price = i['itemFee']['price'] if i.get('itemFee') else i['catalogPrice'] + financePrice = abs(supply_price * product_salemode[0]['discount']) + total_price += financePrice + + # 添加订单子表 + nss = {} + nss['id'] = uuid() + nss['orderid'] = bz_ns['id'] + nss['productid'] = product[0]['id'] + nss['providerid'] = product[0]['providerid'] + if i['count'] > 1: + nss['list_price'] = abs(i['realCatalogPrice'] / i['count']) + else: + nss['list_price'] = abs(i['realCatalogPrice']) + nss['discount'] = product_salemode[0]['discount'] + nss['quantity'] = i['count'] + nss['price'] = abs(round(nss['list_price'] * product_salemode[0]['discount'], 2)) + # 计算总价 + # nss['amount'] = round(total_price, 2) + nss['amount'] = abs(round(nss['price'] * nss['quantity'], 2)) + nss['chargemode'] = i.get('productType') + nss['servicename'] = i.get('serviceType') + nss['chargeduration'] = i.get('time') + nss['unit'] = i.get('timeUnit') + nss['resourceids'] = ','.join(i['shortIds']) if i.get('shortIds') else '' + nss['orderkey'] = i.get('key') + + # 如果是续费订单 由于没有返回日期, 重新计算日期 + if order_type == 'RENEW': + history_time_sql = "select resourcestarttime, resourceendtime from order_goods where FIND_IN_SET('%s', resourceids) order by resourceendtime desc;" % \ + nss['resourceids'] + history_time = await sor.sqlExe(history_time_sql, {}) + new_end_time = await cal_expire_time(history_time=history_time[0]['resourceendtime'], + chargeduration=nss['chargeduration'], unit=nss['unit']) + # 开始日期不变 更新到期日期 + nss['resourcestarttime'] = history_time[0]['resourcestarttime'] + nss['resourceendtime'] = new_end_time + else: + if i.get('resourceStartTime'): + nss['resourcestarttime'] = await time_convert(i.get('resourceStartTime')) + else: + nss['resourcestarttime'] = await time_convert(orders[0]['updateTime']) + + if i.get('resourceEndTime'): + nss['resourceendtime'] = await time_convert(i.get('resourceEndTime')) + + # 后付费没有资源结束时间 + if i.get('productType') == 'prepay': + end_time = await time_convert(orders[0]['updateTime']) + nss['resourceendtime'] = await cal_expire_time(history_time=end_time, + chargeduration=nss['chargeduration'], + unit=nss['unit']) + else: + nss['resourceendtime'] = None + + await sor.C('order_goods', nss) + + # 循环后更新订单中总价 + await sor.U('bz_order', {'id': bz_ns['id'], 'amount': round(total_price, 2)}) + except Exception as e: + await baidu_order_cancel({'baidu_id': baidu_users[0]['baidu_id'], 'order_id': ns.get('order_id')}) + ns_record = { + 'orderid': ns.get('order_id'), + 'ordertype': orders[0]['type'], + 'userid': ns.get('userid'), + 'reason': '发生错误, %s' % str(e)[:100] + } + await user_action_record(ns_record) + import traceback + with open('baiducloud_err.txt', 'w') as f: + f.write(str(e)+ traceback.format_exc()) + traceback.print_exc() + await sor.rollback() + return { + 'status': False, + 'msg': '产品错误, 请联系售后' + } + + # 判断用户账户余额是否足够支付 + try: + count = await getCustomerBalance(sor, orgid[0]['id']) + if order_type == 'REFUND': + count = total_price + 0.1 + + if round(total_price,2) <= count: + #判断预付费或者后付费 + if productType == 'prepay' or productType == 'postpay': + # 调用扣费接口 + affirmbz_order_ns = { + 'sor': sor, + 'orderid': bz_ns['id'], + 'order_type': order_type + } + affirmbz_order_res = await affirmbz_order(affirmbz_order_ns) + if not affirmbz_order_res['status']: + # if True: + await sor.rollback() + ns_record = { + 'orderid': ns.get('order_id'), + 'ordertype': orders[0]['type'], + 'userid': ns.get('userid'), + 'reason': '支付错误, 请联系售后, %s' % affirmbz_order_res.get('msg') + } + await user_action_record(ns_record) + return { + 'status': False, + 'msg': '支付错误, 请联系售后' + } + + # 预配置local_refund用于本地操作 + if order_type == 'REFUND' and not ns.get('local_refund'): + return { + 'status': True, + 'msg': '本地退费成功' + } + else: + # 调用支付订单接口 + paydata = {'queryAccountId':baidu_users[0]['baidu_id'],'orderId':ns.get('order_id')} + ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) + url = 'https://billing.baidubce.com/v1/order/pay?%s' % ns_format + method = 'POST' + header = { + "Host": "billing.baidubce.com" + } + header = await get_auth_header(method=method, url=url, header=header) + async with aiohttp_client.request( + method=method, + url=url, + headers=header, + json=paydata) as res: + data_ = await res.json() + if data_ == {'success': True}: + ns_record = { + 'orderid': ns.get('order_id'), + 'ordertype': orders[0]['type'], + 'userid': ns.get('userid'), + 'reason': '购买成功' + } + await user_action_record(ns_record) + ns_cron_job = { + 'id': uuid(), + 'source': 'baidu', + 'orderid': ns.get('order_id'), + 'ordertype': orders[0]['type'], + 'userid': ns.get('userid'), + 'reason': 'buy success' + } + await sor.C('baidu_cron_job', ns_cron_job) + # return { + # 'status': True, + # 'orderid': bz_ns['id'] + # } + else: + await sor.rollback() + await baidu_order_cancel( + {'baidu_id': baidu_users[0]['baidu_id'], 'order_id': ns.get('order_id')}) + ns_record = { + 'orderid': ns.get('order_id'), + 'ordertype': orders[0]['type'], + 'userid': ns.get('userid'), + 'reason': '支付成功后, order_pay接口错误, 回滚, %s' % str(data_)[:400] + } + await user_action_record(ns_record) + return { + 'status': False, + 'msg': '产品分配排队中, 请联系售后详询' + } + else: + # 取消订单 + await sor.rollback() + paydata = {'queryAccountId': baidu_users[0]['baidu_id'], 'orderIds': [ns.get('order_id')]} + ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) + url = 'https://billing.baidubce.com/v1/order/cancel?%s' % ns_format + method = 'POST' + header = { + "Host": "billing.baidubce.com" + } + header = await get_auth_header(method=method, url=url, header=header) + async with aiohttp_client.request( + method=method, + url=url, + headers=header, + json=paydata) as res: + await res.json() + ns_record = { + 'orderid': ns.get('order_id'), + 'ordertype': orders[0]['type'], + 'userid': ns.get('userid'), + 'reason': '无法购买后付费产品' + } + await user_action_record(ns_record) + return {'status': False, 'msg': '无法购买后付费产品'} + else: + #取消订单 + await sor.rollback() + # 余额不足不cancle订单 + # paydata = {'queryAccountId':baidu_users[0]['baidu_id'],'orderIds':[ns.get('order_id')]} + # ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) + # url = 'https://billing.baidubce.com/v1/order/cancel?%s' % ns_format + # method = 'POST' + # header = { + # "Host": "billing.baidubce.com" + # } + # header = await get_auth_header(method=method, url=url, header=header) + # async with aiohttp_client.request( + # method=method, + # url=url, + # headers=header, + # json=paydata) as res: + # await res.json() + ns_record = { + 'orderid': ns.get('order_id'), + 'ordertype': orders[0]['type'], + 'userid': ns.get('userid'), + 'reason': '该账号余额不足,无法完成购买' + } + await user_action_record(ns_record) + + # 发送短信 + sms_send_dict = { + 'time': time.strftime('%Y-%m-%d %H:') + '00:00', + 'productname': '相关服务' + } + await diff_sms_send_save(sor=sor, time_interval=24*60, send_type='用户欠费通知', user_orgid=orgid[0]['id'], sms_send_dict=sms_send_dict) + + return {'status': False,'msg': '该账号余额不足,无法完成购买'} + except Exception as e: + await baidu_order_cancel({'baidu_id': baidu_users[0]['baidu_id'], 'order_id': ns.get('order_id')}) + import traceback + with open('baiducloud_err.txt', 'w') as f: + f.write(str(e)+ traceback.format_exc()) + traceback.print_exc() + await sor.rollback() + return { + 'status': False, + 'msg': '产品错误, 请联系售后' + } + # 更新资源时间 资源id + # if order_type == 'NEW': + # await baidu_new_update_resouce(ns) + return { + 'status': True, + 'orderid': bz_ns['id'], + 'originalprice': bz_ns.get('originalprice'), + 'servicename': bz_ns.get('servicename'), + 'amount': total_price + } + +async def get_order_list_base_page(baidu_id, pageNo=1, pageSize=500): + ns = {'queryAccountId': baidu_id, 'pageNo': pageNo, 'pageSize': pageSize} + method = 'POST' + ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) + url = 'https://billing.baidubce.com/v1/order/list?%s' % ns_format + header = { + "Host": "billing.baidubce.com", + "ContentType": "application/json;charset=UTF-8" + } + header = await get_auth_header(method=method, url=url, header=header) + async with aiohttp_client.request( + method=method, + url=url, + headers=header, + json=ns) as res: + data_orders = await res.json() + return data_orders + + +async def update_baidu_order_list(ns={}): + """ + ns = {'queryAccountId': '139fc7a23b314596ad78b6bb8e7c1503', 'orderType': 'REFUND'} + :return: + """ + db = DBPools() + async with db.sqlorContext('kboss') as sor: + username = None + # 更新机构下全部用户订单信息 + if ns.get('orgid'): + users_find_sql = """SELECT DISTINCT b.baidu_id FROM organization o INNER JOIN users u ON o.id = u.orgid INNER JOIN baidu_users b ON u.id = b.user_id WHERE o.parentid = '%s' AND b.del_flg = '0';""" % ns.get('orgid') + users = await sor.sqlExe(users_find_sql, {}) + + # 更新个人订单信息 + elif ns.get('userid'): + users = await sor.R('baidu_users', {'user_id': ns['userid']}) + username_li = await sor.R('users', {'id': ns['userid']}) + username = username_li[0]['username'] if username_li else None + else: + users = [] + + update_count = 0 + add_count = 0 + for baidu_id in users: + data_orders = await get_order_list_base_page(baidu_id['baidu_id'], pageNo=1, pageSize=1000) + page_num_count = int(data_orders['totalCount'] / data_orders['pageSize']) + 1 + for page_num in range(1, page_num_count + 1): + data_orders = await get_order_list_base_page(baidu_id['baidu_id'], pageNo=page_num, pageSize=1000) + orders = data_orders['orders'] + for item in orders: + updatetime = await time_convert(item.get('updateTime')) if item.get('updateTime') else None + ns_dic = { + "id": uuid(), + "orderid": item.get("uuid"), + "ordertype": item.get("type"), + "accountid": item.get("accountId"), + "servicetype": item.get("serviceType"), + "producttype": item.get("productType"), + "shortids": ','.join(item['shortIds']) if item.get('shortIds') else '', + "price": item.get("price"), + "status": item.get("status"), + "autoreneworder": '1' if item.get("autoRenewOrder") else '0', + "createtime": await time_convert(item.get('createTime')) if item.get( + 'createTime') else None, + "updatetime": updatetime + } + ns_exist_order = { + 'orderid': item.get("uuid") + } + exist_order = await sor.R('baidu_orders', ns_exist_order) + if exist_order and exist_order[0]['updatetime'] != updatetime: + update_refund_sql = """UPDATE baidu_orders SET price = '%s', status = '%s', updatetime = '%s' WHERE orderid = '%s';""" % \ + (item.get("price"), item.get("status"), updatetime, + item.get("uuid")) + await sor.sqlExe(update_refund_sql, {}) + update_count += 1 + + if not exist_order: + await sor.C('baidu_orders', ns_dic) + add_count += 1 + + return { + 'status': True, + 'msg': '同步数据成功, 新增 %s 条, 更新 %s 条' % (add_count, update_count), + 'data': { + 'username': username + } + } + +async def info_test_(ns={}): + # 弃用接口 不再读取整个文件逻辑 + if ns.get('domain_name'): + orgid_li = await sor.R('reseller', {'domain_name': ns.get('domain_name'), 'del_flg': '0'}) + orgid = orgid_li[0]['orgid'] + else: + orgid = 'mIWUHBeeDM8mwAFPIQ8pS' + + # 读取baidu_orders表格 确定状态是renew的订单ID + renew_results = [] + # return {'1': 2} + db = DBPools() + async with db.sqlorContext('kboss') as sor: + renew_sql = """ SELECT bo.*, bs.user_id FROM baidu_orders AS bo LEFT JOIN baidu_users AS bs ON bo.accountid = bs.baidu_id WHERE bo.ordertype = 'RENEW' AND bo.status = 'NEED_CONFIRM' AND bo.del_flg = '0'; """ + # return {'1': renew_sql} + renew_results = await sor.sqlExe(renew_sql, {}) + + try: + renew_status_count = 0 + # 执行 get_baidu_orderlist sor分开运行 + for renew_res in renew_results: + order_id = renew_res.get('orderid') + user_id = renew_res.get('user_id') + + renew_status = await get_baidu_orderlist({'order_id': order_id, 'userid': user_id}) + if renew_status.get('status'): + renew_status_count += 1 + else: + db = DBPools() + async with db.sqlorContext('kboss') as sor: + ns_err_log = { + 'id': uuid(), + 'log_level': 'ERROR', + 'log_content': '续费订单 %s 失败 %s' % (order_id, str(renew_status)), + 'user_id': user_id, + 'request_url': '/baiduc/info_test_.dspy' + } + await sor.C('warn_error_log', ns_err_log) + + except Exception as e: + print(e) + + # 并触发update函数 + update_msg = await update_baidu_order_list({'orgid': orgid}) + + return { + 'status': True, + 'msg': '续费订单执行结束, 触发了%s条数据' % len(renew_results), + 'data': { + 'renew_status_count': renew_status_count, + 'update_msg': update_msg, + } + } + +ret = await info_test_(params_kw) +return ret \ No newline at end of file From 30da50845206708e3c5150e079da780f0e27baeb Mon Sep 17 00:00:00 2001 From: ping <1017253325@qq.com> Date: Fri, 21 Aug 2026 10:17:41 +0800 Subject: [PATCH 5/6] update --- b/baiduc/baidu_confirm_refund_order.dspy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/b/baiduc/baidu_confirm_refund_order.dspy b/b/baiduc/baidu_confirm_refund_order.dspy index fb13695..42737c4 100644 --- a/b/baiduc/baidu_confirm_refund_order.dspy +++ b/b/baiduc/baidu_confirm_refund_order.dspy @@ -777,6 +777,7 @@ async def baidu_confirm_refund_order(ns={}): db = DBPools() async with db.sqlorContext('kboss') as sor: + orderss = (await sor.R('bz_order', {'orderid': ns.get('order_id')}))[1] users = await sor.R('baidu_users', {'user_id': ns['userid']}) ns['baidu_id'] = users[0]['baidu_id'] if users else None if not ns['baidu_id']: @@ -794,6 +795,7 @@ async def baidu_confirm_refund_order(ns={}): db = DBPools() async with db.sqlorContext('kboss') as sor: refund_status_li = await sor.R('baidu_orders', {'orderid': order_id}) + refund_status_li_info = await sor.R('baidu_orders', {'orderid': order_id})[2] refundstatus = refund_status_li[0]['refundstatus'] refund_id = refund_status_li[0]['id'] @@ -879,7 +881,7 @@ async def baidu_confirm_refund_order(ns={}): # 分割 # 增加延迟 - await asyncio.sleep(5) + await asyncio.sleep(10) # 把 NEED_CONFIRM的本地库改为CREATED await update_baidu_order_list({'userid': ns.get('userid')}) From fe79a81552da2de783e9b2d0fc5fefbb798786d4 Mon Sep 17 00:00:00 2001 From: ping <1017253325@qq.com> Date: Fri, 21 Aug 2026 11:00:40 +0800 Subject: [PATCH 6/6] update --- b/ali/DescribeRegions.dspy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/b/ali/DescribeRegions.dspy b/b/ali/DescribeRegions.dspy index 0456c6b..d113422 100644 --- a/b/ali/DescribeRegions.dspy +++ b/b/ali/DescribeRegions.dspy @@ -73,7 +73,7 @@ class KYYAliECS: destination_resource=ns.get('destination_resource'), spot_duration=ns.get('spot_duration'), spot_strategy=ns.get('spot_strategy'), - instance_charge_type=ns.get('instance_charge_type') + #instance_charge_type=ns.get('instance_charge_type') ) runtime = util_models.RuntimeOptions() try: @@ -122,7 +122,7 @@ class KYYAliECS: minimum_baseline_credit=ns.get('minimum_baseline_credit'), minimum_initial_credit=ns.get('minimum_initial_credit'), max_results=ns.get('max_results'), - next_token=ns.get('next_token'), + #next_token=ns.get('next_token'), ) runtime = util_models.RuntimeOptions() try: