-
当前生效:负载最低优先 + 工作时间
-
- 工作时间内,新会话自动分配给进行中会话最少的在线客服;非工作时间或无客服在线时,访客可提交离线留言。
+
+ {loadingSettings ? (
+
+ ) : (
+ <>
+
+
+
+
+
+
+
自动分配规则
+
+ 工作时间内,访客进线会按下列策略分配给在线一线客服;
+ 非工作时间或无可接坐席时进入排队/留言。人工领取与转接不受此策略限制。
+
+
-
-
-
-
-
-
轮询分配
-
后续版本可切换策略
+
+
+
+
+
+
{
+ const n = Number(v)
+ if (!Number.isFinite(n) || n < 0 || n > 200) {
+ throw new Error('请填写 0–200 的整数,0 表示不限制')
+ }
+ },
+ },
+ ]}
+ extra="达到上限的坐席不再自动分入新会话;全部坐席已满时会话保持排队。0 = 不限制。"
+ >
+
+
+ {isAdmin ? (
+
+ ) : (
+
仅租户管理员可修改分配规则
+ )}
+
-
-
-
+
+
+
说明
+
· 候选范围:角色为客服、状态为「在线」的账号(忙碌/离线不参与自动分配)。
+
· 技能组 / 渠道专属坐席将在后续版本支持。
+
+ >
+ )}
)}
diff --git a/web/src/services/api.ts b/web/src/services/api.ts
index f69d4de..9ecd3eb 100644
--- a/web/src/services/api.ts
+++ b/web/src/services/api.ts
@@ -318,6 +318,8 @@ export const deleteStaff = (id: number) => del(`/staff/${id}`)
// Tenant settings
export type WorkHours = Record
+export type AssignStrategy = 'least_load' | 'round_robin'
+
export interface TenantSettings {
tenant_id: number
display_name: string
@@ -330,6 +332,10 @@ export interface TenantSettings {
notify_new_session: boolean
notify_offline_leave: boolean
notify_daily_report: boolean
+ /** least_load 负载最低 | round_robin 轮询 */
+ assign_strategy?: AssignStrategy
+ /** 每位坐席最大进行中会话数,0=不限制 */
+ max_active_per_agent?: number
}
export const getTenantSettings = () => get('/settings')
export const updateTenantSettings = (data: Partial & { work_hours?: WorkHours }) =>