visualization_center/cs_chart.html

1607 lines
61 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>客服工作台 - 优化版</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
}
body {
background-color: #f5f9f5;
color: #333;
line-height: 1.5;
font-size: 13px;
}
.container {
max-width: 1800px;
margin: 0 auto;
padding: 15px;
}
/* 绿色主题颜色定义 */
:root {
--primary-green: #2e7d32;
--secondary-green: #4caf50;
--light-green: #e8f5e9;
--medium-green: #81c784;
--dark-green: #1b5e20;
--text-color: #333;
--border-color: #c8e6c9;
}
/* 头部样式 */
header {
background-color: var(--primary-green);
color: white;
padding: 12px 15px;
border-radius: 6px 6px 0 0;
box-shadow: 0 2px 8px rgba(46, 125, 50, 0.2);
margin-bottom: 15px;
}
header h1 {
display: flex;
align-items: center;
gap: 10px;
font-size: 1.5rem;
}
header h1 i {
color: #e8f5e9;
}
/* 搜索栏紧凑样式 */
.search-bar {
background-color: white;
padding: 15px;
border-radius: 6px;
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.08);
margin-bottom: 15px;
border-left: 4px solid var(--secondary-green);
}
.search-row {
display: flex;
flex-wrap: nowrap;
align-items: center;
gap: 12px;
}
.search-field {
display: flex;
flex-direction: column;
flex-shrink: 0;
}
.search-field.compact {
min-width: 0;
}
.search-field label {
font-weight: 600;
margin-bottom: 5px;
color: var(--dark-green);
font-size: 0.85rem;
white-space: nowrap;
}
.search-field input, .search-field select {
padding: 7px 9px;
border: 1px solid var(--border-color);
border-radius: 3px;
font-size: 0.85rem;
transition: border-color 0.3s;
min-width: 120px;
height: 32px;
}
.search-field.compact input, .search-field.compact select {
min-width: 100px;
}
.search-field input:focus, .search-field select:focus {
outline: none;
border-color: var(--secondary-green);
box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.2);
}
.date-range {
display: flex;
align-items: flex-end;
gap: 5px;
}
.date-range .search-field {
min-width: 140px;
}
/* 按钮样式 */
.btn {
padding: 7px 12px;
border: none;
border-radius: 3px;
font-weight: 600;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
transition: all 0.3s;
font-size: 0.85rem;
height: 32px;
white-space: nowrap;
}
.btn-primary {
background-color: var(--primary-green);
color: white;
}
.btn-primary:hover {
background-color: var(--dark-green);
}
.btn-secondary {
background-color: var(--light-green);
color: var(--dark-green);
border: 1px solid var(--border-color);
}
.btn-secondary:hover {
background-color: var(--medium-green);
}
.btn-more {
background-color: #f1f8e9;
color: var(--dark-green);
}
.btn-kpi {
background-color: #e3f2fd;
color: #1565c0;
}
.btn-kpi:hover {
background-color: #bbdefb;
}
.btn-icon {
padding: 7px;
min-width: 32px;
}
/* 高级查询栏 - 默认隐藏 */
.query-bar {
background-color: white;
padding: 0;
border-radius: 6px;
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.08);
margin-bottom: 15px;
overflow: hidden;
max-height: 0;
opacity: 0;
transition: all 0.5s ease;
border-left: 4px solid var(--medium-green);
}
.query-bar.show {
padding: 15px;
max-height: 180px;
opacity: 1;
margin-bottom: 15px;
overflow-x: auto;
}
.query-bar h3 {
color: var(--dark-green);
margin-bottom: 12px;
padding-bottom: 8px;
border-bottom: 1px solid var(--border-color);
display: flex;
align-items: center;
gap: 8px;
font-size: 1rem;
white-space: nowrap;
}
.query-items {
display: flex;
flex-wrap: nowrap;
gap: 10px;
min-width: 1500px;
}
.query-btn {
padding: 8px 15px;
background-color: var(--light-green);
border: 1px solid var(--border-color);
border-radius: 4px;
color: var(--dark-green);
font-weight: 600;
cursor: pointer;
transition: all 0.3s;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-width: 120px;
text-align: center;
flex-shrink: 0;
white-space: nowrap;
}
.query-btn:hover {
background-color: var(--medium-green);
transform: translateY(-2px);
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.1);
}
.query-btn i {
font-size: 1.2rem;
margin-bottom: 5px;
color: var(--primary-green);
}
.query-btn span {
font-size: 0.9rem;
}
/* KPI数据栏 - 默认隐藏 */
.kpi-bar {
background-color: white;
padding: 0;
border-radius: 6px;
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.08);
margin-bottom: 15px;
overflow: hidden;
max-height: 0;
opacity: 0;
transition: all 0.5s ease;
border-left: 4px solid #1565c0;
}
.kpi-bar.show {
padding: 15px;
max-height: 140px;
opacity: 1;
margin-bottom: 15px;
overflow-x: auto;
}
.kpi-bar h3 {
color: #1565c0;
margin-bottom: 12px;
padding-bottom: 8px;
border-bottom: 1px solid #bbdefb;
display: flex;
align-items: center;
gap: 8px;
font-size: 1rem;
white-space: nowrap;
}
.kpi-items {
display: flex;
flex-wrap: nowrap;
gap: 15px;
min-width: 1800px;
}
.kpi-item {
padding: 10px;
background-color: #e3f2fd;
border-radius: 4px;
text-align: center;
border: 1px solid #bbdefb;
min-width: 150px;
flex-shrink: 0;
}
.kpi-item.driver {
background-color: #e8f5e9;
border-color: #c8e6c9;
}
.kpi-item.driver .value {
color: var(--primary-green);
}
.kpi-item.driver .label {
color: var(--dark-green);
}
.kpi-item .value {
font-size: 1.4rem;
font-weight: 700;
color: #1565c0;
margin-bottom: 2px;
}
.kpi-item .sub-value {
font-size: 0.9rem;
color: #2196f3;
font-weight: 500;
margin-bottom: 5px;
}
.kpi-item .label {
font-size: 0.85rem;
color: #0d47a1;
font-weight: 600;
}
/* 任务栏样式 */
.task-bar {
background-color: white;
padding: 15px;
border-radius: 6px;
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.08);
margin-bottom: 15px;
border-left: 4px solid var(--secondary-green);
}
.task-bar h3 {
color: var(--dark-green);
margin-bottom: 12px;
display: flex;
align-items: center;
gap: 8px;
font-size: 1rem;
}
.task-items {
display: flex;
flex-wrap: nowrap;
gap: 10px;
overflow-x: auto;
padding-bottom: 5px;
}
.task-item {
padding: 10px 12px;
background-color: var(--light-green);
border-radius: 4px;
text-align: center;
cursor: pointer;
transition: all 0.3s;
border: 1px solid var(--border-color);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-width: 110px;
flex-shrink: 0;
}
.task-item:hover {
background-color: var(--medium-green);
transform: translateY(-2px);
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.1);
}
.task-item i {
font-size: 1.2rem;
color: var(--primary-green);
margin-bottom: 5px;
}
.task-item span {
display: block;
font-weight: 600;
color: var(--dark-green);
font-size: 0.9rem;
white-space: nowrap;
}
.task-item small {
font-size: 0.75rem;
color: #666;
margin-top: 2px;
}
/* 案件信息表格 */
.case-table-container {
background-color: white;
border-radius: 6px;
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.08);
overflow: hidden;
}
.table-header {
background-color: var(--primary-green);
color: white;
padding: 12px 15px;
display: flex;
justify-content: space-between;
align-items: center;
}
.table-header h3 {
display: flex;
align-items: center;
gap: 8px;
font-size: 1rem;
}
.table-header-actions {
display: flex;
align-items: center;
gap: 10px;
}
table {
width: 100%;
border-collapse: collapse;
table-layout: fixed;
}
thead {
background-color: var(--light-green);
}
th {
padding: 10px 8px;
text-align: left;
font-weight: 600;
color: var(--dark-green);
border-bottom: 2px solid var(--border-color);
font-size: 0.85rem;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
td {
padding: 8px;
border-bottom: 1px solid var(--border-color);
font-size: 0.85rem;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
tbody tr:hover {
background-color: #f9fdf9;
}
.action-buttons {
display: flex;
gap: 6px;
}
.action-btn {
padding: 4px 8px;
border-radius: 3px;
font-size: 0.8rem;
cursor: pointer;
border: none;
display: flex;
align-items: center;
gap: 4px;
transition: all 0.3s;
white-space: nowrap;
}
.chat-btn {
background-color: #e8f5e9;
color: var(--dark-green);
}
.chat-btn:hover {
background-color: var(--medium-green);
}
.review-btn {
background-color: #e3f2fd;
color: #1565c0;
}
.review-btn:hover {
background-color: #bbdefb;
}
.complaint-btn {
background-color: #ffebee;
color: #c62828;
}
.complaint-btn:hover {
background-color: #ffcdd2;
}
/* 模态框样式 */
.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 1000;
justify-content: center;
align-items: center;
}
.modal-content {
background-color: white;
border-radius: 6px;
width: 90%;
max-width: 450px;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2);
overflow: hidden;
}
.modal-header {
background-color: var(--primary-green);
color: white;
padding: 15px;
display: flex;
justify-content: space-between;
align-items: center;
}
.modal-body {
padding: 20px;
}
.close-btn {
background: none;
border: none;
color: white;
font-size: 1.3rem;
cursor: pointer;
line-height: 1;
}
.chat-box {
height: 250px;
overflow-y: auto;
border: 1px solid #ddd;
border-radius: 3px;
padding: 12px;
margin-bottom: 12px;
background-color: #fafafa;
font-size: 0.85rem;
}
.message {
margin-bottom: 10px;
padding: 8px;
border-radius: 4px;
max-width: 80%;
font-size: 0.85rem;
}
.message.received {
background-color: #e8f5e9;
align-self: flex-start;
}
.message.sent {
background-color: #f1f8e9;
align-self: flex-end;
margin-left: auto;
}
/* 响应式设计 */
@media (max-width: 1600px) {
.search-row {
flex-wrap: wrap;
row-gap: 10px;
}
}
@media (max-width: 1200px) {
.container {
padding: 10px;
}
.query-bar.show {
max-height: 200px;
}
.query-items {
flex-wrap: wrap;
min-width: auto;
}
}
@media (max-width: 992px) {
.search-row {
gap: 10px;
}
table {
display: block;
overflow-x: auto;
}
}
@media (max-width: 768px) {
.container {
padding: 8px;
}
.search-field {
min-width: 120px !important;
}
.btn {
padding: 6px 10px;
font-size: 0.8rem;
}
.action-buttons {
flex-direction: column;
}
.task-items {
overflow-x: auto;
padding-bottom: 10px;
}
.table-header {
flex-direction: column;
align-items: flex-start;
gap: 10px;
}
.table-header-actions {
align-self: flex-end;
}
}
@media (max-width: 576px) {
.search-actions {
flex-direction: column;
}
.btn {
width: 100%;
}
}
/* 自定义滚动条 */
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 3px;
}
::-webkit-scrollbar-thumb {
background: #bdbdbd;
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: #9e9e9e;
}
</style>
</head>
<body>
<div class="container">
<header>
<h1><i class="fas fa-headset"></i> 客服工作台管理系统</h1>
</header>
<!-- 搜索栏 - 紧凑设计 -->
<section class="search-bar">
<div class="search-row">
<div class="search-field compact">
<select id="province">
<option value="">选择省份</option>
<option value="zj">浙江省</option>
<option value="js">江苏省</option>
<option value="sh">上海市</option>
</select>
</div>
<div class="search-field compact">
<select id="city">
<option value="">选择城市</option>
<option value="nb">宁波市</option>
<option value="hz">杭州市</option>
<option value="sh">上海市</option>
</select>
</div>
<div class="search-field compact">
<select id="district">
<option value="">选择区域</option>
<option value="nbsouth">宁波南站</option>
<option value="north">江北区</option>
<option value="west">海曙区</option>
</select>
</div>
<div class="search-field compact">
<input type="text" id="order-number" placeholder="订单号">
</div>
<div class="search-field" style="min-width: 180px;">
<input type="text" id="fuzzy-search" placeholder="关键词模糊查询">
</div>
<div class="date-range">
<div class="search-field" style="min-width: 130px;">
<select id="time-type">
<option value="create">创建时间</option>
<option value="expire">到期时间</option>
<option value="insurance">保险时间</option>
</select>
</div>
<div class="search-field" style="min-width: 130px;">
<input type="date" id="start-date">
</div>
<span style="margin-bottom: 5px;"></span>
<div class="search-field" style="min-width: 130px;">
<input type="date" id="end-date">
</div>
</div>
<div class="search-actions" style="display: flex; gap: 8px; margin-left: auto;">
<button class="btn btn-primary" id="search-btn" title="搜索">
<i class="fas fa-search"></i> 搜索
</button>
<button class="btn btn-kpi" id="kpi-btn" title="查看KPI数据">
<i class="fas fa-chart-bar"></i> KPI
</button>
<button class="btn btn-more" id="more-btn" title="更多筛选">
<i class="fas fa-ellipsis-h"></i> 更多
</button>
</div>
</div>
</section>
<!-- KPI数据栏 - 默认隐藏,按新顺序排列 -->
<section class="kpi-bar" id="kpi-bar">
<h3><i class="fas fa-chart-line"></i> KPI数据概览</h3>
<div class="kpi-items">
<div class="kpi-item driver">
<div class="value">245</div>
<div class="label">司机数</div>
</div>
<div class="kpi-item">
<div class="value">156</div>
<div class="label">续费数</div>
</div>
<div class="kpi-item">
<div class="value">45</div>
<div class="label">流失数</div>
</div>
<div class="kpi-item">
<div class="value">987</div>
<div class="sub-value">98.7%</div>
<div class="label">接单数/率</div>
</div>
<div class="kpi-item">
<div class="value">2,541</div>
<div class="sub-value">95.2%</div>
<div class="label">订单数/率</div>
</div>
<div class="kpi-item">
<div class="value">56</div>
<div class="sub-value">2.2%</div>
<div class="label">不符数/率</div>
</div>
<div class="kpi-item">
<div class="value">78</div>
<div class="sub-value">3.1%</div>
<div class="label">超时数/率</div>
</div>
<div class="kpi-item">
<div class="value">342</div>
<div class="sub-value">13.4%</div>
<div class="label">跟进数/率</div>
</div>
<div class="kpi-item">
<div class="value">2,123</div>
<div class="sub-value">83.5%</div>
<div class="label">好评数/率</div>
</div>
<div class="kpi-item">
<div class="value">34</div>
<div class="sub-value">1.3%</div>
<div class="label">投诉数/率</div>
</div>
</div>
</section>
<!-- 高级查询栏 - 默认隐藏,增加司机列表按钮 -->
<section class="query-bar" id="query-bar">
<h3><i class="fas fa-filter"></i> 高级查询条件</h3>
<div class="query-items">
<!-- 司机列表按钮 -->
<div class="query-btn" data-link="driver_list.html" style="background-color: var(--primary-green); color: white; border-color: var(--dark-green);">
<i class="fas fa-users"></i>
<span>司机列表</span>
</div>
<div class="query-btn" data-link="service_score.html">
<i class="fas fa-star"></i>
<span>服务分</span>
</div>
<div class="query-btn" data-link="dispatch_record.html">
<i class="fas fa-tasks"></i>
<span>派单记录</span>
</div>
<div class="query-btn" data-link="online_time.html">
<i class="fas fa-clock"></i>
<span>在线时长</span>
</div>
<div class="query-btn" data-link="reject_record.html">
<i class="fas fa-times-circle"></i>
<span>拒单记录</span>
</div>
<div class="query-btn" data-link="complaint_record.html">
<i class="fas fa-gavel"></i>
<span>投诉记录</span>
</div>
<div class="query-btn" data-link="timeout_record.html">
<i class="fas fa-hourglass-end"></i>
<span>超时记录</span>
</div>
<div class="query-btn" data-link="false_record.html">
<i class="fas fa-ban"></i>
<span>虚假记录</span>
</div>
<div class="query-btn" data-link="premium_record.html">
<i class="fas fa-chart-line"></i>
<span>溢价记录</span>
</div>
<!-- 归属客服下拉框 -->
<div style="display: flex; flex-direction: column; min-width: 140px; flex-shrink: 0;">
<select style="padding: 7px 9px; border: 1px solid var(--border-color); border-radius: 3px; font-size: 0.85rem; height: 32px;">
<option value="">全部客服</option>
<option value="kf1">张三客服</option>
<option value="kf2">李四客服</option>
<option value="kf3">王五客服</option>
<option value="kf4">赵六客服</option>
</select>
<!--业务员下拉框-->
<select style="padding: 7px 9px; border: 1px solid var(--border-color); border-radius: 3px; font-size: 0.85rem; height: 32px;">
<option value="">全部业务员</option>
<option value="kf1">张三业务员</option>
<option value="kf2">李四业务员</option>
<option value="kf3">王五业务员</option>
<option value="kf3">王五业务员</option>
<option value="kf4">赵六业务员</option>
</select>
</div>
</div>
</section>
<!-- 任务栏 - 恢复为8个项目 -->
<section class="task-bar">
<div class="task-items">
<div class="task-item" id="pending-review" data-page="pending_review.html">
<i class="fas fa-phone-alt"></i>
<span>待回访</span>
<small>(12)</small>
</div>
<div class="task-item" id="online-chat" data-page="online_chat.html">
<i class="fas fa-comments"></i>
<span>在线沟通</span>
<small>(8)</small>
</div>
<div class="task-item" id="non-compliance" data-page="non_compliance.html">
<i class="fas fa-exclamation-triangle"></i>
<span>不符跟进</span>
<small>(5)</small>
</div>
<div class="task-item" id="arrival-timeout" data-page="arrival_timeout.html">
<i class="fas fa-clock"></i>
<span>到勘超时</span>
<small>(3)</small>
</div>
<div class="task-item" id="complaint-handling" data-page="complaint_handling.html">
<i class="fas fa-gavel"></i>
<span>投诉处理</span>
<small>(7)</small>
</div>
<div class="task-item" id="false-case" data-page="false_case.html">
<i class="fas fa-ban"></i>
<span>虚假案件</span>
<small>(2)</small>
</div>
<div class="task-item" id="reject-case" data-page="reject_case.html">
<i class="fas fa-times-circle"></i>
<span>拒单案件</span>
<small>(4)</small>
</div>
<div class="task-item" id="premium-case" data-page="premium_case.html">
<i class="fas fa-chart-line"></i>
<span>溢价案件</span>
<small>(1)</small>
</div>
</div>
</section>
<!-- 案件信息处理列表 -->
<section class="case-table-container">
<div class="table-header">
<h3><i class="fas fa-list"></i> 案件信息处理列表</h3>
<div class="table-header-actions">
<span><strong>11</strong> 条记录</span>
<button class="btn btn-secondary" id="export-btn-table" title="导出">
<i class="fas fa-file-export"></i> 导出数据
</button>
</div>
</div>
<table>
<thead>
<tr>
<th style="width: 100px;">订单号</th>
<th style="width: 80px;">服务项目</th>
<th style="width: 80px;">业务来源</th>
<th style="width: 80px;">车主姓名</th>
<th style="width: 110px;">车主号码</th>
<th style="width: 80px;">司机姓名</th>
<th style="width: 110px;">司机号码</th>
<th style="width: 100px;">救援点</th>
<th style="width: 70px;">到勘</th>
<th style="width: 70px;">时效</th>
<th style="width: 70px;">服务分</th>
<th style="width: 70px;">满意度</th>
<th style="width: 180px;">操作</th>
</tr>
</thead>
<tbody>
<tr>
<td>10109089</td>
<td>拖车</td>
<td>壹账通</td>
<td>张山</td>
<td>13456788990</td>
<td>李四</td>
<td>13567877890</td>
<td>宁波南站</td>
<td>3km</td>
<td>12分</td>
<td>3</td>
<td>满意</td>
<td>
<div class="action-buttons">
<button class="action-btn review-btn" data-order="10109089" title="回访">
<i class="fas fa-phone-alt"></i> 回访
</button>
<button class="action-btn chat-btn" data-order="10109089" title="聊天">
<i class="fas fa-comment-dots"></i> 聊天
</button>
<button class="action-btn complaint-btn" data-order="10109089" title="投诉">
<i class="fas fa-gavel"></i> 投诉
</button>
</div>
</td>
</tr>
<tr>
<td>10109090</td>
<td>搭电</td>
<td>平安保险</td>
<td>王五</td>
<td>13856783210</td>
<td>赵六</td>
<td>13987654321</td>
<td>杭州东站</td>
<td>5km</td>
<td>20分</td>
<td>4</td>
<td>非常满意</td>
<td>
<div class="action-buttons">
<button class="action-btn review-btn" data-order="10109090" title="回访">
<i class="fas fa-phone-alt"></i> 回访
</button>
<button class="action-btn chat-btn" data-order="10109090" title="聊天">
<i class="fas fa-comment-dots"></i> 聊天
</button>
<button class="action-btn complaint-btn" data-order="10109090" title="投诉">
<i class="fas fa-gavel"></i> 投诉
</button>
</div>
</td>
</tr>
<tr>
<td>10109091</td>
<td>换胎</td>
<td>太平洋保险</td>
<td>孙七</td>
<td>13765439876</td>
<td>周八</td>
<td>13678901234</td>
<td>上海虹桥</td>
<td>2km</td>
<td>15分</td>
<td>5</td>
<td>满意</td>
<td>
<div class="action-buttons">
<button class="action-btn review-btn" data-order="10109091" title="回访">
<i class="fas fa-phone-alt"></i> 回访
</button>
<button class="action-btn chat-btn" data-order="10109091" title="聊天">
<i class="fas fa-comment-dots"></i> 聊天
</button>
<button class="action-btn complaint-btn" data-order="10109091" title="投诉">
<i class="fas fa-gavel"></i> 投诉
</button>
</div>
</td>
</tr>
<tr>
<td>10109092</td>
<td>拖车</td>
<td>壹账通</td>
<td>刘九</td>
<td>13543218765</td>
<td>郑十</td>
<td>13456789012</td>
<td>南京南站</td>
<td>8km</td>
<td>25分</td>
<td>3</td>
<td>一般</td>
<td>
<div class="action-buttons">
<button class="action-btn review-btn" data-order="10109092" title="回访">
<i class="fas fa-phone-alt"></i> 回访
</button>
<button class="action-btn chat-btn" data-order="10109092" title="聊天">
<i class="fas fa-comment-dots"></i> 聊天
</button>
<button class="action-btn complaint-btn" data-order="10109092" title="投诉">
<i class="fas fa-gavel"></i> 投诉
</button>
</div>
</td>
</tr>
<tr>
<td>10109093</td>
<td>送油</td>
<td>人保</td>
<td>钱一</td>
<td>13987651234</td>
<td>吴二</td>
<td>13876543210</td>
<td>苏州站</td>
<td>4km</td>
<td>18分</td>
<td>4</td>
<td>非常满意</td>
<td>
<div class="action-buttons">
<button class="action-btn review-btn" data-order="10109093" title="回访">
<i class="fas fa-phone-alt"></i> 回访
</button>
<button class="action-btn chat-btn" data-order="10109093" title="聊天">
<i class="fas fa-comment-dots"></i> 聊天
</button>
<button class="action-btn complaint-btn" data-order="10109093" title="投诉">
<i class="fas fa-gavel"></i> 投诉
</button>
</div>
</td>
</tr>
<tr>
<td>10109094</td>
<td>拖车</td>
<td>平安保险</td>
<td>陈三</td>
<td>13678904321</td>
<td>林四</td>
<td>13567894321</td>
<td>无锡站</td>
<td>6km</td>
<td>22分</td>
<td>2</td>
<td>不满意</td>
<td>
<div class="action-buttons">
<button class="action-btn review-btn" data-order="10109094" title="回访">
<i class="fas fa-phone-alt"></i> 回访
</button>
<button class="action-btn chat-btn" data-order="10109094" title="聊天">
<i class="fas fa-comment-dots"></i> 聊天
</button>
<button class="action-btn complaint-btn" data-order="10109094" title="投诉">
<i class="fas fa-gavel"></i> 投诉
</button>
</div>
</td>
</tr>
<tr>
<td>10109095</td>
<td>搭电</td>
<td>太平洋保险</td>
<td>杨五</td>
<td>13456781234</td>
<td>黄六</td>
<td>13765432109</td>
<td>常州站</td>
<td>3km</td>
<td>14分</td>
<td>5</td>
<td>非常满意</td>
<td>
<div class="action-buttons">
<button class="action-btn review-btn" data-order="10109095" title="回访">
<i class="fas fa-phone-alt"></i> 回访
</button>
<button class="action-btn chat-btn" data-order="10109095" title="聊天">
<i class="fas fa-comment-dots"></i> 聊天
</button>
<button class="action-btn complaint-btn" data-order="10109095" title="投诉">
<i class="fas fa-gavel"></i> 投诉
</button>
</div>
</td>
</tr>
<tr>
<td>10109096</td>
<td>换胎</td>
<td>壹账通</td>
<td>朱七</td>
<td>13876549876</td>
<td>秦八</td>
<td>13678905432</td>
<td>镇江站</td>
<td>7km</td>
<td>30分</td>
<td>3</td>
<td>一般</td>
<td>
<div class="action-buttons">
<button class="action-btn review-btn" data-order="10109096" title="回访">
<i class="fas fa-phone-alt"></i> 回访
</button>
<button class="action-btn chat-btn" data-order="10109096" title="聊天">
<i class="fas fa-comment-dots"></i> 聊天
</button>
<button class="action-btn complaint-btn" data-order="10109096" title="投诉">
<i class="fas fa-gavel"></i> 投诉
</button>
</div>
</td>
</tr>
<tr>
<td>10109097</td>
<td>拖车</td>
<td>人保</td>
<td>何九</td>
<td>13567894321</td>
<td>许十</td>
<td>13456789098</td>
<td>嘉兴南站</td>
<td>5km</td>
<td>19分</td>
<td>4</td>
<td>满意</td>
<td>
<div class="action-buttons">
<button class="action-btn review-btn" data-order="10109097" title="回访">
<i class="fas fa-phone-alt"></i> 回访
</button>
<button class="action-btn chat-btn" data-order="10109097" title="聊天">
<i class="fas fa-comment-dots"></i> 聊天
</button>
<button class="action-btn complaint-btn" data-order="10109097" title="投诉">
<i class="fas fa-gavel"></i> 投诉
</button>
</div>
</td>
</tr>
<tr>
<td>10109098</td>
<td>送油</td>
<td>平安保险</td>
<td>吕一</td>
<td>13987655678</td>
<td>施二</td>
<td>13876546789</td>
<td>绍兴站</td>
<td>4km</td>
<td>17分</td>
<td>5</td>
<td>非常满意</td>
<td>
<div class="action-buttons">
<button class="action-btn review-btn" data-order="10109098" title="回访">
<i class="fas fa-phone-alt"></i> 回访
</button>
<button class="action-btn chat-btn" data-order="10109098" title="聊天">
<i class="fas fa-comment-dots"></i> 聊天
</button>
<button class="action-btn complaint-btn" data-order="10109098" title="投诉">
<i class="fas fa-gavel"></i> 投诉
</button>
</div>
</td>
</tr>
<tr>
<td>10109099</td>
<td>搭电</td>
<td>太平洋保险</td>
<td>孔三</td>
<td>13678906543</td>
<td>曹四</td>
<td>13567897654</td>
<td>金华站</td>
<td>6km</td>
<td>23分</td>
<td>3</td>
<td>一般</td>
<td>
<div class="action-buttons">
<button class="action-btn review-btn" data-order="10109099" title="回访">
<i class="fas fa-phone-alt"></i> 回访
</button>
<button class="action-btn chat-btn" data-order="10109099" title="聊天">
<i class="fas fa-comment-dots"></i> 聊天
</button>
<button class="action-btn complaint-btn" data-order="10109099" title="投诉">
<i class="fas fa-gavel"></i> 投诉
</button>
</div>
</td>
</tr>
</tbody>
</table>
</section>
</div>
<!-- 聊天模态框 -->
<div class="modal" id="chat-modal">
<div class="modal-content">
<div class="modal-header">
<h3><i class="fas fa-comments"></i> 在线聊天</h3>
<button class="close-btn" id="close-chat">&times;</button>
</div>
<div class="modal-body">
<div class="chat-box" id="chat-box">
<div class="message received">
<strong>客服:</strong> 您好,请问有什么可以帮助您的?
</div>
<div class="message sent">
<strong>用户:</strong> 我的拖车服务什么时候能到?
</div>
<div class="message received">
<strong>客服:</strong> 根据系统显示司机李四预计在12分钟内到达您的位置。
</div>
</div>
<div class="input-group">
<textarea id="message-input" placeholder="请输入消息..." rows="3" style="width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 3px; font-size: 0.85rem;"></textarea>
<button class="btn btn-primary" id="send-message" style="margin-top: 8px; width: 100%;">
<i class="fas fa-paper-plane"></i> 发送消息
</button>
</div>
</div>
</div>
</div>
<!-- 回访模态框 -->
<div class="modal" id="review-modal">
<div class="modal-content">
<div class="modal-header">
<h3><i class="fas fa-phone-alt"></i> 客户回访</h3>
<button class="close-btn" id="close-review">&times;</button>
</div>
<div class="modal-body">
<p><strong>订单号:</strong> <span id="review-order">10109089</span></p>
<p><strong>客户姓名:</strong> 张山</p>
<p><strong>服务项目:</strong> 拖车</p>
<div style="margin-top: 15px;">
<label><strong>回访结果:</strong></label>
<select id="review-result" style="width: 100%; padding: 8px; margin-top: 5px; border: 1px solid #ddd; border-radius: 3px; font-size: 0.85rem;">
<option value="满意">满意</option>
<option value="一般">一般</option>
<option value="不满意">不满意</option>
</select>
</div>
<div style="margin-top: 12px;">
<label><strong>回访备注:</strong></label>
<textarea id="review-notes" rows="3" style="width: 100%; padding: 8px; margin-top: 5px; border: 1px solid #ddd; border-radius: 3px; font-size: 0.85rem;"></textarea>
</div>
<button class="btn btn-primary" id="submit-review" style="margin-top: 15px; width: 100%;">
<i class="fas fa-check"></i> 提交回访结果
</button>
</div>
</div>
</div>
<!-- 投诉处理模态框 -->
<div class="modal" id="complaint-modal">
<div class="modal-content">
<div class="modal-header">
<h3><i class="fas fa-gavel"></i> 投诉处理</h3>
<button class="close-btn" id="close-complaint">&times;</button>
</div>
<div class="modal-body">
<p><strong>订单号:</strong> <span id="complaint-order">10109089</span></p>
<p><strong>投诉人:</strong> 张山</p>
<p><strong>投诉类型:</strong> 服务延迟</p>
<div style="margin-top: 15px;">
<label><strong>投诉详情:</strong></label>
<div style="padding: 10px; background-color: #f5f5f5; border-radius: 3px; margin-top: 5px; font-size: 0.85rem;">
司机到达时间比预期晚了20分钟导致我错过了重要会议。
</div>
</div>
<div style="margin-top: 12px;">
<label><strong>处理方案:</strong></label>
<select id="complaint-solution" style="width: 100%; padding: 8px; margin-top: 5px; border: 1px solid #ddd; border-radius: 3px; font-size: 0.85rem;">
<option value="退款">部分退款</option>
<option value="补偿">服务补偿</option>
<option value="道歉">正式道歉</option>
<option value="其他">其他方案</option>
</select>
</div>
<div style="margin-top: 12px;">
<label><strong>处理备注:</strong></label>
<textarea id="complaint-notes" rows="3" style="width: 100%; padding: 8px; margin-top: 5px; border: 1px solid #ddd; border-radius: 3px; font-size: 0.85rem;"></textarea>
</div>
<button class="btn btn-primary" id="submit-complaint" style="margin-top: 15px; width: 100%;">
<i class="fas fa-check"></i> 提交处理结果
</button>
</div>
</div>
</div>
<script>
// 更多按钮点击事件 - 显示/隐藏高级查询栏
document.getElementById('more-btn').addEventListener('click', function() {
const queryBar = document.getElementById('query-bar');
queryBar.classList.toggle('show');
// 更改按钮文本
if (queryBar.classList.contains('show')) {
this.innerHTML = '<i class="fas fa-minus"></i> 收起';
this.title = "收起高级筛选";
} else {
this.innerHTML = '<i class="fas fa-ellipsis-h"></i> 更多';
this.title = "更多筛选";
}
// 如果KPI栏显示则隐藏KPI栏
const kpiBar = document.getElementById('kpi-bar');
if (kpiBar.classList.contains('show')) {
kpiBar.classList.remove('show');
document.getElementById('kpi-btn').innerHTML = '<i class="fas fa-chart-bar"></i> KPI';
document.getElementById('kpi-btn').title = "查看KPI数据";
}
});
// KPI按钮点击事件 - 显示/隐藏KPI数据栏
document.getElementById('kpi-btn').addEventListener('click', function() {
const kpiBar = document.getElementById('kpi-bar');
kpiBar.classList.toggle('show');
// 更改按钮文本
if (kpiBar.classList.contains('show')) {
this.innerHTML = '<i class="fas fa-minus"></i> 收起KPI';
this.title = "收起KPI数据";
} else {
this.innerHTML = '<i class="fas fa-chart-bar"></i> KPI';
this.title = "查看KPI数据";
}
// 如果高级查询栏显示,则隐藏高级查询栏
const queryBar = document.getElementById('query-bar');
if (queryBar.classList.contains('show')) {
queryBar.classList.remove('show');
document.getElementById('more-btn').innerHTML = '<i class="fas fa-ellipsis-h"></i> 更多';
document.getElementById('more-btn').title = "更多筛选";
}
});
// 搜索按钮点击事件
document.getElementById('search-btn').addEventListener('click', function() {
const province = document.getElementById('province').value;
const city = document.getElementById('city').value;
const district = document.getElementById('district').value;
const orderNumber = document.getElementById('order-number').value;
const fuzzySearch = document.getElementById('fuzzy-search').value;
const timeType = document.getElementById('time-type').value;
const startDate = document.getElementById('start-date').value;
const endDate = document.getElementById('end-date').value;
// 获取时间类型的中文名称
let timeTypeName = "创建时间";
if (timeType === "expire") {
timeTypeName = "到期时间";
} else if (timeType === "insurance") {
timeTypeName = "保险时间";
}
// 模拟搜索,实际应用中这里应该发送请求到服务器
alert(`搜索条件:\n省份: ${province || '未选择'}\n城市: ${city || '未选择'}\n区域: ${district || '未选择'}\n订单号: ${orderNumber || '未输入'}\n模糊查询: ${fuzzySearch || '未输入'}\n时间类型: ${timeTypeName}\n时间范围: ${startDate || '未选择'}${endDate || '未选择'}`);
});
// 导出按钮点击事件 - 表格头部
document.getElementById('export-btn-table').addEventListener('click', function() {
alert('数据导出功能已触发正在生成Excel文件...');
});
// 任务栏项目点击事件 - 跳转到不同的查询数据页面
document.querySelectorAll('.task-item').forEach(item => {
item.addEventListener('click', function() {
const taskName = this.querySelector('span').textContent;
const pageUrl = this.getAttribute('data-page');
const count = this.querySelector('small').textContent;
// 模拟跳转到不同查询数据页面
alert(`正在跳转到${taskName}查询数据页面...\n页面URL: ${pageUrl}\n待处理数量: ${count}\n(实际应用中会跳转到对应的数据查询页面)`);
// 在实际应用中,这里应该使用:
// window.location.href = pageUrl;
});
});
// 高级查询栏按钮点击事件 - 跳转到外部查询数据页面
document.querySelectorAll('.query-btn').forEach(btn => {
btn.addEventListener('click', function() {
// 模拟跳转到外部查询页面
const fieldName = this.querySelector('span').textContent;
const linkUrl = this.getAttribute('data-link');
alert(`正在跳转到${fieldName}页面...\n链接: ${linkUrl}\n(实际应用中会跳转到外部数据查询页面)`);
// 在实际应用中,这里应该使用:
// window.location.href = linkUrl;
});
});
// 聊天按钮点击事件
document.querySelectorAll('.chat-btn').forEach(btn => {
btn.addEventListener('click', function() {
const orderId = this.getAttribute('data-order');
document.getElementById('chat-modal').style.display = 'flex';
});
});
// 回访按钮点击事件
document.querySelectorAll('.review-btn').forEach(btn => {
btn.addEventListener('click', function() {
const orderId = this.getAttribute('data-order');
document.getElementById('review-order').textContent = orderId;
document.getElementById('review-modal').style.display = 'flex';
});
});
// 投诉按钮点击事件
document.querySelectorAll('.complaint-btn').forEach(btn => {
btn.addEventListener('click', function() {
const orderId = this.getAttribute('data-order');
document.getElementById('complaint-order').textContent = orderId;
document.getElementById('complaint-modal').style.display = 'flex';
});
});
// 关闭模态框
document.getElementById('close-chat').addEventListener('click', function() {
document.getElementById('chat-modal').style.display = 'none';
});
document.getElementById('close-review').addEventListener('click', function() {
document.getElementById('review-modal').style.display = 'none';
});
document.getElementById('close-complaint').addEventListener('click', function() {
document.getElementById('complaint-modal').style.display = 'none';
});
// 点击模态框外部关闭
window.addEventListener('click', function(event) {
const chatModal = document.getElementById('chat-modal');
const reviewModal = document.getElementById('review-modal');
const complaintModal = document.getElementById('complaint-modal');
if (event.target === chatModal) {
chatModal.style.display = 'none';
}
if (event.target === reviewModal) {
reviewModal.style.display = 'none';
}
if (event.target === complaintModal) {
complaintModal.style.display = 'none';
}
});
// 发送消息
document.getElementById('send-message').addEventListener('click', function() {
const messageInput = document.getElementById('message-input');
const message = messageInput.value.trim();
if (message) {
const chatBox = document.getElementById('chat-box');
const newMessage = document.createElement('div');
newMessage.className = 'message sent';
newMessage.innerHTML = `<strong>客服:</strong> ${message}`;
chatBox.appendChild(newMessage);
messageInput.value = '';
// 滚动到底部
chatBox.scrollTop = chatBox.scrollHeight;
// 模拟回复
setTimeout(() => {
const replyMessage = document.createElement('div');
replyMessage.className = 'message received';
replyMessage.innerHTML = `<strong>用户:</strong> 收到,谢谢您的帮助!`;
chatBox.appendChild(replyMessage);
chatBox.scrollTop = chatBox.scrollHeight;
}, 1000);
}
});
// 提交回访
document.getElementById('submit-review').addEventListener('click', function() {
const result = document.getElementById('review-result').value;
const notes = document.getElementById('review-notes').value;
alert(`回访结果已提交:\n结果: ${result}\n备注: ${notes || '无'}`);
document.getElementById('review-modal').style.display = 'none';
// 重置表单
document.getElementById('review-notes').value = '';
});
// 提交投诉处理
document.getElementById('submit-complaint').addEventListener('click', function() {
const solution = document.getElementById('complaint-solution').value;
const notes = document.getElementById('complaint-notes').value;
alert(`投诉处理结果已提交:\n处理方案: ${solution}\n备注: ${notes || '无'}`);
document.getElementById('complaint-modal').style.display = 'none';
// 重置表单
document.getElementById('complaint-notes').value = '';
});
// 初始化日期为今天和一周后
const today = new Date().toISOString().split('T')[0];
const nextWeek = new Date();
nextWeek.setDate(nextWeek.getDate() + 7);
const nextWeekStr = nextWeek.toISOString().split('T')[0];
document.getElementById('start-date').value = today;
document.getElementById('end-date').value = nextWeekStr;
</script>
</body>
</html>