| | |
| | | import { ref, onMounted, onUnmounted, nextTick, watch, computed } from 'vue' |
| | | import request from '@/utils/request' |
| | | import * as echarts from 'echarts' |
| | | import { Cpu, User, Plus, Timer, Delete, ChatDotSquare, VideoPause, Upload, Document, Close, ShoppingCart, Promotion, RefreshRight } from '@element-plus/icons-vue' |
| | | import { Cpu, User, Plus, Timer, Delete, ChatDotSquare, VideoPause, Upload, Document, Close, Promotion, RefreshRight } from '@element-plus/icons-vue' |
| | | import { ElMessage } from 'element-plus' |
| | | import { builtInAssistants, generalAssistant } from './assistants' |
| | | |
| | | const props = defineProps({ |
| | | assistants: { |
| | |
| | | } |
| | | }) |
| | | |
| | | const builtInAssistants = [ |
| | | { |
| | | key: 'general', |
| | | label: '待办助理', |
| | | title: '待办智能助理', |
| | | tooltip: '待办助手', |
| | | icon: Cpu, |
| | | apiBase: '/xiaozhi', |
| | | storageKey: 'ai_chat_uuid', |
| | | placeholder: '请输入您的问题... (Enter 发送, Shift+Enter 换行)', |
| | | welcomeMessage: '你好', |
| | | description: '我可以回答你的问题,为你提供业务数据解读信息、处理建议和辅助决策支持。', |
| | | allowFileUpload: true, |
| | | emptySessionText: '暂无历史会话' |
| | | }, |
| | | { |
| | | key: 'purchase', |
| | | label: '采购助理', |
| | | title: '采购智能助理', |
| | | tooltip: '采购智能助理', |
| | | icon: ShoppingCart, |
| | | apiBase: '/purchase-ai', |
| | | storageKey: 'purchase_ai_chat_uuid', |
| | | placeholder: '请输入采购问题... (Enter 发送, Shift+Enter 换行)', |
| | | welcomeMessage: '你好', |
| | | description: '我可以协助你分析采购订单、到货进度、供应商表现和付款情况,帮助你快速定位采购异常。', |
| | | allowFileUpload: true, |
| | | allowMultipleFileUpload: true, |
| | | fileAnalyzeUrl: '/purchase-ai/analyze-files', |
| | | emptySessionText: '暂无采购会话' |
| | | } |
| | | ] |
| | | |
| | | const assistants = computed(() => props.assistants?.length ? props.assistants : builtInAssistants) |
| | | const selectedAssistantKey = ref(props.defaultAssistant || assistants.value[0]?.key || 'general') |
| | | const currentAssistant = computed(() => assistants.value.find(item => item.key === selectedAssistantKey.value) || assistants.value[0] || builtInAssistants[0]) |
| | | const showAssistantSwitch = computed(() => assistants.value.length > 1) |
| | | const assistantQuickPromptMap = { |
| | | general: [ |
| | | '我当前有哪些审批待办需要处理?', |
| | | '帮我列出今天新增的审批待办。', |
| | | '当前待我审批的单据,按时间倒序列出来。', |
| | | '我发起的审批里,哪些还在处理中?', |
| | | '查询流程编号 XXX 的审批详情。', |
| | | '流程编号 XXX 现在卡在哪个审批节点?当前审批人是谁?', |
| | | '帮我查看流程编号 XXX 的审批流转记录。', |
| | | '近7天我的审批待办统计情况怎么样?', |
| | | '本月我的审批中,通过、驳回、处理中各有多少?', |
| | | '近30天各类型审批数量分布是什么?', |
| | | '帮我审批通过流程编号 XXX,备注“同意”。', |
| | | '帮我驳回流程编号 XXX,备注“请补充说明”。', |
| | | '撤销我刚刚对流程编号 XXX 的审批操作。', |
| | | '帮我修改流程编号 XXX 的备注为“已补充附件”。', |
| | | '删除我发起的流程编号 XXX。' |
| | | ], |
| | | purchase: [ |
| | | '本月采购金额排名前十的物料有哪些?', |
| | | '哪些采购订单还未入库?', |
| | | '最近7天供应商到货异常有哪些?', |
| | | '帮我统计待付款采购单', |
| | | '列出本月采购退货情况' |
| | | ] |
| | | } |
| | | const quickPromptLimit = 3 |
| | | const quickPromptStart = ref(0) |
| | | const quickPrompts = computed(() => { |
| | |
| | | if (Array.isArray(assistant.quickPrompts) && assistant.quickPrompts.length) { |
| | | return assistant.quickPrompts |
| | | } |
| | | return assistantQuickPromptMap[assistant.key] || assistantQuickPromptMap.general |
| | | return generalAssistant.quickPrompts || [] |
| | | }) |
| | | const displayedQuickPrompts = computed(() => { |
| | | const prompts = quickPrompts.value || [] |