This commit is contained in:
hrx 2025-09-22 17:57:45 +08:00
commit b8d88ec75d
3 changed files with 187 additions and 75 deletions

View File

@ -1,6 +1,7 @@
async def user_action_record(ns={}): async def user_action_record(ns={}):
ns_dic_id = uuid() if not ns.get('id') else ns.get('id')
ns_dic = { ns_dic = {
'id': uuid(), 'id': ns_dic_id,
'source': '百度智能云', 'source': '百度智能云',
'orderid': ns.get('orderid'), 'orderid': ns.get('orderid'),
'ordertype': ns.get('ordertype'), 'ordertype': ns.get('ordertype'),
@ -430,17 +431,121 @@ async def get_baidu_orderlist(ns={}):
f.write(str(e)+ traceback.format_exc()) f.write(str(e)+ traceback.format_exc())
traceback.print_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() db = DBPools()
async with db.sqlorContext('kboss') as sor: async with db.sqlorContext('kboss') as sor:
refund_status_li = await sor.R('baidu_orders', {'orderid': ns.get('order_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, {})
# 更新个人订单信息
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_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:
refund_status_li = await sor.R('baidu_orders', {'orderid': order_id})
refundstatus = refund_status_li[0]['refundstatus'] refundstatus = refund_status_li[0]['refundstatus']
refund_id = refund_status_li[0]['id'] refund_id = refund_status_li[0]['id']
if not refundstatus: if not refundstatus:
# data_ = {} # data_ = {}
# 调用支付订单接口 # 调用支付订单接口
paydata = {'queryAccountId': ns.get('baidu_id'), 'orderId':ns.get('order_id')} paydata = {'queryAccountId': ns.get('baidu_id'), 'orderId': order_id}
ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()]) ns_format = '&'.join(['%s=%s' % (k, v) for k, v in ns.items()])
url = 'https://billing.baidubce.com/v1/order/pay?%s' % ns_format url = 'https://billing.baidubce.com/v1/order/pay?%s' % ns_format
method = 'POST' method = 'POST'
@ -457,7 +562,7 @@ async def baidu_confirm_refund_order(ns={}):
if data_ == {'success': True}: if data_ == {'success': True}:
# if True: # if True:
ns_record = { ns_record = {
'orderid': ns.get('order_id'), 'orderid': uuid(),
'ordertype': 'REFUND', 'ordertype': 'REFUND',
'userid': ns.get('userid'), 'userid': ns.get('userid'),
'reason': '远程退款成功' 'reason': '远程退款成功'
@ -469,10 +574,13 @@ async def baidu_confirm_refund_order(ns={}):
# 增加延迟 # 增加延迟
import asyncio import asyncio
await asyncio.sleep(10) await asyncio.sleep(1)
# 把 NEED_CONFIRM的本地库改为CREATED
await update_baidu_order_list({'userid': ns.get('userid')})
else: else:
ns_record = { ns_record = {
'orderid': ns.get('order_id'), 'orderid': order_id,
'ordertype': 'REFUND', 'ordertype': 'REFUND',
'userid': ns.get('userid'), 'userid': ns.get('userid'),
'reason': '产品退费失败, %s' % str(data_)[:400] 'reason': '产品退费失败, %s' % str(data_)[:400]
@ -490,12 +598,13 @@ async def baidu_confirm_refund_order(ns={}):
} }
# 获取created状态后再去退款 # 获取created状态后再去退款
local_refund_status = await get_baidu_orderlist({'order_id': ns.get('order_id'), 'userid': ns.get('user_id')}) local_refund_status = await get_baidu_orderlist({'order_id': order_id, 'userid': ns.get('userid')})
print('local_refund_status', local_refund_status) print('local_refund_status', local_refund_status)
if local_refund_status.get('status'): if local_refund_status.get('status'):
db = DBPools() db = DBPools()
async with db.sqlorContext('kboss') as sor: async with db.sqlorContext('kboss') as sor:
await sor.U('baidu_orders', {'id': refund_id, 'refundstatus': '2'}) await sor.U('baidu_orders', {'id': refund_id, 'refundstatus': '2'})
await sor.U('user_action', {'id': ns_record.get('id'), 'ordertype': 'REFUND', 'reason': '远程退款成功, 本地客户退款成功'})
return { return {
'status': True, 'status': True,

View File

@ -1,6 +1,7 @@
async def user_action_record(ns={}): async def user_action_record(ns={}):
ns_dic_id = uuid() if not ns.get('id') else ns.get('id')
ns_dic = { ns_dic = {
'id': uuid(), 'id': ns_dic_id,
'source': '百度智能云', 'source': '百度智能云',
'orderid': ns.get('orderid'), 'orderid': ns.get('orderid'),
'ordertype': ns.get('ordertype'), 'ordertype': ns.get('ordertype'),
@ -225,9 +226,10 @@ async def baidu_confirm_refund_order(ns={}):
if data_ == {'success': True}: if data_ == {'success': True}:
# if True: # if True:
ns_record = { ns_record = {
'id': uuid(),
'orderid': ns.get('order_id'), 'orderid': ns.get('order_id'),
'ordertype': 'REFUND', 'ordertype': 'REFUND',
'userid': ns.get('userid'), 'userid': ns.get('user_id'),
'reason': '远程退款成功' 'reason': '远程退款成功'
} }
await user_action_record(ns_record) await user_action_record(ns_record)
@ -264,6 +266,7 @@ async def baidu_confirm_refund_order(ns={}):
db = DBPools() db = DBPools()
async with db.sqlorContext('kboss') as sor: async with db.sqlorContext('kboss') as sor:
await sor.U('baidu_orders', {'id': refund_id, 'refundstatus': '2'}) await sor.U('baidu_orders', {'id': refund_id, 'refundstatus': '2'})
await sor.U('user_action', {'id': ns_record.get('id'), 'ordertype': 'REFUND', 'reason': '远程退款成功, 本地客户退款成功'})
return { return {
'status': True, 'status': True,
@ -614,16 +617,16 @@ async def get_baidu_orderlist(ns={}):
await sor.U('bz_order', {'id': bz_ns['id'], 'amount': round(total_price, 2)}) await sor.U('bz_order', {'id': bz_ns['id'], 'amount': round(total_price, 2)})
except Exception as e: except Exception as e:
await baidu_order_cancel({'baidu_id': baidu_users[0]['baidu_id'], 'order_id': ns.get('order_id')}) await baidu_order_cancel({'baidu_id': baidu_users[0]['baidu_id'], 'order_id': ns.get('order_id')})
import traceback
ns_record = { ns_record = {
'orderid': ns.get('order_id'), 'orderid': ns.get('order_id'),
'ordertype': orders[0]['type'], 'ordertype': orders[0]['type'],
'userid': ns.get('userid'), 'userid': ns.get('userid'),
'reason': '发生错误, %s' % str(e)[:100] 'reason': '发生错误, %s' % str(traceback.format_exc())
} }
await user_action_record(ns_record) await user_action_record(ns_record)
import traceback
with open('baiducloud_err.txt', 'w') as f: with open('baiducloud_err.txt', 'w') as f:
f.write(str(e)+ traceback.format_exc()) f.write(str(e) + str(traceback.format_exc()))
traceback.print_exc() traceback.print_exc()
await sor.rollback() await sor.rollback()
return { return {

View File

@ -12,7 +12,7 @@
<script> <script>
import { baiducloudAPI } from '@/api/BaiDuTokenapi' import { baiducloudAPI } from '@/api/BaiDuTokenapi'
import { reqBaiduJudgePrice } from '@/api/baidu' import { reqBaiduJudgePrice, reqConfirmBtn } from '@/api/baidu'
export default { export default {
name: 'baiduProductShow', name: 'baiduProductShow',
@ -75,7 +75,7 @@ export default {
// 3. ID () // 3. ID ()
// ID退 // ID退
const orderId = String(uuidListArray[0]); const orderId = uuidListArray;
// ID // ID
// const orderId = uuidListArray.join(','); // const orderId = uuidListArray.join(',');
@ -99,7 +99,7 @@ export default {
this.loading = true; this.loading = true;
// 7. 退API // 7. 退API
reqBaiduJudgePrice(payload) reqConfirmBtn(payload)
.then((res) => { .then((res) => {
console.log("调用 reqBaiduJudgePrice 接口返回:", res); console.log("调用 reqBaiduJudgePrice 接口返回:", res);
if (res.status) { // status true if (res.status) { // status true