From 7917ac2d3dedb2f5930d7fd38326cb93d617021e Mon Sep 17 00:00:00 2001 From: ping <1017253325@qq.com> Date: Mon, 22 Sep 2025 15:20:55 +0800 Subject: [PATCH] update refund baidu --- b/baiduc/baidu_confirm_refund_order.dspy | 240 ++++++++++++++++------- 1 file changed, 173 insertions(+), 67 deletions(-) diff --git a/b/baiduc/baidu_confirm_refund_order.dspy b/b/baiduc/baidu_confirm_refund_order.dspy index a469a6c..27053a4 100644 --- a/b/baiduc/baidu_confirm_refund_order.dspy +++ b/b/baiduc/baidu_confirm_refund_order.dspy @@ -1,6 +1,7 @@ async def user_action_record(ns={}): + ns_dic_id = uuid() if not ns.get('id') else ns.get('id') ns_dic = { - 'id': uuid(), + 'id': ns_dic_id, 'source': '百度智能云', 'orderid': ns.get('orderid'), 'ordertype': ns.get('ordertype'), @@ -430,87 +431,192 @@ async def get_baidu_orderlist(ns={}): f.write(str(e)+ traceback.format_exc()) traceback.print_exc() -async def baidu_confirm_refund_order(ns={}): +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: - refund_status_li = await sor.R('baidu_orders', {'orderid': ns.get('order_id')}) - refundstatus = refund_status_li[0]['refundstatus'] - refund_id = refund_status_li[0]['id'] + 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, {}) - if not refundstatus: - # data_ = {} - # 调用支付订单接口 - paydata = {'queryAccountId': ns.get('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}: - # if True: - ns_record = { - 'orderid': ns.get('order_id'), - 'ordertype': 'REFUND', - 'userid': ns.get('userid'), - 'reason': '远程退款成功' - } - await user_action_record(ns_record) - db = DBPools() - async with db.sqlorContext('kboss') as sor: - await sor.U('baidu_orders', {'id': refund_id, 'refundstatus': '1'}) - - # 增加延迟 - import asyncio - await asyncio.sleep(10) + # 更新个人订单信息 + 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: - ns_record = { - 'orderid': ns.get('order_id'), - 'ordertype': 'REFUND', - 'userid': ns.get('userid'), - 'reason': '产品退费失败, %s' % str(data_)[:400] - } - await user_action_record(ns_record) - return { - 'status': False, - 'msg': '产品退款出错!%s' % str(data_)[:400] - } + 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 - if refundstatus == '2': return { 'status': True, - 'msg': '已退款成功' + 'msg': '同步数据成功, 新增 %s 条, 更新 %s 条' % (add_count, update_count), + 'data': { + 'username': username + } } - # 获取created状态后再去退款 - local_refund_status = await get_baidu_orderlist({'order_id': ns.get('order_id'), 'userid': ns.get('user_id')}) - print('local_refund_status', local_refund_status) - if local_refund_status.get('status'): +async def baidu_confirm_refund_order(ns={}): + # 把 NEED_CONFIRM的订单同步到本地库,用于后续状态更新 + await update_baidu_order_list({'userid': ns.get('userid')}) + + db = DBPools() + async with db.sqlorContext('kboss') as sor: + 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']: + return { + 'status': False, + 'msg': '用户 %s 未绑定百度智能云账号' % ns.get('userid') + } + + orders = json.loads(ns.get('order_id')) if isinstance(ns.get('order_id'), str) else ns.get('order_id') + + for order_id in orders: db = DBPools() async with db.sqlorContext('kboss') as sor: - await sor.U('baidu_orders', {'id': refund_id, 'refundstatus': '2'}) + refund_status_li = await sor.R('baidu_orders', {'orderid': order_id}) + refundstatus = refund_status_li[0]['refundstatus'] + refund_id = refund_status_li[0]['id'] - return { - 'status': True, - 'msg': '百度云给平台退款成功,平台给客户退款成功' - } - else: - if local_refund_status.get('msg') == 'delay_order': + if not refundstatus: + # data_ = {} + # 调用支付订单接口 + paydata = {'queryAccountId': ns.get('baidu_id'), 'orderId': 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}: + # if True: + ns_record = { + 'orderid': uuid(), + 'ordertype': 'REFUND', + 'userid': ns.get('userid'), + 'reason': '远程退款成功' + } + await user_action_record(ns_record) + db = DBPools() + async with db.sqlorContext('kboss') as sor: + await sor.U('baidu_orders', {'id': refund_id, 'refundstatus': '1'}) + + # 增加延迟 + import asyncio + await asyncio.sleep(1) + else: + ns_record = { + 'orderid': order_id, + 'ordertype': 'REFUND', + 'userid': ns.get('userid'), + 'reason': '产品退费失败, %s' % str(data_)[:400] + } + await user_action_record(ns_record) + return { + 'status': False, + 'msg': '产品退款出错!%s' % str(data_)[:400] + } + + if refundstatus == '2': + return { + 'status': True, + 'msg': '已退款成功' + } + + # 获取created状态后再去退款 + local_refund_status = await get_baidu_orderlist({'order_id': order_id, 'userid': ns.get('user_id')}) + print('local_refund_status', local_refund_status) + if local_refund_status.get('status'): + db = DBPools() + async with db.sqlorContext('kboss') as sor: + await sor.U('baidu_orders', {'id': refund_id, 'refundstatus': '2'}) + await sor.U('user_action', {'id': ns_record.get('id'), 'ordertype': 'REFUND', 'reason': '远程退款成功, 本地客户退款成功'}) + + return { + 'status': True, + 'msg': '百度云给平台退款成功,平台给客户退款成功' + } + else: + if local_refund_status.get('msg') == 'delay_order': + return { + 'status': False, + 'msg': '百度远程订单还未生成, 请十秒后重试' + } return { 'status': False, - 'msg': '百度远程订单还未生成, 请十秒后重试' + 'msg': '百度云退款成功,本机构给客户退款出错!' } - return { - 'status': False, - 'msg': '百度云退款成功,本机构给客户退款出错!' - } ret = await baidu_confirm_refund_order(params_kw) return ret \ No newline at end of file