feat: 增强知识库索引与设置页面模块化拆分

扩展知识库索引任务和 RAG 检索支持增量入库和文档去重,优
化本体检测和规则匹配精度,前端设置页面拆分为 LLM、邮件
和 Hermes 员工同步子面板并重构样式,新增日志详情组件和
知识入库日志模型,补充单元测试覆盖。
This commit is contained in:
caoxiaozhu
2026-05-22 23:47:28 +08:00
parent 88ff04bef8
commit 5b388d08c0
84 changed files with 10170 additions and 2599 deletions

View File

@@ -22,17 +22,17 @@ const DEFAULT_EXPENSE_TYPE_LABELS = {
travel: '差旅费',
hotel: '住宿费',
transport: '交通费',
meal: '费',
meal: '业务招待费',
meeting: '会务费',
entertainment: '业务招待费',
office: '办公费',
office: '办公用品费',
training: '培训费',
communication: '通讯费',
welfare: '福利费',
other: '其他费用'
}
export const TRANSPORT_KEYWORD_PATTERN = /交通|出行|打车|网约车|出租车|滴滴|车费|乘车|用车|叫车|约车|的士|车票|车资|地铁|公交|停车|过路费|通行费/
export const TRANSPORT_KEYWORD_PATTERN = /交通|市内交通|出行|打车|网约车|出租车|滴滴|车费|乘车|用车|叫车|约车|的士|车票|车资|地铁|公交|停车|过路费|通行费|高速费|油费/
const FLOW_INTENT_KEYWORDS = {
draft: ['报销', '报账', '草稿', '生成', '提交', '申请', '请走报销'],
@@ -104,21 +104,36 @@ export function inferLocalFlowCandidates(rawText) {
let event = ''
let expenseType = ''
if (/客户.*吃饭|请客户.*吃饭|招待|宴请|请客/.test(compact)) {
event = '请客户吃饭'
expenseType = '业务招待费'
} else if (/出差|差旅|机票|高铁|火车|行程/.test(compact)) {
event = '出差行程'
expenseType = '差旅费'
} else if (TRANSPORT_KEYWORD_PATTERN.test(compact)) {
if (TRANSPORT_KEYWORD_PATTERN.test(compact)) {
event = '交通出行'
expenseType = '交通费'
} else if (/住宿|酒店|宾馆/.test(compact)) {
} else if (/客户.*吃饭|请客户.*吃饭|客户用餐|客户接待|商务接待|招待|宴请|请客/.test(compact)) {
event = '业务招待'
expenseType = '业务招待费'
} else if (/出差|差旅|机票|飞机票|航班|高铁票|高铁|火车票|火车|动车|行程单|铁路客票/.test(compact)) {
event = '出差行程'
expenseType = '差旅费'
} else if (/住宿|住宿费|酒店|酒店发票|宾馆|民宿|房费|客房/.test(compact)) {
event = '住宿报销'
expenseType = '住宿费'
} else if (/餐费|用餐|午餐|晚餐|早餐|餐饮/.test(compact)) {
event = '餐饮用餐'
expenseType = '费'
} else if (/餐费|工作餐|用餐|午餐|晚餐|早餐|餐饮|伙食|茶歇/.test(compact)) {
event = '业务招待'
expenseType = '业务招待费'
} else if (/会务|会议费|会议|参会|会场|场地费|论坛|展会/.test(compact)) {
event = '会务活动'
expenseType = '会务费'
} else if (/办公用品|办公耗材|办公设备|文具|打印纸|硒鼓|墨盒|键盘|鼠标|白板/.test(compact)) {
event = '办公采购'
expenseType = '办公用品费'
} else if (/培训|讲师费|课程费|教材|认证费|考试费/.test(compact)) {
event = '培训学习'
expenseType = '培训费'
} else if (/通讯费|话费|电话费|手机费|流量费|宽带费|网络费/.test(compact)) {
event = '通讯使用'
expenseType = '通讯费'
} else if (/福利费|团建|慰问|节日福利|体检费|员工关怀/.test(compact)) {
event = '员工福利'
expenseType = '福利费'
}
return {
@@ -232,7 +247,13 @@ export function buildLocalExtractionProgressMessages(rawText, options = {}) {
}
const attachmentHint = Number(options.attachmentCount || 0) > 0 ? '附件完整性' : '票据附件'
messages.push(`正在判断待补项:客户名称、参与人员、${attachmentHint}`)
const pendingSlots = ['发生时间', '金额', attachmentHint]
if (candidates.expenseType === '业务招待费') {
pendingSlots.splice(2, 0, '客户名称', '参与人员')
} else if (candidates.expenseType === '住宿费') {
pendingSlots.splice(2, 0, '酒店/商户')
}
messages.push(`正在判断待补项:${pendingSlots.join('、')}`)
return messages
}