本文把“DGJ2 仓库之外的系统”统一登记为系统边界。每个边界说明:谁调用谁、走 HTTP 还是 MQ、关键业务键、状态落点、失败后谁补偿,以及哪些结论仍需环境确认。
文档只保留配置常量和接口路径,不记录域名值、密钥、Token、手机号、客户数据或内部 IP。
1. 业务目标
DGJ2 不是独立单体。采购、支付、配送、商品、SAAS、渠道、报表、IM、短信和文件都依赖外部系统。建立清单的目的有四个:
- 联调时知道应该找哪个系统和哪个入口。
- 故障时分清“本地未发送、消息在途、下游失败、回调未消费”。
- 改代码时知道契约、状态和补偿影响面。
- 交接时能用业务键从 DGJ 一直追到下游。
2. 适用场景
| 场景 | 使用本文的方式 |
|---|---|
| 采购审核一直不回来 | 查订单中心的生产消息、消费队列和采购单状态 |
| 已支付但订单未变化 | 查支付中心业务单号、支付流水和 paycenter_notify |
| 已发货但未出库 | 查调拨中心与 TMS 两条不同链路 |
| 商品价格/限购未生效 | 查商品中心消息、缓存和索引刷新 |
| SAAS 看不到销售单 | 查 dgj_notify、同步构建器和下游幂等 |
| IM 消息已到但机器人不回复 | 查 IM MQ、会话入库、同步结果回执和 AI/报价链 |
| 对账单未发出 | 查账单任务、发送队列、文件生成、短信/机器人通道 |
| 报表没有当天数据 | 查 DWD/Report Service/DataService,不先改业务库 |
3. 什么叫“外部系统”
本文同时登记三类边界:
| 边界类型 | 示例 | 特点 |
|---|---|---|
| 公司内部中心服务 | 订单中心、支付中心、商品中心、调拨中心 | 通常经 CENTER_API、专用服务常量或 MQ |
| 同组织独立业务系统 | SAAS、OPS、全车件、CRM、报表服务 | 有独立数据所有权和发布节奏 |
| 第三方平台 | Udesk、高德、腾讯 IM、OSS | 受第三方 SLA、配额和鉴权影响 |
“外部”是相对 DGJ2 代码与数据库而言,不代表一定在公网。
4. 总体系统图
flowchart TB
DGJ[DGJ2]
OC[订单中心]
PAY[支付中心]
DIS[调拨中心]
TMS[TMS]
ITEM[商品中心]
INV[库存中心]
OPS[OPS / OPS Manager]
OA[OA]
SAAS[SAAS / E站]
QCJ[全车件 / QPay]
IM[IM中心 / 腾讯IM]
DATA[数据平台 / 报表中心]
CRM[CRM / 风控]
OUT[短信 / Udesk / 高德 / OSS]
DGJ <--> OC
DGJ <--> PAY
DGJ <--> DIS
DGJ <--> TMS
DGJ <--> ITEM
DGJ --> INV
DGJ <--> OPS
DGJ <--> OA
DGJ <--> SAAS
DGJ <--> QCJ
DGJ <--> IM
DGJ <--> DATA
DGJ <--> CRM
DGJ <--> OUT
5. 系统资产总表
| # | 系统 | DGJ 角色 | 主要协议 | 核心业务 |
|---|---|---|---|---|
| 1 | 订单中心 | 双向 | HTTP + Topic MQ | 采购订单、售后、预订单 |
| 2 | 支付中心 | 双向 | HTTP/业务提交 + Topic MQ | 支付、退款、授信、提现 |
| 3 | 调拨中心 | 双向 | HTTP + Topic MQ | 发货、出库、自提、售后退回 |
| 4 | TMS | 双向 | HTTP + Topic MQ | 运单、箱号、预计到达、配送状态 |
| 5 | 商品中心 | 主要消费 | Topic MQ + HTTP | 限购、套包、结算价、限价、敏感词 |
| 6 | 库存中心 | 调用方 | HTTP | 可用库存、快速库存、仓库口径 |
| 7 | OPS Center | 双向 | HTTP + Topic MQ | 服务站、货主区域、品牌授权、虚拟站 |
| 8 | OPS Manager | 调用方 | HTTP | 金融、白条、退款、WMS、物料、返利 |
| 9 | OA | 双向 | HTTP + Topic MQ | 审批提交与审批结果 |
| 10 | SAAS / E站 | 双向 | HTTP + Direct/Topic MQ | 销售、出库、报价、客户、盘点 |
| 11 | 大客户渠道 | 双向 | Topic MQ | 渠道订单、发货、售后、审核 |
| 12 | 全车件 / QCJ | 双向 | HTTP + Topic MQ | 全车件订单、入库、账户开通 |
| 13 | QPay / 结算中心 | 主要消费 | Topic MQ | 支付、退款、提现结果 |
| 14 | GPDA / WMS | 双向 | HTTP + Topic MQ | 盘点、扫码、关单、SKU 数量 |
| 15 | IM 中心 | 双向 | HTTP + Topic MQ | UserSig、业务消息、同步回执 |
| 16 | 腾讯 IM | 间接双向 | 经 IM 中心 / SDK | E站会话和机器人消息 |
| 17 | 微信机器人 | 双向 | HTTP Provider + 消息消费 | 群聊询价、发消息、会话 |
| 18 | Udesk | 调用方/消费 | HTTP + Direct MQ | 客户创建和更新 |
| 19 | VIN / 国内数据平台 | 双向 | HTTP + Topic MQ | VIN、分类别名、方位、OE、商品更新 |
| 20 | 报表中心 / Hologres | 调用方 | HTTP | DWD 查询 |
| 21 | Report Service / DataService / BI | 调用方 | HTTP | 销售、利润、客户、经营报表 |
| 22 | CRM | 调用方/消费 | HTTP + MQ | 签约单、经营任务 |
| 23 | 风控中心 | 调用方 | HTTP | 服务站信用健康、授信风险 |
| 24 | 通知中心 / JPush | 调用方 | HTTP | 短信、验证码、推送 |
| 25 | 文件服务 / OSS / 文档转换 | 调用方 | HTTP | 上传、下载、对账单 PDF/PNG |
| 26 | 高德地图 | 调用方 | HTTP | 地址正逆地理编码 |
| 27 | AI 中心 / 语音转文字 | 调用方 | HTTP | OCR、语音解析、机器人能力 |
| 28 | 新采购/销售服务 | 调用方 | HTTP | 拆服务后的采购、报价、售后能力 |
6. 集成方式分类
flowchart LR
A[业务动作] --> B{需要同步结果吗}
B -->|必须马上知道| C[同步 HTTP]
B -->|可最终一致| D[MQ]
B -->|多项可并行查询| E[异步 HTTP Promise]
C --> F{HTTP 成功}
F -->|是| G[继续本地流程]
F -->|否| H[回滚或明确失败]
D --> I[本地提交后生产消息]
I --> J[下游消费与回调]
E --> K[asyncWait 汇总结果]
选择协议不能只看性能:
- 状态必须立即确认的提交用同步 HTTP。
- 可以最终一致的通知用 MQ。
- 并行查询适合异步 HTTP,但失败不能静默当成空数据。
- 跨系统事务必须有幂等键和补偿,不存在真正的单库事务。
7. 公共 HTTP Provider 规则
7.1 BaseProvider
application/Providers/BaseProvider.php 基于 Guzzle,支持:
| 能力 | 当前实现 |
|---|---|
| 表单类型 | form、JSON、body、query、multipart |
| 同步默认超时 | Provider 基础值 2 秒;具体方法常传 5/8/10/15/20 秒 |
| 异步默认超时 | 2 秒 |
| 结果格式 | 尝试 XML,失败后 JSON |
| HTTP 成功判断 | 状态码 200 后再由子 Provider 判断业务 code |
| 文件下载 | 识别 spreadsheet content-type 后直接输出 |
| 超时异常 | curl error 28 转为 RequestTimeoutException |
7.2 响应契约并不统一
| Provider 家族 | 成功 code |
|---|---|
通用 Provider::http | code = 200 |
| Report/Purchase/Sale Service | code = 0,返回 data |
| Udesk | code = 1000 |
| 部分中心服务 | code = 0 或项目 Code::SUCCESS |
| 某些接口 | 无 code,直接返回业务数据 |
新增 Provider 时必须复用对应系统的父类,不能假定所有服务都用同一个成功码。
7.3 公共日志风险
BaseProvider 默认记录 URL、headers、data 和响应。以下字段必须在调用前后脱敏:
Authorization、Token、签名、密码、UserSig、手机号、身份证、银行卡、客户联系方式、文件临时地址
只调用 closeLogger() 会失去排查证据,优先实现结构化脱敏。
7.4 requestId 的边界
当前 Provider 内部 requestId 由请求体与当前时间计算,仅用于本地日志,没有确认会放到请求头传给下游。
因此跨系统追踪不能只依赖该值,建议统一透传:
trace_id + request_id + business_key + event_type
8. 公共 MQ 规则
核心枚举:application/KzData/Enums/MqEventEnums.php。
sequenceDiagram
participant B as DGJ业务事务
participant P as MqSer/Producer
participant Q as RabbitMQ
participant C as 外部系统或DGJ Consumer
participant DB as 消费方数据库
B->>B: 写本地业务状态
B->>P: 组装 destination/routingKey/payload
P->>Q: publish(messageId)
Q->>C: deliver
C->>DB: 幂等检查并落库
alt 成功或不可重试业务错误
C-->>Q: ACK
else 临时系统错误
C-->>Q: NACK / 重试
end
8.1 MQ 必备字段
建议所有事件至少具备:
| 字段 | 用途 |
|---|---|
messageId | 消息级去重 |
eventType / routing key | 事件语义 |
businessKey | 单号、活动 ID、客户 ID 等业务幂等键 |
occurredAt | 事件发生时间 |
version | 同业务键乱序判断 |
source | 生产系统 |
traceId | 跨系统日志串联 |
data | 版本化业务体 |
当前部分生产代码使用 uniqid() 作为消息 ID,不能证明跨进程、跨机器的严格唯一和业务幂等。消费方仍应按业务键防重。
9. 订单中心
9.1 责任边界
| 系统 | 负责 |
|---|---|
| DGJ | 服务站采购意图、采购主子单、站内库存和财务落账 |
| 订单中心 | 平台订单编排、上游审核、售后流程、预订单外部状态 |
9.2 DGJ 主动调用 / 发送
| 方向 | 能力 | 入口 |
|---|---|---|
| HTTP | 支付订单联合提交、取消、查询 | OrderCenter/Order4PayProvider.php |
| HTTP | 售后提交、关闭、取消配送、故障原因 | OrderCenter/AfterSaleProvider.php |
| HTTP | 预订单、自制单、大单 | OrderCenter/*Provider.php |
| MQ | 创建采购订单 | ordercenter.ordercenter_order_create |
| MQ | 采购关闭确认等 | MqSer::sendPoCloseOrderConfirm 等 |
9.3 DGJ 消费事件
队列前缀:ordercenter_notify;入口:tasks/OrderCenterNotify.php。
| 事件 | 业务动作 |
|---|---|
ordercenter_order_audit | 正向采购审核 |
ordercenter_order_cancel | 在线支付采购取消 |
ordercenter_aftersale_audit | 售后审核 |
ordercenter_aftersale_update | 售后更新 |
ordercenter_aftersale_confirm_warehouse | 确认退货仓 |
ordercenter_aftersale_rollback_audit | 售后弃审 |
ordercenter_aftersale_close | 售后关闭 |
ordercenter_aftersale_refund_finish | 退款完成 |
ordercenter_self_change_direct | 自制单配送方向变更 |
ordercenter_order_sync_dgj | OPS 自制订单下发 |
ordercenter_order_close | OPS 自制订单关闭行 |
ordercenter_preorderrefund_create/cancel | 预订单售后创建/取消 |
ordercenter_preorder_close | 预订单关闭 |
ordercenter_aftersale_return_quota_expire | 退货额度过期 |
9.4 核心幂等键
DGJ billNo / 外部 outOrderNo / orderCenterOrderNo / 售后单号 / sourceLineCode / 明细行 ID
9.5 主流程
sequenceDiagram
participant D as DGJ
participant O as 订单中心
participant M as ordercenter_notify
D->>O: 创建采购/售后(HTTP或MQ)
O-->>D: 受理结果/外部单号
O->>M: 审核、取消、关闭或退款事件
M->>D: OrderCenterNotify 消费
D->>D: 校验单号、类型、原状态和明细
D->>D: 事务更新采购/售后/数量
9.6 失败边界
- HTTP 超时不代表订单中心一定未受理,必须按外部单号查询。
- MQ 重复可能表现为“原状态不允许”,要区分已处理与真实脏状态。
- 明细行关闭必须以来源行号防重,不能只看主单。
- 本地事务成功后下游副作用失败,需要单独补偿。
10. 支付中心
10.1 责任边界
| 系统 | 负责 |
|---|---|
| DGJ | 业务应付/应收、采购状态、本地 Payment/Account 记录 |
| 支付中心 | 支付渠道、支付流水、退款执行、授信/分期结果 |
10.2 消费入口
队列:paycenter_notify;入口:tasks/PayCenterNotify.php。
| 事件 | 本地影响 |
|---|---|
paycenter_pay_result | 采购/预订单支付成功落账与状态推进 |
paycenter_pay_exception | 抵扣失败等异常处理 |
paycenter_refund_result | 退款结果 |
paycenter_balance_adjust | 账户调整 |
paycenter_refund_account_withdraw_result | 提现结果 |
paycenter_baitiao_return_pay_result | 授信还款支付 |
paycenter_baitiao_offline_return | 线下授信还款 |
paycenter_baitiao_expire | 授信到期提醒 |
paycenter_installment_expire | 分期到期提醒 |
paycenter_baitiao_service_overdue_change | 逾期状态变化与锁站影响 |
10.3 支付结果示意
{
"billNo": "业务单号",
"payStatus": "02",
"payOrderNo": "支付流水号",
"payAmount": 10000,
"payTime": "业务时间",
"payItems": []
}
示意中的金额单位必须按接口合同确认。DGJ 支付链存在外部“分”和本地“元”的转换,不能仅按字段名判断。
10.4 幂等与补偿
flowchart TD
A[收到支付结果] --> B{payStatus 是成功吗}
B -->|否| C[记录或按事件类型处理]
B -->|是| D[按业务单号查订单]
D --> E{本地已落同一支付流水吗}
E -->|是| F[ACK 幂等结束]
E -->|否| G[事务写 Payment/PaymentInfo/PayInfo]
G --> H[推进采购状态和活动库存]
H --> I[发送后续事件]
支付回调最小幂等组合:支付中心流水号 + 业务单号 + 支付状态 + 金额。只用业务单状态会误伤混合支付或多次退款。
11. 调拨中心
11.1 HTTP 能力
application/Providers/DispatchCenter/OrderProvider.php:
| 能力 | 用途 |
|---|---|
pause / pauseCancel | 配送暂停与取消暂停 |
warn | 特殊配送预警 |
lockTempGoodsStock / unlockTempGoodsStock | 临采库存锁定与回调 |
speedStatus | 时效能力校验 |
fhd2dh | 发货单转到货相关处理 |
11.2 MQ 消费
队列:dispatchcenter_notify;入口:tasks/DispatchCenterNotify.php。
| 事件 | 动作 |
|---|---|
dispatchcenter_delivery_stock_out | 配送出库,推进采购数量/状态 |
dispatchcenter_logistice_info_notify | 物流信息 |
dispatchcenter_self_pick_up_notify | 自提通知 |
dispatchcenter_return_close | WMS/配送退货关单回传 |
dispatchcenter_order_tag_biz_change | 订单标签业务变化 |
部分配送出库失败会进入 20 秒延迟队列后再次投递。
11.3 关键业务键
采购主单号 + 子单号/发货单号 + 配送单号 + 明细行号 + 本次出库数量
不能只按采购主单幂等,因为一个采购单可以多次分批出库。
12. TMS
TMS 和调拨中心不是同一个边界。TMS 更关注运单与履约状态。
入口:tasks/ExpressNoSyncNotify.php,队列前缀 tmsprod_notify。
| 事件 | 本地用途 |
|---|---|
tmsprod_out_expressno_relation | 出库单与第三方运单关系 |
tmsprod_waybill_prearrvied_time | 预计到达时间 |
tmsprod_express_split_carton_no | 拆箱/箱号关系 |
tmsprod_third_party_delivery_change_status | 第三方配送状态 |
tmsprod_third_pickup_order_status | 三方取件状态 |
tmsprod_self_transport_status | 自配送状态 |
flowchart LR
A[DGJ销售/采购单] --> B[调拨中心配送单]
B --> C[TMS运单]
C --> D[运单号/箱号]
C --> E[预计到达]
C --> F[配送/取件状态]
D --> G[DGJ履约展示]
E --> G
F --> G
排查“已出库无物流”时,先确认调拨中心是否已出库,再确认 TMS 是否已建运单;不要混成一个状态。
13. 商品中心
消费入口:tasks/ItemCenterNotify.php,队列 itemcenter_notify。
| 事件 | 影响面 |
|---|---|
itemcenter_sku_limit_purchase_config | 采购限购和缓存 |
itemcenter_package_status_sync | 套包可用状态 |
itemcenter_item_price_enable | 结算价生效 |
itemcenter_item_price_disable | 结算价失效 |
itemcenter_guide_price_limit_change | 销售限价/指导价 |
itemcenter_sensitive_word_change | 商品/内容敏感词 |
HTTP Provider:application/Providers/ItemCenter/*,用于商品和物料查询。
13.1 消费后副作用
flowchart TD
A[商品中心消息] --> B[校验事件和商品标识]
B --> C[更新本地商品/价格配置]
C --> D[刷新 Redis 集合或缓存时间]
C --> E[触发 Mongo/ES 或前端数据更新]
C --> F[影响采购、销售、活动可买性]
商品中心消息处理成功不能只看业务表,必须核对缓存和搜索层。
14. 库存中心
Provider:application/Providers/InventoryCenter/KzInventoryProvider.php。
主要能力:
| 方法 | 用途 |
|---|---|
asyncGetInventoryBySkuIds | 按站点、SKU、订单类型、仓库查询库存 |
asyncGetSpeedInventoryBySkuIds | 查询时效/快速库存 |
调用常为异步 HTTP,依赖回调和最终 asyncWait()。
关键参数:
sid + skuIds + orderType + warehouseCode + extraQuery
库存中心返回的是可买库存口径,不等于 DGJ 本地实时库存表。秒杀、套包、指定仓和在途库存还会二次计算。
15. OPS Center
15.1 消费入口
tasks/OpsCenterNotify.php,队列 opscenter_notify。
| 事件 | 业务影响 |
|---|---|
opscenter_shipper_region_config | 货主供货区域配置 |
opscenter_brand_license_create/update | 品牌授权书同步 |
opscenter_sitemgr_virtual | 虚拟站变化 |
opscenter_customer_enable_auto_update | 服务站启用状态自动更新 |
15.2 HTTP Provider
application/Providers/OpsCenter/* 覆盖:
- 服务站与区域。
- 供应商、银行、发票资料。
- 品牌授权。
- 第三方物流与 TMS。
OPS 是主数据所有者时,DGJ 只保存业务所需快照或缓存,不能反向直接覆盖主数据。
16. OPS Manager
application/Providers/OpsManager/* 是最大的外部 Provider 家族,覆盖:
| 领域 | Provider 目录 |
|---|---|
| 白条、分期、还款 | Baitiao/* |
| 余额与资金 | Balance/*、Finance/* |
| 银行和支付通道 | Financial/* |
| 退款 | Refund/* |
| 采购限量 | Purchase/* |
| 返利 | Rebate/* |
| 销售出库 | Sale/* |
| WMS 箱号、物流、签收 | Wms/* |
| 物料分类 | Materiel/* |
金融 Provider 只登记接口路径和配置 key,不把签名算法参数、密钥或银行资料写入文档。
17. OA
17.1 双向链路
| 方向 | 入口 | 用途 |
|---|---|---|
| DGJ -> OA | Providers/Oa/OaProvider.php、业务 Provider | 发起审批/同步状态 |
| OA -> DGJ | tasks/OaNotify.php | oa_audit 审批回调 |
| DGJ -> 结果队列 | MqSer::sendOAResult | 发送 OA 处理结果 |
| 结果同步消费 | tasks/OaResultNotify.php | oa_result_notify_sync |
秒杀活动使用特定模板码分流到 FlashActivitySer::callback20260526。
sequenceDiagram
participant D as DGJ业务
participant O as OA
participant Q as oa_notify
D->>O: 提交审批,携带模板码和业务ID
O-->>D: 审批实例信息
O->>Q: oa_audit
Q->>D: 模板码分流
D->>D: 幂等更新审核状态
D-->>O: 结果同步/处理回执
OA 幂等键至少包括模板码 + 审批实例号 + 业务 ID + 审批节点/结果。
18. SAAS / E站
18.1 DGJ 调用 SAAS
application/Providers/KzSaas/* 覆盖:
- 销售订单与出库。
- 客户、用户与门店。
- 盘点。
- 微仓库存。
- 优惠券、信用、资质。
- 微信和银联相关能力。
18.2 DGJ 发送 MQ
MqSer 和 SyncOrderBuilder/SyncOrderSer 发送:
| 事件族 | 示例 |
|---|---|
| 维修厂销售单 | created、updated、cancelled、stopped、completed、expired |
| 维修厂出库单 | created、updated、cancelled |
| 老 APP 通知 | 出库、配送状态、关闭、结单、退货审核/完成 |
| 新业务 | 报价转询价、出库转 SAAS 订单、微信群下单 |
| 主数据 | 新站、应用开通、客户同步、简码、关站 |
| 活动 | 优惠券、活动开始/结束 |
18.3 DGJ 内部 Direct 消费
tasks/SaasOrderNotify.php 消费 dgj:库存事件、采购关闭确认、新站、应用开通、OPS 创建/关闭订单、配送出库等。它名字包含 SAAS,但不代表所有事件都来自 SAAS。
18.4 销售同步流程
sequenceDiagram
participant S as DGJ销售事务
participant B as SyncOrderBuilder
participant M as dgj_notify
participant A as SAAS
S->>S: 提交销售单/出库单
S->>B: 构建版本化事件
B->>M: 发送业务单号、状态和明细
M->>A: 下游消费
A->>A: 按订单号+事件版本幂等
同一销售单可能连续产生 created、updated、completed。下游必须防乱序,不能只按最后到达时间覆盖。
19. 大客户渠道
队列:dgj_channel;入口:tasks/ChannelOrderNotify.php。
| 事件 | 方向 | 业务 |
|---|---|---|
channel_order_manual_create | 渠道 -> DGJ / OPS | 人工创建渠道订单 |
channel_order_delivery | 渠道 -> DGJ | 发货 |
channel_refund_action | 渠道 -> DGJ | 退货入库审核 |
channel_order_approve | 渠道 -> DGJ | 订单审核 |
| 渠道退款事件 | DGJ -> 渠道 | 售后结果同步 |
核心表:t_channel_order、t_channel_order_info、t_channel_aftersale、t_channel_aftersale_info。
业务状态:created、wait_ship、part_ship、finish、cancel。
幂等必须落到平台订单号 + 平台明细行号 + 动作类型,分批发货不能按主单只处理一次。
20. 全车件、QCJ 与 QPay
20.1 HTTP 边界
| Provider | 能力 |
|---|---|
AllCarPartService/AppProvider.php | 入库区域、入库单、入库商品 |
AllCarPartService/StorageProvider.php | 初始化服务站仓储 |
AllCarPartService/PosOrderProvider.php | 按销售单号查询采购关联 |
KzSaas/AllCarPartProvider.php | SAAS 侧全车件业务 |
20.2 MQ 边界
| 队列 | 事件 | 用途 |
|---|---|---|
qcj_notify | qcj_repair_factory_register_complete | 维修厂结算账户开通 |
qpaycenter_notify | 支付/退款/提现完成 | 全车件结算结果 |
入口:tasks/QPayCenterNotify.php 及全车件相关 Controller。
全车件业务同时跨销售、采购、结算三条链,排查时必须保留平台订单号、DGJ 单号和结算流水三组映射。
21. GPDA / WMS
21.1 GPDA 事件
| 事件 | 方向 | 作用 |
|---|---|---|
stationprod_spdmgr_close_task | GPDA -> DGJ | 关闭盘点任务 |
dgj_pd_status_update | DGJ -> OPS/GPDA | 盘点状态 |
dgj_pd_sku_num_update | DGJ -> OPS/GPDA | SKU 盘点数量 |
gpda_send_sku_num_msg_to_ops | DGJ -> OPS | SKU 数量消息 |
tasks/GpdaNotify.php 按 taskNo 批量把未关闭盘点单更新为关闭状态,使用数据库事务,异常返回 NACK。
21.2 盘点幂等键
taskNo + skuId + 扫码批次/提交版本 + 状态
盘点关闭与盘点差异入账不是同一个动作,关闭回调不能重复生成库存流水。
22. IM 中心与腾讯 IM
22.1 HTTP 能力
application/Providers/ImCenter/ImCenterProvider.php:
| 方法 | 用途 |
|---|---|
getUserSig | 获取腾讯 IM 登录签名 |
sendImMessage | 发送业务消息 |
getRepairShopUserByImGroupId | 群与维修厂员工映射 |
msgSyncResult | 通知消息同步处理结果 |
默认 HTTP 超时 5 秒,成功响应通常 code = 0。
22.2 MQ 消费
队列:imcenter_notify;事件:im_app_biz_message;入口:tasks/ImCenterNotify.php。
sequenceDiagram
participant T as 腾讯IM
participant I as IM中心
participant Q as imcenter_notify
participant D as DGJ机器人
participant R as 会话/报价服务
T->>I: 用户业务消息
I->>Q: im_app_biz_message
Q->>D: msgId + account + content
D->>R: 保存会话并执行业务回复
alt 处理成功
D->>I: msgSyncResult(msgId)
D-->>Q: ACK
else 可重试系统异常
D-->>Q: NACK
else 参数/业务错误
D-->>Q: ACK并记录
end
22.3 风险
UserSig属于敏感凭据,日志不得输出。- 当消息没有
msgId时本地可能生成临时值,无法与上游严格对账。 - 同步结果通知失败只记录 warning 时,IM 中心可能再次投递;本地会话入库必须幂等。
23. 微信机器人
Provider:application/Providers/WechatRobot/*;业务:application/Services/MoveMall/Robot*。
能力包括:
- 接收群聊/私聊消息。
- 识别联系人、车辆、VIN、关键词。
- 查询商品、价格和库存。
- 发送文本、图片和商品列表。
- 将微信群订单同步到 SAAS。
flowchart TD
A[微信消息] --> B[机器人接入]
B --> C[会话与联系人识别]
C --> D{VIN/车型/关键词是否完整}
D -->|否| E[追问或预输入缓存]
D -->|是| F[商品/价格/库存查询]
F --> G[格式化回复]
G --> H[微信机器人发送]
G --> I[可选同步 SAAS 询价/订单]
机器人失败要分接入、消息队列、会话、识别、查询和发送六层,不要只看“没有回复”。
24. Udesk
24.1 接口方式
application/Providers/Udesk/* 使用第三方 HTTP API:
- 客户创建。
- 客户更新。
- 请求携带账号标识、时间戳和签名。
- 成功业务码为
1000。
签名使用本地配置中的凭据计算,文档与日志只允许记录“签名已生成”,不记录原值。
24.2 异步方式
| 队列/事件 | 用途 |
|---|---|
dgj + udesk_customer_create | 新客户创建 |
dgj_udesk + udesk_customer_async | 客户编辑后异步更新 |
入口:tasks/SaasOrderNotify.php、tasks/UdeskNotify.php。
Udesk 失败不应回滚客户主数据,但必须进入可查询的同步失败记录或重试任务。
25. VIN 与国内数据平台
队列:vin;入口:tasks/VinAuditNotify.php。
| 事件 | 用途 |
|---|---|
sync_product_code | 商品编码同步 |
sync_category_alias | 分类别名变化 |
position_change_event | 方位关键词变化 |
cxj_oe_change | OE 管理变化 |
vin_goods_update | DGJ 通知 VIN 侧商品更新 |
HTTP Provider:application/Providers/Vin/*、application/Providers/DevCenter/VinProvider.php。
分类别名、方位词、OE 变化会影响智能询价和搜索,不是只更新一个展示字段。
26. 报表中心、Report Service 与 DataService
| 系统 | 调用方式 | 用途 |
|---|---|---|
| Hologres Query | CENTER_API/devcenter/report/hologres/query | 采购、库存等 DWD SQL |
| Report Service | REPORT_SERVICE | 销售明细、客户/商品聚合、对账 |
| DataService | CENTER_API/devcenter/reports/* | 利润、客户、经营指标 |
| BI | BI 配置常量 | 经营看板跳转/报表 |
这三类系统不共用同一响应码和同步时效。详细口径见《22_报表口径专题》。
26.1 异步查询风险
DataService 部分报表并行发请求,异步失败回调可能只收到空数组。业务层必须区分:
真实无数据 != 请求超时 != 下游返回错误 != 回调没有执行
27. CRM 与经营任务
Provider:application/Providers/Crm/*。
| 能力 | 用途 |
|---|---|
| 联系人签约单 | 查询、保存、作废、审核、模板和品牌分类 |
| 经营任务 | 工单列表、详情和明细 |
MQ dgj_crm_work_order_update | 经营任务变化同步 |
CRM 是签约与经营任务的主系统,DGJ 负责业务入口和展示。保存后超时必须按业务单号查询,避免重复创建签约单。
28. 风控中心
Provider:application/Providers/RiskCenter/RiskCenterProvider.php。
能力:按服务站批量查询信用健康和风险信息。
关键原则:
- 风控接口不可用时,涉及授信、放款或高风险资金动作不能默认放行。
- 普通只读展示可以降级为空或提示,但必须明确与“无风险”不同。
- 风险结果应带查询时间,避免使用过期缓存做资金决策。
29. 通知中心与 JPush
29.1 短信
application/Providers/NotifyCenter/Sms/SmsProvider.php:
| 能力 | 场景 |
|---|---|
sendVerifier / match | 验证码发送与校验 |
baitiaoExpire | 授信到期提醒 |
installmentExpire | 分期到期提醒 |
accCheckBill | 对账单提醒 |
adminAccountOpen | 账号开通提醒 |
wechatDown | 微信机器人掉线提醒 |
短信通过 scenarioCode + args + receivers 调用通知中心。
29.2 推送
application/Providers/DataService/JpushProvider.php 处理移动推送,部分调用采用异步回调。
手机号、验证码、账号初始信息都属于敏感信息,Provider 公共日志必须脱敏。
30. 文件服务、OSS 与文档转换
| 能力 | 入口 |
|---|---|
| 上传文件到 OSS | Providers/File/FileProvider.php |
| 从开发中心取 OSS 文件 | Providers/DevCenter/ExploitProvider.php |
| 业务图片 | Providers/DevCenter/BizWebImageProvider.php |
| 对账单 PDF/PNG | Services/Statement/StatementExportService.php |
文档转换服务地址按环境配置,禁止在知识库记录实际内部地址。
flowchart LR
A[业务数据] --> B[HTML/模板]
B --> C[文档转换服务]
C --> D[PDF或PNG]
D --> E[OSS]
E --> F[短信/机器人/人工下载]
失败补偿需要区分:生成失败、上传失败、临时 URL 过期、发送失败。
31. 高德地图
Provider:application/Providers/Amap/AmapProvider.php。
| 方法 | 用途 |
|---|---|
geo(address, cityCode) | 地址转经纬度 |
regeo(longitude, latitude) | 经纬度转地址 |
密钥来自配置,不能记录在日志或文档。地址属于个人/客户数据,日志只保留必要片段或哈希。
地图失败通常不应直接修改客户原始地址;可以标记待解析并补偿。
32. AI 中心与语音能力
application/Providers/AiCenter/AiCenterProvider.php 支持:
- 语音解析和格式转换。
- 图片配件 OCR。
- 异步 OCR 回调上下文。
- 业务消息发送。
application/Providers/DevCenter/Voice2TextProvider.php 还提供语音转文字 Token 能力。
32.1 超时和降级
AI 请求可使用较长超时。OCR/语音失败时应允许用户重新上传、手工输入或回到普通搜索,不应把空识别结果写成已确认车型/配件。
33. 新采购服务与销售服务
| 服务 | Provider | 当前能力 |
|---|---|---|
| Purchase Service | Providers/PurchaseService/* | 购物车、物流、退款等 |
| Sale Service | Providers/SaleService/* | 报价、快速报价等 |
| DGJ Service | Providers/DgjService/* | 订单、出库等拆分服务入口 |
这些 Provider 表明单体能力正在向独立服务迁移。改动前要确认流量开关和旧/新实现所有权:
flowchart TD
A[DGJ Controller] --> B{服务化开关/路由}
B -->|旧链路| C[本地 Service + 本地表]
B -->|新链路| D[Purchase/Sale/DGJ Service]
C --> E[统一响应]
D --> E
不能只修改本地旧 Service 后就认为线上生效。
34. 鉴权清单
| 系统族 | 仓库可见方式 | 需要确认 |
|---|---|---|
| 多数内部中心服务 | 部分 Provider 传空 header | 是否依赖内网、网关签名或服务身份 |
| IM 中心 | JSON Header,UserSig 单独返回 | 服务间鉴权是否由网关处理 |
| Udesk | 时间戳 + 配置签名 | 凭据轮换与时钟偏差 |
| 高德 | 配置 key | 配额、白名单和轮换 |
| 文件/OSS | 文件服务或临时凭证 | URL 有效期和下载权限 |
| KzMall / OpenAPI | Token Provider | Token 缓存与刷新 |
| 银行/支付通道 | 各金融 Provider 自有签名 | 证书、密钥和回调验签 |
“Provider 中没有 header”不等于接口无鉴权,必须通过网关配置和部署环境确认。
35. 超时清单
| 类型 | 常见值 | 处理原则 |
|---|---|---|
| 基础同步 Provider | 2 秒默认 | 只适合低延迟内部查询 |
| 常规中心调用 | 5 秒 | 超时后按业务键查询 |
| 订单/售后提交 | 8-20 秒 | 禁止盲目重复提交 |
| 报表/Hologres | 5 秒或服务自定义 | 可以重查,不改业务状态 |
| AI/OCR | 最长可到 20 秒级 | 提供异步或手工降级 |
| 异步 Provider | 2 秒默认 | 空回调必须标记失败而非无数据 |
每个接口都要定义:连接超时、总超时、最大重试、退避、可重试错误和最终补偿。
36. 幂等清单
| 业务 | 推荐幂等键 |
|---|---|
| 采购订单 | 外部订单号 + 明细行号 + 动作 |
| 售后 | 外部售后单号 + 来源行号 + 节点 |
| 支付 | 支付流水号 + 业务单号 + 状态 |
| 退款 | 退款流水号 + 原支付流水 + 金额 |
| 配送出库 | 配送单号 + 明细行 + 本次数量 |
| TMS | 运单号 + 状态版本/发生时间 |
| 商品变更 | SKU + 配置类型 + 版本 |
| SAAS 销售同步 | 销售/出库单号 + 事件 + 版本 |
| 渠道订单 | 平台单号 + 平台行号 + 动作 |
| GPDA | taskNo + SKU + 提交版本 |
| IM | 上游 msgId |
| OA | 模板码 + 实例号 + 业务 ID + 节点 |
| 对账单发送 | statementId + 接收人 + 发送方式 + 版本 |
37. 跨系统一致性模型
flowchart TD
A[本地事务提交] --> B[写待发送/业务日志]
B --> C[发送 HTTP 或 MQ]
C --> D{外部确认}
D -->|成功| E[记录外部单号/最终状态]
D -->|明确失败| F[回滚可回滚动作或标记失败]
D -->|超时未知| G[按幂等键主动查询]
G -->|已受理| E
G -->|未受理| H[安全重试]
G -->|仍未知| I[人工待处理]
DGJ 当前并非所有链路都有 Outbox。高风险资金、库存、订单事件应逐步补齐“本地业务提交 + 待发送记录 + 重试 + 对账”闭环。
38. ACK / NACK 决策
| 异常类型 | 例子 | 建议 |
|---|---|---|
| 参数永久错误 | 缺单号、非法枚举 | ACK + 失败记录,避免无限重试 |
| 数据暂未到 | 前置单据还没同步 | NACK/延迟重试,有上限 |
| 数据库/网络临时错误 | 超时、连接失败 | NACK |
| 已处理重复消息 | 同流水已落账 | ACK |
| 原状态冲突 | 可能重复,也可能乱序 | 先查处理记录和版本再决策 |
| 下游副作用失败 | 主事务已提交,通知失败 | ACK 主消息并创建补偿,或按契约重试 |
不能用一个通用 catch 对所有异常都 NACK,否则永久业务错误会形成重试风暴。
39. 联调前契约模板
每个新接口或事件必须明确:
系统名称:
系统 Owner / 值班群:
环境与配置常量:
协议:HTTP / Topic MQ / Direct MQ
方向:DGJ -> 对方 / 对方 -> DGJ
接口路径或 destination.routingKey:
鉴权方式:
请求字段与单位:
成功码:
业务幂等键:
超时与重试:
乱序规则:
回调/回执:
失败补偿:
日志 traceId:
上线开关:
监控与告警:
40. HTTP 请求示例
仅示意结构,不包含真实域名和凭据:
POST {CENTER_API}/imcenter/ext/zgj/user/sendimmessage
Content-Type: application/json
X-Trace-Id: trace_example
{
"message": {
"bizType": "业务类型",
"bizContext": "{\"sid\":\"站点\"}",
"bizData": "{\"businessNo\":\"业务单号\"}"
}
}
响应需同时判断 HTTP 状态和业务 code。
41. MQ 消息示例
{
"messageId": "稳定唯一消息标识",
"eventType": "garage_repair_order_updated",
"businessKey": "销售单号",
"occurredAt": "2026-07-15T12:00:00+08:00",
"version": 3,
"source": "dgj",
"traceId": "trace_example",
"data": {
"orderNo": "销售单号",
"status": "业务状态",
"items": []
}
}
42. 一次完整联调流程
sequenceDiagram
participant P as 产品/业务
participant D as DGJ开发
participant E as 外部系统开发
participant T as 测试
P->>D: 确认业务状态与失败处理
D->>E: 确认契约、幂等、单位和超时
D->>D: 记录请求/事件和本地状态
D->>E: 发送一条唯一业务样本
E-->>D: 返回外部单号或消费证据
E->>D: 回调/反向事件
D->>D: 核对本地状态、表和副作用
T->>D: 重复、乱序、超时、缺字段测试
D-->>P: 业务闭环验收
43. 故障定位总流程
flowchart TD
A[拿到业务单号/消息ID] --> B{方向}
B -->|DGJ发出| C[查本地事务与Producer日志]
B -->|DGJ接收| D[查队列Consumer与routing key]
C --> E{是否发送成功}
E -->|否| F[本地重试/Outbox/补偿]
E -->|是| G[查对方接收和业务结果]
D --> H{是否收到}
H -->|否| I[查binding、积压、消费者进程]
H -->|是| J[查幂等、状态校验和事务]
G --> K{是否有回调}
K -->|无| L[查对方回调生产与本地队列]
K -->|有| J
44. 常用日志关键字
| 系统 | 关键字 |
|---|---|
| 订单中心 | OrderCenterNotify、外部/本地采购单号 |
| 支付中心 | PayCenterNotify、支付流水、业务单号 |
| 调拨中心 | DispatchCenterNotify、配送单/发货单 |
| TMS | ExpressNoSyncNotify、运单号 |
| 商品中心 | ItemCenterNotify、SKU、事件类型 |
| SAAS | SaasOrderNotify、SyncOrder、销售/出库单号 |
| OA | OaNotify、模板码、业务 ID |
| IM | ImCenterNotify、msgId、群 ID |
| GPDA | GpdaNotify、taskNo |
| Udesk | providers/Udesk、客户业务标识 |
日志中查询手机号、银行卡、Token 等敏感信息时,应使用脱敏值或受控工具。
45. 常用代码检索
# 所有 destination 和 routing key
rg -n "const DEST_|const TYPE_|const .*NOTIFY" application/KzData/Enums/MqEventEnums.php
# 所有消费者注册
rg -n "create.*Consumer|registryCallback|startConsume" application/controllers/tasks
# 所有生产方法
rg -n "public function send|create.*Producer|publish" application/Services/Mq/MqSer.php application/Services/SyncOrder
# 外部 HTTP Provider
find application/Providers -type f -name '*.php' | sort
rg -n "requestSer|requestSerAsync|CENTER_API|REPORT_SERVICE" application/Providers
# 超时、异常和响应码
rg -n "timeout|code.*[!=]=|RequestTimeoutException|ProviderErrorException" application/Providers
46. 只读核对数据
跨系统故障至少收集以下证据,不直接修改数据:
1. 本地业务主单与明细状态。
2. 外部单号映射。
3. Producer/HTTP 请求时间、traceId、messageId。
4. 对方受理或消费证据。
5. 回调事件和 Consumer 结果。
6. 本地幂等记录或已落流水。
7. 后续库存、资金、报表和通知副作用。
47. 常见误判
| 误判 | 正确判断 |
|---|---|
| HTTP 超时就是对方没收到 | 超时属于未知,先按业务键查询 |
| MQ publish 没报错就是下游成功 | 只说明生产调用未抛错,还需 broker confirm 和消费证据 |
| 队列为空就是消息消费成功 | 可能进了死信、错误队列或被错误 ACK |
| 状态相同就是重复消息 | 也可能是乱序或漏中间事件 |
| Provider 返回空数组就是无数据 | 异步失败也可能降级为空 |
| DGJ 表正确就结束 | 还需核对外部状态和后续副作用 |
| 重发消息最安全 | 没有业务幂等时重发可能重复扣款/扣库存 |
48. 高风险公共问题
| 等级 | 问题 | 影响 |
|---|---|---|
| P0 | 支付/库存/订单事件缺乏稳定业务幂等 | 重复扣款、重复库存或重复单据 |
| P0 | 部分内部 Provider 未见显式鉴权 | 依赖网关/内网配置,边界不清 |
| P1 | BaseProvider 记录完整 headers/data/response | 敏感信息泄露风险 |
| P1 | HTTP 超时后业务代码直接重试 | 外部已受理时重复创建 |
| P1 | uniqid() 作为 MQ messageId | 不能替代业务幂等 |
| P1 | 异步 HTTP 失败返回空数组 | 把系统失败误判为无数据 |
| P1 | ACK/NACK 对业务异常分类不统一 | 重试风暴或丢失可恢复消息 |
| P2 | 各 Provider 成功码不同 | 调错父类会把成功判失败或反之 |
| P2 | 旧链路与拆分服务并存 | 修改未命中真实线上流量 |
49. 改动风险
- 修改 destination/routing key 会导致生产和消费解绑。
- 修改 payload 字段或类型会影响所有下游版本。
- 修改金额单位可能造成资金事故。
- 修改状态枚举可能让旧消息无法消费。
- 修改超时和重试可能放大下游压力。
- 修改 Provider 公共响应判断会影响多系统。
- 修改 MQ ACK/NACK 会改变积压和死信行为。
- 修改日志字段需要保证脱敏但仍可追踪。
- 修改旧/新服务路由必须确认流量开关。
50. 回归矩阵
| 维度 | 必测场景 |
|---|---|
| 正常 | 首次成功,状态与外部单号完整 |
| 重复 | 相同 messageId、不同 messageId 但相同业务键 |
| 乱序 | 完成先于创建、关闭先于更新 |
| 超时 | 对方已受理、未受理和未知三种 |
| 缺字段 | 缺业务键、金额、明细、版本 |
| 非法状态 | 本地原状态不允许 |
| 部分成功 | 主单成功、部分明细失败 |
| 下游失败 | 本地已提交,通知/回调失败 |
| 进程重启 | 消费中断后重新投递 |
| 多站点 | 相同单号前缀但不同 sid 隔离 |
| 安全 | Token、UserSig、手机号和银行信息不进日志 |
| 兼容 | 老消息无 version,新消息有 version |
51. 发布前检查清单
- [ ] 系统 Owner、值班群和升级路径已确认。
- [ ] 开发、预发、生产配置常量已核对,未记录实际密钥。
- [ ] HTTP 路径、方法、Content-Type 和成功码已确认。
- [ ] MQ destination、routing key、exchange 类型和 binding 已确认。
- [ ] 请求字段的必填、类型、金额单位和时间格式已确认。
- [ ] 业务幂等键有数据库唯一约束或可靠处理记录。
- [ ] 超时后不会盲目重复提交。
- [ ] 重复、乱序、缺字段、部分成功已回归。
- [ ] ACK/NACK、重试、死信和人工补偿已演练。
- [ ] traceId、messageId、业务单号能跨系统串联。
- [ ] 公共 Provider 日志已脱敏。
- [ ] 旧链路和新服务化链路的真实流量已确认。
- [ ] 监控覆盖请求失败率、超时、队列积压和死信。
- [ ] 回滚不会破坏已被外部受理的业务。
52. 证据文件
| 主题 | 代码证据 |
|---|---|
| MQ destination 与事件 | application/KzData/Enums/MqEventEnums.php |
| MQ 生产 | application/Services/Mq/MqSer.php |
| 销售同步 | application/Services/SyncOrder/* |
| 公共 HTTP 行为 | application/Providers/BaseProvider.php |
| 订单中心 | application/Providers/OrderCenter/*、tasks/OrderCenterNotify.php |
| 支付中心 | tasks/PayCenterNotify.php |
| 调拨与 TMS | application/Providers/DispatchCenter/*、tasks/DispatchCenterNotify.php、tasks/ExpressNoSyncNotify.php |
| 商品与库存中心 | application/Providers/ItemCenter/*、InventoryCenter/*、tasks/ItemCenterNotify.php |
| OPS | application/Providers/OpsCenter/*、OpsManager/*、tasks/OpsCenterNotify.php |
| OA | application/Providers/Oa/*、tasks/OaNotify.php、tasks/OaResultNotify.php |
| SAAS | application/Providers/KzSaas/*、tasks/SaasOrderNotify.php |
| 渠道 | tasks/ChannelOrderNotify.php |
| 全车件 | application/Providers/AllCarPartService/*、tasks/QPayCenterNotify.php |
| GPDA | tasks/GpdaNotify.php、application/Services/Gpda/* |
| IM | application/Providers/ImCenter/*、tasks/ImCenterNotify.php |
| Udesk | application/Providers/Udesk/*、tasks/UdeskNotify.php |
| 数据与报表 | application/Providers/DataService/*、ReportService/* |
| 通知与文件 | application/Providers/NotifyCenter/*、File/*、Services/Statement/StatementExportService.php |
53. 待环境确认
- 每个系统的生产 Owner、值班群和升级时限。
- 所有 HTTP 接口的网关鉴权、服务身份和凭据轮换。
- MQ exchange 类型、binding、prefetch、publisher confirm、重试和死信配置。
- 生产是否启用拆分后的 Purchase/Sale/DGJ Service 路由。
- 订单、支付、库存关键流水的数据库唯一约束。
- TMS 与调拨中心状态版本和乱序规则。
- Report Service、DataService 和 DWD 的 SLA。
- Udesk、高德、腾讯 IM、短信、OSS 的配额与告警。
- 对账单文档转换服务的高可用和失败重试。
- 公共 Provider 日志在生产的脱敏策略。
54. 维护规则
新增外部系统时,必须同步完成:
Provider/Consumer/Producer 代码
+ 配置 key(不含值)
+ 接口或事件契约
+ 幂等和补偿
+ 监控告警
+ 本文系统资产表
+ 对应业务专题
+ 可复用 Skill
废弃接口不能只删调用方,应确认队列 binding、定时任务、配置、告警和下游订阅均已清理,并在本文标记 deprecated 与下线日期。
55. 一句话记忆
每次跨系统排查都沿“本地业务提交 → 请求/消息发送 → 对方受理 → 回调消费 → 本地副作用”五段走,任何一段都要有业务键、状态证据和补偿责任人。
请求-日志-数据变更追踪卡
多入口请求链路
| 场景 | 调用方与入口 | 请求载荷/上下文 | Controller/Consumer | Service/Provider | 汇合点 | 最终业务事实 |
|---|---|---|---|---|---|---|
| 同步 HTTP 出站 | 领域 Service | 业务对象、外部接口参数、超时 | 调用方 Controller/Task | BaseProvider 及 Center/Item/Inventory/Ops/CRM 等 Provider | 本地单号 + 外部单号 | 对方受理或返回业务结果 |
| 异步 MQ 出站 | 订单/库存/财务 Service | destination、routing key、快照 | 领域 Service | MqSer | 稳定业务键 | 对方异步消费本地事实 |
| HTTP 入站 | OpenAPI/Inner/回调 URL | 签名、外部单号、事件结果 | OpenAPI/Inner Controller | 适配 Service | 外部单号映射表 | 创建本地单据或更新状态 |
| MQ 入站 | 支付/OA/订单/配送/商品中心 | message ID、事件、来源单 | tasks/*Notify | 领域 Service | 来源业务键 | 外部结果回写本地 |
日志证据矩阵
| 链路段 | 日志来源 | 可检索锚点 | 成功信号 | 失败信号 | 与下一段关联方式 | | --- | --- | --- | --- | --- | --- | --- | | 本地发起 | 调用 Service | request_id、本地单号、Provider/route | 参数快照和调用开始可定位 | 未调用或参数构造失败 | 本地单号进入 Provider | | 网络/Provider | BaseProvider/子 Provider | URL 名称、外部 request ID、耗时、HTTP/业务码 | 对方明确受理 | timeout、HTTP 非 2xx、业务失败 | 外部 request/order ID 供对方检索 | | 对方处理 | 对方日志/工单证据 | 外部 request/order ID | 对方状态完成 | 对方未收到/处理中/失败 | 外部单号进入回调 | | 回调消费 | Inner/OpenAPI/Notify 日志 | message ID、外部单号、本地单号 | 幂等落库并 ACK | 映射缺失、重复/乱序、NACK | 关系表映射到本地主表 |
环节数据变更台账
| 步骤 | 代码位置 | 事务 | 读取事实 | 写入表/缓存/MQ | 字段或数量变化 | 回查证据 |
|---|---|---|---|---|---|---|
| 本地提交 | 领域 Service | 本地事务 | 当前业务事实 | 主明细/关系表 | status/qty/amount old -> new | 本地业务单号 |
| 构造出站 | Provider/MqSer | 本地事务外 | 已提交快照 | HTTP/MQ | 本地 DB 不变;生成外部请求/消息键 | 脱敏 payload、request ID |
| 对方受理 | 外部系统 | 跨系统边界 | 请求/消息 | 对方数据 | 本地通常不变;取得外部单号/受理码 | 对方回执 |
| 回调落库 | Callback/Notify -> Service | 单回调事务 | 当前状态、外部最终结果、幂等键 | 本地主表/关系/流水 | 状态单向推进;相同键副作用一次 | 影响行数、ACK、关系表 |
| 补偿 | 领域补偿入口 | 小批幂等事务 | 双方最终事实 | 必要本地更新或重发 | 只补失败段,不重做已成功段 | 前后快照、重放零重复 |
子模块追踪:ext-order-center 订单中心
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 出站/受理 | 采购、售后等提交订单中心 | 本地/来源单号、request ID、动作 | application/Services/Mq/MqSer.php | 本地已提交订单快照、来源关系 | 本地事务外发送 ODC 消息/请求,核心 DB 不变 | local/source billNo + routing key + external request ID | 超时先向 ODC 查来源单是否受理,禁止重复建单 |
| 回调/补偿 | 审核、关闭、取消、售后结果 | message ID、外部/本地单号、状态 | application/controllers/tasks/OrderCenterNotify.php | 当前本地状态、ODC 最终态、幂等关系 | 单回调本地事务 status old -> new;ACK 在 commit 后 | message ID + event + both billNos | 乱序不回退;本地成功仅补后置消息,未落库才重放回调 |
子模块追踪:ext-pay-center 支付中心
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 发起支付 | 采购/预订单/财务提交支付 | payOrderNo、sourceOrderNo、amount | application/Providers/BaseProvider.php | 本地待支付关系、金额单位和账户组合 | Provider 调用在本地事务外;本地受理态与外部订单分界 | request ID + payOrderNo + HTTP/business code | timeout 不等于失败;先查支付中心最终态再决定重试 |
| 结果落账 | DEST_PAYCENTER_NOTIFY 回调 | message ID、payOrderNo、payStatus | application/controllers/tasks/PayCenterNotify.php | 外部成功、已有 Payment/Info、来源业务状态 | 回调本地事务首次落账 pending -> paid,重复 0 增量 | message ID + pay/source orderNo | 迟到/退款按原支付关系补偿;外部合同待环境验证 |
子模块追踪:ext-transfer-dispatch 调拨中心与 TMS
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 创建调拨配送 | 采购/销售出库后提交 | 本地单、dispatch/deliveryNo、地址/仓位 | application/Providers/DispatchCenter/OrderProvider.php | 本地出库态、关系和承运参数 | 本地关系事务后调用外部;外部单号 none -> accepted | request ID + local/external orderNo + response code | 请求超时按本地单查询外部,避免重复调拨/配送 |
| 状态回调 | 出库、物流、自提、签收、退货关闭 | message ID、event、两端单号 | application/controllers/tasks/DispatchCenterNotify.php | 当前配送/库存/来源状态 | 单回调本地事务单向 old -> new;库存副作用按领域事务 | message ID + event + both orderNos | 旧消息不回退签收;只补缺失关系、状态或库存段 |
子模块追踪:ext-item-inventory 商品中心与库存中心
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 商品同步 | SKU、价格、状态、套包事件 | message ID、event、SKU/invId、version | application/controllers/tasks/ItemCenterNotify.php | 本地物料映射、版本和影响范围 | 单消息本地事务 item old -> new;缓存索引异步刷新 | message ID + event + SKU/version | 旧版本不覆盖新值;部分派生失败只补失败层 |
| 库存查询 | 供给库存/仓库能力 HTTP | sid、SKU、warehouseCode、request ID | application/Providers/InventoryCenter/KzInventoryProvider.php | 本地请求上下文和外部返回口径 | 查询事务外且本地 DB 不写;响应作为业务校验输入 | request ID + SKU/warehouse + HTTP/business code | timeout 时不得凭缓存伪造成功;目标库存口径需联调确认 |
子模块追踪:ext-ops OPS Center 与 OPS Manager
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| OPS 调用 | 站点、菜单、运营配置查询/更新 | sid、config/rule code、operator | application/Providers/BaseProvider.php | 本地站点、配置版本和鉴权上下文 | 外部 HTTP 在本地事务外;受理结果再驱动本地配置 old -> new | request ID + sid + endpoint/business code | 外部 200 仍判断业务码;超时按配置键回查 |
| OPS 事件 | OPS Center 配置/任务通知 | message ID、event、sid/业务键 | application/Services/Mq/MqSer.php | 本地当前配置和事件版本 | 单消息本地事务 upsert;ACK 在 commit 后 | message ID + event + sid/config key | 重复事件零增量;Manager 页面结果需目标环境验证 |
子模块追踪:ext-oa OA
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 提交审批 | 活动/业务提交 OA | business ID、templateCode、processNo | application/Services/Mq/MqSer.php | 本地可提交态、申请人和业务快照 | 本地先写 draft -> pending;OA 发送在事务外 | request ID + business ID + template/processNo | timeout 查 OA 是否建流程;禁止重复流程 |
| 回调/回传 | OA 审批结果与本地结果返回 | message ID、processNo、result | application/controllers/tasks/OaNotify.php、application/controllers/tasks/OaResultNotify.php | 模板映射、当前申请态和 OA 最终态 | 回调本地事务 pending -> approved/rejected;结果 MQ commit 后发送 | message ID + processNo + business ID | 乱序不回退;本地已处理只补结果回传 |
子模块追踪:ext-saas SAAS 与 E站
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 出站同步 | 销售/出库/库存 commit 后 | local/source billNo、event、sid | application/Services/Mq/MqSer.php | 已提交本地快照和目标系统 | 本地事务外发送 App/SAAS MQ,核心 DB 不变 | billNo + event/routing key + message ID | 发送失败只补消息,不重做业务单/库存 |
| 入站动作 | DEST_DGJ inventory/close 等 | message ID、event、业务键 | application/controllers/tasks/SaasOrderNotify.php | 当前本地状态、幂等和来源关系 | 单消息本地事务 old -> new 或已完成零写入 | message ID + event + billNo/SKU | 未知事件不强推;下游消费事实需环境确认 |
子模块追踪:ext-channel 大客户渠道
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 渠道入站 | 创建、审核、发货、售后事件 | channelOrderNo/aftersaleNo、message ID | application/controllers/tasks/ChannelOrderNotify.php | 来源唯一性、当前订单/售后态、库存资金事实 | 单消息本地事务 insert/update old -> new | message ID + event + channel/local billNo | 重复来源不重复建单;完成后取消走售后,不回退正向态 |
| 渠道回传 | 本地履约/退款结果通知渠道 | local/channel billNo、status、qty/amount | application/Services/Mq/MqSer.php | 已提交本地终态和已发送事实 | commit 后事务外发送渠道消息 | both billNos + routing key + result | 渠道未收到只补消息;先确认其是否已处理 |
子模块追踪:ext-allcarpart 全车件、QCJ 与 QPay
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| HTTP 代理 | 全车件/QCJ 询价、订单、状态请求 | external request/orderNo、VIN/SKU | application/Providers/BaseProvider.php | 路由、鉴权、来源映射和脱敏参数 | 外部调用事务外;需要落单时领域本地事务建来源关系 | request ID + external/local orderNo + codes | timeout 按外部单回查;外部合同需联调验证 |
| QPay 结果 | 支付/退款异步结果 | pay/refundNo、message ID、amount | application/controllers/tasks/QPayCenterNotify.php | 原支付关系、当前资金态和通道终态 | 回调本地事务 pending -> paid/refunded,重复零增量 | message ID + pay/refundNo + source billNo | 不以 HTTP 受理当资金成功;按原支付键补偿 |
子模块追踪:ext-gpda GPDA 与 WMS
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 仓储动作 | GPDA/WMS 扫码出入库、盘点 | device/request ID、billNo、SKU、location | application/Services/Gpda/TakeStockSer.php | 单据状态、仓库货位、可收/可出量和幂等键 | 仓储本地事务写过程单与库存 qty old -> old +/- n | request ID + billNo + SKU/location + transType | 网络重试前查业务单与库存流水,避免重复加扣 |
| 结果同步 | WMS 状态/数量回传 | external/local billNo、event、message ID | application/Services/Mq/MqSer.php | 本地过程事实、外部最终态和已处理事件 | 单回调本地事务单向推进;ACK 在 commit 后 | message ID + both billNos + qty | 外部数量不符先对账,不直接覆盖本地库存 |
子模块追踪:ext-im IM 中心与腾讯 IM
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| IM 调用 | 会话、账号、群组或消息请求 | local user/conversation ID、request ID | application/Providers/ImCenter/ImCenterProvider.php | 本地用户映射、会话和脱敏消息 | 外部 HTTP 事务外;本地仅保存映射/发送态 pending -> accepted | request ID + conversation/external ID + code | 200 仍判断业务码;超时按会话业务键查送达状态 |
| IM 事件 | 消息/账号状态回调 | message ID、conversation ID、event | application/Services/Mq/MqSer.php | 当前会话、事件版本和幂等键 | 单消息本地事务 append/update;重复事件不重复消息 | message ID + conversation/event ID | 腾讯 IM 日志与最终送达需环境确认;只补失败段 |
子模块追踪:ext-wechat-udesk 微信机器人与 Udesk
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 对话转发 | 微信机器人消息进入询价/客服 | conversation/message ID、user/openId | application/Providers/BaseProvider.php | 用户会话、消息去重、机器人/人工路由 | 本地会话事务写消息 none -> received;Udesk/机器人调用事务外 | request ID + conversation/message ID + provider code | 外部 timeout 先查会话记录,禁止重复触发下单动作 |
| 异步结果 | 机器人答案、Udesk 工单/回调 | external ticket/message ID、conversation ID | application/Services/Mq/MqSer.php | 原请求、当前会话态和回调版本 | 单回调本地事务 pending -> answered/transferred | message ID + external/local IDs | 无法静态证明外部送达;环境日志标待验证,按消息键补偿 |
子模块追踪:ext-vin VIN 与国内数据平台
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| VIN 查询 | 车型/配件识别请求 | request ID、脱敏 VIN、query type | application/Providers/DevCenter/VinProvider.php | 本地查询上下文、缓存和外部合同字段 | 外部查询事务外,本地业务 DB 不写;可缓存结果 old -> latest | request ID + VIN hash + HTTP/business code | timeout/无结果允许明确降级,不伪造车型 |
| 数据回查 | 国内平台结果异常 | external request ID、VIN hash | application/Providers/BaseProvider.php | 原请求、外部响应版本和缓存时间 | 查询只读 不写;必要时失效错误缓存 | external request ID + provider + latency | 数据准确性由外部负责;反馈保留请求 ID,不存完整敏感 VIN |
子模块追踪:ext-report 报表中心、Report Service 与 DataService
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 报表查询 | 页面/导出调用离线服务 | query ID、sid、report code、filters | application/Providers/DataService/ReportProvider.php | 权限、请求口径、离线最大时间 | 外部查询只读,本地业务 DB 不写 | request/query ID + report + row/max time | timeout/空值先查离线水位,不回写 OLTP |
| 销售服务 | 销售报表/异步任务 | query/export ID、business keys | application/Providers/ReportService/SaleProvider.php | 本地筛选与外部响应/任务状态 | 文件任务可 pending -> success/failed;业务事实不变 | query/export ID + provider code | 部分结果只补查询/导出;SLA 和数据源需环境确认 |
子模块追踪:ext-crm-risk CRM 与风控中心
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| CRM 同步 | 客户/经营任务查询或同步 | customer/station ID、task ID | application/Providers/BaseProvider.php | 本地客户映射、任务状态、请求版本 | 外部 HTTP 事务外;受理后本地关系 old -> accepted | request ID + customer/task ID + code | timeout 按稳定客户/任务键回查,禁止重复任务 |
| 风控判定 | 下单/支付前调用风险中心 | sid/customer/orderNo、scene | application/Providers/RiskCenter/RiskCenterProvider.php | 业务上下文、风险请求和本地白名单 | 风控查询不写业务表;deny 时业务零写入,allow 后领域事务继续 | request ID + scene + business key + decision | 风控不可用的 fail-open/close 规则需环境确认并显式记录 |
子模块追踪:ext-notify 通知中心、JPush 与短信
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 发送通知 | 业务 commit 后短信/推送 | notification ID、template、recipient hash | application/Providers/NotifyCenter/Sms/SmsProvider.php、application/Providers/DataService/JpushProvider.php | 已提交业务、模板参数、去重键和接收方 | 外部调用事务外;本地发送态 pending -> accepted/failed | request ID + notification/template ID + provider code | 发送失败不回滚主业务;按通知业务键重试 |
| 送达回查 | 用户未收到或供应商回执 | external message ID、notification ID | application/Providers/BaseProvider.php | 受理记录、通道回执和重试次数 | 回查只读;确认失败才 accepted -> failed/retry | both message IDs + channel status | 受理不等于送达;敏感接收方只记录脱敏值 |
子模块追踪:ext-file-map 文件服务、OSS 与高德地图
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 文件服务 | 上传、下载、文档转换 | file/task ID、owner/sid、object key | application/Providers/BaseProvider.php | 文件归属、状态、类型和 URL 有效期 | 外部存储事务外;元数据 pending -> ready/failed,业务表通常不变 | request ID + file/task ID + storage code | 上传超时按 object key 查存在性;只补元数据或文件段 |
| 地图服务 | 地址解析、距离/路线查询 | request ID、address hash/coordinates | application/Providers/Amap/AmapProvider.php | 脱敏地址、坐标、缓存和业务场景 | 外部查询不写业务 DB;可缓存 old -> latest | request ID + address hash + provider code | 无结果明确返回;密钥、配额与坐标系需环境验证 |
子模块追踪:ext-ai-new-trade AI 中心、新采购与新销售服务
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| AI 请求 | 询价、语音或推荐调用 | conversation/request ID、脱敏文本 | application/Providers/AiCenter/AiCenterProvider.php、application/Providers/DevCenter/Voice2TextProvider.php | 会话、输入版本、超时/降级策略 | 外部调用事务外;本地会话 pending -> answered/failed | request ID + conversation ID + provider code | timeout 降级但不得伪造下单成功;响应需业务二次校验 |
| 新交易服务 | 新采购/新销售服务创建或同步 | sourceOrderNo、service request ID、event | application/Services/Mq/MqSer.php | 本地来源关系、责任归属、当前状态 | 本地事务外 HTTP/MQ;回调本地事务单向 old -> new | both request/order IDs + event | 新旧服务责任边界需环境确认;只补失败系统,避免双写重复单 |