diff --git a/src/entities/Article.ts b/src/entities/Article.ts index 2dd01c6b0..206aeaf93 100644 --- a/src/entities/Article.ts +++ b/src/entities/Article.ts @@ -17,6 +17,7 @@ export interface Schema extends EntityShape { author: String<32>; //作者 abstract?: Text; //摘要 content?: Text; //正文 + url?: Text; // 外部连接 files: Array; //封面图 sign: String<32>; //唯一标志 } @@ -51,6 +52,7 @@ const locale: LocaleDef< content: '正文', files: '封面图', iState: '状态', + url: '外部链接', entity: '关联对象', entityId: '关联对象id', sign: '唯一标志', diff --git a/src/entities/MessageSent.ts b/src/entities/MessageSent.ts index 954b08f61..347ad6433 100644 --- a/src/entities/MessageSent.ts +++ b/src/entities/MessageSent.ts @@ -5,7 +5,7 @@ import { LocaleDef } from 'oak-domain/lib/types/Locale'; import { Index, ActionDef } from 'oak-domain/lib/types'; export interface Schema extends EntityShape { - channel: 'public' | 'jPush' | 'jim' | 'mp' | 'gsm', + channel: 'wechat' | 'jPush' | 'jim' | 'mp' | 'sms', data: Object, message: Message, data1: Object, @@ -49,11 +49,11 @@ const locale: LocaleDef; + entityId: String<64>; + name: String<32>; + description: Text; + config: WechatPublicConfig; +}; + + +const indexes: Index[] = [ + //索引 + { + name: 'index_name', + attributes: [ + { + name: 'name', + }, + ], + }, + { + name: 'index_entity', + attributes: [ + { + name: 'entity', + }, + { + name: 'entityId', + } + ], + }, +]; + +const locale: LocaleDef< + Schema, + '', + '', + { + } +> = { + zh_CN: { + attr: { + name: '名称', + entity: '对象名称', + entityId: '对象Id', + description: '描述', + config: '配置', + }, + }, +}; diff --git a/src/triggers/message.ts b/src/triggers/message.ts index 5b7b01ee2..d8ff75061 100644 --- a/src/triggers/message.ts +++ b/src/triggers/message.ts @@ -1,4 +1,4 @@ -import { generateNewId } from 'oak-domain/lib/utils/uuid'; +import { generateNewId, generateNewIdAsync } from 'oak-domain/lib/utils/uuid'; import { Trigger, CreateTrigger, UpdateTrigger } from 'oak-domain/lib/types/Trigger'; import { EntityDict } from '../general-app-domain/EntityDict'; import { CreateOperationData as CreateMessageData } from '../general-app-domain/Message/Schema'; @@ -6,8 +6,9 @@ import { assert } from 'oak-domain/lib/utils/assert'; import { RuntimeCxt } from '../types/RuntimeCxt'; import { BackendRuntimeContext } from '../context/BackendRuntimeContext'; import { Schema as MessageSentSchema } from '../entities/MessageSent'; -import { generateNewIdAsync } from 'oak-domain/lib/utils/uuid'; import { MessagePropsToSms, MessagePropsToWechat } from '../types/Message'; +import { WechatMpConfig, WechatPublicConfig, WebConfig } from '../general-app-domain/Application/Schema'; +import { initialState } from '@uiw/react-amap'; let SmsCoverter: MessagePropsToSms | undefined; let WechatConverter: MessagePropsToWechat | undefined; @@ -22,94 +23,107 @@ export function registerMessagePropsConverter(converter: { } -async function tryAddMessageSent(message: CreateMessageData, channel: MessageSentSchema['channel'], context: BackendRuntimeContext) { - // const { systemId, type } = message; - // const disperse = MessageDisperse && MessageDisperse[systemId] && MessageDisperse[systemId][type] && MessageDisperse[systemId][type][channel]; - // if (!disperse) { - // return 0; - // } - - // // 有配置也未必一定能发,比如说用户没有注册手机号,则无法发gsm - // const data = disperse(message); - // if (!data) { - // return 0; - // } - - // const messageSent = { - // messageId: message.id, - // iState: 'sending', - // channel, - // }; - // await context.operate('messageSent', { - // id: await generateNewIdAsync(), - // action: 'create', - // data: { - // id: await generateNewId(), - // ...messageSent, - // } as EntityDict['messageSent']['OpSchema'], - // }, {}); +async function tryAddMessageSent(message: CreateMessageData, channel: string, context: BackendRuntimeContext) { + if (!WechatConverter) { + return 0; + } + const { systemId, props, type } = message; + const [application] = await context.select( + 'application', + { + data: { + id: 1, + name: 1, + config: 1, + type: 1, + systemId: 1, + style: 1, + }, + filter: { + type: 'wechatPublic', + systemId, + }, + }, + {} + ); + const config2 = application.config as WechatPublicConfig; + const appId = config2.appId; + let dispersedData; + switch (channel) { + case 'weChat': { + dispersedData = WechatConverter(type, props, appId); + break; + } + default: { + break; + } + } + if (!dispersedData) { + return 0; + } + await context.operate('messageSent', { + id: await generateNewIdAsync(), + action: 'create', + data: { + messageId: message.id, + data: dispersedData, + channel, + }, + }, {}); return 1; } -async function addMessageSent(message: CreateMessageData, context: BackendRuntimeContext) { +export async function addMessageSent(message: CreateMessageData, context: BackendRuntimeContext) { const { weight } = message; switch (weight) { case 'high': { // 高权重的,所有渠道一起推 const result = await Promise.all([ - tryAddMessageSent(message, 'public', context), - tryAddMessageSent(message, 'jPush', context), - tryAddMessageSent(message, 'jim', context), - tryAddMessageSent(message, 'mp', context), - tryAddMessageSent(message, 'gsm', context), + tryAddMessageSent(message, 'wechat', context), + tryAddMessageSent(message, 'sms', context), ]); return result.reduce((a, b) => a || b); } case 'medium': { - // 中权重的,先推三次免费渠道,失败了再推收费渠道 + // 中权重的,先推免费渠道,失败了再推收费渠道 const count = await context.count( 'messageSent', { filter: { messageId: message.id, - } + }, }, {}, ); if (count < 1) { const result = await Promise.all([ - tryAddMessageSent(message, 'public', context), - tryAddMessageSent(message, 'jPush', context), - tryAddMessageSent(message, 'jim', context), - tryAddMessageSent(message, 'mp', context), + tryAddMessageSent(message, 'wechat', context), ]); const count2 = result.reduce((a, b) => a || b); - if (count2 === 0) { - return await tryAddMessageSent(message, 'gsm', context); + if (count2 > 0) { + return count2; } - return count2; + return await tryAddMessageSent(message, 'sms', context); } - return await tryAddMessageSent(message, 'gsm', context); + return await tryAddMessageSent(message, 'sms', context); } case 'low': { // 低权重的,只推免费渠道 const result = await Promise.all([ - tryAddMessageSent(message, 'public', context), - tryAddMessageSent(message, 'jPush', context), - tryAddMessageSent(message, 'jim', context), - tryAddMessageSent(message, 'mp', context), - ]); - return result.reduce((a, b) => a || b); - } - case 'data': { - // 透传数据的,只推JPush - const result = await Promise.all([ - tryAddMessageSent(message, 'jPush', context), - tryAddMessageSent(message, 'jim', context), + tryAddMessageSent(message, 'wechat', context), ]); return result.reduce((a, b) => a || b); } + // case 'data': { + + // // 透传数据的,只推JPush + // const result = await Promise.all([ + // tryAddMessageSent(message, 'jPush', context), + // tryAddMessageSent(message, 'jim', context), + // ]); + // return result.reduce((a, b) => a || b); + // } default: { assert(false); } @@ -126,7 +140,14 @@ const triggers: Trigger[] = [ fn: async ({ operation }, context, params) => { const { data, filter } = operation; const fn = async (messageData: CreateMessageData) => { - await addMessageSent(messageData, context as BackendRuntimeContext); + const result = await addMessageSent(messageData, context as BackendRuntimeContext); + if (result === 0) { + Object.assign( + messageData, { + iState: 'fail', + } + ) + } } if (data instanceof Array) { assert('不存在一对多的情况') diff --git a/src/triggers/messageSent.ts b/src/triggers/messageSent.ts new file mode 100644 index 000000000..4a2798eed --- /dev/null +++ b/src/triggers/messageSent.ts @@ -0,0 +1,72 @@ +import { Trigger, CreateTrigger, UpdateTrigger } from 'oak-domain/lib/types/Trigger'; +import { EntityDict } from '../general-app-domain/EntityDict'; +import { CreateOperationData as CreateMessageSentData } from '../general-app-domain/MessageSent/Schema'; +import { assert } from 'oak-domain/lib/utils/assert'; +import { RuntimeCxt } from '../types/RuntimeCxt'; +import { addMessageSent } from './message'; +import { BackendRuntimeContext } from '../context/BackendRuntimeContext'; +import { WechatMpConfig, WechatPublicConfig, WebConfig } from '../general-app-domain/Application/Schema'; +import { WechatSDK } from 'oak-external-sdk'; + +async function sendMessage(messageSentData: CreateMessageSentData, context: BackendRuntimeContext) { + const { data, channel, messageId } = messageSentData; + const [message] = await context.select( + 'message', + + { + data: { + id: 1, + systemId: 1, + }, + filter: { + id: messageId, + }, + }, + {} + ); + const [application] = await context.select( + 'application', + { + data: { + id: 1, + name: 1, + config: 1, + type: 1, + systemId: 1, + style: 1, + }, + filter: { + type: 'wechatPublic', + systemId: message.systemId, + }, + }, + {} + ); + const config2 = application.config as WechatPublicConfig; + const appId = config2.appId; + +} + +const triggers: Trigger[] = [ + { + name: '当创建messageSent后,业务提交后再进行推送', + entity: 'messageSent', + action: 'create', + when: 'commit', + strict: 'makeSure', + fn: async ({ operation }, context, params) => { + const { data, filter } = operation; + const fn = async (messageSentData: CreateMessageSentData) => { + await sendMessage(messageSentData, context as BackendRuntimeContext); + } + if (data instanceof Array) { + assert('不存在一对多的情况') + } + else { + await fn(data); + } + return 0; + } + } as CreateTrigger, +]; +export default triggers; \ No newline at end of file