实现租户系统设置落库:欢迎语、工作时间与通知开关

- 新增 TenantSetting 模型与 /api/settings 读写接口
- 设置页接通基本资料、自动回复、工作时间、通知偏好
- Widget 初始化使用欢迎语/离线提示,非工作时间不自动分配
- 补充设置持久化与 Widget 提示集成测试
This commit is contained in:
yml2213
2026-07-15 11:27:15 +08:00
parent b5203f7cbd
commit 318ba8a563
9 changed files with 686 additions and 97 deletions
+8 -5
View File
@@ -56,6 +56,8 @@ const VisitorChat = ({
const [sendError, setSendError] = useState('')
const [agentsOnline, setAgentsOnline] = useState(true)
const [offlinePrompt, setOfflinePrompt] = useState('当前无客服在线,请留言并留下联系方式,我们上线后会尽快回复您。')
const [welcomeMessage, setWelcomeMessage] = useState('您好!欢迎咨询,请问有什么可以帮您?')
const [displayName, setDisplayName] = useState('在线客服')
const [agentName, setAgentName] = useState('')
const [leaveName, setLeaveName] = useState('')
const [leavePhone, setLeavePhone] = useState('')
@@ -112,7 +114,10 @@ const VisitorChat = ({
setVisitorToken(token)
setAgentsOnline(Boolean(data.agents_online))
if (data.offline_prompt) setOfflinePrompt(data.offline_prompt)
if (data.welcome_message) setWelcomeMessage(data.welcome_message)
if (data.display_name) setDisplayName(data.display_name)
if (data.agent_name) setAgentName(data.agent_name)
else if (data.agent_nickname) setAgentName(data.agent_nickname)
if (data.session_status === 'ended') setSessionEnded(true)
localStorage.setItem(storageKey, String(sid))
localStorage.setItem(tokenKey, token)
@@ -365,7 +370,7 @@ const VisitorChat = ({
<CustomerServiceOutlined className="text-lg text-white" />
</div>
<div className="flex-1 min-w-0">
<h1 className="m-0 text-[15px] font-semibold leading-tight text-white">线</h1>
<h1 className="m-0 text-[15px] font-semibold leading-tight text-white">{displayName || '在线客服'}</h1>
<p className="m-0 text-xs leading-normal text-white/80 flex items-center gap-1 mt-0.5">
<span
className="inline-block w-1.5 h-1.5 rounded-full"
@@ -375,7 +380,7 @@ const VisitorChat = ({
? '会话已结束'
: agentsOnline
? (agentName ? `${agentName} 为您服务` : '正在为您服务')
: '客服离线 · 可留言'}
: '暂不可即时接待 · 可留言'}
</p>
</div>
<div className="flex items-center gap-1 shrink-0">
@@ -405,9 +410,7 @@ const VisitorChat = ({
<div className="flex flex-col items-center gap-3">
<div className="px-4 py-2 rounded-xl bg-white border border-neutral-200 max-w-[85%] text-center">
<p className="m-0 text-[13px] text-neutral-600 leading-normal">
{agentsOnline
? '您好!欢迎咨询,请问有什么可以帮您?'
: offlinePrompt}
{agentsOnline ? welcomeMessage : offlinePrompt}
</p>
</div>
</div>