from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from backend.app.api.deps import require_permissions, require_roles from backend.app.db import get_db_session from backend.app.schemas.common import success_payload from backend.app.services.order_service import OrderService router = APIRouter(prefix='/api/orders', tags=['sales-flow']) @router.get('/flow-overview') def flow_overview( order_service: OrderService = Depends(), session: Session = Depends(get_db_session), current_user: dict = Depends(require_roles('salesman', 'manager', 'admin')), _permission_user: dict = Depends(require_permissions('order:list')), ) -> dict: orders = order_service.list_orders(session, order_service.normalize_list_filters({}, current_user)) detail_orders = [order_service.get_order(item['order_id'], session, current_user) for item in orders[:5]] detail_orders = [item for item in detail_orders if item] review_items = [] traces = [] ai_items = [] notices = [] for item in detail_orders: if item.get('order_status') in {'pending_approve', 'approved'}: review_items.append({ 'orderNo': item.get('order_no'), 'customerName': item.get('customer_name'), 'amount': f"{item.get('sale_price_total', 0):.2f}", }) trace_list = item.get('logistics_info', {}).get('trace_list', []) for trace in trace_list[:2]: traces.append({ 'title': f"订单 {item.get('order_no')} 物流节点", 'detail': trace.get('node_desc') or trace.get('remark') or '物流节点更新', 'time': trace.get('node_time') or '', }) for attach in item.get('attachments', [])[:1]: ai_items.append({ 'name': attach.get('file_name') or '识别附件', 'raw': item.get('customer_name', ''), 'corrected': item.get('customer_name', ''), }) pending_count = sum(1 for item in orders if item.get('order_status') == 'pending_approve') draft_count = sum(1 for item in orders if item.get('order_status') == 'draft') fulfillment_count = sum(1 for item in orders if item.get('order_status') in {'approved', 'pending_factory', 'pending_delivery', 'delivering'}) if not notices: notices = [ {'title': '物流超时提醒', 'detail': '演示订单首节点超过 48 小时未更新。', 'read': False}, {'title': '欠款超期提醒', 'detail': '演示客户账期已超 7 天。', 'read': False}, ] return success_payload({ 'orders': [ { 'order_no': item.get('order_no'), 'customer_name': item.get('customer_name'), 'order_status': item.get('order_status'), 'sale_price_total': item.get('sale_price_total', 0), } for item in orders[:10] ], 'review_items': review_items, 'traces': traces or [ {'title': '订单提交审核', 'detail': '业务员提交订单后进入审核队列。', 'time': '2026-05-21 09:00'}, {'title': '审核通过', 'detail': '管理层确认通过并生成发厂文案。', 'time': '2026-05-21 09:20'}, ], 'ai_items': ai_items or [ {'name': '物流单-001', 'raw': '客户A / 13900000000', 'corrected': '客户A / 13900000000'}, ], 'notices': notices, 'stats': { 'draft': draft_count, 'pending': pending_count, 'fulfillment': fulfillment_count, }, })