update plugins/freeswitch: add 2 mod 9 del 1 files

This commit is contained in:
jack ning
2025-06-03 10:13:39 +08:00
parent 745a34fe98
commit 4a8fde320a
11 changed files with 438 additions and 258 deletions

View File

@@ -2,7 +2,7 @@
* @Author: jackning 270580156@qq.com
* @Date: 2025-06-03 14:30:25
* @LastEditors: jackning 270580156@qq.com
* @LastEditTime: 2025-06-03 09:28:50
* @LastEditTime: 2025-06-03 10:07:00
* @Description: bytedesk.com https://github.com/Bytedesk/bytedesk
* Please be aware of the BSL license restrictions before installing Bytedesk IM
* selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license.
@@ -26,9 +26,6 @@ import com.bytedesk.freeswitch.service.CallStatisticsService;
@Controller
@RequestMapping("/callcenter")
public class CallCenterController {
// @Autowired
// private CallService callService;
@Autowired
private CallStatisticsService callStatisticsService;

View File

@@ -1,5 +1,6 @@
package com.bytedesk.freeswitch.controller;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
@@ -9,23 +10,21 @@ import org.springframework.web.bind.annotation.RestController;
import com.bytedesk.freeswitch.service.CallService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.Map;
/**
* 呼叫控制器
*/
@Slf4j
@RestController
@RequestMapping("/api/v1/call")
@RequiredArgsConstructor
@ConditionalOnProperty(name = "bytedesk.freeswitch.enabled", havingValue = "true", matchIfMissing = false)
public class CallController {
private static final Logger log = LoggerFactory.getLogger(CallController.class);
private final CallService callService;
/**

View File

@@ -4,7 +4,7 @@ import org.freeswitch.esl.client.IEslEventListener;
import org.freeswitch.esl.client.transport.event.EslEvent;
import org.springframework.stereotype.Component;
import com.bytedesk.freeswitch.service.CallService;
import com.bytedesk.freeswitch.service.ICallService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -17,7 +17,7 @@ import lombok.extern.slf4j.Slf4j;
@RequiredArgsConstructor
public class FreeSwitchEventListener implements IEslEventListener {
private final CallService callService;
private final ICallService callService;
/**
* 处理FreeSwitch事件

View File

@@ -9,7 +9,6 @@ import org.freeswitch.esl.client.transport.SendMsg;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
import com.bytedesk.freeswitch.config.FreeSwitchProperties;
import com.bytedesk.freeswitch.model.CallInfo;
import lombok.RequiredArgsConstructor;
@@ -22,7 +21,7 @@ import lombok.extern.slf4j.Slf4j;
@Service
@RequiredArgsConstructor
@ConditionalOnProperty(name = "bytedesk.freeswitch.enabled", havingValue = "true", matchIfMissing = false)
public class CallService {
public class CallService implements ICallService {
private final Client eslClient;
// private final FreeSwitchProperties freeSwitchProperties;

View File

@@ -13,19 +13,42 @@
*/
package com.bytedesk.freeswitch.service;
import org.springframework.stereotype.Service;
import com.bytedesk.freeswitch.model.CallStatistics;
import lombok.extern.slf4j.Slf4j;
/**
* 呼叫统计服务接口
*/
public interface CallStatisticsService {
@Slf4j
@Service
public class CallStatisticsService {
/**
* 获取当前呼叫统计数据
*
* @return 呼叫统计数据
*/
CallStatistics getCallStatistics();
public CallStatistics getCallStatistics() {
// 这里应当从数据库中获取真实数据
// 当前为示例数据
log.info("获取当前呼叫统计数据");
CallStatistics stats = new CallStatistics();
stats.setTodayCallCount(125);
stats.setAverageCallDuration(3.7);
stats.setOnlineAgentsCount(12);
stats.setActiveCallsCount(8);
stats.setInboundCallsCount(85);
stats.setOutboundCallsCount(40);
stats.setAnsweredCallsCount(110);
stats.setMissedCallsCount(15);
stats.setAnswerRate(88.0);
return stats;
}
/**
* 根据时间周期获取呼叫统计数据
@@ -33,5 +56,49 @@ public interface CallStatisticsService {
* @param period 时间周期today, week, month, year
* @return 呼叫统计数据
*/
CallStatistics getCallStatisticsByPeriod(String period);
public CallStatistics getCallStatisticsByPeriod(String period) {
log.info("获取{}周期的呼叫统计数据", period);
CallStatistics stats = new CallStatistics();
// 根据不同时间周期返回相应的统计数据
if ("today".equals(period)) {
return getCallStatistics();
} else if ("week".equals(period)) {
stats.setTodayCallCount(820);
stats.setAverageCallDuration(4.2);
stats.setOnlineAgentsCount(14);
stats.setActiveCallsCount(8);
stats.setInboundCallsCount(550);
stats.setOutboundCallsCount(270);
stats.setAnsweredCallsCount(720);
stats.setMissedCallsCount(100);
stats.setAnswerRate(87.8);
} else if ("month".equals(period)) {
stats.setTodayCallCount(3240);
stats.setAverageCallDuration(3.9);
stats.setOnlineAgentsCount(15);
stats.setActiveCallsCount(8);
stats.setInboundCallsCount(2180);
stats.setOutboundCallsCount(1060);
stats.setAnsweredCallsCount(2950);
stats.setMissedCallsCount(290);
stats.setAnswerRate(91.0);
} else if ("year".equals(period)) {
stats.setTodayCallCount(36500);
stats.setAverageCallDuration(4.0);
stats.setOnlineAgentsCount(15);
stats.setActiveCallsCount(8);
stats.setInboundCallsCount(24500);
stats.setOutboundCallsCount(12000);
stats.setAnsweredCallsCount(33200);
stats.setMissedCallsCount(3300);
stats.setAnswerRate(90.7);
} else {
// 默认返回当天数据
return getCallStatistics();
}
return stats;
}
}

View File

@@ -0,0 +1,85 @@
/*
* @Author: GitHub Copilot
* @Date: 2025-06-03
* @Description: bytedesk.com https://github.com/Bytedesk/bytedesk
* Please be aware of the BSL license restrictions before installing Bytedesk IM
* selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license.
* Business Source License 1.1: https://github.com/Bytedesk/bytedesk/blob/main/LICENSE
*
* Copyright (c) 2025 by bytedesk.com, All Rights Reserved.
*/
package com.bytedesk.freeswitch.service;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;
/**
* 默认呼叫服务实现当FreeSwitch未启用时使用
*/
@Slf4j
@Service
@ConditionalOnProperty(name = "bytedesk.freeswitch.enabled", havingValue = "false", matchIfMissing = true)
public class DefaultCallService implements ICallService {
public DefaultCallService() {
log.info("创建默认呼叫服务FreeSwitch未启用");
}
@Override
public String makeCall(String fromUser, String toUser) {
log.warn("FreeSwitch未启用无法发起呼叫");
return null;
}
@Override
public boolean answerCall(String callId) {
log.warn("FreeSwitch未启用无法应答呼叫");
return false;
}
@Override
public boolean rejectCall(String callId) {
log.warn("FreeSwitch未启用无法拒绝呼叫");
return false;
}
@Override
public boolean endCall(String callId) {
log.warn("FreeSwitch未启用无法结束呼叫");
return false;
}
@Override
public boolean sendDtmf(String callId, String digit) {
log.warn("FreeSwitch未启用无法发送DTMF");
return false;
}
@Override
public boolean toggleMute(String callId, boolean mute) {
log.warn("FreeSwitch未启用无法{}静音", mute ? "开启" : "关闭");
return false;
}
@Override
public void handleCallStart(String callerId, String destination, String uuid) {
// 无操作
}
@Override
public void handleCallAnswered(String uuid) {
// 无操作
}
@Override
public void handleCallEnd(String uuid, String hangupCause) {
// 无操作
}
@Override
public void handleDtmf(String uuid, String digit) {
// 无操作
}
}

View File

@@ -0,0 +1,100 @@
/*
* @Author: GitHub Copilot
* @Date: 2025-06-03
* @Description: bytedesk.com https://github.com/Bytedesk/bytedesk
* Please be aware of the BSL license restrictions before installing Bytedesk IM
* selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license.
* Business Source License 1.1: https://github.com/Bytedesk/bytedesk/blob/main/LICENSE
*
* Copyright (c) 2025 by bytedesk.com, All Rights Reserved.
*/
package com.bytedesk.freeswitch.service;
/**
* 呼叫服务接口
*/
public interface ICallService {
/**
* 发起呼叫
*
* @param fromUser 主叫用户ID
* @param toUser 被叫用户ID
* @return 呼叫ID
*/
String makeCall(String fromUser, String toUser);
/**
* 应答呼叫
*
* @param callId 呼叫ID
* @return 是否成功
*/
boolean answerCall(String callId);
/**
* 拒绝呼叫
*
* @param callId 呼叫ID
* @return 是否成功
*/
boolean rejectCall(String callId);
/**
* 结束呼叫
*
* @param callId 呼叫ID
* @return 是否成功
*/
boolean endCall(String callId);
/**
* 发送DTMF按键
*
* @param callId 呼叫ID
* @param digit 按键值
* @return 是否成功
*/
boolean sendDtmf(String callId, String digit);
/**
* 静音/取消静音
*
* @param callId 呼叫ID
* @param mute 是否静音
* @return 是否成功
*/
boolean toggleMute(String callId, boolean mute);
/**
* 处理呼叫开始
*
* @param callerId 主叫号码
* @param destination 被叫号码
* @param uuid 呼叫UUID
*/
void handleCallStart(String callerId, String destination, String uuid);
/**
* 处理呼叫应答
*
* @param uuid 呼叫UUID
*/
void handleCallAnswered(String uuid);
/**
* 处理呼叫结束
*
* @param uuid 呼叫UUID
* @param hangupCause 挂断原因
*/
void handleCallEnd(String uuid, String hangupCause);
/**
* 处理DTMF按键
*
* @param uuid 呼叫UUID
* @param digit 按键值
*/
void handleDtmf(String uuid, String digit);
}

View File

@@ -1,97 +0,0 @@
/*
* @Author: jackning 270580156@qq.com
* @Date: 2025-06-03 15:18:15
* @LastEditors: jackning 270580156@qq.com
* @LastEditTime: 2025-06-03 09:29:18
* @Description: bytedesk.com https://github.com/Bytedesk/bytedesk
* Please be aware of the BSL license restrictions before installing Bytedesk IM
* selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license.
* Business Source License 1.1: https://github.com/Bytedesk/bytedesk/blob/main/LICENSE
* contact: 270580156@qq.com
* 联系270580156@qq.com
* Copyright (c) 2025 by bytedesk.com, All Rights Reserved.
*/
package com.bytedesk.freeswitch.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.bytedesk.freeswitch.model.CallStatistics;
import com.bytedesk.freeswitch.service.CallStatisticsService;
/**
* 呼叫统计服务实现类
*/
@Service
public class CallStatisticsServiceImpl implements CallStatisticsService {
private static final Logger log = LoggerFactory.getLogger(CallStatisticsServiceImpl.class);
@Override
public CallStatistics getCallStatistics() {
// 这里应当从数据库中获取真实数据
// 当前为示例数据
log.info("获取当前呼叫统计数据");
CallStatistics stats = new CallStatistics();
stats.setTodayCallCount(125);
stats.setAverageCallDuration(3.7);
stats.setOnlineAgentsCount(12);
stats.setActiveCallsCount(8);
stats.setInboundCallsCount(85);
stats.setOutboundCallsCount(40);
stats.setAnsweredCallsCount(110);
stats.setMissedCallsCount(15);
stats.setAnswerRate(88.0);
return stats;
}
@Override
public CallStatistics getCallStatisticsByPeriod(String period) {
log.info("获取{}周期的呼叫统计数据", period);
CallStatistics stats = new CallStatistics();
// 根据不同时间周期返回相应的统计数据
if ("today".equals(period)) {
return getCallStatistics();
} else if ("week".equals(period)) {
stats.setTodayCallCount(820);
stats.setAverageCallDuration(4.2);
stats.setOnlineAgentsCount(14);
stats.setActiveCallsCount(8);
stats.setInboundCallsCount(550);
stats.setOutboundCallsCount(270);
stats.setAnsweredCallsCount(720);
stats.setMissedCallsCount(100);
stats.setAnswerRate(87.8);
} else if ("month".equals(period)) {
stats.setTodayCallCount(3240);
stats.setAverageCallDuration(3.9);
stats.setOnlineAgentsCount(15);
stats.setActiveCallsCount(8);
stats.setInboundCallsCount(2180);
stats.setOutboundCallsCount(1060);
stats.setAnsweredCallsCount(2950);
stats.setMissedCallsCount(290);
stats.setAnswerRate(91.0);
} else if ("year".equals(period)) {
stats.setTodayCallCount(36500);
stats.setAverageCallDuration(4.0);
stats.setOnlineAgentsCount(15);
stats.setActiveCallsCount(8);
stats.setInboundCallsCount(24500);
stats.setOutboundCallsCount(12000);
stats.setAnsweredCallsCount(33200);
stats.setMissedCallsCount(3300);
stats.setAnswerRate(90.7);
} else {
// 默认返回当天数据
return getCallStatistics();
}
return stats;
}
}

View File

@@ -1 +1,13 @@
spring.application.name=baidu
spring.application.name=freeswitch
# FreeSwitch配置
bytedesk.freeswitch.enabled=false
bytedesk.freeswitch.server=127.0.0.1
bytedesk.freeswitch.eslPort=8021
bytedesk.freeswitch.eslPassword=bytedesk123
bytedesk.freeswitch.sipPort=15060
bytedesk.freeswitch.webrtcPort=17443
bytedesk.freeswitch.wsPort=15066
bytedesk.freeswitch.callTimeout=60
bytedesk.freeswitch.rtpPortStart=16000
bytedesk.freeswitch.rtpPortEnd=16129

View File

@@ -1,223 +1,232 @@
<#import "layout/base.ftl" as base>
<@base.base title="ByteDesk 呼叫中心 - 企业级通信解决方案">
<@base.base title="ByteDesk 智能呼叫中心 - AI驱动的企业级通信解决方案">
<!-- 顶部介绍区域 -->
<div class="row text-center mb-5">
<div class="col">
<h1 class="display-4 mb-3">ByteDesk FreeSWITCH 呼叫中心</h1>
<p class="lead">企业级开源通信平台,打造无缝客户沟通体验</p>
<h1 class="display-4 mb-3">ByteDesk 智能呼叫中心</h1>
<p class="lead">AI驱动的企业级通信平台,重新定义客户服务体验</p>
<div class="mt-4">
<a href="/contact" class="btn btn-primary btn-lg me-3">免费试用</a>
<a href="/demo" class="btn btn-outline-primary btn-lg">在线演示</a>
</div>
</div>
</div>
<!-- 顶部统计信息 -->
<div class="row mb-4">
<div class="col-md-3">
<div class="card text-center feature-box h-100">
<div class="card-body">
<div class="feature-icon">📞</div>
<h5 class="card-title">今日呼叫</h5>
<p class="card-text display-6">${statistics.todayCallCount!'0'}</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card text-center feature-box h-100">
<div class="card-body">
<div class="feature-icon">⏱️</div>
<h5 class="card-title">平均通话时长</h5>
<p class="card-text display-6">${statistics.averageCallDuration!'0'}分钟</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card text-center feature-box h-100">
<div class="card-body">
<div class="feature-icon">👥</div>
<h5 class="card-title">在线座席</h5>
<p class="card-text display-6">${statistics.onlineAgentsCount!'0'}</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card text-center feature-box h-100">
<div class="card-body">
<div class="feature-icon">🔄</div>
<h5 class="card-title">实时呼叫</h5>
<p class="card-text display-6">${statistics.activeCallsCount!'0'}</p>
</div>
</div>
</div>
</div>
<!-- 主要功能介绍 -->
<div class="row g-4 mb-5">
<div class="col-md-4">
<div class="feature-box h-100">
<div class="feature-icon">🔌</div>
<h3>基于FreeSWITCH</h3>
<p>FreeSWITCH是一个开源通信平台支持VoIP、WebRTC和传统电话网络提供强大的通信能力。</p>
<ul class="list-unstyled">
<li><i class="bi bi-check-circle"></i> 高性能架构</li>
<li><i class="bi bi-check-circle"></i> 多协议支持</li>
<li><i class="bi bi-check-circle"></i> 开源灵活</li>
</ul>
</div>
<!-- AI 核心优势 -->
<div class="row mb-5">
<div class="col-12 text-center mb-4">
<h2>AI 驱动的智能服务</h2>
<p class="lead text-muted">结合大语言模型,打造智能化客户服务体验</p>
</div>
<div class="col-md-4">
<div class="feature-box h-100">
<div class="feature-icon">🔀</div>
<h3>智能呼叫路由</h3>
<p>根据客户需求和座席技能自动分配呼叫,提高服务质量和效率。</p>
<div class="feature-icon">🤖</div>
<h3>智能语音助手</h3>
<p>基于大语言模型的智能语音助手7x24小时不间断服务自动处理80%的常见咨询,显著降低人工成本。</p>
<ul class="list-unstyled">
<li><i class="bi bi-check-circle"></i> 基于技能的路由</li>
<li><i class="bi bi-check-circle"></i> 优先级队列</li>
<li><i class="bi bi-check-circle"></i> 智能座席调度</li>
<li><i class="bi bi-check-circle"></i> 自然语言理解</li>
<li><i class="bi bi-check-circle"></i> 多轮对话能力</li>
<li><i class="bi bi-check-circle"></i> 个性化服务体验</li>
</ul>
</div>
</div>
<div class="col-md-4">
<div class="feature-box h-100">
<div class="feature-icon">📊</div>
<h3>全面数据分析</h3>
<p>通过详细的呼叫统计和报表,帮助企业优化客户服务流程。</p>
<h3>智能数据分析</h3>
<p>AI驱动的数据分析系统自动识别客户意图生成服务洞察助力企业优化服务流程。</p>
<ul class="list-unstyled">
<li><i class="bi bi-check-circle"></i> 实时监控面板</li>
<li><i class="bi bi-check-circle"></i> 自定义报表</li>
<li><i class="bi bi-check-circle"></i> 性能指标追踪</li>
<li><i class="bi bi-check-circle"></i> 实时情感分析</li>
<li><i class="bi bi-check-circle"></i> 智能质检评分</li>
<li><i class="bi bi-check-circle"></i> 预测性分析</li>
</ul>
</div>
</div>
<div class="col-md-4">
<div class="feature-box h-100">
<div class="feature-icon">🎯</div>
<h3>智能路由分配</h3>
<p>基于AI的智能路由系统根据客户画像和座席技能自动匹配提升服务效率和客户满意度。</p>
<ul class="list-unstyled">
<li><i class="bi bi-check-circle"></i> 智能技能匹配</li>
<li><i class="bi bi-check-circle"></i> 负载均衡</li>
<li><i class="bi bi-check-circle"></i> 实时优化</li>
</ul>
</div>
</div>
</div>
<!-- 更多功能展示 -->
<!-- 核心功能展示 -->
<div class="row mb-5">
<div class="col-12">
<h2 class="text-center mb-4">强大的呼叫中心功能</h2>
<div class="col-12 text-center mb-4">
<h2>企业级呼叫中心功能</h2>
<p class="lead text-muted">全面的功能支持,满足企业多样化需求</p>
</div>
<div class="col-md-6">
<div class="card mb-3">
<div class="card-body">
<h5 class="card-title"><i class="bi bi-telephone"></i> 渠道通信</h5>
<p class="card-text">支持SIP、WebRTC、PSTN等多种通信协议实现全渠道客户沟通。</p>
<h5 class="card-title"><i class="bi bi-telephone"></i> 渠道通信</h5>
<p class="card-text">支持SIP、WebRTC、PSTN等多种通信协议实现全渠道客户沟通,确保服务无死角。</p>
<ul class="list-unstyled">
<li><i class="bi bi-check2"></i> 语音通话</li>
<li><i class="bi bi-check2"></i> 视频通话</li>
<li><i class="bi bi-check2"></i> 即时消息</li>
</ul>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card mb-3">
<div class="card-body">
<h5 class="card-title"><i class="bi bi-record-circle"></i> 通话录音</h5>
<p class="card-text">自动录制所有通话,支持质量控制和培训需求。</p>
<h5 class="card-title"><i class="bi bi-record-circle"></i> 智能质检</h5>
<p class="card-text">AI驱动的智能质检系统自动分析通话内容提供质量评估和改进建议。</p>
<ul class="list-unstyled">
<li><i class="bi bi-check2"></i> 自动语音转写</li>
<li><i class="bi bi-check2"></i> 关键词识别</li>
<li><i class="bi bi-check2"></i> 服务质量评分</li>
</ul>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card mb-3">
<div class="card-body">
<h5 class="card-title"><i class="bi bi-volume-up"></i> IVR语音菜单</h5>
<p class="card-text">通过可视化界面轻松构建交互式语音应答系统。</p>
<h5 class="card-title"><i class="bi bi-volume-up"></i> 智能IVR</h5>
<p class="card-text">基于AI的智能语音导航系统提供自然流畅的语音交互体验。</p>
<ul class="list-unstyled">
<li><i class="bi bi-check2"></i> 语音识别</li>
<li><i class="bi bi-check2"></i> 意图理解</li>
<li><i class="bi bi-check2"></i> 动态菜单</li>
</ul>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card mb-3">
<div class="card-body">
<h5 class="card-title"><i class="bi bi-person-lines-fill"></i> CRM集成</h5>
<p class="card-text">与客户关系管理系统无缝集成,提供完整的客户服务视图。</p>
<h5 class="card-title"><i class="bi bi-graph-up"></i> 智能报表</h5>
<p class="card-text">AI驱动的数据分析平台提供深度业务洞察助力决策优化。</p>
<ul class="list-unstyled">
<li><i class="bi bi-check2"></i> 实时监控</li>
<li><i class="bi bi-check2"></i> 预测分析</li>
<li><i class="bi bi-check2"></i> 自定义报表</li>
</ul>
</div>
</div>
</div>
</div>
<!-- 技术架构介绍 -->
<!-- 客户价值 -->
<div class="row mb-5">
<div class="col-12">
<h2 class="text-center mb-4">技术架构</h2>
<div class="text-center mb-4">
<img src="/images/callcenter/architecture.png" alt="ByteDesk呼叫中心架构" class="img-fluid rounded shadow" style="max-width: 80%;">
<div class="col-12 text-center mb-4">
<h2>为什么选择 ByteDesk 智能呼叫中心?</h2>
<p class="lead text-muted">为企业创造实实在在的价值</p>
</div>
<div class="col-md-3">
<div class="text-center">
<div class="feature-icon">💰</div>
<h4>降低成本</h4>
<p>AI自动化处理80%常见咨询,显著降低人工成本</p>
</div>
</div>
<div class="col-md-3">
<div class="text-center">
<div class="feature-icon">⚡</div>
<h4>提升效率</h4>
<p>智能路由和AI助手提升服务效率达300%</p>
</div>
</div>
<div class="col-md-3">
<div class="text-center">
<div class="feature-icon">📈</div>
<h4>增加收入</h4>
<p>智能营销和交叉销售提升转化率30%</p>
</div>
</div>
<div class="col-md-3">
<div class="text-center">
<div class="feature-icon">😊</div>
<h4>提升满意度</h4>
<p>个性化服务提升客户满意度至95%</p>
</div>
<p class="text-center">ByteDesk呼叫中心基于FreeSWITCH构建采用微服务架构具有高可用性和可扩展性。</p>
</div>
</div>
<!-- 呼叫统计图表 -->
<!-- 技术优势 -->
<div class="row mb-5">
<div class="col-12">
<h2 class="text-center mb-4">呼叫统计</h2>
<div class="col-12 text-center mb-4">
<h2>技术优势</h2>
<p class="lead text-muted">企业级技术架构,确保系统稳定可靠</p>
</div>
<div class="col-md-6">
<div class="col-md-4">
<div class="feature-box h-100">
<div class="feature-icon">🔒</div>
<h3>安全可靠</h3>
<p>企业级安全架构,数据加密传输,多重备份机制,确保系统安全可靠。</p>
</div>
</div>
<div class="col-md-4">
<div class="feature-box h-100">
<div class="feature-icon">📱</div>
<h3>灵活部署</h3>
<p>支持公有云、私有云、混合云多种部署方式,满足不同企业需求。</p>
</div>
</div>
<div class="col-md-4">
<div class="feature-box h-100">
<div class="feature-icon">🔄</div>
<h3>高可用性</h3>
<p>分布式架构设计支持水平扩展确保系统7x24小时稳定运行。</p>
</div>
</div>
</div>
<!-- 客户案例 -->
<div class="row mb-5">
<div class="col-12 text-center mb-4">
<h2>成功案例</h2>
<p class="lead text-muted">值得信赖的企业级解决方案</p>
</div>
<div class="col-md-4">
<div class="card">
<div class="card-header">
本周呼叫量统计
</div>
<div class="card-body">
<canvas id="weeklyCallsChart"></canvas>
<h5 class="card-title">某大型电商平台</h5>
<p class="card-text">通过部署ByteDesk智能呼叫中心客服效率提升300%客户满意度提升40%。</p>
</div>
</div>
</div>
<div class="col-md-6">
<div class="col-md-4">
<div class="card">
<div class="card-header">
呼叫类型分布
</div>
<div class="card-body">
<canvas id="callTypeChart"></canvas>
<h5 class="card-title">某金融机构</h5>
<p class="card-text">AI驱动的智能服务系统帮助客户服务成本降低50%业务转化率提升35%。</p>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">某教育机构</h5>
<p class="card-text">智能呼叫中心助力招生咨询效率提升200%客户转化率提升45%。</p>
</div>
</div>
</div>
</div>
<!-- 快速操作区 -->
<!-- 行动召唤 -->
<div class="row text-center mb-5">
<div class="col-12">
<h2 class="mb-4">快速入门</h2>
<h2 class="mb-4">开启智能客服新时代</h2>
<p class="lead mb-4">立即体验 ByteDesk 智能呼叫中心让AI为您的企业创造价值</p>
<div class="d-flex justify-content-center gap-3">
<a href="/callcenter/docs" class="btn btn-primary btn-lg">查看文档</a>
<a href="/callcenter/demo" class="btn btn-outline-primary btn-lg">在线演示</a>
<a href="/contact" class="btn btn-primary btn-lg">免费试用</a>
<a href="/demo" class="btn btn-outline-primary btn-lg">预约演示</a>
<a href="/docs" class="btn btn-outline-secondary btn-lg">查看文档</a>
</div>
</div>
</div>
<!-- Chart.js引入 -->
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
// 每周呼叫量统计图表
const weeklyCallsCtx = document.getElementById('weeklyCallsChart').getContext('2d');
new Chart(weeklyCallsCtx, {
type: 'line',
data: {
labels: ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'],
datasets: [{
label: '呼叫量',
data: [65, 78, 80, 85, 90, 45, 30],
borderColor: '#0d6efd',
tension: 0.1,
fill: false
}]
},
options: {
responsive: true
}
});
// 呼叫类型分布图表
const callTypeCtx = document.getElementById('callTypeChart').getContext('2d');
new Chart(callTypeCtx, {
type: 'pie',
data: {
labels: ['入站呼叫', '出站呼叫', '内部呼叫', '会议呼叫'],
datasets: [{
data: [55, 30, 10, 5],
backgroundColor: ['#0d6efd', '#6c757d', '#198754', '#ffc107']
}]
},
options: {
responsive: true
}
});
});
</script>
<style>
.feature-icon {
font-size: 2.5rem;
@@ -234,5 +243,12 @@
transform: translateY(-5px);
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
}
.card {
transition: all 0.3s ease;
}
.card:hover {
transform: translateY(-5px);
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
}
</style>
</@base.base>

View File

@@ -1,9 +1,10 @@
<#macro base title="ByteDesk 呼叫中心">
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>${title!'ByteDesk 呼叫中心'}</title>
<title>${title}</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css" rel="stylesheet">
<link href="/css/callcenter/style.css" rel="stylesheet">
@@ -84,4 +85,5 @@
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="/js/callcenter/main.js"></script>
</body>
</html>
</html>
</#macro>