Files
wecom_it_smart_desk/docs/01-产品文档/02-会话管理/原型-REQ-会话-001-结束会话流程-v1.0.archive.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

190 lines
11 KiB
HTML

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>员工结束会话 - 原型图</title>
<style>
:root {
--primary: #07C160;
--primary-light: #e8f9ed;
--text: #333;
--text-light: #666;
--border: #e5e5e5;
--bg: #f7f7f7;
--white: #fff;
--warning: #ff976a;
--danger: #ee0a24;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', sans-serif; background: var(--bg); padding: 20px; min-height: 100vh; }
.container { max-width: 800px; margin: 0 auto; }
h1 { text-align: center; margin-bottom: 30px; color: var(--text); font-size: 24px; }
.section { background: var(--white); border-radius: 12px; padding: 20px; margin-bottom: 20px; box-shadow: 0 2px 8px rgba(0,0,0,0.06); }
.section-title { font-size: 16px; font-weight: 600; margin-bottom: 16px; color: var(--text); display: flex; align-items: center; gap: 8px; }
.section-title::before { content: ''; width: 4px; height: 16px; background: var(--primary); border-radius: 2px; }
/* 状态卡片 */
.states { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.state-card { border: 2px dashed var(--border); border-radius: 12px; padding: 20px; text-align: center; transition: all 0.3s; }
.state-card.active { border-color: var(--primary); background: var(--primary-light); }
.state-num { font-size: 12px; color: var(--text-light); margin-bottom: 8px; }
.state-btn { padding: 12px 20px; border-radius: 24px; font-size: 14px; font-weight: 600; cursor: pointer; border: none; width: 100%; }
/* 按钮样式 */
.btn-outline { background: var(--white); border: 2px solid var(--primary); color: var(--primary); }
.btn-warning { background: var(--warning); color: var(--white); }
.btn-primary { background: var(--primary); color: var(--white); }
/* 流程箭头 */
.flow { display: flex; align-items: center; justify-content: center; gap: 8px; flex-wrap: wrap; padding: 20px 0; }
.flow-step { background: var(--primary); color: var(--white); padding: 10px 20px; border-radius: 24px; font-size: 14px; font-weight: 500; }
.flow-arrow { font-size: 24px; color: var(--text-light); }
/* 弹窗 */
.modal { background: var(--white); border-radius: 16px; width: 90%; max-width: 360px; margin: 0 auto; overflow: hidden; }
.modal-header { padding: 24px; text-align: center; border-bottom: 1px solid var(--border); }
.modal-title { font-size: 18px; font-weight: 600; margin-bottom: 8px; }
.modal-desc { font-size: 14px; color: var(--text-light); }
.modal-footer { display: flex; border-top: 1px solid var(--border); }
.modal-btn { flex: 1; padding: 16px; border: none; font-size: 15px; cursor: pointer; background: var(--white); }
.modal-btn.cancel { color: var(--text-light); }
.modal-btn.confirm { color: var(--primary); font-weight: 600; border-left: 1px solid var(--border); }
/* 评价组件 */
.eval-body { padding: 24px; }
.eval-title { text-align: center; font-size: 18px; font-weight: 600; margin-bottom: 20px; }
.eval-options { display: flex; justify-content: center; gap: 20px; margin-bottom: 20px; }
.eval-option { display: flex; flex-direction: column; align-items: center; gap: 8px; cursor: pointer; }
.eval-option input { display: none; }
.eval-emoji { width: 56px; height: 56px; border-radius: 50%; background: var(--bg); display: flex; align-items: center; justify-content: center; font-size: 28px; transition: all 0.2s; border: 2px solid transparent; }
.eval-option input:checked + .eval-emoji { background: var(--primary-light); border-color: var(--primary); transform: scale(1.1); }
.eval-label { font-size: 13px; color: var(--text-light); }
.eval-textarea { width: 100%; border: 1px solid var(--border); border-radius: 8px; padding: 12px; font-size: 14px; resize: none; margin-bottom: 16px; min-height: 80px; }
.eval-submit { width: 100%; padding: 14px; background: var(--primary); color: var(--white); border: none; border-radius: 8px; font-size: 16px; font-weight: 600; cursor: pointer; }
/* 说明 */
.note { background: #fff7e6; border: 1px solid #ffd591; border-radius: 8px; padding: 16px; font-size: 14px; color: #d46b08; margin-top: 16px; }
/* 输入栏 - 原来版本 */
.input-bar-demo { background: var(--white); border: 1px solid var(--border); border-radius: 12px; padding: 12px 16px; display: flex; align-items: center; gap: 12px; }
.input-bar-demo .toolbar { display: flex; gap: 8px; }
.input-bar-demo .tool-btn { width: 36px; height: 36px; border: none; background: transparent; cursor: pointer; font-size: 20px; border-radius: 8px; display: flex; align-items: center; justify-content: center; }
.input-bar-demo .tool-btn:hover { background: var(--bg); }
.input-bar-demo .input-field { flex: 1; border: 1px solid var(--border); border-radius: 8px; padding: 10px 14px; font-size: 14px; min-height: 40px; }
.input-bar-demo .action-btn { padding: 10px 16px; border-radius: 8px; font-size: 14px; font-weight: 500; cursor: pointer; border: none; display: flex; align-items: center; gap: 6px; }
.input-bar-demo .btn-outline { background: var(--white); border: 1px solid var(--primary); color: var(--primary); }
.input-bar-demo .btn-primary { background: var(--primary); color: var(--white); }
/* 状态按钮样式 */
.status-waiting { background: var(--warning); color: var(--white); }
.status-end { background: var(--danger); color: var(--white); }
</style>
</head>
<body>
<div class="container">
<h1>🎯 员工结束会话功能 - 原型图</h1>
<!-- 输入栏UI -->
<div class="section">
<div class="section-title">输入栏UI(保持原有位置)</div>
<div class="input-bar-demo">
<div class="toolbar">
<button class="tool-btn" title="表情">😊</button>
<button class="tool-btn" title="文件">📎</button>
</div>
<input type="text" class="input-field" placeholder="请输入消息...">
<button class="action-btn btn-outline">🎧 人工咨询</button>
<button class="action-btn btn-primary">发送</button>
</div>
<div class="note">💡 按钮位置不变,仅文字根据状态变化:人工咨询 → 排队等待 → 结束咨询</div>
</div>
<!-- 状态流程 -->
<div class="section">
<div class="section-title">三状态(按钮文字变化)</div>
<div class="states">
<div class="state-card active">
<div class="state-num">状态1</div>
<button class="state-btn btn-outline">🎧 人工咨询</button>
<div style="margin-top:12px;font-size:13px;color:var(--text-light);">点击发起呼叫</div>
</div>
<div class="state-card">
<div class="state-num">状态2</div>
<button class="state-btn status-waiting">⏳ 排队等待</button>
<div style="margin-top:12px;font-size:13px;color:var(--text-light);">点击弹出确认</div>
</div>
<div class="state-card">
<div class="state-num">状态3</div>
<button class="state-btn status-end">📴 结束咨询</button>
<div style="margin-top:12px;font-size:13px;color:var(--text-light);">点击→评价→关闭</div>
</div>
</div>
</div>
<!-- 弹窗1:取消排队 -->
<div class="section">
<div class="section-title">弹窗1:取消排队确认(状态2点击时触发)</div>
<div class="modal">
<div class="modal-header">
<div class="modal-title">取消排队?</div>
<div class="modal-desc">您正在排队等待人工坐席,是否取消?</div>
</div>
<div class="modal-footer">
<button class="modal-btn cancel">暂不取消</button>
<button class="modal-btn confirm">确认取消</button>
</div>
</div>
</div>
<!-- 弹窗2:满意度评价 -->
<div class="section">
<div class="section-title">弹窗2:满意度评价(状态3点击时触发)</div>
<div class="modal">
<div class="eval-body">
<div class="eval-title">本次服务是否满意?</div>
<div class="eval-options">
<label class="eval-option">
<input type="radio" name="eval" value="satisfied">
<div class="eval-emoji">😊</div>
<span class="eval-label">满意</span>
</label>
<label class="eval-option">
<input type="radio" name="eval" value="neutral">
<div class="eval-emoji">😐</div>
<span class="eval-label">一般</span>
</label>
<label class="eval-option">
<input type="radio" name="eval" value="dissatisfied">
<div class="eval-emoji">😞</div>
<span class="eval-label">不满意</span>
</label>
</div>
<textarea class="eval-textarea" placeholder="补充意见(可选)"></textarea>
<button class="eval-submit">提交评价</button>
</div>
</div>
<div class="note">📌 提交评价后 → 窗口自动关闭 → 重新进入 = 全新会话</div>
</div>
<!-- 完整流程 -->
<div class="section">
<div class="section-title">完整流程</div>
<div class="flow">
<div class="flow-step">🎧 人工咨询</div>
<span class="flow-arrow"></span>
<div class="flow-step">⏳ 排队等待</div>
<span class="flow-arrow"></span>
<div class="flow-step">📴 结束咨询</div>
<span class="flow-arrow"></span>
<div class="flow-step">😊 满意度评价</div>
<span class="flow-arrow"></span>
<div class="flow-step">🚪 窗口关闭</div>
<span class="flow-arrow"></span>
<div class="flow-step">✨ 全新会话</div>
</div>
</div>
</div>
</body>
</html>