79 lines
3.6 KiB
Python
79 lines
3.6 KiB
Python
|
|
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,
|
||
|
|
},
|
||
|
|
})
|