diff --git a/wai-server/core/handler/whatsappHandler.js b/wai-server/core/handler/whatsappHandler.js index bccd86f..c465642 100644 --- a/wai-server/core/handler/whatsappHandler.js +++ b/wai-server/core/handler/whatsappHandler.js @@ -2,13 +2,14 @@ const generateId = require('../../utils/generateId.util'); const { domain, name: domainName } = require('../../config').server; +const {second} = require('../../config').database; const whatsappEvents = require('../emitter'); const createAsyncQueueProcessor = require('../emitter/queueProcessor'); const { callWebhook } = require('../webhook'); const { sessionStore } = require('..'); const { createWhatsApp } = require('../../core/baileys'); const { updateConnection, addCurrentConnection, resetConnection, getConnection } = require('../../services/connections.service'); -const { getOutboundMessage, upsertOutboundMessage, createOutboundMessage } = require('../../services/outbound_messages.service'); +const { getOutboundMessageByIdOrExternalId, upsertOutboundMessage, createOutboundMessage } = require('../../services/outbound_messages.service'); const { objectMapper, pick, isEmpty, omitEmpty } = require('../../utils/commons.util'); const { logger, getUserLogger } = require('../../utils/logger.util'); const { DbData, waiContentToDB, uploadMediaFile, ctxToSendBuilder, ctxToDB } = require('../../helper/wai.msg.helper'); @@ -212,8 +213,9 @@ const setupMessageHandler = async () => { const now = new Date(new Date().getTime() + 60 * 60 * 1000).toISOString(); const savedId = uniqueMsgId(messageData); - const targetUpsert = messageData.externalId ? { actionId: messageData.externalId } : { id: savedId }; - const savedMsg = await getOutboundMessage(targetUpsert); + // const targetUpsert = messageData.externalId ? { actionId: messageData.externalId } : { id: savedId }; + const targetUpsert = [{ actionId: messageData.externalId }, { id: savedId }]; + const savedMsg = await getOutboundMessageByIdOrExternalId(targetUpsert); const bixFields = pick(savedMsg, ['actionId', 'externalId']); const savedTimeFields = pick(savedMsg, Object.values(timeField)); logger.info('message evt\n', eventName, messageData, savedMsg); @@ -229,9 +231,13 @@ const setupMessageHandler = async () => { const pusher = { customerProfile_id: waiMessage.customerProfile?.id || '', customerProfile_name: waiMessage.customerProfile?.name || '' }; const record = objectMapper(waiMessage, { from: 'from', to: 'to', status: 'msg_status', type: 'msgtype' }, false); const waiContentFieldsToDB = messageData.type ? waiContentToDB(messageData) : {}; - // 是否空数据. 存储有数据的事件原文 - const upsertMsgOrigin = !isEmpty(omitEmpty(waiContentFieldsToDB)) || isEmpty(savedMsg); - const msgOrigin = upsertMsgOrigin ? { message_origin: JSON.stringify(messageData) } : {}; + // // 是否空数据. 存储有数据的事件原文 + // const upsertMsgOrigin = !isEmpty(omitEmpty(waiContentFieldsToDB)) || isEmpty(savedMsg); + // const msgOrigin = upsertMsgOrigin ? { message_origin: JSON.stringify(messageData) } : {}; + // 合并数据原文 + const msgOriginObj = Object.assign({}, JSON.parse(savedMsg?.message_origin || '{}'), messageData); + const msgOrigin = { message_origin: JSON.stringify(msgOriginObj) }; + if (isEmpty(savedMsg.IVADS_link) && ['image', 'sticker', 'audio', 'video', 'document'].includes(messageData.type)) { // 存储文件 const filePath = messageData[messageData.type].filePath; diff --git a/wai-server/services/outbound_messages.service.js b/wai-server/services/outbound_messages.service.js index 78d0db4..d0e5766 100644 --- a/wai-server/services/outbound_messages.service.js +++ b/wai-server/services/outbound_messages.service.js @@ -5,14 +5,22 @@ const { domain, name } = require('../config').server; const { objectMapper, pick, isEmpty } = require('../utils/commons.util'); const initModels = require('../models/init-models'); -const Sequelize = db.sequelize; +const { sequelize: Sequelize, Op } = db; +// const Sequelize = db.sequelize; const models = initModels(Sequelize); const OutboundModelModel = models.outbound_messages; -const getOutboundMessage = async msg => { +const getOutboundMessageByIdOrExternalId = async whereOr => { + let whereCondition = {}; + if (Array.isArray(whereOr) && whereOr.length > 0) { + whereCondition = { [Op.or]: whereOr }; + } else { + whereCondition = whereOr; + } const r = await OutboundModelModel.findOne({ - where: msg, + where: whereCondition, + order: [['wamid', 'DESC']], }); return r?.toJSON() || {}; }; @@ -46,4 +54,4 @@ const upsertOutboundMessage = async (data, where = {}) => { return instance.toJSON(); }; -module.exports = { getOutboundMessage, createOutboundMessage, upsertOutboundMessage }; +module.exports = { getOutboundMessageByIdOrExternalId, createOutboundMessage, upsertOutboundMessage };