Report confirmed connected duration separately from call result interval

This commit is contained in:
2026-10-12 11:05:14 +08:00
parent 16a98414cb
commit 8340efd889
18 changed files with 275 additions and 83 deletions
+1
View File
@@ -10,6 +10,7 @@ SaaS 开发人员与本项目共同维护业务规范、Schema、MQ 拓扑和正
2026-10-10 原 `event_id` 全链路反馈规则已同步至共享提交 `ef3009d`;本项目变更、核验和 SaaS 开发同步说明见 [event_id 生命周期核验](evidence/event-id-lifecycle-20261010.md)。具体消息定义仍只以共享合同为准;此次本地改动未部署,不代表线上反馈已切换。
任务控制回执及逐字段拒绝反馈规则统一见共享仓库的 `mq-task-control-receipt.schema.json`、`saas-dispatcher.md` 和 `examples/mq-control-{ack,rejected}.json`;SaaS 须同步采用这些入口,不以历史归档提案或旧的仅 status 回执作为现行结构。
接通时长新增 `answered_at` / `connected_duration_ms`,原 `duration_ms` 不变;共享版本及 SaaS 开发对接说明见 [接通通话时长本地核验](evidence/connected-call-duration-local.md)。本地通过不代表真实呼叫或 SaaS 收讫。
| 位置 | 用途 |
| --- | --- |
@@ -0,0 +1,7 @@
# 接通通话时长:本地开发与 SaaS 对接说明
共享契约固定版本:`bfa3380a5e01f4bfaea918383fceed81548252d1`(已推送 `sip-contracts/main`)。本项目开发分支:`feat/connected-call-duration`,尚未部署、合入或推送本项目。
SaaS 应从 `call.execute.result.payload.connected_duration_ms` 读取接通后的时长,单位毫秒。原 `duration_ms` 保留既有含义,不能作为接通时长。`answered_at` 为原始外呼通道首次 `Up` 事件时间;接通时长从该事件计到同一通道的 `ChannelDestroyed` 事件。确认未接通并结束时为 `answered_at=null`、`connected_duration_ms=0`;缺少可核验时间证据时为 `null`,不得把未知当成零或从录音长度推断。接通后的媒体/业务失败也可能报告 `outcome=failed`,SaaS 不应仅凭 outcome 推算时长。字段在所有新结果中均出现。SaaS 开发人员应按上述共享版本调整解析、展示及测试;发布顺序和生产收到消息尚未验证。
已验证:Schema、正反例与离线来源检查;结果生成、原通道 Up/Destroyed 计时、无证据/未接通边界的单元测试;`make check`、`make release-check-local`、`go test -race ./...` 和 `./scripts/coverage.sh` 通过,业务覆盖率 73.1%。所有核验为本地隔离环境,未拨号、部署或调用真实外部服务;实际 Asterisk 事件时间及 SaaS 收取仍需独立现场验证。