feat: 审批流程模块 (T审批A审批)

- 新增 backend/app/api/approval.py 审批API
- 前端H5支持发起审批、审批操作
- 添加审批卡片弹窗组件
- 路由注册审批模块
This commit is contained in:
Simon
2026-06-15 09:32:41 +08:00
parent 64d6812ec3
commit 93ba41ed79
29 changed files with 6584 additions and 0 deletions
+47
View File
@@ -73,6 +73,12 @@ export const useConversationStore = defineStore('conversation', () => {
/** 审批流程链接列表 */
const approvalLinks = ref<ApprovalLink[]>([])
/** 审批卡片弹窗是否显示(关键词触发) */
const approvalCardVisible = ref<boolean>(false)
/** 触发审批卡片的关键词文本 */
const approvalCardTriggerText = ref<string>('')
/** 软件下载列表 */
const softwareDownloads = ref<SoftwareDownload[]>([])
@@ -359,6 +365,13 @@ export const useConversationStore = defineStore('conversation', () => {
return
}
// 检查是否包含审批关键词,如果包含则先弹出卡片
const hasApprovalKeyword = checkApprovalKeywords(content)
if (hasApprovalKeyword) {
console.log('[Store] 检测到审批关键词,弹窗后仍发送消息')
// 审批弹窗显示,但不阻止消息发送
}
// ========================================================================
// 步骤1:乐观更新 - 立即添加临时消息到列表
// ========================================================================
@@ -597,6 +610,35 @@ export const useConversationStore = defineStore('conversation', () => {
}
}
// 审批关键词列表(静态配置,后续可从API获取)
const APPROVAL_KEYWORDS = ['申请', '资源', '设备', '电脑', '笔记本']
/** 检查文本是否包含审批关键词,触发审批卡片弹窗 */
function checkApprovalKeywords(text: string): boolean {
const lowerText = text.toLowerCase()
const hasKeyword = APPROVAL_KEYWORDS.some((kw) => lowerText.includes(kw))
if (hasKeyword) {
approvalCardTriggerText.value = text
approvalCardVisible.value = true
console.log('[Store] 检测到审批关键词,触发卡片弹窗')
}
return hasKeyword
}
/** 关闭审批卡片弹窗 */
function closeApprovalCard(): void {
approvalCardVisible.value = false
approvalCardTriggerText.value = ''
}
/** 显示审批卡片弹窗(快捷按钮触发) */
function showApprovalCard(triggerText: string = ''): void {
approvalCardTriggerText.value = triggerText
approvalCardVisible.value = true
}
/**
* 加载软件下载列表
* 从后端获取所有可下载的软件列表
@@ -817,6 +859,8 @@ export const useConversationStore = defineStore('conversation', () => {
agentOnline,
assistantPanelVisible,
approvalLinks,
approvalCardVisible,
approvalCardTriggerText,
softwareDownloads,
lastMessageId,
initialized,
@@ -844,6 +888,9 @@ export const useConversationStore = defineStore('conversation', () => {
stopPolling,
shakeAgent,
fetchApprovalLinks,
checkApprovalKeywords,
closeApprovalCard,
showApprovalCard,
fetchSoftwareDownloads,
toggleAssistantPanel,
switchToConversation,