import { Get, Post } from './http.js' import { useAppStore } from '@/store/app.js' import CryptoJS from 'crypto-js' // AES 加密配置 const AES_KEY = import.meta.env.VITE_AES_KEY || '3a7b9c2d5e8f1a4b6c9d8e7f5a3b2c1d' // 从环境变量读取密钥,默认值作为 fallback const ENCRYPTION_ENABLED = true // 加密开关,默认关闭 /** * AES 加密函数(ECB 模式,PKCS7 填充,Base64 输出) * @param {Object} data - 需要加密的数据 * @returns {string} Base64 编码的密文 */ export function encryptPayload(data) { const key = CryptoJS.enc.Utf8.parse(AES_KEY) const dataStr = JSON.stringify(data) const encrypted = CryptoJS.AES.encrypt(dataStr, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, }) return encrypted.toString() } /** * 判断事件类型是否需要加密 * @param {string} eventType - 事件类型 * @returns {boolean} */ function shouldEncrypt(eventType) { return ENCRYPTION_ENABLED && (eventType === 'CARD_ACTION' || eventType === 'PAGE_ACTION') } const getCurrentISOTime = () => { return new Date().toISOString() } const getTimestamp = () => { return Date.now() } // 获取 app store 实例(延迟初始化,避免循环依赖) function getAppStore() { return useAppStore() } // 创建会话 export function createSessions(data) { const appStore = getAppStore() // appStore.setUserInfo({ channel: data.channel, code: data.subject.code }) return Post('/yyfw/api/interactive-sessions', data).then((res) => { if (res.data && res.data.token) { sessionStorage.setItem('token', res.data.token) console.log('Token stored in sessionStorage:', res.data.token) } return res }) } // 事件发送 export function getSessions() { const appStore = getAppStore() let data = { eventId: `flow-start_${getTimestamp()}${Math.floor(Math.random() * 9000) + 1000}_0001`, eventType: 'FLOW_START', sessionId: appStore.sessionId, idempotentKey: `flow-start-${getTimestamp()}${Math.floor(Math.random() * 9000) + 1000}`, payload: {}, } return Post(`/yyfw/api/interactive-sessions/${appStore.sessionId}/events`, data) } // 通用事件发送 export function eventFunction(payload, text) { const appStore = getAppStore() payload.cardType = appStore.cardType // 存储 certNo 到 sessionStorage if (payload.actionPayload && payload.actionPayload.certNo) { sessionStorage.setItem('certNo', payload.actionPayload.certNo) console.log('CertNo stored in sessionStorage:', payload.actionPayload.certNo) } let obj = { eventId: `card_action_${getTimestamp()}${Math.floor(Math.random() * 9000) + 1000}_CARD_ACTION`, eventType: 'CARD_ACTION', channel: appStore.channel, userId: appStore.userId, currentStage: appStore.currentStage || 'SESSION_INIT', currentNode: appStore.currentNode, idempotentKey: appStore.idempotentKey, occurredAt: getCurrentISOTime(), payload: import.meta.env.VITE_USER_NODE_ENV === 'development' ? payload : undefined, displayText: text, } // 判断是否需要加密 if (shouldEncrypt('CARD_ACTION')) { console.log('加密前:', payload) obj.encryptedPayload = encryptPayload(payload) } else { console.log('不加密:', payload) obj.payload = payload } return Post(`/yyfw/api/interactive-sessions/${appStore.sessionId}/events`, obj) } // 事件重新发送 export function reEventFunction(obj) { const appStore = getAppStore() return Post(`/yyfw/api/interactive-sessions/${appStore.sessionId}/events`, obj) } // 图片事件发送 export function imgEventFunction(payload) { const appStore = getAppStore() payload.cardType = appStore.cardType // 存储 certNo 到 sessionStorage if (payload.actionPayload && payload.actionPayload.certNo) { sessionStorage.setItem('certNo', payload.actionPayload.certNo) console.log('CertNo stored in sessionStorage:', payload.actionPayload.certNo) } let obj = { eventId: `page_action_${getTimestamp()}${Math.floor(Math.random() * 9000) + 1000}_PAGE_ACTION`, eventType: 'PAGE_ACTION', channel: appStore.channel, userId: appStore.userId, currentStage: appStore.currentStage || 'SESSION_INIT', currentNode: appStore.currentNode, idempotentKey: '', occurredAt: getCurrentISOTime(), payload: import.meta.env.VITE_USER_NODE_ENV === 'development' ? payload : undefined, } // 判断是否需要加密 if (shouldEncrypt('CARD_ACTION')) { console.log('加密前:', payload) obj.encryptedPayload = encryptPayload(payload) } else { console.log('不加密:', payload) obj.payload = payload } return Post(`/yyfw/api/interactive-sessions/${appStore.sessionId}/events`, obj) } // page事件发送 export function eventPageFunction(payload, text) { const appStore = getAppStore() payload.cardType = appStore.cardType // 存储 certNo 到 sessionStorage if (payload.actionPayload && payload.actionPayload.certNo) { sessionStorage.setItem('certNo', payload.actionPayload.certNo) console.log('CertNo stored in sessionStorage:', payload.actionPayload.certNo) } let obj = { eventId: `page_action_${getTimestamp()}${Math.floor(Math.random() * 9000) + 1000}_PAGE_ACTION`, eventType: 'PAGE_ACTION', channel: appStore.channel, userId: appStore.userId, currentStage: appStore.currentStage || 'SESSION_INIT', currentNode: appStore.currentNode, idempotentKey: '', occurredAt: getCurrentISOTime(), payload: import.meta.env.VITE_USER_NODE_ENV === 'development' ? payload : undefined, displayText: text, } // 判断是否需要加密 if (shouldEncrypt('PAGE_ACTION')) { console.log('加密前:', payload) obj.encryptedPayload = encryptPayload(payload) } else { console.log('不加密:', payload) obj.payload = payload } return Post(`/yyfw/api/interactive-sessions/${appStore.sessionId}/events`, obj) } // 用户输入:统一复用 liics 迁移后的发送动作。 // 该动作在机器人模式下调用 /liics_api/semantic/qaChat,人工模式下走原有 WebSocket。 export function messageSend(text, options = {}) { const appStore = getAppStore() return appStore.sendingRobot({ reqAndResType: '1', msgText: text, msgSource: appStore.manualService, quoteData: options.quoteData || null, }) } // 获取出险人选择列表(userStr 由 SSE 下发) export function getInsuredList(userStr) { return Get(`/yyfw/api/select/query`, { userStr }) } // 获取医院列表 export function getHospitals(text) { const appStore = getAppStore() return Get(`/yyfw/api/accident/hospitals?keyword=${text}&sfFlag=${appStore.sfFlag}`) } // 根据录入的意外类型获取意外原因(点击意外原因调用) export function getAccidentReasons(remark) { if (remark) { return Get(`/yyfw/api/accident/accidentReasons?remark=${remark}`) } else { return Get(`/yyfw/api/accident/accidentReasons`) } } // 校验事故日期 export function checkDate(data) { return Post(`/yyfw/api/accident/checkDate`, data) } // 离开项目埋点 export function leaveProject() { const appStore = getAppStore() return Post(`/yyfw/api/interactive-sessions/${appStore.sessionId}/exit`, {}) } // 获取服务器时钟 export function getServerTime() { return Get(`/yyfw/api/interactive-sessions/server-time`, {}) } // 上报网络耗时监控数据 export function reportNetworkMetrics(data) { return Post(`/yyfw/api/interactive-sessions/network-metrics`, data) } // 查询协议 export function queryProtocol() { return Get(`/yyfw/api/authprotocol/query`, {}) }