This commit is contained in:
jack ning
2025-11-10 13:13:08 +08:00
parent 0fb288c7ea
commit 484c4e2d9f
9 changed files with 817 additions and 0 deletions

View File

@@ -87,6 +87,12 @@ public interface ThreadRepository extends JpaRepository<ThreadEntity, Long>, Jpa
@Query("SELECT t FROM ThreadEntity t WHERE t.topic LIKE :topicPrefix AND t.status = :status AND t.deleted = false ORDER BY t.createdAt ASC")
List<ThreadEntity> findByTopicStartsWithAndStatusAndDeletedFalse(@Param("topicPrefix") String topicPrefix, @Param("status") String status);
/**
* 统计在时间范围内按关闭来源分组的数量
*/
@Query("SELECT t.closeType, COUNT(t) FROM ThreadEntity t WHERE t.status = 'CLOSED' AND t.deleted = false AND t.updatedAt BETWEEN :start AND :end GROUP BY t.closeType")
List<Object[]> countClosedGroupedByCloseType(@Param("start") java.time.ZonedDateTime start, @Param("end") java.time.ZonedDateTime end);
/**
* 根据访客ID查找最近的客服会话记录
* 查找访客与客服的最近一次会话,按更新时间倒序排列

View File

@@ -78,6 +78,17 @@ public class ThreadRestService
private final BytedeskEventPublisher bytedeskEventPublisher;
private final TopicRestService topicRestService;
public Map<String, Long> reportClosedByCloseType(java.time.ZonedDateTime start, java.time.ZonedDateTime end) {
List<Object[]> rows = threadRepository.countClosedGroupedByCloseType(start, end);
Map<String, Long> result = new HashMap<>();
for (Object[] row : rows) {
String key = (String) row[0];
Long count = (Long) row[1];
result.put(key != null ? key : "NONE", count != null ? count : 0L);
}
return result;
}
@Override
public Page<ThreadEntity> queryByOrgEntity(ThreadRequest request) {

View File

@@ -28,6 +28,7 @@ import com.bytedesk.core.thread.ThreadRestService;
import com.bytedesk.core.thread.enums.ThreadProcessStatusEnum;
import com.bytedesk.core.thread.event.ThreadAcceptEvent;
import com.bytedesk.core.thread.event.ThreadCloseEvent;
import com.bytedesk.core.quartz.event.QuartzOneMinEvent;
import com.bytedesk.core.utils.BdDateUtils;
import com.bytedesk.service.utils.ThreadMessageUtil;
import com.bytedesk.core.message.content.QueueContent;
@@ -166,6 +167,21 @@ public class QueueMemberEventListener {
}
}
@EventListener
public void onQuartzOneMinEvent(QuartzOneMinEvent event) {
int removed = queueMemberRestService.cleanupIdleQueueMembers();
if (removed > 0) {
log.info("Idle queue members removed: {}", removed);
// 广播所有前缀的队列位置刷新:这里简化处理,按当前活跃排队线程重新计算
// 获取任意还在排队的线程列表,通过提取前缀分组刷新
// 为避免复杂度,这里只刷新受影响的所有排队会话(全量刷新)
// 查找所有排队中的线程(匹配已有查询方法前缀需要 topicPrefix, 此处使用简单遍历 prefix 集合)
// 简化:不区分前缀,逐个线程重新发送其位置
// 由于缺少批量查询接口,这里暂不实现全量广播以免性能问题,可后续优化
// (占位注释)
}
}
@EventListener
public void onMessageCreateEvent(MessageCreateEvent event) {
MessageEntity message = event.getMessage();

View File

@@ -49,4 +49,10 @@ public interface QueueMemberRepository extends JpaRepository<QueueMemberEntity,
@Query("SELECT COUNT(qm) FROM QueueMemberEntity qm WHERE qm.orgUid = :orgUid AND qm.robotQueue IS NOT NULL AND qm.createdAt >= :startDate AND qm.createdAt <= :endDate")
Long countByRobotUidAndDateBetween(@Param("orgUid") String orgUid, @Param("robotUid") String robotUid, @Param("startDate") ZonedDateTime startDate, @Param("endDate") ZonedDateTime endDate);
/**
* 查找在指定时间之前仍未发送任何访客消息(visitorMessageCount=0)的排队成员
*/
@Query("SELECT qm FROM QueueMemberEntity qm WHERE qm.visitorMessageCount = 0 AND qm.deleted = false AND qm.visitorEnqueueAt < :threshold")
List<QueueMemberEntity> findIdleBefore(@Param("threshold") ZonedDateTime threshold);
}

View File

@@ -42,6 +42,7 @@ public class QueueMemberRestService extends BaseRestServiceWithExport<QueueMembe
private final QueueMemberRepository queueMemberRepository;
private final ModelMapper modelMapper;
private final UidUtils uidUtils;
private static final int IDLE_QUEUE_TIMEOUT_MINUTES = 5; // 超过5分钟未发首条消息视为过期
/**
* 访客主动退出排队:标记离开时间并软删除队列成员记录
@@ -56,6 +57,25 @@ public class QueueMemberRestService extends BaseRestServiceWithExport<QueueMembe
entity.setDeleted(true);
save(entity);
}
/**
* 扫描超时(未发送首条消息)的排队成员并标记删除
*/
public int cleanupIdleQueueMembers() {
java.time.ZonedDateTime threshold = com.bytedesk.core.utils.BdDateUtils.now().minusMinutes(IDLE_QUEUE_TIMEOUT_MINUTES);
java.util.List<QueueMemberEntity> idleList = queueMemberRepository.findIdleBefore(threshold);
int removed = 0;
for (QueueMemberEntity qm : idleList) {
// 只处理仍处于排队状态的线程
if (qm.getThread() != null && qm.getThread().isQueuing()) {
qm.setDeleted(true);
qm.setVisitorLeavedAt(com.bytedesk.core.utils.BdDateUtils.now());
save(qm);
removed++;
}
}
return removed;
}
@Cacheable(value = "queue_member", key = "#uid", unless = "#result == null")
@Override

View File

@@ -48,6 +48,7 @@ import com.bytedesk.core.thread.ThreadResponse;
import com.bytedesk.core.thread.ThreadRestService;
import com.bytedesk.core.thread.ThreadRequest;
import com.bytedesk.core.thread.enums.ThreadCloseTypeEnum;
import java.time.ZonedDateTime;
import com.bytedesk.service.queue_member.QueueMemberRestService;
import com.bytedesk.core.utils.JsonResult;
@@ -202,6 +203,18 @@ public class VisitorRestControllerVisitor {
return ResponseEntity.ok(JsonResult.success("close success", response));
}
/**
* 关闭来源分布报表(按 updatedAt 时间范围统计)
*/
@GetMapping("/thread/report/close-type")
public ResponseEntity<?> reportCloseType(@RequestParam(value = "start", required = false) Long startEpoch,
@RequestParam(value = "end", required = false) Long endEpoch) {
ZonedDateTime end = endEpoch != null ? ZonedDateTime.ofInstant(java.time.Instant.ofEpochMilli(endEpoch), java.time.ZoneId.systemDefault()) : ZonedDateTime.now();
ZonedDateTime start = startEpoch != null ? ZonedDateTime.ofInstant(java.time.Instant.ofEpochMilli(startEpoch), java.time.ZoneId.systemDefault()) : end.minusDays(1);
Map<String, Long> data = threadRestService.reportClosedByCloseType(start, end);
return ResponseEntity.ok(JsonResult.success("report success", data));
}
// 清空当前用户所有未读消息
@PostMapping("/message/unread/clear")
public ResponseEntity<?> clearMessageUnread(@RequestBody MessageUnreadRequest request) {

View File

@@ -0,0 +1,259 @@
<!DOCTYPE html>
<html lang="${lang! 'zh-CN'}">
<head>
<#-- Header -->
<#include "./common/header_meta.ftl" />
<#include "./common/header_js.ftl" />
<#include "./common/header_css.ftl" />
<#-- i18n macro -->
<#include "./common/macro/i18n.ftl" />
</head>
<body>
<#-- 导航 -->
<#include "./common/header_nav.ftl" />
<!-- **************** MAIN CONTENT START **************** -->
<main>
<!-- =======================
Page Banner START -->
<section class="bg-light py-5">
<div class="container">
<div class="row g-4 g-md-5 position-relative">
<!-- Main content START -->
<div class="col-lg-8">
<!-- Title -->
<h1><@t key="page.ai.title">AI Agent - 智能代理平台</@t></h1>
<p class="lead"><@t key="page.ai.subtitle">对接主流大模型,打造企业智能助手</@t></p>
</div>
<!-- Main content END -->
<!-- Image -->
<div class="col-lg-4 text-center">
<img src="assets/images/element/online.svg" class="h-200px" alt="<@t key='alt.ai.icon'>AI Agent图标</@t>">
</div>
</div>
</div>
</section>
<!-- =======================
Page Banner END -->
<!-- =======================
Features START -->
<section>
<div class="container">
<!-- Title -->
<div class="row mb-4">
<div class="col-12 text-center">
<h2><@t key="page.ai.features.title">核心功能</@t></h2>
<p class="mb-0"><@t key="page.ai.features.desc">AI技术赋能企业业务流程</@t></p>
</div>
</div>
<!-- Feature list -->
<div class="row g-4">
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-primary bg-opacity-10 text-primary rounded-circle mb-3">
<i class="bi bi-cpu fs-5"></i>
</div>
<h5><@t key="page.ai.feature.llm.title">多模型支持</@t></h5>
<p class="mb-0"><@t key="page.ai.feature.llm.desc">对接Ollama、DeepSeek、智谱、通义千问等主流大模型灵活选择最适合的AI能力</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-success bg-opacity-10 text-success rounded-circle mb-3">
<i class="bi bi-server fs-5"></i>
</div>
<h5><@t key="page.ai.feature.deploy.title">私有部署</@t></h5>
<p class="mb-0"><@t key="page.ai.feature.deploy.desc">支持本地部署Ollama等开源大模型数据安全完全可控无需担心隐私泄露</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-warning bg-opacity-10 text-warning rounded-circle mb-3">
<i class="bi bi-chat-quote fs-5"></i>
</div>
<h5><@t key="page.ai.feature.assistant.title">智能对话</@t></h5>
<p class="mb-0"><@t key="page.ai.feature.assistant.desc">自然语言理解,上下文记忆,多轮对话,提供类人化的交互体验</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-info bg-opacity-10 text-info rounded-circle mb-3">
<i class="bi bi-book fs-5"></i>
</div>
<h5><@t key="page.ai.feature.rag.title">知识库问答</@t></h5>
<p class="mb-0"><@t key="page.ai.feature.rag.desc">基于RAG技术结合企业知识库提供精准答案减少幻觉提升可靠性</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-danger bg-opacity-10 text-danger rounded-circle mb-3">
<i class="bi bi-diagram-3 fs-5"></i>
</div>
<h5><@t key="page.ai.feature.agent.title">智能体编排</@t></h5>
<p class="mb-0"><@t key="page.ai.feature.agent.desc">Function Calling、MCP协议支持构建复杂的AI智能体工作流</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-purple bg-opacity-10 text-purple rounded-circle mb-3">
<i class="bi bi-code-slash fs-5"></i>
</div>
<h5><@t key="page.ai.feature.api.title">API接口</@t></h5>
<p class="mb-0"><@t key="page.ai.feature.api.desc">标准化API接口方便集成到现有业务系统快速实现AI能力</@t></p>
</div>
</div>
</div>
</div>
</section>
<!-- =======================
Features END -->
<!-- =======================
Models START -->
<section class="bg-light">
<div class="container">
<div class="row mb-4">
<div class="col-12 text-center">
<h2><@t key="page.ai.models.title">支持的大模型</@t></h2>
</div>
</div>
<div class="row g-4">
<!-- Model card -->
<div class="col-md-6 col-lg-3">
<div class="card text-center h-100">
<div class="card-body">
<h5 class="card-title">Ollama</h5>
<p class="card-text small"><@t key="page.ai.model.ollama">本地部署开源免费支持Llama、Qwen等多种模型</@t></p>
</div>
</div>
</div>
<!-- Model card -->
<div class="col-md-6 col-lg-3">
<div class="card text-center h-100">
<div class="card-body">
<h5 class="card-title">DeepSeek</h5>
<p class="card-text small"><@t key="page.ai.model.deepseek">国产优秀大模型,性价比高,推理能力强</@t></p>
</div>
</div>
</div>
<!-- Model card -->
<div class="col-md-6 col-lg-3">
<div class="card text-center h-100">
<div class="card-body">
<h5 class="card-title"><@t key="page.ai.model.zhipu.name">智谱AI</@t></h5>
<p class="card-text small"><@t key="page.ai.model.zhipu">清华技术背景,中文理解能力出色</@t></p>
</div>
</div>
</div>
<!-- Model card -->
<div class="col-md-6 col-lg-3">
<div class="card text-center h-100">
<div class="card-body">
<h5 class="card-title"><@t key="page.ai.model.qwen.name">通义千问</@t></h5>
<p class="card-text small"><@t key="page.ai.model.qwen">阿里云出品,多模态能力强大</@t></p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- =======================
Models END -->
<!-- =======================
Use Cases START -->
<section>
<div class="container">
<div class="row mb-4">
<div class="col-12 text-center">
<h2><@t key="page.ai.usecases.title">应用场景</@t></h2>
</div>
</div>
<div class="row g-4">
<!-- Use case 1 -->
<div class="col-md-6">
<div class="card border h-100">
<div class="card-body">
<h5 class="card-title"><@t key="page.ai.usecase.customer.title">智能客服</@t></h5>
<p class="card-text"><@t key="page.ai.usecase.customer.desc">7x24小时自动回复客户咨询结合知识库提供准确答案人工坐席兜底</@t></p>
</div>
</div>
</div>
<!-- Use case 2 -->
<div class="col-md-6">
<div class="card border h-100">
<div class="card-body">
<h5 class="card-title"><@t key="page.ai.usecase.writing.title">内容创作</@t></h5>
<p class="card-text"><@t key="page.ai.usecase.writing.desc">AI写作助手自动生成文档、报告、公告等内容提升创作效率</@t></p>
</div>
</div>
</div>
<!-- Use case 3 -->
<div class="col-md-6">
<div class="card border h-100">
<div class="card-body">
<h5 class="card-title"><@t key="page.ai.usecase.analysis.title">数据分析</@t></h5>
<p class="card-text"><@t key="page.ai.usecase.analysis.desc">自然语言查询数据,自动生成报表和可视化图表,洞察业务趋势</@t></p>
</div>
</div>
</div>
<!-- Use case 4 -->
<div class="col-md-6">
<div class="card border h-100">
<div class="card-body">
<h5 class="card-title"><@t key="page.ai.usecase.automation.title">流程自动化</@t></h5>
<p class="card-text"><@t key="page.ai.usecase.automation.desc">智能体自动执行重复性任务,工作流编排提升业务效率</@t></p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- =======================
Use Cases END -->
<#include "./common/action_box.ftl" />
</main>
<!-- **************** MAIN CONTENT END **************** -->
<!-- ======================= Footer START -->
<#include "./common/footer_nav.ftl" />
<!-- ======================= Footer END -->
<#include "./common/footer_js.ftl" />
<#-- livechat code 客服代码 -->
<#include "./common/bytedesk.ftl" />
<#-- trace code 统计代码 -->
<#include "./common/track.ftl" />
</body>
</html>

View File

@@ -0,0 +1,236 @@
<!DOCTYPE html>
<html lang="${lang! 'zh-CN'}">
<head>
<#-- Header -->
<#include "./common/header_meta.ftl" />
<#include "./common/header_js.ftl" />
<#include "./common/header_css.ftl" />
<#-- i18n macro -->
<#include "./common/macro/i18n.ftl" />
</head>
<body>
<#-- 导航 -->
<#include "./common/header_nav.ftl" />
<!-- **************** MAIN CONTENT START **************** -->
<main>
<!-- =======================
Page Banner START -->
<section class="bg-light py-5">
<div class="container">
<div class="row g-4 g-md-5 position-relative">
<!-- Main content START -->
<div class="col-lg-8">
<!-- Title -->
<h1><@t key="page.kbase.title">企业知识库 / 帮助中心</@t></h1>
<p class="lead"><@t key="page.kbase.subtitle">AI赋能的企业知识管理与服务平台</@t></p>
</div>
<!-- Main content END -->
<!-- Image -->
<div class="col-lg-4 text-center">
<img src="assets/images/element/engineering.svg" class="h-200px" alt="<@t key='alt.kbase.icon'>知识库图标</@t>">
</div>
</div>
</div>
</section>
<!-- =======================
Page Banner END -->
<!-- =======================
Features START -->
<section>
<div class="container">
<!-- Title -->
<div class="row mb-4">
<div class="col-12 text-center">
<h2><@t key="page.kbase.features.title">核心功能</@t></h2>
<p class="mb-0"><@t key="page.kbase.features.desc">全方位的知识管理解决方案</@t></p>
</div>
</div>
<!-- Feature list -->
<div class="row g-4">
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-primary bg-opacity-10 text-primary rounded-circle mb-3">
<i class="bi bi-folder fs-5"></i>
</div>
<h5><@t key="page.kbase.feature.manage.title">知识管理</@t></h5>
<p class="mb-0"><@t key="page.kbase.feature.manage.desc">文档分类管理、版本控制、权限设置,构建结构化的企业知识体系</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-success bg-opacity-10 text-success rounded-circle mb-3">
<i class="bi bi-robot fs-5"></i>
</div>
<h5><@t key="page.kbase.feature.aiwriter.title">AI写作助手</@t></h5>
<p class="mb-0"><@t key="page.kbase.feature.aiwriter.desc">自动撰写文档内容、智能润色、多语言翻译,大幅提升内容创作效率</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-warning bg-opacity-10 text-warning rounded-circle mb-3">
<i class="bi bi-chat-left-dots fs-5"></i>
</div>
<h5><@t key="page.kbase.feature.aiqa.title">AI知识问答</@t></h5>
<p class="mb-0"><@t key="page.kbase.feature.aiqa.desc">基于知识库内容的智能问答,快速定位答案,提升知识检索效率</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-info bg-opacity-10 text-info rounded-circle mb-3">
<i class="bi bi-search fs-5"></i>
</div>
<h5><@t key="page.kbase.feature.search.title">全文搜索</@t></h5>
<p class="mb-0"><@t key="page.kbase.feature.search.desc">强大的全文检索能力,支持模糊搜索、高亮显示、搜索建议</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-danger bg-opacity-10 text-danger rounded-circle mb-3">
<i class="bi bi-globe fs-5"></i>
</div>
<h5><@t key="page.kbase.feature.public.title">对外发布</@t></h5>
<p class="mb-0"><@t key="page.kbase.feature.public.desc">支持将知识库发布为公开帮助中心,为客户提供自助服务</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-purple bg-opacity-10 text-purple rounded-circle mb-3">
<i class="bi bi-people fs-5"></i>
</div>
<h5><@t key="page.kbase.feature.collab.title">协作编辑</@t></h5>
<p class="mb-0"><@t key="page.kbase.feature.collab.desc">多人协作编辑、评论反馈、变更追踪,促进知识共建共享</@t></p>
</div>
</div>
</div>
</div>
</section>
<!-- =======================
Features END -->
<!-- =======================
Scenarios START -->
<section class="bg-light">
<div class="container">
<div class="row mb-4">
<div class="col-12 text-center">
<h2><@t key="page.kbase.scenarios.title">应用场景</@t></h2>
</div>
</div>
<div class="row g-4">
<div class="col-lg-6">
<div class="card h-100">
<div class="card-body">
<h5 class="card-title"><@t key="page.kbase.scenario.internal.title">内部知识库</@t></h5>
<ul>
<li><@t key="page.kbase.scenario.internal.item1">技术文档、开发规范、API文档</@t></li>
<li><@t key="page.kbase.scenario.internal.item2">培训资料、操作手册、FAQ</@t></li>
<li><@t key="page.kbase.scenario.internal.item3">制度流程、规章制度、通知公告</@t></li>
<li><@t key="page.kbase.scenario.internal.item4">项目文档、会议纪要、知识沉淀</@t></li>
</ul>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="card h-100">
<div class="card-body">
<h5 class="card-title"><@t key="page.kbase.scenario.external.title">对外帮助中心</@t></h5>
<ul>
<li><@t key="page.kbase.scenario.external.item1">产品使用说明、功能介绍</@t></li>
<li><@t key="page.kbase.scenario.external.item2">常见问题解答、故障排查</@t></li>
<li><@t key="page.kbase.scenario.external.item3">视频教程、图文教程</@t></li>
<li><@t key="page.kbase.scenario.external.item4">更新日志、版本说明</@t></li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- =======================
Scenarios END -->
<!-- =======================
Benefits START -->
<section>
<div class="container">
<div class="row mb-4">
<div class="col-12 text-center">
<h2><@t key="page.kbase.benefits.title">核心价值</@t></h2>
</div>
</div>
<div class="row g-4 align-items-center">
<div class="col-lg-6">
<ul class="list-group list-group-borderless">
<li class="list-group-item d-flex">
<i class="bi bi-check-circle-fill text-success me-2"></i>
<@t key="page.kbase.benefit.efficiency">减少重复性咨询,提升客服效率和客户满意度</@t>
</li>
<li class="list-group-item d-flex">
<i class="bi bi-check-circle-fill text-success me-2"></i>
<@t key="page.kbase.benefit.knowledge">沉淀企业知识资产,避免知识流失</@t>
</li>
<li class="list-group-item d-flex">
<i class="bi bi-check-circle-fill text-success me-2"></i>
<@t key="page.kbase.benefit.onboarding">加速新员工培训,降低学习成本</@t>
</li>
<li class="list-group-item d-flex">
<i class="bi bi-check-circle-fill text-success me-2"></i>
<@t key="page.kbase.benefit.selfservice">提供自助服务,降低人工支持成本</@t>
</li>
<li class="list-group-item d-flex">
<i class="bi bi-check-circle-fill text-success me-2"></i>
<@t key="page.kbase.benefit.ai">AI技术赋能提升内容质量和检索效率</@t>
</li>
</ul>
</div>
<div class="col-lg-6 text-center">
<img src="assets/images/element/07.svg" class="img-fluid" alt="<@t key='alt.kbase.benefit'>知识库价值插图</@t>">
</div>
</div>
</div>
</section>
<!-- =======================
Benefits END -->
<#include "./common/action_box.ftl" />
</main>
<!-- **************** MAIN CONTENT END **************** -->
<!-- ======================= Footer START -->
<#include "./common/footer_nav.ftl" />
<!-- ======================= Footer END -->
<#include "./common/footer_js.ftl" />
<#-- livechat code 客服代码 -->
<#include "./common/bytedesk.ftl" />
<#-- trace code 统计代码 -->
<#include "./common/track.ftl" />
</body>
</html>

View File

@@ -0,0 +1,250 @@
<!DOCTYPE html>
<html lang="${lang! 'zh-CN'}">
<head>
<#-- Header -->
<#include "./common/header_meta.ftl" />
<#include "./common/header_js.ftl" />
<#include "./common/header_css.ftl" />
<#-- i18n macro -->
<#include "./common/macro/i18n.ftl" />
</head>
<body>
<#-- 导航 -->
<#include "./common/header_nav.ftl" />
<!-- **************** MAIN CONTENT START **************** -->
<main>
<!-- =======================
Page Banner START -->
<section class="bg-light py-5">
<div class="container">
<div class="row g-4 g-md-5 position-relative">
<!-- Main content START -->
<div class="col-lg-8">
<!-- Title -->
<h1><@t key="page.team.title">企业IM - 智能即时通讯平台</@t></h1>
<p class="lead"><@t key="page.team.subtitle">面向中大型团队打造的企业级即时通讯解决方案</@t></p>
</div>
<!-- Main content END -->
<!-- Image -->
<div class="col-lg-4 text-center">
<img src="assets/images/element/coding.svg" class="h-200px" alt="<@t key='alt.team.icon'>企业IM图标</@t>">
</div>
</div>
</div>
</section>
<!-- =======================
Page Banner END -->
<!-- =======================
Features START -->
<section>
<div class="container">
<!-- Title -->
<div class="row mb-4">
<div class="col-12 text-center">
<h2><@t key="page.team.features.title">核心功能</@t></h2>
<p class="mb-0"><@t key="page.team.features.desc">为企业团队协作提供全方位支持</@t></p>
</div>
</div>
<!-- Feature list -->
<div class="row g-4">
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-primary bg-opacity-10 text-primary rounded-circle mb-3">
<i class="bi bi-chat-dots fs-5"></i>
</div>
<h5><@t key="page.team.feature.chat.title">即时通讯</@t></h5>
<p class="mb-0"><@t key="page.team.feature.chat.desc">支持单聊、群聊、文件传输、语音视频通话等完整IM功能支持数万人同时在线</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-success bg-opacity-10 text-success rounded-circle mb-3">
<i class="bi bi-robot fs-5"></i>
</div>
<h5><@t key="page.team.feature.ai.title">AI智能助手</@t></h5>
<p class="mb-0"><@t key="page.team.feature.ai.desc">AI群聊助手自动回答常见问题AI会话总结提炼关键信息提升沟通效率</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-warning bg-opacity-10 text-warning rounded-circle mb-3">
<i class="bi bi-people fs-5"></i>
</div>
<h5><@t key="page.team.feature.org.title">组织架构</@t></h5>
<p class="mb-0"><@t key="page.team.feature.org.desc">完善的组织架构管理,支持部门、角色、权限配置,灵活适配企业组织结构</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-info bg-opacity-10 text-info rounded-circle mb-3">
<i class="bi bi-shield-check fs-5"></i>
</div>
<h5><@t key="page.team.feature.security.title">安全可靠</@t></h5>
<p class="mb-0"><@t key="page.team.feature.security.desc">端到端加密,聊天记录监控,敏感信息过滤,满足企业安全合规要求</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-danger bg-opacity-10 text-danger rounded-circle mb-3">
<i class="bi bi-clock-history fs-5"></i>
</div>
<h5><@t key="page.team.feature.history.title">消息存档</@t></h5>
<p class="mb-0"><@t key="page.team.feature.history.desc">完整的聊天记录存储与检索,支持历史消息搜索,满足审计需求</@t></p>
</div>
</div>
<!-- Feature item -->
<div class="col-md-6 col-lg-4">
<div class="card card-body h-100">
<div class="icon-lg bg-purple bg-opacity-10 text-purple rounded-circle mb-3">
<i class="bi bi-phone fs-5"></i>
</div>
<h5><@t key="page.team.feature.multiplatform.title">多平台支持</@t></h5>
<p class="mb-0"><@t key="page.team.feature.multiplatform.desc">支持Web、Windows、Mac、Linux、iOS、Android等全平台随时随地沟通</@t></p>
</div>
</div>
</div>
</div>
</section>
<!-- =======================
Features END -->
<!-- =======================
Advantages START -->
<section class="bg-light">
<div class="container">
<div class="row mb-4">
<div class="col-12 text-center">
<h2><@t key="page.team.advantages.title">产品优势</@t></h2>
</div>
</div>
<div class="row g-4 align-items-center">
<!-- Left content -->
<div class="col-lg-6">
<ul class="list-group list-group-borderless">
<li class="list-group-item d-flex">
<i class="bi bi-check-circle-fill text-success me-2"></i>
<@t key="page.team.advantage.scalable">高并发架构设计,支持数万人同时在线,轻松应对大规模团队协作</@t>
</li>
<li class="list-group-item d-flex">
<i class="bi bi-check-circle-fill text-success me-2"></i>
<@t key="page.team.advantage.opensource">完全开源支持私有部署数据100%掌控在您手中</@t>
</li>
<li class="list-group-item d-flex">
<i class="bi bi-check-circle-fill text-success me-2"></i>
<@t key="page.team.advantage.customizable">灵活的二次开发能力,可根据企业需求深度定制</@t>
</li>
<li class="list-group-item d-flex">
<i class="bi bi-check-circle-fill text-success me-2"></i>
<@t key="page.team.advantage.integrated">与其他企业系统无缝集成,打造统一工作平台</@t>
</li>
<li class="list-group-item d-flex">
<i class="bi bi-check-circle-fill text-success me-2"></i>
<@t key="page.team.advantage.ai">AI技术赋能智能助手提升沟通效率和质量</@t>
</li>
</ul>
</div>
<!-- Right image -->
<div class="col-lg-6 text-center">
<img src="assets/images/element/07.svg" class="img-fluid" alt="<@t key='alt.team.advantage'>企业IM优势插图</@t>">
</div>
</div>
</div>
</section>
<!-- =======================
Advantages END -->
<!-- =======================
Use Cases START -->
<section>
<div class="container">
<div class="row mb-4">
<div class="col-12 text-center">
<h2><@t key="page.team.usecases.title">应用场景</@t></h2>
</div>
</div>
<div class="row g-4">
<!-- Use case 1 -->
<div class="col-md-6">
<div class="card border h-100">
<div class="card-body">
<h5 class="card-title"><@t key="page.team.usecase.internal.title">企业内部协作</@t></h5>
<p class="card-text"><@t key="page.team.usecase.internal.desc">部门间沟通、项目协作、工作汇报、通知公告等日常办公场景</@t></p>
</div>
</div>
</div>
<!-- Use case 2 -->
<div class="col-md-6">
<div class="card border h-100">
<div class="card-body">
<h5 class="card-title"><@t key="page.team.usecase.remote.title">远程办公</@t></h5>
<p class="card-text"><@t key="page.team.usecase.remote.desc">分布式团队实时沟通,跨地域协作,在线会议,远程培训</@t></p>
</div>
</div>
</div>
<!-- Use case 3 -->
<div class="col-md-6">
<div class="card border h-100">
<div class="card-body">
<h5 class="card-title"><@t key="page.team.usecase.support.title">内部支持</@t></h5>
<p class="card-text"><@t key="page.team.usecase.support.desc">IT支持、HR咨询、行政服务等内部支持场景提升员工体验</@t></p>
</div>
</div>
</div>
<!-- Use case 4 -->
<div class="col-md-6">
<div class="card border h-100">
<div class="card-body">
<h5 class="card-title"><@t key="page.team.usecase.emergency.title">应急指挥</@t></h5>
<p class="card-text"><@t key="page.team.usecase.emergency.desc">突发事件快速响应,紧急通知即时触达,协同处置提升效率</@t></p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- =======================
Use Cases END -->
<#include "./common/action_box.ftl" />
</main>
<!-- **************** MAIN CONTENT END **************** -->
<!-- ======================= Footer START -->
<#include "./common/footer_nav.ftl" />
<!-- ======================= Footer END -->
<#include "./common/footer_js.ftl" />
<#-- livechat code 客服代码 -->
<#include "./common/bytedesk.ftl" />
<#-- trace code 统计代码 -->
<#include "./common/track.ftl" />
</body>
</html>