perf: P1 性能优化批量修复 + kefu 视图拆分
P1 性能优化(避免循环内 N+1 / N 次 DB 查询): - shop_order_views._batch_images: 移除 ThreadPoolExecutor 掩盖的 N 次查询,改单次批量 + Python 侧分组 - product_query.DashouHuiyuanList: 5N 查询 -> 3 次批量预取 + 本地闭包判断 - roles.GetRolePermissionView / 用户列表: 循环内 RolePermission/Permission/UserRole/Role -> 批量 __in 预取 - guanli / zuzhang 杜次分红 4.2/4.3: 循环内 update_or_create + 单条 delete -> bulk_create + bulk_update + 批量 delete - admin_config QQ 群配置: 循环内 exists/first/save/create -> 批量预取 + bulk_create + bulk_update - jituan 服务层多处合并统计查询、批量预取 map - rank 多处循环 N+1 改批量预取 - backend 多处循环内 count/create 改批量 - config/orders/merchant_ops 多处循环 N+1 改批量预取 其他改动: - users/views/kefu.py 拆分为 kefu_base/kefu_dashou/kefu_orders/kefu_punishment/kefu_withdraw 5 个文件 - 删除遗留脚本 check_prod_uid.py / create_rbac_tables.sql
This commit is contained in:
@@ -193,13 +193,13 @@ def send_group_message(
|
||||
def check_user_permission(identity_type, uid, order):
|
||||
"""验证用户身份、账号状态、以及是否属于该订单"""
|
||||
try:
|
||||
user = User.query.get(UserUID=uid)
|
||||
user = User.query.select_related('DashouProfile').get(UserUID=uid)
|
||||
except User.DoesNotExist:
|
||||
return False, '用户不存在'
|
||||
|
||||
if identity_type == 'PlayerID':
|
||||
try:
|
||||
dashou = UserDashou.query.get(user=user)
|
||||
dashou = user.DashouProfile
|
||||
if dashou.zhanghaozhuangtai != 1 :
|
||||
return False, '打手账号已被封禁或状态异常'
|
||||
except UserDashou.DoesNotExist:
|
||||
@@ -516,14 +516,16 @@ class LianTongDingDanZhuangTaiPiLiangView(APIView):
|
||||
return Response({'code': 400, 'msg': 'order_ids 格式错误'})
|
||||
|
||||
uid = request.user.UserUID
|
||||
# 批量查询订单,避免循环内 N+1
|
||||
oids = [str(oid).strip() for oid in order_ids[:20] if str(oid).strip()]
|
||||
orders_map = {
|
||||
o.OrderID: o
|
||||
for o in Order.query.select_related('pingtai_kuozhan', 'shangjia_kuozhan').filter(OrderID__in=oids)
|
||||
}
|
||||
result = {}
|
||||
for oid in order_ids[:20]:
|
||||
oid = str(oid).strip()
|
||||
if not oid:
|
||||
continue
|
||||
try:
|
||||
order = Order.query.select_related('pingtai_kuozhan', 'shangjia_kuozhan').get(OrderID=oid)
|
||||
except Order.DoesNotExist:
|
||||
for oid in oids:
|
||||
order = orders_map.get(oid)
|
||||
if not order:
|
||||
continue
|
||||
for identity in ('PlayerID', 'shangjia', 'boss'):
|
||||
valid, _ = check_user_permission(identity, uid, order)
|
||||
|
||||
Reference in New Issue
Block a user