oak-general-business/es/utils/sms/index.js

120 lines
3.6 KiB
JavaScript

import { assert } from 'oak-domain/lib/utils/assert';
const SmsDict = {};
/**
* 注入一个其它发送短信类
* @param clazz
*/
export function registerSms(clazz) {
const instance = new clazz();
SmsDict[instance.name] = instance;
}
export function getSms(origin) {
assert(SmsDict.hasOwnProperty(origin));
return SmsDict[origin];
}
export function getOrigin() {
return Object.keys(SmsDict);
}
export async function sendSms(options, context) {
const { messageType, origin, templateName, mobile, templateParam } = options;
assert(messageType || (origin && templateName));
if (origin && templateName) {
const [smsTemplate] = await context.select('smsTemplate', {
data: {
id: 1,
origin: 1,
systemId: 1,
templateCode: 1,
},
filter: {
origin,
templateName,
},
}, {});
if (!smsTemplate) {
return {
success: false,
res: `${origin}短信渠道未配置「${templateName}」模板`,
};
}
try {
const instance = getSms(origin);
const result = await instance.sendSms({
mobile,
templateParam,
smsTemplate,
}, context);
return result;
}
catch (err) {
return {
success: false,
res: err?.message,
};
}
}
else {
const systemId = context.getSystemId();
const messageTypeSmsTemplateList = await context.select('messageTypeSmsTemplate', {
data: {
id: 1,
type: 1,
templateId: 1,
template: {
id: 1,
origin: 1,
systemId: 1,
templateCode: 1,
},
},
filter: {
template: {
systemId,
},
type: messageType,
},
}, {});
// todo 多渠道短信的负载均衡,目前按照顺序发
let resList = {};
if (messageTypeSmsTemplateList.length > 0) {
for (const messageTypeSmsTemplate of messageTypeSmsTemplateList) {
try {
const instance = getSms(messageTypeSmsTemplate.template.origin);
const result = await instance.sendSms({
mobile,
templateParam,
smsTemplate: messageTypeSmsTemplate.template,
}, context);
Object.assign(resList, {
[messageTypeSmsTemplate.template.origin]: result.res,
});
if (result.success) {
return {
success: true,
res: resList,
};
}
}
catch (err) {
Object.assign(resList, {
[messageTypeSmsTemplate.template.origin]: err?.message,
});
}
}
return {
success: false,
res: {
message: `所有短信渠道发送「${messageType}」模板均失败`,
errorList: resList,
},
};
}
else {
return {
success: false,
res: `所有短信渠道未配置「${messageType}」模板`,
};
}
}
}