feat: 商家订单准确统计、客服备注与按客服筛选

This commit is contained in:
XingQue
2026-06-27 05:17:36 +08:00
parent 2445b39f3b
commit fdecf2fe3c
10 changed files with 304 additions and 15 deletions

View File

@@ -19,6 +19,7 @@ from merchant_ops.services.order_query import (
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
from merchant_ops.models import MerchantOrderDispatch
from orders.models import MerchantOrderExt
from orders.views import (
ShangjiaDingdanXiangqingView, ShangjiaJiesuanView, ShangjiaChexiaoView,
@@ -69,6 +70,17 @@ class StaffOrderListView(APIView):
pending_qs = staff_order_ext_qs(member, [8])
pending_count = pending_qs.count()
from orders.services.merchant_order_stats import build_merchant_order_stats
stats_qs = staff_order_ext_qs(member, None)
stats_qs = staff_apply_order_filters(stats_qs, data)
order_stats = build_merchant_order_stats(stats_qs)
can_finance = member_has_perm(member, 'finance_view')
if not can_finance:
for k in list(order_stats.keys()):
if k.endswith('_amount'):
order_stats[k] = '0.00'
total_count = base_qs.count()
start = (page - 1) * page_size
@@ -87,7 +99,10 @@ class StaffOrderListView(APIView):
'list': order_list,
'has_more': start + len(page_qs) < total_count,
'total': total_count,
'pending_count': pending_count,
'pending_count': order_stats['pending_count'],
'pending_amount': order_stats['pending_amount'] if can_finance else '0.00',
'order_stats': order_stats,
'can_view_finance': can_finance,
'view_scope': 'all' if staff_can_view_all_orders(member) else 'self',
},
})
@@ -95,6 +110,56 @@ class StaffOrderListView(APIView):
return _err(e)
class StaffOrderStatsView(APIView):
"""子客服/老板视角订单统计 POST /yonghu/merchant-staff/order/stats"""
permission_classes = [IsAuthenticated]
def post(self, request):
try:
member = _require_staff(request)
if not member_has_perm(member, 'order_view_all') and not member_has_perm(member, 'order_view_self'):
raise StaffAuthError(403, '无订单查看权限')
data = request.data or {}
from orders.services.merchant_order_stats import build_merchant_order_stats, filter_by_staff_member
from orders.models import MerchantOrderExt
filter_payload = dict(data)
filter_payload['_merchant_id_filter'] = member.merchant_id
qs = MerchantOrderExt.query.filter(
MerchantID=member.merchant_id,
).select_related('Order')
if not staff_can_view_all_orders(member):
own_ids = list(
MerchantOrderDispatch.query.filter(staff_member_id=member.id).values_list('order_id', flat=True)
)
qs = qs.filter(Order__OrderID__in=own_ids)
elif data.get('staff_member_id'):
qs = filter_by_staff_member(qs, member.merchant_id, data.get('staff_member_id'))
qs = staff_apply_order_filters(qs, filter_payload)
order_stats = build_merchant_order_stats(qs)
can_finance = member_has_perm(member, 'finance_view')
if not can_finance:
for k in list(order_stats.keys()):
if k.endswith('_amount'):
order_stats[k] = '0.00'
return Response({
'code': 0,
'msg': '成功',
'data': {
'order': order_stats,
'can_view_finance': can_finance,
},
})
except Exception as e:
return _err(e)
class StaffOrderDetailView(APIView):
permission_classes = [IsAuthenticated]