Files
wecom_it_smart_desk/docs/01-产品文档/04-坐席工作台/原型-REQ-坐席-000-坐席工作台-v1.0.html
T
Simon facc04aa65 chore: docs 结构整改 + compose 双目录对齐(合并重建提交)
本提交为 .git 对象库损坏后的重建提交,内容等价于原先三个本地提交
(5e2fd4c2 / 57a53c98 / 5d7e1873)的累积结果,未做任何额外改动。

一、docs 结构整改(整改 #14)
根因:重构时新结构为 untracked 文件,执行 git stash(未带 -u)未纳入,
随后 git reset 拉回 HEAD 旧 tracked 树,导致旧树复活、新旧两棵目录
树并存于 docs/,共 791 文件、双分类体系冲突。

修复动作:
- b2 同名异主题文件改名迁移保全 9 个
- C 类 39 个孤立文件按主题正确归类
- A/B1 类 222 个重复文件删除(新结构已有内容副本)
- 9 个旧独有空目录删除
- 270 处内部引用按 verified 映射改写
- 整改记录 #14 登记于 04-运维文档/部署运维

结果:docs 791 → 569 文件,顶层仅规范 8 类 + 治理文件,单树恢复。
残留:约 20 处指向从未存在文件的陈旧死链,归入独立文档卫生任务。

二、compose 双目录对齐(消除踩坑 A)
- docker-compose.yml:nginx 前端挂载全部由根目录 frontend-*/dist
  改为 src/frontend-*/dist(h5 / agent / admin / terminal)
- docker-compose.dev.yml:dev 服务 build context 与卷同步改 src/
- 效果:本地 docker compose up 不再把根目录 stale dist 挂回,
  与线上一致,分叉隐患消除(已 docker compose config 校验通过)

防复发铁律:
- 重构须提交;仓库修复须 git stash -u 或先 commit
- 新结构须 git add 并提交,避免再次 untracked 复活
- H5 改动只动 src/frontend-h5/,禁改根目录遗留 frontend-*/
2026-08-07 22:31:32 +08:00

2448 lines
173 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>IT智能服务台 · 坐席工作台 v5.4</title>
<style>
:root {
--bg-primary: #f5f7fa;
--bg-secondary: #ffffff;
--bg-tertiary: #f0f2f5;
--bg-hover: #e8ecf1;
--bg-active: #dce3ec;
--border: #e2e8f0;
--border-light: #cbd5e1;
--text-primary: #1e293b;
--text-secondary: #64748b;
--text-muted: #94a3b8;
--accent: #3b82f6;
--accent-soft: #dbeafe;
--success: #22c55e;
--success-soft: #dcfce7;
--warning: #f59e0b;
--warning-soft: #fef3c7;
--danger: #ef4444;
--danger-soft: #fee2e2;
--info: #60a5fa;
--purple: #8b5cf6;
--purple-soft: #ede9fe;
--orange: #f97316;
--orange-soft: #fff7ed;
--shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
--shadow: 0 2px 8px rgba(0,0,0,0.08);
--radius: 6px;
--radius-lg: 10px;
--transition: 0.25s cubic-bezier(0.4,0,0.2,1);
/* 快速回复 L1 主类颜色 */
--qr-c0: #3b82f6; /* 电脑 - 蓝 */
--qr-c1: #22c55e; /* 软件 - 绿 */
--qr-c2: #f97316; /* 外设 - 橙 */
--qr-c3: #8b5cf6; /* 网络 - 紫 */
--qr-c4: #ef4444; /* 安全 - 红 */
--qr-c5: #0ea5e9; /* 资产 - 青 */
--qr-c6: #6b7280; /* 其他 - 灰 */
}
[data-theme="dark"] {
--bg-primary: #0f1923;
--bg-secondary: #151f2b;
--bg-tertiary: #1a2736;
--bg-hover: #1e3044;
--bg-active: #243b52;
--border: #1e3044;
--border-light: #2a3f56;
--text-primary: #e8edf2;
--text-secondary: #8ba1b7;
--text-muted: #5c7185;
--accent: #4da6ff;
--accent-soft: #2b5f8a;
--success: #34d399;
--success-soft: #1a3a2a;
--warning: #fbbf24;
--warning-soft: #3a2f10;
--danger: #f87171;
--danger-soft: #3a1a1a;
--info: #60a5fa;
--purple: #a78bfa;
--purple-soft: #2d2060;
--orange: #fb923c;
--orange-soft: #3d1f08;
--shadow-sm: 0 1px 2px rgba(0,0,0,0.2);
--shadow: 0 2px 8px rgba(0,0,0,0.3);
/* 快速回复 L1 主类颜色(深色主题:同色系稍亮版本) */
--qr-c0: #60a5fa;
--qr-c1: #4ade80;
--qr-c2: #fb923c;
--qr-c3: #a78bfa;
--qr-c4: #f87171;
--qr-c5: #22d3ee;
--qr-c6: #9ca3af;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;
background: var(--bg-primary);
color: var(--text-primary);
height: 100vh;
overflow: hidden;
font-size: 13px;
line-height: 1.5;
transition: background 0.3s, color 0.3s;
}
/* ========== TOP BAR ========== */
.theme-toggle-bar {
position: fixed; top: 0; left: 0; right: 0;
height: 40px;
background: var(--bg-secondary);
border-bottom: 1px solid var(--border);
display: flex; align-items: center;
justify-content: space-between;
padding: 0 16px;
z-index: 100;
box-shadow: var(--shadow-sm);
}
.bar-left { display: flex; align-items: center; gap: 10px; font-size: 13px; font-weight: 600; }
.bar-left .logo-sm {
width: 26px; height: 26px;
background: linear-gradient(135deg, var(--accent), var(--purple));
border-radius: 6px; display: flex; align-items: center; justify-content: center;
font-weight: 700; font-size: 10px; color: #fff;
}
.bar-left .sys-name {
font-size: 13px; font-weight: 700;
background: linear-gradient(135deg, var(--accent), var(--purple));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.bar-left .sys-tagline {
font-size: 10px; color: var(--text-muted);
font-weight: 400; margin-left: 4px;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
max-width: 280px;
}
.bar-right { display: flex; align-items: center; gap: 14px; }
.theme-switch { display: flex; align-items: center; gap: 8px; cursor: pointer; user-select: none; }
.theme-switch .switch-icon { font-size: 15px; }
.theme-switch .switch-track {
width: 40px; height: 22px;
background: var(--border-light); border-radius: 11px;
position: relative; transition: background 0.3s;
}
[data-theme="dark"] .theme-switch .switch-track { background: var(--accent); }
.theme-switch .switch-thumb {
width: 18px; height: 18px; background: #fff;
border-radius: 50%; position: absolute;
top: 2px; left: 2px; transition: transform 0.3s;
box-shadow: 0 1px 3px rgba(0,0,0,0.2);
}
[data-theme="dark"] .theme-switch .switch-thumb { transform: translateX(18px); }
.bar-user-info { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--text-secondary); }
.bar-user-avatar {
width: 28px; height: 28px; border-radius: 50%;
background: #f3f4f6; color: #374151;
display: flex; align-items: center; justify-content: center;
font-size: 11px; font-weight: 600;
}
/* ========== LAYOUT (3 columns) ========== */
.workspace {
display: flex; height: calc(100vh - 40px); margin-top: 40px;
width: 100%; transition: var(--transition);
}
/* ========== LEFT SIDEBAR ========== */
.sidebar-left {
width: 280px; min-width: 200px;
background: var(--bg-secondary);
border-right: none;
display: flex; flex-direction: column; overflow: hidden;
position: relative;
}
/* Search */
.conv-search { padding: 10px 12px; border-bottom: 1px solid var(--border); flex-shrink: 0; }
/* ===== v5.4: 拖拽调整边框手柄 ===== */
.resize-handle {
width: 6px; cursor: col-resize;
background: var(--border);
position: relative; flex-shrink: 0;
transition: background 0.2s;
z-index: 10;
}
.resize-handle:hover,
.resize-handle.dragging {
background: var(--accent);
}
/* 手柄中间的拖拽指示纹 */
.resize-handle::after {
content: '⋮';
position: absolute;
top: 50%; left: 50%;
transform: translate(-50%, -50%);
font-size: 12px;
color: var(--text-muted);
opacity: 0;
transition: opacity 0.2s;
}
.resize-handle:hover::after,
.resize-handle.dragging::after {
opacity: 1;
}
.conv-search-input-wrap { position: relative; }
.conv-search-input {
width: 100%; background: var(--bg-tertiary);
border: 1px solid var(--border); border-radius: var(--radius);
padding: 7px 10px 7px 30px;
color: var(--text-primary); font-size: 12px; font-family: inherit;
outline: none; transition: border-color var(--transition);
}
.conv-search-input:focus { border-color: var(--accent); }
.conv-search-input::placeholder { color: var(--text-muted); }
.conv-search-icon {
position: absolute; left: 10px; top: 50%;
transform: translateY(-50%); font-size: 12px;
color: var(--text-muted); pointer-events: none;
}
.conv-search-tabs { display: flex; gap: 2px; margin-top: 6px; }
.conv-search-tab {
font-size: 11px; padding: 3px 10px; border-radius: 10px;
cursor: pointer; transition: var(--transition);
color: var(--text-muted); background: transparent;
}
.conv-search-tab:hover { color: var(--text-secondary); background: var(--bg-hover); }
.conv-search-tab.active { color: var(--accent); background: var(--accent-soft); font-weight: 500; }
/* Sections */
.conv-sections { flex: 1; overflow-y: auto; padding: 0; }
.conv-sections::-webkit-scrollbar { width: 4px; }
.conv-sections::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
.conv-section-header {
padding: 7px 12px; font-size: 11px; font-weight: 600;
color: var(--text-muted); text-transform: uppercase;
letter-spacing: 0.5px; display: flex; align-items: center;
justify-content: space-between; user-select: none;
background: var(--bg-tertiary);
border-top: 1px solid var(--border);
border-bottom: 1px solid var(--border);
transition: var(--transition);
}
.conv-section-header .cs-count {
font-weight: 400; color: var(--text-muted);
background: var(--bg-secondary); padding: 1px 7px;
border-radius: 8px; font-size: 10px;
}
.conv-section-body { overflow: hidden; }
/* Priority icons on conv item (NO IT level badge) */
/* conv-item 样式已移至 v5.4 头像区块中 */
.conv-item .conv-top {
display: flex; align-items: center; justify-content: space-between;
margin-bottom: 2px;
}
.conv-item .conv-name-row { display: flex; align-items: center; gap: 5px; }
.conv-item .conv-name { font-size: 12px; font-weight: 500; color: var(--text-primary); }
.priority-icons {
display: flex; align-items: center; gap: 3px;
flex-shrink: 0;
}
.pi-icon {
width: 16px; height: 16px; border-radius: 3px;
display: flex; align-items: center; justify-content: center;
font-size: 8px; flex-shrink: 0;
}
.pi-blocked { background: var(--danger-soft); color: var(--danger); }
.pi-block { background: var(--danger-soft); color: var(--danger); }
.pi-impact { background: var(--warning-soft); color: var(--warning); }
.pi-impact.high { background: var(--danger-soft); color: var(--danger); }
.pi-role { background: var(--purple-soft); color: var(--purple); }
.pi-repeat { background: var(--orange-soft); color: var(--orange); }
.pi-confused { background: #e0e7ff; color: #6366f1; }
.pi-angry { background: #fee2e2; color: #ef4444; }
/* 会话标签 */
.conv-tag-warn, .conv-tag-new, .conv-tag-vip, .conv-tag-urgent {
font-size: 9px; padding: 1px 5px; border-radius: 4px; flex-shrink: 0; font-weight: 500;
}
.conv-tag-warn { background: #fef3c7; color: #d97706; }
.conv-tag-new { background: #dbeafe; color: #2563eb; }
.conv-tag-vip { background: #fce7f3; color: #db2777; }
.conv-tag-urgent{ background: #fee2e2; color: #ef4444; }
.conv-pin-badge { font-size: 9px; color: #ef4444; flex-shrink: 0; }
.conv-item .conv-time { font-size: 10px; color: var(--text-muted); flex-shrink: 0; }
.conv-item .conv-preview {
font-size: 11px; color: var(--text-secondary);
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.conv-item .conv-waiting {
font-size: 10px;
background: var(--danger); color: #fff;
padding: 1px 6px; border-radius: 8px;
flex-shrink: 0;
}
.conv-item .conv-agent-tag {
font-size: 10px; color: var(--text-muted);
background: var(--bg-tertiary); padding: 1px 6px;
border-radius: 8px;
}
/* ===== v5.4: 会话头像 + 新消息圆点 + 处理对象缩略头像 ===== */
.conv-item {
display: flex; align-items: center; gap: 8px;
padding: 8px 10px; margin: 1px 6px;
border-radius: var(--radius); cursor: pointer;
transition: var(--transition);
border: 1px solid transparent; position: relative;
}
.conv-item:hover { background: var(--bg-hover); }
.conv-item.active { background: var(--accent-soft); border-color: var(--accent); }
/* 头像容器(含圆点) */
.conv-avatar-wrap {
position: relative; flex-shrink: 0;
}
/* 头像圆形 — 浅色主题:浅底+深色字 */
.conv-avatar {
width: 34px; height: 34px; border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-size: 13px; font-weight: 600;
color: #1e293b;
flex-shrink: 0;
}
/* 浅色主题:各头像色系用浅底色 */
.conv-avatar.av-blue { background: #dbeafe; color: #1e40af; }
.conv-avatar.av-green { background: #dcfce7; color: #166534; }
.conv-avatar.av-orange { background: #fff7ed; color: #9a3412; }
.conv-avatar.av-purple { background: #ede9fe; color: #5b21b6; }
.conv-avatar.av-red { background: #fee2e2; color: #991b1b; }
.conv-avatar.av-teal { background: #f0fdfa; color: #115e59; }
.conv-avatar.av-pink { background: #fce7f3; color: #9d174d; }
/* 新消息圆点(在头像右上角) */
.new-msg-dot {
position: absolute; top: -1px; right: -1px;
width: 10px; height: 10px; border-radius: 50%;
border: 2px solid var(--bg-secondary);
z-index: 2;
}
.new-msg-dot.dot-urgent { background: var(--danger); } /* 紧急:红色 */
.new-msg-dot.dot-normal { background: var(--accent); } /* 普通:蓝色 */
.new-msg-dot.dot-muted { background: var(--text-muted); }/* 低优:灰色 */
/* 会话内容区(姓名+预览+标签,夹在头像和右侧缩略头像之间) */
.conv-content {
flex: 1; min-width: 0; /* 允许文字截断 */
}
/* 处理对象缩略头像(右侧小头像)— 浅色主题:浅底+深色字 */
.conv-target-avatar {
width: 22px; height: 22px; border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-size: 9px; font-weight: 600;
flex-shrink: 0; margin-left: auto;
color: #1e293b;
}
.conv-target-avatar.ta-blue { background: #dbeafe; color: #1e40af; }
.conv-target-avatar.ta-green { background: #dcfce7; color: #166534; }
.conv-target-avatar.ta-orange { background: #fff7ed; color: #9a3412; }
.conv-target-avatar.ta-purple { background: #ede9fe; color: #5b21b6; }
.conv-target-avatar.ta-red { background: #fee2e2; color: #991b1b; }
.conv-target-avatar.ta-teal { background: #f0fdfa; color: #115e59; }
.conv-target-avatar.ta-pink { background: #fce7f3; color: #9d174d; }
/* 待办事项缩略头像 — 浅色主题:浅底+深色字 */
.kanban-item .ki-avatar {
width: 20px; height: 20px; border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-size: 9px; font-weight: 600;
flex-shrink: 0; margin-left: auto;
color: #1e293b;
}
.ki-avatar.ka-blue { background: #dbeafe; color: #1e40af; }
.ki-avatar.ka-green { background: #dcfce7; color: #166534; }
.ki-avatar.ka-orange { background: #fff7ed; color: #9a3412; }
.ki-avatar.ka-purple { background: #ede9fe; color: #5b21b6; }
.ki-avatar.ka-red { background: #fee2e2; color: #991b1b; }
/* 深色主题:头像恢复渐变亮色 */
[data-theme="dark"] .conv-avatar {
color: #fff;
}
[data-theme="dark"] .conv-avatar.av-blue { background: linear-gradient(135deg, #3b82f6, #6366f1); color: #fff; }
[data-theme="dark"] .conv-avatar.av-green { background: linear-gradient(135deg, #22c55e, #14b8a6); color: #fff; }
[data-theme="dark"] .conv-avatar.av-orange { background: linear-gradient(135deg, #f97316, #eab308); color: #fff; }
[data-theme="dark"] .conv-avatar.av-purple { background: linear-gradient(135deg, #8b5cf6, #ec4899); color: #fff; }
[data-theme="dark"] .conv-avatar.av-red { background: linear-gradient(135deg, #ef4444, #f97316); color: #fff; }
[data-theme="dark"] .conv-avatar.av-teal { background: linear-gradient(135deg, #0ea5e9, #6366f1); color: #fff; }
[data-theme="dark"] .conv-avatar.av-pink { background: linear-gradient(135deg, #ec4899, #f43f5e); color: #fff; }
[data-theme="dark"] .conv-target-avatar.ta-blue { background: linear-gradient(135deg, #3b82f6, #6366f1); color: #fff; }
[data-theme="dark"] .conv-target-avatar.ta-green { background: linear-gradient(135deg, #22c55e, #14b8a6); color: #fff; }
[data-theme="dark"] .conv-target-avatar.ta-orange { background: linear-gradient(135deg, #f97316, #eab308); color: #fff; }
[data-theme="dark"] .conv-target-avatar.ta-purple { background: linear-gradient(135deg, #8b5cf6, #ec4899); color: #fff; }
[data-theme="dark"] .conv-target-avatar.ta-red { background: linear-gradient(135deg, #ef4444, #f97316); color: #fff; }
[data-theme="dark"] .conv-target-avatar.ta-teal { background: linear-gradient(135deg, #0ea5e9, #6366f1); color: #fff; }
[data-theme="dark"] .conv-target-avatar.ta-pink { background: linear-gradient(135deg, #ec4899, #f43f5e); color: #fff; }
[data-theme="dark"] .bar-user-avatar {
background: linear-gradient(135deg, #6366f1, #8b5cf6);
color: #fff;
}
[data-theme="dark"] .user-avatar {
background: linear-gradient(135deg, #6366f1, #8b5cf6);
color: #fff;
}
[data-theme="dark"] .ki-avatar.ka-blue { background: linear-gradient(135deg, #3b82f6, #6366f1); color: #fff; }
[data-theme="dark"] .ki-avatar.ka-green { background: linear-gradient(135deg, #22c55e, #14b8a6); color: #fff; }
[data-theme="dark"] .ki-avatar.ka-orange { background: linear-gradient(135deg, #f97316, #eab308); color: #fff; }
[data-theme="dark"] .ki-avatar.ka-purple { background: linear-gradient(135deg, #8b5cf6, #ec4899); color: #fff; }
[data-theme="dark"] .ki-avatar.ka-red { background: linear-gradient(135deg, #ef4444, #f97316); color: #fff; }
/* ===== 待办事项 ===== */
.kanban { flex-shrink: 0; border-top: 1px solid var(--border); padding: 8px 12px; max-height: 220px; overflow-y: auto; }
.kanban::-webkit-scrollbar { width: 4px; }
.kanban::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
.kanban-title { font-size: 11px; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 6px; display: flex; align-items: center; justify-content: space-between; }
.kanban-title .count { font-size: 10px; color: var(--danger); }
.kanban-item { display: flex; align-items: center; gap: 8px; padding: 7px 8px; border-radius: var(--radius); font-size: 11px; margin-bottom: 3px; cursor: pointer; transition: var(--transition); }
.kanban-item:hover { background: var(--bg-hover); }
.kanban-item.active { background: var(--accent-soft); border: 1px solid var(--accent); }
.kanban-item .ki-priority { width: 4px; height: 4px; border-radius: 50%; flex-shrink: 0; }
.ki-priority.urgent { background: var(--danger); }
.ki-priority.high { background: var(--warning); }
.ki-priority.normal { background: var(--accent); }
.ki-priority.done { background: var(--success); }
.kanban-item.resolved { opacity: 0.6; }
.kanban-item .ki-text { flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--text-secondary); }
.kanban-item .ki-type {
font-size: 9px; padding: 1px 5px; border-radius: 4px;
flex-shrink: 0; font-weight: 500;
}
.ki-type.ticket { background: var(--accent-soft); color: var(--accent); border: 1px solid var(--accent); }
.ki-type.approval { background: var(--purple-soft); color: var(--purple); border: 1px solid var(--purple); }
.ki-type.device { background: var(--orange-soft); color: var(--orange); border: 1px solid var(--orange); }
.kanban-item .ki-time { font-size: 10px; color: var(--text-muted); flex-shrink: 0; }
.kanban-stats { display: flex; gap: 8px; margin-top: 6px; padding-top: 6px; border-top: 1px solid var(--border); font-size: 10px; color: var(--text-muted); }
.kanban-stats span { display: flex; align-items: center; gap: 4px; }
.kanban-stats .dot { width: 6px; height: 6px; border-radius: 50%; }
.dot-online { background: var(--success); }
.dot-busy { background: var(--warning); }
.dot-offline { background: var(--text-muted); }
/* ========== CENTER COLUMN ========== */
.center-column {
flex: 1; min-width: 340px;
display: flex; flex-direction: column;
background: var(--bg-primary); overflow: hidden;
transition: var(--transition);
position: relative;
}
/* --- Chat View (default) --- */
.chat-view { display: flex; flex-direction: column; height: 100%; overflow: hidden; }
.chat-view.hidden { display: none; }
/* IT Level Badge */
.it-level-badge {
display: inline-flex; align-items: center; gap: 3px;
padding: 2px 7px; border-radius: 10px;
font-size: 10px; font-weight: 600;
flex-shrink: 0;
position: relative; cursor: help;
}
.it-level-badge.bronze { background: linear-gradient(135deg, #78350f, #92400e); color: #fef3c7; border: 1px solid #b45309; }
.it-level-badge.silver { background: linear-gradient(135deg, #374151, #6b7280); color: #f3f4f6; border: 1px solid #9ca3af; }
.it-level-badge.gold { background: linear-gradient(135deg, #92400e, #d97706); color: #fffbeb; border: 1px solid #f59e0b; }
.it-level-badge.platinum { background: linear-gradient(135deg, #164e63, #0e7490); color: #cffafe; border: 1px solid #22d3ee; }
.it-level-badge.diamond { background: linear-gradient(135deg, #312e81, #4338ca); color: #e0e7ff; border: 1px solid #818cf8; }
.it-level-badge.star { background: linear-gradient(135deg, #831843, #be185d); color: #fce7f3; border: 1px solid #ec4899; }
.it-level-badge.king { background: linear-gradient(135deg, #7c2d12, #c2410c); color: #ffedd5; border: 1px solid #f97316;
animation: king-glow 2s ease-in-out infinite alternate;
}
@keyframes king-glow {
from { box-shadow: 0 0 4px rgba(249,115,22,0.3); }
to { box-shadow: 0 0 10px rgba(249,115,22,0.6); }
}
.it-level-badge .level-icon { font-size: 11px; }
.it-level-badge .level-num { font-size: 9px; opacity: 0.8; }
/* User info bar */
.user-info-bar {
padding: 10px 16px; background: var(--bg-secondary);
border-bottom: 1px solid var(--border);
display: flex; align-items: center; gap: 10px;
flex-shrink: 0; flex-wrap: wrap; cursor: pointer;
transition: var(--transition); position: relative;
box-shadow: var(--shadow-sm);
}
.user-info-bar:hover { background: var(--bg-hover); }
.user-avatar {
width: 36px; height: 36px; border-radius: 50%;
background: #f3f4f6; color: #374151;
display: flex; align-items: center; justify-content: center;
font-size: 14px; font-weight: 600; flex-shrink: 0;
}
.user-name-section { display: flex; flex-direction: column; gap: 1px; }
.user-name { font-weight: 600; font-size: 14px; display: flex; align-items: center; gap: 6px; }
.user-dept { font-size: 11px; color: var(--text-secondary); }
.info-chips { display: flex; gap: 5px; flex-wrap: wrap; }
.info-chip { font-size: 11px; padding: 2px 8px; border-radius: 10px; display: flex; align-items: center; gap: 4px; }
.info-chip.emotion { background: var(--warning-soft); color: var(--warning); border: 1px solid var(--warning); }
.info-chip.default { background: var(--bg-tertiary); color: var(--text-secondary); border: 1px solid var(--border); }
.info-chip.repeat { background: var(--danger-soft); color: var(--danger); border: 1px solid var(--danger); }
.info-chip.remark { background: var(--purple-soft); color: var(--purple); border: 1px solid var(--purple); }
/* Device status icons row */
.device-status-row {
display: flex; align-items: center; gap: 8px;
margin-left: 6px; padding-left: 8px;
border-left: 1px solid var(--border);
}
.dev-icon {
display: flex; align-items: center; justify-content: center;
width: 26px; height: 26px; border-radius: 6px;
font-size: 14px; cursor: default; position: relative;
transition: all 0.2s;
background: var(--bg-tertiary); border: 1px solid var(--border);
}
.dev-icon:hover { transform: scale(1.15); }
.dev-icon .dev-tooltip {
display: none; position: absolute; bottom: calc(100% + 6px); left: 50%;
transform: translateX(-50%); white-space: nowrap;
background: var(--bg-primary); color: var(--text-primary);
border: 1px solid var(--border); border-radius: 6px;
padding: 4px 8px; font-size: 10px; z-index: 99;
box-shadow: var(--shadow-sm);
}
.dev-icon:hover .dev-tooltip { display: block; }
.dev-icon .dev-tooltip::after {
content: ''; position: absolute; top: 100%; left: 50%;
transform: translateX(-50%); border: 4px solid transparent;
border-top-color: var(--border);
}
/* Device icon status variants */
.dev-icon.online { color: #22c55e; border-color: rgba(34,197,94,0.3); background: rgba(34,197,94,0.08); }
.dev-icon.offline { color: var(--text-muted); opacity: 0.5; }
.dev-icon.safe { color: #22c55e; border-color: rgba(34,197,94,0.3); background: rgba(34,197,94,0.08); }
.dev-icon.risk { color: var(--danger); border-color: rgba(239,68,68,0.3); background: rgba(239,68,68,0.08); animation: pulse-risk 2s infinite; }
.dev-icon.warn { color: var(--warning); border-color: rgba(234,179,8,0.3); background: rgba(234,179,8,0.08); }
.dev-icon.certified { color: var(--accent); border-color: rgba(59,130,246,0.3); background: rgba(59,130,246,0.08); }
@keyframes pulse-risk {
0%, 100% { box-shadow: 0 0 0 0 rgba(239,68,68,0.3); }
50% { box-shadow: 0 0 0 3px rgba(239,68,68,0.1); }
}
/* Device badge (small superscript indicator) */
.dev-icon .dev-badge {
position: absolute; top: -3px; right: -3px;
width: 8px; height: 8px; border-radius: 50%;
border: 1.5px solid var(--bg-secondary);
}
.dev-icon .dev-badge.green { background: #22c55e; }
.dev-icon .dev-badge.red { background: #ef4444; }
.dev-icon .dev-badge.yellow { background: #eab308; }
.dev-icon .dev-badge.gray { background: var(--text-muted); }
[data-theme="dark"] .dev-icon.online { background: rgba(34,197,94,0.15); }
[data-theme="dark"] .dev-icon.safe { background: rgba(34,197,94,0.15); }
[data-theme="dark"] .dev-icon.risk { background: rgba(239,68,68,0.15); }
[data-theme="dark"] .dev-icon.warn { background: rgba(234,179,8,0.15); }
[data-theme="dark"] .dev-icon.certified { background: rgba(59,130,246,0.15); }
.user-info-bar .expand-icon { margin-left: auto; color: var(--text-muted); font-size: 11px; transition: transform 0.3s; }
.user-info-bar.expanded .expand-icon { transform: rotate(90deg); }
/* User detail panel */
.user-detail-panel {
max-height: 0; overflow: hidden;
transition: max-height 0.35s ease, padding 0.35s ease;
background: var(--bg-secondary);
border-bottom: 0px solid var(--border);
padding: 0 16px; display: grid;
grid-template-columns: 1fr 1fr 1fr; gap: 8px; font-size: 12px;
}
.user-info-bar.expanded + .user-detail-panel {
max-height: 320px; padding: 12px 16px; border-bottom-width: 1px;
}
.detail-card { background: var(--bg-tertiary); border-radius: var(--radius); padding: 8px 10px; border: 1px solid var(--border); }
.detail-card .dc-label { font-size: 10px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 3px; }
.detail-card .dc-value { font-size: 12px; font-weight: 500; color: var(--text-primary); }
.detail-card .dc-value.warn { color: var(--warning); }
/* Chat messages */
.chat-messages {
flex: 1; overflow-y: auto; padding: 16px 20px;
display: flex; flex-direction: column; gap: 10px;
min-height: 0; /* allow shrink */
}
.chat-messages::-webkit-scrollbar { width: 4px; }
.chat-messages::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
.msg-bubble {
max-width: 72%; padding: 10px 14px; border-radius: var(--radius-lg);
font-size: 13px; line-height: 1.6; word-break: break-word;
box-shadow: var(--shadow-sm);
}
.msg-user {
align-self: flex-start; background: var(--bg-secondary);
border: 1px solid var(--border); color: var(--text-primary);
border-bottom-left-radius: 2px;
}
.msg-agent {
align-self: flex-end; background: var(--accent); color: #fff;
border-bottom-right-radius: 2px;
}
[data-theme="dark"] .msg-agent { background: #1e5a9e; }
.msg-system {
align-self: center; font-size: 11px; color: var(--text-muted);
padding: 3px 12px; background: var(--bg-tertiary); border-radius: 10px;
}
/* AI recommend inline */
.ai-recommend-inline {
align-self: stretch; background: var(--accent-soft);
border: 1px dashed var(--accent); border-radius: var(--radius-lg);
padding: 10px 14px; margin: 4px 0;
}
[data-theme="dark"] .ai-recommend-inline { background: rgba(77,166,255,0.06); border-color: rgba(77,166,255,0.3); }
.ai-recommend-inline .ari-label {
font-size: 10px; color: var(--accent); text-transform: uppercase;
letter-spacing: 1px; margin-bottom: 6px; display: flex; align-items: center; gap: 6px;
}
.ari-options { display: flex; gap: 8px; }
.ari-opt {
flex: 1; padding: 8px 12px; background: var(--bg-secondary);
border: 1px solid var(--border-light); border-radius: var(--radius);
font-size: 12px; color: var(--text-primary); cursor: pointer;
transition: var(--transition); text-align: left; line-height: 1.5;
}
.ari-opt:hover { border-color: var(--accent); background: var(--bg-hover); }
.ari-opt .ari-shortcut { font-size: 10px; color: var(--text-muted); float: right; margin-left: 8px; background: var(--bg-tertiary); padding: 1px 5px; border-radius: 3px; }
/* Chat input — v5.4: 上边框可拖拽调整高度 */
.chat-input-area {
padding: 0 12px 8px 12px;
background: var(--bg-primary);
border-top: none;
flex-shrink: 0;
position: relative;
min-height: 50px;
display: flex; flex-direction: column;
}
/* 输入框上方的拖拽手柄 */
.chat-input-area .input-resize-handle {
position: absolute; top: 0; left: 0; right: 0;
height: 4px; cursor: row-resize;
background: var(--border);
transition: background 0.2s;
z-index: 5;
flex-shrink: 0;
}
.chat-input-area .input-resize-handle:hover,
.chat-input-area .input-resize-handle.dragging {
background: var(--accent);
}
.chat-input-area .input-resize-handle::after {
content: '···';
position: absolute; top: 50%; left: 50%;
transform: translate(-50%, -50%);
font-size: 10px; letter-spacing: 2px;
color: var(--text-muted);
opacity: 0; transition: opacity 0.2s;
}
.chat-input-area .input-resize-handle:hover::after,
.chat-input-area .input-resize-handle.dragging::after {
opacity: 1;
}
/* 快捷工具栏 — 整合圆角卡片风格 */
.chat-toolbar {
display: flex; align-items: center; gap: 1px;
padding: 8px 6px 4px 6px;
flex-shrink: 0;
}
.chat-toolbar .tb-btn {
display: flex; align-items: center; justify-content: center;
width: 32px; height: 28px;
border: none; background: transparent;
border-radius: var(--radius); cursor: pointer;
font-size: 14px; color: var(--text-muted);
transition: all var(--transition);
position: relative;
}
.chat-toolbar .tb-btn:hover {
background: var(--accent-soft);
color: var(--accent);
}
.chat-toolbar .tb-btn:active {
transform: scale(0.92);
}
.chat-toolbar .tb-btn .tb-tip {
display: none; position: absolute; bottom: 100%; left: 50%;
transform: translateX(-50%); margin-bottom: 6px;
background: var(--text-primary); color: var(--bg-secondary);
font-size: 10px; padding: 3px 8px; border-radius: 4px;
white-space: nowrap; pointer-events: none;
box-shadow: var(--shadow);
}
.chat-toolbar .tb-btn .tb-tip::after {
content: '';
position: absolute; top: 100%; left: 50%;
transform: translateX(-50%);
border: 4px solid transparent;
border-top-color: var(--text-primary);
}
.chat-toolbar .tb-btn:hover .tb-tip { display: block; }
.chat-toolbar .tb-sep {
width: 1px; height: 14px; background: var(--border);
margin: 0 6px; flex-shrink: 0;
}
/* 输入行 — 整合为圆角卡片 */
.chat-input-row {
display: flex; gap: 8px; align-items: stretch; flex: 1; min-height: 0;
}
/* 输入框容器(含textarea + 发送按钮,统一圆角卡片) */
.chat-input-card {
flex: 1; display: flex; align-items: flex-end;
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
overflow: hidden;
transition: border-color var(--transition), box-shadow var(--transition);
box-shadow: var(--shadow-sm);
}
.chat-input-card:focus-within {
border-color: var(--accent);
box-shadow: 0 0 0 2px var(--accent-soft);
}
.chat-input {
flex: 1; background: transparent; border: none;
padding: 10px 0 10px 14px;
color: var(--text-primary); font-size: 13px; font-family: inherit;
resize: none; min-height: 60px; max-height: 300px; outline: none;
line-height: 1.5;
overflow-y: auto;
}
.chat-input:focus { outline: none; }
.chat-input::placeholder { color: var(--text-muted); }
/* 发送按钮 — 内嵌于卡片右侧 */
.btn-send {
padding: 8px 18px; margin: 4px 6px 4px 0;
background: var(--accent);
color: #fff; border: none; border-radius: var(--radius);
font-size: 12px; font-weight: 600; cursor: pointer;
transition: all var(--transition); flex-shrink: 0;
letter-spacing: 0.5px;
}
.btn-send:hover {
opacity: 0.9;
box-shadow: 0 2px 8px rgba(59,130,246,0.3);
}
.btn-send:active {
transform: scale(0.95);
}
[data-theme="dark"] .btn-send {
background: linear-gradient(135deg, var(--accent), var(--purple));
}
/* ========== TROUBLESHOOT BAR (always visible, flowchart collapsible) ========== */
.troubleshoot-bar {
flex-shrink: 0;
border-top: 1px solid var(--border);
background: var(--bg-secondary);
display: flex; flex-direction: column;
transition: var(--transition);
max-height: 400px;
overflow: hidden;
}
/* Bar is ALWAYS expanded — no .collapsed class used for the bar itself */
.ts-header {
display: flex; align-items: center; gap: 0;
padding: 6px 12px; flex-shrink: 0;
min-height: 36px;
background: var(--bg-tertiary);
border-bottom: 1px solid var(--border);
cursor: default;
}
.ts-header:hover { background: var(--bg-hover); }
.ts-title {
font-size: 13px; font-weight: 600;
display: flex; align-items: center; gap: 6px;
flex-shrink: 0; margin-right: 10px;
}
/* Inline path steps inside header */
.ts-path-inline {
display: flex; align-items: center; gap: 0;
flex: 1; overflow: hidden;
}
.path-step {
padding: 2px 7px;
background: var(--bg-tertiary);
border: 1px solid var(--border-light);
border-radius: 3px;
font-size: 11px; color: var(--text-secondary);
white-space: nowrap; flex-shrink: 0;
cursor: pointer; transition: var(--transition);
}
.path-step:hover { border-color: var(--accent); color: var(--accent); }
.path-step.done { background: var(--success-soft); border-color: var(--success); color: var(--success); }
.path-step.current { background: var(--accent-soft); border-color: var(--accent); color: var(--accent); font-weight: 600; }
.path-arrow-inline { display: flex; align-items: center; color: var(--text-muted); font-size: 10px; padding: 0 3px; flex-shrink: 0; }
/* Flowchart toggle — triangle icon only */
.ts-flowchart-toggle {
font-size: 12px; color: var(--accent);
cursor: pointer; padding: 4px 6px;
border-radius: 3px; transition: var(--transition);
user-select: none; flex-shrink: 0; line-height: 1;
}
.ts-flowchart-toggle:hover { background: var(--accent-soft); }
/* Full flowchart (collapsed by default — toggled via .show-flow on bar) */
.ts-flowchart {
padding: 10px 16px 14px;
overflow-x: auto;
overflow-y: auto;
max-height: 0;
transition: max-height 0.35s ease, padding 0.35s ease;
padding-top: 0;
padding-bottom: 0;
}
.troubleshoot-bar.show-flow .ts-flowchart {
max-height: 300px;
padding: 10px 16px 14px;
}
.flow-step {
display: flex; align-items: flex-start; gap: 10px;
margin-bottom: 4px; position: relative;
}
.flow-step:last-child { margin-bottom: 0; }
.flow-step-connector {
position: absolute; left: 10px; top: 26px; bottom: -12px;
width: 2px; background: var(--border);
}
.flow-step:last-child .flow-step-connector { display: none; }
.flow-node {
width: 22px; height: 22px; border-radius: 50%;
background: var(--accent-soft); color: var(--accent);
display: flex; align-items: center; justify-content: center;
font-size: 10px; font-weight: 600; flex-shrink: 0;
z-index: 1; border: 1px solid var(--accent);
}
.flow-node.done { background: var(--success-soft); color: var(--success); border-color: var(--success); }
.flow-node.judge {
width: auto; height: auto; border-radius: var(--radius);
padding: 3px 8px; font-size: 10px; font-weight: 500;
background: var(--warning-soft); color: var(--warning); border-color: var(--warning);
}
.flow-content { flex: 1; }
.flow-title { font-size: 12px; font-weight: 500; color: var(--text-primary); margin-bottom: 2px; }
.flow-desc { font-size: 11px; color: var(--text-secondary); line-height: 1.4; }
.flow-branch {
margin-left: 20px; margin-top: 4px;
padding-left: 10px;
border-left: 2px dashed var(--border-light);
}
.flow-branch-item {
font-size: 11px; color: var(--text-muted);
padding: 2px 0;
cursor: pointer;
transition: var(--transition);
}
.flow-branch-item:hover { color: var(--accent); }
.flow-branch-item.active { color: var(--success); font-weight: 500; }
/* ========== TASK DETAIL VIEW ========== */
.task-detail-view {
display: none;
flex-direction: column;
height: 100%;
overflow: hidden;
}
.task-detail-view.active { display: flex; }
.task-detail-header {
padding: 10px 16px; background: var(--bg-secondary);
border-bottom: 1px solid var(--border);
display: flex; align-items: center; gap: 10px;
flex-shrink: 0;
box-shadow: var(--shadow-sm);
}
.btn-back {
padding: 4px 10px; background: var(--bg-tertiary);
border: 1px solid var(--border); border-radius: var(--radius);
cursor: pointer; font-size: 12px; color: var(--text-secondary);
transition: var(--transition);
}
.btn-back:hover { background: var(--bg-hover); color: var(--text-primary); }
.task-detail-header .task-title { font-size: 14px; font-weight: 600; flex: 1; }
.task-detail-header .task-type-badge {
font-size: 10px; padding: 2px 8px; border-radius: 10px;
font-weight: 500;
}
.task-detail-body {
flex: 1; overflow-y: auto; padding: 16px;
display: flex; flex-direction: column; gap: 12px;
}
.task-detail-body::-webkit-scrollbar { width: 4px; }
.task-detail-body::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
.task-info-card {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 14px 16px;
}
.task-info-card .tic-title { font-size: 13px; font-weight: 600; margin-bottom: 8px; display: flex; align-items: center; gap: 6px; }
.task-info-card .tic-row { display: flex; gap: 12px; margin-bottom: 4px; font-size: 12px; }
.task-info-card .tic-label { color: var(--text-muted); min-width: 70px; }
.task-info-card .tic-value { color: var(--text-primary); font-weight: 500; }
.task-info-card .tic-desc {
margin-top: 8px; padding-top: 8px;
border-top: 1px solid var(--border);
font-size: 12px; color: var(--text-secondary); line-height: 1.6;
}
.task-actions {
display: flex; gap: 8px; flex-shrink: 0;
padding: 10px 16px; background: var(--bg-secondary);
border-top: 1px solid var(--border);
}
.btn-action {
padding: 8px 18px; border-radius: var(--radius);
font-size: 12px; font-weight: 500; cursor: pointer;
transition: var(--transition); border: 1px solid transparent;
}
.btn-action.primary { background: var(--accent); color: #fff; border-color: var(--accent); }
.btn-action.primary:hover { opacity: 0.9; }
.btn-action.success { background: var(--success); color: #fff; border-color: var(--success); }
.btn-action.success:hover { opacity: 0.9; }
.btn-action.warning { background: var(--warning); color: #fff; border-color: var(--warning); }
.btn-action.warning:hover { opacity: 0.9; }
.btn-action.danger { background: var(--danger); color: #fff; border-color: var(--danger); }
.btn-action.danger:hover { opacity: 0.9; }
.btn-action.default { background: var(--bg-tertiary); color: var(--text-secondary); border-color: var(--border); }
.btn-action.default:hover { background: var(--bg-hover); color: var(--text-primary); }
/* Approval comment */
.approval-section {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 14px 16px;
}
.approval-section .as-title { font-size: 12px; font-weight: 600; margin-bottom: 8px; }
.approval-textarea {
width: 100%; min-height: 80px; resize: vertical;
background: var(--bg-tertiary); border: 1px solid var(--border);
border-radius: var(--radius); padding: 8px 10px;
color: var(--text-primary); font-size: 12px; font-family: inherit;
outline: none; transition: border-color var(--transition);
}
.approval-textarea:focus { border-color: var(--accent); }
.approval-textarea::placeholder { color: var(--text-muted); }
.device-status-grid {
display: grid; grid-template-columns: 1fr 1fr; gap: 8px;
}
.device-status-item {
background: var(--bg-tertiary); border: 1px solid var(--border);
border-radius: var(--radius); padding: 8px 10px;
}
.device-status-item .dsi-label { font-size: 10px; color: var(--text-muted); margin-bottom: 2px; }
.device-status-item .dsi-value { font-size: 12px; font-weight: 500; }
.dsi-value.normal { color: var(--success); }
.dsi-value.warning { color: var(--warning); }
.dsi-value.danger { color: var(--danger); }
/* ========== RIGHT SIDEBAR ========== */
.sidebar-right {
width: 320px; min-width: 220px;
background: var(--bg-secondary);
border-left: none;
display: flex; flex-direction: column;
overflow: hidden; transition: var(--transition);
position: relative;
}
/* AI Recommend */
.ai-recommend-section { flex-shrink: 0; padding: 10px 12px; border-bottom: 1px solid var(--border); }
.ai-recommend-section .ars-title {
font-size: 12px; font-weight: 600; color: var(--accent);
margin-bottom: 8px; display: flex; align-items: center; gap: 6px;
}
.ai-recommend-section .ars-title::before {
content: ''; width: 3px; height: 12px;
background: var(--accent); border-radius: 2px; display: inline-block;
}
.ars-card {
background: var(--bg-tertiary); border: 1px solid var(--border);
border-radius: var(--radius); padding: 8px 10px;
margin-bottom: 5px; cursor: pointer; transition: var(--transition);
}
.ars-card:hover { border-color: var(--accent); background: var(--bg-hover); }
.ars-card .ars-card-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 3px; }
.ars-card .ars-confidence { font-size: 10px; padding: 1px 6px; border-radius: 8px; background: var(--accent-soft); color: var(--accent); }
.ars-card .ars-card-text { font-size: 11px; color: var(--text-secondary); line-height: 1.5; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.ars-card .ars-shortcut-hint { font-size: 10px; color: var(--text-muted); margin-top: 3px; display: flex; align-items: center; gap: 4px; }
.key-badge {
display: inline-flex; align-items: center; justify-content: center;
font-size: 10px; padding: 1px 5px; background: var(--bg-hover);
border: 1px solid var(--border); border-radius: 3px;
color: var(--text-muted); min-width: 18px; font-family: monospace;
}
/* Quick Reply — 三层渐进式导航 */
.quick-reply-section { flex: 1; display: flex; flex-direction: column; overflow: hidden; min-height: 0; }
/* 搜索栏 */
.qr-search { padding: 8px 12px; flex-shrink: 0; position: relative; }
.qr-search-input {
width: 100%; background: var(--bg-tertiary); border: 1px solid var(--border);
border-radius: var(--radius); padding: 7px 10px 7px 28px;
color: var(--text-primary); font-size: 12px; font-family: inherit;
outline: none; transition: border-color var(--transition);
}
.qr-search-input:focus { border-color: var(--accent); }
.qr-search-input::placeholder { color: var(--text-muted); font-size: 11px; }
.qr-search-icon { position: absolute; left: 22px; top: 50%; transform: translateY(-50%); color: var(--text-muted); font-size: 12px; }
/* 面包屑导航:显示当前路径 L1 > L2 */
.qr-breadcrumb {
padding: 6px 12px; flex-shrink: 0;
font-size: 11px; color: var(--text-secondary);
display: flex; align-items: center; gap: 4px; flex-wrap: wrap;
border-bottom: 1px solid var(--border);
background: var(--bg-tertiary);
min-height: 28px;
}
.qr-breadcrumb .bc-back {
cursor: pointer; color: var(--accent); font-weight: 500;
padding: 1px 6px; border-radius: 3px;
transition: var(--transition);
}
.qr-breadcrumb .bc-back:hover { background: var(--accent-soft); }
.qr-breadcrumb .bc-sep { color: var(--text-muted); }
.qr-breadcrumb .bc-current { font-weight: 600; color: var(--text-primary); }
.qr-breadcrumb .bc-hint {
margin-left: auto; font-size: 10px; color: var(--text-muted);
display: flex; align-items: center; gap: 3px;
}
/* ===== L1 一级目录:7列网格,强制一行,按钮内上下排列 ===== */
.qr-l1-grid {
padding: 4px 6px 6px; flex-shrink: 0;
border-bottom: 1px solid var(--border);
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 4px;
}
.qr-l1-grid.hidden { display: none; }
.qr-l1-btn {
display: flex; flex-direction: column; align-items: center; justify-content: center;
gap: 2px;
padding: 5px 2px;
border-radius: var(--radius);
cursor: pointer; transition: var(--transition);
font-size: 10px; color: var(--text-secondary);
background: transparent;
border: 1px solid var(--border);
min-width: 0; overflow: hidden;
}
.qr-l1-btn:hover { background: var(--bg-hover); color: var(--text-primary); border-color: var(--border-light); }
.qr-l1-btn.active { background: var(--accent-soft); color: var(--accent); border-color: var(--accent); font-weight: 600; }
/* L1 按钮颜色 — 7个主类(nth-child */
.qr-l1-btn:nth-child(1).active { background: #dbeafe; color: #1e40af; border-color: #3b82f6; }
.qr-l1-btn:nth-child(1).active .l1-num { background: #3b82f6; color: #fff; }
.qr-l1-btn:nth-child(2).active { background: #dcfce7; color: #166534; border-color: #22c55e; }
.qr-l1-btn:nth-child(2).active .l1-num { background: #22c55e; color: #fff; }
.qr-l1-btn:nth-child(3).active { background: #fff7ed; color: #9a3412; border-color: #f97316; }
.qr-l1-btn:nth-child(3).active .l1-num { background: #f97316; color: #fff; }
.qr-l1-btn:nth-child(4).active { background: #ede9fe; color: #5b21b6; border-color: #8b5cf6; }
.qr-l1-btn:nth-child(4).active .l1-num { background: #8b5cf6; color: #fff; }
.qr-l1-btn:nth-child(5).active { background: #fee2e2; color: #991b1b; border-color: #ef4444; }
.qr-l1-btn:nth-child(5).active .l1-num { background: #ef4444; color: #fff; }
.qr-l1-btn:nth-child(6).active { background: #f0fdfa; color: #115e59; border-color: #0ea5e9; }
.qr-l1-btn:nth-child(6).active .l1-num { background: #0ea5e9; color: #fff; }
.qr-l1-btn:nth-child(7).active { background: #f3f4f6; color: #374151; border-color: #6b7280; }
.qr-l1-btn:nth-child(7).active .l1-num { background: #6b7280; color: #fff; }
.qr-l1-btn .l1-num {
display: flex; align-items: center; justify-content: center;
width: 18px; height: 18px; border-radius: 4px;
background: var(--bg-tertiary); color: var(--text-muted);
font-size: 10px; font-weight: 700; flex-shrink: 0;
border: 1px solid var(--border);
}
.qr-l1-btn .l1-name {
font-size: 10px; line-height: 1.2;
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
max-width: 100%;
}
.qr-l1-btn.active .l1-num { background: var(--accent); color: #fff; border-color: var(--accent); }
/* ===== L2 二级目录:横向流式,1-2行 ===== */
.qr-l2-row {
padding: 6px 10px; flex-shrink: 0;
border-bottom: 1px solid var(--border);
display: flex; flex-wrap: wrap; gap: 4px;
}
.qr-l2-row.hidden { display: none; }
.qr-l2-chip {
display: flex; align-items: center; gap: 4px;
padding: 4px 10px; border-radius: 12px;
cursor: pointer; transition: var(--transition);
font-size: 11px; color: var(--text-secondary);
background: var(--bg-tertiary);
border: 1px solid var(--border);
white-space: nowrap;
}
.qr-l2-chip:hover { background: var(--bg-hover); color: var(--text-primary); border-color: var(--border-light); }
.qr-l2-chip.selected { background: var(--qr-active-light, var(--accent-soft)); color: var(--qr-active-color, var(--accent)); border-color: var(--qr-active-color, var(--accent)); font-weight: 600; }
.qr-l2-chip .l2-num {
display: flex; align-items: center; justify-content: center;
width: 16px; height: 16px; border-radius: 50%;
background: var(--bg-hover); color: var(--text-muted);
font-size: 9px; font-weight: 700; flex-shrink: 0;
}
.qr-l2-chip.selected .l2-num { background: var(--qr-active-color, var(--accent)); color: #fff; }
/* ===== L3 回复列表 ===== */
.qr-l3-list {
flex: 1; overflow-y: auto; padding: 4px;
}
.qr-l3-list::-webkit-scrollbar { width: 4px; }
.qr-l3-list::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
.qr-l3-item {
display: flex; align-items: flex-start; gap: 8px;
padding: 8px 10px; margin: 2px 4px;
border-radius: var(--radius);
cursor: pointer; transition: var(--transition);
font-size: 12px; color: var(--text-secondary);
border: 1px solid transparent;
}
.qr-l3-item:hover { background: var(--bg-hover); color: var(--text-primary); }
.qr-l3-item.selected { background: var(--qr-active-light, var(--accent-soft)); border-color: var(--qr-active-color, var(--accent)); color: var(--text-primary); }
.qr-l3-item .l3-num {
display: flex; align-items: center; justify-content: center;
width: 20px; height: 20px; border-radius: 4px;
background: var(--bg-tertiary); color: var(--text-muted);
font-size: 10px; font-weight: 700; flex-shrink: 0;
border: 1px solid var(--border); margin-top: 1px;
}
.qr-l3-item.selected .l3-num { background: var(--qr-active-color, var(--accent)); color: #fff; border-color: var(--qr-active-color, var(--accent)); }
.qr-l3-item .l3-content { flex: 1; line-height: 1.5; }
.qr-l3-item .l3-title { font-weight: 500; color: var(--text-primary); margin-bottom: 2px; }
.qr-l3-item .l3-preview { font-size: 11px; color: var(--text-muted); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.qr-l3-empty {
display: flex; flex-direction: column; align-items: center; justify-content: center;
height: 100%; color: var(--text-muted); font-size: 12px;
gap: 6px; padding: 20px;
}
.qr-l3-empty .empty-icon { font-size: 28px; opacity: 0.4; }
.qr-l3-empty .empty-hint { font-size: 11px; text-align: center; line-height: 1.6; }
/* 已选中的回复预览条 */
.qr-selected-bar {
padding: 6px 12px; flex-shrink: 0;
border-top: 1px solid var(--border);
background: var(--success-soft);
font-size: 11px; color: var(--success);
display: flex; align-items: center; gap: 6px;
}
.qr-selected-bar.hidden { display: none; }
.qr-selected-bar .sel-text { flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.qr-selected-bar .sel-hint { font-size: 10px; color: var(--text-muted); flex-shrink: 0; }
/* 键盘指南 */
.keyboard-guide { padding: 6px 12px; border-top: 1px solid var(--border); font-size: 10px; color: var(--text-muted); display: flex; gap: 8px; flex-wrap: wrap; flex-shrink: 0; }
.keyboard-guide span { display: flex; align-items: center; gap: 3px; }
</style>
<script>
// Auto-generated from IT支持知识库2026-4-24.docx
// 7大类 28子类 180条快速回复模板
const qrData = [{"name": "电脑", "subs": [{"name": "硬件设备", "items": [{"title": "笔记本电脑电池续航异常", "content": "健康评估标准:剩余容量<70%或循环次数>500次。\n获取报告步骤::\nWindowscmd中输入 powercfg /batteryreport,查看报告中的“CYCLE COUNT”。\nMac:按住Option键点击苹果菜单→系统信息→电源→查看“循环计数”。\n将报告留言分享,等待人工坐席进一步评估。"}, {"title": "办公电脑常见问题处理(黑屏、警报)", "content": "排查步骤\n1. 观察电源指示灯:确认电脑的电源指示灯是否亮起或闪烁。\n2. 强制关机重启:长按电源键约15-20秒,直到电源指示灯完全熄灭,等待几秒钟后,再次按下电源键尝试开机。"}, {"title": "办公电脑常见问题处理(死机、卡顿)", "content": "排查步骤:\n1. 检查系统资源:按Ctrl+Shift+Esc打开任务管理器,结束占用高的非必要进程。\n2. 强制重启:长按电源键15-20秒至指示灯熄灭,等待后重新开机。"}]}, {"name": "Windows系统", "items": [{"title": "Windows本地账户密码修改", "content": "路径:设置→帐户→登录选项→密码→更改,按提示完成。"}, {"title": "办公电脑功能异常(无声音、屏幕显示、键盘热键)", "content": "排查步骤:\n1. 检查驱动:设备管理器查看是否有异常设备(黄色/红色标志)。\n2. 重装驱动:联想电脑使用官方工具;其他品牌从官网下载最新驱动。"}, {"title": "办公电脑麦克风无声音", "content": "排查步骤:\n1. 设置默认设备:右键任务栏扬声器图标→声音设置,确保麦克风设为默认输入设备。\n2. 授予权限:在Windows搜索“麦克风隐私设置”,开启麦克风访问权限及对应应用(如企业微信、小鱼)的权限。\n3. 调整属性:在设备属性中调整音量和麦克风增强,禁用独占模式。"}, {"title": "Windows电脑和Office许可证过期|激活|即将到期", "content": "适用场景:激活过期/失败/即将到期。\n操作步骤:\n1. 下载工具:https://drive.weixin.qq.com/s?k=AAoA1wcYAAcmKeQnWG\n2. 运行工具,按需取消选项(如不需激活Office)。\n3. 点击“开始”处理。"}, {"title": "电脑C盘空间不足", "content": "操作步骤:\n1. 打开企业微信,进入【设置】→【文档/文件管理】→【文件储存位置】。\n2. 点击【更改】,选择其他盘符的目录作为新存储路径。"}, {"title": "U盘、移动硬盘无法弹出报错“弹出USB大容量存储设备时出问题”", "content": "故障现象:\n弹出U盘提示“该设备正在使用中、请关闭可能使用该设备的所有程序或窗口,然后重试”\n解决方法:\n将电脑关机后再拔出硬盘"}, {"title": "办公电脑系统初始密码", "content": "总部新电脑:Windows系统无密码(直接回车)\n电脑开机密码是独立的,不与内部统一员工账密一致。"}, {"title": "电脑开机密码重置", "content": "重置电脑开机需使用专用工具由IT支持人员进行现场处理,总部员工请携带设备前往121室,区域同事请联系本地兼职网络协助处理"}]}, {"name": "鸿蒙系统", "items": [{"title": "公司办公IT环境不支持鸿蒙系统的软硬件清单", "content": "软件功能类:\n火绒安全、税友安全助手、企业微信-同事吧(发帖、回复)"}]}]}, {"name": "软件", "subs": [{"name": "常用工具", "items": [{"title": "常用办公软件下载地址", "content": "常用办公软件下载地址:https://drive.weixin.qq.com/s?k=AAoA1wcYAAcVScZYR4"}, {"title": "压缩工具", "content": "7-Zip是一款免费开源高压缩比的压缩软件,支持7z、ZIP、RAR、CAB、GZIP、BZIP2和TAR等格式。此软件压缩的压缩比要比普通ZIP文件高30-50%。\n7-Zip 客户端下载地址:https://sparanoid.com/lab/7z/download.html"}]}, {"name": "企业微信", "items": [{"title": "企业微信综合信息", "content": "企业微信账号同时与个人微信、手机同步绑定"}, {"title": "企微手机聊天记录迁移到电脑", "content": "企业微信:打开企业微信---我---设置---通用---聊天记录迁移(手机和电脑连接同一网络热点)"}, {"title": "企业微信显示手机号码修改", "content": "操作路径:企业微信手机端→设置→账号与安全→手机号→更换手机号,按提示完成。"}, {"title": "企业微信账号登录异常", "content": "处理方案:\n1. 账号限制/封禁:通过官方申诉链接处理:https://work.weixin.qq.com/webapp/kefuSelfService/page 。\n2. 设备超限:卸载当前版本,重启后下载最新版安装:https://work.weixin.qq.com/#indexDownload"}, {"title": "企业微信消息接收延迟", "content": "排查步骤:\n1. 确认文件存储路径:企业微信→设置→存储管理。\n2. 退出企业微信,删除WXWork存储路径下的Global文件夹。"}, {"title": "企业微信客户相关功能限制(客户群/朋友圈/外部联系人", "content": "“亿企赢总部“企微主要作为内部沟通渠道,限制添加外部联系人、客户、客户群等客户营销、服务支持功能。\n“亿企赢”主体:用于客户联系。\n“亿企赢总部”主体:仅限内部沟通。\n如有上述需求请切换至“亿企赢”企微主体进行操作,或由“亿企赢”企微主体账号客户&项目经理账号建立客户群,再添加“亿企赢总部”相关人员入群。"}]}, {"name": "企业邮箱", "items": [{"title": "税友企业邮箱访问方式与账号密码认证方式", "content": "通过第三方邮件客户端配置POP、SMTP、IMAP协议访问,需使用邮箱专用安全密码\n通过Coremail客户端配置POP、SMTP、IMAP协议访问,需使用邮箱专用安全密码\n通过Coremail客户端配置Coremail协议访问,需使用统一员工账号密码\n通过税友企业邮箱网页登录使用统一员工账号密码+短信认证"}, {"title": "税友企业邮箱密码修改或重置", "content": "注意:通过WEB网页登录企业邮箱与邮件客户端收发邮件所配置密码并不相同,访问WEB地址和使用Coremail客户端采用的是员工统一账号密码(与eHR、税友家园登录密码相同),其他第三方邮件客户端配置的是邮件客户端安全专用密码,请根据实际情况选择不同密码修改重置方式。\n员工统一账号密码重置入口:\nhttp://192.168.9.87:8080/employee-center/resetPwd.jsp\n第三方邮件客户端邮件客户端专用密码生成和重置入口:\n使用员工统一账号密码+短信验证码登录WEB邮箱https://mail.servyou.com.cn/\n设置(齿轮图标)-安全设置-客户端安全登录-“生成专用密码”\n设置密码名称(便于区分使用软件或对象)\n获取(复制)16位密码和邮件客户端配置(按需)"}, {"title": "邮箱客户端安全登录专用密码介绍", "content": "客户端专用密码是用于登录第三方邮件客户端(例如Outlook、Foxmail、邮件App等)时使用的专属密码\n适合客户端通过以下协议使用:POP、IMAP、SMTP、Pushmail、CalDAV、CardDAV\n“客户端专用密码”仅在生成时可见,支持设置多个,切勿使用其它方式保存,以防泄露\n邮件客户端专用密码需通过登录邮件服务器网站进行申请和获取"}, {"title": "税友企业邮件地址", "content": "税友企业邮件网址: https://mail.servyou.com.cn"}, {"title": "税友邮箱网站无法登入", "content": "步骤:\n1. 先登录税友家园( https://oa.servyou-it.com/)验证账号。\n2. 若密码错误,通过http://192.168.9.87:8080/employee-center/resetPwd.jsp重置。\n3. 重置后等待10分钟重试邮箱登录。"}, {"title": "税友邮箱已发送邮件召回", "content": "条件:仅限发送给公司内部员工且对方未读的邮件。\n操作:登录网页版邮箱(https://mail.servyou.com.cn)→自助查询→发信查询→点击“召回邮件”。"}, {"title": "邮箱客户端配置", "content": "邮件客户端选择和下载\nCoremail邮件客户端 https://www.coremail.cn/download.html\nFoxmail邮件客户端 https://www.foxmail.com/win/\n企业微信邮件应用 路径:企业微信客户端-邮件\n生成邮件客户端专用密码:登录网页版邮箱( https://mail.servyou.com.cn/ )→个人设置→安全设置→客户端安全登录→生成16位专用密码。\n配置客户端:\n收发服务器地址:mail.servyou.com.cn\n协议和端口:POP收件协议 995SSL)、SMTP发件协议465(SSL)\n密码使用生成的专用密码。\n详细指南参考:https://doc.weixin.qq.com/doc/w3_AU8AjwZhAIgBx1RxfT7SRqnW0yN7i"}, {"title": "使用邮件客户端本地保留历史收发邮件", "content": "说明:根据公司信息安全管理要求,企业邮箱服务器邮件仅保留14天,14天到期邮件将被清除且无法恢复。如有经常随时查阅历史邮件和有邮件存档需求,应避免只使用WEB方式访问邮件网站收发邮件,同时避免使用配置imap、Coremail协议的邮件客户端如:企业微信邮件、Coremail邮件客户端),而应选择配置POP收件协议 的邮件客户端管理邮件。\n解决方案:\n根据需要选择下载安装  Foxmail、Coremail、网易邮箱大师等邮件客户端,Coremail邮件客户端配置过程邮件协议不要默认选择Coremail。\n2.登录企业邮件网址https://mail.servyou.com.cn. 通过路径”设置(齿轮图标)-安全设置-客户端安全登录“,申请邮件客户端专用密码\n3.正确邮件客户端邮件服务器地址、收发邮件服务器地址和端口、邮件账号和邮件客户端专用密码"}, {"title": "Foxmail邮箱收发异常“不知道这样的主机”", "content": "处理步骤:\n1. 打开Foxmail,右键邮箱名→设置→账号→服务器。\n2. 修改服务器地址为mail.servyou.com.cn,端口收件995SSL)、发件465SSL)。"}, {"title": "税友邮箱WEB登录异常“用户名或密码错误,或登录受到限制”", "content": "解决步骤:\n1. 重置密码:http://192.168.9.87:8080/employee-center/resetPwd.jsp\n2. 尝试登录税友家园( https://oa.servyou-it.com/ )验证账号正常后,重试邮箱登录。"}, {"title": "外部邮件漏收&被拦截", "content": "排查步骤:\n1.使用私人邮箱或请同事给自己发送一封邮件,确认有些客户端设置是否正确。\n2.检查邮件客户端垃圾邮件(箱),确定是否被邮件客户端拦截\n3使用员工账户中心密码+短信信验证码,登录企业邮箱WEB页面 https://mail.servyou.com.cn ,检查“其他文件-垃圾邮件下是否有所需邮件\n如以上检查确认无法收到,请IT支持人工坐席联系邮件运维,启动“邮件防火墙筛查”"}, {"title": "公共邮箱申请流程(新建|回收|停用)", "content": "申请链接:https://devops.dc.servyou-it.com/ITSM/workflow/service/createTicket?name=公共邮箱账号申请\n具体审批执行情况请联系工单处理人。"}, {"title": "Coremail邮箱显示脱机", "content": "请右键点击账号信息,选择“设为联机模式”。如果操作后仍未恢复,请确认账号和密码输入是否正确。"}]}, {"name": "税友云盘", "items": [{"title": "税友云盘网址和客户端下载", "content": "税友云盘网址: https://ypan.dc.servyou-it.com\n登录窗口左下角点击“下载客户端”\n注:税友云盘暂不支持手机移动端"}, {"title": "税友企业云盘账号解冻", "content": "税友云盘(企业云盘)\n云盘账号解冻联系谢聪利申请解冻。"}, {"title": "税友云盘更新失败", "content": "访问https://ypan.dc.servyou-it.com/user/login ,在登录页面左下角下载最新版安装。"}, {"title": "税友云盘密码错误", "content": "使用员工统一认证账号密码+短信二次认证,用户名与税友家园、EHR系统一致,忘记密码可使用员工统一认证账号密码重置方式进行重置"}, {"title": "税友云盘文件夹访问权限申请", "content": "税友云盘文件夹权限管理由各部门及项目指定空间管理员分管,云盘文件夹目录创建与权限调整需联系所属的管理员。\n税友云盘部门和项目管理员名单:https://doc.weixin.qq.com/sheet/e3_m_aOPqWFhxgwDR?scode=AAoA1wcYAAcVgz1ud7AQgAuAYMANY&tab=BB08J2"}]}, {"name": "企微微盘", "items": [{"title": "企微微盘上传本地文件提示“微盘容量已满,无法上传文件,开通微盘高级功能,可提升容量。”应该如何处理?", "content": "因企业微信-微盘收费政策发生重大调整,费用较之前上涨6倍。前期经过与各客群沟通,当前“文档”功能在绝大多数工作场景中已能够替代“微盘”,因此先暂停微盘的续费工作。已安排各客群调研实际需求,后续将根据调研的结果评估续费方案。现阶段的影响以及安排如下:\n一、到期影响(2026年3月14日起)\n1.微盘:到期后将无法上传新本地文件,空间已有文件可正常访问、下载,短时间不被删除。\n2.文档:“文档”的在线编辑、上传及共享等功能 不受此次调整影响。在线文档大小不占用微盘容量。\n二、 后续使用指引\n1.主要替代方案:请各部门及员工将后续新增的文档存储、分享需求,通过企业微信“文档”功能中实现。\n2.特殊需求处理:如确有特殊业务必须使用微盘,请由部门接口人汇总评估需求必要性。\n3.文档高级会员:部分原微盘需求将转移至“文档”后新增高级会员,公司将按必要性进行引导与管理,具体采购流程和管理方案另行通知。\n三、 咨询与支持\n请各位同事知悉并提前做好工作安排,如有疑问可统一咨询: 企微“智能IT助手”,各中心接口人将负责本部门内的宣导与部门内个性化实施。\n微盘&文档常见问题答疑文档链接:https://doc.weixin.qq.com/doc/w3_AJAAAQaUAI4CN6WEkNQg7RZWP4F2Z?scode=AAoA1wcYAAcO7CE2NAAJAAAQaUAI4\n微盘管理部门接口人:"}, {"title": "为什么企微微盘容量到期后,公司不再统一续费?", "content": ""}, {"title": "因企业微信-微盘收费政策发生重大调整,费用较之前上涨6倍。前期经过与各客群沟通,当前“文档”功能在绝大多数工作场景中已能够替代“微盘”,因此先暂停微盘的续费工作。", "content": ""}, {"title": "企微微盘容量到期后,原有空间内的文件有什么影响?", "content": "到期后企微空间将无法上传新本地文件,空间已有文件可正常访问、下载,短时间不被删除。"}, {"title": "企微微盘空间内的文件能够保留多久?", "content": "企微空间内的文件暂时不会删除,如果企微官方调整文件保存策略,会提前通知"}, {"title": "企微微盘没有扩容的情况下,每个人平均有的是多少?", "content": "按照集团企微账号共享容量100GB,集团现有约7000人均分,大概14MB/ 人"}, {"title": "如何查看企微微盘已用容量", "content": "路径:【电脑端->微盘->左下角->个人容量】\n将鼠标悬停在已用容量位置,可查看:微盘版本(企业)、账号类型(个人)、已用容量(个人)、剩余容量(企业)。"}]}, {"name": "企微文档", "items": [{"title": "在线文档里插入本地图片和其他文件,所占用的是什么应用的容量?", "content": "在线文档上传的本地文件只会占用“文档”容量,"}, {"title": "视频/音频可以转成企微微盘在线文档吗?", "content": "只有word、Excel、演示、PPT不可以转为在线文档,其他格式无法转为在线文档"}, {"title": "企微文档容量如何计算?", "content": "文档仅占用创建者的容量,文档容量根据文档正文、文档中插入的文件、图片以及版本历史记录综合计算,具体类型包括:\n文档、表格、幻灯片、智能表格、思维导图、流程图:文档正文、文档中插入的本地文件、图片、表格函数、图表等\n收集表、汇报:填写者提交的内容,包含正文、文件、图片、签名等\n版本历史记录计入文档容量:在线文档会自动保留历史版本,方便查看编辑记录,可以随时找回历史内容,避免数据丢失。文档容量将根据版本历史的大小综合计算。"}, {"title": "企微文档中插入的文件是否占用企微微盘容量?", "content": "文档中插入的文件仅占用文档容量,不会占用微盘容量。"}, {"title": "企微文档容量如何提升?", "content": "基础版个人总容量上限为 1G,开通文档高级功能后,文档容量提升至无限。"}, {"title": "如何查看已用企微文档容量情况?", "content": "成员可在【手机端->文档->右上角的“+”->更多->关于文档】中查看文档已用容量。"}, {"title": "如何释放已经占用的企微「文档」容量", "content": "方法一:删除过期文档,进入「文档 > 全部 > 我的文档」,这里将展示占用本人容量的所有文档,可以按大小排序,可自行操作删除。\n方法二:删除文档中的图片和文件,打开本人创建的文档,删除文档中已插入的图片、文件。\n方法三:删除通过汇报上传的文件,在「微盘 ->我的空间->选择对应的汇报」操作删除汇报中的文件、图片。删除后,一般10分钟左右就能释放对应的容量。注:需汇报创建者操作。\n方法四:文档版本历史记录文档瘦身,进入进入「文档 > 设置> 生成副本」,删除原文档保留副本文档\n方法五:移交文档、文件(夹)所有权给文档高级会员,将文档(文件夹)移动至个人空间,选中文件(夹)右键>转接所有权(所转交文件占用的空间会移交给接收人)\n温馨提示:\n(1)文档容量非实时更新,会在第二天更新。\n(2)文档删除后,可以在【文档->全部->回收站】中恢复对应的文档,非高级账号的文档在回收站会保留7天,高级账号的文档在回收站会保留180天。"}, {"title": "企微文档提示:“文档容量已满,因此你无法在该文档中插入图片”", "content": "异常原因:插入图片所在文档所有者,企微文档免费额度已满,需由当前文档创建者购买收费高级功能\n出于数据安全和成本考虑,公司不提倡大范围使用企微在线文档,部门或个人如坚持使用,需自行购买。"}, {"title": "企微文档所有者查看方式", "content": "文档窗口右上角“三杠”图标"}, {"title": "企微文档高级功能购买链接", "content": "https://work.weixin.qq.com/mall/wedoc?wws=19"}, {"title": "企业微信共享文件删除恢复", "content": "路径:微盘→我的文件→左下角三点菜单→回收站→选择文件→还原。"}, {"title": "企业微信文档报错“未知错误”", "content": "解决方式:\n1. 关闭网络代理:Internet选项→连接→局域网设置→取消代理服务器勾选。\n2. 更新企业微信版本:左下角“关于”中检查更新。"}]}, {"name": "文档中心", "items": [{"title": "Confluence文档中心网址", "content": "文档中心 https://docs.dc.servyou-it.com"}]}, {"name": "网页浏览", "items": [{"title": "Edge&谷歌浏览器无法打开网页,错误代码: STATUS_STACK_BUFFER_OVERRUN”", "content": "【问题原因】\n浏览器更新后与税友安全助手组件冲突\n【影响范围】\nMicrosoft Edge 、谷歌浏览器\n【处理办法】\n下载并安装“浏览器修复补丁”,重启浏览器后即可恢复。\n下载地址:浏览器修复补丁"}]}]}, {"name": "外设", "subs": [{"name": "打印复印", "items": [{"title": "杭州总部刷卡打印机安装", "content": "1.登录页面右下角“客户端下载”下载驱动,http://printer.oa.servyou-it.com/printhub/ui/sign/login.htm\nWindows:选择“柯美原厂驱动”\nMac:选择“PrintDriver”,\n打印时,Windows用户选择打印机名称 KM_Printer,MAC用户选择打印机名称 FollowMe-Black\n输入服务器地址:printer.oa.servyou-it.com:80 绑定“统一员工账号密码”,填写完成后点击“校验”并确定\n3.首次使用刷卡取件,可前往任意楼层刷卡打印机,在提示位置刷卡后,输入员工账号和密码进行认证绑定。\n详细操作请参考文档《统一刷卡打印机安装使用说明》统一刷卡打印机安装使用说明\nhttps://doc.weixin.qq.com/doc/w3_APQA0gb5AAgUUYPrXy8QAGRQfMDgx?scode=AAoA1wcYAAcuo1wd2hAPQA0gb5AAg&qt_source=Search&qt_report_identifier=1763972439462&version=5.0.2.6008&platform=win"}, {"title": "杭州总部刷卡打印机复印操作", "content": "步骤:\n1. 刷卡后点击“复印”功能。\n2. 按提示操作,完成后取件口取件。\n身份证复印支持双面模式。\n详细操作请参考文档《统一刷卡打印机安装使用说明》https://doc.weixin.qq.com/doc/w3_APQA0gb5AAgUUYPrXy8QAGRQfMDgx?scode=AAoA1wcYAAcuo1wd2hAPQA0gb5AAg&qt_source=Search&qt_report_identifier=1763972439462&version=5.0.2.6008&platform=win"}, {"title": "杭州总部刷卡打印机扫描操作", "content": "步骤:\n1. 刷卡后点击屏幕“扫描”功能。\n2. 选择扫描方式:多页用“进纸器”,单页/厚重文件用“平板”。\n3. 扫描文件发送至个人邮箱。详情操作参考https://doc.weixin.qq.com/doc/w3_APQA0gb5AAgUUYPrXy8QAGRQfMDgx 。"}, {"title": "总部刷卡打印驱动下载", "content": "总部刷卡打印中心网址 http://printer.oa.servyou-it.com/printhub/ui/sign/login.htm"}, {"title": "杭州总部打印彩色稿件", "content": "Windows操作系统直接打印,Mac OS系统选择名称“”ColourPrine”打印机,\n打印任务完成后至杭州总部亿企赢大厦彩色打印机放置楼层为5、10、15、20层刷卡取件即可"}, {"title": "杭州总部刷卡打印机卡纸、缺墨", "content": "总部员工改用其他楼层打印设备,并留言告知异常设备位置,安排处理。"}, {"title": "杭州总部刷卡打印机显示未连接", "content": "尝试重启电脑后重试打印。"}, {"title": "杭州总部刷卡打印机缺纸处理", "content": "总部员工可改用其他楼层打印设备,或自行补充备用纸(设备下方防潮柜柜内可取)。部门批量打印需至资产办公室领用。"}, {"title": "杭州总部刷卡打印机取件异常", "content": "原因一:员工账号密码更新后,客户端密码未同步修改更新。\n检测步骤:\nWindows:任务栏打印机图标(蓝色大拇指)→配置→校验密码。\nMac:应用程序→PrinterLogin→校验账号密码。\n原因二:30分钟内未及时取件,打印任务超30分钟未取件自动取消\n操作步骤:重新打印,30分钟内取件"}, {"title": "总部刷卡打印客户端,配置页面提示“验证失败!用户名或密码错误”", "content": "原因:员工账户中心员工密码到期或更新后,刷卡打印客户端未同步更新\n处理步骤:更新密码后,点击校验,提示“校验成功!”后,点击确认"}, {"title": "总部刷卡打印客户端,配置页面提示“验证失败!用户名或密码错误次数达到系统上限,现已被锁定...\"", "content": "原因:密码错误输入超过3次\n处理步骤:确认员工账号密码正确(可在税友家园、eHR尝试登录),在5分钟后使用正确密码进行校验"}]}, {"name": "网络会议", "items": [{"title": "小鱼易连客户端下载", "content": "小鱼易连客户端支持Windows、MAC、Linux(统信、麒麟),请根据所运行操作系统选择下载不同客户端。 小鱼易连下载中心:https://www.xylink.com/download"}, {"title": "小鱼固定方云会议室预约", "content": "操作路径:运行小鱼易连软件→会议→我的会议→新建→预约会议。详情参考《小鱼云会议用户使用指南》。\nhttps://doc.weixin.qq.com/doc/w3_AJAAAQaUAI429WiTgHnRU0I0O5ItO?scode=AAoA1wcYAAcNyzXMF6AJAAAQaUAI4&qt_source=Search&qt_report_identifier=1764120639847&version=5.0.2.6008&platform=win"}, {"title": "小鱼固定方云会议预约信息查询", "content": "小鱼固定方云会议预约信息查询需桌面IT支持人工坐席处理,请按一下步骤进行操作。\n回复“IT”获取桌面IT支持人工支持链接\n点击IT支持人工支持链接进入人工坐席咨询窗口\n输入需要查询的小鱼固定方会议室号,会议时间区间\n耐心等待人工支持坐席回复"}, {"title": "小鱼云会议使用方法", "content": "详情参考《小鱼云会议用户使用指南》。\nhttps://doc.weixin.qq.com/doc/w3_AJAAAQaUAI429WiTgHnRU0I0O5ItO?scode=AAoA1wcYAAcNyzXMF6AJAAAQaUAI4&qt_source=Search&qt_report_identifier=1764120639847&version=5.0.2.6008&platform=win"}, {"title": "小鱼固定方云会议室号及主持人密码", "content": "25方:会议号9083894961,密码348124,主持密码569149\n50方:会议号9083284868,密码502892,主持密码625067\n100方:会议号9083261987,密码359615,主持密码374852"}, {"title": "小鱼直播权限申请", "content": "无需申请,新建直播即可,无人数限制。"}, {"title": "小鱼云会议室录像和会议统计提取", "content": "企业云会议室:登录一站式运维平台-服务目录-IT支持服务-活动与会议支持,支持级别\"资料下载“,服务内容“录像下载”或“活动统计”补充信息会议号,以及会议直至时间。\n个人云会议室:客户端→文件夹→我的文件夹查看历史录制。正常情况支持人员会在1小时内处理完成,请关注“一站式运维平台”工单完工消息提醒,通过我的工单-我的创建-查看并获取下载链接"}, {"title": "企业微信会议(腾讯会议)不可用", "content": "受企业微信商业政策调整影响,公司决定2023-8-1停止企业微信会议功能,企微会议功能关闭后,企微音频/视频通话+屏幕分享(企业内限16人,企业外1对1),集团全体员工可使用手机号+短信方式登录使用小鱼易连会议,30方及以下会议可使用小鱼终端号、个人云会议号,>30~100方会议需预约小鱼企业云会议号"}]}, {"name": "会议电视", "items": [{"title": "会议室屏幕投屏操作步骤", "content": "标准会议室(如:总部办公楼层5~21楼)\n使用电视遥控器打开电视\n将投屏线(转接头)连接至电脑HDMI|Type-C接口\n大型视频会议室(总部409、410)\n黑色遥控器打开电视\n银色遥控器打开小鱼终端\n将投屏器连接至电脑\n点击弹出投屏程序,或者运行投屏器存储盘符下的投屏程序\n根据提示操作一键投屏\n超大型会议室(总部124、126、401、404、405、409)\n超大会议室设备使用,请通过“一站式运维平台-IT支持服务-员工服务入口-活动与会议技术支持”提前一天预约现场技术支持"}, {"title": "会议室电视机无法开启", "content": "1. 近距离使用遥控器重试。\n2. 检查电视机背面或侧面电源键。\n确认电源连接正常。"}, {"title": "会议室HDMI连接线或转接头缺失", "content": "请转人工联系“IT”服务号"}, {"title": "会议室电视机无法投屏", "content": "1. 重新插拔投屏线。\n用遥控器切换电视信号源。"}]}, {"name": "网络电话", "items": [{"title": "网络电话机故障", "content": "拔插电源线,等待3分钟后重插,启动后重试(重启约需1分钟)。"}]}, {"name": "碎纸机", "items": [{"title": "碎纸机使用方法", "content": "确认碎纸机已通电并处于待机状态,电源指示灯正常亮起。\n将待销毁的纸质文件整齐放入进纸口,避免折叠或过厚。\n按下“运行”按钮,碎纸机将自动开始工作,直至完成处理。\n文件粉碎完成后,机器会自动停止。"}, {"title": "碎纸机异常无反应", "content": "依次检查电源插头、碎纸箱是否扣紧"}, {"title": "碎纸机卡纸处理", "content": "单次碎纸上限一般8张普通复印纸,取出卡纸后,插拔电源重新启动"}]}]}, {"name": "网络", "subs": [{"name": "有线无线", "items": [{"title": "iPad如何连接总部办公WiFi网络", "content": "不支持员工认证方式。短期用访客码申请;长期需提交工单“终端设备网络准入申请”加白处理。\nhttp://devops.dc.servyou-it.com/dashboard,服务台-服务目录-IT支持服务-员工服务入口-终端设备网络准入申请"}, {"title": "员工手机怎么连接公司内网?", "content": "打开手机搜索无线网络\n发现并连接servyou网络后,浏览器输入http://www.baidu.com等网址\n耐心等待30秒左右,触发弹出账号密码认证界面,依次输入员工账号密码和动态短信验证码登录,确保认证页面自动弹出,不要手动输入网址。\n注:\n新入职员工,请确认账号信息是否已同步,建议入职次日再尝试连接。\n苹果手机请使用QQ浏览器打开认证页面,避免使用Safari。如使用Safari,可尝试点击“显示详细信息”后访问。"}, {"title": "手机连接公司网络提示“未获取到手机号,请与管理员联系”", "content": "新员工入职当天账号信息未完全同步,需第二天才可正常使用"}, {"title": "访客在公司总部如何联网", "content": "申请访客码:\n1. 临时访客设备连接servyou网络,浏览器弹出认证界面后点击“申请访客码”(有效期24小时)。\n2. 拜访对象邮箱收到邮件,点击允许接入。\n3. 手机接收访客码并登录。"}, {"title": "电脑端税友安全助手登录异常“**认证失败,网络已断开”", "content": "原因:账号密码输入错误、密码过期或税友安全助手安装后未重启电脑。\n解决:\n1. 重置密码: http://192.168.9.87:8080/employee-center/resetPwd.jsp\n2. 助手界面点击“注销”,手动重输密码。若无效则需重启电脑。"}, {"title": "手机连公司内网异常“账号/密码情误或认证被拒绝!请再次确认验证码,或者重置密码”", "content": "确保认证界面自动弹出,勿手动输入网址。建议使用QQ浏览器,Safari可尝试“显示详细信息”后访问。"}, {"title": "员工办公电脑总部连接办公网络", "content": "步骤:\n1. 连接SERVYOU无线或有线网络。\n2. 访问192.168.1.53下载安装税友安全助手。\n3. 重启电脑后登录助手(账号为邮箱前缀,密码同邮箱)。"}, {"title": "互联网部分网页无法访问【Windows】", "content": "使用办公网络时,部分网页无法访问,可能因代理服务器设置异常导致。\n解决办法:\n1.检查DNS设置\n右键点击Windows 图标--“网络连接”-打开“更改适配器选项”--选择“以太网”或者“WLAN”-右键“属性”--选择“Internet协议版本 4TCP/IP4)”-点击“属性”-选择“使用下面的DNS服务器地址”-首选DNS服务器和备用DNS服务器---输入“10.253.0.55”(公司内网专用的 DNS)和“223.5.5.5”(阿里云公共 DNS)—单击“确定”。\n2.检查代理设置\n以 Edge浏览器为例“菜单>设置>显示高级设置>更改代理设置> LAN 设置 并取消选中”为 LAN 使用代理服务器“复选框。\n办公网络异常修复"}, {"title": "互联网部分网页无法访问【Mac】", "content": "使用办公网络时,部分网页无法访问,可能因代理服务器设置异常导致。\n报错信息:\n代理服务器出现问题,或者地址有误。\n解决办法:\n1.检查DNS设置\n单击菜单栏右上角的“ Apple”图标,-选择“系统偏好设置”-选择“网络”,点击连接的网络(比如Wi-Fi)--------选择“高级”,在弹出的选框中点击“DNS”选项卡,然后点击左下角【+】图标,手动添加DNS地址。如:10.253.0.55(公司内网专用的 DNS)和223.5.5.5(阿里云公共 DNS)。\n2.取消所有代理协议勾选\n单击菜单栏右上角的“ Apple”图标,-------选择“系统偏好设置”----------选择“网络”,点击连接的网络,比如是Wi-Fi--------选择“高级”,在弹出的选框中点击“DNS”选项卡,取消所有协议前的勾选项”总部办公互联网出口IP地址\n电信:115.227.36.10;联通:180.178.252.186。更新信息见税友家园公告。"}]}, {"name": "零信任", "items": [{"title": "SSL VPN升级零信任 aTrust通知", "content": "自2026年3月19日起,因SSL VPN设备架构调整,为保障协议兼容性、性能与稳定性,SSL VPN更新升级为零信任 aTrust,请各位同事在更新升级后使用。"}, {"title": "SSLVPN与零信任区别", "content": "SSL VPN是深信服传统的远程访问解决方案,EasyConnect是其客户端名称;而零信任是一种更先进的安全理念,aTrust则是深信服基于此理念推出的、用于替代和升级SSL VPN的具体产品。"}, {"title": "Windows操作系统SSLVPN客户端EasyConnect自动升级零信任aTrust指引", "content": "步骤1:打开原 SSLVPN客户端easeconnect,并输入https://vpn.servyou.com.cn,点击“连接”\n步骤2:客户端登录,提示版本更新,点击“立即更新”\n步骤3:等待客户端自动完成更新和安装,完成客户端自动打开新的客户端\n步骤4:通过新的客户端sTrust,接入设置输入:https://vpn.servyou.com.cn,点击“确定接入”,然后输入账号密码登录"}, {"title": "Mac os操作系统SSLVPN客户端自动升级零信任aTrust指引", "content": "Macy原客户端easeconnect首次登录后,会提示版本不匹配,需要下载新版本,下载后双击客户端安装文件完成安装即可。\n步骤1:客户端输入https://vpn.servyou.com.cn,会提示版本不匹配,点击“下载更新”\n步骤2:跳转的页面点击“立即下载”\n步骤3:双击已下载的客户端安装文件,根据提示完成安装\n步骤4:客户端安装完成后,新老客户端会同时存在,打开“atrust”客户端,并输入https://vpn.servyou.com.cn登录"}, {"title": "atrust客户端无法建立连接?", "content": "请按以下步骤排查:\n退出客户端重新登录\n重启电脑后再次尝试\n检查本地网络是否正常\n确认未连接其他VPN软件"}, {"title": "atrust客户端登录成功后但无法访问内部系统怎么办?", "content": "可能原因包括:\n本地缓存未刷新\nDNS缓存未更新\n权限问题\n建议:\n断开连接后重新登录\n执行DNS刷新(Windowsipconfig /flushdns"}, {"title": "零信任aTrust客户端下载地址", "content": "Windows客户端下载:\nhttps://atrustcdn.sangfor.com/standard/windows/2.5.16.20/aTrustInstaller.exe\nMac客户端下载:\nhttps://atrustcdn.sangfor.com/standard/mac/2.5.16.20/aTrustInstaller.pkg\n安卓、苹果手机移动客户端下载:\n应用商店搜索“aTrust”app"}, {"title": "零信任访问非公共资源权限申请", "content": "申请路径:打开一张式运维平台-服务目录-IT支持服务-员工零信任账号申请,类型选“权限申请”,根据资源类型选择测试资源或其他资源,其他咨询填写网址/IP/端口。\n申请地址:http://devops.dc.servyou-it.com/ITSM/workflow/service/createTicket?name=%E5%91%98%E5%B7%A5%E9%9B%B6%E4%BF%A1%E4%BB%BB%EF%BC%88%E5%8E%9FVPN%EF%BC%89%E8%B4%A6%E5%8F%B7%E7%94%B3%E8%AF%B7"}, {"title": "零信任aTrust客户端登录提示“用户名或密码错误,您还有 次尝试的机会”", "content": "原因一:没有申请过零信任账户,账户不存在\n申请方式:登录移动端企业微信,企业微信→工作台→一站式运维平台→服务目录→IT支持服务→员工零信任账号申请。\n原因二:密码输入错误、忘记密码或者申请账号后首次登录\n解决办法:需登录页https://vpn.servyou.com.cn点击“忘记密码”,用户名使用邮箱前缀,根据提示重置密码\n原因三:用户名输入错误或填写了员工账户中心密码\n解决办法:零信任账号与员工账户中心账号使用不同身份认证体系,如:aTrust用户名与虽然税友家园、邮箱前缀相同,但深信服aTrust采用独立密码管理规则,重置过程也与统一员工账号密码不同步"}, {"title": "零信任(原VPN)登录异常“账号禁用”", "content": "360天未登录使用aTrust会导致账号被禁用,登录运维平台-员工零信任账号申请-申请类型“账号解禁\"\nhttp://devops.dc.servyou-it.com/ITSM/workflow/service/createTicket?name=%E5%91%98%E5%B7%A5%E9%9B%B6%E4%BF%A1%E4%BB%BB%EF%BC%88%E5%8E%9FVPN%EF%BC%89%E8%B4%A6%E5%8F%B7%E7%94%B3%E8%AF%B7"}, {"title": "零信任密码重置“用户信息匹配失败,请联系管理员,...”", "content": "申请开通账号(零信任账号并非入职默认开通,如有办公需求,需登录移动端企业微信,企业微信→工作台→一站式运维平台→服务目录→IT支持服务→员工零信任账号申请。)\n检查手机号码填写正确,已更换手机号,请提交员工零信任账号申请,备注填写更换的新手机号)\n检查用户名是否正确,用户名为邮箱前缀,且字母均为小写"}, {"title": "零信任登录异常”账号锁定“", "content": "密码输入错误3次后系统锁定账户,不进行任何操作10分钟自动解锁。等待期间勿操作以免重置锁定计时。"}, {"title": "零信任员工账号申请", "content": "员工可以因出差、居家办公等情况单独申请零信任员工账号。\n办公内网申请方式: 一站式运维平台→服务目录→IT支持服务→员工零信任账号申请(http://devops.dc.servyou-it.com\n公司外部申请方式:登录移动端企业微信,企业微信→工作台→一站式运维平台→服务目录→IT支持服务→员工零信任账号申请。\n处理同事将会在工作时间1小时内接单,并在当天下班前处理完成,请耐心等待,处理进度请关注“一站式运维平台”企微应用消息提醒。"}, {"title": "零信任无法收到验证短信", "content": "检查短信应用下所有信息目录,查看是否被垃圾信息、推广信息过滤\n重启手机。\n3. 机主发送短信“11111”至10690999申请解除黑名单。"}, {"title": "零信任验证手机号码更改", "content": "通过一站式运维平台提交“员工零信任账号申请”工单,备注新旧手机号。手机端路径:企业微信→工作台→一站式运维平台。"}, {"title": "零信任登录提示异常“网络请求异常,请稍后重试”", "content": "原因和解决办法:\n一般是网络波动导致,切换自己手机热点测试使用。"}, {"title": "零信任登录提示异常“路由连接失败”", "content": "原因:网络冲突或DNS缓存。\n解决:\n使用外部网络(如手机热点)测试。\nMac:网络设置中添加DNS 10.253.0.55和223.5.5.5。"}, {"title": "零信任登录提示异常“选路连接失败,可能当前连接网络异常,请稍后重试”", "content": "服务器地址栏需要完整输入 https://vpn.servyou.com.cn,不能省略https://,也不能填写为http://vpn.servyou.com.cn\n因安全和网络原因限制,集团总部(杭州)办公网络禁止连接零信任\n部分税局、酒店或其他无线网络波动或限制,\n解决方法:可尝试重启电脑后,使用手机热点连接网络,重新登录零信任"}, {"title": "零信任aTrust客户端支持桌面操作系统清单", "content": "【Windows系统】\nWindows 7~11\n【Mac os】\nMacOS10.13~10.15Mac11.x~Mac OS 14.x\n【Linux/国产系统】\nUOSV20 For X86、ARM、MIPS、Loongarch\n麒麟(V10/V10 SP1For X86、ARM、MIPS\n麒麟(V10 SP1For Loongarch\nUbuntu 16、18、20、22、24 For X86\n中科方德(5.0-G220/5.0-G220H For X86、ARM、Loongarch\n注意:\n已发布版本中,windows11 arm架构的电脑不支持使用工作空间,同时不支持麒麟server系统、中标麒麟系统、deepin系统、centos系统接入。"}]}]}, {"name": "安全", "subs": [{"name": "税友安全助手", "items": [{"title": "税友安全助手卸载操作", "content": "卸载税友安全助手后将无法正常在杭州总部进行网络访问,请确认税友安全助手卸载原因,如:电脑更换、离职、离开杭州总部工作\n2.通过以下方式获取卸载动态码\nwindows系统:下载IT提供卸载助手脚本 https://drive.weixin.qq.com/s?k=AAoA1wcYAAch0J2Cxe,直接双击运行后生成动态码,回复生成的动态码,填入桌面IT支持回复的卸载码进行卸载\nmac os系统:右键右上角的安全助手图标,点击卸载,随后提供动态码,\n3.将生成的动态码,通过智能IT助手 人工服务,提供生成的动态码,获取回复的卸载码进行卸载"}, {"title": "Window系统下载安装“税友安全助手”", "content": "步骤:\n连接servyou网络,访问http://192.168.1.53 ,员工电脑通道-点击提示链接,下载安装“税友安装助手”。\n2. 安装后重启电脑,在任务栏右下角打开助手登录。\n税友安全助手下载链接 http://192.168.1.53:8099/portal/redirect/nacc/"}, {"title": "MAC OS系统下载安装“税友安全助手", "content": "步骤:\n1. 连接servyou网络,访问http://192.168.1.53/portal/redirect/nacc/下载。\n2. 根据系统版本选择安装项(如MAC OS 14以上选70133)。\n3. 运行安装程序,按系统提示授权(点击“是”/“仍要打开”)。\n4. 输入开机密码(盲输),完成安装后重启电脑。"}, {"title": "税友安全助手打开方式和查看运行状态图标", "content": "Windows系统:右下角任务栏图标;Mac:右上角菜单栏图标。"}, {"title": "Mac OS系统安装税友助手报错“身份不明的开发者”", "content": "解决:\n1. 系统偏好设置→安全性与隐私→允许安装。\n2. 输入开机密码(盲输),完成安装后重启。"}]}, {"name": "火绒安全", "items": [{"title": "火绒安全终端下载安装", "content": "火绒安全是公司指定使用的杀毒软件,请根据情况选择安装版本:\n总部员工:请选择火绒终端安全企业版,下载地址:\nWindows系统: http://huorong.oa.servyou-it.com/deploy/installer.exe\nMacOS系统: http://huorong.oa.servyou-it.com/deploy/mac-inst.dmg\n安装过程中控制中心地址设置: http://huorong.oa.servyou-it.com:80\n区域员工:请选择火绒安全软件个人版\nWindows系统 https://www.huorong.cn/person5.html"}, {"title": "火绒安全如何卸载", "content": "火绒安全卸载:向IT支持人工说明卸载原因获取输入卸载码,打开Windows系统控制面板-程序和功能,选择火绒终端安全管理系统安全终端-右键卸载,输入获取的卸载码"}, {"title": "火绒安全如何退出", "content": "向IT支持人工说明退出原因获取卸载密码(火绒安全管理员密码),屏幕右下角火绒图标,点击“退出火绒”"}]}, {"name": "员工账户中心", "items": [{"title": "员工账户密码重置和修改", "content": "步骤:\n1. 访问http://192.168.9.87:8080/employee-center/resetPwd.jsp重置,密码需10位以上含大小写字母、数字、符号中的三种。\n2. 同步修改本地客户端(如总部刷卡打印机客户端、税友安全助手)密码。\n3.如不确认原密码或者原密码忘记,重置方式请选择“短信验证码重置”\n注意事项\n-员工账户密码有效期为90天,密码到期前3天会通过消息进行提醒,到期后未更新将重置为随机密码,需通过短信验证码重置方式找回\n-已经无法联网情况,可以借用同事电脑或者通过手机热点连接零信任后执行密码修改操作\n-使用独立密码的零信任和邮件客户端,无需修改重置"}]}, {"name": "风险应对", "items": [{"title": "终端安全风险预警", "content": "如果您遇到网络诈骗、网络攻击、恶意病毒、钓鱼邮件、账号被盗、信息泄露等安全问题,或已点击链接,请立即点击链接向“信息安全支持”进行反馈.https://work.weixin.qq.com/nl/innerkfid/ikfCtcYBwAAtkP_ODMcv53bGE5x5M9YYw"}, {"title": "重大安全活动相关信息和管理要求", "content": "活动期间禁用社交软件,公共服务策略调整详见公告链接。\n活动时间以税友家园通知为准,或咨询“信息安全支持”服务号"}, {"title": "重大安全活动期间软件限制“微信无法登录“", "content": "本答案适用于重大安全活动期间,当前时期可能不适用,活动期间范围请关注税友家园公告\n活动期间禁止使用微信/QQ/脉脉等,需通过工单申请特殊权限。\n申请路径:一站式运维平台→集团内部服务→其他服务→办公及远程接入网络安全策略申请。https://devops.dc.servyou-it.com/itsm/service/workbench\n=gf4ljb\n如有疑问请联系企业微信“员工服务-信息安全支持”"}, {"title": "远程控制软件使用限制与特殊申请(向日葵、Todesk、Teamivew、Teamview", "content": "根据 2023年第【13】号《税友集团信息安全管理制度》第二十二条,2.2.7. 远程办公中规定,禁用使用远程工具(包括不限于向日葵)访问个人办公电脑。即不得使用远程工具用于员工远程办公用途。特殊情况需通过工单申请:申请路径:一站式运维平台→集团内部服务→其他服务→办公及远程接入网络安全策略申请,如有疑问请企业微信联系“员工服务-信息安全支持”。https://devops.dc.servyou-it.com/ITSM/workflow/service/createTicket?name=%E5%8A%9E%E5%85%AC%E5%8F%8A%E8%BF%9C%E7%A8%8B%E6%8E%A5%E5%85%A5%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E7%AD%96%E7%95%A5%E7%94%B3%E8%AF%B7\n向日葵软件下载地址:https://sunlogin.oray.com/download"}]}]}, {"name": "资产", "subs": [{"name": "硬件资产", "items": [{"title": "个人名下公司资产及资产详细信息查询", "content": "方式一:登录eHR系统,进入“个人信息-个人固定资产”页面,可查询领用设备清单、资产名称、资产编号、规格\n方式二:查看设备固定资产标签,一般在设备底部或侧边,包含资产名称、启用时间、资产编号、型号"}, {"title": "办公电脑升级和汰换流程", "content": "操作步骤:\n1.自行提交“IT资产升级申请”,申请流程路径:企业微信-工作台-审批-IT资产升级申请\n2.审批通过后,总部同事至122室办理;区域同事联系当地资产管理员。\n注意事项:\n升级申请内存、硬盘、显示器,其容量、尺寸和型号需符合《IT资产配置标准》中的岗位要求,特殊超标申请需部门领导审批。\n办公电脑启用时间达到五年,可以申请整机汰换(Mac电脑汰换周期暂定未8年)\n《IT资产配置标准》文档链接:https://oa.servyou-it.com/spa/document/index.jsp?id=3471&router=1#/main/document/detail"}, {"title": "公司领用办公电脑使用或启用年限已满5年,可以申请延期使用吗?", "content": "公司电脑启用年限满5年不是强制汰换要求,可以继续使用,无需办理延期申请."}, {"title": "办公IT资产借用/退还", "content": "可借用设备类型:办公电脑、显示器、小鱼会议终端、会议音箱\n申请审批流程入口:企业微信-审批-资产借用申请\n领取/退还地点:\n总部同事至税友亿企赢大厦122室办理;\n区域同事联系当地资产管理员。"}, {"title": "办公IT资产领用/退还", "content": "可领用设备类型:办公电脑、显示器、键盘、鼠标、网线、话机\n申请审批流程入口:企业微信-审批-资产领用申请\n注:键盘、鼠标、网线、话机等低值易耗品无需提交申请流程\n领取/退还地点:\n总部同事至税友亿企赢大厦122室办理;\n区域同事联系当地资产管理员。"}, {"title": "系统维修工具借用", "content": "借用工具类型:系统安装U盘、螺丝刀、移动硬盘(盒)\n借用流程:\n1.回复“IT”获取桌面IT支持人工支持链接\n2.点击IT支持人工支持链接进入人工坐席咨询窗口\n3.说明需要借用的工具类型、使用地点、使用时间\n4.耐心等待人工支持坐席回复,确认设备库存。\n5.总部员工前往121室进行借用登记,区域同事联系资产管理员"}]}, {"name": "软件资产", "items": [{"title": "公司限制使用的商业软件清单", "content": "正版化严控清单(包括但不限于):\nXshell/Xftp/Xmanager、InterBase、Delphi、MyEclipse、CINEMA4D、Anaconda、Fiddler、Navicat、VMware全系列、UltraEdit、HP Loadrunner、Adobe全系列(如Acrobat、Acrobat Reader、Photoshop、lllustrator、After Effects、Premiere、Lightroom、Audition、InDesign、Adobe XD等)。"}, {"title": "parallelsDesktop软件使用限制与替代方案", "content": "公司实行软件正版化管理,收费软件需经需求评估后安装。\n替代方案:建议使用VirtualBox。\n资源包下载(含Win7/Win10纯净版及VB安装包):\n链接:https://pan.baidu.com/s/1ly-3vDMOh48yRXRo-b-hBg 提取码:serv\n安装指南:在VirtualBox中通过“管理→导入虚拟电脑”直接导入系统。"}, {"title": "visio软件使用限制与替代方案", "content": "公司实行软件正版化管理,收费软件需经需求评估后安装。\n替代方案:\n1. 仅需读取Visio文档:使用Microsoft Visio查看器(https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=51188 )。\n2. 需编辑文档且可接受非vsdx格式:使用ProcessOn在线工具(https://www.processon.com/i/5c99dd75e4b0180f6ee6c615 )。注:敏感信息勿用。\n3. 必须输出vsdx格式(如外部分享):走正式审批流程,路径:企业微信→工作台→审批→商业软件服务申请,费用2040元由部门分摊,需事业部总经理审批。"}, {"title": "微软office软件使用限制与替代方案", "content": "公司推行软件正版化政策,禁止安装盗版软件。安装Microsoft Office需部门分摊费用3070元,申请流程:\n路径:企业微信→工作台→审批→商业软件服务申请。\n审批要求:需事业部总经理批准。\n建议:若无特殊需求,优先安装WPS作为替代方案。"}]}, {"name": "自备电脑", "items": [{"title": "自备电脑申请及审核", "content": "步骤:\n1. 确认岗位在《自备电脑补贴岗位清单》内。\n2. 电脑配置需高于公司标准。\n3. eHR系统→流程申请→自备电脑使用申请/变更,提交购买凭证。\n4. 半工作日内完成配置审核。详情见《自备电脑使用及补贴管理办法》。\n详情请查看《自备电脑使用及补贴管理办法》\nhttps://oa.servyou-it.com/spa/document/index2file.jsp?id=75578&versionId=78041&imagefileId=96908&router=1#/main/document/fileView"}, {"title": "所有在公司使用的自备电脑的都需要登记?不领取补贴但使用自备电脑的员工是否需要登记?", "content": "根据公司管理要求,所有在公司使用的自备电脑的员工,都需要进行自备电脑信息登记"}, {"title": "自备电脑购买二手电脑如何计算购买时间?", "content": "二手按电脑电脑首次销售发票开具时间开始计算,如果无法提供购买发票,则按设备出厂时间计算,也可按官网查询的首次购买,以及设备激活、保修开始时间计算"}, {"title": "自备电脑无法提供销售发票或者发票遗失如何计算购买时间?", "content": "可以使用平台订单、收据、转账记录作为购买凭证时间参考依据(不包含二手电脑二次销售凭证),如果没有购买凭证参考依据,则使用设备出产时间"}, {"title": "自备电脑发票时间、出厂时间、购买记录不一致如何计算?", "content": "补贴发放截止时间采纳的优先次序为 , 发票时间>购买记录>出厂日期"}, {"title": "使用配件自行组装自备电脑如何计算出厂时间", "content": "按整机或主要配件(CPU、主板)任一主要配件购买凭证或出厂日期计算"}, {"title": "自备电脑如何查看通过电脑序列号查询生产日期", "content": "联想 https://pre.wx.lenovo.com.cn/wordpress/?p=1456 https://newsupport.lenovo.com.cn/guardeploySearch.html?fromsource=guanwang&_ga=2.67510865.1168833807.1598233691-1876919846.1595491060\nhttps://newthink.lenovo.com.cn/guarantee.html?v=329b114e91fec9e2336126dfd1b6ff42\nDell https://www.dell.com/support/contents/zh-cn/article/product-support/self-support-knowledgebase/locate-service-tag/notebook https://www.dell.com/support/contractservices/zh-cn/\nHP https://support.hp.com/cn-zh/document/ish_2898769-2609229-16 https://support.hp.com/cn-zh/check-warranty\n微软 https://support.microsoft.com/zh-cn/surface/%E6%9F%A5%E6%89%BE-surface-%E8%AE%BE%E5%A4%87%E5%92%8C%E9%85%8D%E4%BB%B6%E6%88%96microsoft%E9%85%8D%E4%BB%B6%E7%9A%84%E5%BA%8F%E5%88%97%E5%8F%B7-6c0abc0c-2b45-247d-f959-70e504e55fa5 https://mybusinessservice.surface.com/en-US/CheckWarranty/CheckWarrantyhttps://support.microsoft.com/zh-cn/surface/surface-%E4%BF%9D%E4%BF%AE-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94-1217913a-2692-424e-a5c4-0eb0de84f05a\n小米 https://www.mi.com/service/notebook/drivers https://47wke3.smartapps.baidu.com/?_chatQuery=%E5%B0%8F%E7%B1%B3%E6%80%8E%E4%B9%88%E6%9F%A5%E5%87%BA%E5%8E%82%E6%97%A5%E6%9C%9F&searchid=14302220643046412854&_chatParams=%7B%22agent_id%22%3A%22592d7%22%2C%22content_build_id%22%3A%2218852dd5%22%2C%22from%22%3A%22q2c%22%2C%22token%22%3A%22alVvR3EyL3lWVnpwRk02ZFVSUG9GUzhkMkNZTDFwa0IySVJBUS9ORUxob2cyb0pObjdmVDhXQVJteEpqWjVMY2VMVzRoVmtBejBjRWdnNEdTNG5MclVQUGRIc3ZLa1QvMFhSQUdLMmhPRVVveHRQT3AvQUhTSldHTEdqU2NPa0NkUDJVNEU1MEVxK0o2UGg5czJjQ09CWUQzcVh6elRFVGJiNitpNmFvakxzPQ%3D%3D%22%2C%22chat_no_login%22%3Atrue%7D&_swebScene=3711000610001000\n宏基 https://community.acer.com/cn/kb/articles/863-%E5%BA%8F%E5%88%97%E5%8F%B7%E6%88%96snid%E5%8F%B7 https://www.acer.com.cn/myhelp.html?type=3&serverid=143\n华为 https://consumer.huawei.com/cn/support/content/zh-cn00688529/ https://consumer.huawei.com/cn/support/warranty-query/\n华硕 https://www.asus.com.cn/support/article/566/ https://www.asus.com.cn/support/warranty-status-inquiry/\n神州 机器底部有一个lOT http://www.hasee.com/after/index\n苹果\nhttps://support.apple.com/zh-cn/102767 https://checkcoverage.apple.com/user-consent"}, {"title": "自备电脑补贴岗位是如何设定的?", "content": "自备电脑补贴岗位范围,是针对对电脑性能有较高性能需求技术岗位,以及部分特殊需求岗位;对于这部分性能要求较高的开发和测试岗位,一方面我们提高了这些岗位公司配发电脑标准,同时保留了自备电脑补充策略供员工自由选择"}, {"title": "自备电脑管理办法提到较高性能的技术岗位是如何确定的?", "content": "根据总部历年员工满意度调查中员工反馈,以及IT资产配置标准评估过程中电脑内存CPU报警统计信息,开发和测试岗位所使用电脑的CPU和内存报警次数和时长远高于其他岗位(80%内存CPU报警阈值),开发和测试类岗位与其他岗位相比,对电脑性能有明显较高要求。"}, {"title": "自备电脑补贴岗位以后还会有新增或变更吗?", "content": "参考《IT资产配置标准》中岗位与设备变更和执行反馈意见,由管理部门共同商议修订,并在EHR系统同步更新。"}, {"title": "自备电脑配置是否符合IT资产配置标准如何判断?", "content": "自备电脑配置审核标准要求,主要看配置是否达到购买日期或补贴发放历史年度IT资产配置标准\n●当前自备电脑配置需满足任职岗位的当前公司配发电脑配置最低标准\n●CPU主要看是否同级&同代(i3\\i5\\i7\\i9)同代(八代、十代、11代、12代...),跨级跨带可酌情增加和降低审核标准(每相差1年一代按1年累积计算)。\n●内存和硬盘不符情况下,可提供升级后的配置信息截图或升级配件购买记录"}, {"title": "\"自备电脑补贴到期截止时间是怎么计算的?", "content": "●6/10前所有现有领取补贴员工需进行登记,不登记电脑信息,不发放补贴\n●当前使用自备电脑购买日期<5年,补贴领取截止时间为当前使用电脑从购买之日起5年\n●当前使用自备电脑购买日期>5年,停止补贴发放\n●非补贴岗位6/3日期后购买的电脑不享受存量自备电脑补贴政策"}, {"title": "自备电脑补贴年限规定?", "content": "单台自备电脑电脑补贴有效期为由购买日期计算至5年截止。"}, {"title": "自备电脑补贴岗位内的人员,后续电脑更换了需要怎么操作", "content": "单台自备电脑补贴期限最多为5年,到期后自动停发补贴。若要继续申请补贴,新购或更换设备后,须在5个工作日内在EHR系统重新提交“自备电脑使用申请”,并提供购买凭证(发票、收据)或出厂日期证明。"}, {"title": "\"自备电脑电脑补贴岗位外的补贴时间是到什么时候结束?", "content": "自备电脑补贴岗位外正在享受补贴的员工,继续享受补贴至当前使用自备电脑补贴有效期截止;"}, {"title": "自备补贴到期了,不想用公司配发电脑,可以继续使用自备电脑吗?", "content": "可以继续使用自备电脑,但无法领取补贴,需遵守自备电脑管理要求,进行自备电脑登记,纳入自备电脑台账管理。登录eHR系统- 流程申请-自备电脑使用申请进行登记。"}, {"title": "\"入职、离职、调岗,自备电脑与公司电脑直接切换当月,自备电脑使用不足1月,补贴金额怎么计算", "content": "自然月内累计使用自备电脑办公≥15天,按100元/月标准随工资发放补贴。"}, {"title": "自备电脑补贴到期后,如何申请公司电脑?", "content": "自备电脑申请路径:EHR系统个人信息-个人固定资产查看中-进行报备。"}, {"title": "实习生可以申请自备电脑补贴吗?", "content": "实习生不在自备电脑补贴范围内"}, {"title": "\"自备电脑如果使用的MAC电脑或者AMD 或非intel CPU应该如何评估?", "content": "与同类intel芯片做比较,在20%性能差异范围内,可使用通用查询工具AI或CPU天梯图查询相关性能对比信息,酌情综合评估是否满足岗位工作需要。"}, {"title": "\"购买的自备电脑原始配置没有达到岗位要求,后续通过升级后达到配置要求,可以获得补贴吗?", "content": "通过后续升级后达到岗位IT资产配置标准符合补贴资格条件,硬盘容量可以通过外置连接方式升级,但内置硬盘应为固态硬盘,且固态硬盘容量不低于256GB。"}]}]}, {"name": "其他", "subs": [{"name": "活动支持", "items": [{"title": "会议室预定", "content": "总部会议室:企业微信→工作台→“会议室预定”应用。\n区域会议室(北京/石家庄等):企业微信→工作台→“会议室”应用。"}, {"title": "活动与会议技术支持预约", "content": "提交预约工单(需至少提前1天):https://oa.servyou-it.com/spa/portal/static/index.html#/main/portal/portal-8-34 ,选择“重要活动支持预约”。"}]}, {"name": "党工", "items": [{"title": "税友家园", "content": "税友家园网址: https://oa.servyou-it.com\n账号密码认证方式:统一员工账号密码\n税友家园登录异常\n情况一:新员工入职次日方可登录,请耐心等待。\n情况二:账号密码错误,通过重置密码解决(http://192.168.9.87:8080/employee-center/resetPwd.jsp)。"}, {"title": "官网地址", "content": "税友集团官网地址:https://www.servyou.com.cn\n亿企赢官网地址:https://www.17win.com\n亿企鑫福官网地址:https://17xinfu.com"}]}, {"name": "人力资源", "items": [{"title": "人力相关问题咨询(考勤、薪资、保险等)", "content": "通过企业微信→员工服务→“人力资源共享服务咨询”联系人力资源部门。https://work.weixin.qq.com/nl/innerkfid/ikfCtcYBwAAvSRL5i5b_Xia8vCmFc2gRw"}, {"title": "人力资源管理平台", "content": "人力资源管理平台别名:税友eHR、EHR\n网站地址: https://ehr.dc.servyou-it.com\n应用路径:企业微信-工作台-税友eHR\n账号密码认证方式:统一员工账号密码,账号同企业邮箱的前缀"}, {"title": "员工个人手机号更改", "content": "联系HR在EHR系统中修改。通过企业微信→员工服务→“人力资源共享服务咨询”联系人力资源部门。https://work.weixin.qq.com/nl/innerkfid/ikfCtcYBwAAvSRL5i5b_Xia8vCmFc2gRw"}, {"title": "网络学院相关信息", "content": "企业微信入口(推荐方式): 企业微信-工作台-网络学院\n电脑端访问:https://servyoulearning.yunxuetang.cn\n手机端链接:https://servyoulearning.yunxuetang.cn/m\n新入职当日13:00后生成账号,若无法登录请次日重试。\n实习生无网络学院账号,会定期禁用,转正后可以进入学习。 如有网络学院相关疑问可咨询刘馨月。"}, {"title": "新员工入职IT指引手册获取", "content": "新员工入职IT指引手册/指南地址:https://doc.weixin.qq.com/doc/w3_AU8AjwZhAIgyNSkHK3OTjWueJe1oa?scode=AAoA1wcYAAcD09JltaAQgAuAYMANY"}]}, {"name": "财务", "items": [{"title": "财务工作相关问题", "content": "请联系财务中心或企业微信→员工服务→“总部报销服务台”。\n常见问题参考:\n财务软件安装:参考《财务人员工作环境安装指南》。\n差旅报销:通过企业微信→通讯录→员工服务→“总部报销服务台”咨询。\n金蝶EAS打印中断:重启软件或电脑后重试。\n金蝶安装:方式一:访问 http://10.90.5.92/down/kingdee.exe或http://192.168.2.67:6888/eassso/login ,点击帮助按钮获取安装包。使用问题咨询宋会讲。"}, {"title": "财务共享平台地址", "content": "财务共享平台,旧地址192.168.9.215已下线,可以访问新域名:http://cwgx.oa.servyou-it.com/"}, {"title": "手机企微无法访问“总部差旅报销”", "content": "问题现象:打开后报错“Whitelabel Error Page...Status=403”。\n解决步骤:\n1. 清理缓存:企业微信APP→头像→设置→通用→存储空间→清理缓存。\n退出并重新登录企业微信。"}, {"title": "手机企微滴滴打车权限开通/管理", "content": "企微联系应用管理员:刘红霞"}]}, {"name": "物业", "items": [{"title": "物业服务相关问题(工牌、门禁、停车等)", "content": "联系人指引:\n咖啡馆/食堂超市:于闻婧\n停车/保洁:谭欣\n补卡/餐卡:陈乐\n三楼食堂包厢:王蕊\n会议接待:袁丽丽\n其他问题:咨询物业服务号。https://work.weixin.qq.com/nl/innerkfid/ikfCtcYBwAAUtkMyOToCZqe42ZBDupVEQ"}]}, {"name": "运维", "items": [{"title": "一站式运维平台综合信息", "content": "登录地址: http://devops.dc.servyou-it.com\n一站式运维平台使用统一员工账号密码+短信认证\n运维平台相关问题请咨询企业微信联系【员工服务号:工单系统技术支持】如:运维平台无法登录\n运维平台账号密码登录二次认证密码获取方法详见:运维平台登录说明https://doc.weixin.qq.com/doc/w3_AM4AvwYHAKkhd6GOfh1SAe8ID9Kbv?scode=AAoA1wcYAAcl8IQiqyAM4AvwYHAKk&qt_source=Search&qt_report_identifier=1764050011765&version=5.0.2.6008&platform=win\n维平台企微认证免扫描失效处理:\nchrome浏览器输入网址chrome://flags/#block-insecure-private-network-requests,搜索 Local Network Access Checks,改成Disabled\nedge浏览器输入网址edge://flags/#block-insecure-private-network-requests"}, {"title": "JumpServer堡垒机综合信息", "content": "堡垒机访问权限申请:通过一站式运维系统提交申请,紧急情况联系工单处理人。\nhttp://devops.dc.servyou-it.com/itsm/service/workbench"}, {"title": "GitLab相关问题", "content": "1. 账号锁定:5分钟后自动解锁;若忘记密码,请通过“员工账号密码重置”功能操作。\n2. 二次验证码手机更换:联系吴云鹏修改。\n3. 系统后台问题:联系吴云鹏处理。"}, {"title": "阿里云综合信息", "content": "1.阿里云账号问题咨询:方笑\n2.阿里云账号验证mfa:陈伟章"}]}, {"name": "产研", "items": [{"title": "Walle瓦力平台综合信息", "content": "平台介绍:\nwalle 是提供集 接口文档自动生成、接口文档查看、接口调试、接口Mock、接口测试用例、接口调用代码生成、对外提供在线/离线文档 等功能的 自动化、智能化的综合性接口管理平台。可以提升研发接口开发中各阶段的效率与减少协作时的沟通成本,并助力团队制定符合团队的研发流程与规范。适合公司 GB 端及各分公司研发同学使用。\n功能介绍:\n接口生成与使用流程图\n平台账号密码:\n访问 walle 平台, 使用线上的 员工邮箱前缀 、 邮箱密码 登录 (eg: 账号 liaobl 密码:xxxxxx), 可以在 全部项目 页面 查看所有项目, 可以随意查看项目的接口文档,如果需要创建项目或对接口进行调试、Mock、修改等操作,需要找【于程程】或项目负责人 添加权限\n联系支持:\n使用过程有任何问题或者需求的可以直接联系[于程程],如:更换手机、需要获取新的二次认证二维码等\n如需及时了解 walle 平台的更新状态,可加入 【Walle 金牌服务群】,入群请联系[于程程]发送入群邀请"}]}, {"name": "运营", "items": [{"title": "税友内管系统综合信息", "content": "别名:小蚂蚁、小蜜蜂\n客户端不支持苹果操作系统安装运行\n税友内管系统客户端下载地址:https://drive.weixin.qq.com/s?k=AAoA1wcYAAcLEI7DnM\n内管系统咨询支持:倪银飞。"}, {"title": "基础运营平台综合信息", "content": "基础运营平台别名BOSS\n基础运营平台地址:https://boss.dc.servyou-it.com/#/\n账号密码认证方式:统一员工账号密码\n登录提示账号密码错误:\n优先检查账号密码是否过期\n检查电脑右下角系统时间是否准确,若时间存在偏差,请手动同步时间"}, {"title": "快速查数工具综合信息", "content": "快速查数工具别名QQT\n账号密码登录:账号密码与内部统一员工账密一致。\n使用问题咨询:联系公共数据团队:李晓刚(17682348007)、朱文赵(15088664612)。如:若二次认证失败\n报表权限开通:查询广场-选择对应报表操作列“申请”按钮,报表管理员会进行审批。"}]}]}];
</script>
</head>
<body data-theme="light">
<!-- Top bar -->
<div class="theme-toggle-bar">
<div class="bar-left">
<div class="logo-sm">IT</div>
<span class="sys-name">IT智能服务台</span>
<span class="sys-tagline">· 坐席工作台 — AI驱动 · 多系统对接 · 一站式处理</span>
</div>
<div class="bar-right">
<div class="theme-switch" onclick="toggleTheme()">
<span class="switch-icon">☀️</span>
<div class="switch-track"><div class="switch-thumb"></div></div>
<span class="switch-icon">🌙</span>
</div>
<div class="bar-user-info">
<span>坐席: 陈思远</span>
<div class="bar-user-avatar"></div>
</div>
</div>
</div>
<div class="workspace">
<!-- ===== LEFT: Conversation List + 待办事项 ===== -->
<div class="sidebar-left">
<div class="conv-search">
<div class="conv-search-input-wrap">
<span class="conv-search-icon">🔍</span>
<input class="conv-search-input" placeholder="搜索用户、关键词..." />
</div>
<div class="conv-search-tabs">
<span class="conv-search-tab active">全部</span>
<span class="conv-search-tab">待处理</span>
<span class="conv-search-tab">进行中</span>
<span class="conv-search-tab">已完成</span>
</div>
</div>
<div class="conv-sections">
<!-- My conversations -->
<div class="conv-section-body" style="max-height:500px;">
<!-- 张伟 — 有新消息(紧急红色圆点)+ 处理对象缩略头像 -->
<div class="conv-item active">
<div class="conv-avatar-wrap">
<div class="conv-avatar av-blue"></div>
<span class="new-msg-dot dot-urgent" title="有新消息"></span>
</div>
<div class="conv-content">
<div class="conv-top">
<span class="conv-name-row">
<span class="conv-name">张伟</span>
<span class="priority-icons">
<span class="pi-icon pi-blocked" title="⛔ 问题阻断性:无法工作"></span>
<span class="pi-icon pi-impact high" title="📊 影响范围:12人">👥12</span>
<span class="pi-icon pi-role" title="👑 角色等级:核心研发">👑</span>
<span class="pi-icon pi-repeat" title="🔁 7天内重复3次">🔁</span>
</span>
</span>
<span class="conv-time">10:25</span>
</div>
<div class="conv-preview">VPN 连接失败,无法访问内网系统...</div>
</div>
<span class="conv-waiting">待回复</span>
<div class="conv-target-avatar ta-blue" title="张伟"></div>
</div>
<!-- 陈芳 — 有新消息(普通蓝色圆点)+ 处理对象缩略头像 -->
<div class="conv-item">
<div class="conv-avatar-wrap">
<div class="conv-avatar av-purple"></div>
<span class="new-msg-dot dot-normal" title="有新消息"></span>
</div>
<div class="conv-content">
<div class="conv-top">
<span class="conv-name-row">
<span class="conv-name">陈芳</span>
<span class="priority-icons">
<span class="pi-icon pi-impact" title="📊 影响范围:3人">👥3</span>
<span class="pi-icon pi-role" title="👑 角色等级:部门经理">👑👑</span>
</span>
</span>
<span class="conv-time">09:42</span>
</div>
<div class="conv-preview">系统卡顿严重影响工作...</div>
</div>
<span class="conv-waiting">待回复</span>
<div class="conv-target-avatar ta-purple" title="陈芳"></div>
</div>
<!-- 李娜 — 无新消息(无圆点)+ 处理对象缩略头像 -->
<div class="conv-item">
<div class="conv-avatar-wrap">
<div class="conv-avatar av-green"></div>
<!-- 无新消息,无圆点 -->
</div>
<div class="conv-content">
<div class="conv-top">
<span class="conv-name-row">
<span class="conv-name">李娜</span>
<span class="priority-icons">
<span class="pi-icon pi-role" title="👤 角色等级:普通员工">👤</span>
</span>
</span>
<span class="conv-time">10:18</span>
</div>
<div class="conv-preview">邮箱签名设置问题</div>
</div>
<div class="conv-target-avatar ta-green" title="李娜"></div>
</div>
</div>
<!-- === 新增:不同状态会话展示 === -->
<!-- 王磊 — 有新消息(紧急红色圆点)+ 举手标签 + 处理对象缩略头像 -->
<div class="conv-item" data-conv="conv-004" style="border-left:2px solid #f59e0b">
<div class="conv-avatar-wrap">
<div class="conv-avatar av-orange"></div>
<span class="new-msg-dot dot-urgent" title="有新消息"></span>
</div>
<div class="conv-content">
<div class="conv-top">
<span class="conv-name-row">
<span class="conv-name">王磊</span>
<span class="conv-tag-warn">需介入</span>
<span class="conv-tag-urgent">举手</span>
<span class="priority-icons">
<span class="pi-icon pi-block" title="🚫 阻断">🚫</span>
<span class="pi-impact">8人</span>
<span class="pi-icon pi-role" title="👤 部门主管">👤</span>
</span>
</span>
<span class="conv-time">10:25</span>
</div>
<div class="conv-preview">税控系统还是登录不上,下午3点前要报税</div>
</div>
<div class="conv-target-avatar ta-orange" title="王磊"></div>
</div>
<!-- 孙丽 — 无新消息(无圆点)+ 处理对象缩略头像 -->
<div class="conv-item" data-conv="conv-005" style="opacity:0.7; border-left:2px solid var(--border)">
<div class="conv-avatar-wrap">
<div class="conv-avatar av-teal"></div>
<!-- 无新消息,无圆点 -->
</div>
<div class="conv-content">
<div class="conv-top">
<span class="conv-name-row">
<span class="conv-name">孙丽</span>
<span class="conv-tag-new"></span>
<span class="priority-icons">
<span class="pi-icon pi-confused" title="😕 困惑">😕</span>
</span>
</span>
<span class="conv-time">10:10</span>
</div>
<div class="conv-preview">合同管理系统看不到审批列表,不知道怎么操作</div>
</div>
<div class="conv-target-avatar ta-teal" title="孙丽"></div>
</div>
<!-- 刘洋 — 有新消息(紧急红色圆点)+ 举手标签 + VIP + 置顶 + 处理对象缩略头像 -->
<div class="conv-item active" data-conv="conv-006" style="border-left:2px solid #ef4444; background:var(--accent-light)">
<div class="conv-avatar-wrap">
<div class="conv-avatar av-red"></div>
<span class="new-msg-dot dot-urgent" title="有新消息"></span>
</div>
<div class="conv-content">
<div class="conv-top">
<span class="conv-name-row">
<span class="conv-pin-badge">📌 置顶</span>
<span class="conv-name">刘洋</span>
<span class="conv-tag-vip">VIP</span>
<span class="conv-tag-urgent">举手</span>
<span class="priority-icons">
<span class="pi-icon pi-block" title="🚫 阻断">🚫</span>
<span class="pi-impact">20人</span>
<span class="pi-icon pi-angry" title="😡 愤怒">😡</span>
<span class="pi-icon pi-repeat" title="🔄 重复">🔄</span>
</span>
</span>
<span class="conv-time">10:27</span>
</div>
<div class="conv-preview">这个问题已经拖了三天了,请尽快解决!</div>
</div>
<div class="conv-target-avatar ta-red" title="刘洋"></div>
</div>
<!-- Colleague sessions (always expanded) -->
<div class="conv-section-body" style="max-height:300px;">
<!-- 赵敏 — 有新消息(普通蓝色圆点)+ 坐席刘明缩略头像 -->
<div class="conv-item">
<div class="conv-avatar-wrap">
<div class="conv-avatar av-pink"></div>
<span class="new-msg-dot dot-normal" title="有新消息"></span>
</div>
<div class="conv-content">
<div class="conv-top">
<span class="conv-name-row">
<span class="conv-name">赵敏</span>
</span>
</div>
<div class="conv-preview">OA 审批流程报错</div>
</div>
<div class="conv-target-avatar ta-blue" title="坐席:刘明"></div>
</div>
<!-- 周芳 — 无新消息(无圆点)+ 坐席缩略头像 -->
<div class="conv-item">
<div class="conv-avatar-wrap">
<div class="conv-avatar av-green"></div>
<!-- 无新消息 -->
</div>
<div class="conv-content">
<div class="conv-top">
<span class="conv-name-row">
<span class="conv-name">周芳</span>
</span>
</div>
<div class="conv-preview">打印机无法连接</div>
</div>
<div class="conv-target-avatar ta-green" title="坐席:王强"></div>
</div>
<!-- 吴明 — 有新消息(低优先灰色圆点)+ 坐席缩略头像 -->
<div class="conv-item">
<div class="conv-avatar-wrap">
<div class="conv-avatar av-orange"></div>
<span class="new-msg-dot dot-muted" title="低优先新消息"></span>
</div>
<div class="conv-content">
<div class="conv-top">
<span class="conv-name-row">
<span class="conv-name">吴明</span>
</span>
</div>
<div class="conv-preview">新电脑开机配置</div>
</div>
<div class="conv-target-avatar ta-purple" title="坐席:李静"></div>
</div>
</div>
<!-- History (always expanded) -->
<div class="conv-section-body" style="max-height:400px;">
<!-- 历史会话 — 无新消息(无圆点),无处理对象缩略头像 -->
<div class="conv-item">
<div class="conv-avatar-wrap">
<div class="conv-avatar av-teal"></div>
<!-- 历史会话,无新消息圆点 -->
</div>
<div class="conv-content">
<div class="conv-top">
<span class="conv-name-row">
<span class="conv-name">周杰</span>
</span>
<span class="conv-time">昨日</span>
</div>
<div class="conv-preview">VPN 证书过期 — 已解决</div>
</div>
</div>
</div>
</div>
<!-- ===== 待办事项 ===== -->
<div class="kanban">
<div class="kanban-title">待办事项 <span class="count">6</span></div>
<div class="kanban-item active" onclick="showTaskDetail('ticket')">
<span class="ki-priority urgent"></span>
<span class="ki-text">CEO办公室 - 投屏设备故障</span>
<span class="ki-type ticket">工单</span>
<span class="ki-time">5m</span>
<div class="ki-avatar ka-red" title="王莉"></div>
</div>
<div class="kanban-item" onclick="showTaskDetail('ticket')">
<span class="ki-priority urgent"></span>
<span class="ki-text">财务部 - 税控系统无法登录</span>
<span class="ki-type ticket">工单</span>
<span class="ki-time">12m</span>
<div class="ki-avatar ka-orange" title="王磊"></div>
</div>
<div class="kanban-item" onclick="showTaskDetail('approval')">
<span class="ki-priority high"></span>
<span class="ki-text">IT采购申请 - 研发部笔记本电脑</span>
<span class="ki-type approval">审批</span>
<span class="ki-time">28m</span>
<div class="ki-avatar ka-blue" title="李研发"></div>
</div>
<div class="kanban-item" onclick="showTaskDetail('device')">
<span class="ki-priority high"></span>
<span class="ki-text">会议室 A - 投影仪离线</span>
<span class="ki-type device">设备</span>
<span class="ki-time">45m</span>
<div class="ki-avatar ka-green" title="行政部"></div>
</div>
<div class="kanban-item" onclick="showTaskDetail('approval')">
<span class="ki-priority normal"></span>
<span class="ki-text">新员工入职 - 设备申领审批</span>
<span class="ki-type approval">审批</span>
<span class="ki-time">32m</span>
<div class="ki-avatar ka-purple" title="HR部">H</div>
</div>
<div class="kanban-item resolved" onclick="showTaskDetail('ticket')">
<span class="ki-priority done"></span>
<span class="ki-text">客服部 - 耳机无声(驱动重装)</span>
<span class="ki-type ticket">工单</span>
<span class="ki-time">1h</span>
<div class="ki-avatar ka-blue" title="客服部"></div>
</div>
<div class="kanban-stats"><span><span class="dot dot-online"></span> 在线 4</span><span><span class="dot dot-busy"></span> 忙碌 2</span><span><span class="dot dot-offline"></span> 离线 1</span></div>
</div>
</div>
<!-- 拖拽手柄:左栏↔中间栏 -->
<div class="resize-handle" id="resizeLeft" title="拖拽调整左栏宽度"></div>
<!-- ===== CENTER: Chat View (default) + Task Detail View ===== -->
<div class="center-column">
<!-- ===== Chat View (default) ===== -->
<div class="chat-view" id="chatView">
<!-- User info bar -->
<div class="user-info-bar" id="userInfoBar" onclick="toggleUserDetail()">
<div class="user-avatar"></div>
<div class="user-name-section">
<span class="user-name">
张伟 · 研发一部 高级工程师
<span class="it-level-badge gold" title="IT技能等级:黄金 — 熟练使用,高级操作需指导">
🥇 黄金
<span class="level-num">Lv.3</span>
</span>
</span>
</div>
<div class="info-chips">
<span class="info-chip emotion">😟 焦虑</span>
<span class="info-chip default">⏱ 8分32秒</span>
<span class="info-chip default">💬 6轮</span>
<span class="info-chip repeat">🔁 重复</span>
<span class="info-chip remark">📝 备注</span>
</div>
<!-- Device status icons -->
<div class="device-status-row">
<!-- OS Type: Windows (online) -->
<div class="dev-icon online" title="Windows 11 · 在线">
<span>🪟</span>
<span class="dev-badge green"></span>
<span class="dev-tooltip">Windows 11 · 在线联网</span>
</div>
<!-- Antivirus: Huorong installed & up-to-date -->
<div class="dev-icon safe" title="火绒 · 已安装 · 病毒库最新">
<span>🛡️</span>
<span class="dev-badge green"></span>
<span class="dev-tooltip">火绒杀毒 · 已安装 · 病毒库最新</span>
</div>
<!-- Adobe: Certified/Licensed -->
<div class="dev-icon certified" title="Adobe · 已授权">
<span style="font-size:11px;font-weight:700;letter-spacing:-0.5px;">Ai</span>
<span class="dev-badge green"></span>
<span class="dev-tooltip">Adobe Illustrator · ✅ 已授权</span>
</div>
<!-- Office: Certified -->
<div class="dev-icon certified" title="Office 365 · 已授权">
<span style="font-size:11px;font-weight:700;">O</span>
<span class="dev-badge green"></span>
<span class="dev-tooltip">Microsoft 365 · ✅ 已授权</span>
</div>
<!-- Patch: Warning - 2 pending -->
<div class="dev-icon warn" title="系统补丁 · 2个待更新">
<span>🔄</span>
<span class="dev-badge yellow"></span>
<span class="dev-tooltip">系统补丁 · ⚠️ 2个待更新</span>
</div>
</div>
<!-- 2026-07-24 优化:接单按钮(用户信息栏右侧操作区) -->
<div style="display:flex;align-items:center;gap:6px;margin-left:auto;">
<!-- 待接单状态 -->
<button class="btn-action primary" style="font-size:12px;padding:4px 10px;" onclick="this.outerHTML='<button class=\'btn-action primary\' disabled style=\'opacity:0.5;cursor:not-allowed;background:#9ca3af;border-color:#9ca3af;font-size:12px;padding:4px 10px;\'>📥 已接单</button>'">📥 接单</button>
<!-- 已接单状态(点击后变为):<button class="btn-action primary" disabled style="opacity:0.5;cursor:not-allowed;background:#9ca3af;border-color:#9ca3af;">📥 已接单</button> -->
<button class="btn-action warning" style="font-size:12px;padding:4px 10px;">📌 置顶</button>
<button class="btn-action default" style="font-size:12px;padding:4px 10px;">📋 代办</button>
<button class="btn-action default" style="font-size:12px;padding:4px 10px;">🔄 转接</button>
</div>
<span class="expand-icon"></span>
</div>
<!-- 2026-07-24 更新:根据线上实际情况,右侧详情栏6个卡片 -->
<div class="user-detail-panel" style="display:grid;grid-template-columns:repeat(3,1fr);gap:12px;padding:12px 16px;">
<!-- 卡片1:情绪状态 -->
<div class="detail-card" style="background:var(--bg-tertiary);border-radius:8px;padding:12px;">
<div class="dc-label" style="font-size:11px;color:var(--text-secondary);margin-bottom:6px;">情绪状态</div>
<div class="dc-value" style="font-size:13px;">😟 担忧</div>
<div style="font-size:11px;color:var(--text-muted);margin-top:4px;">语气急促,连续追问进度</div>
</div>
<!-- 卡片2:会话详情 -->
<div class="detail-card" style="background:var(--bg-tertiary);border-radius:8px;padding:12px;">
<div class="dc-label" style="font-size:11px;color:var(--text-secondary);margin-bottom:6px;">会话详情</div>
<div class="dc-value" style="font-size:13px;">⏱ 等待时长:<strong>8分钟</strong></div>
<div class="dc-value" style="font-size:13px;margin-top:4px;">💬 对话轮次:<strong>6轮</strong></div>
</div>
<!-- 卡片3:问题分析 -->
<div class="detail-card" style="background:var(--bg-tertiary);border-radius:8px;padding:12px;">
<div class="dc-label" style="font-size:11px;color:var(--text-secondary);margin-bottom:6px;">问题分析</div>
<div class="dc-value" style="font-size:13px;">🔁 重复问题</div>
<div style="font-size:11px;color:var(--text-muted);margin-top:4px;">7天内反馈:<strong>3次</strong></div>
</div>
<!-- 卡片4IT技能等级 -->
<div class="detail-card" style="background:var(--bg-tertiary);border-radius:8px;padding:12px;">
<div class="dc-label" style="font-size:11px;color:var(--text-secondary);margin-bottom:6px;">IT技能等级</div>
<div style="display:flex;align-items:center;gap:6px;">
<span class="it-level-badge gold">🥇 黄金 Lv.3</span>
<span style="font-size:12px;font-weight:600;">黄金</span>
</div>
<div style="font-size:11px;color:var(--text-muted);margin-top:4px;">熟悉常见操作,可独立解决一般问题</div>
</div>
<!-- 卡片5:历史工单 -->
<div class="detail-card" style="background:var(--bg-tertiary);border-radius:8px;padding:12px;">
<div class="dc-label" style="font-size:11px;color:var(--text-secondary);margin-bottom:6px;">历史工单</div>
<div style="font-size:13px;">30天内工单:<strong>3次</strong></div>
<div style="font-size:11px;color:var(--text-muted);margin-top:4px;">类型分布:VPN(2次) 邮箱(1次)</div>
</div>
<!-- 卡片6:其他备注 -->
<div class="detail-card" style="background:var(--bg-tertiary);border-radius:8px;padding:12px;">
<div class="dc-label" style="font-size:11px;color:var(--text-secondary);margin-bottom:6px;">其他备注</div>
<div style="font-size:12px;color:var(--text-secondary);">暂无备注</div>
</div>
</div>
<!-- ===== Troubleshoot bar (ALWAYS visible, flowchart collapsible) ===== -->
<div class="troubleshoot-bar" id="tsBar">
<div class="ts-header">
<span class="ts-title">🔧 排查步骤</span>
<div class="ts-path-inline" id="tsPathView">
<span class="path-step done">① 确认版本</span>
<span class="path-arrow-inline"></span>
<span class="path-step done">② 清除缓存</span>
<span class="path-arrow-inline"></span>
<span class="path-step current">③ 远程排查</span>
<span class="path-arrow-inline"></span>
<span class="path-step">④ 升级客户端</span>
<span class="path-arrow-inline"></span>
<span class="path-step">⑤ 回访确认</span>
</div>
<span class="ts-flowchart-toggle" id="tsFlowBtn" onclick="toggleFlowchart()" title="展开全流程图"></span>
</div>
<!-- Full flowchart with decision nodes (collapsed by default) -->
<div class="ts-flowchart" id="tsFlowchart">
<div style="font-size:11px;color:var(--text-muted);margin-bottom:8px;">
🔀 VPN 连接失败 — 完整排查决策树
</div>
<!-- Step 1 -->
<div class="flow-step">
<div class="flow-node done">1</div>
<div class="flow-step-connector"></div>
<div class="flow-content">
<div class="flow-title">确认 VPN 客户端版本</div>
<div class="flow-desc">询问用户使用 AnyConnect 或 SSL VPN,记录版本号</div>
<div class="flow-branch">
<div class="flow-branch-item active">→ AnyConnect 4.10 及以下:进入兼容性问题分支</div>
<div class="flow-branch-item">→ SSL VPN 网页版:进入浏览器兼容分支</div>
<div class="flow-branch-item">→ 其他版本:进入通用排查</div>
</div>
</div>
</div>
<!-- Judge node 1 -->
<div class="flow-step">
<div class="flow-node judge">❓ 判断</div>
<div class="flow-step-connector"></div>
<div class="flow-content">
<div class="flow-title">版本 &lt; 4.14</div>
<div class="flow-desc">AnyConnect 4.10 及更早版本存在已知兼容性问题</div>
<div class="flow-branch">
<div class="flow-branch-item active">是 → 执行步骤②清除缓存,若仍失败直接进入步骤④升级</div>
<div class="flow-branch-item">否 → 进入网络配置排查分支</div>
</div>
</div>
</div>
<!-- Step 2 -->
<div class="flow-step">
<div class="flow-node done">2</div>
<div class="flow-step-connector"></div>
<div class="flow-content">
<div class="flow-title">清除缓存配置文件</div>
<div class="flow-desc">指导用户删除 C:\ProgramData\Cisco\ 下 XML 文件,重启客户端</div>
</div>
</div>
<!-- Judge node 2 -->
<div class="flow-step">
<div class="flow-node judge">❓ 判断</div>
<div class="flow-step-connector"></div>
<div class="flow-content">
<div class="flow-title">清除缓存后能否连接?</div>
<div class="flow-branch">
<div class="flow-branch-item active">能 → 标记为"已解决",进入步骤⑤回访</div>
<div class="flow-branch-item">不能 → 进入步骤③远程排查</div>
</div>
</div>
</div>
<!-- Step 3 -->
<div class="flow-step">
<div class="flow-node current">3</div>
<div class="flow-step-connector"></div>
<div class="flow-content">
<div class="flow-title">远程桌面排查</div>
<div class="flow-desc">通过内网远程桌面连接用户电脑,检查网络适配器、防火墙、hosts 文件</div>
</div>
</div>
<!-- Step 4 -->
<div class="flow-step">
<div class="flow-node">4</div>
<div class="flow-step-connector"></div>
<div class="flow-content">
<div class="flow-title">升级客户端至 4.14</div>
<div class="flow-desc">发送下载链接,指导用户卸载旧版并安装新版,重新配置连接</div>
</div>
</div>
<!-- Step 5 -->
<div class="flow-step">
<div class="flow-node">5</div>
<div class="flow-content">
<div class="flow-title">24H 后回访确认</div>
<div class="flow-desc">创建提醒任务,24小时后通过企业微信确认 VPN 使用正常</div>
</div>
</div>
</div>
</div>
<!-- Chat -->
<div class="chat-messages">
<div class="msg-system">—— 2026年6月6日 10:25 ——</div>
<div class="msg-bubble msg-user">VPN 连接一直失败,提示"无法建立安全连接",重启了好几次都不行,急需访问内网代码仓库…</div>
<div class="msg-bubble msg-agent">张工您好,先帮您排查一下:请问您是使用的 AnyConnect 客户端还是 SSL VPN 网页版?</div>
<div class="msg-bubble msg-user">AnyConnect 客户端,版本是 4.10。刚才又试了一次,还是同样的错误。</div>
<div class="msg-bubble msg-agent">收到。建议您先清除缓存配置:1)退出客户端;2)删除 XML 文件;3)重新连接。如果还不行,可以远程协助。</div>
<div class="msg-bubble msg-user">按你说的试了,还是不行。能远程看下吗?</div>
</div>
<!-- Chat input -->
<div class="chat-input-area" id="chatInputArea">
<div class="input-resize-handle" id="inputResizeHandle" title="拖拽调整输入框高度"></div>
<!-- 快捷工具栏 -->
<div class="chat-toolbar">
<button class="tb-btn" title="表情"><span class="tb-tip">表情</span>😊</button>
<button class="tb-btn" title="图片"><span class="tb-tip">图片</span>🖼</button>
<button class="tb-btn" title="截图"><span class="tb-tip">截图</span></button>
<button class="tb-btn" title="文件"><span class="tb-tip">文件</span>📎</button>
<button class="tb-btn" title="语音"><span class="tb-tip">语音</span>🎤</button>
<div class="tb-sep"></div>
<button class="tb-btn" title="远程协助"><span class="tb-tip">远程协助</span>🖥</button>
<button class="tb-btn" title="快速回复"><span class="tb-tip">快速回复</span></button>
</div>
<div class="chat-input-row">
<div class="chat-input-card">
<textarea class="chat-input" id="chatInput" placeholder="输入回复内容... (Enter 发送,Shift+Enter 换行)" rows="3"></textarea>
<button class="btn-send">发 送</button>
</div>
</div>
</div>
</div>
<!-- ===== Task Detail View (hidden by default) ===== -->
<div class="task-detail-view" id="taskDetailView">
<div class="task-detail-header">
<button class="btn-back" onclick="showChatView()">← 返回会话</button>
<span class="task-title" id="taskDetailTitle">工单详情</span>
<span class="task-type-badge" id="taskTypeBadge">工单</span>
</div>
<div class="task-detail-body" id="taskDetailBody">
<!-- Dynamic content inserted by JS -->
</div>
<div class="task-actions" id="taskActions">
<!-- Dynamic buttons inserted by JS -->
</div>
</div>
</div>
<!-- 拖拽手柄:中间栏↔右栏 -->
<div class="resize-handle" id="resizeRight" title="拖拽调整右栏宽度"></div>
<!-- ===== RIGHT SIDEBAR ===== -->
<div class="sidebar-right">
<!-- AI Recommend -->
<div class="ai-recommend-section">
<div class="ars-title">🤖 AI 智能推荐</div>
<div class="ars-card" onclick="fillInput(this)">
<div class="ars-card-header"><span style="font-size:10px;color:var(--text-secondary);">远程协助方案</span><span class="ars-confidence">92%</span></div>
<div class="ars-card-text">可以远程,请先安装 TeamViewer 或允许内网远程桌面。您的电脑名是什么?</div>
<div class="ars-shortcut-hint"><span class="key-badge">Ctrl</span>+<span class="key-badge">1</span></div>
</div>
<div class="ars-card" onclick="fillInput(this)">
<div class="ars-card-header"><span style="font-size:10px;color:var(--text-secondary);">备用方案</span><span class="ars-confidence">85%</span></div>
<div class="ars-card-text">临时使用 SSL VPN 网页版:https://sslvpn.servyou-it.com 企业微信扫码登录</div>
<div class="ars-shortcut-hint"><span class="key-badge">Ctrl</span>+<span class="key-badge">2</span></div>
</div>
</div>
<!-- Quick Reply — 三层渐进式导航 -->
<div class="quick-reply-section" id="qrSection">
<!-- 搜索栏 -->
<div class="qr-search">
<span class="qr-search-icon">🔍</span>
<input class="qr-search-input" id="qrSearchInput" placeholder="搜索快速回复 / Alt+目录数字" />
</div>
<!-- 面包屑导航 -->
<div class="qr-breadcrumb" id="qrBreadcrumb">
<span class="bc-back hidden" id="qrBackBtn" onclick="qrGoBack()">← 返回上级</span>
<span class="bc-current" id="qrPathLabel">请选择分类</span>
<span class="bc-hint hidden" id="qrPathHint">
<span class="key-badge">Alt</span>+数字切换一级
</span>
</div>
<!-- L1 一级目录:网格 2 列 × 4 行 -->
<div class="qr-l1-grid" id="qrL1Grid"></div>
<!-- L2 二级目录:流式 chip -->
<div class="qr-l2-row hidden" id="qrL2Row"></div>
<!-- L3 回复列表 -->
<div class="qr-l3-list" id="qrL3List">
<div class="qr-l3-empty">
<span class="empty-icon">💬</span>
<span class="empty-hint"><span class="key-badge">Alt</span>+数字 选择一级分类<br>进入后按数字键逐层筛选<br>选中回复后按 <span class="key-badge">Enter</span> 填入输入框</span>
</div>
</div>
<!-- 已选中回复预览条 -->
<div class="qr-selected-bar hidden" id="qrSelectedBar">
<span></span>
<span class="sel-text" id="qrSelectedText"></span>
<span class="sel-hint">Enter 填入</span>
</div>
<!-- 键盘指南 -->
<div class="keyboard-guide" id="qrKeyboardGuide">
<span><span class="key-badge">Alt</span>+<span class="key-badge">1-7</span> 一级分类</span>
<span><span class="key-badge">数字</span> 选子项</span>
<span><span class="key-badge">Enter</span> 填入</span>
<span><span class="key-badge"></span> 返回</span>
</div>
</div>
</div>
</div>
<script>
/* ========== 主题切换 ========== */
function toggleTheme() {
const body = document.body;
body.setAttribute('data-theme', body.getAttribute('data-theme') === 'dark' ? 'light' : 'dark');
}
function toggleUserDetail() {
document.getElementById('userInfoBar').classList.toggle('expanded');
}
function toggleSection(header) {
header.classList.toggle('collapsed');
header.nextElementSibling.classList.toggle('collapsed');
}
/* ===== FLOWCHART TOGGLE ===== */
function toggleFlowchart() {
const bar = document.getElementById('tsBar');
const btn = document.getElementById('tsFlowBtn');
bar.classList.toggle('show-flow');
if (bar.classList.contains('show-flow')) {
btn.textContent = '▼';
btn.title = '收起全流程图';
} else {
btn.textContent = '▶';
btn.title = '展开全流程图';
}
}
function fillInput(el) {
const text = el.textContent.replace(/Ctrl\s*\+\s*\d/g, '').replace(/快速填入|执行操作/g, '').trim();
document.getElementById('chatInput').value = text;
autoResize(document.getElementById('chatInput'));
}
/* 输入框自动高度(最小3行约60px,最大300px */
function autoResize(textarea) {
textarea.style.height = 'auto';
textarea.style.height = Math.max(60, Math.min(textarea.scrollHeight, 300)) + 'px';
}
document.addEventListener('DOMContentLoaded', function() {
var chatInput = document.getElementById('chatInput');
if (chatInput) {
chatInput.addEventListener('input', function() { autoResize(this); });
}
});
/* ========== Task Detail View Logic ========== */
function showTaskDetail(type) {
document.getElementById('chatView').classList.add('hidden');
const detailView = document.getElementById('taskDetailView');
detailView.classList.add('active');
const titleEl = document.getElementById('taskDetailTitle');
const badgeEl = document.getElementById('taskTypeBadge');
const bodyEl = document.getElementById('taskDetailBody');
const actionsEl = document.getElementById('taskActions');
if (type === 'ticket') {
titleEl.textContent = '工单 #20240606001';
badgeEl.textContent = '运维工单';
badgeEl.style.background = 'var(--accent-soft)';
badgeEl.style.color = 'var(--accent)';
badgeEl.style.border = '1px solid var(--accent)';
bodyEl.innerHTML = `
<div class="task-info-card">
<div class="tic-title">📋 工单描述</div>
<div class="tic-row"><span class="tic-label">标题</span><span class="tic-value">CEO办公室 - 投屏设备故障</span></div>
<div class="tic-row"><span class="tic-label">类型</span><span class="tic-value">硬件故障</span></div>
<div class="tic-row"><span class="tic-label">优先级</span><span class="tic-value" style="color:var(--danger);">🔴 紧急</span></div>
<div class="tic-row"><span class="tic-label">上报人</span><span class="tic-value">张总秘书 · 王莉</span></div>
<div class="tic-row"><span class="tic-label">上报时间</span><span class="tic-value">2026-06-06 10:20</span></div>
<div class="tic-desc">CEO 办公室无线投屏设备(型号:Microsoft Wireless Display Adapter v2)无法连接,会议即将开始(10:40),急需处理。已尝试重启设备和更换 HDMI 端口,问题依旧。</div>
</div>
<div class="task-info-card">
<div class="tic-title">📍 处理进度</div>
<div class="tic-row"><span class="tic-label">状态</span><span class="tic-value" style="color:var(--warning);">⏳ 待接单</span></div>
<div class="tic-row"><span class="tic-label">接单人</span><span class="tic-value" style="color:var(--text-muted);">未分配</span></div>
<div class="tic-row"><span class="tic-label">SLA</span><span class="tic-value" style="color:var(--danger);">⏰ 剩余 12 分钟</span></div>
</div>
`;
// 2026-07-24 优化:按钮持续显示,已接单时显示"已接单"(禁用状态)
// 待接单:绿色可点击
// 已接单:灰色禁用
actionsEl.innerHTML = `
<button class="btn-action primary" onclick="this.outerHTML='<button class=\\'btn-action primary\\' disabled style=\\'opacity:0.5;cursor:not-allowed;background:#9ca3af;border-color:#9ca3af;\\'>📥 已接单</button>'">📥 接单</button>
<button class="btn-action warning" onclick="alert('开始处理')">🔧 开始处理</button>
<button class="btn-action success" onclick="alert('工单已结单')">✅ 结单</button>
<button class="btn-action default" onclick="alert('已转派')">🔄 转派</button>
`;
} else if (type === 'approval') {
titleEl.textContent = '审批 #APP-20240606003';
badgeEl.textContent = '审批单';
badgeEl.style.background = 'var(--purple-soft)';
badgeEl.style.color = 'var(--purple)';
badgeEl.style.border = '1px solid var(--purple)';
bodyEl.innerHTML = `
<div class="task-info-card">
<div class="tic-title">📝 审批内容</div>
<div class="tic-row"><span class="tic-label">申请人</span><span class="tic-value">李研发经理 · 研发一部</span></div>
<div class="tic-row"><span class="tic-label">审批类型</span><span class="tic-value">IT设备采购</span></div>
<div class="tic-row"><span class="tic-label">申请时间</span><span class="tic-value">2026-06-05 14:30</span></div>
<div class="tic-row"><span class="tic-label">预算</span><span class="tic-value">¥86,40010台 × ¥8,640</span></div>
<div class="tic-desc">
<strong>采购明细:</strong><br>
• MacBook Pro 14" M3 Pro × 10台<br>
• 预计交付日期:2026-06-20<br>
• 用途:新员工入职配发<br>
• 附件:<a href="#" style="color:var(--accent);">采购清单.xlsx</a>
</div>
</div>
<div class="approval-section">
<div class="as-title">✏️ 审批意见(可选)</div>
<textarea class="approval-textarea" placeholder="输入审批意见..."></textarea>
</div>
`;
actionsEl.innerHTML = `
<button class="btn-action success" onclick="alert('已审批通过')">✅ 审批通过</button>
<button class="btn-action danger" onclick="alert('已拒绝审批')">❌ 拒绝审批</button>
<button class="btn-action default" onclick="alert('已转交')">🔄 转交审批</button>
`;
} else if (type === 'device') {
titleEl.textContent = '设备异常 #DEV-20240606007';
badgeEl.textContent = '设备异常';
badgeEl.style.background = 'var(--orange-soft)';
badgeEl.style.color = 'var(--orange)';
badgeEl.style.border = '1px solid var(--orange)';
bodyEl.innerHTML = `
<div class="task-info-card">
<div class="tic-title">🖥 设备状态</div>
<div class="device-status-grid">
<div class="device-status-item">
<div class="dsi-label">设备名称</div>
<div class="dsi-value">会议室A-投影仪</div>
</div>
<div class="device-status-item">
<div class="dsi-label">设备型号</div>
<!-- === 新增 AI 推荐 === -->
<div class="recommend-item" data-ctrl="Ctrl+3">
<div class="rec-header">
<span class="rec-badge" style="background:#22c55e20;color:#22c55e;">知识库匹配</span>
<span class="rec-confidence">88%</span>
</div>
<div class="rec-content" style="font-size:11px;">邮箱登录异常通常原因:密码过期(90天强制更换)、账号临时锁定、客户端配置错误。请先确认用户是否收到密码过期提醒。</div>
</div>
<div class="recommend-item" data-ctrl="Ctrl+4">
<div class="rec-header">
<span class="rec-badge" style="background:#a855f720;color:#a855f7;">相似案例</span>
<span class="rec-confidence">78%</span>
</div>
<div class="rec-content" style="font-size:11px;">打印驱动重装:设置→蓝牙和其他设备→打印机→删除→访问 print-server 下载最新驱动→重新添加。</div>
</div>
<div class="dsi-value">Epson CB-W42</div>
</div>
<div class="device-status-item">
<div class="dsi-label">在线状态</div>
<div class="dsi-value danger">🔴 离线</div>
</div>
<div class="device-status-item">
<div class="dsi-label">最后在线</div>
<div class="dsi-value">2026-06-06 09:15</div>
</div>
<div class="device-status-item">
<div class="dsi-label">IP 地址</div>
<div class="dsi-value">192.168.10.88</div>
</div>
<div class="device-status-item">
<div class="dsi-label">告警次数</div>
<div class="dsi-value warning">3 次/今日</div>
</div>
</div>
<div class="tic-desc" style="margin-top:8px;">
<strong>异常描述:</strong>设备连续 3 次离线,每次恢复后约 10 分钟再次掉线。可能原因:电源接触不良 / 网络端口故障 / 设备固件异常。
</div>
</div>
<div class="task-info-card">
<div class="tic-title">🔧 处理记录</div>
<div class="tic-row"><span class="tic-label">10:15</span><span class="tic-value">尝试 Ping 设备 — 超时</span></div>
<div class="tic-row"><span class="tic-label">10:20</span><span class="tic-value">检查交换机端口 — 指示灯不亮</span></div>
<div class="tic-row"><span class="tic-label">10:25</span><span class="tic-value" style="color:var(--warning);">⏳ 待现场排查物理连接</span></div>
</div>
`;
actionsEl.innerHTML = `
<button class="btn-action primary" onclick="alert('一键开单')">📝 一键开单</button>
<button class="btn-action warning" onclick="alert('已派工给硬件组')">🚚 派工</button>
<button class="btn-action success" onclick="alert('设备已恢复')">✅ 标记恢复</button>
<button class="btn-action default" onclick="alert('已加入巡检计划')">📅 加入巡检</button>
`;
}
}
function showChatView() {
document.getElementById('chatView').classList.remove('hidden');
document.getElementById('taskDetailView').classList.remove('active');
}
/* ================================================================
快速回复 — 三层渐进式导航系统
数据来源:IT支持知识库 180 条模板(2026-04-24
L1(Alt+数字) → L2(数字) → L3(数字) → Enter 填入
================================================================ */
// 知识库数据从 qr_data.js 加载(IT支持知识库2026-4-24.docx 导出)
// 导航状态
let qrState = {
l1Index: -1, // 当前选中的一级分类索引(-1 = 未选)
l2Index: -1, // 当前选中的二级分类索引(-1 = 未选)
l3Index: -1, // 当前选中的三级回复索引(-1 = 未选)
selectedText: '', // 当前选中的回复文本
};
// 快速回复 L1 主类颜色(与 CSS 变量 --qr-c0 ~ --qr-c6 对应)
const qrColors = ['#3b82f6', '#22c55e', '#f97316', '#8b5cf6', '#ef4444', '#0ea5e9', '#6b7280'];
const qrLightColors = ['#dbeafe', '#dcfce7', '#fff7ed', '#ede9fe', '#fee2e2', '#f0fdfa', '#f3f4f6'];
// 判断当前焦点是否在搜索框
function isSearchFocused() {
return document.activeElement === document.getElementById('qrSearchInput');
}
// 渲染 L1 网格
function renderL1() {
const grid = document.getElementById('qrL1Grid');
grid.innerHTML = qrData.map((cat, i) => {
const isActive = qrState.l1Index === i;
return `
<div class="qr-l1-btn${isActive ? ' active' : ''}" data-l1="${i}" onclick="selectL1(${i})">
<span class="l1-num">${i + 1}</span>
<span class="l1-name">${cat.name}</span>
</div>`;
}).join('');
grid.classList.remove('hidden');
}
// 渲染 L2 chip 行
function renderL2() {
const row = document.getElementById('qrL2Row');
const cat = qrData[qrState.l1Index];
if (!cat) { row.classList.add('hidden'); return; }
row.innerHTML = cat.subs.map((sub, i) => {
const isSelected = qrState.l2Index === i;
return `
<div class="qr-l2-chip${isSelected ? ' selected' : ''}" data-l2="${i}" onclick="selectL2(${i})">
<span class="l2-num">${i + 1}</span>
<span>${sub.name}</span>
</div>`;
}).join('');
row.classList.remove('hidden');
}
// 渲染 L3 回复列表
function renderL3() {
const list = document.getElementById('qrL3List');
const cat = qrData[qrState.l1Index];
if (!cat || qrState.l2Index === -1) {
// 还没选到 L2,显示空状态
list.innerHTML = `
<div class="qr-l3-empty">
<span class="empty-icon">👆</span>
<span class="empty-hint">请先在上方选择子分类<br>或按数字键 <span class="key-badge">1</span>~<span class="key-badge">${cat ? cat.subs.length : 'N'}</span> 快速选择</span>
</div>`;
return;
}
const sub = cat.subs[qrState.l2Index];
if (!sub) return;
list.innerHTML = sub.items.map((item, i) => {
const isSelected = qrState.l3Index === i;
return `
<div class="qr-l3-item${isSelected ? ' selected' : ''}" data-l3="${i}" onclick="selectL3(${i})">
<span class="l3-num">${i + 1}</span>
<div class="l3-content">
<div class="l3-title">${item.title}</div>
<div class="l3-preview">${item.content}</div>
</div>
</div>`;
}).join('');
}
// 更新面包屑
function updateBreadcrumb() {
const backBtn = document.getElementById('qrBackBtn');
const pathLabel = document.getElementById('qrPathLabel');
const pathHint = document.getElementById('qrPathHint');
if (qrState.l1Index === -1) {
backBtn.classList.add('hidden');
pathLabel.textContent = '请选择分类';
pathHint.classList.remove('hidden');
pathHint.innerHTML = '<span class="key-badge">Alt</span>+数字 选择分类';
} else {
const cat = qrData[qrState.l1Index];
if (qrState.l2Index === -1) {
backBtn.classList.remove('hidden');
backBtn.textContent = '← 返回分类';
pathLabel.textContent = `${cat.name}`;
pathHint.classList.remove('hidden');
pathHint.innerHTML = `数字 <span class="key-badge">1</span>~<span class="key-badge">${cat.subs.length}</span> 选子类`;
} else {
const sub = cat.subs[qrState.l2Index];
backBtn.classList.remove('hidden');
backBtn.textContent = '← 返回子类';
pathLabel.innerHTML = `${cat.name} <span class="bc-sep"></span> ${sub.name}`;
pathHint.classList.remove('hidden');
pathHint.innerHTML = `数字 <span class="key-badge">1</span>~<span class="key-badge">${sub.items.length}</span> 选回复 · <span class="key-badge">Enter</span> 填入`;
}
}
}
// 更新选中回复预览条
function updateSelectedBar() {
const bar = document.getElementById('qrSelectedBar');
const textEl = document.getElementById('qrSelectedText');
if (qrState.selectedText && qrState.l3Index !== -1) {
bar.classList.remove('hidden');
const cat = qrData[qrState.l1Index];
const sub = cat.subs[qrState.l2Index];
const item = sub.items[qrState.l3Index];
textEl.textContent = item.title + '' + item.content.substring(0, 40) + '...';
} else {
bar.classList.add('hidden');
}
}
// ===== 选择动作 =====
function selectL1(index) {
qrState.l1Index = index;
qrState.l2Index = -1;
qrState.l3Index = -1;
qrState.selectedText = '';
renderL1();
renderL2();
renderL3();
updateBreadcrumb();
updateSelectedBar();
// 设置 L2/L3 继承的主类颜色
const qrSection = document.getElementById('qrSection');
qrSection.style.setProperty('--qr-active-color', qrColors[index]);
qrSection.style.setProperty('--qr-active-light', qrLightColors[index]);
}
function selectL2(index) {
qrState.l2Index = index;
qrState.l3Index = -1;
qrState.selectedText = '';
renderL2();
renderL3();
updateBreadcrumb();
updateSelectedBar();
}
function selectL3(index) {
qrState.l3Index = index;
const cat = qrData[qrState.l1Index];
const sub = cat.subs[qrState.l2Index];
const item = sub.items[index];
qrState.selectedText = item.content;
renderL3();
updateBreadcrumb();
updateSelectedBar();
}
// 将选中回复填入聊天输入框
function qrInsertToChat() {
if (qrState.selectedText) {
document.getElementById('chatInput').value = qrState.selectedText;
document.getElementById('chatInput').focus();
// 闪烁反馈
const bar = document.getElementById('qrSelectedBar');
bar.style.background = 'var(--accent-soft)';
bar.style.color = 'var(--accent)';
setTimeout(() => {
bar.style.background = 'var(--success-soft)';
bar.style.color = 'var(--success)';
}, 300);
}
}
// 返回上一级
function qrGoBack() {
if (qrState.l2Index !== -1) {
// 从 L3 回到 L2
qrState.l2Index = -1;
qrState.l3Index = -1;
qrState.selectedText = '';
} else if (qrState.l1Index !== -1) {
// 从 L2 回到 L1
qrState.l1Index = -1;
qrState.l2Index = -1;
qrState.l3Index = -1;
qrState.selectedText = '';
document.getElementById('qrL2Row').classList.add('hidden');
// 清除 L2/L3 继承的主类颜色
const qrSection = document.getElementById('qrSection');
qrSection.style.removeProperty('--qr-active-color');
qrSection.style.removeProperty('--qr-active-light');
}
renderL1();
renderL2();
renderL3();
updateBreadcrumb();
updateSelectedBar();
}
// ===== 键盘事件 =====
document.addEventListener('keydown', function(e) {
// 状态判断
const chatFocused = document.activeElement === document.getElementById('chatInput');
// "/" 聚焦搜索框(非输入状态)
if (e.key === '/' && !chatFocused && !isSearchFocused()) {
e.preventDefault();
document.getElementById('qrSearchInput').focus();
return;
}
// Alt+数字:选择 L1 一级分类(全局有效,除聊天输入框外)
if (e.altKey && e.key >= '1' && e.key <= '7') {
if (chatFocused) return; // 聊天输入框中不拦截 Alt+数字
e.preventDefault();
const idx = parseInt(e.key) - 1;
if (idx < qrData.length) {
selectL1(idx);
}
return;
}
// 在搜索框内时不处理数字导航
if (isSearchFocused()) return;
// 聊天输入框内不处理快速回复导航
if (chatFocused) return;
// 数字键:逐层选择 L2 或 L3
if (e.key >= '0' && e.key <= '9' && !e.altKey && !e.ctrlKey && !e.metaKey) {
const num = parseInt(e.key);
if (num === 0) return; // 0 不参与导航
if (qrState.l1Index !== -1 && qrState.l2Index === -1) {
// 已选中 L1,数字选择 L2
const cat = qrData[qrState.l1Index];
if (num <= cat.subs.length) {
e.preventDefault();
selectL2(num - 1);
}
} else if (qrState.l1Index !== -1 && qrState.l2Index !== -1) {
// 已选中 L2,数字选择 L3
const cat = qrData[qrState.l1Index];
const sub = cat.subs[qrState.l2Index];
if (num <= sub.items.length) {
e.preventDefault();
selectL3(num - 1);
}
}
return;
}
// Enter:将选中的回复填入聊天输入框
if (e.key === 'Enter' && qrState.selectedText) {
if (chatFocused) return; // 聊天输入框中 Enter 用于发送
e.preventDefault();
qrInsertToChat();
return;
}
// Backspace/Escape:返回上一级
if ((e.key === 'Backspace' || e.key === 'Escape') && (qrState.l1Index !== -1)) {
if (chatFocused) return;
e.preventDefault();
qrGoBack();
return;
}
});
// 初始渲染 — 默认展示第一分类第二层目录效果(方便原型评审)
selectL1(0);
/* ===== v5.4: 拖拽调整中间栏左右边框 ===== */
(function initResizeHandles() {
const leftSidebar = document.querySelector('.sidebar-left');
const rightSidebar = document.querySelector('.sidebar-right');
const handleLeft = document.getElementById('resizeLeft');
const handleRight = document.getElementById('resizeRight');
if (!handleLeft || !handleRight) return;
let dragging = null; // 'left' 或 'right'
let startX = 0;
let startWidth = 0;
function onMouseDown(e, side) {
e.preventDefault();
dragging = side;
startX = e.clientX;
startWidth = side === 'left'
? leftSidebar.offsetWidth
: rightSidebar.offsetWidth;
document.body.style.cursor = 'col-resize';
document.body.style.userSelect = 'none';
// 高亮当前手柄
(side === 'left' ? handleLeft : handleRight).classList.add('dragging');
}
function onMouseMove(e) {
if (!dragging) return;
if (dragging === 'left') {
const dx = e.clientX - startX;
const newW = Math.max(200, Math.min(500, startWidth + dx));
leftSidebar.style.width = newW + 'px';
leftSidebar.style.minWidth = newW + 'px';
} else {
const dx = startX - e.clientX;
const newW = Math.max(220, Math.min(500, startWidth + dx));
rightSidebar.style.width = newW + 'px';
rightSidebar.style.minWidth = newW + 'px';
}
}
function onMouseUp() {
if (!dragging) return;
document.body.style.cursor = '';
document.body.style.userSelect = '';
handleLeft.classList.remove('dragging');
handleRight.classList.remove('dragging');
dragging = null;
}
handleLeft.addEventListener('mousedown', function(e) { onMouseDown(e, 'left'); });
handleRight.addEventListener('mousedown', function(e) { onMouseDown(e, 'right'); });
document.addEventListener('mousemove', onMouseMove);
document.addEventListener('mouseup', onMouseUp);
})();
/* ===== v5.4: 输入框上方拖拽手柄(调整输入框高度,textarea 同步伸缩) ===== */
(function initInputResize() {
const inputArea = document.getElementById('chatInputArea');
const handle = document.getElementById('inputResizeHandle');
const chatInput = document.getElementById('chatInput');
if (!inputArea || !handle) return;
let dragging = false;
let startY = 0;
let startHeight = 0;
let startInputHeight = 0;
handle.addEventListener('mousedown', function(e) {
e.preventDefault();
dragging = true;
startY = e.clientY;
startHeight = inputArea.offsetHeight;
startInputHeight = chatInput ? chatInput.offsetHeight : 40;
document.body.style.cursor = 'row-resize';
document.body.style.userSelect = 'none';
handle.classList.add('dragging');
});
document.addEventListener('mousemove', function(e) {
if (!dragging) return;
// 向上拖 → 整个区域变高,向下拖 → 变矮
const dy = startY - e.clientY;
const newH = Math.max(80, Math.min(400, startHeight + dy));
inputArea.style.height = newH + 'px';
// textarea 同步伸缩
if (chatInput) {
const delta = newH - startHeight;
const newInputH = Math.max(60, Math.min(350, startInputHeight + delta));
chatInput.style.height = newInputH + 'px';
}
});
document.addEventListener('mouseup', function() {
if (!dragging) return;
dragging = false;
document.body.style.cursor = '';
document.body.style.userSelect = '';
handle.classList.remove('dragging');
});
})();
</script>
<script>
/* ===== 排查步骤交互:用户端同步逻辑 ===== */
(function() {
var pathSteps = document.querySelectorAll('.path-step-inline');
pathSteps.forEach(function(step, idx) {
step.addEventListener('click', function() {
pathSteps.forEach(function(s, i) {
s.classList.remove('path-step-inline--done', 'path-step-inline--current', 'path-step-inline--pending');
if (i < idx) s.classList.add('path-step-inline--done');
else if (i === idx) s.classList.add('path-step-inline--current');
else s.classList.add('path-step-inline--pending');
});
});
});
})();
</script>
</body>
</html>