You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
243 lines
7.6 KiB
243 lines
7.6 KiB
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)
|
|
}
|
|
|
|
// 用户输入
|
|
export function messageSend(text) {
|
|
const appStore = getAppStore()
|
|
|
|
let obj = {
|
|
eventId: `card_action_${getTimestamp()}${Math.floor(Math.random() * 9000) + 1000}_USER_TEXT`,
|
|
eventType: 'USER_TEXT',
|
|
channel: appStore.channel,
|
|
userId: appStore.userId,
|
|
currentStage: appStore.currentStage || 'SESSION_INIT',
|
|
currentNode: appStore.currentNode,
|
|
idempotentKey: '',
|
|
payload: {
|
|
text,
|
|
},
|
|
occurredAt: getCurrentISOTime(),
|
|
displayText: text,
|
|
}
|
|
|
|
return Post(`/yyfw/api/interactive-sessions/${appStore.sessionId}/events`, obj)
|
|
}
|
|
|
|
// 获取出险人选择列表(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`, {})
|
|
} |