/** * 活动包清单 —— 统一报价 A6 · 报价议价。 * * 业务素材:docs/MVP示例工作流.html §1.4(S1 生成发出 → S2 CRM 留档 → S3 建立跟进)。 * 关键机制:生成正式报价单是**写类动作** → 登记为动作意向 → 落地预检 → * 放行通过即落地(台账回写 + 出站发送)→ 输出口发射;并建 D+3 跟进监听。 */ import type { ActivityManifest } from '@contracts'; import { activityIdSchema } from '@contracts'; const DOMAIN = 'quote_negotiate'; const ACTIVITY_ID = activityIdSchema.parse('quote-negotiate'); export const manifest: ActivityManifest = { identity: { activityId: ACTIVITY_ID, name: 'A6 · 报价议价', packageVersion: '0.1.1', category: '统一报价', paradigm: 'flow', sdkVersion: '0.1.0-m5', checksum: 'dev-checksum-quote-negotiate', }, contract: { activityId: ACTIVITY_ID, version: '0.1.0', input: { data: { type: 'object', required: ['customerCode', 'items'], properties: { customerCode: { type: 'string' }, items: { type: 'array' } }, }, messageAllowed: true, }, output: { mandatory: [], // 议价结果是**业务分支**:必须建模为选择组的一口,随放行发射 —— 不得用异常终态编码 selective: [ { group: 'negotiation', ports: [ { name: 'won', payload: { type: 'object' }, description: '成交 → 转订单履约(ORM)' }, { name: 'revise', payload: { type: 'object' }, description: '有异议 → 返回调整 A4' }, { name: 'lost', payload: { type: 'object' }, description: '拒绝/超时 → 转 A7 情报归档' }, ], }, ], }, requiredDeliverables: [ { key: 'formal-quote', label: '正式报价单(PDF · 中英双语)' }, { key: 'followup', label: 'D+3/D+7 跟进提醒' }, ], acceptanceCriteria: [ { key: 'quote-complete', label: '单价/交期/SPQ/MOQ/贸易条款/有效期齐备', level: 'L1', predicate: 'missingQuoteFields = 0' }, { key: 'validity', label: '按报价有效期 P-04 注明有效期', level: 'L2', predicate: 'validityDays > 0' }, { key: 'followup-set', label: '已建 D+3/D+7 跟进 —— 没有跟进的报价等于没报', level: 'L2', predicate: 'followupSet = true' }, { key: 'bd-release', label: 'BD 放行', level: 'L5' }, ], prohibitions: [ { key: 'no-break-line', statement: '客户议价超出授权范围的,回 A5 重批,不私自破线' }, { key: 'no-send-before-release', statement: '报价单在放行前不得发出 —— 写类动作集中在放行时落地' }, ], authorization: { discretion: [{ key: 'haggle-band', statement: '在已批准的价格区间内回旋;出区间必须回审批' }], // 预授权必须逐项列举:催办模板可即时发,报价单不行 preauthorizedActions: [{ tool: 'mail.send', operation: 'nudge', limit: '仅催办模板' }], humanCallBudget: 3, }, resources: { tools: [{ name: 'mail.send' }, { name: 'crm.history-price-read' }], skills: [], models: ['quote-extractor'], roles: ['BD'], budget: { steps: 50, tokens: 120_000, activeMinutes: 60, humanCalls: 3 }, }, }, declarations: { models: ['quote-extractor'], tools: [{ name: 'mail.send' }, { name: 'crm.history-price-read' }], ledger: [ { domain: DOMAIN, object: 'formal_quote', label: '正式报价单', fields: [ { name: 'quote_no', type: 'text', primaryKey: true, masked: false, label: '报价单号' }, { name: 'pn', type: 'text', primaryKey: true, masked: false, label: 'PN' }, { name: 'unit_price', type: 'number', primaryKey: false, masked: false, label: '单价CNY' }, { name: 'lead_time', type: 'text', primaryKey: false, masked: false, label: '交期' }, { name: 'spq', type: 'integer', primaryKey: false, masked: false, label: 'SPQ' }, { name: 'moq', type: 'integer', primaryKey: false, masked: false, label: 'MOQ' }, { name: 'trade_terms', type: 'text', primaryKey: false, masked: false, label: '贸易条款' }, { name: 'valid_until', type: 'date', primaryKey: false, masked: false, label: '有效期' }, ], }, { domain: 'shared', object: 'history_price', label: '历史价格情报(共享域)', fields: [ { name: 'pn', type: 'text', primaryKey: true, masked: false }, { name: 'quoted_at', type: 'date', primaryKey: true, masked: false, label: '报价日期' }, { name: 'unit_price', type: 'number', primaryKey: false, masked: false }, { name: 'lead_time', type: 'text', primaryKey: false, masked: false }, ], }, ], listeners: [ { origin: 'static', eventType: 'data', keyFilter: { kind: 'customer-reply' }, semantic: 'complete-step', // 建 D+3 跟进监听:等客户回音,时限必配 —— 无死等 deadline: 'P3D', escalation: ['nudge', 'escalate'], }, ], harness: { memoryWindow: 20, stallAfter: 'PT15M', nudge: [{ after: 'PT10M', action: 'nudge' }], retry: { times: 2, backoff: 'PT30S' }, }, }, assets: { businessModel: { paradigm: 'flow', steps: [ { kind: 'llm', name: 'S1_compose', label: 'S1 生成正式报价单', input: { items: 'items', customerCode: 'customerCode' }, output: { domain: DOMAIN, object: 'formal_quote', key: { quote_no: 'quoteNo', pn: 'pn' }, fields: { unit_price: 'unitPrice', lead_time: 'leadTime' }, }, model: 'quote-extractor', template: '把已批准的报价草案排版为正式报价单条目(单价CNY/交期/SPQ/MOQ/贸易条款),' + '按报价有效期 P-04 注明 7 日历天有效。只输出 JSON。条目:{{items}}', outputSchema: { type: 'object', required: ['lines'], properties: { lines: { type: 'array' }, validityDays: { type: 'integer' } }, }, failure: { retry: { times: 2, backoff: 'PT30S' }, fallback: { kind: 'human', workOrder: 'execution' } }, }, { kind: 'tool', name: 'S2_send', label: 'S2 发出报价单(写类 → 登记动作意向,放行时落地)', input: { customerCode: 'customerCode' }, tool: 'mail.send', failure: { retry: { times: 2, backoff: 'PT1M' }, fallback: { kind: 'human', workOrder: 'execution' } }, }, { kind: 'human', name: 'S3_release', label: 'S3 正式报价单验收放行(放行即落地:台账回写 + 出站发送)', input: {}, workOrder: 'acceptance', card: { title: '正式报价单请验收 —— 放行即发出', deliverable: 'formal-quote' }, deadline: 'P1D', failure: { retry: { times: 0, backoff: 'PT30S' }, fallback: { kind: 'blocked' } }, }, ], parallelGroups: [], }, skills: [], viewTemplates: [ { name: 'quote-preview', html: '