focus-product-extractor2
Version:
Extract product information from chat/order data
304 lines (294 loc) • 9.61 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.InputAdapter = void 0;
var _messageTypes = require("../constants/messageTypes.js");
/**
* 输入适配器类,负责将原始输入数据转换为统一格式
*/
class InputAdapter {
/**
* 解析输入数据
* @param {Object} input - 输入数据对象
* @returns {Array} 解析后的消息数组
*/
parse(input) {
// 基础参数校验
if (!input || typeof input !== 'object') {
return [];
}
const {
scene,
rawData,
platform,
shopId
} = input;
if (!(rawData !== null && rawData !== void 0 && rawData.messages)) {
return [];
}
// 订单场景暂不支持
if (scene === 'order') {
console.log('TODO: scene:order类型的功能正在开发中');
return [];
// if (!rawData.orderItems) {
// return [];
// }
// return rawData.orderItems.map(order => ({...order, platform, shopId, scene}));
}
// 为每条消息添加平台和店铺信息
const processedMessages = rawData.messages.map(msg => ({
...msg,
platform,
shopId
}));
// console.log('[InputAdapter] Processed messages:', processedMessages);
return this._parseMessages(processedMessages, scene);
}
/**
* 创建基础消息结构
* @private
*/
_createBaseMsg(msg, scene) {
var _msg$message, _msg$message2;
return {
platform: msg.platform,
shopId: msg.shopId,
sender: msg.sender,
timestamp: msg.timestamp,
scene,
messageType: (_msg$message = msg.message) === null || _msg$message === void 0 ? void 0 : _msg$message.type,
messageSubType: (_msg$message2 = msg.message) === null || _msg$message2 === void 0 ? void 0 : _msg$message2.sub_type,
...this._extractIds(msg.message)
};
}
/**
* 从消息中提取ID字段(skuId, spuId, orderId)
* @private
*/
_extractIds(message) {
if (!message) return {};
return {
...(message.sku_id && {
skuId: message.sku_id
}),
...(message.spu_id && {
spuId: message.spu_id
}),
...(message.order_id && {
orderId: message.order_id
})
};
}
/**
* 解析消息数组
* @private
*/
_parseMessages(messages, scene) {
// console.log('[InputAdapter] Parsing messages, count:', messages.length);
return messages.map(msg => {
var _message$text, _message$file;
const baseMsg = this._createBaseMsg(msg, scene);
const message = msg.message || {};
// console.log('\n[InputAdapter] Processing message:', JSON.stringify(message));
// console.log('[InputAdapter] Processing message cardMsg:', JSON.stringify(message.card_msg));
// console.log('[InputAdapter] Processing message type:', message.sub_type);
switch (message.sub_type) {
case _messageTypes.MESSAGE_SUB_TYPES.TEXT:
return {
...baseMsg,
text: ((_message$text = message.text) === null || _message$text === void 0 ? void 0 : _message$text.content) || ''
};
case _messageTypes.MESSAGE_SUB_TYPES.IMAGE:
return this._handleImageMessage(baseMsg, message);
case _messageTypes.MESSAGE_SUB_TYPES.VIDEO:
return this._handleVideoMessage(baseMsg, message);
case _messageTypes.MESSAGE_SUB_TYPES.CARD:
return this._handleCardMessage(baseMsg, message);
case _messageTypes.MESSAGE_SUB_TYPES.FILE:
return {
...baseMsg,
fileUrl: (_message$file = message.file) === null || _message$file === void 0 ? void 0 : _message$file.url
};
case _messageTypes.MESSAGE_SUB_TYPES.BUYER_ENTER:
return this._handleBuyerEnterMessage(baseMsg, message);
case _messageTypes.MESSAGE_SUB_TYPES.TRANSFER_OUT:
case _messageTypes.MESSAGE_SUB_TYPES.TRANSFER_IN:
return this._handleTransferMessage(baseMsg, message);
case _messageTypes.MESSAGE_SUB_TYPES.VOICE:
return this._handleVoiceMessage(baseMsg, message);
default:
return baseMsg;
}
});
}
_handleImageMessage(baseMsg, message) {
var _message$image, _message$image2, _message$image3;
return {
...baseMsg,
imageUrl: (_message$image = message.image) === null || _message$image === void 0 ? void 0 : _message$image.url,
imageSize: {
width: (_message$image2 = message.image) === null || _message$image2 === void 0 ? void 0 : _message$image2.width,
height: (_message$image3 = message.image) === null || _message$image3 === void 0 ? void 0 : _message$image3.height
}
};
}
_handleVideoMessage(baseMsg, message) {
var _message$video, _message$video2, _message$video3;
return {
...baseMsg,
videoUrl: (_message$video = message.video) === null || _message$video === void 0 ? void 0 : _message$video.url,
videoSize: {
width: (_message$video2 = message.video) === null || _message$video2 === void 0 ? void 0 : _message$video2.width,
height: (_message$video3 = message.video) === null || _message$video3 === void 0 ? void 0 : _message$video3.height
}
};
}
_handleCardMessage(baseMsg, message) {
const cardData = this._parseCardMessage(message.card_msg);
const result = {
...baseMsg,
cardData
};
if (cardData !== null && cardData !== void 0 && cardData.some(item => item.type === _messageTypes.CARD_MESSAGE_TYPES.WARE)) {
return {
...result,
...this._extractIds(message)
};
}
return result;
}
_handleBuyerEnterMessage(baseMsg, message) {
const enterMsg = message.buyer_enter_msg || {};
return {
...baseMsg,
from: enterMsg.from,
...this._extractIds(enterMsg)
};
}
_handleTransferMessage(baseMsg, message) {
const transferInfo = message.transfer_out || message.transfer_in || {};
return {
...baseMsg,
transferInfo: {
from: transferInfo.from,
...(transferInfo.from_spin && {
fromSpin: transferInfo.from_spin
}),
...(transferInfo.to_spin && {
toSpin: transferInfo.to_spin
}),
...(transferInfo.pin && {
pin: transferInfo.pin
}),
orderId: transferInfo.order_id,
platGoodsId: transferInfo.plat_goods_id
}
};
}
_handleVoiceMessage(baseMsg, message) {
var _message$voice, _message$voice2;
return {
...baseMsg,
voiceUrl: (_message$voice = message.voice) === null || _message$voice === void 0 ? void 0 : _message$voice.url,
duration: (_message$voice2 = message.voice) === null || _message$voice2 === void 0 ? void 0 : _message$voice2.duration
};
}
/**
* 解析卡片消息
* @private
*/
_parseCardMessage(cardMsg) {
if (!(cardMsg !== null && cardMsg !== void 0 && cardMsg.data)) {
return null;
}
// console.log('[InputAdapter] Parsing card message:', cardMsg);
return cardMsg.data.flatMap(item => {
// 1标题卡片
if (item.header) {
return {
type: _messageTypes.CARD_MESSAGE_TYPES.HEADER,
icon: item.header.icon,
title: item.header.title
};
}
// 2文本内容卡片
if (item.content) {
return {
type: _messageTypes.CARD_MESSAGE_TYPES.CONTENT,
icon: item.content.icon,
title: item.content.title,
content: item.content.content
};
}
// 3图片卡片
if (item.img) {
return {
type: _messageTypes.CARD_MESSAGE_TYPES.IMAGE,
url: item.img.url
};
}
// 4商品卡片
if (item.wares) {
return item.wares.list.map(ware => ({
type: _messageTypes.CARD_MESSAGE_TYPES.WARE,
title: ware.title,
desc: ware.desc,
price: ware.price,
num: ware.num,
imageUrl: ware.image_url,
wareUrl: ware.ware_url
}));
}
// 5订单卡片
if (item.orders) {
return item.orders.list.map(order => ({
type: _messageTypes.CARD_MESSAGE_TYPES.ORDER,
title: order.title,
desc: order.desc,
extraInfo: order.extra_info,
price: order.price,
num: order.num,
imageUrl: order.image_url,
wareUrl: order.ware_url
}));
}
//6 信息列表卡片
if (item.infos) {
return item.infos.list.map(info => ({
type: _messageTypes.CARD_MESSAGE_TYPES.INFO,
title: info.title,
desc: info.desc
}));
}
// 进度卡片
if (item.progress) {
return item.progress.list.map(progress => ({
type: _messageTypes.CARD_MESSAGE_TYPES.PROGRESS,
title: progress.title,
icon: progress.icon,
color: progress.color,
desc: progress.desc,
tip: progress.tip
}));
}
// 优惠券卡片
if (item.coupons) {
return item.coupons.list.map(coupon => ({
type: _messageTypes.CARD_MESSAGE_TYPES.COUPON,
name: coupon.name,
discount: coupon.discount,
quota: coupon.quota,
tag: coupon.tag,
beginTime: coupon.begin,
endTime: coupon.end,
imageUrl: coupon.image_url,
status: coupon.status
}));
}
return null;
}).filter(Boolean);
}
}
exports.InputAdapter = InputAdapter;
var _default = exports.default = new InputAdapter();