import axios from 'axios'
|
import { getAccessToken } from '@/utils/auth'
|
|
/**
|
* 【2026-11-05 起:本文件已无调用方】
|
* ---------------------------------------------------
|
* 业务改为「退出登录**不释放**工位」(一人多工位/多端登录:一台退出不能清掉另一台的岗位),
|
* 释放工位改为三种明确途径:
|
* ① 医生点「离座」;② 闭诊统一清空;③ 管理员「清空工位」/ 接班医生「接管」。
|
* 本工具函数保留(后端 /ecg/doctor/release-my-beds 也保留),仅用于运维/管理侧需要时手动调用。
|
*
|
* ---------- 以下为原注释 ----------
|
* 手动「退出登录」时释放诊室工位。
|
*
|
* 背景
|
* ----
|
* 医生在「诊室选择」(`roomselect`) 页选好床位后即**占用**该床位
|
* (后端写在 `clinic_room.doc_id` / `status`)。
|
* 若医生不点「离座」而直接退出系统,床位会一直显示被占用,其他医生无法使用。
|
*
|
* 【重要变更(本次)】只保留「手动退出登录」这一条路径
|
* ---------------------------------------------------------------
|
* 原先覆盖 4 条路径:手动退出、空闲 30 分钟自动登出、令牌失效(401)、`pagehide`(刷新/关页)。
|
* 实测问题:后三条会把「令牌到期 / 刷新页面 / 离开一会儿」误当成「医生离座」,
|
* 导致工位被清空 —— 医生回来看到工作台只剩只读、并提示"请重新就坐",而工位已变空闲。
|
*
|
* 现在的口径:
|
* · **只有手动「退出登录」**(以及诊室选择页的手动「离座」)才释放工位;
|
* · 空闲超时(`useIdleLogout`)只要求重新输密码,工位保留;
|
* · 401 / 刷新令牌失败只清本地凭证,工位保留;
|
* · 不再注册 `pagehide` 兜底(刷新页面不应该丢工位);
|
* · 医生真的下班忘离座的兜底:① 闭诊时系统统一清空当班工位;② 管理员「清空工位」。
|
*
|
* 为什么用**裸 axios** 而不是项目的 request
|
* ----------------------------------------
|
* 本函数可能在鉴权状态不稳时被调用,若走项目 request 的 401 拦截器,
|
* 会再次触发"刷新令牌失败 → 强制登出"的递归。裸 axios 不挂任何拦截器,天然断开这条链。
|
*
|
* 为什么用**服务端按 userId 反查**而不是前端传床位号
|
* ------------------------------------------------
|
* 本函数运行时前端缓存可能已被清理(拿不到 roomId/bedNo);且前端缓存若与库中不一致
|
* 就会"释放不掉"。故后端提供无参接口 `/ecg/doctor/release-my-beds`,按当前登录用户
|
* 反查其占用的全部床位。前端只需带上令牌。
|
*
|
* ⚠️ 本文件**不要 import `@/config/axios/config`**:避免与 service.ts 形成循环依赖。
|
* 这里直接用同一个环境变量拼接,效果等价且无环。
|
*
|
* 失败处理:本函数**永不抛异常**(退出流程不应因它而中断)。
|
*/
|
|
/** API 基础路径(与 `config/axios/config.ts` 的 base_url 计算方式一致,避免循环依赖) */
|
const BASE_URL = import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL
|
|
/** 保证同一轮退出只调用一次(多个退出路径可能同时触发) */
|
let releasing = false
|
|
export async function releaseBedOnExit(reason?: string): Promise<void> {
|
if (releasing) return
|
|
const token = getAccessToken()
|
if (!token) return // 无令牌 ⇒ 本来就没登录,无需释放
|
|
releasing = true
|
try {
|
await axios.post(
|
`${BASE_URL}/ecg/doctor/release-my-beds`,
|
{},
|
{
|
headers: { Authorization: 'Bearer ' + token },
|
timeout: 3000 // 退出流程不能久等
|
}
|
)
|
console.info('[release-bed] 已请求释放床位', reason ?? '')
|
} catch (e) {
|
// 静默失败:退出流程不应被阻塞(例如令牌已过期、网络中断)
|
console.warn('[release-bed] 释放床位失败(忽略)', reason ?? '', e)
|
} finally {
|
releasing = false
|
}
|
}
|