/** 团队助手手册条目(知识库摘要,供关键词检索) */ export type HandbookEntry = { id: string; title: string; keywords: string[]; body: string; }; export const WECOM_HANDBOOK_ENTRIES: HandbookEntry[] = [ { id: 'overview', title: '系统整体概述', keywords: ['概述', '四端', '整体', '是什么', '介绍'], body: [ '杜康好客:购酒 → 1:1 好客权益 → 门店核销。', '四端:用户小程序 / 门店 H5 / 合伙人 H5 / HQ 后台。', '核心:门店结算=核销额×60%;权益永久;核销码 3 分钟。', ].join('\n'), }, { id: 'order', title: '订单与履约', keywords: ['订单', '同城', '跨城', '提货', '履约', '小飞侠'], body: [ '状态:待付款 → 已付款 → 已完成(30 分钟未付取消)。', '同城≥2瓶:仓配/小飞侠;跨城≥1箱:总部物流到付。', '现场提货:支付后直接已完成并发权益。', 'HQ「订单」可查看详情、填运单;「配送单」维护运单号。', ].join('\n'), }, { id: 'redeem', title: '好客权益与核销', keywords: ['权益', '核销', '出码', '扫码', '余额'], body: [ '支付成功发放实付 1:1 权益,永久有效。', '用户出码 3 分钟;门店可扫码或手机号+验证码核销。', '直接核销:0 < 金额 ≤ 全部 ACTIVE 余额。', '门店账本按核销额×60% 入账,T+1 出账。', ].join('\n'), }, { id: 'city', title: '开城流程', keywords: ['开城', '城市', '合伙人', '仓库', '仓配'], body: [ 'HQ「开城」:①新增城市 ②配置合伙人(全城/区域+佣金)③仓库 ④仓配承运商。', '已开城走同城规则;未开城走跨城到付。', '订单佣金按收货区县解析区域/全城合伙人;跨城归总部。', ].join('\n'), }, { id: 'store', title: '开店/拓店流程', keywords: ['开店', '拓店', '入驻', '审核', '试核销'], body: [ '合伙人三步录入 → 负责人复核 → HQ 审核 → 试核销 100 元 → 正式入驻。', '营业中门店才对 C 端可见。', 'AUTO_APPROVE_STORE 开启时可自动审核(试点)。', ].join('\n'), }, { id: 'finance', title: '财务结算', keywords: ['财务', '账单', '提现', '打款', '佣金'], body: [ '门店账单:核销×60%,T+1 出账;HQ 确认打款。', '合伙人月账独立确认打款。', '门店可对未出账核销主动提现(受单日上限);申请后锁定明细不进入次日出账,HQ 审后打款并企微提醒。', ].join('\n'), }, { id: 'ticket', title: '工单与发票', keywords: ['工单', '售后', '退款', '补发', '发票', '技术支持'], body: [ '售后四类型:仅退款 / 破损补发 / 破损退货 / 退货退款 → HQ 工单中心。', '技术支持:BUG/建议/其他,待评审→开发→测试→通过。', '发票:个人/企业 × 普票/专票;2 工作日 SLA。', ].join('\n'), }, { id: 'hq-roles', title: 'HQ 角色分工', keywords: ['运营', '财务', '客服', '权限', '角色', 'hq'], body: [ '运营:商品/开城/门店/订单/配送/权益。', '财务:门店/合伙人/酒厂账单与打款、发票、酒厂账户。', '客服:用户/订单、售后工单、发票协助。', '超管:权限分配、技术支持评审、系统设置。', ].join('\n'), }, { id: 'settings', title: '系统设置', keywords: ['系统设置', 'mock', '短信', '微信', 'oss', '企微'], body: [ 'HQ「系统设置」:功能开关、短信、微信、OSS、应用链接、部署、酒厂账户。', '企微机器人在独立菜单「企微机器人」维护;总开关在功能开关「启用企微机器人长连接」。', '角色:客服 / 技术支持 / 团队助手;指令式,不依赖大模型。发「帮助」看命令。', '改完可「同步到 env」;密钥类变更后注意重启标识。', ].join('\n'), }, ]; export function searchHandbook(query: string, limit = 3): HandbookEntry[] { const q = query.trim().toLowerCase(); if (!q) return WECOM_HANDBOOK_ENTRIES.slice(0, limit); const scored = WECOM_HANDBOOK_ENTRIES.map((e) => { let score = 0; const title = e.title.toLowerCase(); if (title.includes(q)) score += 10; for (const kw of e.keywords) { const k = kw.toLowerCase(); if (q.includes(k) || k.includes(q)) score += 5; } if (e.body.toLowerCase().includes(q)) score += 1; return { e, score }; }) .filter((x) => x.score > 0) .sort((a, b) => b.score - a.score); if (!scored.length) return []; return scored.slice(0, limit).map((x) => x.e); }