193 lines
6.2 KiB
JavaScript
193 lines
6.2 KiB
JavaScript
// utils/message-sender.js
|
|
const app = getApp();
|
|
import { formatDate } from '../static/lib/utils';
|
|
import request from './request.js';
|
|
import { getFreshImUser } from './im-user.js';
|
|
import { sendGoEasyImage } from './chatImageSend.js';
|
|
|
|
function isCrossPlatformOrder(isCross) {
|
|
return isCross === 1 || isCross === true || String(isCross) === '1';
|
|
}
|
|
|
|
function sendGroupMessage(options) {
|
|
const { msgData, onSuccess, onSendStart } = options;
|
|
const role = app.globalData.currentRole || 'normal';
|
|
const uid = wx.getStorageSync('uid');
|
|
const freshUser = getFreshImUser(app, role, uid);
|
|
msgData.currentUser = {
|
|
...msgData.currentUser,
|
|
name: freshUser.name,
|
|
avatar: freshUser.avatar,
|
|
};
|
|
|
|
const { type, currentUser, groupId, orderId, isCross, groupName, groupAvatar } = msgData;
|
|
|
|
const localMsg = buildLocalMessage(msgData);
|
|
if (onSendStart) onSendStart(localMsg);
|
|
|
|
if (!isCrossPlatformOrder(isCross)) {
|
|
sendViaSDK(localMsg, currentUser, groupId, onSuccess, orderId, isCross, groupName, groupAvatar);
|
|
return;
|
|
}
|
|
sendViaBackend(localMsg, currentUser, groupId, orderId, onSuccess);
|
|
}
|
|
|
|
function buildLocalMessage(data) {
|
|
const { type, text, filePath, orderPayload, currentUser, groupId } = data;
|
|
const now = Date.now();
|
|
const base = {
|
|
messageId: `local-${type}-${now}`,
|
|
timestamp: now,
|
|
senderId: currentUser.id,
|
|
groupId: groupId,
|
|
senderData: {
|
|
name: currentUser.name,
|
|
avatar: currentUser.avatar
|
|
},
|
|
status: 'sending',
|
|
formattedTime: formatDate(now)
|
|
};
|
|
|
|
if (type === 'text') return { ...base, type: 'text', payload: { text } };
|
|
if (type === 'image') return { ...base, type: 'image', payload: { url: filePath }, imageUrl: filePath };
|
|
if (type === 'order') return { ...base, type: 'order', payload: orderPayload };
|
|
return base;
|
|
}
|
|
|
|
function sendViaSDK(localMsg, currentUser, groupId, onSuccess, orderId, isCross, groupName, groupAvatar) {
|
|
const groupMeta = (app.globalData.groupInfoMap && app.globalData.groupInfoMap[groupId]) || {};
|
|
const toData = {
|
|
name: groupName || groupMeta.name || '订单群聊',
|
|
avatar: groupAvatar || groupMeta.avatar || currentUser.avatar,
|
|
orderId: orderId || groupMeta.orderId,
|
|
isCross: isCross || 0,
|
|
dashouGoEasyId: groupMeta.dashouGoEasyId,
|
|
partnerGoEasyId: groupMeta.partnerGoEasyId,
|
|
dashouYonghuid: groupMeta.dashouYonghuid,
|
|
partnerYonghuid: groupMeta.partnerYonghuid,
|
|
dashouName: groupMeta.dashouName,
|
|
partnerName: groupMeta.partnerName,
|
|
dashouAvatar: groupMeta.dashouAvatar,
|
|
partnerAvatar: groupMeta.partnerAvatar,
|
|
orderDesc: groupMeta.orderDesc,
|
|
orderZhuangtai: groupMeta.orderZhuangtai,
|
|
};
|
|
|
|
const to = {
|
|
type: wx.GoEasy.IM_SCENE.GROUP,
|
|
id: groupId,
|
|
data: toData
|
|
};
|
|
|
|
if (localMsg.type === 'image') {
|
|
sendGoEasyImage({
|
|
file: localMsg.payload.url,
|
|
to,
|
|
onSuccess: (res) => {
|
|
const serverMsg = res && res.content;
|
|
if (serverMsg && onSuccess) {
|
|
onSuccess(localMsg.messageId, 'success', serverMsg);
|
|
} else if (onSuccess) {
|
|
onSuccess(localMsg.messageId, 'success');
|
|
}
|
|
},
|
|
onFailed: () => { if (onSuccess) onSuccess(localMsg.messageId, 'failed'); }
|
|
});
|
|
return;
|
|
}
|
|
|
|
let message;
|
|
if (localMsg.type === 'text') {
|
|
message = wx.goEasy.im.createTextMessage({ text: localMsg.payload.text, to });
|
|
} else if (localMsg.type === 'order') {
|
|
message = wx.goEasy.im.createCustomMessage({ type: 'order', payload: localMsg.payload, to });
|
|
}
|
|
|
|
wx.goEasy.im.sendMessage({
|
|
message,
|
|
onSuccess: (res) => {
|
|
if (onSuccess) onSuccess(localMsg.messageId, 'success', res && res.content);
|
|
},
|
|
onFailed: () => { if (onSuccess) onSuccess(localMsg.messageId, 'failed'); }
|
|
});
|
|
}
|
|
|
|
function sendViaBackend(localMsg, currentUser, groupId, orderId, onSuccess) {
|
|
const apiUrl = '/dingdan/kptxxfs';
|
|
|
|
const uid = wx.getStorageSync('uid');
|
|
const role = app.globalData.currentRole || 'normal';
|
|
const identityType = role === 'dashou' ? 'dashou' : (role === 'shangjia' ? 'shangjia' : 'boss');
|
|
const prefixMap = { normal: 'Boss', dashou: 'Ds', shangjia: 'Sj', guanshi: 'Gs', zuzhang: 'Zz' };
|
|
const prefix = prefixMap[role] || 'Boss';
|
|
const senderId = prefix + uid;
|
|
const freshUser = getFreshImUser(app, role, uid);
|
|
const params = {
|
|
orderId: orderId,
|
|
groupId: groupId,
|
|
identityType: identityType,
|
|
senderId: senderId,
|
|
senderName: freshUser.name || currentUser.name || ('用户' + uid),
|
|
senderAvatar: freshUser.avatar || currentUser.avatar || (app.globalData.ossImageUrl + app.globalData.morentouxiang),
|
|
messageType: localMsg.type,
|
|
messageId: localMsg.messageId,
|
|
timestamp: localMsg.timestamp
|
|
};
|
|
|
|
if (localMsg.type === 'text' || localMsg.type === 'order') {
|
|
if (localMsg.type === 'text') {
|
|
params.text = localMsg.payload.text;
|
|
} else {
|
|
params.orderPayload = localMsg.payload;
|
|
}
|
|
request({
|
|
url: apiUrl,
|
|
method: 'POST',
|
|
data: params
|
|
}).then((res) => {
|
|
if (res && res.data && res.data.code === 200) {
|
|
if (onSuccess) onSuccess(localMsg.messageId, 'success');
|
|
} else {
|
|
if (onSuccess) onSuccess(localMsg.messageId, 'failed');
|
|
}
|
|
}).catch(() => {
|
|
if (onSuccess) onSuccess(localMsg.messageId, 'failed');
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (localMsg.type === 'image') {
|
|
const token = wx.getStorageSync('token');
|
|
const formData = {
|
|
...params,
|
|
senderInfo: JSON.stringify({ id: senderId, name: params.senderName, avatar: params.senderAvatar })
|
|
};
|
|
wx.uploadFile({
|
|
url: app.globalData.apiBaseUrl + apiUrl,
|
|
filePath: localMsg.payload.url,
|
|
name: 'file',
|
|
formData: formData,
|
|
header: {
|
|
'Authorization': 'Bearer ' + (token || '')
|
|
},
|
|
success(res) {
|
|
try {
|
|
const data = JSON.parse(res.data);
|
|
if (data.code === 200) {
|
|
if (onSuccess) onSuccess(localMsg.messageId, 'success');
|
|
} else {
|
|
if (onSuccess) onSuccess(localMsg.messageId, 'failed');
|
|
}
|
|
} catch (e) {
|
|
if (onSuccess) onSuccess(localMsg.messageId, 'failed');
|
|
}
|
|
},
|
|
fail() {
|
|
if (onSuccess) onSuccess(localMsg.messageId, 'failed');
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = { sendGroupMessage };
|