Files
X-Financial/web/src/views/scripts/travelReimbursementConversationSessionModel.js

295 lines
9.2 KiB
JavaScript
Raw Normal View History

import { isBudgetMonitorUser, isExecutiveUser, isPlatformAdminUser } from '../../utils/accessControl.js'
import {
GUIDED_ACTION_OPEN_TRAVEL_CALCULATOR,
GUIDED_ACTION_START_APPLICATION,
GUIDED_ACTION_START_REIMBURSEMENT,
GUIDED_ACTION_START_STATUS_QUERY
} from './travelReimbursementGuidedFlowModel.js'
export const SESSION_TYPE_EXPENSE = 'expense'
export const SESSION_TYPE_APPLICATION = 'application'
export const SESSION_TYPE_APPROVAL = 'approval'
export const SESSION_TYPE_KNOWLEDGE = 'knowledge'
export const SESSION_TYPE_BUDGET = 'budget'
export const SESSION_TYPE_STEWARD = 'steward'
export const ASSISTANT_SESSION_TYPES = [
SESSION_TYPE_STEWARD,
SESSION_TYPE_APPLICATION,
SESSION_TYPE_EXPENSE,
SESSION_TYPE_APPROVAL,
SESSION_TYPE_KNOWLEDGE,
SESSION_TYPE_BUDGET
]
export const ASSISTANT_SESSION_MODE_OPTIONS = [
{
key: SESSION_TYPE_STEWARD,
label: '小财管家',
icon: 'mdi mdi-account-tie-outline',
description: '统一拆解多任务、归集附件,并调度申请助手和报销助手'
},
{
key: SESSION_TYPE_APPLICATION,
label: '申请助手',
icon: 'mdi mdi-file-plus-outline',
description: '只处理费用申请、事前审批、申请材料和申请状态'
},
{
key: SESSION_TYPE_EXPENSE,
label: '报销助手',
icon: 'mdi mdi-receipt-text-plus-outline',
description: '只处理报销发起、票据识别、草稿归集和报销状态'
},
{
key: SESSION_TYPE_APPROVAL,
label: '审核助手',
icon: 'mdi mdi-clipboard-check-outline',
description: '只处理待审单据、风险解释、审批动作和审核意见'
},
{
key: SESSION_TYPE_KNOWLEDGE,
label: '财务知识助手',
icon: 'mdi mdi-book-open-page-variant-outline',
description: '只处理财务制度、标准规则、票据要求和政策解释'
},
{
key: SESSION_TYPE_BUDGET,
label: '预算编制助手',
icon: 'mdi mdi-calculator-variant-outline',
description: '帮助你进行预算编制与预算相关问题的整理'
}
]
export function canUseBudgetAssistantSession(user = null) {
return Boolean(isPlatformAdminUser(user) || isBudgetMonitorUser(user) || isExecutiveUser(user))
}
function canUseAssistantSessionType(sessionType, user = null) {
const normalized = String(sessionType || '').trim()
if (normalized === SESSION_TYPE_BUDGET) {
return canUseBudgetAssistantSession(user)
}
return true
}
export function filterAssistantSessionModes(sessionModes = [], user = null) {
return Array.isArray(sessionModes)
? sessionModes.filter((mode) => canUseAssistantSessionType(mode?.key, user))
: []
}
export function filterAssistantSessionTypes(sessionTypes = [], user = null) {
return Array.isArray(sessionTypes)
? sessionTypes.filter((sessionType) => canUseAssistantSessionType(String(sessionType || '').trim(), user))
: []
}
export function normalizeAssistantSessionType(sessionType, fallback = SESSION_TYPE_EXPENSE) {
const normalized = String(sessionType || '').trim()
if (ASSISTANT_SESSION_TYPES.includes(normalized)) {
return normalized
}
const fallbackType = String(fallback || '').trim()
return ASSISTANT_SESSION_TYPES.includes(fallbackType) ? fallbackType : SESSION_TYPE_EXPENSE
}
export function resolveAssistantSessionMode(sessionType) {
const normalized = normalizeAssistantSessionType(sessionType)
return ASSISTANT_SESSION_MODE_OPTIONS.find((item) => item.key === normalized) || ASSISTANT_SESSION_MODE_OPTIONS[1]
}
export const aiAvatar = '/assets/header.png'
export const userAvatar = '/assets/person.png'
export const SOURCE_LABELS = {
workbench: '来自个人工作台',
topbar: '来自发起报销',
application: '来自发起申请',
budget: '来自预算中心',
detail: '来自智能录入',
upload: '来自附件上传',
requests: '来自报销列表'
}
export const SCENARIO_LABELS = {
expense: '报销',
accounts_receivable: '应收',
accounts_payable: '应付',
budget: '预算',
knowledge: '知识',
unknown: '通用'
}
export const INTENT_LABELS = {
query: '查询',
explain: '解释',
compare: '对比',
risk_check: '风险检查',
draft: '信息核对',
operate: '动作请求'
}
export const FLOW_STEP_FALLBACKS = {
intent: {
title: '意图识别',
tool: 'IntentRecognizer',
runningText: '正在识别业务意图...',
completedText: '意图识别完成'
},
extraction: {
title: '信息提取',
tool: 'SemanticExtractor',
runningText: '正在提取时间、金额、费用类型和待补项...',
completedText: '信息提取完成'
},
ocr: {
title: '票据/OCR识别',
tool: 'OCRService',
runningText: '正在识别票据附件...',
completedText: '票据识别完成'
},
'expense-review-preview': {
title: '报销信息核对',
tool: 'user_agent.expense_review_preview',
runningText: '正在整理识别结果和右侧核对信息...',
completedText: '核对信息已整理'
},
'expense-claim-draft': {
title: '保存报销草稿',
tool: 'database.expense_claims.save_or_submit',
runningText: '正在把已确认信息保存为草稿...',
completedText: '草稿已保存'
},
'draft-risk-review': {
title: '草稿风险识别',
tool: 'RuleEngine',
runningText: '正在对草稿执行规则校验...',
completedText: '已完成草稿风险识别'
},
'application-submit-success': {
title: '申请单提交成功',
tool: 'ApplicationSubmit',
runningText: '正在提交费用申请...',
completedText: '申请单提交成功'
},
'attachment-association': {
title: '票据关联草稿',
tool: 'database.expense_claims.save_or_submit',
runningText: '正在把本次票据关联到已保存草稿...',
completedText: '票据已归集到草稿'
},
'expense-scene-selection': {
title: '报销场景确认',
tool: 'UserConfirmation',
runningText: '等待用户选择报销场景...',
completedText: '已进入场景选择,等待用户确认'
},
'expense-intent-confirmation': {
title: '报销意图确认',
tool: 'UserConfirmation',
runningText: '等待用户确认是否发起报销...',
completedText: '用户已确认报销意图'
}
}
export const ASSISTANT_DISPLAY_NAME = '财务助手'
export const EXPENSE_WELCOME_QUICK_ACTIONS = [
{
label: '快速发起报销',
action: GUIDED_ACTION_START_REIMBURSEMENT,
icon: 'mdi mdi-receipt-text-plus-outline'
},
{
label: '查询单据状态',
action: GUIDED_ACTION_START_STATUS_QUERY,
icon: 'mdi mdi-file-search-outline'
},
{
label: '差旅计算器',
action: GUIDED_ACTION_OPEN_TRAVEL_CALCULATOR,
icon: 'mdi mdi-calculator-variant-outline'
}
]
export const APPLICATION_WELCOME_QUICK_ACTIONS = [
{
label: '快速发起申请',
action: GUIDED_ACTION_START_APPLICATION,
icon: 'mdi mdi-file-plus-outline'
},
{
label: '查询申请状态',
prompt: '帮我查询我的费用申请单状态,筛选最近的 5 条记录。',
icon: 'mdi mdi-file-search-outline'
},
{
label: '申请材料清单',
prompt: '请告诉我发起费用申请通常需要准备哪些关键信息和附件。',
icon: 'mdi mdi-clipboard-text-search-outline'
}
]
export const APPROVAL_WELCOME_QUICK_ACTIONS = [
{
label: '待我审核',
prompt: '帮我查询当前待我审核的单据,筛选最近的 5 条记录。',
icon: 'mdi mdi-clipboard-list-outline'
},
{
label: '审核风险说明',
prompt: '帮我梳理待审核单据中需要重点关注的风险,并按高、中、低风险分类说明。',
icon: 'mdi mdi-alert-circle-outline'
},
{
label: '生成审核意见',
prompt: '请根据当前待审核单据的风险点,帮我生成一段专业、克制的审核意见草稿。',
icon: 'mdi mdi-text-box-edit-outline'
}
]
export const BUDGET_WELCOME_QUICK_ACTIONS = [
{
label: '预算编制查询',
prompt: '帮我查询当前部门本季度预算编制情况,重点看差旅、通信、招待费和办公用品。',
icon: 'mdi mdi-calculator-variant-outline'
},
{
label: '阈值风险检查',
prompt: '帮我检查当前预算的提醒阈值、告警阈值和风险阈值设置是否合理,并指出需要关注的费用类型。',
icon: 'mdi mdi-alert-decagram-outline'
},
{
label: '预算调整建议',
prompt: '请根据已发生、已占用和剩余预算,帮我整理下一轮预算调整建议。',
icon: 'mdi mdi-chart-box-plus-outline'
}
]
export const HOT_KNOWLEDGE_QUESTIONS = [
'差旅住宿标准按什么规则执行?',
'酒店超标后如何申请例外报销?',
'招待费报销需要哪些凭证?',
'发票抬头不一致还能报销吗?',
'电子发票验真失败怎么处理?',
'借款多久内需要冲销?',
'预算不足还能先提交报销吗?',
'会议费和招待费如何区分?',
'跨部门项目费用应该怎么归集?',
'员工退票手续费是否可以报销?'
]
export const FLOW_MISSING_SLOT_LABELS = {
expense_type: '报销类型',
customer_name: '客户名称',
time_range: '发生时间',
location: '地点',
merchant_name: '酒店/商户',
amount: '金额',
reason: '事由说明',
participants: '参与人员',
attachments: '票据附件'
}
let messageSeed = 0