Files

160 lines
4.7 KiB
JavaScript
Raw Permalink Normal View History

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 '发送失败';
}
/** 从成功响应中取消息 idGo 可能暂无,依赖 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 IMPOST /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 });
}
});
});
}