qgraphflow 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +2 -2
  4. package/.cursor-plugin/plugin.json +1 -1
  5. package/.qoder-plugin/plugin.json +1 -1
  6. package/README.md +119 -70
  7. package/docs/clients.de.md +15 -24
  8. package/docs/clients.es.md +15 -24
  9. package/docs/clients.ja.md +15 -24
  10. package/docs/clients.md +15 -24
  11. package/docs/clients.pt.md +15 -24
  12. package/docs/clients.ru.md +15 -24
  13. package/docs/clients.zh-CN.md +15 -24
  14. package/docs/readme/README.de.md +120 -71
  15. package/docs/readme/README.es.md +120 -71
  16. package/docs/readme/README.ja.md +120 -71
  17. package/docs/readme/README.pt.md +120 -71
  18. package/docs/readme/README.ru.md +120 -71
  19. package/docs/readme/README.zh-CN.md +106 -59
  20. package/examples/jeepay/README.md +23 -0
  21. package/examples/jeepay/capabilities.graph.json +270 -0
  22. package/examples/jeepay/class.graph.json +237 -0
  23. package/examples/jeepay/collection.graph.json +3057 -0
  24. package/examples/jeepay/dataflow.graph.json +212 -0
  25. package/examples/jeepay/deployment.graph.json +222 -0
  26. package/examples/jeepay/engineering.graph.json +277 -0
  27. package/examples/jeepay/er.graph.json +482 -0
  28. package/examples/jeepay/flowchart.graph.json +312 -0
  29. package/examples/jeepay/relations.graph.json +289 -0
  30. package/examples/jeepay/sequence.graph.json +355 -0
  31. package/examples/jeepay/source.json +95 -0
  32. package/examples/jeepay/state.graph.json +175 -0
  33. package/examples/jeepay/usecase.graph.json +222 -0
  34. package/package.json +14 -3
  35. package/skills/q-flow/SKILL.md +28 -20
  36. package/skills/q-flow/agents/openai.yaml +1 -1
  37. package/skills/q-flow/assets/viewer/package.json +1 -1
  38. package/skills/q-flow/assets/viewer/src/architecture-overview-theme.js +22 -0
  39. package/skills/q-flow/assets/viewer/src/architecture-overview.js +340 -0
  40. package/skills/q-flow/assets/viewer/src/diagrams/architecture.js +8 -5
  41. package/skills/q-flow/assets/viewer/src/diagrams/card.js +35 -17
  42. package/skills/q-flow/assets/viewer/src/diagrams/deployment.js +7 -5
  43. package/skills/q-flow/assets/viewer/src/diagrams/drawing.js +5 -2
  44. package/skills/q-flow/assets/viewer/src/diagrams/registry.js +10 -0
  45. package/skills/q-flow/assets/viewer/src/diagrams/sequence.js +13 -7
  46. package/skills/q-flow/assets/viewer/src/edge-routing.js +43 -22
  47. package/skills/q-flow/assets/viewer/src/export-svg.js +27 -5
  48. package/skills/q-flow/assets/viewer/src/graph-validation.js +72 -15
  49. package/skills/q-flow/assets/viewer/src/i18n-messages.json +184 -8
  50. package/skills/q-flow/assets/viewer/src/layout-compaction.js +123 -0
  51. package/skills/q-flow/assets/viewer/src/layout-measure.js +14 -8
  52. package/skills/q-flow/assets/viewer/src/layout-policy.js +6 -0
  53. package/skills/q-flow/assets/viewer/src/layout-quality.js +61 -15
  54. package/skills/q-flow/assets/viewer/src/layout-refinement.js +271 -0
  55. package/skills/q-flow/assets/viewer/src/layout-semantics.js +8 -0
  56. package/skills/q-flow/assets/viewer/src/layout-spacing.js +23 -4
  57. package/skills/q-flow/assets/viewer/src/layout-templates.js +298 -0
  58. package/skills/q-flow/assets/viewer/src/node-svg.js +1 -1
  59. package/skills/q-flow/assets/viewer/src/orthogonal-routing.js +475 -0
  60. package/skills/q-flow/assets/viewer/src/presentation-graph.js +31 -0
  61. package/skills/q-flow/assets/viewer/src/route-clearance.js +144 -0
  62. package/skills/q-flow/assets/viewer/src/sequence-executions.js +22 -0
  63. package/skills/q-flow/assets/viewer/src/sequence-fragments.js +20 -2
  64. package/skills/q-flow/assets/viewer/src/session-graph.js +46 -3
  65. package/skills/q-flow/assets/viewer/src/text-layout.js +33 -6
  66. package/skills/q-flow/assets/viewer/src/view-identity.js +26 -0
  67. package/skills/q-flow/assets/viewer/src/visual-style.js +13 -5
  68. package/skills/q-flow/assets/viewer-dist/index.html +30 -28
  69. package/skills/q-flow/references/evidence-sources.md +7 -5
  70. package/skills/q-flow/references/graph-common.md +34 -34
  71. package/skills/q-flow/references/graph-schema.md +28 -7
  72. package/skills/q-flow/references/guided-intake.md +51 -71
  73. package/skills/q-flow/references/layout-routing.md +47 -0
  74. package/skills/q-flow/references/types/architecture.md +42 -22
  75. package/skills/q-flow/references/types/class.md +9 -2
  76. package/skills/q-flow/references/types/dataflow.md +11 -4
  77. package/skills/q-flow/references/types/deployment.md +11 -3
  78. package/skills/q-flow/references/types/er.md +8 -1
  79. package/skills/q-flow/references/types/flowchart.md +12 -5
  80. package/skills/q-flow/references/types/sequence.md +20 -16
  81. package/skills/q-flow/references/types/state.md +10 -3
  82. package/skills/q-flow/references/types/usecase.md +6 -0
  83. package/skills/q-flow/references/viewer-development.md +37 -24
  84. package/skills/q-flow/references/visual-contract.md +12 -6
  85. package/skills/q-flow/scripts/compile-layout.mjs +85 -102
  86. package/skills/q-flow/scripts/compile-sequence.mjs +4 -21
  87. package/skills/q-flow/scripts/generate-viewer.mjs +18 -9
  88. package/skills/q-flow/scripts/validate-graph.mjs +38 -21
  89. package/examples/order-flow.graph.json +0 -94
@@ -0,0 +1,3057 @@
1
+ {
2
+ "diagrams": [
3
+ {
4
+ "meta": {
5
+ "title": "Jeepay 平台能力架构",
6
+ "subtitle": "Jeepay 源码与配置证据",
7
+ "sourceRef": "jeequan/jeepay@e1ac9086d679826bab593f20431b7ecd292eb685",
8
+ "scope": "项目核心支付能力",
9
+ "diagramType": "architecture",
10
+ "locale": "zh-CN",
11
+ "notes": [
12
+ "能力卡片以源码中的控制器和服务为准;退款、转账和分账是独立入口。",
13
+ "本图呈现能力与关键支撑,不代表所有能力均在同一请求链路中。"
14
+ ],
15
+ "architectureView": "capabilities",
16
+ "viewId": "jeepay-capabilities"
17
+ },
18
+ "nodes": [
19
+ {
20
+ "id": "unified",
21
+ "label": "UnifiedOrderController",
22
+ "kind": "business",
23
+ "module": "payment",
24
+ "source": {
25
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
26
+ "lineStart": 44,
27
+ "lineEnd": 44,
28
+ "kind": "source"
29
+ },
30
+ "subtitle": "统一下单入口",
31
+ "tags": [
32
+ "core"
33
+ ],
34
+ "overviewText": [
35
+ "校验商户签名后选择支付方式,生成支付订单。"
36
+ ]
37
+ },
38
+ {
39
+ "id": "refund",
40
+ "label": "RefundOrderController",
41
+ "kind": "business",
42
+ "module": "refund",
43
+ "source": {
44
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/refund/RefundOrderController.java",
45
+ "lineStart": 57,
46
+ "lineEnd": 57,
47
+ "kind": "source"
48
+ },
49
+ "subtitle": "退款订单入口",
50
+ "overviewText": [
51
+ "面向已支付订单发起渠道退款。"
52
+ ]
53
+ },
54
+ {
55
+ "id": "transfer",
56
+ "label": "TransferOrderController",
57
+ "kind": "business",
58
+ "module": "transfer",
59
+ "source": {
60
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/transfer/TransferOrderController.java",
61
+ "lineStart": 55,
62
+ "lineEnd": 55,
63
+ "kind": "source"
64
+ },
65
+ "subtitle": "转账订单入口",
66
+ "overviewText": [
67
+ "向渠道发起转账。"
68
+ ]
69
+ },
70
+ {
71
+ "id": "division",
72
+ "label": "PayOrderDivisionExecController",
73
+ "kind": "business",
74
+ "module": "division",
75
+ "source": {
76
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/division/PayOrderDivisionExecController.java",
77
+ "lineStart": 57,
78
+ "lineEnd": 57,
79
+ "kind": "source"
80
+ },
81
+ "subtitle": "分账执行入口",
82
+ "overviewText": [
83
+ "按商户请求执行支付订单分账。"
84
+ ]
85
+ },
86
+ {
87
+ "id": "process",
88
+ "label": "PayOrderProcessService",
89
+ "kind": "component",
90
+ "module": "payment",
91
+ "source": {
92
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayOrderProcessService.java",
93
+ "lineStart": 40,
94
+ "lineEnd": 40,
95
+ "kind": "source"
96
+ },
97
+ "subtitle": "支付成功后的订单处理",
98
+ "overviewText": [
99
+ "确认支付成功后处理订单业务。"
100
+ ]
101
+ },
102
+ {
103
+ "id": "notify",
104
+ "label": "PayMchNotifyService",
105
+ "kind": "component",
106
+ "module": "notification",
107
+ "source": {
108
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayMchNotifyService.java",
109
+ "lineStart": 45,
110
+ "lineEnd": 45,
111
+ "kind": "source"
112
+ },
113
+ "subtitle": "保存并推送商户通知",
114
+ "overviewText": [
115
+ "保存通知记录并推送消息。"
116
+ ]
117
+ },
118
+ {
119
+ "id": "channel",
120
+ "label": "IPaymentService",
121
+ "kind": "component",
122
+ "module": "channel",
123
+ "source": {
124
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/IPaymentService.java",
125
+ "lineStart": 30,
126
+ "lineEnd": 30,
127
+ "kind": "source"
128
+ },
129
+ "subtitle": "渠道支付接口契约",
130
+ "overviewText": [
131
+ "定义渠道支付检查与支付调用。"
132
+ ]
133
+ },
134
+ {
135
+ "id": "orderdb",
136
+ "label": "PayOrderService",
137
+ "kind": "data",
138
+ "module": "payment",
139
+ "source": {
140
+ "file": "jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayOrderService.java",
141
+ "lineStart": 49,
142
+ "lineEnd": 49,
143
+ "kind": "source"
144
+ },
145
+ "subtitle": "支付订单持久化与条件更新",
146
+ "overviewText": [
147
+ "持久化并按原状态条件更新订单。"
148
+ ]
149
+ }
150
+ ],
151
+ "edges": [
152
+ {
153
+ "id": "c1",
154
+ "source": "unified",
155
+ "target": "channel",
156
+ "kind": "call",
157
+ "label": "调起渠道支付",
158
+ "evidence": "source",
159
+ "site": {
160
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
161
+ "lineStart": 205,
162
+ "lineEnd": 205
163
+ }
164
+ },
165
+ {
166
+ "id": "c2",
167
+ "source": "unified",
168
+ "target": "orderdb",
169
+ "kind": "data",
170
+ "label": "保存支付订单",
171
+ "evidence": "source",
172
+ "site": {
173
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
174
+ "lineStart": 201,
175
+ "lineEnd": 201
176
+ }
177
+ },
178
+ {
179
+ "id": "c3",
180
+ "source": "unified",
181
+ "target": "process",
182
+ "kind": "call",
183
+ "label": "处理支付结果",
184
+ "evidence": "source",
185
+ "site": {
186
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
187
+ "lineStart": 383,
188
+ "lineEnd": 383
189
+ }
190
+ },
191
+ {
192
+ "id": "c4",
193
+ "source": "process",
194
+ "target": "notify",
195
+ "kind": "call",
196
+ "label": "通知商户",
197
+ "evidence": "source",
198
+ "site": {
199
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayOrderProcessService.java",
200
+ "lineStart": 60,
201
+ "lineEnd": 60
202
+ }
203
+ },
204
+ {
205
+ "id": "c5",
206
+ "source": "process",
207
+ "target": "orderdb",
208
+ "kind": "data",
209
+ "label": "查询订单",
210
+ "evidence": "source",
211
+ "site": {
212
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayOrderProcessService.java",
213
+ "lineStart": 51,
214
+ "lineEnd": 51
215
+ }
216
+ }
217
+ ],
218
+ "layout": {
219
+ "sections": [
220
+ {
221
+ "id": "entry",
222
+ "title": "业务能力入口",
223
+ "mode": "grid",
224
+ "columns": 4,
225
+ "tone": "blue",
226
+ "items": [
227
+ {
228
+ "nodeId": "unified"
229
+ },
230
+ {
231
+ "nodeId": "refund"
232
+ },
233
+ {
234
+ "nodeId": "transfer"
235
+ },
236
+ {
237
+ "nodeId": "division"
238
+ }
239
+ ]
240
+ },
241
+ {
242
+ "id": "core",
243
+ "title": "支付处理",
244
+ "mode": "row",
245
+ "tone": "green",
246
+ "items": [
247
+ {
248
+ "nodeId": "channel"
249
+ },
250
+ {
251
+ "nodeId": "process"
252
+ }
253
+ ]
254
+ },
255
+ {
256
+ "id": "support",
257
+ "title": "订单与通知支撑",
258
+ "mode": "row",
259
+ "tone": "subtle",
260
+ "items": [
261
+ {
262
+ "nodeId": "orderdb"
263
+ },
264
+ {
265
+ "nodeId": "notify"
266
+ }
267
+ ]
268
+ }
269
+ ],
270
+ "direction": "down"
271
+ }
272
+ },
273
+ {
274
+ "meta": {
275
+ "title": "Jeepay 工程分层架构",
276
+ "subtitle": "Jeepay 源码与配置证据",
277
+ "sourceRef": "jeequan/jeepay@e1ac9086d679826bab593f20431b7ecd292eb685",
278
+ "scope": "Maven 模块与编译期依赖",
279
+ "diagramType": "architecture",
280
+ "locale": "zh-CN",
281
+ "notes": [
282
+ "箭头表示 pom.xml 声明的模块依赖,不表示运行时 HTTP 调用。",
283
+ "jeepay-z-codegen 是独立代码生成模块,不在支付主干分层中。"
284
+ ],
285
+ "architectureView": "engineering",
286
+ "viewId": "jeepay-engineering"
287
+ },
288
+ "nodes": [
289
+ {
290
+ "id": "manager",
291
+ "label": "jeepay-manager",
292
+ "kind": "component",
293
+ "module": "manager",
294
+ "source": {
295
+ "file": "jeepay-manager/pom.xml",
296
+ "lineStart": 7,
297
+ "lineEnd": 7,
298
+ "kind": "config"
299
+ },
300
+ "subtitle": "Maven 模块",
301
+ "overviewText": [
302
+ "运营管理端应用模块"
303
+ ]
304
+ },
305
+ {
306
+ "id": "merchant",
307
+ "label": "jeepay-merchant",
308
+ "kind": "component",
309
+ "module": "merchant",
310
+ "source": {
311
+ "file": "jeepay-merchant/pom.xml",
312
+ "lineStart": 7,
313
+ "lineEnd": 7,
314
+ "kind": "config"
315
+ },
316
+ "subtitle": "Maven 模块",
317
+ "overviewText": [
318
+ "商户管理端应用模块"
319
+ ]
320
+ },
321
+ {
322
+ "id": "payment",
323
+ "label": "jeepay-payment",
324
+ "kind": "business",
325
+ "module": "payment",
326
+ "source": {
327
+ "file": "jeepay-payment/pom.xml",
328
+ "lineStart": 7,
329
+ "lineEnd": 7,
330
+ "kind": "config"
331
+ },
332
+ "subtitle": "Maven 模块",
333
+ "tags": [
334
+ "core"
335
+ ],
336
+ "overviewText": [
337
+ "统一支付网关应用模块"
338
+ ]
339
+ },
340
+ {
341
+ "id": "service",
342
+ "label": "jeepay-service",
343
+ "kind": "component",
344
+ "module": "service",
345
+ "source": {
346
+ "file": "jeepay-service/pom.xml",
347
+ "lineStart": 7,
348
+ "lineEnd": 7,
349
+ "kind": "config"
350
+ },
351
+ "subtitle": "Maven 模块",
352
+ "overviewText": [
353
+ "数据库服务与持久化访问模块"
354
+ ]
355
+ },
356
+ {
357
+ "id": "core",
358
+ "label": "jeepay-core",
359
+ "kind": "component",
360
+ "module": "core",
361
+ "source": {
362
+ "file": "jeepay-core/pom.xml",
363
+ "lineStart": 7,
364
+ "lineEnd": 7,
365
+ "kind": "config"
366
+ },
367
+ "subtitle": "Maven 模块",
368
+ "overviewText": [
369
+ "公共实体、模型与工具模块"
370
+ ]
371
+ },
372
+ {
373
+ "id": "mq",
374
+ "label": "jeepay-components-mq",
375
+ "kind": "component",
376
+ "module": "mq",
377
+ "source": {
378
+ "file": "jeepay-components/jeepay-components-mq/pom.xml",
379
+ "lineStart": 7,
380
+ "lineEnd": 7,
381
+ "kind": "config"
382
+ },
383
+ "subtitle": "Maven 模块",
384
+ "overviewText": [
385
+ "消息队列抽象与实现模块"
386
+ ]
387
+ },
388
+ {
389
+ "id": "oss",
390
+ "label": "jeepay-components-oss",
391
+ "kind": "component",
392
+ "module": "oss",
393
+ "source": {
394
+ "file": "jeepay-components/jeepay-components-oss/pom.xml",
395
+ "lineStart": 7,
396
+ "lineEnd": 7,
397
+ "kind": "config"
398
+ },
399
+ "subtitle": "Maven 模块",
400
+ "overviewText": [
401
+ "对象存储组件模块"
402
+ ]
403
+ }
404
+ ],
405
+ "edges": [
406
+ {
407
+ "id": "e1",
408
+ "source": "manager",
409
+ "target": "service",
410
+ "kind": "depends",
411
+ "label": "Maven 依赖",
412
+ "evidence": "source",
413
+ "site": {
414
+ "file": "jeepay-manager/pom.xml",
415
+ "lineStart": 24,
416
+ "lineEnd": 24
417
+ }
418
+ },
419
+ {
420
+ "id": "e2",
421
+ "source": "merchant",
422
+ "target": "service",
423
+ "kind": "depends",
424
+ "label": "Maven 依赖",
425
+ "evidence": "source",
426
+ "site": {
427
+ "file": "jeepay-merchant/pom.xml",
428
+ "lineStart": 24,
429
+ "lineEnd": 24
430
+ }
431
+ },
432
+ {
433
+ "id": "e3",
434
+ "source": "payment",
435
+ "target": "service",
436
+ "kind": "depends",
437
+ "label": "Maven 依赖",
438
+ "evidence": "source",
439
+ "site": {
440
+ "file": "jeepay-payment/pom.xml",
441
+ "lineStart": 30,
442
+ "lineEnd": 30
443
+ }
444
+ },
445
+ {
446
+ "id": "e4",
447
+ "source": "payment",
448
+ "target": "mq",
449
+ "kind": "depends",
450
+ "label": "Maven 依赖",
451
+ "evidence": "source",
452
+ "site": {
453
+ "file": "jeepay-payment/pom.xml",
454
+ "lineStart": 42,
455
+ "lineEnd": 42
456
+ }
457
+ },
458
+ {
459
+ "id": "e5",
460
+ "source": "payment",
461
+ "target": "oss",
462
+ "kind": "depends",
463
+ "label": "Maven 依赖",
464
+ "evidence": "source",
465
+ "site": {
466
+ "file": "jeepay-payment/pom.xml",
467
+ "lineStart": 36,
468
+ "lineEnd": 36
469
+ }
470
+ },
471
+ {
472
+ "id": "e6",
473
+ "source": "service",
474
+ "target": "core",
475
+ "kind": "depends",
476
+ "label": "Maven 依赖",
477
+ "evidence": "source",
478
+ "site": {
479
+ "file": "jeepay-service/pom.xml",
480
+ "lineStart": 24,
481
+ "lineEnd": 24
482
+ }
483
+ },
484
+ {
485
+ "id": "e7",
486
+ "source": "mq",
487
+ "target": "core",
488
+ "kind": "depends",
489
+ "label": "Maven 依赖",
490
+ "evidence": "source",
491
+ "site": {
492
+ "file": "jeepay-components/jeepay-components-mq/pom.xml",
493
+ "lineStart": 25,
494
+ "lineEnd": 25
495
+ }
496
+ }
497
+ ],
498
+ "layout": {
499
+ "sections": [
500
+ {
501
+ "id": "app",
502
+ "title": "应用入口",
503
+ "mode": "grid",
504
+ "columns": 3,
505
+ "tone": "blue",
506
+ "items": [
507
+ {
508
+ "nodeId": "manager"
509
+ },
510
+ {
511
+ "nodeId": "merchant"
512
+ },
513
+ {
514
+ "nodeId": "payment"
515
+ }
516
+ ]
517
+ },
518
+ {
519
+ "id": "domain",
520
+ "title": "持久化与公共模型",
521
+ "mode": "stack",
522
+ "tone": "green",
523
+ "items": [
524
+ {
525
+ "nodeId": "service"
526
+ },
527
+ {
528
+ "nodeId": "core"
529
+ }
530
+ ]
531
+ },
532
+ {
533
+ "id": "components",
534
+ "title": "可复用组件",
535
+ "mode": "row",
536
+ "tone": "lavender",
537
+ "items": [
538
+ {
539
+ "nodeId": "mq"
540
+ },
541
+ {
542
+ "nodeId": "oss"
543
+ }
544
+ ]
545
+ }
546
+ ],
547
+ "direction": "down"
548
+ }
549
+ },
550
+ {
551
+ "meta": {
552
+ "title": "Jeepay 支付组件关系架构",
553
+ "subtitle": "Jeepay 源码与配置证据",
554
+ "sourceRef": "jeequan/jeepay@e1ac9086d679826bab593f20431b7ecd292eb685",
555
+ "scope": "统一下单与异步回调组件",
556
+ "diagramType": "architecture",
557
+ "locale": "zh-CN",
558
+ "notes": [
559
+ "渠道实现经 SpringBeansUtil 按 ifCode 动态获取;静态调用图不能穷举实际运行时 Bean。",
560
+ "回调只在订单为 STATE_ING 时执行成功/失败条件更新。"
561
+ ],
562
+ "architectureView": "relations",
563
+ "viewId": "jeepay-relations"
564
+ },
565
+ "nodes": [
566
+ {
567
+ "id": "unified",
568
+ "label": "UnifiedOrderController",
569
+ "kind": "service",
570
+ "module": "payment",
571
+ "source": {
572
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
573
+ "lineStart": 44,
574
+ "lineEnd": 44,
575
+ "kind": "source"
576
+ },
577
+ "tags": [
578
+ "core"
579
+ ]
580
+ },
581
+ {
582
+ "id": "abstract",
583
+ "label": "AbstractPayOrderController",
584
+ "kind": "business",
585
+ "module": "payment",
586
+ "source": {
587
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
588
+ "lineStart": 64,
589
+ "lineEnd": 64,
590
+ "kind": "source"
591
+ }
592
+ },
593
+ {
594
+ "id": "api",
595
+ "label": "ApiController",
596
+ "kind": "security",
597
+ "module": "payment",
598
+ "source": {
599
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/ApiController.java",
600
+ "lineStart": 39,
601
+ "lineEnd": 39,
602
+ "kind": "source"
603
+ }
604
+ },
605
+ {
606
+ "id": "config",
607
+ "label": "ConfigContextQueryService",
608
+ "kind": "component",
609
+ "module": "config",
610
+ "source": {
611
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/ConfigContextQueryService.java",
612
+ "lineStart": 48,
613
+ "lineEnd": 48,
614
+ "kind": "source"
615
+ }
616
+ },
617
+ {
618
+ "id": "passage",
619
+ "label": "MchPayPassageService",
620
+ "kind": "component",
621
+ "module": "config",
622
+ "source": {
623
+ "file": "jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/MchPayPassageService.java",
624
+ "lineStart": 45,
625
+ "lineEnd": 45,
626
+ "kind": "source"
627
+ }
628
+ },
629
+ {
630
+ "id": "orders",
631
+ "label": "PayOrderService",
632
+ "kind": "data",
633
+ "module": "payment",
634
+ "source": {
635
+ "file": "jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayOrderService.java",
636
+ "lineStart": 49,
637
+ "lineEnd": 49,
638
+ "kind": "source"
639
+ }
640
+ },
641
+ {
642
+ "id": "channel",
643
+ "label": "IPaymentService",
644
+ "kind": "component",
645
+ "module": "channel",
646
+ "source": {
647
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/IPaymentService.java",
648
+ "lineStart": 30,
649
+ "lineEnd": 30,
650
+ "kind": "source"
651
+ }
652
+ },
653
+ {
654
+ "id": "process",
655
+ "label": "PayOrderProcessService",
656
+ "kind": "component",
657
+ "module": "payment",
658
+ "source": {
659
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayOrderProcessService.java",
660
+ "lineStart": 40,
661
+ "lineEnd": 40,
662
+ "kind": "source"
663
+ }
664
+ },
665
+ {
666
+ "id": "notify",
667
+ "label": "PayMchNotifyService",
668
+ "kind": "component",
669
+ "module": "notification",
670
+ "source": {
671
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayMchNotifyService.java",
672
+ "lineStart": 45,
673
+ "lineEnd": 45,
674
+ "kind": "source"
675
+ }
676
+ },
677
+ {
678
+ "id": "callback",
679
+ "label": "ChannelNoticeController",
680
+ "kind": "service",
681
+ "module": "payment",
682
+ "source": {
683
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/ChannelNoticeController.java",
684
+ "lineStart": 54,
685
+ "lineEnd": 54,
686
+ "kind": "source"
687
+ }
688
+ }
689
+ ],
690
+ "edges": [
691
+ {
692
+ "id": "r1",
693
+ "source": "unified",
694
+ "target": "abstract",
695
+ "kind": "inherits",
696
+ "label": "继承下单编排",
697
+ "evidence": "source",
698
+ "site": {
699
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
700
+ "lineStart": 44,
701
+ "lineEnd": 44
702
+ }
703
+ },
704
+ {
705
+ "id": "r2",
706
+ "source": "abstract",
707
+ "target": "api",
708
+ "kind": "inherits",
709
+ "label": "继承请求校验",
710
+ "evidence": "source",
711
+ "site": {
712
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
713
+ "lineStart": 64,
714
+ "lineEnd": 64
715
+ }
716
+ },
717
+ {
718
+ "id": "r3",
719
+ "source": "unified",
720
+ "target": "abstract",
721
+ "kind": "call",
722
+ "label": "统一下单",
723
+ "evidence": "source",
724
+ "site": {
725
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
726
+ "lineStart": 61,
727
+ "lineEnd": 61
728
+ }
729
+ },
730
+ {
731
+ "id": "r4",
732
+ "source": "abstract",
733
+ "target": "config",
734
+ "kind": "call",
735
+ "label": "查询商户配置",
736
+ "evidence": "source",
737
+ "site": {
738
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
739
+ "lineStart": 129,
740
+ "lineEnd": 129
741
+ }
742
+ },
743
+ {
744
+ "id": "r5",
745
+ "source": "abstract",
746
+ "target": "passage",
747
+ "kind": "call",
748
+ "label": "选择通道",
749
+ "evidence": "source",
750
+ "site": {
751
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
752
+ "lineStart": 167,
753
+ "lineEnd": 167
754
+ }
755
+ },
756
+ {
757
+ "id": "r6",
758
+ "source": "abstract",
759
+ "target": "orders",
760
+ "kind": "data",
761
+ "label": "保存支付订单",
762
+ "evidence": "source",
763
+ "site": {
764
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
765
+ "lineStart": 201,
766
+ "lineEnd": 201
767
+ }
768
+ },
769
+ {
770
+ "id": "r7",
771
+ "source": "abstract",
772
+ "target": "channel",
773
+ "kind": "call",
774
+ "label": "调用 pay",
775
+ "evidence": "source",
776
+ "site": {
777
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
778
+ "lineStart": 205,
779
+ "lineEnd": 205
780
+ }
781
+ },
782
+ {
783
+ "id": "r8",
784
+ "source": "abstract",
785
+ "target": "process",
786
+ "kind": "call",
787
+ "label": "处理支付状态",
788
+ "evidence": "source",
789
+ "site": {
790
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
791
+ "lineStart": 383,
792
+ "lineEnd": 383
793
+ }
794
+ },
795
+ {
796
+ "id": "r9",
797
+ "source": "callback",
798
+ "target": "orders",
799
+ "kind": "data",
800
+ "label": "条件更新订单",
801
+ "evidence": "source",
802
+ "site": {
803
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/ChannelNoticeController.java",
804
+ "lineStart": 237,
805
+ "lineEnd": 237
806
+ }
807
+ },
808
+ {
809
+ "id": "r10",
810
+ "source": "callback",
811
+ "target": "process",
812
+ "kind": "call",
813
+ "label": "成功后处理",
814
+ "evidence": "source",
815
+ "site": {
816
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/ChannelNoticeController.java",
817
+ "lineStart": 254,
818
+ "lineEnd": 254
819
+ }
820
+ },
821
+ {
822
+ "id": "r11",
823
+ "source": "process",
824
+ "target": "notify",
825
+ "kind": "call",
826
+ "label": "发商户通知",
827
+ "evidence": "source",
828
+ "site": {
829
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayOrderProcessService.java",
830
+ "lineStart": 60,
831
+ "lineEnd": 60
832
+ }
833
+ }
834
+ ],
835
+ "layout": {
836
+ "direction": "right"
837
+ }
838
+ },
839
+ {
840
+ "meta": {
841
+ "title": "统一下单流程图",
842
+ "subtitle": "Jeepay 源码与配置证据",
843
+ "sourceRef": "jeequan/jeepay@e1ac9086d679826bab593f20431b7ecd292eb685",
844
+ "scope": "普通新订单分支",
845
+ "diagramType": "flowchart",
846
+ "locale": "zh-CN",
847
+ "notes": [
848
+ "展示普通新订单主线;QR_CASHIER 会先创建订单并直接返回收银台地址。",
849
+ "渠道返回成功、失败、等待等状态由 processChannelMsg 分流;详见状态图。"
850
+ ],
851
+ "viewId": "jeepay-flowchart"
852
+ },
853
+ "nodes": [
854
+ {
855
+ "id": "start",
856
+ "label": "POST /api/pay/unifiedOrder",
857
+ "kind": "start",
858
+ "module": "payment",
859
+ "source": {
860
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
861
+ "lineStart": 52,
862
+ "lineEnd": 52,
863
+ "kind": "source"
864
+ }
865
+ },
866
+ {
867
+ "id": "verify",
868
+ "label": "getRQByWithMchSign",
869
+ "kind": "input",
870
+ "module": "payment",
871
+ "source": {
872
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
873
+ "lineStart": 56,
874
+ "lineEnd": 56,
875
+ "kind": "source"
876
+ }
877
+ },
878
+ {
879
+ "id": "way",
880
+ "label": "支付方式受支持?",
881
+ "kind": "decision",
882
+ "module": "payment",
883
+ "source": {
884
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
885
+ "lineStart": 100,
886
+ "lineEnd": 100,
887
+ "kind": "source"
888
+ }
889
+ },
890
+ {
891
+ "id": "config",
892
+ "label": "queryMchInfoAndAppInfo",
893
+ "kind": "process",
894
+ "module": "config",
895
+ "source": {
896
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
897
+ "lineStart": 129,
898
+ "lineEnd": 129,
899
+ "kind": "source"
900
+ }
901
+ },
902
+ {
903
+ "id": "appok",
904
+ "label": "商户应用可用?",
905
+ "kind": "decision",
906
+ "module": "payment",
907
+ "source": {
908
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
909
+ "lineStart": 137,
910
+ "lineEnd": 137,
911
+ "kind": "source"
912
+ }
913
+ },
914
+ {
915
+ "id": "passage",
916
+ "label": "findMchPayPassage",
917
+ "kind": "process",
918
+ "module": "channel",
919
+ "source": {
920
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
921
+ "lineStart": 167,
922
+ "lineEnd": 167,
923
+ "kind": "source"
924
+ }
925
+ },
926
+ {
927
+ "id": "save",
928
+ "label": "payOrderService.save",
929
+ "kind": "process",
930
+ "module": "payment",
931
+ "source": {
932
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
933
+ "lineStart": 201,
934
+ "lineEnd": 201,
935
+ "kind": "source"
936
+ },
937
+ "tags": [
938
+ "core"
939
+ ]
940
+ },
941
+ {
942
+ "id": "pay",
943
+ "label": "paymentService.pay",
944
+ "kind": "subprocess",
945
+ "module": "channel",
946
+ "source": {
947
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
948
+ "lineStart": 205,
949
+ "lineEnd": 205,
950
+ "kind": "source"
951
+ }
952
+ },
953
+ {
954
+ "id": "update",
955
+ "label": "processChannelMsg",
956
+ "kind": "process",
957
+ "module": "payment",
958
+ "source": {
959
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
960
+ "lineStart": 208,
961
+ "lineEnd": 208,
962
+ "kind": "source"
963
+ }
964
+ },
965
+ {
966
+ "id": "return",
967
+ "label": "ApiRes.okWithSign",
968
+ "kind": "end",
969
+ "module": "payment",
970
+ "source": {
971
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
972
+ "lineStart": 78,
973
+ "lineEnd": 78,
974
+ "kind": "source"
975
+ }
976
+ },
977
+ {
978
+ "id": "fail",
979
+ "label": "ApiRes.customFail / BizException",
980
+ "kind": "end",
981
+ "module": "payment",
982
+ "source": {
983
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
984
+ "lineStart": 213,
985
+ "lineEnd": 213,
986
+ "kind": "source"
987
+ }
988
+ }
989
+ ],
990
+ "edges": [
991
+ {
992
+ "id": "f1",
993
+ "source": "start",
994
+ "target": "verify",
995
+ "kind": "flow",
996
+ "label": "读取并验签",
997
+ "evidence": "source",
998
+ "site": {
999
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
1000
+ "lineStart": 56,
1001
+ "lineEnd": 56
1002
+ }
1003
+ },
1004
+ {
1005
+ "id": "f2",
1006
+ "source": "verify",
1007
+ "target": "way",
1008
+ "kind": "flow",
1009
+ "label": "构建业务请求",
1010
+ "evidence": "source",
1011
+ "site": {
1012
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
1013
+ "lineStart": 58,
1014
+ "lineEnd": 58
1015
+ }
1016
+ },
1017
+ {
1018
+ "id": "f3",
1019
+ "source": "way",
1020
+ "target": "config",
1021
+ "kind": "yes",
1022
+ "label": "是",
1023
+ "evidence": "source",
1024
+ "site": {
1025
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
1026
+ "lineStart": 100,
1027
+ "lineEnd": 100
1028
+ }
1029
+ },
1030
+ {
1031
+ "id": "f4",
1032
+ "source": "way",
1033
+ "target": "fail",
1034
+ "kind": "no",
1035
+ "label": "否",
1036
+ "evidence": "source",
1037
+ "site": {
1038
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
1039
+ "lineStart": 101,
1040
+ "lineEnd": 101
1041
+ }
1042
+ },
1043
+ {
1044
+ "id": "f5",
1045
+ "source": "config",
1046
+ "target": "appok",
1047
+ "kind": "flow",
1048
+ "label": "读取应用状态",
1049
+ "evidence": "source",
1050
+ "site": {
1051
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
1052
+ "lineStart": 137,
1053
+ "lineEnd": 137
1054
+ }
1055
+ },
1056
+ {
1057
+ "id": "f6",
1058
+ "source": "appok",
1059
+ "target": "passage",
1060
+ "kind": "yes",
1061
+ "label": "是",
1062
+ "evidence": "source",
1063
+ "site": {
1064
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
1065
+ "lineStart": 167,
1066
+ "lineEnd": 167
1067
+ }
1068
+ },
1069
+ {
1070
+ "id": "f7",
1071
+ "source": "appok",
1072
+ "target": "fail",
1073
+ "kind": "no",
1074
+ "label": "否",
1075
+ "evidence": "source",
1076
+ "site": {
1077
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
1078
+ "lineStart": 138,
1079
+ "lineEnd": 138
1080
+ }
1081
+ },
1082
+ {
1083
+ "id": "f8",
1084
+ "source": "passage",
1085
+ "target": "save",
1086
+ "kind": "flow",
1087
+ "label": "生成并保存订单",
1088
+ "evidence": "source",
1089
+ "site": {
1090
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
1091
+ "lineStart": 201,
1092
+ "lineEnd": 201
1093
+ }
1094
+ },
1095
+ {
1096
+ "id": "f9",
1097
+ "source": "save",
1098
+ "target": "pay",
1099
+ "kind": "flow",
1100
+ "label": "调起渠道",
1101
+ "evidence": "source",
1102
+ "site": {
1103
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
1104
+ "lineStart": 205,
1105
+ "lineEnd": 205
1106
+ }
1107
+ },
1108
+ {
1109
+ "id": "f10",
1110
+ "source": "pay",
1111
+ "target": "update",
1112
+ "kind": "flow",
1113
+ "label": "处理渠道返回",
1114
+ "evidence": "source",
1115
+ "site": {
1116
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
1117
+ "lineStart": 208,
1118
+ "lineEnd": 208
1119
+ }
1120
+ },
1121
+ {
1122
+ "id": "f11",
1123
+ "source": "update",
1124
+ "target": "return",
1125
+ "kind": "success",
1126
+ "label": "封装签名响应",
1127
+ "evidence": "source",
1128
+ "site": {
1129
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
1130
+ "lineStart": 78,
1131
+ "lineEnd": 78
1132
+ }
1133
+ }
1134
+ ],
1135
+ "layout": {
1136
+ "primaryPath": [
1137
+ "start",
1138
+ "verify",
1139
+ "way",
1140
+ "config",
1141
+ "appok",
1142
+ "passage",
1143
+ "save",
1144
+ "pay",
1145
+ "update",
1146
+ "return"
1147
+ ],
1148
+ "direction": "down"
1149
+ }
1150
+ },
1151
+ {
1152
+ "meta": {
1153
+ "title": "统一下单与成功回调时序图",
1154
+ "subtitle": "Jeepay 源码与配置证据",
1155
+ "sourceRef": "jeequan/jeepay@e1ac9086d679826bab593f20431b7ecd292eb685",
1156
+ "scope": "普通下单及异步成功回调",
1157
+ "diagramType": "sequence",
1158
+ "locale": "zh-CN",
1159
+ "notes": [
1160
+ "图中回调阶段仅展示 CONFIRM_SUCCESS 分支;失败分支更新 STATE_FAIL。",
1161
+ "渠道支付接口由运行时 Bean 选择;支付渠道内部调用未在仓库中展开。"
1162
+ ],
1163
+ "viewId": "jeepay-sequence"
1164
+ },
1165
+ "nodes": [
1166
+ {
1167
+ "id": "merchant",
1168
+ "label": "商户系统",
1169
+ "kind": "actor"
1170
+ },
1171
+ {
1172
+ "id": "unified",
1173
+ "label": "UnifiedOrderController",
1174
+ "kind": "service",
1175
+ "module": "payment",
1176
+ "source": {
1177
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
1178
+ "lineStart": 44,
1179
+ "lineEnd": 44,
1180
+ "kind": "source"
1181
+ }
1182
+ },
1183
+ {
1184
+ "id": "abstract",
1185
+ "label": "AbstractPayOrderController",
1186
+ "kind": "service",
1187
+ "module": "payment",
1188
+ "source": {
1189
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
1190
+ "lineStart": 64,
1191
+ "lineEnd": 64,
1192
+ "kind": "source"
1193
+ }
1194
+ },
1195
+ {
1196
+ "id": "orders",
1197
+ "label": "PayOrderService",
1198
+ "kind": "service",
1199
+ "module": "payment",
1200
+ "source": {
1201
+ "file": "jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayOrderService.java",
1202
+ "lineStart": 49,
1203
+ "lineEnd": 49,
1204
+ "kind": "source"
1205
+ }
1206
+ },
1207
+ {
1208
+ "id": "channelapi",
1209
+ "label": "IPaymentService",
1210
+ "kind": "service",
1211
+ "module": "channel",
1212
+ "source": {
1213
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/IPaymentService.java",
1214
+ "lineStart": 30,
1215
+ "lineEnd": 30,
1216
+ "kind": "source"
1217
+ }
1218
+ },
1219
+ {
1220
+ "id": "channel",
1221
+ "label": "支付渠道",
1222
+ "kind": "external",
1223
+ "module": "channel"
1224
+ },
1225
+ {
1226
+ "id": "callback",
1227
+ "label": "ChannelNoticeController",
1228
+ "kind": "service",
1229
+ "module": "payment",
1230
+ "source": {
1231
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/ChannelNoticeController.java",
1232
+ "lineStart": 54,
1233
+ "lineEnd": 54,
1234
+ "kind": "source"
1235
+ }
1236
+ },
1237
+ {
1238
+ "id": "process",
1239
+ "label": "PayOrderProcessService",
1240
+ "kind": "service",
1241
+ "module": "payment",
1242
+ "source": {
1243
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayOrderProcessService.java",
1244
+ "lineStart": 40,
1245
+ "lineEnd": 40,
1246
+ "kind": "source"
1247
+ }
1248
+ },
1249
+ {
1250
+ "id": "notify",
1251
+ "label": "PayMchNotifyService",
1252
+ "kind": "service",
1253
+ "module": "notification",
1254
+ "source": {
1255
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayMchNotifyService.java",
1256
+ "lineStart": 45,
1257
+ "lineEnd": 45,
1258
+ "kind": "source"
1259
+ }
1260
+ }
1261
+ ],
1262
+ "edges": [
1263
+ {
1264
+ "id": "m1",
1265
+ "source": "merchant",
1266
+ "target": "unified",
1267
+ "kind": "sync",
1268
+ "label": "POST /api/pay/unifiedOrder",
1269
+ "evidence": "source",
1270
+ "site": {
1271
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
1272
+ "lineStart": 52,
1273
+ "lineEnd": 52
1274
+ },
1275
+ "order": 1
1276
+ },
1277
+ {
1278
+ "id": "m2",
1279
+ "source": "unified",
1280
+ "target": "abstract",
1281
+ "kind": "sync",
1282
+ "label": "unifiedOrder(wayCode, bizRQ)",
1283
+ "evidence": "source",
1284
+ "site": {
1285
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
1286
+ "lineStart": 61,
1287
+ "lineEnd": 61
1288
+ },
1289
+ "order": 2
1290
+ },
1291
+ {
1292
+ "id": "m3",
1293
+ "source": "abstract",
1294
+ "target": "orders",
1295
+ "kind": "sync",
1296
+ "label": "save(payOrder)",
1297
+ "evidence": "source",
1298
+ "site": {
1299
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
1300
+ "lineStart": 201,
1301
+ "lineEnd": 201
1302
+ },
1303
+ "order": 3
1304
+ },
1305
+ {
1306
+ "id": "m4",
1307
+ "source": "abstract",
1308
+ "target": "channelapi",
1309
+ "kind": "sync",
1310
+ "label": "pay(bizRQ, payOrder, context)",
1311
+ "evidence": "source",
1312
+ "site": {
1313
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
1314
+ "lineStart": 205,
1315
+ "lineEnd": 205
1316
+ },
1317
+ "order": 4
1318
+ },
1319
+ {
1320
+ "id": "m5",
1321
+ "source": "channelapi",
1322
+ "target": "abstract",
1323
+ "kind": "return",
1324
+ "label": "UnifiedOrderRS / ChannelRetMsg",
1325
+ "evidence": "source",
1326
+ "site": {
1327
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
1328
+ "lineStart": 208,
1329
+ "lineEnd": 208
1330
+ },
1331
+ "order": 5,
1332
+ "replyTo": "m4"
1333
+ },
1334
+ {
1335
+ "id": "m6",
1336
+ "source": "abstract",
1337
+ "target": "unified",
1338
+ "kind": "return",
1339
+ "label": "ApiRes",
1340
+ "evidence": "source",
1341
+ "site": {
1342
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
1343
+ "lineStart": 210,
1344
+ "lineEnd": 210
1345
+ },
1346
+ "order": 6,
1347
+ "replyTo": "m2"
1348
+ },
1349
+ {
1350
+ "id": "m7",
1351
+ "source": "unified",
1352
+ "target": "merchant",
1353
+ "kind": "return",
1354
+ "label": "signed UnifiedOrderRS",
1355
+ "evidence": "source",
1356
+ "site": {
1357
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
1358
+ "lineStart": 78,
1359
+ "lineEnd": 78
1360
+ },
1361
+ "order": 7,
1362
+ "replyTo": "m1"
1363
+ },
1364
+ {
1365
+ "id": "m8",
1366
+ "source": "channel",
1367
+ "target": "callback",
1368
+ "kind": "async",
1369
+ "label": "/api/pay/notify/{ifCode}",
1370
+ "evidence": "source",
1371
+ "site": {
1372
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/ChannelNoticeController.java",
1373
+ "lineStart": 169,
1374
+ "lineEnd": 169
1375
+ },
1376
+ "order": 8
1377
+ },
1378
+ {
1379
+ "id": "m9",
1380
+ "source": "callback",
1381
+ "target": "orders",
1382
+ "kind": "sync",
1383
+ "label": "updateIng2Success",
1384
+ "evidence": "source",
1385
+ "site": {
1386
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/ChannelNoticeController.java",
1387
+ "lineStart": 237,
1388
+ "lineEnd": 237
1389
+ },
1390
+ "order": 9
1391
+ },
1392
+ {
1393
+ "id": "m10",
1394
+ "source": "callback",
1395
+ "target": "process",
1396
+ "kind": "sync",
1397
+ "label": "confirmSuccess(payOrder)",
1398
+ "evidence": "source",
1399
+ "site": {
1400
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/ChannelNoticeController.java",
1401
+ "lineStart": 254,
1402
+ "lineEnd": 254
1403
+ },
1404
+ "order": 10
1405
+ },
1406
+ {
1407
+ "id": "m11",
1408
+ "source": "process",
1409
+ "target": "notify",
1410
+ "kind": "sync",
1411
+ "label": "payOrderNotify(payOrder)",
1412
+ "evidence": "source",
1413
+ "site": {
1414
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayOrderProcessService.java",
1415
+ "lineStart": 60,
1416
+ "lineEnd": 60
1417
+ },
1418
+ "order": 11
1419
+ },
1420
+ {
1421
+ "id": "m12",
1422
+ "source": "callback",
1423
+ "target": "channel",
1424
+ "kind": "return",
1425
+ "label": "responseEntity",
1426
+ "evidence": "source",
1427
+ "site": {
1428
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/ChannelNoticeController.java",
1429
+ "lineStart": 259,
1430
+ "lineEnd": 259
1431
+ },
1432
+ "order": 12,
1433
+ "replyTo": "m8"
1434
+ }
1435
+ ],
1436
+ "groups": [
1437
+ {
1438
+ "id": "success",
1439
+ "label": "渠道确认成功",
1440
+ "kind": "opt",
1441
+ "operands": [
1442
+ {
1443
+ "id": "ok",
1444
+ "guard": "CONFIRM_SUCCESS",
1445
+ "edgeIds": [
1446
+ "m9",
1447
+ "m10",
1448
+ "m11"
1449
+ ]
1450
+ }
1451
+ ]
1452
+ }
1453
+ ],
1454
+ "executions": [
1455
+ {
1456
+ "id": "x1",
1457
+ "participantId": "unified",
1458
+ "start": {
1459
+ "edgeId": "m1",
1460
+ "at": "receive"
1461
+ },
1462
+ "end": {
1463
+ "edgeId": "m7",
1464
+ "at": "send"
1465
+ }
1466
+ },
1467
+ {
1468
+ "id": "x2",
1469
+ "participantId": "abstract",
1470
+ "start": {
1471
+ "edgeId": "m2",
1472
+ "at": "receive"
1473
+ },
1474
+ "end": {
1475
+ "edgeId": "m6",
1476
+ "at": "send"
1477
+ }
1478
+ },
1479
+ {
1480
+ "id": "x3",
1481
+ "participantId": "channelapi",
1482
+ "start": {
1483
+ "edgeId": "m4",
1484
+ "at": "receive"
1485
+ },
1486
+ "end": {
1487
+ "edgeId": "m5",
1488
+ "at": "send"
1489
+ }
1490
+ },
1491
+ {
1492
+ "id": "x4",
1493
+ "participantId": "callback",
1494
+ "start": {
1495
+ "edgeId": "m8",
1496
+ "at": "receive"
1497
+ },
1498
+ "end": {
1499
+ "edgeId": "m12",
1500
+ "at": "send"
1501
+ }
1502
+ }
1503
+ ],
1504
+ "layout": {}
1505
+ },
1506
+ {
1507
+ "meta": {
1508
+ "title": "Jeepay 支付核心数据 ER 图",
1509
+ "subtitle": "Jeepay 源码与配置证据",
1510
+ "sourceRef": "jeequan/jeepay@e1ac9086d679826bab593f20431b7ecd292eb685",
1511
+ "scope": "商户应用、通道、支付订单与通知记录",
1512
+ "diagramType": "er",
1513
+ "locale": "zh-CN",
1514
+ "notes": [
1515
+ "init.sql 未声明 FOREIGN KEY;连线是代码使用的逻辑关联,不代表数据库强制外键。",
1516
+ "每个实体列出 DDL 的全部字段;仅原生 PRIMARY KEY 标记为 PK。"
1517
+ ],
1518
+ "viewId": "jeepay-er"
1519
+ },
1520
+ "nodes": [
1521
+ {
1522
+ "id": "t_mch_app",
1523
+ "label": "t_mch_app",
1524
+ "kind": "entity",
1525
+ "module": "config",
1526
+ "source": {
1527
+ "file": "docs/sql/init.sql",
1528
+ "lineStart": 142,
1529
+ "lineEnd": 142,
1530
+ "kind": "schema"
1531
+ },
1532
+ "fields": [
1533
+ {
1534
+ "name": "app_id",
1535
+ "type": "varchar(64)",
1536
+ "key": "PK",
1537
+ "nullable": false
1538
+ },
1539
+ {
1540
+ "name": "app_name",
1541
+ "type": "varchar(64)",
1542
+ "nullable": false
1543
+ },
1544
+ {
1545
+ "name": "mch_no",
1546
+ "type": "VARCHAR(64)",
1547
+ "nullable": false
1548
+ },
1549
+ {
1550
+ "name": "state",
1551
+ "type": "TINYINT(6)",
1552
+ "nullable": false
1553
+ },
1554
+ {
1555
+ "name": "app_secret",
1556
+ "type": "VARCHAR(128)",
1557
+ "nullable": false
1558
+ },
1559
+ {
1560
+ "name": "remark",
1561
+ "type": "varchar(128)",
1562
+ "nullable": true
1563
+ },
1564
+ {
1565
+ "name": "created_uid",
1566
+ "type": "BIGINT(20)",
1567
+ "nullable": true
1568
+ },
1569
+ {
1570
+ "name": "created_by",
1571
+ "type": "VARCHAR(64)",
1572
+ "nullable": true
1573
+ },
1574
+ {
1575
+ "name": "created_at",
1576
+ "type": "TIMESTAMP(3)",
1577
+ "nullable": false
1578
+ },
1579
+ {
1580
+ "name": "updated_at",
1581
+ "type": "TIMESTAMP(3)",
1582
+ "nullable": false
1583
+ }
1584
+ ]
1585
+ },
1586
+ {
1587
+ "id": "t_mch_pay_passage",
1588
+ "label": "t_mch_pay_passage",
1589
+ "kind": "entity",
1590
+ "module": "config",
1591
+ "source": {
1592
+ "file": "docs/sql/init.sql",
1593
+ "lineStart": 229,
1594
+ "lineEnd": 229,
1595
+ "kind": "schema"
1596
+ },
1597
+ "fields": [
1598
+ {
1599
+ "name": "id",
1600
+ "type": "BIGINT(20)",
1601
+ "key": "PK",
1602
+ "nullable": false
1603
+ },
1604
+ {
1605
+ "name": "mch_no",
1606
+ "type": "VARCHAR(64)",
1607
+ "nullable": false
1608
+ },
1609
+ {
1610
+ "name": "app_id",
1611
+ "type": "VARCHAR(64)",
1612
+ "nullable": false
1613
+ },
1614
+ {
1615
+ "name": "if_code",
1616
+ "type": "VARCHAR(20)",
1617
+ "nullable": false
1618
+ },
1619
+ {
1620
+ "name": "way_code",
1621
+ "type": "VARCHAR(20)",
1622
+ "nullable": false
1623
+ },
1624
+ {
1625
+ "name": "rate",
1626
+ "type": "DECIMAL(20,6)",
1627
+ "nullable": false
1628
+ },
1629
+ {
1630
+ "name": "risk_config",
1631
+ "type": "JSON",
1632
+ "nullable": true
1633
+ },
1634
+ {
1635
+ "name": "state",
1636
+ "type": "TINYINT(6)",
1637
+ "nullable": false
1638
+ },
1639
+ {
1640
+ "name": "created_at",
1641
+ "type": "TIMESTAMP(3)",
1642
+ "nullable": false
1643
+ },
1644
+ {
1645
+ "name": "updated_at",
1646
+ "type": "TIMESTAMP(3)",
1647
+ "nullable": false
1648
+ }
1649
+ ]
1650
+ },
1651
+ {
1652
+ "id": "t_pay_order",
1653
+ "label": "t_pay_order",
1654
+ "kind": "entity",
1655
+ "module": "payment",
1656
+ "source": {
1657
+ "file": "docs/sql/init.sql",
1658
+ "lineStart": 251,
1659
+ "lineEnd": 251,
1660
+ "kind": "schema"
1661
+ },
1662
+ "fields": [
1663
+ {
1664
+ "name": "pay_order_id",
1665
+ "type": "VARCHAR(30)",
1666
+ "key": "PK",
1667
+ "nullable": false
1668
+ },
1669
+ {
1670
+ "name": "mch_no",
1671
+ "type": "VARCHAR(64)",
1672
+ "nullable": false
1673
+ },
1674
+ {
1675
+ "name": "isv_no",
1676
+ "type": "VARCHAR(64)",
1677
+ "nullable": true
1678
+ },
1679
+ {
1680
+ "name": "app_id",
1681
+ "type": "VARCHAR(64)",
1682
+ "nullable": false
1683
+ },
1684
+ {
1685
+ "name": "mch_name",
1686
+ "type": "VARCHAR(30)",
1687
+ "nullable": false
1688
+ },
1689
+ {
1690
+ "name": "mch_type",
1691
+ "type": "TINYINT(6)",
1692
+ "nullable": false
1693
+ },
1694
+ {
1695
+ "name": "mch_order_no",
1696
+ "type": "VARCHAR(64)",
1697
+ "nullable": false
1698
+ },
1699
+ {
1700
+ "name": "if_code",
1701
+ "type": "VARCHAR(20)",
1702
+ "nullable": true
1703
+ },
1704
+ {
1705
+ "name": "way_code",
1706
+ "type": "VARCHAR(20)",
1707
+ "nullable": false
1708
+ },
1709
+ {
1710
+ "name": "amount",
1711
+ "type": "BIGINT(20)",
1712
+ "nullable": false
1713
+ },
1714
+ {
1715
+ "name": "mch_fee_rate",
1716
+ "type": "decimal(20,6)",
1717
+ "nullable": false
1718
+ },
1719
+ {
1720
+ "name": "mch_fee_amount",
1721
+ "type": "BIGINT(20)",
1722
+ "nullable": false
1723
+ },
1724
+ {
1725
+ "name": "currency",
1726
+ "type": "VARCHAR(3)",
1727
+ "nullable": false
1728
+ },
1729
+ {
1730
+ "name": "state",
1731
+ "type": "TINYINT(6)",
1732
+ "nullable": false
1733
+ },
1734
+ {
1735
+ "name": "notify_state",
1736
+ "type": "TINYINT(6)",
1737
+ "nullable": false
1738
+ },
1739
+ {
1740
+ "name": "client_ip",
1741
+ "type": "VARCHAR(32)",
1742
+ "nullable": true
1743
+ },
1744
+ {
1745
+ "name": "subject",
1746
+ "type": "VARCHAR(64)",
1747
+ "nullable": false
1748
+ },
1749
+ {
1750
+ "name": "body",
1751
+ "type": "VARCHAR(256)",
1752
+ "nullable": false
1753
+ },
1754
+ {
1755
+ "name": "channel_extra",
1756
+ "type": "VARCHAR(512)",
1757
+ "nullable": true
1758
+ },
1759
+ {
1760
+ "name": "channel_user",
1761
+ "type": "VARCHAR(64)",
1762
+ "nullable": true
1763
+ },
1764
+ {
1765
+ "name": "channel_order_no",
1766
+ "type": "VARCHAR(64)",
1767
+ "nullable": true
1768
+ },
1769
+ {
1770
+ "name": "refund_state",
1771
+ "type": "TINYINT(6)",
1772
+ "nullable": false
1773
+ },
1774
+ {
1775
+ "name": "refund_times",
1776
+ "type": "INT",
1777
+ "nullable": false
1778
+ },
1779
+ {
1780
+ "name": "refund_amount",
1781
+ "type": "BIGINT(20)",
1782
+ "nullable": false
1783
+ },
1784
+ {
1785
+ "name": "division_mode",
1786
+ "type": "TINYINT(6)",
1787
+ "nullable": true
1788
+ },
1789
+ {
1790
+ "name": "division_state",
1791
+ "type": "TINYINT(6)",
1792
+ "nullable": true
1793
+ },
1794
+ {
1795
+ "name": "division_last_time",
1796
+ "type": "DATETIME",
1797
+ "nullable": true
1798
+ },
1799
+ {
1800
+ "name": "err_code",
1801
+ "type": "VARCHAR(128)",
1802
+ "nullable": true
1803
+ },
1804
+ {
1805
+ "name": "err_msg",
1806
+ "type": "VARCHAR(256)",
1807
+ "nullable": true
1808
+ },
1809
+ {
1810
+ "name": "ext_param",
1811
+ "type": "VARCHAR(2048)",
1812
+ "nullable": true
1813
+ },
1814
+ {
1815
+ "name": "notify_url",
1816
+ "type": "VARCHAR(128)",
1817
+ "nullable": false
1818
+ },
1819
+ {
1820
+ "name": "return_url",
1821
+ "type": "VARCHAR(128)",
1822
+ "nullable": true
1823
+ },
1824
+ {
1825
+ "name": "expired_time",
1826
+ "type": "DATETIME",
1827
+ "nullable": true
1828
+ },
1829
+ {
1830
+ "name": "success_time",
1831
+ "type": "DATETIME",
1832
+ "nullable": true
1833
+ },
1834
+ {
1835
+ "name": "created_at",
1836
+ "type": "TIMESTAMP(3)",
1837
+ "nullable": false
1838
+ },
1839
+ {
1840
+ "name": "updated_at",
1841
+ "type": "TIMESTAMP(3)",
1842
+ "nullable": false
1843
+ }
1844
+ ]
1845
+ },
1846
+ {
1847
+ "id": "t_mch_notify_record",
1848
+ "label": "t_mch_notify_record",
1849
+ "kind": "entity",
1850
+ "module": "notification",
1851
+ "source": {
1852
+ "file": "docs/sql/init.sql",
1853
+ "lineStart": 296,
1854
+ "lineEnd": 296,
1855
+ "kind": "schema"
1856
+ },
1857
+ "fields": [
1858
+ {
1859
+ "name": "notify_id",
1860
+ "type": "BIGINT(20)",
1861
+ "key": "PK",
1862
+ "nullable": false
1863
+ },
1864
+ {
1865
+ "name": "order_id",
1866
+ "type": "VARCHAR(64)",
1867
+ "nullable": false
1868
+ },
1869
+ {
1870
+ "name": "order_type",
1871
+ "type": "TINYINT(6)",
1872
+ "nullable": false
1873
+ },
1874
+ {
1875
+ "name": "mch_order_no",
1876
+ "type": "VARCHAR(64)",
1877
+ "nullable": false
1878
+ },
1879
+ {
1880
+ "name": "mch_no",
1881
+ "type": "VARCHAR(64)",
1882
+ "nullable": false
1883
+ },
1884
+ {
1885
+ "name": "isv_no",
1886
+ "type": "VARCHAR(64)",
1887
+ "nullable": true
1888
+ },
1889
+ {
1890
+ "name": "app_id",
1891
+ "type": "VARCHAR(64)",
1892
+ "nullable": false
1893
+ },
1894
+ {
1895
+ "name": "notify_url",
1896
+ "type": "TEXT",
1897
+ "nullable": false
1898
+ },
1899
+ {
1900
+ "name": "res_result",
1901
+ "type": "TEXT",
1902
+ "nullable": true
1903
+ },
1904
+ {
1905
+ "name": "notify_count",
1906
+ "type": "INT(11)",
1907
+ "nullable": false
1908
+ },
1909
+ {
1910
+ "name": "notify_count_limit",
1911
+ "type": "INT(11)",
1912
+ "nullable": false
1913
+ },
1914
+ {
1915
+ "name": "state",
1916
+ "type": "TINYINT(6)",
1917
+ "nullable": false
1918
+ },
1919
+ {
1920
+ "name": "last_notify_time",
1921
+ "type": "DATETIME",
1922
+ "nullable": true
1923
+ },
1924
+ {
1925
+ "name": "created_at",
1926
+ "type": "TIMESTAMP(3)",
1927
+ "nullable": false
1928
+ },
1929
+ {
1930
+ "name": "updated_at",
1931
+ "type": "TIMESTAMP(3)",
1932
+ "nullable": false
1933
+ }
1934
+ ]
1935
+ }
1936
+ ],
1937
+ "edges": [
1938
+ {
1939
+ "id": "er1",
1940
+ "source": "t_mch_app",
1941
+ "target": "t_mch_pay_passage",
1942
+ "kind": "relationship",
1943
+ "label": "配置支付通道(逻辑)",
1944
+ "evidence": "source",
1945
+ "site": {
1946
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
1947
+ "lineStart": 167,
1948
+ "lineEnd": 167
1949
+ },
1950
+ "sourceCardinality": "1",
1951
+ "targetCardinality": "0..*"
1952
+ },
1953
+ {
1954
+ "id": "er2",
1955
+ "source": "t_mch_app",
1956
+ "target": "t_pay_order",
1957
+ "kind": "relationship",
1958
+ "label": "创建支付订单(逻辑)",
1959
+ "evidence": "source",
1960
+ "site": {
1961
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
1962
+ "lineStart": 242,
1963
+ "lineEnd": 242
1964
+ },
1965
+ "sourceCardinality": "1",
1966
+ "targetCardinality": "0..*"
1967
+ },
1968
+ {
1969
+ "id": "er3",
1970
+ "source": "t_pay_order",
1971
+ "target": "t_mch_notify_record",
1972
+ "kind": "relationship",
1973
+ "label": "产生支付通知(逻辑)",
1974
+ "evidence": "source",
1975
+ "site": {
1976
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayMchNotifyService.java",
1977
+ "lineStart": 76,
1978
+ "lineEnd": 76
1979
+ },
1980
+ "sourceCardinality": "1",
1981
+ "targetCardinality": "0..1"
1982
+ }
1983
+ ],
1984
+ "layout": {
1985
+ "direction": "right"
1986
+ }
1987
+ },
1988
+ {
1989
+ "meta": {
1990
+ "title": "Jeepay Docker Compose 部署图",
1991
+ "subtitle": "Jeepay 源码与配置证据",
1992
+ "sourceRef": "jeequan/jeepay@e1ac9086d679826bab593f20431b7ecd292eb685",
1993
+ "scope": "docker-compose.yml 默认后端服务",
1994
+ "diagramType": "deployment",
1995
+ "locale": "zh-CN",
1996
+ "notes": [
1997
+ "图示为 Compose 声明的服务和依赖,未验证容器实际运行。",
1998
+ "RabbitMQ 与 ActiveMQ 在此 Compose 中是注释的可选配置,未作为默认运行服务绘制。"
1999
+ ],
2000
+ "viewId": "jeepay-deployment"
2001
+ },
2002
+ "nodes": [
2003
+ {
2004
+ "id": "mysql",
2005
+ "label": "mysql",
2006
+ "kind": "database",
2007
+ "module": "data",
2008
+ "source": {
2009
+ "file": "docker-compose.yml",
2010
+ "lineStart": 11,
2011
+ "lineEnd": 11,
2012
+ "kind": "config"
2013
+ },
2014
+ "groupId": "network",
2015
+ "layout": {
2016
+ "tier": "data"
2017
+ }
2018
+ },
2019
+ {
2020
+ "id": "redis",
2021
+ "label": "redis",
2022
+ "kind": "database",
2023
+ "module": "cache",
2024
+ "source": {
2025
+ "file": "docker-compose.yml",
2026
+ "lineStart": 142,
2027
+ "lineEnd": 142,
2028
+ "kind": "config"
2029
+ },
2030
+ "groupId": "network",
2031
+ "layout": {
2032
+ "tier": "data"
2033
+ }
2034
+ },
2035
+ {
2036
+ "id": "namesrv",
2037
+ "label": "rocketmq-namesrv",
2038
+ "kind": "container",
2039
+ "module": "mq",
2040
+ "source": {
2041
+ "file": "docker-compose.yml",
2042
+ "lineStart": 39,
2043
+ "lineEnd": 39,
2044
+ "kind": "config"
2045
+ },
2046
+ "groupId": "network",
2047
+ "layout": {
2048
+ "tier": "infrastructure"
2049
+ }
2050
+ },
2051
+ {
2052
+ "id": "broker",
2053
+ "label": "rocketmq-broker",
2054
+ "kind": "container",
2055
+ "module": "mq",
2056
+ "source": {
2057
+ "file": "docker-compose.yml",
2058
+ "lineStart": 65,
2059
+ "lineEnd": 65,
2060
+ "kind": "config"
2061
+ },
2062
+ "groupId": "network",
2063
+ "layout": {
2064
+ "tier": "infrastructure"
2065
+ }
2066
+ },
2067
+ {
2068
+ "id": "payment",
2069
+ "label": "payment",
2070
+ "kind": "container",
2071
+ "module": "payment",
2072
+ "source": {
2073
+ "file": "docker-compose.yml",
2074
+ "lineStart": 162,
2075
+ "lineEnd": 162,
2076
+ "kind": "config"
2077
+ },
2078
+ "tags": [
2079
+ "core"
2080
+ ],
2081
+ "groupId": "network",
2082
+ "layout": {
2083
+ "tier": "application"
2084
+ }
2085
+ },
2086
+ {
2087
+ "id": "manager",
2088
+ "label": "manager",
2089
+ "kind": "container",
2090
+ "module": "manager",
2091
+ "source": {
2092
+ "file": "docker-compose.yml",
2093
+ "lineStart": 192,
2094
+ "lineEnd": 192,
2095
+ "kind": "config"
2096
+ },
2097
+ "groupId": "network",
2098
+ "layout": {
2099
+ "tier": "application"
2100
+ }
2101
+ },
2102
+ {
2103
+ "id": "merchant",
2104
+ "label": "merchant",
2105
+ "kind": "container",
2106
+ "module": "merchant",
2107
+ "source": {
2108
+ "file": "docker-compose.yml",
2109
+ "lineStart": 222,
2110
+ "lineEnd": 222,
2111
+ "kind": "config"
2112
+ },
2113
+ "groupId": "network",
2114
+ "layout": {
2115
+ "tier": "application"
2116
+ }
2117
+ }
2118
+ ],
2119
+ "edges": [
2120
+ {
2121
+ "id": "d1",
2122
+ "source": "broker",
2123
+ "target": "namesrv",
2124
+ "kind": "depends",
2125
+ "label": "NameServer",
2126
+ "evidence": "config",
2127
+ "site": {
2128
+ "file": "docker-compose.yml",
2129
+ "lineStart": 78,
2130
+ "lineEnd": 78
2131
+ }
2132
+ },
2133
+ {
2134
+ "id": "d2",
2135
+ "source": "payment",
2136
+ "target": "mysql",
2137
+ "kind": "depends",
2138
+ "label": "MySQL",
2139
+ "evidence": "config",
2140
+ "site": {
2141
+ "file": "docker-compose.yml",
2142
+ "lineStart": 179,
2143
+ "lineEnd": 179
2144
+ }
2145
+ },
2146
+ {
2147
+ "id": "d3",
2148
+ "source": "payment",
2149
+ "target": "redis",
2150
+ "kind": "depends",
2151
+ "label": "Redis",
2152
+ "evidence": "config",
2153
+ "site": {
2154
+ "file": "docker-compose.yml",
2155
+ "lineStart": 181,
2156
+ "lineEnd": 181
2157
+ }
2158
+ },
2159
+ {
2160
+ "id": "d4",
2161
+ "source": "payment",
2162
+ "target": "broker",
2163
+ "kind": "depends",
2164
+ "label": "RocketMQ",
2165
+ "evidence": "config",
2166
+ "site": {
2167
+ "file": "docker-compose.yml",
2168
+ "lineStart": 183,
2169
+ "lineEnd": 183
2170
+ }
2171
+ },
2172
+ {
2173
+ "id": "d5",
2174
+ "source": "manager",
2175
+ "target": "mysql",
2176
+ "kind": "depends",
2177
+ "label": "MySQL",
2178
+ "evidence": "config",
2179
+ "site": {
2180
+ "file": "docker-compose.yml",
2181
+ "lineStart": 209,
2182
+ "lineEnd": 209
2183
+ }
2184
+ },
2185
+ {
2186
+ "id": "d6",
2187
+ "source": "merchant",
2188
+ "target": "mysql",
2189
+ "kind": "depends",
2190
+ "label": "MySQL",
2191
+ "evidence": "config",
2192
+ "site": {
2193
+ "file": "docker-compose.yml",
2194
+ "lineStart": 239,
2195
+ "lineEnd": 239
2196
+ }
2197
+ }
2198
+ ],
2199
+ "groups": [
2200
+ {
2201
+ "id": "network",
2202
+ "label": "jeepay 网络",
2203
+ "kind": "network"
2204
+ }
2205
+ ],
2206
+ "layout": {
2207
+ "direction": "down"
2208
+ }
2209
+ },
2210
+ {
2211
+ "meta": {
2212
+ "title": "Jeepay 统一支付类图",
2213
+ "subtitle": "Jeepay 源码与配置证据",
2214
+ "sourceRef": "jeequan/jeepay@e1ac9086d679826bab593f20431b7ecd292eb685",
2215
+ "scope": "控制器与渠道支付接口",
2216
+ "diagramType": "class",
2217
+ "locale": "zh-CN",
2218
+ "notes": [
2219
+ "类成员仅展示与统一下单有关的源码声明;省略其他方法。",
2220
+ "IPaymentService 实现由通道模块扩展,图中以支付宝和微信实现为例。"
2221
+ ],
2222
+ "viewId": "jeepay-class"
2223
+ },
2224
+ "nodes": [
2225
+ {
2226
+ "id": "api",
2227
+ "label": "ApiController",
2228
+ "kind": "abstract",
2229
+ "module": "payment",
2230
+ "source": {
2231
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/ApiController.java",
2232
+ "lineStart": 39,
2233
+ "lineEnd": 39,
2234
+ "kind": "source"
2235
+ },
2236
+ "methods": [
2237
+ "#getRQByWithMchSign(Class<T>): T"
2238
+ ]
2239
+ },
2240
+ {
2241
+ "id": "base",
2242
+ "label": "AbstractPayOrderController",
2243
+ "kind": "abstract",
2244
+ "module": "payment",
2245
+ "source": {
2246
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
2247
+ "lineStart": 64,
2248
+ "lineEnd": 64,
2249
+ "kind": "source"
2250
+ },
2251
+ "methods": [
2252
+ "#unifiedOrder(String, UnifiedOrderRQ): ApiRes",
2253
+ "-processChannelMsg(ChannelRetMsg, PayOrder): void"
2254
+ ]
2255
+ },
2256
+ {
2257
+ "id": "unified",
2258
+ "label": "UnifiedOrderController",
2259
+ "kind": "class",
2260
+ "module": "payment",
2261
+ "source": {
2262
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
2263
+ "lineStart": 44,
2264
+ "lineEnd": 44,
2265
+ "kind": "source"
2266
+ },
2267
+ "methods": [
2268
+ "+unifiedOrder(): ApiRes"
2269
+ ]
2270
+ },
2271
+ {
2272
+ "id": "iface",
2273
+ "label": "IPaymentService",
2274
+ "kind": "interface",
2275
+ "module": "channel",
2276
+ "source": {
2277
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/IPaymentService.java",
2278
+ "lineStart": 30,
2279
+ "lineEnd": 30,
2280
+ "kind": "source"
2281
+ },
2282
+ "methods": [
2283
+ "+getIfCode(): String",
2284
+ "+preCheck(UnifiedOrderRQ, PayOrder): String",
2285
+ "+pay(UnifiedOrderRQ, PayOrder, MchAppConfigContext): AbstractRS"
2286
+ ]
2287
+ },
2288
+ {
2289
+ "id": "abstractPayment",
2290
+ "label": "AbstractPaymentService",
2291
+ "kind": "abstract",
2292
+ "module": "channel",
2293
+ "source": {
2294
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/AbstractPaymentService.java",
2295
+ "lineStart": 35,
2296
+ "lineEnd": 35,
2297
+ "kind": "source"
2298
+ },
2299
+ "methods": [
2300
+ "+customPayOrderId(UnifiedOrderRQ, PayOrder, MchAppConfigContext): String"
2301
+ ]
2302
+ },
2303
+ {
2304
+ "id": "alipay",
2305
+ "label": "AlipayPaymentService",
2306
+ "kind": "class",
2307
+ "module": "channel",
2308
+ "source": {
2309
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/alipay/AlipayPaymentService.java",
2310
+ "lineStart": 36,
2311
+ "lineEnd": 36,
2312
+ "kind": "source"
2313
+ },
2314
+ "methods": [
2315
+ "+pay(UnifiedOrderRQ, PayOrder, MchAppConfigContext): AbstractRS"
2316
+ ]
2317
+ },
2318
+ {
2319
+ "id": "wxpay",
2320
+ "label": "WxpayPaymentService",
2321
+ "kind": "class",
2322
+ "module": "channel",
2323
+ "source": {
2324
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/WxpayPaymentService.java",
2325
+ "lineStart": 46,
2326
+ "lineEnd": 46,
2327
+ "kind": "source"
2328
+ },
2329
+ "methods": [
2330
+ "+pay(UnifiedOrderRQ, PayOrder, MchAppConfigContext): AbstractRS"
2331
+ ]
2332
+ },
2333
+ {
2334
+ "id": "orders",
2335
+ "label": "PayOrderService",
2336
+ "kind": "class",
2337
+ "module": "payment",
2338
+ "source": {
2339
+ "file": "jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayOrderService.java",
2340
+ "lineStart": 49,
2341
+ "lineEnd": 49,
2342
+ "kind": "source"
2343
+ },
2344
+ "methods": [
2345
+ "+updateInit2Ing(String, PayOrder): boolean",
2346
+ "+updateIng2Success(String, String, String): boolean"
2347
+ ]
2348
+ }
2349
+ ],
2350
+ "edges": [
2351
+ {
2352
+ "id": "cl1",
2353
+ "source": "unified",
2354
+ "target": "base",
2355
+ "kind": "inheritance",
2356
+ "label": "extends",
2357
+ "evidence": "source",
2358
+ "site": {
2359
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
2360
+ "lineStart": 44,
2361
+ "lineEnd": 44
2362
+ }
2363
+ },
2364
+ {
2365
+ "id": "cl2",
2366
+ "source": "base",
2367
+ "target": "api",
2368
+ "kind": "inheritance",
2369
+ "label": "extends",
2370
+ "evidence": "source",
2371
+ "site": {
2372
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
2373
+ "lineStart": 64,
2374
+ "lineEnd": 64
2375
+ }
2376
+ },
2377
+ {
2378
+ "id": "cl3",
2379
+ "source": "abstractPayment",
2380
+ "target": "iface",
2381
+ "kind": "implementation",
2382
+ "label": "implements",
2383
+ "evidence": "source",
2384
+ "site": {
2385
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/AbstractPaymentService.java",
2386
+ "lineStart": 35,
2387
+ "lineEnd": 35
2388
+ }
2389
+ },
2390
+ {
2391
+ "id": "cl4",
2392
+ "source": "alipay",
2393
+ "target": "abstractPayment",
2394
+ "kind": "inheritance",
2395
+ "label": "extends",
2396
+ "evidence": "source",
2397
+ "site": {
2398
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/alipay/AlipayPaymentService.java",
2399
+ "lineStart": 36,
2400
+ "lineEnd": 36
2401
+ }
2402
+ },
2403
+ {
2404
+ "id": "cl5",
2405
+ "source": "wxpay",
2406
+ "target": "abstractPayment",
2407
+ "kind": "inheritance",
2408
+ "label": "extends",
2409
+ "evidence": "source",
2410
+ "site": {
2411
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/WxpayPaymentService.java",
2412
+ "lineStart": 46,
2413
+ "lineEnd": 46
2414
+ }
2415
+ },
2416
+ {
2417
+ "id": "cl6",
2418
+ "source": "base",
2419
+ "target": "iface",
2420
+ "kind": "dependency",
2421
+ "label": "调用渠道接口",
2422
+ "evidence": "source",
2423
+ "site": {
2424
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
2425
+ "lineStart": 205,
2426
+ "lineEnd": 205
2427
+ }
2428
+ },
2429
+ {
2430
+ "id": "cl7",
2431
+ "source": "base",
2432
+ "target": "orders",
2433
+ "kind": "association",
2434
+ "label": "持有 PayOrderService",
2435
+ "evidence": "source",
2436
+ "site": {
2437
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
2438
+ "lineStart": 67,
2439
+ "lineEnd": 67
2440
+ }
2441
+ }
2442
+ ],
2443
+ "layout": {
2444
+ "direction": "down"
2445
+ }
2446
+ },
2447
+ {
2448
+ "meta": {
2449
+ "title": "PayOrder 支付状态图",
2450
+ "subtitle": "Jeepay 源码与配置证据",
2451
+ "sourceRef": "jeequan/jeepay@e1ac9086d679826bab593f20431b7ecd292eb685",
2452
+ "scope": "统一下单及支付回调状态",
2453
+ "diagramType": "state",
2454
+ "locale": "zh-CN",
2455
+ "notes": [
2456
+ "INIT 到 SUCCESS/FAIL 在下单响应处理里经 ING 条件更新;图按持久化状态变更展示。",
2457
+ "PayOrder 声明了 CANCEL、REFUND 常量,但本次主线未找到相应状态迁移调用,故不绘制。"
2458
+ ],
2459
+ "viewId": "jeepay-state"
2460
+ },
2461
+ "nodes": [
2462
+ {
2463
+ "id": "initial",
2464
+ "label": "创建请求",
2465
+ "kind": "initial"
2466
+ },
2467
+ {
2468
+ "id": "init",
2469
+ "label": "STATE_INIT",
2470
+ "kind": "state",
2471
+ "module": "payment",
2472
+ "source": {
2473
+ "file": "jeepay-core/src/main/java/com/jeequan/jeepay/core/entity/PayOrder.java",
2474
+ "lineStart": 53,
2475
+ "lineEnd": 53,
2476
+ "kind": "source"
2477
+ }
2478
+ },
2479
+ {
2480
+ "id": "ing",
2481
+ "label": "STATE_ING",
2482
+ "kind": "state",
2483
+ "module": "payment",
2484
+ "source": {
2485
+ "file": "jeepay-core/src/main/java/com/jeequan/jeepay/core/entity/PayOrder.java",
2486
+ "lineStart": 54,
2487
+ "lineEnd": 54,
2488
+ "kind": "source"
2489
+ }
2490
+ },
2491
+ {
2492
+ "id": "success",
2493
+ "label": "STATE_SUCCESS",
2494
+ "kind": "state",
2495
+ "module": "payment",
2496
+ "source": {
2497
+ "file": "jeepay-core/src/main/java/com/jeequan/jeepay/core/entity/PayOrder.java",
2498
+ "lineStart": 55,
2499
+ "lineEnd": 55,
2500
+ "kind": "source"
2501
+ },
2502
+ "tags": [
2503
+ "core"
2504
+ ]
2505
+ },
2506
+ {
2507
+ "id": "fail",
2508
+ "label": "STATE_FAIL",
2509
+ "kind": "state",
2510
+ "module": "payment",
2511
+ "source": {
2512
+ "file": "jeepay-core/src/main/java/com/jeequan/jeepay/core/entity/PayOrder.java",
2513
+ "lineStart": 56,
2514
+ "lineEnd": 56,
2515
+ "kind": "source"
2516
+ },
2517
+ "tags": [
2518
+ "failure"
2519
+ ]
2520
+ },
2521
+ {
2522
+ "id": "closed",
2523
+ "label": "STATE_CLOSED",
2524
+ "kind": "state",
2525
+ "module": "payment",
2526
+ "source": {
2527
+ "file": "jeepay-core/src/main/java/com/jeequan/jeepay/core/entity/PayOrder.java",
2528
+ "lineStart": 59,
2529
+ "lineEnd": 59,
2530
+ "kind": "source"
2531
+ }
2532
+ }
2533
+ ],
2534
+ "edges": [
2535
+ {
2536
+ "id": "s0",
2537
+ "source": "initial",
2538
+ "target": "init",
2539
+ "kind": "transition",
2540
+ "label": "genPayOrder",
2541
+ "evidence": "source",
2542
+ "site": {
2543
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
2544
+ "lineStart": 256,
2545
+ "lineEnd": 256
2546
+ }
2547
+ },
2548
+ {
2549
+ "id": "s1",
2550
+ "source": "init",
2551
+ "target": "ing",
2552
+ "kind": "transition",
2553
+ "label": "渠道下单返回等待/未知",
2554
+ "evidence": "source",
2555
+ "site": {
2556
+ "file": "jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayOrderService.java",
2557
+ "lineStart": 61,
2558
+ "lineEnd": 61
2559
+ }
2560
+ },
2561
+ {
2562
+ "id": "s2",
2563
+ "source": "ing",
2564
+ "target": "success",
2565
+ "kind": "transition",
2566
+ "label": "渠道确认成功",
2567
+ "evidence": "source",
2568
+ "site": {
2569
+ "file": "jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayOrderService.java",
2570
+ "lineStart": 79,
2571
+ "lineEnd": 79
2572
+ },
2573
+ "guard": "STATE_ING"
2574
+ },
2575
+ {
2576
+ "id": "s3",
2577
+ "source": "ing",
2578
+ "target": "fail",
2579
+ "kind": "transition",
2580
+ "label": "渠道确认失败",
2581
+ "evidence": "source",
2582
+ "site": {
2583
+ "file": "jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayOrderService.java",
2584
+ "lineStart": 113,
2585
+ "lineEnd": 113
2586
+ },
2587
+ "guard": "STATE_ING"
2588
+ },
2589
+ {
2590
+ "id": "s4",
2591
+ "source": "init",
2592
+ "target": "closed",
2593
+ "kind": "transition",
2594
+ "label": "关闭订单",
2595
+ "evidence": "source",
2596
+ "site": {
2597
+ "file": "jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayOrderService.java",
2598
+ "lineStart": 102,
2599
+ "lineEnd": 102
2600
+ },
2601
+ "guard": "STATE_INIT"
2602
+ },
2603
+ {
2604
+ "id": "s5",
2605
+ "source": "ing",
2606
+ "target": "closed",
2607
+ "kind": "transition",
2608
+ "label": "关闭订单",
2609
+ "evidence": "source",
2610
+ "site": {
2611
+ "file": "jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayOrderService.java",
2612
+ "lineStart": 92,
2613
+ "lineEnd": 92
2614
+ },
2615
+ "guard": "STATE_ING"
2616
+ }
2617
+ ],
2618
+ "layout": {
2619
+ "direction": "down"
2620
+ }
2621
+ },
2622
+ {
2623
+ "meta": {
2624
+ "title": "Jeepay 支付网关用例图",
2625
+ "subtitle": "Jeepay 源码与配置证据",
2626
+ "sourceRef": "jeequan/jeepay@e1ac9086d679826bab593f20431b7ecd292eb685",
2627
+ "scope": "支付网关公开 API 能力",
2628
+ "diagramType": "usecase",
2629
+ "locale": "zh-CN",
2630
+ "notes": [
2631
+ "商户系统与支付渠道是从 API 路由与回调入口归纳的外部角色。",
2632
+ "图中是接口能力,不表示当前环境中已接入或已调用任一支付渠道。"
2633
+ ],
2634
+ "viewId": "jeepay-usecase"
2635
+ },
2636
+ "nodes": [
2637
+ {
2638
+ "id": "mch",
2639
+ "label": "商户系统",
2640
+ "kind": "actor"
2641
+ },
2642
+ {
2643
+ "id": "channel",
2644
+ "label": "支付渠道",
2645
+ "kind": "actor"
2646
+ },
2647
+ {
2648
+ "id": "create",
2649
+ "label": "统一下单",
2650
+ "kind": "usecase",
2651
+ "module": "payment",
2652
+ "source": {
2653
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
2654
+ "lineStart": 52,
2655
+ "lineEnd": 52,
2656
+ "kind": "source"
2657
+ },
2658
+ "groupId": "system",
2659
+ "tags": [
2660
+ "core"
2661
+ ]
2662
+ },
2663
+ {
2664
+ "id": "query",
2665
+ "label": "查询支付订单",
2666
+ "kind": "usecase",
2667
+ "module": "payment",
2668
+ "source": {
2669
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/QueryOrderController.java",
2670
+ "lineStart": 50,
2671
+ "lineEnd": 50,
2672
+ "kind": "source"
2673
+ },
2674
+ "groupId": "system"
2675
+ },
2676
+ {
2677
+ "id": "close",
2678
+ "label": "关闭支付订单",
2679
+ "kind": "usecase",
2680
+ "module": "payment",
2681
+ "source": {
2682
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/CloseOrderController.java",
2683
+ "lineStart": 55,
2684
+ "lineEnd": 55,
2685
+ "kind": "source"
2686
+ },
2687
+ "groupId": "system"
2688
+ },
2689
+ {
2690
+ "id": "refund",
2691
+ "label": "申请退款",
2692
+ "kind": "usecase",
2693
+ "module": "refund",
2694
+ "source": {
2695
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/refund/RefundOrderController.java",
2696
+ "lineStart": 66,
2697
+ "lineEnd": 66,
2698
+ "kind": "source"
2699
+ },
2700
+ "groupId": "system"
2701
+ },
2702
+ {
2703
+ "id": "transfer",
2704
+ "label": "发起转账",
2705
+ "kind": "usecase",
2706
+ "module": "transfer",
2707
+ "source": {
2708
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/transfer/TransferOrderController.java",
2709
+ "lineStart": 65,
2710
+ "lineEnd": 65,
2711
+ "kind": "source"
2712
+ },
2713
+ "groupId": "system"
2714
+ },
2715
+ {
2716
+ "id": "division",
2717
+ "label": "执行分账",
2718
+ "kind": "usecase",
2719
+ "module": "division",
2720
+ "source": {
2721
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/division/PayOrderDivisionExecController.java",
2722
+ "lineStart": 66,
2723
+ "lineEnd": 66,
2724
+ "kind": "source"
2725
+ },
2726
+ "groupId": "system"
2727
+ },
2728
+ {
2729
+ "id": "callback",
2730
+ "label": "通知支付结果",
2731
+ "kind": "usecase",
2732
+ "module": "payment",
2733
+ "source": {
2734
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/ChannelNoticeController.java",
2735
+ "lineStart": 169,
2736
+ "lineEnd": 169,
2737
+ "kind": "source"
2738
+ },
2739
+ "groupId": "system"
2740
+ }
2741
+ ],
2742
+ "edges": [
2743
+ {
2744
+ "id": "u1",
2745
+ "source": "mch",
2746
+ "target": "create",
2747
+ "kind": "association",
2748
+ "label": "下单",
2749
+ "evidence": "source",
2750
+ "site": {
2751
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
2752
+ "lineStart": 52,
2753
+ "lineEnd": 52
2754
+ }
2755
+ },
2756
+ {
2757
+ "id": "u2",
2758
+ "source": "mch",
2759
+ "target": "query",
2760
+ "kind": "association",
2761
+ "label": "查单",
2762
+ "evidence": "source",
2763
+ "site": {
2764
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/QueryOrderController.java",
2765
+ "lineStart": 50,
2766
+ "lineEnd": 50
2767
+ }
2768
+ },
2769
+ {
2770
+ "id": "u3",
2771
+ "source": "mch",
2772
+ "target": "close",
2773
+ "kind": "association",
2774
+ "label": "关单",
2775
+ "evidence": "source",
2776
+ "site": {
2777
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/CloseOrderController.java",
2778
+ "lineStart": 55,
2779
+ "lineEnd": 55
2780
+ }
2781
+ },
2782
+ {
2783
+ "id": "u4",
2784
+ "source": "mch",
2785
+ "target": "refund",
2786
+ "kind": "association",
2787
+ "label": "退款",
2788
+ "evidence": "source",
2789
+ "site": {
2790
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/refund/RefundOrderController.java",
2791
+ "lineStart": 66,
2792
+ "lineEnd": 66
2793
+ }
2794
+ },
2795
+ {
2796
+ "id": "u5",
2797
+ "source": "mch",
2798
+ "target": "transfer",
2799
+ "kind": "association",
2800
+ "label": "转账",
2801
+ "evidence": "source",
2802
+ "site": {
2803
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/transfer/TransferOrderController.java",
2804
+ "lineStart": 65,
2805
+ "lineEnd": 65
2806
+ }
2807
+ },
2808
+ {
2809
+ "id": "u6",
2810
+ "source": "mch",
2811
+ "target": "division",
2812
+ "kind": "association",
2813
+ "label": "分账",
2814
+ "evidence": "source",
2815
+ "site": {
2816
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/division/PayOrderDivisionExecController.java",
2817
+ "lineStart": 66,
2818
+ "lineEnd": 66
2819
+ }
2820
+ },
2821
+ {
2822
+ "id": "u7",
2823
+ "source": "channel",
2824
+ "target": "callback",
2825
+ "kind": "association",
2826
+ "label": "异步回调",
2827
+ "evidence": "source",
2828
+ "site": {
2829
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/ChannelNoticeController.java",
2830
+ "lineStart": 169,
2831
+ "lineEnd": 169
2832
+ }
2833
+ }
2834
+ ],
2835
+ "groups": [
2836
+ {
2837
+ "id": "system",
2838
+ "label": "Jeepay 支付网关",
2839
+ "kind": "system"
2840
+ }
2841
+ ],
2842
+ "layout": {}
2843
+ },
2844
+ {
2845
+ "meta": {
2846
+ "title": "统一下单与回调数据流图",
2847
+ "subtitle": "Jeepay 源码与配置证据",
2848
+ "sourceRef": "jeequan/jeepay@e1ac9086d679826bab593f20431b7ecd292eb685",
2849
+ "scope": "请求、渠道结果与通知记录的数据流",
2850
+ "diagramType": "dataflow",
2851
+ "locale": "zh-CN",
2852
+ "notes": [
2853
+ "渠道内部数据转换未在本仓库中展开;图仅追踪本项目可见的请求与回调路径。",
2854
+ "商户通知通过 MQ 发送;本图止于持久化通知记录,MQ 消费与重试未展开。"
2855
+ ],
2856
+ "viewId": "jeepay-dataflow"
2857
+ },
2858
+ "nodes": [
2859
+ {
2860
+ "id": "merchant",
2861
+ "label": "商户系统",
2862
+ "kind": "external"
2863
+ },
2864
+ {
2865
+ "id": "verify",
2866
+ "label": "getRQByWithMchSign",
2867
+ "kind": "process",
2868
+ "module": "payment",
2869
+ "source": {
2870
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/ApiController.java",
2871
+ "lineStart": 58,
2872
+ "lineEnd": 58,
2873
+ "kind": "source"
2874
+ }
2875
+ },
2876
+ {
2877
+ "id": "order",
2878
+ "label": "AbstractPayOrderController.unifiedOrder",
2879
+ "kind": "process",
2880
+ "module": "payment",
2881
+ "source": {
2882
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
2883
+ "lineStart": 80,
2884
+ "lineEnd": 80,
2885
+ "kind": "source"
2886
+ },
2887
+ "tags": [
2888
+ "core"
2889
+ ]
2890
+ },
2891
+ {
2892
+ "id": "channel",
2893
+ "label": "支付渠道",
2894
+ "kind": "external",
2895
+ "module": "channel"
2896
+ },
2897
+ {
2898
+ "id": "paydb",
2899
+ "label": "t_pay_order",
2900
+ "kind": "dataStore",
2901
+ "module": "payment",
2902
+ "source": {
2903
+ "file": "docs/sql/init.sql",
2904
+ "lineStart": 251,
2905
+ "lineEnd": 251,
2906
+ "kind": "schema"
2907
+ }
2908
+ },
2909
+ {
2910
+ "id": "callback",
2911
+ "label": "ChannelNoticeController.doNotify",
2912
+ "kind": "process",
2913
+ "module": "payment",
2914
+ "source": {
2915
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/ChannelNoticeController.java",
2916
+ "lineStart": 170,
2917
+ "lineEnd": 170,
2918
+ "kind": "source"
2919
+ }
2920
+ },
2921
+ {
2922
+ "id": "notify",
2923
+ "label": "PayMchNotifyService.payOrderNotify",
2924
+ "kind": "process",
2925
+ "module": "notification",
2926
+ "source": {
2927
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayMchNotifyService.java",
2928
+ "lineStart": 53,
2929
+ "lineEnd": 53,
2930
+ "kind": "source"
2931
+ }
2932
+ },
2933
+ {
2934
+ "id": "notifydb",
2935
+ "label": "t_mch_notify_record",
2936
+ "kind": "dataStore",
2937
+ "module": "notification",
2938
+ "source": {
2939
+ "file": "docs/sql/init.sql",
2940
+ "lineStart": 296,
2941
+ "lineEnd": 296,
2942
+ "kind": "schema"
2943
+ }
2944
+ }
2945
+ ],
2946
+ "edges": [
2947
+ {
2948
+ "id": "df1",
2949
+ "source": "merchant",
2950
+ "target": "verify",
2951
+ "kind": "data",
2952
+ "label": "商户号、应用ID、签名和下单参数",
2953
+ "evidence": "source",
2954
+ "site": {
2955
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
2956
+ "lineStart": 56,
2957
+ "lineEnd": 56
2958
+ }
2959
+ },
2960
+ {
2961
+ "id": "df2",
2962
+ "source": "verify",
2963
+ "target": "order",
2964
+ "kind": "data",
2965
+ "label": "已校验 UnifiedOrderRQ",
2966
+ "evidence": "source",
2967
+ "site": {
2968
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/UnifiedOrderController.java",
2969
+ "lineStart": 61,
2970
+ "lineEnd": 61
2971
+ }
2972
+ },
2973
+ {
2974
+ "id": "df3",
2975
+ "source": "order",
2976
+ "target": "paydb",
2977
+ "kind": "data",
2978
+ "label": "支付订单与初始状态",
2979
+ "evidence": "source",
2980
+ "site": {
2981
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
2982
+ "lineStart": 201,
2983
+ "lineEnd": 201
2984
+ }
2985
+ },
2986
+ {
2987
+ "id": "df4",
2988
+ "source": "order",
2989
+ "target": "channel",
2990
+ "kind": "data",
2991
+ "label": "支付请求与渠道参数",
2992
+ "evidence": "source",
2993
+ "site": {
2994
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/AbstractPayOrderController.java",
2995
+ "lineStart": 205,
2996
+ "lineEnd": 205
2997
+ }
2998
+ },
2999
+ {
3000
+ "id": "df5",
3001
+ "source": "channel",
3002
+ "target": "callback",
3003
+ "kind": "data",
3004
+ "label": "渠道通知参数",
3005
+ "evidence": "source",
3006
+ "site": {
3007
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/ChannelNoticeController.java",
3008
+ "lineStart": 170,
3009
+ "lineEnd": 170
3010
+ }
3011
+ },
3012
+ {
3013
+ "id": "df6",
3014
+ "source": "callback",
3015
+ "target": "paydb",
3016
+ "kind": "data",
3017
+ "label": "渠道订单号与成功状态",
3018
+ "evidence": "source",
3019
+ "site": {
3020
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/payorder/ChannelNoticeController.java",
3021
+ "lineStart": 237,
3022
+ "lineEnd": 237
3023
+ }
3024
+ },
3025
+ {
3026
+ "id": "df7",
3027
+ "source": "paydb",
3028
+ "target": "notify",
3029
+ "kind": "data",
3030
+ "label": "支付订单和通知地址",
3031
+ "evidence": "source",
3032
+ "site": {
3033
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayOrderProcessService.java",
3034
+ "lineStart": 51,
3035
+ "lineEnd": 51
3036
+ }
3037
+ },
3038
+ {
3039
+ "id": "df8",
3040
+ "source": "notify",
3041
+ "target": "notifydb",
3042
+ "kind": "data",
3043
+ "label": "商户通知记录",
3044
+ "evidence": "source",
3045
+ "site": {
3046
+ "file": "jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayMchNotifyService.java",
3047
+ "lineStart": 88,
3048
+ "lineEnd": 88
3049
+ }
3050
+ }
3051
+ ],
3052
+ "layout": {
3053
+ "direction": "right"
3054
+ }
3055
+ }
3056
+ ]
3057
+ }