/** * 统一报价 A6 · 报价议价 —— 活动包代码入口(ADR-004)。 * * 「发出的同时必须建立 D+3/D+7 跟进 —— 没有跟进的报价等于没报。」 * 这里把跟进监听立起来:AI 对世界只有触达(动作,落在放行)与等待(监听)两种姿势。 */ import { defineActivity } from '@sdk'; import type { ActivityBase, ActivityOutcome } from '@sdk'; const QUOTE = 'quote_negotiate.formal_quote'; export default defineActivity({ name: 'quote-negotiate', async run(base: ActivityBase): Promise { const lines = await base.ledger.read(QUOTE); await base.interaction.pushView([ { t: 'table', title: '正式报价单', cols: ['PN', '单价CNY', '交期', 'MOQ', '有效期'], rows: lines.map((r) => [ String(r['pn'] ?? ''), String(r['unit_price'] ?? '—'), String(r['lead_time'] ?? '—'), String(r['moq'] ?? '—'), String(r['valid_until'] ?? '—'), ]), }, ]); const incomplete = lines.filter((r) => r['unit_price'] === undefined || r['valid_until'] === undefined); if (lines.length === 0 || incomplete.length > 0) { await base.interaction.say('报价单条目尚未齐备,继续排版。', 'conclusion'); return { kind: 'await', reason: '等待报价单生成步完成' }; } // 建 D+3 跟进:等客户回音 —— 时限必配,无死等 await base.tools.listen({ eventType: 'data', keyFilter: { kind: 'customer-reply', customerCode: String(base.contract.data['customerCode'] ?? '') }, deadline: 'P3D', }); await base.interaction.say('已建 D+3 跟进监听 —— 没有跟进的报价等于没报。', 'guidance'); return { kind: 'submit', deliverable: 'formal-quote', rationale: '报价单齐备且已建跟进,提交放行即发出' }; }, });