160 lines
4.7 KiB
JavaScript
160 lines
4.7 KiB
JavaScript
import { req } from '@/common/js/index.js';
|
||
import { websocketConfig } from '@/config/websocket.js';
|
||
|
||
const PREFIX = '/newApi/doctor-chat-wx/';
|
||
|
||
/** 根据挂号解析/创建 IM 房间 */
|
||
export function getChatRoomByRegisterApi(register_id) {
|
||
return req.request({
|
||
url: `${PREFIX}chat-room-by-register`,
|
||
method: 'GET',
|
||
data: { register_id }
|
||
});
|
||
}
|
||
|
||
/** 分页拉取房间历史消息(POST,与患者端一致) */
|
||
export function getMessagesByRoomIdApi(params) {
|
||
return req.request({
|
||
url: `${PREFIX}messages-by-room-id`,
|
||
method: 'POST',
|
||
data: params
|
||
});
|
||
}
|
||
|
||
/** 挂号卡片信息(message_type=10 等) */
|
||
export function getChatRegisterInfoApi(params) {
|
||
return req.request({
|
||
url: `${PREFIX}chat-register-info`,
|
||
method: 'GET',
|
||
data: params
|
||
});
|
||
}
|
||
|
||
/** 房间是否结束问诊等 */
|
||
export function getRoomStatusApi(params) {
|
||
return req.request({
|
||
url: `${PREFIX}get-room-status`,
|
||
method: 'GET',
|
||
data: params
|
||
});
|
||
}
|
||
|
||
/** 聊天图片/语音上传 */
|
||
export function uploadChatFileApi(params) {
|
||
return req.request({
|
||
url: `${PREFIX}upload-chat-file`,
|
||
type: 'upload',
|
||
method: 'POST',
|
||
filePath: params.filePath,
|
||
name: params.name || 'file',
|
||
formData: params.formData || {}
|
||
});
|
||
}
|
||
|
||
function bearerAuthHeader() {
|
||
let t = uni.getStorageSync('token') || '';
|
||
if (!t) return {};
|
||
t = String(t).replace(/^Bearer\s+/i, '').trim();
|
||
if (!t) return {};
|
||
return { Authorization: `Bearer ${t}` };
|
||
}
|
||
|
||
function unwrapLaravelInner(res) {
|
||
if (res == null) return null;
|
||
if (res.result !== undefined && res.result !== null) return res.result;
|
||
if (res.data && res.data.result !== undefined) return res.data.result;
|
||
return res.data != null ? res.data : res;
|
||
}
|
||
|
||
/** 判断 send-to-user 是否成功(兼容 Gin 与历史 Laravel jok) */
|
||
export function isSendToUserResponseOk(res) {
|
||
if (res == null) return false;
|
||
if (res.wakaryReqToReject) return false;
|
||
if (res.status === 'success') return true;
|
||
const c = Number(res.code);
|
||
const ec = Number(res.errcode);
|
||
if (!Number.isNaN(c) && c !== 0) return false;
|
||
if (!Number.isNaN(ec) && ec !== 0) return false;
|
||
const inner = unwrapLaravelInner(res);
|
||
if (inner && typeof inner.status_code === 'number' && inner.status_code !== 200) return false;
|
||
const body = inner && inner.body;
|
||
if (body && body.error) return false;
|
||
if (body && body.status === 'failure') return false;
|
||
return true;
|
||
}
|
||
|
||
/** 发送失败提示文案 */
|
||
export function sendToUserFailMessage(res, err) {
|
||
if (err && (err.msg || err.message)) return String(err.msg || err.message);
|
||
if (res && res.msg) return String(res.msg);
|
||
if (res && res.error) return String(res.error);
|
||
const inner = unwrapLaravelInner(res);
|
||
const body = inner && inner.body;
|
||
if (body && body.error) return String(body.error);
|
||
return '发送失败';
|
||
}
|
||
|
||
/** 从成功响应中取消息 id(Go 可能暂无,依赖 WS 合并) */
|
||
export function extractSendToUserMessageId(res) {
|
||
if (!res || typeof res !== 'object') return null;
|
||
if (res.id != null) return res.id;
|
||
if (res.message_id != null) return res.message_id;
|
||
const inner = unwrapLaravelInner(res);
|
||
const body = inner && inner.body;
|
||
const mid =
|
||
body && (body.id != null ? body.id : body.message_id != null ? body.message_id : null);
|
||
if (mid != null) return mid;
|
||
if (inner && inner.id != null) return inner.id;
|
||
if (res.data && (res.data.id != null || res.data.message_id != null)) {
|
||
return res.data.id != null ? res.data.id : res.data.message_id;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* 直连 Go IM:POST /api/send-to-user(与 config/websocket.js 中 WS 同基址)
|
||
* 不使用 PHP req 封装,避免加密与响应形态不一致。
|
||
*/
|
||
export function sendToUserHttpApi(params) {
|
||
const url = websocketConfig.getSendToUserApiUrl();
|
||
if (!url) {
|
||
return Promise.reject({ msg: '未配置 IM 服务地址' });
|
||
}
|
||
const data = { ...params };
|
||
if (data.platform == null && websocketConfig.user && websocketConfig.user.platform) {
|
||
data.platform = websocketConfig.user.platform;
|
||
}
|
||
return new Promise((resolve, reject) => {
|
||
uni.request({
|
||
url,
|
||
method: 'POST',
|
||
data,
|
||
header: {
|
||
'Content-Type': 'application/json',
|
||
...bearerAuthHeader()
|
||
},
|
||
success: (r) => {
|
||
const sc = Number(r.statusCode) || 0;
|
||
const payload = r.data;
|
||
const obj = payload && typeof payload === 'object' ? payload : null;
|
||
if (sc < 200 || sc >= 300) {
|
||
const msg =
|
||
(obj && (obj.error || obj.message)) != null
|
||
? String(obj.error || obj.message)
|
||
: `HTTP ${sc}`;
|
||
reject({ msg, data: payload, statusCode: sc });
|
||
return;
|
||
}
|
||
if (obj && obj.error != null && obj.error !== '') {
|
||
reject({ msg: String(obj.error), data: payload, statusCode: sc });
|
||
return;
|
||
}
|
||
resolve(obj || {});
|
||
},
|
||
fail: (err) => {
|
||
reject({ msg: (err && (err.errMsg || err.message)) || '网络错误', err });
|
||
}
|
||
});
|
||
});
|
||
}
|