feat: 商家订单准确统计、客服备注与按客服筛选
This commit is contained in:
@@ -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]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user