feat: 工单详情页新增角色权限控制,补充PRD文档与模块文档结构

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
冯普
2026-04-28 11:58:00 +08:00
co-authored by Claude Opus 4.6
parent d70d03bd1b
commit 8291f39539
66 changed files with 1710 additions and 16 deletions
+3 -3
View File
@@ -235,7 +235,7 @@ const SITE_MAP = [
{ file:'report-detail-dialog.html', label:'报表详情弹窗', dialog:true },
{ file:'expert-schedule-dialog.html', label:'专家排班弹窗', dialog:true }
]},
{ name:'应急就医(管理员)', dir:'web-admin/emergency-dispatch/admin', entry:'archive-personal.html', pages:[
{ name:'应急就医(管理员)', dir:'web-admin/emergency-dispatch/admin', entry:'archive-personal.html', prd:'web-admin/emergency-dispatch/admin/doc/PRD.md', pages:[
{ file:'archive-personal.html', label:'个人应急数据' },
{ file:'archive-personal-detail.html', label:'个人应急数据详情' },
{ file:'archive-personal-detail-illness.html', label:'个人大病就医详情' },
@@ -283,14 +283,14 @@ const SITE_MAP = [
{ file:'exception-dirty.html', label:'系统脏数据' },
{ file:'exception-result.html', label:'结果异常' }
]},
{ name:'应急就医(操作人员)', dir:'web-admin/emergency-dispatch/operator', entry:'emergency-active.html', pages:[
{ name:'应急就医(操作人员)', dir:'web-admin/emergency-dispatch/operator', entry:'emergency-active.html', prd:'web-admin/emergency-dispatch/operator/doc/PRD.md', pages:[
{ file:'emergency-active.html', label:'正在应急' },
{ file:'work-order.html', label:'应急工单' },
{ file:'call-record.html', label:'通话记录' },
{ file:'duty-group.html', label:'值班小组' },
{ file:'serious-illness.html', label:'大病就医' }
]},
{ name:'应急就医(专业人员)', dir:'web-admin/emergency-dispatch/professional', entry:'professional.html', pages:[
{ name:'应急就医(专业人员)', dir:'web-admin/emergency-dispatch/professional', entry:'professional.html', prd:'web-admin/emergency-dispatch/professional/doc/PRD.md', pages:[
{ file:'professional.html', label:'正在应急' }
]},
{ name:'一线医疗', dir:'web-admin/frontline-medical', pages:[] }
@@ -236,26 +236,26 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
</div>
<!-- 待确认操作按钮 -->
<div class="action-bar" data-group="pending" id="pendingActions">
<button class="btn btn--danger" onclick="openRejectModal()">驳回</button>
<button class="btn btn--danger" onclick="openRejectModal()">取消预约</button>
<button class="btn btn--primary" onclick="openDispatchModal()">立即派单</button>
</div>
</div>
</div>
<!-- 驳回弹窗 -->
<!-- 取消弹窗 -->
<div class="modal-mask" id="rejectModal" onclick="if(event.target===this)closeRejectModal()">
<div class="modal-box" style="width:480px;">
<div class="modal-header"><span class="modal-title">驳回申请</span><button class="modal-close" onclick="closeRejectModal()"></button></div>
<div class="modal-header"><span class="modal-title">取消申请</span><button class="modal-close" onclick="closeRejectModal()"></button></div>
<div class="modal-body">
<div class="field">
<div class="field__label">驳回原因<span class="req">*</span></div>
<textarea class="field__textarea" id="rejectReason" placeholder="请输入驳回原因..."></textarea>
<div class="field__label">取消原因<span class="req">*</span></div>
<textarea class="field__textarea" id="rejectReason" placeholder="请输入取消原因..."></textarea>
</div>
</div>
<div class="modal-footer">
<button class="btn" onclick="closeRejectModal()">取消</button>
<button class="btn btn--primary" onclick="submitReject()">确认驳回</button>
<button class="btn" onclick="closeRejectModal()">返回</button>
<button class="btn btn--primary" onclick="submitReject()">确认取消</button>
</div>
</div>
</div>
@@ -92,6 +92,9 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
.card__header-btn:hover{background:var(--primary-light);}
/* 表单样式(编辑模式) */
/* 只读表单字段 */
.form-row--readonly{opacity:.7;pointer-events:none;}
.form-row--readonly .form-input{background:#f5f5f5;border-color:#e8e8e8;color:var(--text-secondary);}
.form-row{margin-bottom:20px;}
.form-group{display:flex;align-items:flex-start;gap:8px;}
.form-label{font-size:var(--font-sm);color:var(--text-primary);white-space:nowrap;min-width:96px;text-align:right;line-height:36px;}
@@ -232,7 +235,10 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
<!-- 基本信息 -->
<div class="card">
<div class="card__title">基本信息</div>
<div class="card__header">
<div class="card__title">基本信息</div>
<button class="btn btn-danger btn-sm" id="btnEndEmergency" style="display:none;" onclick="openEndConfirm()">结束应急</button>
</div>
<div class="info-row">
<div class="info-cell"><span class="info-cell__label">工单编号:</span><span class="info-cell__value">YJ5633256</span></div>
<div class="info-cell"><span class="info-cell__label">应急中心:</span><span class="info-cell__value">西安应急中心</span></div>
@@ -250,7 +256,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
<div class="info-row">
<div class="info-cell"><span class="info-cell__label">操作人员:</span><span class="info-cell__value">刘旭</span></div>
<div class="info-cell"><span class="info-cell__label">专业人员:</span><span class="info-cell__value">刘旭</span></div>
<div class="info-cell"><span class="info-cell__label">工单状态:</span><span class="info-cell__value status status--doing" id="orderStatus">处理中</span> <button class="btn btn-danger btn-sm" id="btnEndEmergency" style="display:none;margin-left:12px;" onclick="openEndConfirm()">结束应急</button></div>
<div class="info-cell"><span class="info-cell__label">工单状态:</span><span class="info-cell__value status status--doing" id="orderStatus">处理中</span></div>
</div>
<div class="info-row">
<div class="info-cell"><span class="info-cell__label">完成时间:</span><span class="info-cell__value">2026-03-21 16:45:00</span></div>
@@ -284,7 +290,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
</div>
<!-- 编辑视图 -->
<div id="rescueEditView" style="display:none;">
<div class="form-row">
<div class="form-row" data-field="opinion">
<div class="form-group" style="flex:1;">
<label class="form-label">救助意见:</label>
<div class="form-control-wrap">
@@ -292,7 +298,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
</div>
</div>
</div>
<div class="form-row">
<div class="form-row" data-field="result">
<div class="form-group" style="flex:1;">
<label class="form-label">救助结果:</label>
<div class="form-control-wrap">
@@ -300,7 +306,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei
</div>
</div>
</div>
<div class="form-row">
<div class="form-row" data-field="photos">
<div class="form-group" style="flex:1;">
<label class="form-label">相关照片:</label>
<div class="form-control-wrap">
@@ -707,6 +713,38 @@ function addSummary(){
var bc=document.querySelector('.breadcrumb a');
if(bc)bc.href='center-work-order.html?role=operator';
}
/* ===== 角色权限控制 ===== */
var _hide=function(el){if(el)el.style.display='none';};
if(!role||role==='admin'){
// 管理员:隐藏所有编辑按钮和结束应急
_hide(document.getElementById('rescueEditBtn'));
_hide(document.getElementById('ambEditBtn'));
_hide(document.getElementById('btnEndEmergency'));
// 隐藏补充小结操作按钮和新增
document.querySelectorAll('#summaryList .summary-item__btn').forEach(function(b){b.style.display='none';});
_hide(document.querySelector('.summary-add'));
}
// 将指定字段设为只读态
var _readonly=function(sel){
var el=document.querySelector(sel);
if(!el)return;
el.classList.add('form-row--readonly');
el.querySelectorAll('input,textarea').forEach(function(inp){inp.disabled=true;});
};
if(role==='operator'){
// 操作人员:救助意见只读
_readonly('#rescueEditView [data-field="opinion"]');
}
if(role==='professional'){
// 专业人员:救助结果、相关照片只读
_readonly('#rescueEditView [data-field="result"]');
_readonly('#rescueEditView [data-field="photos"]');
// 隐藏救护车编辑按钮
_hide(document.getElementById('ambEditBtn'));
// 隐藏补充小结操作按钮和新增
document.querySelectorAll('#summaryList .summary-item__btn').forEach(function(b){b.style.display='none';});
_hide(document.querySelector('.summary-add'));
}
})();
/* ===== 救助信息编辑 ===== */
function editRescue(){
@@ -737,8 +775,11 @@ function confirmEndEmergency(){
st.textContent='已完成';st.className='info-cell__value status status--done';
document.getElementById('btnEndEmergency').style.display='none';
}
/* 页面加载时判断工单状态,非已完成则显示结束应急按钮 */
/* 页面加载时判断工单状态,非管理员且非已完成则显示结束应急按钮 */
(function(){
var params=new URLSearchParams(window.location.search);
var role=params.get('role');
if(!role||role==='admin')return; // 管理员不显示结束应急
var st=document.getElementById('orderStatus');
if(st&&st.textContent.trim()!=='已完成'){
document.getElementById('btnEndEmergency').style.display='';
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

@@ -0,0 +1,377 @@
# 应急就医(操作人员端)产品需求文档
> **所属端**:Web 管理端(操作人员视角)
> **模块路径**`web-admin/emergency-dispatch/operator/`
> **最后更新**2026-04-28
---
## 模块概述
操作人员端用于承接员工端发起的应急求助,负责实时沟通、资源调度、驻场派单、救护车支援、救助过程留痕与工单闭环,并与专业人员(提供医学救助意见)和管理端(工单台账 / 排班 / 统计)协同完成处置。
该目录下共 5 个页面:其中 1 个为操作人员核心处置页面(`emergency-active.html`),4 个为角色路由页(自动跳转至管理端通用页面并携带 `role=operator` 参数)。
---
## 页面导航结构
```text
应急就医(操作人员)
├── 正在应急(实时处置主界面)
│ ├── 查看员工求助位置(地图弹窗)
│ ├── 驻场派单(表单态 / 已派单信息态)
│ ├── 救护车支援(表单态 / 已支援信息态)
│ ├── 救助信息(补充小结 + 救助结果)
│ └── 结束应急(确认弹窗 → 已结束结果态)
├── 应急工单(路由页)→ 管理端应急工单页(operator 权限视图)
├── 通话记录(路由页)→ 管理端通话记录页(operator 权限视图)
├── 大病就医(路由页)→ 管理端大病就医页(operator 权限视图)
└── 值班小组(路由页)→ 管理端排班配置页(operator 权限视图)
```
---
## 应急处置状态流转图
```mermaid
stateDiagram-v2
[*] --> 待受理 : 员工端发起求助
待受理 --> 进行中 : 操作人员进入"正在应急"
进行中 --> 资源调度中 : 触发驻场派单 / 救护车支援
资源调度中 --> 进行中 : 派单成功,持续沟通
进行中 --> 已结束 : 点击"结束应急"并二次确认
已结束 --> [*]
```
---
## 页面清单
| 序号 | 二级菜单 | 页面/弹窗 | 文件 | 类型 |
|------|----------|-----------|------|------|
| 1 | 正在应急 | 正在应急主界面 | emergency-active.html | 页面 |
| 1-1 | 正在应急 | 查看员工求助位置 | emergency-active.html | 弹窗 |
| 1-2 | 正在应急 | 驻场派单(表单态) | emergency-active.html | 弹窗 |
| 1-3 | 正在应急 | 驻场派单(已派单信息态) | emergency-active.html | 弹窗状态 |
| 1-4 | 正在应急 | 救护车支援(表单态) | emergency-active.html | 弹窗 |
| 1-5 | 正在应急 | 救护车支援(已支援信息态) | emergency-active.html | 弹窗状态 |
| 1-6 | 正在应急 | 救助信息 | emergency-active.html | 弹窗 |
| 1-7 | 正在应急 | 结束应急确认 | emergency-active.html | 弹窗 |
| 2 | 应急工单 | 应急工单(路由页) | work-order.html | 路由页 |
| 3 | 通话记录 | 通话记录(路由页) | call-record.html | 路由页 |
| 4 | 大病就医 | 大病就医(路由页) | serious-illness.html | 路由页 |
| 5 | 值班小组 | 值班小组(路由页) | duty-group.html | 路由页 |
---
## 逐页说明
## 一、实时处置
### 1. 正在应急(emergency-active.html
![页面截图](screenshots/emergency-active.jpg)
**功能说明:**
操作人员核心工作台,采用三栏布局:左侧联系人列表(320px)+ 中间对话区 + 右侧值班面板(320px)。支持与员工实时文字沟通、查看患者定位、调取周边医疗资源,并执行驻场派单、救护车支援、救助信息记录、结束应急等关键处置操作。
**页面布局说明:**
左侧联系人列表:
- 顶部搜索框(搜索应急人员)+ 刷新按钮
- 联系人卡片:头像、姓名、性别年龄、最后消息时间、最后消息预览文本、未读消息数角标
- 当前选中卡片高亮显示
中间对话区:
- 顶部患者信息栏:患者姓名 + 基本信息(性别 年龄 | 员工编号 | 单位·部门)
- 顶部操作按钮组:驻场派单(warning 样式)、救护车支援(default)、救助信息(default)、结束应急(danger
- 聊天消息区:时间分隔线、左侧员工消息气泡、右侧操作人员消息气泡
- 底部操作按钮行:查看员工求助位置
- 发送输入框:工具栏(表情 / 图片 / 文件 / 语音通话 / 视频通话)+ 文本输入区 + 发送按钮
右侧值班面板:
- 标题"值班信息"
- 统计卡片 2×2 网格:当日应急人数(红色)、当月应急人数(蓝色)、应急响应及时率(绿色)、应急任务完成率(橙色)
- 月视图日历:年月切换箭头、星期行、日期网格(今日高亮、有排班日期带蓝色圆点标记)
- 今日值班人员列表:头像、姓名(含职称)、角色标签
**业务规则:**
- 当前应急会话绑定员工身份、所属单位及工单上下文,不可跨会话混用。
- 地图资源按类型分 Tab 展示:油田医院 / 合作医院 / 医疗点 / 救护车 / AED / 急救包。
- 驻场派单需先选择驻场人员后方可确认;派单成功后按钮进入"已派单信息态",不可重复提交。
- 救护车支援需选择车辆后方可提交;驾驶人信息由系统自动带出,只读展示。
- 结束应急需二次确认;确认后结束按钮置灰禁用,底部操作按钮行与输入区隐藏,聊天区追加"本次应急已结束"系统卡片消息,页面进入已结束结果态。
**交互说明:**
- 点击"查看员工求助位置",打开地图弹窗,支持资源 Tab 切换与联系电话拨号。
- 点击"驻场派单",打开派单弹窗(表单态);确认后弹窗切换为已派单信息态,展示派单时间、人员、医院、说明、状态标签。
- 点击"救护车支援",打开支援弹窗(表单态);确认后弹窗切换为已支援信息态,展示车牌、驾驶人、联系电话、目的地、随行人等信息,并提供"修改"入口。
- 点击"救助信息",打开救助信息弹窗,可新增 / 编辑 / 删除补充小结,并填写救助结果说明与上传相关照片。
- 点击"结束应急",打开确认弹窗;确认后进入结束态,不可继续发送消息与执行调度操作。
---
### 弹窗1:查看员工求助位置(地图弹窗)
![查看员工求助位置](screenshots/emergency-active-map.jpg)
**功能说明:**
展示患者当前位置及周边医疗资源,辅助操作人员快速决策调度方案。
**布局说明:**
左右两栏布局:
- 左侧上方:模拟地图区域(网格背景、道路线、建筑物标注、患者位置红色脉冲标记、各类资源标记点)
- 左侧下方:患者信息区(患者姓名·性别·年龄、详细地址、求助时间、坐标信息)
- 右侧:附近医疗资源面板
- Tab 切换:油田医院 / 合作医院 / 医疗点 / 救护车 / AED / 急救包
- 资源卡片列表:图标、名称、所属单位、距离、联系电话(可拨号)、地址
**业务规则:**
- 患者位置信息来源于员工端求助时上报的 GPS 坐标,实时展示。
- 各类资源按距离由近到远排序展示。
- 联系电话支持点击直接拨号。
**交互说明:**
- 点击右侧资源卡片,地图上对应标记点高亮;点击地图标记点,右侧对应资源卡片高亮并滚动至可见区域。
- Tab 切换时,地图标记点同步过滤,仅展示当前 Tab 类型的资源。
---
### 弹窗2:驻场派单
![驻场派单-表单态](screenshots/emergency-active-dispatch-form.jpg)
**功能说明:**
操作人员向驻场人员下发处置任务,指定人员赶赴现场提供救助支持。
#### 表单态
**表单字段:**
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| 驻场人员 | 可搜索下拉选择 | 是 | 支持按姓名 / 医院搜索,选中后自动带出联系电话 |
| 联系电话 | 只读文本 | — | 由驻场人员自动带出,不可手动编辑 |
| 派单说明 | 多行文本 | 否 | 建议填写处置要求与注意事项 |
**业务规则:**
- 驻场人员未选择时,"确定派单"按钮禁用。
- 联系电话随驻场人员选择自动填充,切换人员时同步更新。
**交互说明:**
- 底部按钮:取消(关闭弹窗)/ 确定派单(提交并切换为已派单信息态)。
#### 已派单信息态
![驻场派单-已派单信息态](screenshots/emergency-active-dispatch-info.jpg)
**展示字段:**
| 字段名 | 说明 |
|--------|------|
| 派单时间 | 系统记录的提交时间戳 |
| 驻场人员 | 已选择的驻场人员姓名 |
| 所在医院 | 驻场人员所属医院 |
| 联系电话 | 驻场人员联系电话 |
| 派单说明 | 提交时填写的说明内容 |
| 派单状态 | 标签:进行中(蓝色)/ 已完成(绿色) |
**交互说明:**
- 底部按钮:关闭 / 确认。
- 已派单信息态为只读展示,不支持直接修改派单内容。
---
### 弹窗3:救护车支援
![救护车支援-表单态](screenshots/emergency-active-ambulance-form.jpg)
**功能说明:**
操作人员调度救护车前往患者位置或指定目的地,完成转运支援任务。
#### 表单态
**表单字段:**
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| 救护车 | 可搜索下拉选择 | 是 | 支持按车牌号 / 医疗点 / 机构搜索 |
| 驾驶人姓名 | 只读文本 | — | 随车辆选择自动带出,不可编辑 |
| 驾驶人电话 | 只读文本 | — | 随车辆选择自动带出,不可编辑 |
| 随行人 | 文本输入 | 否 | 与随行人电话并排两列布局 |
| 随行人电话 | 文本输入 | 否 | 与随行人并排两列布局 |
| 目的地 | 文本输入 | 否 | 填写转运目标地点 |
| 备注信息 | 多行文本 | 否 | 补充说明转运注意事项 |
**业务规则:**
- 救护车未选择时,"确定支援"按钮禁用。
- 驾驶人信息(姓名 + 电话)随车辆选择自动填充,切换车辆时同步更新。
**交互说明:**
- 底部按钮:取消(关闭弹窗)/ 确定支援(提交并切换为已支援信息态)。
#### 已支援信息态
![救护车支援-已支援信息态](screenshots/emergency-active-ambulance-info.jpg)
**展示字段:**
| 字段名 | 说明 |
|--------|------|
| 救护车 | 已选择的车牌号 |
| 所属医疗点 | 车辆归属医疗点名称 |
| 所属机构 | 车辆归属机构名称 |
| 驾驶人 | 驾驶人姓名 |
| 驾驶人电话 | 驾驶人联系电话 |
| 随行人 | 随行人姓名 |
| 随行人电话 | 随行人联系电话 |
| 目的地 | 转运目标地点 |
| 备注信息 | 补充说明内容 |
**交互说明:**
- 底部按钮:关闭 / 修改(点击"修改"重新进入表单态,允许更新支援信息)。
---
### 弹窗4:救助信息
![救助信息](screenshots/emergency-active-summary.jpg)
**功能说明:**
操作人员在应急处置过程中记录补充小结(过程留痕)与最终救助结果,作为工单闭环的重要依据。
**布局说明:**
- 上半部分"补充小结"区域(分隔线与下半部分分隔)
- 下半部分"救助结果"区域
**补充小结区域:**
- 小结卡片列表,每条包含:时间戳、内容文本、编辑按钮、删除按钮
- 编辑态:内容区替换为文本域,显示保存 / 取消按钮;保存后更新卡片内容
- "新增小结"按钮:点击在列表末尾追加新的编辑态卡片
**救助结果区域:**
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| 结果说明 | 多行文本域 | 建议必填 | 描述本次应急处置的最终结果 |
| 相关照片 | 图片上传 | 否 | 支持上传多张,显示已上传数量(如 2/6),展示缩略图 |
**业务规则:**
- 补充小结支持多条,按时间顺序排列,可随时新增、编辑、删除。
- 相关照片最多上传 6 张,超出限制时上传入口禁用。
- 救助结果建议在结束应急前填写完整,以保证工单记录完整性。
**交互说明:**
- 弹窗底部左侧显示"共 X 条小结"计数,右侧为"确定"按钮(保存并关闭弹窗)。
- 删除小结时直接移除对应卡片,不需要二次确认。
- 编辑态下点击"取消"恢复原内容,不保存修改。
---
### 弹窗5:结束应急确认
![结束应急确认](screenshots/emergency-active-end.jpg)
**功能说明:**
防止操作人员误触结束应急,通过二次确认机制保障工单状态流转的准确性。
**布局说明:**
- 警告图标(黄色圆形感叹号)居中展示
- 提示文字:"请确定本次应急求助已完成后再执行该操作"
- 底部按钮:取消 / 确认结束(danger 样式)
**业务规则:**
- 点击"确认结束"后,工单状态从"进行中"流转为"已结束",不可撤销。
- 确认后:结束应急按钮置灰禁用;底部操作按钮行(查看员工求助位置)隐藏;消息输入区隐藏;聊天区末尾追加"本次应急已结束"系统卡片消息。
- 已结束状态下,驻场派单、救护车支援、救助信息按钮仍可点击查看历史信息,但不可修改。
**交互说明:**
- 点击"取消"关闭弹窗,不执行任何状态变更。
- 点击"确认结束"执行结束操作,页面进入已结束结果态。
---
## 二、台账入口(路由页)
### 2. 应急工单(work-order.html
![页面截图](screenshots/work-order.jpg)
**功能说明:**
角色路由页,不承载独立业务 UI。页面加载后自动跳转至管理端"应急工单"页面,并注入 `role=operator` 参数,使页面按操作人员权限与导航展示。
**路由目标:** `../admin/center-work-order.html?role=operator`
**业务规则:**
- 由管理端通用工单页承载筛选、列表、详情、导出等能力。
- 操作人员视图下可见"新增应急工单"入口(管理端页面内按角色参数控制显示)。
- 工单列表展示操作人员权限范围内的全部应急工单记录。
**交互说明:**
- 页面加载即自动跳转,无需用户操作。
---
### 3. 通话记录(call-record.html
![页面截图](screenshots/call-record.jpg)
**功能说明:**
角色路由页,自动跳转至管理端"通话记录"页面(operator 视图)。
**路由目标:** `../admin/center-call-record.html?role=operator`
**业务规则:**
- 管理端承载通话记录的筛选、列表、导出与明细跳转能力。
- 通话记录与应急工单联动,用于应急过程复盘与追踪。
- 操作人员可在通话记录中新建应急工单(管理端页面内按角色参数控制显示)。
**交互说明:**
- 页面加载即自动跳转,无需用户操作。
---
### 4. 大病就医(serious-illness.html
![页面截图](screenshots/serious-illness.jpg)
**功能说明:**
角色路由页,自动跳转至管理端"大病就医"页面(operator 视图)。
**路由目标:** `../admin/center-serious-illness.html?role=operator`
**业务规则:**
- 管理端承载大病就医预约单的筛选、状态管理、详情查看等能力。
- 操作人员在该视图中承接员工端预约后续处理(如确认、派驻场人员跟进)。
**交互说明:**
- 页面加载即自动跳转,无需用户操作。
---
### 5. 值班小组(duty-group.html
![页面截图](screenshots/duty-group.jpg)
**功能说明:**
角色路由页,自动跳转至管理端"值班小组"页面(排班配置,operator 视图)。
**路由目标:** `../admin/center-schedule.html?role=operator`
**业务规则:**
- 管理端页面支持按应急中心维护周排班,人员包含操作人员与专业人员。
- 专业人员不具备值班小组维护权限,仅操作人员 / 管理员可编辑排班。
- 排班信息同步展示在"正在应急"页面右侧值班面板的日历与今日值班人员列表中。
**交互说明:**
- 页面加载即自动跳转,无需用户操作。
---
## 跨角色协同说明
- **员工端 → 操作人员:** 员工端通过拨打 120、应急视频、应急电话等方式发起求助后,由操作人员接入并创建 / 推进工单。
- **操作人员 ↔ 专业人员:** 操作人员负责调度与执行,专业人员在会话中给出救助意见;操作人员根据意见执行驻场派单与转运安排。
- **操作人员 ↔ 管理端(admin):** 工单台账、通话记录、大病就医、排班配置统一由管理端页面承载,操作人员通过 `role=operator` 视图进行业务处理。
- **操作人员 ↔ 驻场人员:** 操作人员通过"驻场派单"下发任务,驻场人员线下执行救助、接送与挂号等动作,并反馈完成状态。
Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

@@ -0,0 +1,211 @@
# 应急就医(专业人员)产品需求文档
> **所属端**:Web 管理端(专业人员视角)
> **模块路径**`web-admin/emergency-dispatch/professional/`
> **最后更新**2026-04-28
## 模块概述
专业人员端用于承接操作人员转接的应急求助会话,负责与求助员工实时沟通、提供专业医学判断、输出救助意见,并在处置完成后结束应急。该目录下共 1 个独立页面 + 1 个路由导航页,专业人员的核心职责是”医学判断与救助意见输出”,不承担驻场派单与救护车调度职责。
### 页面导航结构
```text
应急就医(专业人员)
├── 正在应急(实时处置主界面)
│ ├── 查看员工求助位置(地图弹窗)
│ ├── 救助意见(填写弹窗 → 聊天区卡片消息)
│ └── 结束应急(确认弹窗 → 结束结果态)
└── 应急工单(路由页)→ 管理端应急工单页(professional 权限视图)
```
### 应急处置状态流转图
```mermaid
stateDiagram-v2
[*] --> 进行中: 专业人员进入”正在应急”
进行中 --> 意见已提交: 点击”救助意见”并提交
意见已提交 --> 进行中: 继续沟通
进行中 --> 已结束: 点击”结束应急”并确认
已结束 --> [*]
```
### 跨角色协作时序图
```mermaid
sequenceDiagram
participant E as 员工端
participant O as 操作人员
participant P as 专业人员
participant A as 管理端台账
E->>O: 发起应急求助(视频/电话/120)
O->>P: 拉起会话并共享患者信息
P->>E: 实时沟通,了解症状
P->>P: 填写救助意见
P->>E: 发送救助意见卡片消息
O->>O: 参考救助意见执行驻场派单/救护车支援
P->>A: 留存专业意见与处置结论
P->>P: 确认处置完成,点击结束应急
P->>A: 工单状态更新为已结束
```
---
## 页面清单
| 序号 | 二级菜单 | 页面/弹窗 | 文件 | 类型 |
|------|----------|-----------|------|------|
| 1 | 正在应急 | 正在应急主界面 | professional.html | 页面 |
| 1-1 | 正在应急 | 查看员工求助位置 | professional.html | 弹窗 |
| 1-2 | 正在应急 | 填写救助意见 | professional.html | 弹窗 |
| 1-3 | 正在应急 | 结束应急确认 | professional.html | 弹窗 |
---
## 逐页说明
## 一、实时处置
### 1. 正在应急(professional.html
![页面截图](screenshots/professional.jpg)
**功能说明:**
- 专业人员核心工作台,采用”左侧联系人列表(320px)+ 中间对话区 + 右侧值班面板(320px)”三栏布局。
- 支持与求助员工实时文字沟通、查看员工定位与周边医疗资源、输出专业救助意见、结束应急处置。
- 专业人员不承担驻场派单与救护车调度职责,核心操作为”救助意见”与”结束应急”。
**业务规则:**
- 当前应急会话绑定员工身份、所属单位、工单上下文。
- 左侧联系人列表展示所有进行中的应急会话,选中态蓝色高亮,未读消息显示角标。
- 中间对话区顶部展示患者姓名、性别、年龄、员工编号、单位·部门等基本信息。
- 救助意见提交后,在聊天区追加”专业救助意见”卡片消息,消息不可撤回。
- 结束应急需二次确认;确认后结束按钮置灰禁用,底部操作按钮行与发送输入区隐藏,页面进入”已结束结果态”。
- 已结束状态下不可继续发送消息,救助意见按钮同步置灰禁用。
**交互说明:**
- 点击左侧联系人卡片,切换当前会话,中间对话区与右侧值班面板随之更新。
- 点击”查看员工求助位置”,打开地图弹窗,支持资源 Tab 切换与电话拨号。
- 点击”救助意见”(primary 蓝色按钮),打开填写救助意见弹窗。
- 点击”结束应急”(danger 红色按钮),打开结束应急确认弹窗。
- 右侧值班面板展示当日/当月统计数据、月视图日历(含排班标记)、今日值班人员列表。
**页面布局说明:**
左侧联系人列表:
- 顶部搜索框(搜索员工姓名)+ 刷新按钮
- 联系人卡片:头像(姓氏首字)、姓名、性别年龄、最后消息时间、最后消息预览、未读消息角标
- 选中态蓝色高亮背景
中间对话区:
- 顶部患者信息栏:患者姓名 + 基本信息(性别 年龄 | 员工编号 | 单位·部门)
- 顶部操作按钮组:救助意见(primary 蓝色)、结束应急(danger 红色)
- 聊天消息区:时间分隔线、左侧员工消息气泡(蓝色边框白底)、右侧专业人员消息气泡(蓝色底白字)
- 底部操作按钮行:查看员工求助位置
- 发送输入框:工具栏(表情 / 图片 / 文件 / 语音通话 / 视频通话)+ 文本输入区(placeholder”输入医嘱或指导信息...”)+ 发送按钮
右侧值班面板:
- 标题”值班信息”
- 统计卡片 2×2 网格:当日应急人数(红色)、当月应急人数(蓝色)、应急响应及时率(绿色)、应急任务完成率(橙色)
- 月视图日历:年月切换、星期行、日期网格(今日蓝色圆形高亮、有排班日期带蓝色圆点)
- 今日值班人员列表:头像(姓氏首字)、姓名(含职称)、角色标签(操作人员 / 专业人员)
---
### 弹窗1:查看员工求助位置(地图弹窗)
**功能说明:**
- 展示求助员工的实时定位、详细地址、求助时间与坐标信息。
- 展示患者周边医疗资源,支持按资源类型 Tab 切换,辅助专业人员判断就近转运方案。
**业务规则:**
- 地图区域为模拟静态地图,包含网格背景、道路线、建筑物标注、患者位置红色脉冲标记、各类资源标记点。
- 资源按类型分组:油田医院 / 合作医院 / 医疗点 / 救护车 / AED / 急救包,共 6 个 Tab。
- 点击资源卡片,对应地图标记高亮;点击地图标记,对应资源卡片高亮并滚动到可视区域。
- 联系电话为可拨号链接(`tel:` 协议)。
**交互说明:**
- 弹窗采用左右两栏布局。
- 左侧上方:模拟地图区域,展示患者位置红色脉冲标记与各类资源标记点。
- 左侧下方:患者信息(患者姓名·性别·年龄、详细地址、求助时间、坐标信息)。
- 右侧:附近医疗资源面板,Tab 切换资源类型,资源卡片展示图标、名称、所属单位、距离、联系电话、地址。
- 点击右上角关闭按钮或弹窗遮罩外区域,关闭弹窗。
---
### 弹窗2:填写救助意见
**功能说明:**
- 专业人员在会话过程中,基于员工症状描述与沟通内容,填写专业医学救助意见。
- 提交后,救助意见以卡片消息形式追加到聊天区,供员工端与操作人员查阅。
**业务规则:**
- 救助意见为必填字段,不可为空提交;为空时前端高亮提示。
- 提交成功后,聊天区追加”专业救助意见”卡片消息:绿色渐变头部 + 绿色背景内容区 + 底部医生信息和提交时间。
- 同一会话可多次提交救助意见,每次提交均追加新卡片消息。
- 已结束的应急会话不可再提交救助意见(按钮置灰禁用)。
**交互说明:**
- 弹窗顶部展示求助员工基本信息卡片(灰色背景,两列网格):求助员工(姓名·性别·年龄)、员工编号、所属单位(单位·部门)、求助时间。
- 表单区域:救助意见(必填,多行文本域,placeholder”请输入专业救助意见,包括现场急救指导、用药建议、转运注意事项等”)。
- 底部按钮:取消(关闭弹窗,不保存)/ 提交意见(校验必填后提交)。
- 提交成功后弹窗关闭,聊天区滚动到最新消息。
**救助意见表单字段:**
| 字段名 | 类型 | 必填 | 校验规则 |
|--------|------|------|----------|
| 救助意见 | 多行文本域 | 是 | 不可为空;建议包含现场急救指导、用药建议、转运注意事项 |
---
### 弹窗3:结束应急确认
**功能说明:**
- 专业人员确认本次应急处置已完成后,通过二次确认弹窗触发工单结束流程。
- 防止误操作导致会话提前关闭。
**业务规则:**
- 确认结束后,工单状态由”进行中”转为”已结束”。
- 结束应急按钮置灰禁用(灰色背景、灰色文字、`cursor: not-allowed`),不可再次触发。
- 底部操作按钮行(含”查看员工求助位置”)隐藏。
- 发送输入区(工具栏 + 文本框 + 发送按钮)隐藏。
- 聊天区追加”本次应急已结束”卡片消息(红色图标 + 结束时间)。
- 已结束状态下,救助意见按钮同步置灰禁用。
**交互说明:**
- 弹窗内容:警告图标(黄色圆形感叹号)+ 提示文字”请确定本次应急求助已完成后再执行该操作”。
- 底部按钮:取消(关闭弹窗,不执行结束)/ 确认结束(danger 红色,执行结束流程)。
- 点击”确认结束”后,弹窗关闭,页面进入已结束结果态。
---
## 二、导航说明
顶部导航栏”应急工单”为直接链接(非独立路由页文件),点击后跳转至管理端应急工单页面 `../admin/center-work-order.html?role=professional`,专业人员在该视图中可查看与自身相关的应急工单记录,不具备新增工单与编辑权限。
---
## 与操作人员端的核心差异
| 对比项 | 操作人员端 | 专业人员端 |
|--------|-----------|-----------|
| 导航菜单数量 | 5 项(正在应急 / 应急工单 / 通话记录 / 大病就医 / 值班小组) | 2 项(正在应急 / 应急工单) |
| 核心职责 | 调度执行(派单、救护车、工单闭环) | 医学判断(救助意见输出) |
| 驻场派单按钮 | 有 | 无 |
| 救护车支援按钮 | 有 | 无 |
| 救助信息按钮 | 有(补充小结 + 救助结果) | 无 |
| 救助意见按钮 | 无 | 有(primary 蓝色) |
| 聊天输入框 placeholder | 输入消息... | 输入医嘱或指导信息... |
| 独立页面数量 | 1 个独立页面 + 4 个路由页 | 1 个独立页面 + 1 个路由页 |
---
## 跨角色协同说明
- **员工端 → 专业人员:** 员工端发起应急求助后,由操作人员接入并将会话转接给专业人员,专业人员通过聊天区与员工实时沟通。
- **专业人员 ↔ 操作人员:** 专业人员负责”判断与建议”,操作人员负责”调度与执行”(驻场派单、救护车支援、过程记录);两端共享同一工单上下文,专业人员的救助意见卡片在操作人员侧同步可见。
- **专业人员 ↔ 管理端(admin):** 工单台账统一由管理端页面承载,专业人员通过 `role=professional` 视图查看相关工单记录,不具备工单编辑与派单权限。
- **专业人员 → 员工端:** 救助意见卡片消息在聊天区实时可见,员工端可同步接收专业医学指导。
- **闭环关系:** 工单通常由员工端发起或操作人员创建,专业人员输出救助意见,操作人员完成派单与处置;专业人员在确认医学处置完成后可独立执行”结束应急”操作。
Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB