diff --git a/merchant_ops/views_orders.py b/merchant_ops/views_orders.py index b148f2a..3b0ae19 100644 --- a/merchant_ops/views_orders.py +++ b/merchant_ops/views_orders.py @@ -16,7 +16,6 @@ from merchant_ops.services.order_query import ( staff_can_view_all_orders, staff_order_ext_qs, ) -from merchant_ops.services.order_enrich import staff_order_list_item from merchant_ops.services.audit import audit_staff from merchant_ops.services.dispatch import staff_dispatch_order from merchant_ops.services.stats import bump_cancel_count, bump_penalty_count @@ -73,9 +72,13 @@ class StaffOrderListView(APIView): total_count = base_qs.count() start = (page - 1) * page_size - page_qs = base_qs.order_by('-Order__CreateTime')[start:start + page_size] + page_qs = list(base_qs.order_by('-Order__CreateTime')[start:start + page_size]) - order_list = [staff_order_list_item(ext) for ext in page_qs] + from jituan.services.club_context import resolve_club_id_from_request + from orders.services.merchant_order_list_enrich import enrich_merchant_order_list_items + + club_id = resolve_club_id_from_request(request) + order_list = enrich_merchant_order_list_items(page_qs, club_id=club_id) return Response({ 'code': 0, diff --git a/orders/services/merchant_order_list_enrich.py b/orders/services/merchant_order_list_enrich.py new file mode 100644 index 0000000..fcce274 --- /dev/null +++ b/orders/services/merchant_order_list_enrich.py @@ -0,0 +1,154 @@ +"""商家订单列表增强:标签、头像、优质商家等与抢单池 /ddhq 对齐。""" +import json +import logging + +from jituan.services.identity_tag import SHENFEN_DASHOU, SHENFEN_SHANGJIA, batch_identity_tags +from orders.models import MerchantOrderExt +from rank.models import DingdanBiaoqian, YonghuChenghao +from users.business_models import User +from users.models import UserShangjia +from backend.utils import fmt_datetime + +logger = logging.getLogger(__name__) + + +def _parse_texiao_json(texiao_miaoshu): + if not texiao_miaoshu: + return {} + try: + return json.loads(texiao_miaoshu) + except Exception: + return {} + + +def _chenghao_tag(ch): + return { + 'id': ch.id, + 'mingcheng': ch.mingcheng, + 'texiao_json': _parse_texiao_json(ch.texiao_miaoshu), + } + + +def enrich_merchant_order_list_items(ext_list, club_id=None): + """ + 批量格式化商家订单列表项。 + ext_list: MerchantOrderExt 实例列表(已 select_related Order) + """ + if not ext_list: + return [] + + order_ids = [] + merchant_uids = set() + zhiding_ids = set() + pairs = [] + + for ext in ext_list: + o = ext.Order + order_ids.append(o.OrderID) + if ext.MerchantID: + merchant_uids.add(ext.MerchantID) + zid = o.AssignedID or '' + if zid: + zhiding_ids.add(zid) + + # 订单需求标签 + xuqiu_tags_map = {} + if order_ids: + try: + for dbq in DingdanBiaoqian.query.filter(dingdan_id__in=order_ids).select_related('chenghao'): + xuqiu_tags_map.setdefault(dbq.dingdan_id, []).append(_chenghao_tag(dbq.chenghao)) + except Exception as e: + logger.error('商家订单列表-需求标签查询失败: %s', e, exc_info=True) + + uid_set = set(merchant_uids) | zhiding_ids + user_id_map = {} + user_avatar_map = {} + user_nick_map = {} + if uid_set: + for u in User.query.filter(UserUID__in=uid_set).select_related('ShopProfile', 'DashouProfile'): + user_id_map[u.UserUID] = u.UserUUID + user_avatar_map[u.UserUID] = (u.Avatar or '').strip() + nick = '' + if hasattr(u, 'ShopProfile') and u.ShopProfile: + nick = u.ShopProfile.nicheng or '' + user_nick_map[u.UserUID] = nick + + user_main_ids = list(user_id_map.values()) + user_tags_map = {} + if user_main_ids: + for uc in YonghuChenghao.query.filter(yonghu_id__in=user_main_ids).select_related('chenghao'): + user_tags_map.setdefault(uc.yonghu_id, []).append(uc.chenghao) + + youzhi_map = {} + if merchant_uids: + for row in UserShangjia.query.filter(user__UserUID__in=merchant_uids).values( + 'user__UserUID', 'is_youzhi_shangjia' + ): + youzhi_map[row['user__UserUID']] = bool(row['is_youzhi_shangjia']) + + for ext in ext_list: + o = ext.Order + oid = o.OrderID + sj_uid = ext.MerchantID or '' + zid = o.AssignedID or '' + if zid: + pairs.append((zid, SHENFEN_DASHOU)) + if sj_uid: + pairs.append((sj_uid, SHENFEN_SHANGJIA)) + + identity_tag_map = batch_identity_tags(club_id, pairs) if (club_id and pairs) else {} + + zhiding_info = {} + if zhiding_ids: + for u in User.query.filter(UserUID__in=zhiding_ids).select_related('DashouProfile'): + nicheng = '' + if hasattr(u, 'DashouProfile') and u.DashouProfile: + nicheng = u.DashouProfile.nicheng or '' + zhiding_info[u.UserUID] = { + 'avatar': u.Avatar or '', + 'nicheng': nicheng, + } + + result = [] + for ext in ext_list: + o = ext.Order + oid = o.OrderID + sj_uid = ext.MerchantID or '' + ct = fmt_datetime(o.CreateTime) + + shangjia_biaoqian = [] + if sj_uid and sj_uid in user_id_map: + uid = user_id_map[sj_uid] + for ch in user_tags_map.get(uid, []): + if ch.leixing == 'shangjia': + shangjia_biaoqian.append(_chenghao_tag(ch)) + + zid = o.AssignedID or '' + zinfo = zhiding_info.get(zid, {}) + + result.append({ + 'dingdan_id': oid, + 'zhuangtai': o.Status, + 'jine': float(o.Amount) if o.Amount else 0.0, + 'jieshao': o.Description or '', + 'beizhu': o.Remark or '', + 'nicheng': o.Nickname or '', + 'leixing_id': o.ProductTypeID, + 'tupian': o.ImageURL or '', + 'jiedan_dashou_id': o.PlayerID or '', + 'waibu_dingdan_id': o.ExternalOrderID or '', + 'creat_time': ct, + 'create_time': ct, + 'sjnicheng': ext.MerchantNickname or user_nick_map.get(sj_uid, '') or '未知商家', + 'shangjia_id': sj_uid, + 'sj_avatar': user_avatar_map.get(sj_uid, ''), + 'xuqiu_biaoqian': xuqiu_tags_map.get(oid, []), + 'shangjia_biaoqian': shangjia_biaoqian, + 'shangjia_identity_biaoqian': identity_tag_map.get((sj_uid, SHENFEN_SHANGJIA), []) if sj_uid else [], + 'shangjia_youzhi': bool(youzhi_map.get(sj_uid)) if sj_uid else False, + 'zhiding_uid': zid, + 'zhiding_avatar': zinfo.get('avatar', ''), + 'zhiding_nicheng': zinfo.get('nicheng', ''), + }) + + return result diff --git a/orders/views.py b/orders/views.py index 0d191da..e67031a 100644 --- a/orders/views.py +++ b/orders/views.py @@ -2120,25 +2120,13 @@ class ShangjiaDingdanHuoquView(APIView): total_count = base_qs.count() start_index = (page - 1) * page_size end_index = start_index + page_size - current_page_orders = base_qs.order_by('-Order__CreateTime')[start_index:end_index] + current_page_orders = list(base_qs.order_by('-Order__CreateTime')[start_index:end_index]) - # 10. 构建返回数据 - order_list = [] - for shangjia_order in current_page_orders: - order = shangjia_order.Order - order_data = { - 'dingdan_id': order.OrderID, - 'zhuangtai': order.Status, - 'jine': float(order.Amount) if order.Amount else 0.0, - 'jieshao': order.Description or '', - 'beizhu': order.Remark or '', - 'nicheng': order.Nickname or '', - 'leixing_id': order.ProductTypeID, - 'tupian': order.ImageURL or '', - 'jiedan_dashou_id': order.PlayerID or '', - **datetime_aliases(order.CreateTime), - } - order_list.append(order_data) + from jituan.services.club_context import resolve_club_id_from_request + from orders.services.merchant_order_list_enrich import enrich_merchant_order_list_items + + club_id = resolve_club_id_from_request(request) + order_list = enrich_merchant_order_list_items(current_page_orders, club_id=club_id) # 11. 判断是否还有更多 current_page_count = len(current_page_orders)