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 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 } } ret = await update_baidu_order_list(params_kw) return ret