前端新增并完善 销售闭环中心 路由:/sales-flow 录单、审核、取消、轨迹、AI、通知这些流程都串起来了 页面会优先走后端接口,失败时才回退到演示数据 后端新增销售闭环流程接口 新增 backend/app/api/sales_flow.py 新接口 GET /api/orders/flow-overview 复用订单服务和现有订单详情逻辑,返回: 订单列表 审核项 轨迹 AI 识别项 提醒项 统计概览 后端路由注册 已把新的销售闭环接口挂进 API 路由 清单同步更新 订单从录入到完成的闭环管理 订单录入 lint 检查通过,没有报错
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,
|
|
},
|
|
})
|