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.
 
 
 
customAgent/src/utils/api.js

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`, {})
}