Compare commits

...

36 Commits

Author SHA1 Message Date
53df134759 Clarify payment domain ownership under REV003
Constraint: Keep payment documentation in existing formal docs rather than creating a parallel guide.\nRejected: Treating biz_payment_record as verified production tables | Current evidence only supports target/prototype semantics.\nConfidence: high\nScope-risk: narrow\nDirective: Do not move payment fact ownership into REV004; REV004 should reference REV003/SYS009 payment facts only.\nTested: make validate-file on main touched docs; make check-ai-governance; git diff --check.\nNot-tested: Full export/render pipeline.
2026-04-29 17:23:27 +08:00
1b6fda9c4d Record REV004 regression and fallback-reduction evidence
The evidence captures the new regression scripts, formal-first query
narrowing, and the fresh verification trail used to support the next
round of fallback removal.

Constraint: Evidence must match commands and outcomes actually executed in backend worktree
Rejected: Fold this into an older summary doc | would hide the stepwise proof for fallback reduction
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep appending fresh verification evidence here until the remaining legacy fallback is either removed or explicitly retained
Tested: Evidence cross-checked against backend worktree commands, regression logs, and targeted test outputs
Not-tested: No doc export/render pipeline executed
2026-04-20 15:02:24 +08:00
24761c5df3 Merge PR #16: add REV004 release ops checklist\n\nConstraint: Keep release operations guidance aligned with verified mainline state\nConfidence: high\nScope-risk: narrow\nDirective: Update this checklist only when release-critical reality changes, not for routine doc churn\nTested: PR #16 checklist cross-checked against current summary, truth matrix, and evidence set\nNot-tested: No document export/render pipeline executed at merge time 2026-04-17 18:23:08 +08:00
feb0da254f Add REV004 release ops checklist
This adds an operations-oriented checklist for REV004 covering environment
readiness, rollout order, smoke validation, rollback posture, and fast-path
triage hints for on-call and release engineers.

Constraint: Checklist must stay concise and executable for frontline release use
Rejected: Bury release steps across evidence and design docs only | too slow for runtime operations
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Update this checklist only when release-critical reality changes, not for every minor doc change
Tested: Cross-checked against final summary, go-live checklist, and current evidence set
Not-tested: No document export/render pipeline executed for this checklist
2026-04-17 18:19:47 +08:00
9946fa7572 Merge PR #15: add REV004 go-live and joint-debug checklist\n\nConstraint: Keep the checklist aligned with verified mainline state and evidence set\nConfidence: high\nScope-risk: narrow\nDirective: Update this checklist only when mainline reality or release blockers change materially\nTested: PR #15 checklist cross-checked against final summary, truth matrix, and evidence set\nNot-tested: No document export/render pipeline executed at merge time 2026-04-17 18:15:27 +08:00
74c951641f Add REV004 go-live and joint-debug checklist
This adds a concise operator-facing checklist for REV004 covering current
mainline SHAs, environment prerequisites, smoke order, remaining cautions,
and the evidence index used for release and joint-debug work.

Constraint: Checklist must reflect verified mainline reality and remain short enough for frontline use
Rejected: Keep launch guidance scattered across evidence files only | too slow for release/joint-debug coordination
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Update this checklist only when mainline reality materially changes or a new blocker emerges
Tested: Cross-checked against current mainline summary, truth matrix, and evidence set
Not-tested: No document export/render pipeline executed for this checklist
2026-04-17 18:11:46 +08:00
3741fd597d Merge PR #14: stabilize REV004 final summary docs anchor wording\n\nConstraint: Keep the final summary evergreen instead of self-expiring after each merge\nConfidence: high\nScope-risk: narrow\nDirective: Prefer stable branch-relative wording over self-referential merge SHAs in evergreen handoff docs\nTested: PR #14 wording reviewed against current docs mainline semantics\nNot-tested: No document export/render pipeline executed at merge time 2026-04-17 18:07:20 +08:00
700b8db99c Stabilize REV004 final summary docs anchor wording
This replaces the self-expiring docs latest-merge SHA in the final REV004
summary with a stable wording that points readers to current mainline content,
preventing the summary from going stale immediately after each merge.

Constraint: The top-level handoff summary must remain self-consistent after it is merged into main
Rejected: Keep chasing a concrete docs latest-merge SHA in follow-up patches | creates infinite self-expiring metadata churn
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Prefer stable branch-relative wording over self-referential merge SHAs in evergreen handoff docs
Tested: Reviewed rendered markdown diff for semantic equivalence plus improved stability
Not-tested: No document export/render pipeline executed for this wording-only change
2026-04-17 18:05:05 +08:00
0dd08ec623 Merge PR #13: upgrade redink evidence to full execute closure\n\nConstraint: Keep redink evidence and final summary aligned with the now-verified live execute closure\nConfidence: high\nScope-risk: narrow\nDirective: Remove stale blocker wording immediately once the external dependency closure is verified so handoff docs stay trustworthy\nTested: PR #13 content cross-checked against successful live execute smoke, DB readback, and cleanup results\nNot-tested: No document export/render pipeline executed at merge time 2026-04-17 17:57:42 +08:00
cbedf0aec8 Upgrade redink evidence to full execute closure
This updates the REDINK_RECORD evidence with a successful live execute smoke
run after bringing up business-bank-server locally, and refreshes the final
mainline delivery summary to remove the stale blocker wording.

Constraint: Docs must reflect the newly verified live redink execute closure, not the earlier blocked state
Rejected: Leave the old blocker note in place | factually stale after the successful execute rerun
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: If redink live execute is revalidated again later, append a dated subsection instead of rewriting this successful closure note
Tested: Cross-checked against successful live execute smoke, DB readback, and cleanup results on 2026-04-17
Not-tested: No document export/render pipeline executed for this docs-only refresh
2026-04-17 17:54:37 +08:00
c9b7a135c0 Merge PR #12: refresh REV004 final summary docs-main anchor\n\nConstraint: Keep the final summary internally consistent with current docs mainline\nConfidence: high\nScope-risk: narrow\nDirective: Refresh summary metadata immediately after future summary merges so the handoff page never self-stales\nTested: PR #12 content cross-checked against docs main ab4eec0...\nNot-tested: No document export/render pipeline executed at merge time 2026-04-17 17:38:57 +08:00
6cb590aa13 Refresh REV004 final summary docs-main anchor
This updates the docs-main latest merge anchor inside the REV004 final mainline
summary so the document remains self-consistent after its own merge.

Constraint: The final summary must reference the current docs mainline state, not the pre-summary merge anchor
Rejected: Leave the older docs merge SHA in place | would make the summary internally stale immediately after merge
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Refresh top-level summary anchors whenever the summary itself is merged into main
Tested: Cross-checked against origin/main latest merge ab4eec0...
Not-tested: No document export/render pipeline executed for this one-line metadata refresh
2026-04-17 17:37:42 +08:00
ab4eec0ea8 Merge PR #11: add REV004 final mainline delivery summary\n\nConstraint: Keep the final summary aligned with verified mainline state only\nConfidence: high\nScope-risk: narrow\nDirective: Refresh this summary only when meaningful mainline state changes occur so it remains a stable handoff artifact\nTested: PR #11 summary cross-checked against latest backend/docs mainline commits and evidence set\nNot-tested: No document export/render pipeline executed at merge time 2026-04-17 17:35:36 +08:00
9ac2e9f68e Add REV004 final mainline delivery summary
This adds a one-page summary of the current REV004 mainline delivery state,
including merged backend/docs commits, object truth status, evidence anchors,
and remaining external blockers.

Constraint: Summary must reflect verified mainline truth only, not feature-branch intent
Rejected: Scatter this information across multiple historical evidence files | too costly for frontline consumers to reconstruct delivery status
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep this summary as the top-level operator handoff page and refresh only after meaningful mainline state changes
Tested: Cross-checked against origin/develop and origin/main latest merge commits plus existing evidence set
Not-tested: No document export/render pipeline executed for this summary
2026-04-17 17:33:40 +08:00
415b4cee13 Merge PR #10: land prestorage strict formal-first evidence\n\nConstraint: Preserve reviewed prestorage process/attachments evidence without mixing unrelated docs\nConfidence: high\nScope-risk: narrow\nDirective: Append any future prestorage query verification as follow-up evidence rather than rewriting this closure proof\nTested: PR #10 evidence reviewed against backend PR #80 compile/test/smoke outputs\nNot-tested: No doc export/render pipeline executed at merge time 2026-04-17 17:24:24 +08:00
21aed1f7d7 Capture prestorage strict formal-first evidence for REV004
This records compile/test outputs plus fresh jar smoke proving that
prestorage-process and prestorage-attachments now read formal data first while
retaining fallback behavior.

Constraint: Evidence must stay aligned with the prestorage query-only strict formal-first batch and its application-dev smoke run
Rejected: Fold this note into older prestorage evidence files | reduces traceability for the specific process/attachments closure batch
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Append future prestorage query verification as follow-up evidence rather than overwriting this closure proof
Tested: Cross-checked against backend compile/test output and fresh smoke results on 2026-04-17
Not-tested: No document export/render pipeline executed for this evidence-only commit
2026-04-17 17:20:49 +08:00
89737608b3 Merge PR #9: refresh REV004 current truth matrix with redink\n\nConstraint: Keep the matrix aligned with verified mainline merges only\nConfidence: high\nScope-risk: narrow\nDirective: Refresh this matrix again only after future mainline merges so it stays trustworthy\nTested: PR #9 content cross-checked against backend develop d8596af... and docs main 57763c6...\nNot-tested: No document export/render pipeline executed at merge time 2026-04-17 17:05:58 +08:00
9ca67674a3 Refresh REV004 current truth matrix after redink merge
This updates the current-truth matrix to reflect that REDINK_RECORD is now
an independent formal-table object on the mainline, and refreshes the merge
anchors plus blocker note accordingly.

Constraint: Matrix must match verified mainline truth after PR #79 and docs redink evidence merge
Rejected: Leave REDINK_RECORD as not independent in the matrix | now factually incorrect after mainline merge
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Refresh this matrix only after verified mainline merges so it remains an operator-grade truth artifact
Tested: Cross-checked against origin/develop merge d8596af... and origin/main merge 57763c6...
Not-tested: No document export/render pipeline executed for this matrix refresh
2026-04-17 17:04:02 +08:00
57763c634e Merge PR #8: land REV004 redink evidence\n\nConstraint: Preserve reviewed REDINK_RECORD evidence without mixing unrelated doc drafts\nConfidence: high\nScope-risk: narrow\nDirective: Append a follow-up section when live execute smoke can be rerun with business-bank-server available\nTested: PR #8 evidence reviewed against backend PR #79 verification outputs and blocker trace\nNot-tested: No doc export/render pipeline executed at merge time 2026-04-17 16:56:55 +08:00
f1211d328c Capture redink formal-table dev-db evidence for REV004
This records the application-dev DDL apply/replay, compile and targeted
test evidence, fresh jar query smoke, cleanup proof, and the precise external
blocker observed when attempting live REDINK_RECORD execute smoke.

Constraint: Evidence must reflect the actually verified REDINK_RECORD formal-table scope and explicitly separate completed verification from blocked live-execute proof
Rejected: Present live execute smoke as fully complete | inaccurate because business-bank-server was unavailable
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: When business-bank-server becomes available, append a dated live-execute follow-up section instead of overwriting this baseline evidence
Tested: Cross-checked against backend compile/test outputs, psql results, query smoke, and application log exception trace on 2026-04-17
Not-tested: No document export/render pipeline executed for this evidence-only commit
2026-04-17 16:52:50 +08:00
692ac419f6 Merge PR #7: refresh REV004 current truth matrix\n\nConstraint: Keep the matrix aligned with verified mainline merges only\nConfidence: high\nScope-risk: narrow\nDirective: Refresh this matrix again after future mainline formal-table merges so it remains a reliable operator artifact\nTested: PR #7 content cross-checked against backend develop 1964c782... and docs main c741164...\nNot-tested: No document export/render pipeline executed at merge time 2026-04-17 15:45:14 +08:00
ba58013139 Refresh REV004 current truth matrix after price-diff merge
This updates the REV004 current-truth matrix to reflect that PRICE_DIFF_ADJUST
is now an independent formal-table object on the mainline, and refreshes the
merge/evidence anchors accordingly.

Constraint: Matrix must match current backend develop and docs main truth after PR #78 / docs evidence merge
Rejected: Keep the earlier matrix unchanged | it now incorrectly reports PRICE_DIFF_ADJUST as not independent
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Continue refreshing this matrix only after verified mainline merges, not from feature-branch intent alone
Tested: Cross-checked against origin/develop merge commit 1964c782... and origin/main merge commit c741164...
Not-tested: No document export/render pipeline executed for this matrix refresh
2026-04-17 15:43:50 +08:00
c741164fa4 Merge PR #6: land REV004 price-diff evidence\n\nConstraint: Preserve reviewed PRICE_DIFF_ADJUST evidence without mixing unrelated doc drafts\nConfidence: high\nScope-risk: narrow\nDirective: Keep future price-diff verification updates in follow-up evidence docs or dated append sections\nTested: PR #6 evidence reviewed against backend PR #78 verification outputs\nNot-tested: No doc export/render pipeline executed at merge time 2026-04-17 15:41:02 +08:00
f348481aeb Capture price-diff formal-table dev-db evidence for REV004
This records the application-dev DDL apply/replay, compile and targeted
test evidence, fresh-jar HTTP smoke, DB writeback checks, and cleanup proof
for the PRICE_DIFF_ADJUST formal-table batch.

Constraint: Evidence must stay aligned with the backend price-diff formal-table implementation and application-dev verification run on 2026-04-17
Rejected: Fold this evidence into unrelated doc drafts in the main docs worktree | would mix scopes and weaken traceability
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Append future price-diff reruns as dated subsections or follow-up evidence files instead of overwriting this baseline
Tested: Verified against backend compile/test output and direct psql + fresh-jar smoke results on 2026-04-17
Not-tested: No doc export/render pipeline executed for this evidence-only commit
2026-04-17 15:37:46 +08:00
b5efa3b248 Merge PR #5: land REV004 docs evidence and dict alignment\n\nConstraint: Preserve reviewed REV004 doc evidence and dict-alignment batch without mixing local draft docs\nConfidence: high\nScope-risk: moderate\nDirective: Keep subsequent REV004 evidence/doc updates in separate small PRs for traceability\nTested: PR #5 reviewed content plus latest writtenoff evidence refresh already pushed on branch\nNot-tested: No doc export/render pipeline executed at merge time 2026-04-17 15:01:25 +08:00
29e2ae36a2 Refresh writtenoff formal-table smoke evidence after reliability patch
This updates the REV004 writtenoff evidence with a fresh post-patch smoke run
covering submit, detail/page query, approve/reject, DB writeback, cleanup,
and runtime shutdown on port 48094.

Constraint: Evidence must reflect the final backend patch set actually pushed for PR #77
Rejected: Leave the earlier pre-patch smoke as the last evidence point | weaker proof for the final transaction/fail-fast tightening
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: If writtenoff smoke is rerun again, append a new dated subsection instead of overwriting this verification trail
Tested: Fresh jar smoke on 48094 plus direct psql cleanup/readback verification on 2026-04-17
Not-tested: No separate document export/render pipeline run for this evidence refresh
2026-04-17 14:58:44 +08:00
fccb3a7cf8 Capture writtenoff formal-table dev-db evidence for REV004
This evidence snapshot records the application-dev target database, DDL apply
and replay status, targeted verification commands, fresh-jar smoke outcomes,
and cleanup proof for the writtenoff formal-table batch.

Constraint: Evidence must remain aligned with the backend writtenoff formal-table batch and the actual application-dev database
Rejected: Fold evidence into unrelated doc updates already present in this branch | would mix scopes and obscure traceability
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Update this evidence if later writtenoff smoke is rerun on a different port or with different seeded IDs
Tested: Reviewed against backend compile/test results and direct psql cleanup verification on 2026-04-17
Not-tested: No additional doc rendering/export pipeline run for this evidence-only change
2026-04-17 14:50:06 +08:00
cbecb60aed Record bad-debt formal-table rollout evidence for REV004
This adds the rollout evidence for REV004 bad-debt formal-table work,
covering DDL application, targeted verification, fresh-jar HTTP smoke,
and cleanup proof on the application-dev database.

Constraint: Evidence scope stays limited to bad-debt formal-table rollout and should not absorb unrelated REV004 docs backlog
Rejected: Wait to document until writtenoff/price-diff formalization lands | delays a completed bad-debt evidence slice
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: If later bad-debt semantics expand beyond payState write-back, append a new evidence note instead of rewriting this rollout record
Tested: Evidence content cross-checked against compile/test/DDL/HTTP smoke outputs captured in this session
Not-tested: No doc export/render verification performed
2026-04-17 12:33:27 +08:00
ee78477e8f Record prestorage formal-table rollout evidence for REV004
This documents the prestorage formal-table rollout status, including test DB
DDL application, HTTP smoke evidence, cleanup proof, and the updated
formal-table status matrix for REV004.

Constraint: Documentation must stay scoped to prestorage formal-table evidence and status updates only
Rejected: Fold unrelated REV004 evidence backlog into this commit | would dilute the deliverable and review scope
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: When process/attachments become strict formal-first, update the status matrix and evidence instead of replacing this rollout record
Tested: Evidence file cross-checked against backend compile/test/DB/HTTP smoke outputs
Not-tested: No independent docs rendering/export verification performed
2026-04-17 10:52:11 +08:00
35f2f9b76c Record REV004 late-fee formal-table deployment and canary evidence
This documents that the formal-table deploy SQL has been applied to the
application-dev database, that the previous real-db blocker is resolved,
and that the date-mode late-fee reduce canary now passes against the
test database.

Constraint: Evidence must match the verified dev database and latest canary output
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep evidence updates aligned with the exact environment and command outputs used for verification
Tested: Evidence cross-checked against psql deployment output and fresh canary pass
Not-tested: No additional business flow beyond the documented late-fee date-mode canary
2026-04-15 16:14:03 +08:00
d0ee1cbc17 Align REV004 dictionaries with current interface semantics
Document the minimal dictionary additions and field-binding rules needed to
let REV004 front-end queries and dropdowns use system-managed object and
status semantics while continuing to reuse the existing legacy reason/type
dictionaries.

Constraint: Existing dictionary taxonomy must remain stable for historical pages
Constraint: REV004 needs explicit object/status dictionaries plus a redink reason set for FE binding
Rejected: Rename legacy dictionaries into a new unified taxonomy | too broad for this delivery and risks breaking existing pages
Rejected: Keep object/status values as code-only enums | insufficient for frontend dictionary binding
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: `payment_reason` is only a transitional binding for `WRITTENOFF_ADJUST`; introduce a dedicated writtenoff reason dictionary only when that object stabilizes long-term
Tested: Applied `sql/rev004_account_adjust_dict_seed.sql` to sw_system test DB and verified inserted dict types/data
Not-tested: Frontend page consumption against the new dictionary bindings
2026-04-07 17:53:47 +08:00
9d2ecf1cf6 docs: align planb deployment design with reviewed topology 2026-04-02 17:30:06 +08:00
2a1b9a69b0 merge: planb deployment and pg16 docs 2026-04-02 11:29:03 +08:00
fd8cb6725c Merge pull request 'docs: add pg16 dr resource application doc' (#4) from 011-frontend-speckit-alignment into main
Reviewed-on: #4
2026-03-24 15:57:02 +08:00
ccc014f15b Merge pull request 'docs: add frontend speckit alignment artifacts' (#3) from 011-frontend-speckit-alignment into main
Reviewed-on: #3
2026-03-24 14:13:31 +08:00
8baf5bc3d6 Merge pull request 'docs: finalize 010 bank transfer config' (#2) from docs-010-bank-transfer-config into main
Reviewed-on: #2
2026-03-24 12:12:55 +08:00
30 changed files with 2595 additions and 259 deletions

View File

@ -69,6 +69,12 @@
| 业务审查结论回写 | ✅ 已完成 | 2026-03-12 | 审查三项已在周检记录中形成结论 |
| 非关键治理补漏转入维护 | ✅ 已完成 | 2026-03-12 | 后续按周检机制持续跟踪,不再阻塞本阶段收口 |
### 持续维护记录
| 日期 | 事项 | 修订内容 | 影响 |
| ---- | ---- | -------- | ---- |
| 2026-04-29 | REV-003 支付域归属正式回写 | 将业务支付事实目标层(`biz_payment_record` / `biz_payment_record_detail`)正式归入 `REV-003` 营业收费;明确 `SYS-009` 仅承接 `bk_transaction*` 渠道事实;`REV-004` 仅在退款、冲正、账务调整中引用原支付/渠道事实。 | 统一概要、详细、接口、数据库、追溯矩阵和旧表迁移矩阵口径,避免把支付主域误归到 REV-004。 |
## 质量控制检查点
### 技术质量标准
@ -117,6 +123,7 @@
> 说明:本表中的历史记录按当时原始表述保留;当前正式数据库口径统一以“达梦数据库 8.0+”为准。
| 2026-03-26 | 方案二整体部署方案独立成文 | 1新增 `docs/design/03_Technical_Design/08_Integrated_Deployment_Design_PlanB.md`,将已采纳 PostgreSQL 16 方案二后的整体部署方案独立成文2结合当前前后端分层部署形态补齐应用、数据库、中间件、静态存储的一体化部署结构3新增软件拓扑图、网络拓扑图、主机角色划分、资源配置建议、网络需求和端口访问建议4`07_PostgreSQL16_DR_Resource_Application.md` 增加独立文档引用说明,在技术专项目录增加入口。 | 用户明确要求不要仅在 `07` 文档内保留方案二内容,而是需要形成独立文件,并作为已采纳数据库方案后的整体部署方案提交评审。 | 正面影响,数据库资源申请专题与整体部署方案实现职责分离;后续甲方可分别评审“数据库容灾资源申请”和“系统整体部署方案”,减少口径混杂并提升部署审批的可读性。 |
| 2026-04-02 | 方案二整体部署文档按网络图口径对齐 | 1`docs/design/03_Technical_Design/08_Integrated_Deployment_Design_PlanB.md` 的网络分区口径统一为“办公区 / 公网区域 / 互联网区DMZ / 内网区”2`Nginx` 入口、业务应用节点、`SFTP/FTP` 文件交换服务器的部署区域说明统一调整为与评审图一致3同步修正网络拓扑图、访问链路、带宽/端口、资源角色及结论段落中的命名与边界表述。 | 用户提供最新部署图,要求正式文档向图片口径靠拢,消除 `内网 Nginx`、应用区/DMZ、办公区等描述不一致问题。 | 正面影响,整体部署方案的图文一致性显著提升,便于甲方按统一网络边界和主机分区口径开展安全评审与资源审批。 |
| 2026-03-18 | REV-005 统计模板补齐 | 1`specs/002-rev005-invoice-flow/verification.md``T055``T060``T061``T062``T063` 新增可直接填写的样本记录模板2将 SC-001 ~ SC-004 的建议统计口径细化为表格字段与待补说明避免后续只剩抽象待办3保持“模板已补齐但实际统计结果仍待联调/测试环境补录”的真实状态,不虚构样本结果。 | 用户继续推进 REV-005希望把剩余统计类待办进一步收敛成可执行模板便于后续直接补录真实样本而不是重新设计统计格式。 | 正面影响REV-005 当前已具备统一的统计与日志抽样记录模板;后续补 `T055``T060 ~ T063` 时可直接按模板填充真实环境数据,减少再次整理验证文档结构的成本。 |
| 2026-03-18 | REV-005 verify 执行入口补齐 | 1`specs/002-rev005-invoice-flow/verification.md` 补齐 `/business/invoice/apply``/query``/query/compensate``/write-back``/customer/query``/customer/download``/customer/push``/invalidate``/red-ink` 的最小请求模板2继续补齐 `T055``T060 ~ T063` 的执行命令草稿与样本采集顺序,明确仅作为测试/联调环境占位模板真实地址、鉴权信息、业务主键与统计结果均待后续替换和回填3同步 `03_Task_Checklist.md`,将 verify 阶段推进到“替换真实环境参数即可执行”的状态。 | 用户继续推进 REV-005希望不要停留在抽象验证建议而是把剩余 verify 工作推进到可直接执行、可直接补样本的程度。 | 正面影响REV-005 当前已具备统一的验证入口、请求模板、命令草稿与采样顺序;后续在测试或联调环境中可直接替换参数发起请求并回填 `T055``T060 ~ T063` 的真实结果,减少重复梳理接口和命令的成本。 |

View File

@ -1,5 +1,15 @@
# 福建水务营收系统文档编写任务清单
## 📌 持续维护任务
### 📋 REV-003 支付域归属正式回写
- [x] **完成 REV-003 业务支付事实层正式文档回写** ✅ (2026-04-29)
- [x] 已在概要、详细、接口、数据库主文档中明确 `biz_payment_record` / `biz_payment_record_detail` 归属 `REV-003` 的目标/原型语义 ✅
- [x] 已明确 `SYS-009` 保持 `bk_transaction*` 渠道事实主责,`REV-004` 仅作为退款、冲正、账务调整引用方 ✅
- [x] 已更新旧表到新对象、字段级映射、试迁校验和 REV-004 追溯矩阵,区分业务支付事实、渠道事实与历史只读投影 ✅
- [x] 已保留“目标/原型、待实现验真”风险说明,避免把未验真实表写成生产事实 ✅
## 🎯 当前冲刺任务 (第一阶段:紧急问题修复)
### 📋 系统架构设计文档 (`water_biz_system_architecture.md`)

View File

@ -27,9 +27,9 @@
| SYS002-REQ-002 | REV-001 | 开票/托收/代扣关系维护 | 维护客户开票资料、托收关系、代扣关系、渠道绑定关系 | SYS-008 / SYS-009 | IF-REV-002 | biz_cust_invoice、biz_cust_collection_rel、biz_cust_withholding_rel、biz_cust_app_binds | Story |
| SYS002-REQ-003 | REV-002 | 抄表任务与数据采集 | 生成抄表任务并提交人工/远传抄表数据 | IoT / SYS-006 | IF-REV-004 / IF-EXT-009 | biz_meter_read、biz_reading_data、biz_last_reading、biz_reading_logs | Story |
| SYS002-REQ-004 | REV-002 | 开账计费与账单生成 | 基于价格模板、阶梯规则、费用组成生成营业账 | - | IF-REV-005 | biz_charge、biz_charge_detail、biz_price_*、biz_cost_component | Story |
| SYS002-REQ-005 | REV-003 | 收费核销处理 | 柜台收费、余额抵扣、多账单组合核销 | SYS-009 | IF-REV-006 | biz_charge、biz_charge_detail、biz_collection | Story |
| SYS002-REQ-006 | REV-003 | 支付下单与结果回写 | 发起支付订单并处理异步回调结果 | SYS-009 | IF-EXT-004 / IF-EXT-005 | bk_transaction、bk_transaction_callback、bk_transaction_exception | Story |
| SYS002-REQ-007 | REV-004 | 账务调整处理 | 支持金额调整、水量调整、退款、冲正、坏账 | - | IF-REV-007 | biz_charge、biz_charge_detail、biz_operat_log、bk_transaction* | Story |
| SYS002-REQ-005 | REV-003 | 收费核销处理 | 柜台收费、余额抵扣、多账单组合核销,并沉淀业务支付事实/分配明细目标语义 | SYS-009 | IF-REV-006 | biz_charge、biz_charge_detail、biz_collection、目标/原型 biz_payment_record、biz_payment_record_detail | Story |
| SYS002-REQ-006 | REV-003 | 支付下单与结果回写 | 发起支付订单并处理异步回调结果;业务结果回写到账单与业务支付事实目标层 | SYS-009 | IF-EXT-004 / IF-EXT-005 | 渠道事实:bk_transaction、bk_transaction_callback、bk_transaction_exception业务事实目标层biz_payment_record、biz_payment_record_detail | Story |
| SYS002-REQ-007 | REV-004 | 账务调整处理 | 支持金额调整、水量调整、退款、冲正、坏账;引用原支付/渠道事实进行校验追溯 | - | IF-REV-007 | biz_charge、biz_charge_detail、biz_operat_log;引用 bk_transaction* 与目标/原型 biz_payment_record* | Story |
| SYS002-REQ-008 | REV-005 | 发票申请受理 | 对已收费未开票账单发起单笔/批量开票申请 | SYS-008 | IF-REV-008 / IF-EXT-006 | biz_invoice、biz_invoice_taxrate、biz_cust_invoice | Story |
| SYS002-REQ-009 | REV-005 | 发票结果查询与补偿 | 按申请单号/受理号查询开票结果并补偿 | SYS-008 | IF-REV-009 | biz_invoice、biz_operat_log | Story |
| SYS002-REQ-010 | REV-005 | 发票结果回写 | 回写开票状态、票号、下载地址、作废/红冲结果 | SYS-008 | IF-EXT-007 | biz_invoice、biz_process_invoice_modifys | Story |

View File

@ -877,7 +877,7 @@ graph TB
| IF-REV-001 | 客户信息查询接口 | 查询客户档案、账户状态、联系人与水表绑定关系 | 柜台/客户渠道/工单 | HTTPS REST | 客户ID、客户编号、手机号、查询类型 | 客户档案、账户信息、联系人列表、水表绑定关系 |
| IF-REV-004 | 抄表数据提交接口 | 提交人工或远传抄表数据并触发校验 | 手机抄表APP/集抄系统 | HTTPS REST | 抄表任务ID、水表ID、读数、图片证据、GPS位置 | 上传结果、校验状态、异常标记 |
| IF-REV-005 | 账单生成接口 | 根据抄表结果、水价模板和费用组成生成账单 | 开账任务/批量任务 | HTTPS REST | 抄表批次、账期、客户范围、应收日期 | 账单结果、失败清单、生成汇总 |
| IF-REV-006 | 缴费处理接口 | 创建收费记录并核销账单 | 柜台/线上渠道 | HTTPS REST | 客户ID、账单ID列表、支付方式、实收金额 | 收费结果、核销状态、交易流水 |
| IF-REV-006 | 缴费处理接口 | 创建收费记录并核销账单,形成业务支付事实与分配明细的目标语义 | 柜台/线上渠道 | HTTPS REST | 客户ID、账单ID列表、支付方式、实收金额 | 收费结果、核销状态、交易流水、业务支付记录 |
| IF-REV-008 | 发票申请接口 | 发起电子发票申请并接收票据状态回写 | 柜台/客户渠道 | HTTPS REST | 客户ID、账单ID列表、开票抬头、税号、邮箱 | 发票申请结果、票据状态、下载地址 |
| IF-REV-011 | 银行代收协同接口 | 发起代扣、回盘、对账、结算协同 | 银行代收模块/SYS-009 | HTTPS REST / 文件交换 | 批次号、渠道编码、账期、账单明细 | 批次状态、回盘结果、对账差异、结算结果 |
| IF-REV-012 | 业务参数配置接口 | 查询和维护价格模板、优惠方案、业务参数配置 | 管理后台/参数管理端 | HTTPS REST | 参数分类、模板编码、站点范围 | 参数明细、模板信息、更新结果 |
@ -1748,8 +1748,8 @@ graph TD
- **客户资料管理**:客户档案建立、信息维护、分组管理
- **抄表开账**:抄表数据录入、复核确认、自动开账
- **营业收费**:柜台收费、移动收费、在线缴费
- **账务处理**:一期先聚焦水量调整、金额调整、退款、冲正、坏账申请,统一经 `IF-REV-007` 承接,并按共性能力先统一、场景能力再分批推进
- **营业收费**:柜台收费、移动收费、在线缴费,并作为业务支付事实层(目标语义:`biz_payment_record` / `biz_payment_record_detail`)的归属模块
- **账务处理**:一期先聚焦水量调整、金额调整、退款、冲正、坏账申请,统一经 `IF-REV-007` 承接;退款、冲正等场景引用 `REV-003` 业务支付事实与 `SYS-009` 渠道交易事实,不再作为支付主域
- **发票管理**:发票开具、查询、重开、作废
- **催缴管理**:欠费统计、催缴通知、停水管理
- **统计分析**:多维度数据统计和报表分析
@ -1804,7 +1804,7 @@ graph TD
| IF-REV-001 | 客户信息查询接口 | 查询客户档案、账户状态、联系人与水表绑定关系 | 柜台/客户渠道/工单 | HTTPS REST | 客户ID、客户编号、手机号、查询类型 | 客户档案、账户信息、联系人列表、水表绑定关系 |
| IF-REV-004 | 抄表数据提交接口 | 提交人工或远传抄表数据并触发校验 | 手机抄表APP/集抄系统 | HTTPS REST | 抄表任务ID、水表ID、读数、图片证据、GPS位置 | 上传结果、校验状态、异常标记 |
| IF-REV-005 | 账单生成接口 | 根据抄表结果、水价模板和费用组成生成账单 | 开账任务/批量任务 | HTTPS REST | 抄表批次、账期、客户范围、应收日期 | 账单结果、失败清单、生成汇总 |
| IF-REV-006 | 缴费处理接口 | 创建收费记录并核销账单 | 柜台/线上渠道 | HTTPS REST | 客户ID、账单ID列表、支付方式、实收金额 | 收费结果、核销状态、交易流水 |
| IF-REV-006 | 缴费处理接口 | 创建收费记录并核销账单,形成业务支付事实与分配明细的目标语义 | 柜台/线上渠道 | HTTPS REST | 客户ID、账单ID列表、支付方式、实收金额 | 收费结果、核销状态、交易流水、业务支付记录 |
| IF-REV-008 | 发票申请接口 | 发起电子发票申请并接收票据状态回写 | 柜台/客户渠道 | HTTPS REST | 客户ID、账单ID列表、开票抬头、税号、邮箱 | 发票申请结果、票据状态、下载地址 |
| IF-REV-011 | 银行代收协同接口 | 发起代扣、回盘、对账、结算协同 | 银行代收模块/SYS-009 | HTTPS REST / 文件交换 | 批次号、渠道编码、账期、账单明细 | 批次状态、回盘结果、对账差异、结算结果 |
| IF-REV-012 | 业务参数配置接口 | 查询和维护价格模板、优惠方案、业务参数配置 | 管理后台/参数管理端 | HTTPS REST | 参数分类、模板编码、站点范围 | 参数明细、模板信息、更新结果 |
@ -1974,8 +1974,8 @@ graph TB
|---|---|---|---|
| REV-001 | 客户资料管理 | 客户档案管理、客户分组、信息变更 | 自行开发 |
| REV-002 | 抄表开账 | 抄表录入、复核开账、异常处理 | 自行开发 |
| REV-003 | 营业收费 | 柜台收费、移动收费、在线缴费 | 自行开发 |
| REV-004 | 账务处理 | 账务调整、退款处理、坏账管理 | 自行开发 |
| REV-003 | 营业收费 | 柜台收费、移动收费、在线缴费、业务支付事实与分配明细(目标语义) | 自行开发 |
| REV-004 | 账务处理 | 账务调整、退款处理、坏账管理;引用收费/支付事实,不拥有支付主域 | 自行开发 |
| REV-005 | 发票管理 | 发票开具、查询管理、电子发票 | 自行开发 |
| REV-006 | 催缴管理 | 欠费催缴、短信通知、停水管理 | 自行开发 |
| REV-007 | 统计分析 | 多维度数据统计和报表分析功能 | 自行开发 |
@ -2254,7 +2254,7 @@ flowchart TD
**功能概述:**
  营业收费模块提供完整的收费业务流程管理,支持多种收费方式和支付渠道。
  营业收费模块提供完整的收费业务流程管理,支持多种收费方式和支付渠道。业务归属上,`REV-003` 承接“账单核销后的业务支付事实”与“支付分配明细”的目标语义;`SYS-009` 继续承接银行、聚合支付、回调、对账、结算等渠道事实。当前文档中的 `biz_payment_record` / `biz_payment_record_detail` 仅表达目标/原型层,不等同于已验真的生产表。
**核心功能:**
@ -2334,7 +2334,7 @@ flowchart TD
**功能概述:**
  负责处理各类复杂的账务调整、退款、坏账等业务,确保账务的准确性和合规性。
  负责处理各类复杂的账务调整、退款、坏账等业务,确保账务的准确性和合规性。`REV-004` 需要引用原收费记录、业务支付事实与渠道交易事实进行校验和追溯,但不重新定义支付主单或渠道流水主模型。
**核心功能:**

View File

@ -84,8 +84,8 @@ retrieval_priority: P1
| `UP-004` | 审计监控与运维支撑 | [章节](./11_UP_Detailed.md#mod-up-004) | 操作日志、接口日志、任务日志 | `IF-UP-003`(审计关联) | 运维平台、消息服务 |
| `REV-001` | 客户资料管理 | [章节](./12_REV_Detailed.md#mod-rev-001) | 客户、账户、联系人、绑定关系 | `IF-REV-001` | 客户服务、表务、报装 |
| `REV-002` | 抄表开账 | [章节](./12_REV_Detailed.md#mod-rev-002) | 抄表任务、读数、账单主明细 | `IF-REV-004``IF-REV-005` | 抄表APP、IoT、表务 |
| `REV-003` | 营业收费 | [章节](./12_REV_Detailed.md#mod-rev-003) | 营业账、交易流水、回调记录 | `IF-REV-006` | `SYS-009` 支付结算 |
| `REV-004` | 账务处理 | [章节](./12_REV_Detailed.md#mod-rev-004) | 账单调整、日志、审批留痕 | `IF-REV-007` | 财务、营收后台 |
| `REV-003` | 营业收费 | [章节](./12_REV_Detailed.md#mod-rev-003) | 营业账、业务支付事实/分配明细目标层、渠道交易流水、回调记录 | `IF-REV-006` | `SYS-009` 支付结算`bk_transaction*` 归渠道事实 |
| `REV-004` | 账务处理 | [章节](./12_REV_Detailed.md#mod-rev-004) | 账单调整、日志、审批留痕;引用原支付/渠道事实 | `IF-REV-007` | 财务、营收后台;不拥有支付主域 |
| `REV-005` | 发票与税务处理 | [章节](./12_REV_Detailed.md#mod-rev-005) | 发票主记录、税率、开票信息 | `IF-REV-008` | `SYS-008` 发票服务 |
| `REV-006` | 催缴与通知 | [章节](./12_REV_Detailed.md#mod-rev-006) | 欠费账单、催缴结果 | `IF-REV-009` | `SYS-010` 消息服务 |
| `REV-007` | 统计分析 | [章节](./12_REV_Detailed.md#mod-rev-007) | 客户、抄表、收费、渠道聚合 | `IF-REV-010` | 报表与管理端 |

View File

@ -56,8 +56,8 @@ retrieval_priority: P1
|---|---|---|---|
| REV-001 客户资料管理 | `IF-REV-001` | `biz_cust``biz_account``biz_cust_*` | 客户服务模块、报装模块 |
| REV-002 抄表开账 | `IF-REV-004``IF-REV-005` | `biz_meter_book``biz_meter_read``biz_reading_*``biz_charge*` | 抄表APP、物联网集抄 |
| REV-003 营业收费 | `IF-REV-006` | `biz_charge*``biz_collection``bk_transaction*` | `SYS-009` |
| REV-004 账务处理 | `IF-REV-007` | `biz_charge*``biz_operat_log*` | 财务与营业人员 |
| REV-003 营业收费 | `IF-REV-006` | `biz_charge*``biz_collection`目标/原型 `biz_payment_record*``bk_transaction*` | `SYS-009` |
| REV-004 账务处理 | `IF-REV-007` | `biz_charge*``biz_operat_log*`;引用 `REV-003` 支付事实与 `SYS-009` 渠道事实 | 财务与营业人员 |
| REV-005 发票与税务处理 | `IF-REV-008` | `biz_invoice*``biz_cust_invoice` | `SYS-008` |
| REV-006 催缴与通知 | `IF-REV-013` | `biz_charge*`、催缴结果留痕 | `SYS-010` |
| REV-007 统计分析 | `IF-REV-010` | 客户、抄表、收费、渠道聚合对象 | 统计分析端 |
@ -220,7 +220,7 @@ flowchart TD
### 功能说明
支持柜台收费、预存款/余额抵扣、线上缴费回写、柜面扫码、营业网点收费及收费凭证管理,统一承接营收账单的核销处理。
支持柜台收费、预存款/余额抵扣、线上缴费回写、柜面扫码、营业网点收费及收费凭证管理,统一承接营收账单的核销处理。领域边界上,`REV-003` 是业务支付事实与支付分配明细的归属模块;`SYS-009` 只承接渠道交易、回调、对账和结算事实。
### 业务流程
@ -245,7 +245,7 @@ flowchart TD
1. 一次缴费可对应多个账单或账单明细的组合核销。
2. 收费记录必须保留渠道、流水号、网点、操作员、终端信息。
3. 线上支付必须以回调或查询确认结果为准,不得以发起状态直接记账。
4. 支付能力由 `SYS-009` 提供SYS-002 负责账单核销与业务状态回写。
4. 支付能力由 `SYS-009` 提供SYS-002 负责账单核销、业务支付事实沉淀与业务状态回写;渠道交易事实不替代业务支付分配明细
5. 当前实现侧已确认 `PayCeb` 的欠费查询、缴费处理基础闭环可用,但代理收费对账仍为预留能力;正式文档不得将实时收费对账写成已闭环能力。
### 核心数据
@ -253,6 +253,7 @@ flowchart TD
- `biz_charge``biz_charge_detail`:待缴与已缴账单主明细。
- `biz_collection`:托收/代收主表。
- `biz_withholding`:代扣/托收主表。
- `biz_payment_record``biz_payment_record_detail`:业务支付主单与分配明细的目标/原型对象,承接旧 `PM_PAY_DETAILS` 的实收、实销、滞纳金、红冲关联等核心语义;未完成实现验真前不得表述为已落地生产表。
- `bk_transaction`:渠道交易流水。
- `bk_transaction_callback`:支付回调记录。
- `bk_transaction_exception`:支付异常记录。
@ -277,6 +278,12 @@ flowchart TD
- 当前设计可将红冲视为收费核销后的修正场景,不强制要求独立实体表,但必须提供历史只读查询口径。
- 红冲迁移最小保留信息应包括原收费记录、红冲时间、红冲金额、原因、经办人、关联账单和后续账务状态。
#### 旧支付明细与汇总台账
- 旧 `PM_PAY_DETAILS` 的实收金额、实销金额、滞纳金、收费员、红冲关联等字段应优先映射到 `REV-003` 业务支付事实目标层,而不是直接等同于 `SYS-009` 的渠道交易流水。
- 旧 `PM_PAY_SUBTOTALS``PM_PAY_COLLECTS` 更接近班结/汇总/报表口径,可由 `biz_payment_record*``biz_collection``bk_transaction*` 和历史只读归档共同支撑,不建议为旧汇总表机械复制一套在线主表。
- 旧 `PM_REALTIMES*` 如仅用于实时收费过程日志和历史查询,迁移时按历史只读与操作留痕保留;真正发生业务核销时仍回归 `IF-REV-006` 与业务支付事实目标层。
### 接口映射
- `IF-REV-006`:创建收费记录、执行账单核销并回写状态。
@ -315,7 +322,7 @@ flowchart TD
1. 一期场景严格限定为水量调整、金额调整、退款、冲正、坏账申请,不扩展到其他接口族或独立账务台账重构。
2. 所有场景均以 `biz_charge` / `biz_charge_detail` 为主承接对象,并通过 `biz_operat_log` / `biz_operat_log_detail` 记录处理依据、前后变化和责任归属。
3. 退款、冲正必须联动 `bk_transaction`、`bk_transaction_callback``bk_transaction_exception`原支付流水及渠道状态校验,不允许仅依据账单状态直接处理。
3. 退款、冲正必须联动 `REV-003` 业务支付事实目标层与 `bk_transaction`、`bk_transaction_callback``bk_transaction_exception` 等渠道状态校验,不允许仅依据账单状态直接处理。
4. 接口结果统一返回 `resultStatus``writeBackStatus`,其中 `resultStatus` 表示处理结论,`writeBackStatus` 表示账单状态回写结论,两者不得混用。
5. 审批相关内容一期仅保留 `approvalRequired``PENDING_APPROVAL` 与审批边界说明,不展开完整 BPM 流程、节点、流转规则或审批回写实现细节。
6. 对于当前未见明确独立实体表的特账、跨周期水量、退款账等对象,文档以“业务处理场景”表述,不强行落为已实现表。
@ -323,7 +330,8 @@ flowchart TD
### 核心数据
- `biz_charge``biz_charge_detail`:账务调整的核心对象,承接调整前后账单主明细状态。
- `bk_transaction``bk_transaction_callback``bk_transaction_exception`:退款、冲正场景的原交易校验与异常追溯对象。
- `biz_payment_record``biz_payment_record_detail`:退款、冲正、预存转退等场景引用的业务支付事实目标层,用于追溯原收款与核销分配关系。
- `bk_transaction``bk_transaction_callback``bk_transaction_exception`:退款、冲正场景的渠道交易校验与异常追溯对象。
- 价格调整/优惠相关表:用于重算账单或差额追溯。
- `biz_operat_log``biz_operat_log_detail`:操作与变更留痕,记录字段差异、处理说明、附件依据与责任归属。

View File

@ -75,7 +75,7 @@ retrieval_priority: P0
| SYS-002 基础配置与价格体系 | `biz_community`, `biz_company_*`, `biz_meter_*`, `biz_price_*`, `biz_template_*` | 小区、水司账户、水表参数、价格体系、调价快照、优惠方案、模板关系等 | 已按真实表对齐 |
| SYS-002 客户主数据与账户关系 | `biz_cust*`, `biz_account` | 客户主档、联系人、客户组、水表绑定、开票信息、托收/代扣关系、编号规则等 | 已按真实表对齐 |
| SYS-002 抄表开账与账单 | `biz_meter`, `biz_meter_book`, `biz_meter_read`, `biz_reading_*`, `biz_charge*` | 抄表册本、抄表状态、读数留痕、开账主单与明细 | 已按真实表对齐 |
| SYS-002 收费票据与操作留痕 | `biz_collection`, `biz_withholding`, `biz_invoice*`, `biz_operat_log*` | 收费、托收/代扣、发票、操作留痕与审计支撑 | 已按真实表对齐 |
| SYS-002 收费票据与操作留痕 | `biz_collection`, `biz_withholding`, `biz_invoice*`, `biz_operat_log*`;目标/原型:`biz_payment_record*` | 收费、托收/代扣、业务支付事实目标层、发票、操作留痕与审计支撑 | 真实表已按现状对齐`biz_payment_record*` 需实现验真后升级为已落地 |
| SYS-002 业务办理与资料 | `biz_process*`, `biz_business_*`, `biz_content*` | 业务办理流程、流转、装表资料、附件与扩展数据 | 已按真实表对齐 |
| SYS-002 银行代收与结算 | `bk_*` | 渠道路由、交易回调、代扣签约、批次、对账、结算 | 已按真实表对齐 |
| SYS-003 手机抄表 APP | `mobile_*` | 移动作业缓存、登录日志、离线任务与现场上报 | 保持现稿 |
@ -1072,7 +1072,7 @@ retrieval_priority: P0
| `biz_water_use_scheme_tier` | `scheme_code`, `tier_level`, `start_volume`, `end_volume` | 用水阶梯 |
| `biz_exceed_water_use_scheme` | `scheme_code`, `exceed_type`, `price_rule` | 超计划规则 |
## SYS-002 开账、收费与票据表 (`biz_charge*` / `biz_collection` / `biz_withholding` / `biz_invoice*`)
## SYS-002 开账、收费与票据表 (`biz_charge*` / `biz_collection` / `biz_withholding` / 目标 `biz_payment_record*` / `biz_invoice*`)
### biz_charge (营业账主表)
| 字段名 | 说明 |
@ -1121,6 +1121,23 @@ retrieval_priority: P0
| `biz_collection` | `code`, `cust_id`, `charge_id`, `collection_status` | 托收主表 |
| `biz_withholding` | `code`, `cust_id`, `charge_id`, `withholding_status` | 代扣主表 |
### biz_payment_record / biz_payment_record_detail (业务支付事实目标层)
> 当前口径:`biz_payment_record``biz_payment_record_detail` 用于表达 `REV-003` 下业务支付主单与账单/费用分配明细的目标/原型语义。除非后续 DDL、Mapper、Service 与测试库实表均完成验真,数据库主文档不得将其表述为已确认生产表。
| 表名 | 目标关键字段 | 说明 |
| :--- | :--- | :--- |
| `biz_payment_record` | `payment_no`, `cust_id`, `payment_amount`, `payment_channel`, `payment_time`, `source_transaction_no`, `payment_status` | 业务支付事实主单,表达一次业务收款/核销结果,与 `bk_transaction*` 的渠道交易事实通过交易号或渠道单号关联 |
| `biz_payment_record_detail` | `payment_id`, `charge_id`, `charge_detail_id`, `detail_type`, `allocated_amount`, `late_fee_amount` | 支付分配明细,表达一笔收款对账单、费用组成、本金/违约金等核销对象的分配关系 |
#### REV-003 支付事实分层口径
| 层次 | 主对象 | 归属 | 说明 |
| :--- | :--- | :--- | :--- |
| 账单结果投影 | `biz_charge``biz_charge_detail` | `REV-002` / `REV-003` 联动 | 表达应收、欠费、已缴、核销状态等账单结果,不承载完整支付主单语义 |
| 业务支付事实目标层 | `biz_payment_record``biz_payment_record_detail` | `REV-003` | 表达业务收款事实与分配明细,承接旧 `PM_PAY_DETAILS` 的实收、实销、滞纳金、红冲关联等核心语义 |
| 渠道交易事实 | `bk_transaction*` | `SYS-009` | 表达银行/聚合支付/回调/对账/结算渠道事实,不直接替代业务支付分配明细 |
### biz_invoice / biz_invoice_taxrate (发票主表与税率表)
| 表名 | 关键字段 | 说明 |
| :--- | :--- | :--- |
@ -1153,7 +1170,7 @@ retrieval_priority: P0
| 旧对象/旧菜单 | 当前主口径 | 承接方式 | 数据策略 |
| :--- | :--- | :--- | :--- |
| 开账记录、特殊开账 | `biz_charge``biz_charge_detail``biz_operat_log*` | 统一纳入营业账主表与明细表,特殊开账按来源类型、业务类型、依据说明留痕,不单设平行“特殊开账表” | 在线保留 |
| 柜台收费、实时收费、代收代扣 | `biz_collection``biz_withholding``bk_transaction*``bk_withholding_*` | 统一纳入收费主模型与渠道交易模型,柜台班结/实时收费日志按交易结果和操作留痕归并 | 在线保留 |
| 柜台收费、实时收费、代收代扣 | `biz_collection``biz_withholding`目标/原型 `biz_payment_record*``bk_transaction*``bk_withholding_*` | 统一纳入收费主模型、业务支付事实目标层与渠道交易模型,柜台班结/实时收费日志按交易结果、支付分配和操作留痕归并 | 在线保留 / 目标层待验真 |
| 发票申请、开票结果、票据税率 | `biz_invoice``biz_invoice_taxrate``biz_cust_invoice` | 统一纳入发票主表、税率表和客户开票信息,不为旧“营业账开票表”机械复制新在线表 | 在线保留 |
| 微网厅业务字段、页面配置、微信参数 | `biz_business_types``biz_business_datas``biz_page_settings*``biz_parameter_settings``sys_wechat_app_settings` | 统一归并为业务类型、页面配置和渠道参数模型 | 在线保留 |
| 办理附件、电子档案 | `biz_content``biz_content_attach` | 当前新增与迁移后新增资料统一按资料主表与附件表承接 | 在线保留 |
@ -1174,7 +1191,7 @@ retrieval_priority: P0
| 对账主题 | 最低核对维度 | 主口径来源 | 验收要求 |
| :--- | :--- | :--- | :--- |
| 开账记录 | 客户数、账单数、账期、应收金额 | `biz_charge``biz_charge_detail` + 历史账单来源 | 支持按账期、营业所、客户类型汇总比对 |
| 缴费记录 | 收费笔数、实收金额、渠道、核销状态 | `biz_collection``bk_transaction*` | 支持按渠道、日期、营业所汇总比对 |
| 缴费记录 | 收费笔数、实收金额、渠道、核销状态、分配金额 | `biz_collection`目标/原型 `biz_payment_record*``bk_transaction*` | 支持按渠道、日期、营业所汇总比对,并区分业务支付事实与渠道交易事实 |
| 发票记录 | 开票笔数、金额、状态、票据类型 | `biz_invoice*` + 历史开票关系 | 支持按发票状态、开票日期比对 |
| 红冲与账务调整 | 调整笔数、调整金额、处理结果 | 账务处理结果 + 历史台账 | 支持汇总与单据级差异定位 |
| 催缴与停复水 | 通知笔数、执行结果、停复水状态 | `IF-REV-013` 任务结果 + 历史记录 | 支持按账期、客户、执行状态、处置引用比对 |

View File

@ -95,8 +95,8 @@ retrieval_priority: P0
|---------|----------|-------------|
| REV-001 | 客户资料管理 | 客户、账户、联系人、水表绑定等主数据查询与维护 |
| REV-002 | 抄表开账 | 抄表任务、抄表数据、校验、开账触发 |
| REV-003 | 营业收费 | 收费受理、账单核销、柜台与渠道收款状态回写 |
| REV-004 | 账务处理 | 调整、退款、冲正、坏账等账务处理申请与结果回写 |
| REV-003 | 营业收费 | 收费受理、账单核销、柜台与渠道收款状态回写,并承接业务支付事实与分配明细的目标语义 |
| REV-004 | 账务处理 | 调整、退款、冲正、坏账等账务处理申请与结果回写;仅引用原支付/渠道事实,不拥有支付主域 |
| REV-005 | 发票管理 | 发票申请、开票结果回写、票据状态查询 |
| REV-006 | 催缴管理 | 催缴名单生成、催缴任务下发、通知结果回写 |
| REV-007 | 统计分析 | 营收、抄表、收费、客户、渠道统计查询 |
@ -296,8 +296,8 @@ retrieval_priority: P0
| IF-REV-003 | 抄表任务下发接口 | REV-002 | 按册本、片区、抄表周期生成抄表任务 | `biz_meter_book``biz_meter_read` |
| IF-REV-004 | 抄表数据提交接口 | REV-002 | 提交抄表数据、图片、异常标记并触发校验 | `biz_reading_data``biz_reading_logs``biz_last_reading` |
| IF-REV-005 | 账单生成接口 | REV-002 | 根据抄表结果、价格模板和费用组成生成账单 | `biz_charge``biz_charge_detail``biz_price_template``biz_cost_component` |
| IF-REV-006 | 缴费处理接口 | REV-003 | 创建收费记录、核销账单、回写收款结果 | `biz_collection``biz_charge``bk_transaction` |
| IF-REV-007 | 账务调整接口 | REV-004 | 发起金额调整、退款、冲正、坏账等业务处理 | `biz_charge``biz_charge_detail``biz_operat_log` |
| IF-REV-006 | 缴费处理接口 | REV-003 | 创建收费记录、核销账单、回写收款结果,并形成业务支付事实/分配明细目标语义 | `biz_collection``biz_charge``bk_transaction`;目标/原型:`biz_payment_record``biz_payment_record_detail` |
| IF-REV-007 | 账务调整接口 | REV-004 | 发起金额调整、退款、冲正、坏账等业务处理,按引用关系校验原业务支付事实与渠道流水 | `biz_charge``biz_charge_detail``biz_operat_log`;引用:`bk_transaction*`、目标/原型 `biz_payment_record*` |
| IF-REV-008 | 发票申请接口 | REV-005 | 后台发起单笔/批量开票申请并生成受理主键 | `biz_invoice``biz_invoice_taxrate``biz_cust_invoice` |
| IF-REV-009 | 发票结果查询接口 | REV-005 | 按申请单号/受理号查询开票结果并执行补偿查询 | `biz_invoice``biz_operat_log` |
| IF-REV-013 | 催缴任务生成与结果承接接口 | REV-006 | 生成催缴任务、查询任务结果并承接四态状态回写 | `biz_charge``biz_operat_log`、历史催缴查询口径 |
@ -431,8 +431,8 @@ retrieval_priority: P0
| 归属模块 | REV-003 |
| 请求方式 | POST |
| 请求路径 | `/admin-api/revenue/collection/create` |
| 功能描述 | 处理柜台收费、预存抵扣、渠道收款确认与账单核销 |
| 核心表 | `biz_collection``biz_charge``bk_transaction` |
| 功能描述 | 处理柜台收费、预存抵扣、渠道收款确认与账单核销,并在目标口径下沉淀业务支付主单与账单/费用分配明细 |
| 核心表 | 现状:`biz_collection``biz_charge``bk_transaction`;目标/原型:`biz_payment_record``biz_payment_record_detail` |
### IF-REV-007 账务调整接口
@ -443,11 +443,11 @@ retrieval_priority: P0
| 请求方式 | POST |
| 请求路径 | `/admin-api/revenue/accounting/adjust` |
| 功能描述 | 发起水量调整、金额调整、退款、冲正、坏账申请五类账务处理,并统一返回处理结果、审批边界与账单回写状态 |
| 核心表 | `biz_charge``biz_charge_detail``biz_operat_log``bk_transaction*` |
| 核心表 | `biz_charge``biz_charge_detail``biz_operat_log`;退款/冲正引用 `bk_transaction*` 与目标/原型 `biz_payment_record*` 进行原支付事实追溯 |
边界约束:
- 一期仅覆盖 `USAGE``AMOUNT``REFUND``REVERSE``BAD_DEBT` 五类 `adjustType`
- 退款、冲正必须提供 `sourceTradeNo` 并完成原交易校验;其他场景不得误用支付流水替代业务依据。
- 退款、冲正必须提供 `sourceTradeNo` 并完成原交易校验;涉及业务支付事实时按 `REV-003` 目标口径引用 `biz_payment_record*`其他场景不得误用支付流水替代业务依据。
- 审批相关内容仅保留 `approvalRequired``PENDING_APPROVAL` 与边界说明,不展开 BPM 节点与审批回写实现细节。
- `resultStatus``writeBackStatus` 必须分离表达,前者表示处理结论,后者表示账单状态回写结论。
@ -1544,7 +1544,7 @@ sequenceDiagram
| 客户扩展关系 | `biz_cust_meter``biz_cust_invoice``biz_cust_app_binds``biz_cust_collection_rel``biz_cust_withholding_rel` | 用于客户关联对象查询与服务协同 |
| 抄表与开账 | `biz_meter_book``biz_meter_read``biz_reading_data``biz_last_reading``biz_charge``biz_charge_detail` | 用于抄表任务、账单生成、费用明细查询 |
| 价格与参数 | `biz_price_*``biz_cost_component``biz_parameter_settings``biz_page_settings*` | 用于价格模板、业务参数、页面配置 |
| 收费与票据 | `biz_collection``biz_withholding``biz_invoice``biz_invoice_taxrate` | 用于收费、代扣、发票申请与回写 |
| 收费、业务支付事实与票据 | `biz_collection``biz_withholding`目标/原型 `biz_payment_record``biz_payment_record_detail``biz_invoice``biz_invoice_taxrate` | 用于收费、代扣、业务支付主单/分配明细目标语义、发票申请与回写`biz_payment_record*` 需以实现/DDL 验真后再升级为已落地生产表 |
| 办理与资料 | `biz_process*``biz_business_datas``biz_content*` | 用于业务办理与进度跟踪 |
| 银行代收与结算 | `bk_transaction*``bk_withholding_*``bk_reconcile_*``bk_settlement_batch` | 用于支付流水、批次、回调、对账和结算 |
@ -1739,7 +1739,7 @@ sequenceDiagram
| 查询主题 | 挂靠接口族 | 主要数据来源 | 最低返回要求 | 说明 |
|---------|------------|--------------|--------------|------|
| 历史账单、特殊开账 | `IF-CS-002``IF-REV-005` | `biz_charge*` + 历史账单来源 | 原账单号、新账单号、客户号、账期、金额、状态、来源类型 | 支撑账单迁移核查与客户侧历史查询 |
| 缴费记录、柜台结账、实时收费 | `IF-CS-002``IF-REV-006``IF-REV-011` | `biz_collection``bk_transaction*` + 历史收费记录 | 原流水号、渠道、实收金额、收费时间、柜员/营业所、核销状态 | 支撑渠道对账、柜面核查和历史收据核对 |
| 缴费记录、柜台结账、实时收费 | `IF-CS-002``IF-REV-006``IF-REV-011` | `biz_collection`目标/原型 `biz_payment_record*``bk_transaction*` + 历史收费记录 | 原流水号、渠道、业务支付金额、分配/核销金额、收费时间、柜员/营业所、核销状态 | 支撑渠道对账、柜面核查和历史收据核对;业务支付事实归 `REV-003`,渠道事实归 `SYS-009` |
| 红冲与账务调整 | `IF-REV-007` | 操作留痕、流程结果 + 历史调整台账 | 调整类型、关联原单号、调整金额、原因、审批状态、处理时间 | 支撑预存退款、已销调整、价差调整、分账调整、呆坏账查询 |
| 发票与开票关系 | `IF-REV-008``IF-CS-004` | `biz_invoice*` + 历史开票关系快照 | 发票号、申请单号、关联账单、票据状态、票据类型、文件地址 | 支撑发票结果核查与历史补打定位 |
| 催缴、停复水、预存短信 | `IF-REV-013``IF-METER-002` | 通知结果、流程工单 + 历史催缴记录 | 客户号、账期、催缴方式、消息状态、停复水状态、执行人、执行时间、处置引用 | 支撑催缴处置闭环核查 |

View File

@ -53,15 +53,15 @@ retrieval_priority: P1
1. 数据库部署方案已采纳 `docs/design/03_Technical_Design/07_PostgreSQL16_DR_Resource_Application.md` 中的方案二,即“同城双可用区主备容灾方案”。
2. 前端继续采用 `Nginx + Vue3` 的静态部署模式。
3. 对外访问经甲方或第三方管理的公网入口进行薄转发,不纳入本方案主机资源范围。
4. 内网 `Nginx` 单独部署,负责将开放 API 端点负载到两台业务应用节点。
5. 两台业务应用节点内均部署 `Spring Boot Gateway`,作为微服务集群统一接入入口,并同时承载业务服务。
4. `Nginx` 入口单独部署在互联网区 `DMZ`,负责承接办公网、公网入口和外部授权链路转发,并将开放 API 端点负载到两台业务应用节点。
5. 两台业务应用节点部署在互联网区 `DMZ`,节点内均部署 `Spring Boot Gateway`,作为微服务集群统一接入入口,并同时承载业务服务。
6. 中间件集中部署在 1 台主机上。
7. 数据库控制组件与中间件部署在同一台主机上。
8. `RustFS` 作为静态存储与对象存储统一入口,与中间件同机部署。
9. 一期口径下,原“数据与中间件节点”和“文件存储节点”合并为 1 台综合节点。
10. 银行文件交换采用独立 `SFTP/FTP` 文件交换服务器,作为银行送盘、回盘、对账文件交换专用前置机。
10. 银行文件交换采用独立 `SFTP/FTP` 文件交换服务器,并部署在互联网区 `DMZ`作为银行送盘、回盘、对账文件交换专用前置机。
11. 当前已知可用于本方案的业务与基础设施主机资源如下:
- 内网 Nginx 入口节点8 核 CPU / 16 GB 内存 / 300 GB 存储,共 1 台
- DMZ Nginx 入口节点8 核 CPU / 16 GB 内存 / 300 GB 存储,共 1 台
- 业务应用节点32 核 CPU / 64 GB 内存 / 300 GB 存储,共 2 台
- 数据、中间件与文件存储综合节点16 核 CPU / 32 GB 内存 / 2300 GB 存储,共 1 台
- 银行文件交换服务器2 核 CPU / 8 GB 内存 / 200 GB 存储,共 1 台
@ -75,8 +75,8 @@ retrieval_priority: P1
2. 中间件集中部署,降低主机数量和运维复杂度。
3. 数据库主备分离部署,避免与中间件、应用节点混部。
4. 数据库控制组件集中部署,通过统一代理地址屏蔽主备切换细节。
5. 网络按公网接入区、内网接入区、应用区、中间件与文件存储区、银行文件交换区、数据区分层隔离
6. 在现有主机数量约束下,优先复用现有业务应用节点、内网入口节点及综合节点资源。
5. 网络按办公区、公网区域、互联网区 `DMZ`、内网区分层隔离;其中数据库、中间件控制与备份归档均落在内网区
6. 在现有主机数量约束下,优先复用现有业务应用节点、DMZ Nginx 入口节点及综合节点资源。
## 软件拓扑图
@ -87,67 +87,71 @@ flowchart LR
classDef source fill:#ecfeff,stroke:#0891b2,stroke-width:1.2px,color:#083344;
classDef access fill:#fff7ed,stroke:#ea580c,stroke-width:1.4px,color:#7c2d12;
classDef app fill:#eff6ff,stroke:#2563eb,stroke-width:1.4px,color:#1e3a8a;
classDef zone fill:#f8fafc,stroke:#94a3b8,stroke-width:1.2px,color:#0f172a;
subgraph OUTER[公网域]
subgraph OFFICE[办公区]
direction TB
U1[PC 端用户<br/>办公网段]:::source
end
subgraph PUBLIC[公网区域]
direction TB
U2[移动端用户]:::source
U3[第三方系统]:::source
G1[公网接入代理]:::access
G1[公网授权入口]:::access
end
subgraph INNER[内部网络域]
subgraph DMZ[互联网区 / DMZ]
direction TB
U1[PC 端用户]:::source
G2[内网 Nginx]:::access
G2[Nginx 入口]:::access
A1[业务应用节点 1<br/>Spring Boot Gateway + 业务服务]:::app
A2[业务应用节点 2<br/>Spring Boot Gateway + 业务服务]:::app
end
subgraph APP1[业务应用节点 1]
direction TB
A1G[Spring Boot Gateway]:::app
A1B[业务服务]:::app
end
class OFFICE,PUBLIC,DMZ zone;
subgraph APP2[业务应用节点 2]
direction TB
A2G[Spring Boot Gateway]:::app
A2B[业务服务]:::app
end
U1 -->|内网访问| G2
U1 -->|办公网访问,内网 IP| G2
U2 -->|HTTPS 443| G1
U3 -->|接口访问| G1
G1 -->|跨公网/内网边界转发| G2
G2 -->|负载到节点 1| A1G
G2 -->|负载到节点 2| A2G
A1G --> A1B
A2G --> A2B
U3 -->|HTTPS / API| G1
G1 -->|授权转发| G2
G2 -->|API 转发| A1
G2 -->|API 转发| A2
```
图说明:
1. 图中已明确区分公网域与内部网络域
2. PC 端用户通过内网直接访问内部网络域中的内网 Nginx
3. 移动端用户和第三方系统位于公网域,先经公网接入代理,再跨边界转发到内部网络域中的内网 Nginx
4. 内网 Nginx 将开放 API 端点负载到两台业务应用节点。
5. 两台业务应用节点内均部署 Spring Boot Gateway作为微服务集群统一接入入口。
6. 每台业务应用节点内的 Gateway 再向本节点业务服务转发请求
1. 图中已明确区分办公区、公网区域和互联网区 `DMZ`
2. PC 端用户位于办公区,经办公网使用内网 IP 直接访问 `DMZ` 内的 `Nginx` 入口
3. 移动端用户和第三方系统位于公网区域,先经公网授权入口,再跨边界进入 `DMZ` 内的 `Nginx` 入口
4. `Nginx` 入口位于互联网区 `DMZ`,负责将开放 API 端点负载到两台业务应用节点。
5. 两台业务应用节点位于互联网区 `DMZ`,节点内均部署 `Spring Boot Gateway`,作为微服务集群统一接入入口。
6. 公网入口后侧涉及的边界路由与 `NAT` 转换属于甲方网络侧能力,本图不展开网络设备细节
**图 4-2 综合服务软件拓扑图**
```mermaid
flowchart TB
classDef zone fill:#f8fafc,stroke:#94a3b8,stroke-width:1.2px,color:#0f172a;
classDef app fill:#eff6ff,stroke:#2563eb,stroke-width:1.4px,color:#1e3a8a;
classDef service fill:#f5f3ff,stroke:#7c3aed,stroke-width:1.4px,color:#4c1d95;
A1[业务应用节点 1<br/>Gateway + Biz]:::app
A2[业务应用节点 2<br/>Gateway + Biz]:::app
subgraph M[综合节点]
direction TB
M2[Redis / Nacos / RustFS]:::service
M3[HAProxy / PgBouncer / Patroni]:::service
subgraph DMZ[互联网区 / DMZ]
direction LR
A1[业务应用节点 1<br/>Gateway + Biz]:::app
A2[业务应用节点 2<br/>Gateway + Biz]:::app
end
subgraph INTRA[内网区]
direction TB
subgraph M[综合节点]
direction TB
M2[Redis / Nacos / RustFS]:::service
M3[HAProxy / PgBouncer / Patroni]:::service
end
end
class DMZ,INTRA zone;
A1 -->|缓存 配置 文件访问| M2
A2 -->|缓存 配置 文件访问| M2
A1 -->|数据库代理访问| M3
@ -156,31 +160,43 @@ flowchart TB
图说明:
1. 综合节点承接缓存、配置、对象存储及数据库控制组件。
2. 两台业务应用节点统一访问综合节点,不直接连接数据库。
1. 综合节点位于内网区,承接缓存、配置、对象存储及数据库控制组件。
2. 两台 `DMZ` 业务应用节点统一访问内网区综合节点,不直接连接数据库。
**图 4-3 数据与备份软件拓扑图**
```mermaid
flowchart LR
classDef zone fill:#f8fafc,stroke:#94a3b8,stroke-width:1.2px,color:#0f172a;
classDef service fill:#f5f3ff,stroke:#7c3aed,stroke-width:1.4px,color:#4c1d95;
classDef data fill:#ecfdf5,stroke:#059669,stroke-width:1.4px,color:#064e3b;
classDef backup fill:#fffbeb,stroke:#d97706,stroke-width:1.4px,color:#78350f;
classDef bank fill:#fef2f2,stroke:#dc2626,stroke-width:1.4px,color:#7f1d1d;
M2[RustFS / 文件归档]:::service
M3[HAProxy / PgBouncer / Patroni]:::service
F1[SFTP / FTP 文件交换服务器]:::bank
D1[(PostgreSQL 主库)]:::data
D2[(PostgreSQL 热备)]:::data
B1[备份归档存储]:::backup
subgraph DMZ[互联网区 / DMZ]
F1[SFTP / FTP 文件交换服务器]:::bank
end
M3 -->|数据库访问| D1
M3 -->|状态感知| D2
D1 -->|同步复制| D2
D1 -->|基础备份 WAL 归档| B1
subgraph INTRA[内网区]
direction LR
subgraph M[综合节点]
direction TB
M1[数据库管理控件 / 中间件]:::service
M2[对象存储 / RustFS]:::service
end
D1[(PostgreSQL 主库)]:::data
D2[(PostgreSQL 热备)]:::data
B1[备份归档存储]:::backup
end
class DMZ,INTRA zone;
M1 -->|5432 数据库访问| D1
M1 -.->|5432 状态探测| D2
D1 -->|主备同步| D2
D1 -->|备份 / WAL 归档| B1
D2 -->|备份副本| B1
M2 -->|对象存储归档| B1
M2 -->|文件归档| B1
F1 -->|银行文件归档| B1
```
@ -188,7 +204,7 @@ flowchart LR
1. 数据库控制组件经由主库提供数据库访问能力。
2. 主库与热备之间通过同步复制保持一致性。
3. 银行文件交换服务器承接送盘、回盘、对账文件交换能力。
3. 银行文件交换服务器位于互联网区 `DMZ`承接送盘、回盘、对账文件交换能力。
4. RustFS 与银行文件交换服务器分别将各自数据归档到备份归档存储。
## 主机部署图
@ -201,14 +217,15 @@ flowchart LR
classDef app fill:#eff6ff,stroke:#2563eb,stroke-width:1.2px,color:#1e3a8a;
classDef middle fill:#f5f3ff,stroke:#7c3aed,stroke-width:1.2px,color:#4c1d95;
classDef data fill:#ecfdf5,stroke:#059669,stroke-width:1.2px,color:#064e3b;
GW[内网 Nginx 入口节点]:::gateway
classDef backup fill:#fffbeb,stroke:#d97706,stroke-width:1.2px,color:#78350f;
GW[DMZ Nginx 入口节点]:::gateway
APP1[业务应用节点 1<br/>内含 Gateway]:::app
APP2[业务应用节点 2<br/>内含 Gateway]:::app
MID[综合节点]:::middle
FTP[SFTP / FTP 文件交换服务器]:::middle
MID[综合节点]:::middle
DB1[(数据库主库服务器)]:::data
DB2[(数据库热备服务器)]:::data
BK[备份归档存储]:::backup
GW --> APP1
GW --> APP2
@ -219,23 +236,26 @@ flowchart LR
MID --> DB1
MID --> DB2
DB1 --> DB2
DB1 --> BK
DB2 --> BK
MID --> BK
```
图说明:
1. 内网 Nginx 入口节点作为我方统一接入入口,承接 API 转发与内部负载均衡能力
2. 业务应用节点 1 和业务应用节点 2 组成应用主机集群,节点内同时部署 Spring Boot Gateway 与核心业务服务
3. 综合节点集中承载 Redis、Nacos、RustFS、HAProxy、PgBouncer、Patroni并同时访问数据库主库与热备服务器
4. 独立的 SFTP/FTP 文件交换服务器承接银行送盘、回盘、对账文件交换,并由业务应用节点直接访问
5. 数据库主库服务器与数据库热备服务器独立部署,满足数据库高可用要求
1. 本图仅表达主机与主机之间的部署关系,不重复展开办公区、公网区域和跨边界访问链路
2. `Nginx` 入口节点、业务应用节点和 `SFTP/FTP` 文件交换服务器部署在互联网区 `DMZ`
3. 综合节点、数据库主库服务器、数据库热备服务器和备份归档存储部署在内网区
4. 业务应用节点经 `DMZ Nginx` 接入,并访问综合节点与 `SFTP/FTP` 文件交换服务器
5. 综合节点统一访问 PostgreSQL 主库与热备;主库、热备和综合节点均向备份归档存储输出数据
主机部署细化说明:
1. 内网 Nginx 入口节点部署 `Nginx`,负责开放 API 转发和内部负载均衡。
2. 两台业务应用节点分别部署 `Spring Boot Gateway` 与业务服务实例。
3. 综合节点部署 `Redis``Nacos``RustFS``HAProxy``PgBouncer``Patroni`,并负责访问数据库主库与热备服务器。
4. SFTP/FTP 文件交换服务器部署银行文件交换服务及送盘、回盘、对账目录,由业务应用节点直接访问。
5. 数据库主库服务器部署 PostgreSQL 主库实例,数据库热备服务器部署 PostgreSQL 热备实例。
1. 互联网区 `DMZ``Nginx` 入口节点部署 `Nginx`,负责开放 API 转发和内部负载均衡。
2. 两台互联网区 `DMZ` 业务应用节点分别部署 `Spring Boot Gateway` 与业务服务实例。
3. 内网区综合节点部署 `Redis``Nacos``RustFS``HAProxy``PgBouncer``Patroni`,并负责访问数据库主库与热备服务器。
4. 互联网区 `DMZ``SFTP/FTP` 文件交换服务器部署银行文件交换服务及送盘、回盘、对账目录,由业务应用节点直接访问。
5. 内网区数据库主库服务器部署 PostgreSQL 主库实例,数据库热备服务器部署 PostgreSQL 热备实例。
## 数据库访问链路图
@ -288,7 +308,7 @@ flowchart LR
## 网络拓扑图
> 说明:如需生成正式网络分区图与网络连接图,统一以 `scripts/generate_planb_diagrams.py` 生成的产物为准;其他脚本仅用于布局试验,不作为正式交付依据。
> 说明:如需生成正式网络分区图,统一以 `scripts/generate_planb_diagrams.py` 生成的产物为准;其他脚本仅用于布局试验,不作为正式交付依据。
**图 4-7 网络分区图**
@ -302,50 +322,47 @@ flowchart LR
classDef bank fill:#fef2f2,stroke:#dc2626,stroke-width:1.2px,color:#7f1d1d;
classDef backup fill:#fffbeb,stroke:#d97706,stroke-width:1.2px,color:#78350f;
U[用户与外部系统]:::user
PGW[公网接入代理]:::edge
subgraph Z1[内网接入区]
IGW[内网 Nginx]
subgraph Z1[办公区]
PC[PC 端用户]
end
subgraph Z2[应用区]
subgraph Z2[公网区域]
PUB[移动端用户 / 第三方系统]
EDGE[公网入口 / 边界路由 / NAT]
BANK[银行系统]
end
subgraph Z3[互联网区 / DMZ]
IGW[Nginx 入口]
APP[业务应用集群]
end
subgraph Z3[综合服务区]
MID[综合节点]
end
subgraph Z4[数据区]
DBM[(PostgreSQL 主库)]
DBS[(PostgreSQL 热备)]
end
subgraph Z6[互联网银行交换区]
FX[SFTP / FTP 文件交换服务器]
end
subgraph Z5[机房接入区]
subgraph Z4[内网区]
MID[综合节点]
DBM[(PostgreSQL 主库)]
DBS[(PostgreSQL 热备)]
BK[备份归档存储]
end
class Z1,Z2,Z3,Z4,Z5,Z6 zone;
class IGW edge;
class APP svc;
class MID svc;
class Z1,Z2,Z3,Z4 zone;
class PC,PUB user;
class EDGE,IGW edge;
class APP,MID svc;
class DBM,DBS data;
class FX bank;
class BK backup;
U --> PGW
U --> IGW
PGW --> IGW
PC --> IGW
PUB --> EDGE
BANK --> IGW
BANK --> FX
EDGE --> IGW
IGW --> APP
APP --> FX
APP --> MID
MID --> DBM
MID --> DBS
MID -.-> DBS
DBM --> BK
DBS --> BK
MID --> BK
@ -353,94 +370,17 @@ flowchart LR
图说明:
1. 公网接入代理不纳入我方主机资源,但作为公网访问进入内网的前置接入层予以保留。
2. 网络分区图按服务器和服务器集群粒度表达,不展开单机内部软件组件。
3. PC 端用户可直接通过内网访问内网 Nginx移动端和第三方系统经公网接入代理后进入内网 Nginx。
4. 业务应用集群、综合服务区、数据区、机房接入区、互联网银行交换区相互隔离,通过授权链路互通。
**图 4-8 网络连接图**
```mermaid
flowchart TB
classDef user fill:#ecfeff,stroke:#0891b2,stroke-width:1.2px,color:#083344;
classDef access fill:#fff7ed,stroke:#ea580c,stroke-width:1.2px,color:#7c2d12;
classDef app fill:#eff6ff,stroke:#2563eb,stroke-width:1.2px,color:#1e3a8a;
classDef middle fill:#f5f3ff,stroke:#7c3aed,stroke-width:1.2px,color:#4c1d95;
classDef data fill:#ecfdf5,stroke:#059669,stroke-width:1.2px,color:#064e3b;
classDef backup fill:#fffbeb,stroke:#d97706,stroke-width:1.2px,color:#78350f;
classDef bank fill:#fef2f2,stroke:#dc2626,stroke-width:1.2px,color:#7f1d1d;
subgraph OUTER[公网域]
direction LR
M[移动端用户]:::user
T[第三方系统]:::user
FX[SFTP/FTP文件交换服务器]:::bank
end
subgraph INNER[内部网络域]
direction TB
subgraph CLIENT[客户端]
PC[PC 端用户]:::user
end
subgraph ACCESS[接入层]
PGW[公网接入代理]:::access
IGW[内网 Nginx]:::access
end
subgraph SVC[应用与中间件层]
APP[业务应用集群<br/>Spring Boot Gateway + Biz]:::app
CACHE[Redis / Nacos / RustFS]:::middle
CTRL[HAProxy / PgBouncer / Patroni]:::middle
end
subgraph DATA[数据层]
DBM[(PostgreSQL 主库)]:::data
DBS[(PostgreSQL 热备)]:::data
end
subgraph STORAGE[存储层]
STORE[备份归档存储]:::backup
end
end
%% 公网访问链路
M -->|HTTPS 443| PGW
T -->|HTTPS 443 / 接口| PGW
PGW -->|请求转发| IGW
%% 内网访问链路
PC -->|内网访问| IGW
IGW -->|网关/应用端口| APP
%% 应用层依赖
APP -->|6379 / 8848 / 9000| CACHE
APP -->|文件传输| FX
APP -->|6432 / 5000| CTRL
CTRL -->|5432| DBM
CTRL -.->|5432 状态探测| DBS
DBM -->|主备同步| DBS
%% 数据备份与归档
CACHE -->|归档文件| STORE
DBM -->|备份 / WAL 归档| STORE
DBS -.->|备份副本| STORE
```
图说明:
1. 图中已明确区分公网域与内部网络域,公网访问通过公网接入代理跨边界进入内部网络。
2. PC 端用户位于内部网络域,直接访问内网 Nginx移动端和第三方系统位于公网域。
3. 内网 Nginx 统一将 API / Gateway 请求负载到业务应用集群。
4. 业务应用集群分别访问综合服务、银行文件交换服务器和数据库控制组件。
5. 综合服务中的数据库控制组件同时访问 PostgreSQL 主库与热备;数据库与综合服务均向备份归档存储输出归档数据。
1. 公网入口、边界路由和 `NAT` 转发不纳入我方主机资源,但作为公网访问进入 `DMZ` 的前置接入层予以保留。
2. 网络分区图按办公区、公网区域、互联网区 `DMZ`、内网区四区模型表达,不展开单机内部软件组件。
3. PC 端用户可直接通过办公网访问 `DMZ` 中的 `Nginx` 入口;移动端和第三方系统经公网入口、边界路由或 `NAT` 转发后进入 `DMZ`
4. `DMZ` 中的 `Nginx` 入口、业务应用集群、银行文件交换服务器与内网区综合节点、数据库、备份归档存储通过授权链路互通。
5. 银行系统除通过 `SFTP/FTP` 目录交换文件外,还可按授权专线或外联链路访问 `DMZ Nginx` 暴露的 API 入口,网络分区图已同步表达这两类授权链路。
## 主机角色与部署内容
| 层级 | 主机角色 | 数量 | 主要部署内容 | 说明 |
|---|---|---:|---|---|
| 接入层 | 内网 Nginx 入口节点 | 1 台 | Nginx、API 转发、内部负载均衡 | 作为我方统一内网接入入口,承接开放 API 转发 |
| 接入层 | DMZ Nginx 入口节点 | 1 台 | Nginx、API 转发、内部负载均衡 | 作为我方统一 DMZ 接入入口,承接办公网访问、公网转发与开放 API 转发 |
| 应用层 | 业务应用节点(主) | 2 台 | Spring Boot Gateway、Spring Boot 业务服务 | 承载微服务集群接入与表务、抄表、收费、账务、发票、报表等核心应用服务 |
| 综合支撑层 | 数据、中间件与文件存储综合节点 | 1 台 | Redis、Nacos、RustFS、HAProxy、PgBouncer、Patroni | 中间件、数据库控制与文件存储同机部署 |
| 银行交换层 | SFTP/FTP 文件交换服务器 | 1 台 | SFTP/FTP 服务、送盘目录、回盘目录、对账目录、归档目录 | 作为银行文件交换专用前置机 |
@ -452,7 +392,7 @@ flowchart TB
| 主机角色 | 数量 | 建议配置 | 备注 |
|---|---:|---|---|
| 内网 Nginx 入口节点 | 1 台 | 8 核 CPU / 16 GB 内存 / 300 GB 存储 | 承载内网 Nginx、API 转发和内部负载均衡 |
| DMZ Nginx 入口节点 | 1 台 | 8 核 CPU / 16 GB 内存 / 300 GB 存储 | 承载 DMZ Nginx、API 转发和内部负载均衡 |
| 业务应用节点(主) | 2 台 | 32 核 CPU / 64 GB 内存 / 300 GB 存储 | 承载 Spring Boot Gateway 及表务、抄表、收费、账务、发票、报表等核心应用服务 |
| 数据、中间件与文件存储综合节点 | 1 台 | 16 核 CPU / 32 GB 内存 / 2300 GB 存储 | 承载缓存、配置治理、数据库控制、图片、附件等非结构化数据 |
| SFTP/FTP 文件交换服务器 | 1 台 | 2 核 CPU / 8 GB 内存 / 200 GB 存储 | 承载银行送盘、回盘、对账、归档文件交换,建议独立部署 |
@ -483,7 +423,7 @@ flowchart TB
| 序号 | 资源名称 | 数量 | 规格 | 部署内容 | 用途说明 | 建议口径 |
|---|---:|---:|---|---|---|---|
| 1 | 内网 Nginx 入口节点 | 1 台 | 8 核 CPU / 16 GB 内存 / 300 GB 存储 | Nginx、API 转发、内部负载均衡 | 我方统一内网接入入口 | 可利旧优先 |
| 1 | DMZ Nginx 入口节点 | 1 台 | 8 核 CPU / 16 GB 内存 / 300 GB 存储 | Nginx、API 转发、内部负载均衡 | 我方统一 DMZ 接入入口 | 可利旧优先 |
| 2 | 业务应用节点(主) | 2 台 | 32 核 CPU / 64 GB 内存 / 300 GB 存储 | Spring Boot Gateway、Spring Boot 核心业务服务 | 承载微服务接入与核心业务服务 | 现有资源纳入正式方案 |
| 3 | 数据、中间件与文件存储综合节点 | 1 台 | 16 核 CPU / 32 GB 内存 / 2300 GB 存储 | Redis、Nacos、RustFS、HAProxy、PgBouncer、Patroni | 承载缓存、配置治理、数据库控制、图片、附件、导出文件等能力 | 现有资源纳入正式方案 |
| 4 | SFTP/FTP 文件交换服务器 | 1 台 | 2 核 CPU / 8 GB 内存 / 200 GB 存储 | SFTP/FTP 服务、送盘/回盘/对账目录、归档目录 | 承载银行文件交换与目录隔离 | 按最节约一期规划建议新增或单独利旧 |
@ -493,7 +433,7 @@ flowchart TB
### 审批建议
1. 业务应用节点、综合节点、内网 Nginx 入口节点可优先按现有资源纳入实施范围。
1. 业务应用节点、综合节点、DMZ Nginx 入口节点可优先按现有资源纳入实施范围。
2. SFTP/FTP 文件交换服务器建议单独审批,以满足银行文件交换隔离和安全要求。
3. PostgreSQL 主库与热备库建议作为单独审批项,避免与现有业务节点混部。
4. 备份归档存储建议作为单独资源项审批,避免后期因备份空间不足影响正式上线。
@ -504,7 +444,7 @@ flowchart TB
|---|---|---|---|---|
| 操作系统 | Linux 发行版 | 银河麒麟Kylin V10X86 | 全部服务器 | 按甲方当前基础环境标准选定 |
| 运行环境 | JDK | 17 | 业务应用节点 | Spring Boot 运行环境 |
| 接入层 | Nginx | 1.20+ | 内网 Nginx 入口节点 | 内网 API 转发、内部负载均衡 |
| 接入层 | Nginx | 1.20+ | DMZ Nginx 入口节点 | 办公网、公网入口转发与内部负载均衡 |
| 网关服务 | Spring Boot Gateway | 3.x | 业务应用节点 | 微服务集群统一接入 |
| 业务服务 | Spring Boot | 3.x | 业务应用节点 | 核心业务服务框架 |
| 银行文件交换 | SFTP/FTP 服务 | 稳定版 | SFTP/FTP 文件交换服务器 | 银行送盘、回盘、对账文件交换 |
@ -531,7 +471,7 @@ flowchart TB
| 组件 | 部署节点 | 建议部署方式 | 是否建议 `host` 模式 | 说明 |
|---|---|---|---|---|
| 内网 Nginx | 内网 Nginx 入口节点 | Docker 部署 | 是,优先建议 | 作为我方统一接入入口,便于端口管理与转发 |
| DMZ Nginx | DMZ Nginx 入口节点 | Docker 部署 | 是,优先建议 | 作为我方统一 DMZ 接入入口,便于端口管理与转发 |
| Spring Boot Gateway | 业务应用节点(主) | Docker 部署 | 否 | 作为微服务统一接入入口,建议与业务服务同节点部署 |
| Spring Boot 应用 | 业务应用节点(主) | Docker 部署 | 否 | 便于发布、回滚、扩容,保留容器网络隔离 |
| SFTP/FTP 服务 | SFTP/FTP 文件交换服务器 | 物理机/虚拟机直接部署 | 否 | 作为银行文件交换专用服务,建议独立部署并做目录隔离 |
@ -548,7 +488,7 @@ flowchart TB
结合当前资源结构,建议优先采用 `Docker + host` 模式的组件如下:
1. `内网 Nginx`
1. `DMZ Nginx`
2. `HAProxy`
3. `PgBouncer`
@ -573,18 +513,18 @@ flowchart TB
| 网络分区 | 部署对象 | 访问要求 |
|---|---|---|
| 公网接入区 | 公网入口薄转发 | 对外提供 HTTPS 访问,不纳入我方主机资源 |
| 应用区 | 业务应用节点 | 仅允许内网接入区与运维区访问 |
| 中间件与文件存储区 | Redis、Nacos、RustFS、数据库控制组件 | 仅允许业务应用节点与运维区访问 |
| 银行文件交换区 | SFTP/FTP 文件交换服务器 | 仅允许业务应用节点、银行专线或授权外联链路访问 |
| 数据区 | PostgreSQL 主库、热备库、备份存储 | 严格限制,仅允许中间件控制主机和运维区访问 |
| 办公区 | PC 端用户办公网段 | 仅允许通过办公网访问 `DMZ Nginx` 入口 |
| 公网区域 | 移动端用户、第三方系统、公网入口薄转发、边界路由 / NAT | 对外提供 HTTPS 访问,不纳入我方主机资源 |
| 互联网区 DMZ | `DMZ Nginx`、业务应用节点、`SFTP/FTP` 文件交换服务器 | 作为对外与跨边界服务区,仅允许按授权链路访问内网区 |
| 内网区 | Redis、Nacos、RustFS、数据库控制组件、PostgreSQL 主库/热备、备份归档存储 | 严格限制,仅允许 `DMZ` 业务应用节点、综合节点控制链路和运维区访问 |
### 2. 带宽与时延要求
| 网络链路 | 建议要求 | 说明 |
|---|---|---|
| 公网入口薄转发到内网 Nginx | 千兆网络 | 满足公网入口转发 |
| 内网 Nginx 到业务应用 | 千兆网络 | 满足开放 API 转发与网关接入 |
| 公网入口薄转发到 DMZ Nginx | 千兆网络 | 满足公网入口转发 |
| 办公网到 DMZ Nginx | 千兆网络 | 满足办公网通过内网 IP 访问 |
| DMZ Nginx 到业务应用 | 千兆网络 | 满足开放 API 转发与网关接入 |
| 业务应用到综合节点 | 千兆网络 | 满足缓存、配置治理、文件访问与数据库代理访问 |
| 业务应用到 SFTP/FTP 服务器 | 千兆网络 | 满足送盘、回盘、对账文件交换 |
| 银行链路到 SFTP/FTP 服务器 | 千兆网络或专线 | 满足银行文件交换与目录投递 |
@ -599,9 +539,11 @@ flowchart TB
| 类别 | 开通要求 | 说明 |
|---|---|---|
| 对外访问 | 开通 443 端口 | 提供统一 HTTPS 入口 |
| 公网入口薄转发访问内网 Nginx | 开通公网入口到内网 Nginx 的转发端口 | 仅授权链路访问 |
| 内网 Nginx 访问应用 | 开通内网 Nginx 到业务应用的 API / 网关端口 | 仅内网访问 |
| 应用访问综合节点 | 开通 Redis、Nacos、RustFS、PgBouncer 相关端口 | 仅应用区访问 |
| 公网入口薄转发访问 DMZ Nginx | 开通公网入口到 DMZ Nginx 的转发端口 | 仅授权链路访问 |
| 办公网访问 DMZ Nginx | 开通办公网到 DMZ Nginx 的内网访问端口 | 仅办公网访问 |
| 银行专线或授权外联链路访问 DMZ Nginx | 开通银行链路到 DMZ Nginx 的 HTTPS/API 端口 | 仅银行授权链路访问 |
| DMZ Nginx 访问应用 | 开通 DMZ Nginx 到业务应用的 API / 网关端口 | 仅 DMZ 内部访问 |
| 应用访问综合节点 | 开通 Redis、Nacos、RustFS9000/9001、PgBouncer 相关端口 | 仅 DMZ 业务应用节点访问 |
| 业务应用访问 SFTP/FTP 服务器 | 开通 SFTP/FTP 相关端口 | 用于银行文件送盘、回盘、对账交换 |
| 银行链路访问 SFTP/FTP 服务器 | 开通 FTP/SFTP 服务端口 | 仅银行授权链路访问 |
| 综合节点访问数据库 | 开通 PostgreSQL 5432 及健康检查相关端口 | 仅综合节点访问 |
@ -612,12 +554,14 @@ flowchart TB
| 源区域/源主机 | 目标区域/目标主机 | 协议/端口 | 用途 | 开通要求 |
|---|---|---|---|---|
| 外部用户 | 公网入口薄转发 | HTTPS/443 | 页面访问、接口入口 | 对外开放 |
| 公网入口薄转发 | 内网 Nginx 入口节点 | HTTP/HTTPS/转发端口 | 公网访问转入内网入口 | 授权链路放通 |
| 内网 Nginx 入口节点 | 业务应用节点(主) | HTTP/HTTPS/网关端口 | 内网 API 转发与微服务接入 | 内网放通 |
| 公网入口薄转发 | DMZ Nginx 入口节点 | HTTP/HTTPS/转发端口 | 公网访问转入 DMZ 入口 | 授权链路放通 |
| 办公网段 | DMZ Nginx 入口节点 | HTTP/HTTPS/内网访问端口 | 办公网用户访问系统入口 | 仅办公网放通 |
| 银行专线或授权外联链路 | DMZ Nginx 入口节点 | HTTPS/API 端口 | 银行系统访问 DMZ API 入口 | 仅授权链路放通 |
| DMZ Nginx 入口节点 | 业务应用节点(主) | HTTP/HTTPS/网关端口 | DMZ API 转发与微服务接入 | DMZ 内部放通 |
| 业务应用节点(主) | 综合节点 | TCP/6379 | Redis 访问 | 内网放通 |
| 业务应用节点(主) | 综合节点 | TCP/8848 | Nacos 访问 | 内网放通 |
| 业务应用节点(主) | 综合节点 | TCP/6432 | PgBouncer 访问 | 内网放通 |
| 业务应用节点(主) | 综合节点 | RustFS 对象存储端口 | RustFS 文件访问 | 内网放通 |
| 业务应用节点(主) | 综合节点 | TCP/9000、9001 | RustFS 文件访问与控制台访问 | 内网放通 |
| 业务应用节点(主) | SFTP/FTP 文件交换服务器 | TCP/21 或 22 | 银行送盘、回盘、对账文件交换 | 内网放通 |
| 银行专线或授权外联链路 | SFTP/FTP 文件交换服务器 | TCP/21 或 22 | 银行文件目录投递与回收 | 仅授权链路放通 |
| 综合节点 | PostgreSQL 主库服务器 | TCP/5432 | 数据库代理与控制访问 | 内网放通 |
@ -631,11 +575,11 @@ flowchart TB
| 服务 | 典型端口 | 访问范围 |
|---|---|---|
| Nginx/HTTPS | 443 | 对外开放 |
| Spring Boot Gateway / 业务应用端口 | 项目自定义端口 | 仅内网 Nginx 与内网调用 |
| Nginx/HTTPS | 443 | 对外开放、办公网授权访问及银行授权链路访问 |
| Spring Boot Gateway / 业务应用端口 | 项目自定义端口 | 仅 DMZ Nginx 与 DMZ/内网授权调用 |
| Redis | 6379 | 仅业务应用与运维可访问 |
| Nacos | 8848 | 仅业务应用与运维可访问 |
| RustFS | 按 RustFS 实际部署端口 | 仅业务应用与运维可访问 |
| RustFS | 9000S3 API、9001Console | 仅业务应用与运维可访问 |
| SFTP/FTP 服务 | 21 或 22 | 仅业务应用节点、运维和银行授权链路可访问 |
| PgBouncer | 6432 | 仅业务应用可访问 |
| HAProxy | 5000 或项目定义端口 | 仅 PgBouncer 与运维可访问 |
@ -645,7 +589,7 @@ flowchart TB
### 1. 基础资源准备
1. 确认内网 Nginx 入口节点、业务应用节点、综合节点是否为利旧资源。
1. 确认 `DMZ Nginx` 入口节点、业务应用节点、综合节点是否为利旧资源。
2. 完成 SFTP/FTP 文件交换服务器、PostgreSQL 主库服务器、热备服务器及备份归档存储审批。
3. 完成各网络分区、IP、域名、SSL 证书、路由及防火墙策略准备。
@ -653,7 +597,7 @@ flowchart TB
1. 安装操作系统并完成安全基线加固。
2. 在业务应用节点安装 JDK、部署业务运行环境。
3. 在内网 Nginx 入口节点安装 Nginx。
3. 在 `DMZ Nginx` 入口节点安装 Nginx。
4. 在综合节点安装 Redis、Nacos、RustFS、HAProxy、PgBouncer、Patroni。
5. 在 SFTP/FTP 文件交换服务器安装 SFTP/FTP 服务并配置目录结构。
6. 在数据库主备节点安装 PostgreSQL 16。
@ -669,7 +613,7 @@ flowchart TB
### 4. 应用与存储部署
1. 在业务应用节点部署 Spring Boot Gateway 和业务应用服务。
2. 在内网 Nginx 入口节点配置 API 转发和内部负载均衡规则。
2. 在 `DMZ Nginx` 入口节点配置 API 转发和内部负载均衡规则。
3. 在综合节点初始化 RustFS 存储桶和访问策略。
4. 在 SFTP/FTP 文件交换服务器配置送盘、回盘、对账、归档目录。
5. 配置业务应用到 Redis、Nacos、RustFS、PgBouncer 的连接参数。
@ -693,7 +637,7 @@ flowchart TB
| 验收项 | 验收标准 | 说明 |
|---|---|---|
| 对外访问 | 用户可通过统一域名正常访问系统 | 公网入口薄转发与内网 Nginx 链路正常 |
| 对外访问 | 用户可通过统一域名正常访问系统 | 公网入口薄转发与 DMZ Nginx 链路正常 |
| 业务应用可用性 | 表务、抄表、收费、账务、发票、报表等核心服务正常 | 业务主流程可执行 |
| Redis 可用性 | 缓存读写正常 | 中间件能力正常 |
| Nacos 可用性 | 配置下发正常 | 配置治理能力正常 |
@ -711,9 +655,9 @@ flowchart TB
本方案的最终结论如下:
1. 公网入口薄转发不纳入我方主机资源;我方实际部署的统一接入入口为内网 Nginx 入口节点。
2. 2 台业务应用节点作为核心业务集群,节点内同时部署 Spring Boot Gateway 和业务服务,承接微服务统一接入与核心业务处理。
3. 综合节点集中承载 Redis、Nacos、RustFS 及数据库控制组件,进一步压缩一期主机数量并降低部署复杂度。
1. 公网入口薄转发、边界路由和 `NAT` 不纳入我方主机资源;我方实际部署的统一接入入口为互联网区 `DMZ``Nginx` 入口节点。
2. 2 台业务应用节点部署在互联网区 `DMZ`,节点内同时部署 `Spring Boot Gateway` 和业务服务,承接微服务统一接入与核心业务处理。
3. 综合节点集中承载 `Redis``Nacos``RustFS` 及数据库控制组件,并部署在内网区,进一步压缩一期主机数量并降低部署复杂度。
## RustFS 产品介绍与选型说明
@ -725,6 +669,6 @@ RustFS 是一款支持私有化部署的 S3 兼容对象存储方案,可用于
2. RustFS 支持私有化部署,适合甲方对自主可控和本地化部署的要求。
3. RustFS 可作为独立对象存储组件部署在综合节点中,与缓存、配置治理和数据库控制能力协同运行。
4. 当前方案中,银行文件交换仍由独立的 SFTP/FTP 文件交换服务器承接RustFS 不承担银行送盘、回盘和对账文件交换职责。
4. 新增 1 台 SFTP/FTP 文件交换服务器,作为银行送盘、回盘、对账文件交换专用前置机。
5. PostgreSQL 16 采用同城双可用区 1 主 1 热备部署,满足高可用要求。
6. 网络采用公网接入区、内网接入区、应用区、中间件与文件存储区、银行文件交换区、数据区分层隔离模式,以满足安全性、可维护性和资源审批要求。
5. 新增 1 台 SFTP/FTP 文件交换服务器,作为银行送盘、回盘、对账文件交换专用前置机。
6. PostgreSQL 16 采用同城双可用区 1 主 1 热备部署,满足高可用要求。
7. 网络采用办公区、公网区域、互联网区 `DMZ`、内网区分层隔离模式,以满足安全性、可维护性和资源审批要求。

View File

@ -0,0 +1,162 @@
# REV004 账务调整统一标准层 — 第一批代码启动证据2026-04-15
## 本轮新增代码
### 标准层 helper
- `sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/accountingadjust/standard/AccountingAdjustSemanticMapper.java`
- `sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/accountingadjust/standard/AccountingAdjustDictResolver.java`
- `sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/accountingadjust/standard/AccountingAdjustStatusResolver.java`
### late-fee reduce formal-table 申请态/审批态基础
- `sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/dal/dataobject/latefeereduce/LateFeeReduceDO.java`
- `sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/dal/dataobject/latefeereducedetail/LateFeeReduceDetailDO.java`
- `sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/dal/mysql/latefeereduce/LateFeeReduceMapper.java`
- `sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/dal/mysql/latefeereducedetail/LateFeeReduceDetailMapper.java`
- `sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/accountingadjust/latefeereduce/LateFeeReduceFormalizationService.java`
### 已接入主链 / 读模型
- `AccountingAdjustProcessServiceImpl`
- `AccountingAdjustActionServiceImpl`
- `AccountingAdjustQueryServiceImpl`
- `AccountingAdjustLogProcessServiceImpl`
- `AccountingAdjustProcessRespVO`
- `AccountingAdjustDetailRespVO`
- `AccountingAdjustLogDetailRespVO`
- `AccountingAdjustPageRespVO`
- `AccountingAdjustLogPageRespVO`
### 对应测试
- `AccountingAdjustSemanticMapperTest`
- `AccountingAdjustDictResolverTest`
- `AccountingAdjustStatusResolverTest`
- `LateFeeReduceFormalizationServiceTest`
- `AccountingAdjustQueryServiceImplTest`
- `AccountingAdjustLogProcessServiceImplTest`
- `AccountingAdjustProcessServiceImplTest`(定向方法)
- `AccountingAdjustActionServiceImplTest`late-fee approval 定向方法)
## 本轮目标
1. 完成 Task-01 标准层 helper 最小实现
2. 将字典/状态 helper 接入 late-fee 相关读模型
3. 接入 late-fee reduce formal-table 申请态写入
4. 接入审批通过后 formal-table 最小更新闭环
5. 补 page / log-page 摘要字段试点
## 新鲜验证证据
### 1. 编译
执行:
```bash
rm -rf sw-business/sw-business-server/target/generated-sources \
sw-business/sw-business-server/target/generated-test-sources
mkdir -p sw-business/sw-business-server/target/generated-sources/annotations
mvn -pl sw-business/sw-business-server -DskipTests compile
```
结果:**PASS**
### 2. 定向测试
执行:
```bash
mvn -pl sw-business/sw-business-server \
-Dtest=AccountingAdjustQueryServiceImplTest,AccountingAdjustLogProcessServiceImplTest,AccountingAdjustProcessServiceImplTest#createUnsoldLateFeeReduce_shouldPassDateModeFieldsToUnifiedChargeService+createUnsoldLateFeeReduce_shouldRejectMixedAmountAndDateMode+batchCreateUnsoldLateFeeReduce_shouldMergeBatchOuterFieldsIntoItems+getProcess_shouldExposeLateFeeDisplayFieldsFromUnifiedSnapshot,AccountingAdjustActionServiceImplTest#approve_lateFeeReduceShouldOnlyUpdateLateFee,LateFeeReduceFormalizationServiceTest,AccountingAdjustSemanticMapperTest,AccountingAdjustDictResolverTest,AccountingAdjustStatusResolverTest \
test
```
结果:**PASS24 tests, 0 fail, 0 error**
## 当前结论
本轮已把第一批试点推进到:
- helper 已落地
- helper 已接入 late-fee 相关读模型
- late-fee formal-table 申请态写入已接入提交主链
- 审批通过后 formal-table 最小更新闭环已接入
- page / log-page 摘要字段试点已补
- compile 通过
- 定向测试通过
## 下一步
1. 继续推进 `lateFeeType=2` 按日期模式真正计算闭环
2. 补 formal-table 中 `before/reduce/after` 的更精确计算与状态更新
## 追加说明date-mode 精确计算规则)
### 当前实现口径
- 使用 `LateFeeDateModeCalculator`
- 所有未缴费用项参与计算
- 逐项通过 `ChargeDetailDO.costComponentCode -> CostComponentDO.penaltyCoefficient` 取系数
- `penaltyCoefficient = 0` 的费用项自然贡献 0
- 每项先四舍五入到分,最后汇总
- `lateFeeBefore` / `lateFeeAfter` 使用区间口径,而不是整账单总值口径
### 已覆盖边界测试
- 多费用项逐项计算并汇总
- 起算日晚于用户选择开始日时自动裁剪有效区间
- 0 系数费用项混合场景
- 计算结果大于当前 `lateFee` 时,`reduceAmount` 按当前 `lateFee` 封顶
- 截止日早于有效起算日时返回 0
## 2026-04-15 补充进展:真实库 canary 拉绿
### 本轮补充代码
- `sw-business/sw-business-server/src/test/resources/sql/rev004/accountprocess/00_reset.sql`
- `sw-business/sw-business-server/src/test/resources/sql/rev004/accountprocess/02_latefee_formal_tables.sql`
- `sw-business/sw-business-server/src/test/resources/sql/rev004/accountprocess/03_latefee_formal_reset.sql`
- `sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/accountingadjust/latefeereduce/LateFeeReduceFormalizationService.java`
- `sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/accountingadjust/AccountingAdjustQueryServiceImpl.java`
- `sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/charge/ChargeServiceImpl.java`
- `sw-business/sw-business-server/src/test/java/cn/com/emsoft/sw/business/integration/rev004/accountprocess/Rev004AccountProcessCanaryQueryIntegrationTest.java`
### 修复点
1. **真实库 SQL fixture 兼容性**
- 去掉 `00_reset.sql` 中会被 Spring `ScriptUtils` 误切分的 `DO $$ ... $$`
- 新增 `03_latefee_formal_reset.sql`,把 late-fee formal table 的清理独立出来
- `02_latefee_formal_tables.sql` 改为无 `DO $$` 的约束重建方式
2. **formal-table 查询兜底**
- 当 `AccountingAdjustQueryServiceImpl` 无法仅从 `biz_operat_log(_detail)` 聚合出 `LATE_FEE_REDUCE` 详情时,
改为继续从:
- `biz_latefee_reduce`
- `biz_latefee_reduce_detail`
回退构造详情对象
3. **request log 的 adjustmentNo 明细一致性**
- `ChargeServiceImpl#recordAccountingAdjustOperatLog(...)` 中,
`adjustmentNo` 改为以 `oldValue = null, newValue = adjustmentNo` 记入日志明细,
避免被“旧值=新值则跳过”逻辑误过滤
### 新鲜验证
#### 定向编译
```bash
mvn -pl sw-business/sw-business-server -DskipTests compile
```
结果:**PASS**
#### 定向单测
```bash
mvn -pl sw-business/sw-business-server \
-Dtest=AccountingAdjustQueryServiceImplTest,LateFeeReduceFormalizationServiceTest,AccountingAdjustActionServiceImplTest#approve_lateFeeReduceDateModeShouldReduceCurrentLateFeeAndUpdateFormalTable \
test
```
结果:**PASS8 tests, 0 fail, 0 error**
#### 真实数据库 canary
```bash
REV004_IT_DB_URL=jdbc:postgresql://192.168.10.130:5436/sw_system \
REV004_IT_DB_USERNAME=sw_system \
REV004_IT_DB_PASSWORD='Em@123456' \
mvn -pl sw-business/sw-business-server clean \
-Dtest=Rev004AccountProcessCanaryQueryIntegrationTest#unsoldLateFeeReduceDateModeApprove_shouldPersistFormalTableSummary \
test
```
结果:**PASS**
### canary 覆盖到的链路
- 未销违约金减免(按日期)提交
- request log 写入 `adjustmentNo`
- `biz_latefee_reduce` / `biz_latefee_reduce_detail` 申请态落单
- 审批通过
- formal table 主表 / 明细表更新为成功态
### 当前结论更新
REV004 late-fee date-mode 这条最小闭环已从:
- **代码与单测通过**
推进到:
- **真实库 canary 通过**
当前剩余风险已不再是“缺表阻塞”,而是后续是否要把更多对象(坏账 / 核销 / 价差)也迁移到 formal-table 路线。

View File

@ -0,0 +1,171 @@
# REV004 自动化回归脚本 + legacy fallback 缩减2026-04-17
## 本轮目标
1. 为 REV004 建立可重复执行的自动化回归脚本入口。
2. 继续缩小 accountProcess 对 legacy fallback 的直接依赖面。
## 后端代码变更
### 1. 新增回归脚本目录
后端新增:`script/rev004-regression/`
- `env.sh`
- `01_prepare_env.sh`
- `02_unit_regression.sh`
- `03_live_db_smoke.sh`
- `04_summary.sh`
- `run_all.sh`
说明:
- unit 回归默认覆盖:`AccountingAdjustQueryServiceImplTest``AccountingAdjustProcessServiceImplTest``AccountingAdjustActionServiceImplTest``ChargeServiceAccountingAdjustTest``PrestorageFormalizationServiceTest`
- live DB smoke 默认覆盖:
- `Rev004AccountProcessLiveDbReadinessTest`
- `Rev004AccountProcessCanaryQueryIntegrationTest`
- `prestoragePage_shouldReturnSuccessEnvelope`
- `prestorageSubmit_shouldChangeBalanceAndWriteOperatLog`
- `prestorageRevoke_shouldRestoreBalanceAndWriteRevokeLog`
- `prestorageSubmit_thenProcessAndAttachmentsShouldExposeReturnedAdjustmentNo`
### 2. 缩减 legacy fallback 使用面
#### `AccountingAdjustProcessServiceImpl`
- `getProcess(...)`:调整为
- prestorage formal 优先
- unified snapshot 次优先
- synthetic snapshot 仅在 unified 缺失时兜底
- `getAttachments(...)`:调整为
- prestorage formal 优先
- unified snapshot 次优先
- synthetic snapshot 仅在 unified 缺失时兜底
#### `AccountingAdjustQueryServiceImpl`
- page 聚合时,先汇总 formal adjustmentNo 集合
- legacy request log 转换出的 request record 若 adjustmentNo 已被 formal 记录覆盖,则不再进入 merged 集合
- 保留 legacy log 的审计/兜底职责,但不再重复参与 formal 已覆盖对象的主结果聚合
## 新增/更新测试
### 单测补强
- `AccountingAdjustProcessServiceImplTest`
- `getProcess_shouldPreferUnifiedSnapshotOverSyntheticFallback`
- `getAttachments_shouldPreferUnifiedSnapshotOverSyntheticFallback`
- `AccountingAdjustQueryServiceImplTest`
- `getAccountingAdjustPage_shouldSkipLegacyRequestRecordWhenFormalRecordExists`
## 验证结果
### 1. unit 回归
执行:
```bash
script/rev004-regression/02_unit_regression.sh
```
结果:
- `Tests run: 68, Failures: 0, Errors: 0, Skipped: 0`
- `BUILD SUCCESS`
### 2. live DB smoke
执行:
```bash
script/rev004-regression/03_live_db_smoke.sh
```
结果:
- `Tests run: 5, Failures: 0, Errors: 0, Skipped: 0`
- `BUILD SUCCESS`
### 3. 一键入口
执行:
```bash
script/rev004-regression/run_all.sh
```
结果:
- unit + live DB smoke 均通过
- 日志目录:
- `.omx/logs/rev004-regression/20260417T110151Z`
## 当前边界
- 当前 live DB smoke 默认仍以 prestorage 稳定链路为主,用来验证真实数据库 + Spring + MockMvc + formal/legacy 协同路径。
- writtenoff / price diff / redink / bad debt 在本轮主要由 targeted unit regression 覆盖;后续可继续补到 live DB fixture。
- `Rev004AccountProcessCanaryQueryIntegrationTest` 中仍有其它更大范围场景未纳入默认 smoke 入口,本轮没有把它们全部收进默认脚本,以避免把未收敛场景误当作回归主入口。
## 结论
本轮已完成:
- REV004 自动化回归脚本首版落地
- 一键执行入口可用
- process / attachments 的 legacy fallback 优先级继续收口
- page 聚合中的 duplicate legacy request 参与面继续缩小
## 追加收口(继续删 fallback
### Query 层进一步收口
- `AccountingAdjustQueryServiceImpl#getAccountingAdjustPage(...)`
- `loadLatestActionMap(...)` 改为只对 legacy request records 构建 action overlay
- formal 记录即使 chargeId 下存在 legacy approval log也不再被 legacy 审批轨迹回填覆盖主状态
### 新增回归测试
- `getAccountingAdjustPage_shouldNotLetLegacyApprovalOverrideFormalRecord`
- 验证formal 已存在时legacy approval log 不再覆盖 formal 的 `approvalStatus/resultStatus/writeBackStatus/message/actionAmount`
### 本次追加验证
执行:
```bash
mvn -pl sw-business/sw-business-server -Dtest=AccountingAdjustQueryServiceImplTest,AccountingAdjustProcessServiceImplTest test
```
结果:
- `Tests run: 32, Failures: 0, Errors: 0, Skipped: 0`
- `BUILD SUCCESS`
### 统计口径锁定
新增测试:
- `getAccountingAdjustStat_shouldIgnoreLegacyApprovalForFormalRecord`
验证:
- formal record 已存在时legacy approval/action 不再把统计口径从 `PENDING_APPROVAL` 误改成 `APPROVED`
- `totalActionAmount` 仍取 formal 金额
执行:
```bash
mvn -pl sw-business/sw-business-server -Dtest=AccountingAdjustQueryServiceImplTest test
```
结果:
- `Tests run: 13, Failures: 0, Errors: 0, Skipped: 0`
- `BUILD SUCCESS`
再次执行:
```bash
script/rev004-regression/run_all.sh
```
结果:
- unit`Tests run: 69, Failures: 0, Errors: 0, Skipped: 0`
- live smoke`Tests run: 5, Failures: 0, Errors: 0, Skipped: 0`
- `BUILD SUCCESS`
### 日志查询口径锁定
新增测试:
- `getAccountingAdjustLogs_shouldReturnSyntheticFormalLogWhenLegacyLogsMissing`
验证:
- formal 对象即使没有 legacy operat_log也能通过 `getAccountingAdjustLogs` 返回一条 synthetic formal log
- 前端日志页不再被 legacy log 是否存在所卡死
执行:
```bash
mvn -pl sw-business/sw-business-server -Dtest=AccountingAdjustQueryServiceImplTest test
```
结果:
- `Tests run: 14, Failures: 0, Errors: 0, Skipped: 0`
- `BUILD SUCCESS`
### action-only 日志补齐
新增测试:
- `getAccountingAdjustLogs_shouldPrependSyntheticFormalLogWhenOnlyActionLogExists`
验证:
- formal 对象若只有 legacy action log、没有 legacy request log
- 日志列表会自动在前面补一条 synthetic formal log再保留 legacy action log
- 前端日志时间线可同时看到 formal 主记录和 legacy 审批动作
执行:
```bash
mvn -pl sw-business/sw-business-server -Dtest=AccountingAdjustQueryServiceImplTest test
```
结果:
- `Tests run: 15, Failures: 0, Errors: 0, Skipped: 0`
- `BUILD SUCCESS`

View File

@ -0,0 +1,109 @@
# REV004 bad-debt formal-table 已应用到 application-dev 测试库2026-04-17
## 目标库
依据:
- `sw-business/sw-business-server/src/main/resources/application-dev.yaml`
解析结果:
- Host`192.168.10.130`
- Port`5436`
- DB`sw_system`
- User`sw_system`
## 已执行脚本
- `sql/rev004/REV004_bad_debt_formal_tables_deploy.sql`
## DDL 执行结果
结果:**PASS**
已确认存在:
- `biz_bad_debt_adjust`
- `biz_bad_debt_adjust_detail`
- `biz_bad_debt_adjust_seq`
- `biz_bad_debt_adjust_detail_seq`
已确认幂等重放通过:
- second apply 输出 `already exists, skipping`
- 无重复约束/重复索引异常
## 代码验证
### compile
```bash
mvn -pl sw-business/sw-business-server -DskipTests compile
```
结果:**PASS**
### targeted tests
```bash
mvn -pl sw-business/sw-business-server \
-Dtest=ChargeServiceAccountingAdjustTest,AccountingAdjustActionServiceImplTest,AccountingAdjustProcessServiceImplTest,AccountingAdjustQueryServiceImplTest,BadDebtFormalizationServiceTest test
```
结果:**PASS**
- Tests run: 55
- Failures: 0
- Errors: 0
## HTTP smokefresh jar, port 48092
### submit
- `unsold-bad-debt-submit` on charge `991005``REV004-991005-20260417121621`
- `unsold-bad-debt-submit` on charge `991006``REV004-991006-20260417121622`
- 返回统一为:
- `objectType = BAD_DEBT_RECORD`
- `approvalStatus = PENDING_APPROVAL`
- `resultStatus = PENDING_APPROVAL`
- `writeBackStatus = PENDING`
### DB 回读
`biz_bad_debt_adjust`
- approve 样例:`APPROVED|UPDATED|SUCCESS|approve smoke`
- reject 样例:`REJECTED|SKIPPED|FAIL|reject smoke`
`biz_bad_debt_adjust_detail`
- submit 后 detail 进入 `PENDING_APPROVAL`
- 审批通过后 detail 进入 `SUCCESS`
- 审批驳回后 detail 进入 `REJECTED`
### query
- `GET /admin-api/business/accounting-adjust/get?adjustmentNo=...` 对 bad debt 已返回 formal detail
- `GET /admin-api/business/accounting-adjust/page?...objectType=BAD_DEBT_RECORD` 已返回 formal-first 列表
- `GET /admin-api/business/accounting-adjust/logs?adjustmentNo=...` 仍通过 legacy operat_log 返回完整轨迹
### approve / reject
- approve`/admin-api/business/accounting-adjust/approve`
- 返回 `APPROVED/SUCCESS/UPDATED`
- 账单 `pay_state` 被回写为 `UNCOLLECTIBLE(-2)`
- reject`/admin-api/business/accounting-adjust/reject`
- 返回 `REJECTED/FAIL/SKIPPED`
- 账单状态保持原值,不执行坏账回写
## 当前结论
本轮坏账 formal-table 已达到:
1. DDL 可落库且可幂等重放;
2. submit pending formal record 可落表;
3. approve/reject 会同步 formal main/detail 状态;
4. detail/page 对 `BAD_DEBT_RECORD` 已能返回 formal-first 结果;
5. 日志链路继续保留兼容查询。
## 当前未完成
- `AccountingAdjustQueryServiceImpl` 目前对坏账 formal-first 仅覆盖 detail/page 主路径,后续仍可继续补 stats/更细颗粒 read-model 一致性;
- 本轮 smoke 数据尚未清理,需要在最终收口时删除临时 `991005/991006` 相关客户、账单、formal 记录与日志。
## 测试数据清理
HTTP smoke 完成后,已删除临时 bad-debt smoke 数据:
- `biz_operat_log / detail`identify_value = `991005`, `991006`
- `biz_bad_debt_adjust / detail`
- `biz_charge``991005`, `991006`
- `biz_cust``REV004_BD_SMOKE_A`, `REV004_BD_SMOKE_B`
回读结果:
- `baddebt_main_left=0`
- `operat_log_left=0`
- `charge_left=0`
- `cust_left=0`
## 运行态清理
用于 fresh-jar HTTP smoke 的临时实例:
- port `48092`
已停止,当前无残留 LISTEN 进程。

View File

@ -0,0 +1,87 @@
# REV004 late-fee formal-table 真实库阻塞说明2026-04-15
> 状态更新:**该阻塞已于 2026-04-15 当天解除,本文保留为阻塞发生记录。**
## 结论
当前 late-fee reduce 代码侧与定向单测已通过,但真实数据库集成验证被环境缺表阻塞,阻塞点不是代码逻辑,而是目标库未部署 formal-table。
## 已通过的验证
### 编译
```bash
rm -rf sw-business/sw-business-server/target/generated-sources \
sw-business/sw-business-server/target/generated-test-sources
mkdir -p sw-business/sw-business-server/target/generated-sources/annotations
mvn -pl sw-business/sw-business-server -DskipTests compile
```
结果:**PASS**
### 定向测试
```bash
mvn -pl sw-business/sw-business-server \
-Dtest=AccountingAdjustActionServiceImplTest#approve_lateFeeReduceShouldOnlyUpdateLateFee+approve_lateFeeReduceDateModeShouldReduceCurrentLateFeeAndUpdateFormalTable,LateFeeReduceFormalizationServiceTest,AccountingAdjustQueryServiceImplTest,AccountingAdjustLogProcessServiceImplTest,AccountingAdjustProcessServiceImplTest#createUnsoldLateFeeReduce_shouldPassDateModeFieldsToUnifiedChargeService+createUnsoldLateFeeReduce_shouldRejectMixedAmountAndDateMode+batchCreateUnsoldLateFeeReduce_shouldMergeBatchOuterFieldsIntoItems+getProcess_shouldExposeLateFeeDisplayFieldsFromUnifiedChargeService,AccountingAdjustSemanticMapperTest,AccountingAdjustDictResolverTest,AccountingAdjustStatusResolverTest \
test
```
结果:**PASS24 tests, 0 fail, 0 error**
## 真实 DB 阻塞验证
### 执行命令
```bash
REV004_IT_DB_URL=jdbc:postgresql://192.168.10.130:5436/sw_system \
REV004_IT_DB_USERNAME=sw_system \
REV004_IT_DB_PASSWORD='Em@123456' \
mvn -pl sw-business/sw-business-server \
-Dtest=Rev004AccountProcessCanaryQueryIntegrationTest#unsoldLateFeeReduceDateModeApprove_shouldPersistFormalTableSummary \
test
```
### 失败原因
报错核心:
- `relation "biz_latefee_reduce_detail" does not exist`
在测试前置 / 后置 SQL `sql/rev004/accountprocess/00_reset.sql` 中,已经尝试执行:
- `DELETE FROM biz_latefee_reduce_detail ...`
- `DELETE FROM biz_latefee_reduce ...`
这说明:
- 代码侧已经按 formal-table 路径推进
- 测试脚本也已经按 formal-table 假设编写
- 但真实库中尚未存在这些表
## 当前判断
1. 代码逻辑不是当前 blocker。
2. 真实 DB 环境未部署 `biz_latefee_reduce` / `biz_latefee_reduce_detail` 是当前 canary 唯一主要阻塞。
3. 在部署 formal-table 之前,真实库层面的 late-fee canary 无法拉绿。
## 建议下一步
1. 先确认真实库是否允许部署:
- `biz_latefee_reduce`
- `biz_latefee_reduce_detail`
2. 若允许部署,再重跑 canary。
3. 若暂不允许部署,则当前阶段只能以 compile + unit/integration mock/local 证据为主,明确标注“真实库阻塞未消除”。
---
## 后续结果回写(阻塞已解除)
### 已完成动作
1. 补充并执行 `sql/rev004/REV004_latefee_formal_tables_deploy.sql`
2. 修复测试 SQL fixture
- `00_reset.sql`
- `02_latefee_formal_tables.sql`
- `03_latefee_formal_reset.sql`
3. 补充 late-fee formal-table 查询兜底与 request log `adjustmentNo` 明细一致性
### 解除阻塞后的真实库验证
```bash
REV004_IT_DB_URL=jdbc:postgresql://192.168.10.130:5436/sw_system \
REV004_IT_DB_USERNAME=sw_system \
REV004_IT_DB_PASSWORD='Em@123456' \
mvn -pl sw-business/sw-business-server clean \
-Dtest=Rev004AccountProcessCanaryQueryIntegrationTest#unsoldLateFeeReduceDateModeApprove_shouldPersistFormalTableSummary \
test
```
结果:**PASS**
### 更新后的结论
- `biz_latefee_reduce` / `biz_latefee_reduce_detail` 缺表阻塞已消除
- REV004 late-fee date-mode 最小真实库闭环已验证通过
- 本文档现仅作为“阻塞曾发生过”的历史记录,不再代表当前状态

View File

@ -0,0 +1,73 @@
# REV004 late-fee formal table 已应用到 application-dev 测试库2026-04-15
## 目标库
依据:
- `sw-business/sw-business-server/src/main/resources/application-dev.yaml`
解析结果:
- Host`192.168.10.130`
- Port`5436`
- DB`sw_system`
- User`sw_system`
即当前 `application-dev` 指向的测试数据库为:
`jdbc:postgresql://192.168.10.130:5436/sw_system`
## 已执行脚本
- `sql/rev004/REV004_latefee_formal_tables_deploy.sql`
执行命令:
```bash
PGPASSWORD='Em@123456' \
psql -h 192.168.10.130 -p 5436 -U sw_system -d sw_system \
-v ON_ERROR_STOP=1 \
-f sql/rev004/REV004_latefee_formal_tables_deploy.sql
```
## 执行结果
结果:**PASS**
执行输出显示:
- sequence 已存在时跳过
- table 已存在时跳过
- 索引继续补齐/确认
- 外键创建逻辑执行成功
说明该脚本已成功应用到测试库,且具备幂等重放能力。
## 回读校验
### 表
已确认存在:
- `biz_latefee_reduce`
- `biz_latefee_reduce_detail`
### 序列
已确认存在:
- `biz_latefee_reduce_seq`
- `biz_latefee_reduce_detail_seq`
### 索引
已确认存在:
- `uk_biz_latefee_reduce_no`
- `idx_biz_latefee_reduce_case`
- `idx_biz_latefee_reduce_status`
- `idx_biz_latefee_reduce_type`
- `idx_biz_latefee_reduce_detail_main`
- `idx_biz_latefee_reduce_detail_charge`
- `idx_biz_latefee_reduce_detail_cust`
- `idx_biz_latefee_reduce_detail_bill_month`
### 外键
已确认存在:
- `fk_biz_latefee_reduce_detail_main`
- `biz_latefee_reduce_detail(latefee_reduce_id) -> biz_latefee_reduce(id)`
## 当前结论
`application-dev` 指向的测试数据库现在已经具备 REV004 late-fee formal-table 结构,可直接用于:
1. 未销违约金减免申请态落单
2. 审批态 formal-table 更新
3. accountProcess 真实库 canary / 联调验证
## 建议后续
1. 继续保留 `REV004_latefee_formal_tables_deploy.sql` 作为测试库 / 联调库初始化脚本
2. 若后续坏账 / 核销 / 价差也迁移 formal-table应沿用相同“独立 deploy SQL + 回读校验”的方式推进

View File

@ -0,0 +1,237 @@
# REV004 prestorage formal-table 已应用到 application-dev 测试库2026-04-16
## 目标库
依据:
- `sw-business/sw-business-server/src/main/resources/application-dev.yaml`
解析结果:
- Host`192.168.10.130`
- Port`5436`
- DB`sw_system`
- User`sw_system`
即当前 `application-dev` 指向的测试数据库为:
`jdbc:postgresql://192.168.10.130:5436/sw_system`
## 已执行脚本
- `sql/rev004/REV004_prestorage_formal_tables_deploy.sql`
执行命令:
```bash
PGPASSWORD='Em@123456' \
psql -h 192.168.10.130 -p 5436 -U sw_system -d sw_system \
-v ON_ERROR_STOP=1 \
-f sql/rev004/REV004_prestorage_formal_tables_deploy.sql
```
## 执行结果
结果:**PASS**
执行输出显示:
- `biz_prestorage_adjust_seq` 创建成功
- `biz_prestorage_adjust_detail_seq` 创建成功
- `biz_prestorage_adjust` 创建成功
- `biz_prestorage_adjust_detail` 创建成功
- 主表索引、明细表索引创建成功
- 外键 `fk_biz_prestorage_adjust_detail_main` 创建成功
## 回读校验
### 表
已确认存在:
- `biz_prestorage_adjust`
- `biz_prestorage_adjust_detail`
### 序列
已确认存在:
- `biz_prestorage_adjust_seq`
- `biz_prestorage_adjust_detail_seq`
### 关键索引
已确认存在:
- `uk_biz_prestorage_adjust_no`
- `idx_biz_prestorage_adjust_source`
- `idx_biz_prestorage_adjust_target`
- `idx_biz_prestorage_adjust_type`
- `idx_biz_prestorage_adjust_status`
- `idx_biz_prestorage_adjust_executed_at`
- `idx_biz_prestorage_adjust_detail_main`
- `idx_biz_prestorage_adjust_detail_type`
- `idx_biz_prestorage_adjust_detail_charge`
- `idx_biz_prestorage_adjust_detail_bill_month`
### 外键
已确认存在:
- `fk_biz_prestorage_adjust_detail_main`
- `biz_prestorage_adjust_detail(prestorage_adjust_id) -> biz_prestorage_adjust(id)`
## Smoke 验证
### 1. 代码层最小验证
执行:
```bash
mvn -pl sw-business/sw-business-server -DskipTests compile
mvn -pl sw-business/sw-business-server -Dtest=AccountingAdjustProcessServiceImplTest,AccountingAdjustPrestorageProcessServiceImplTest test
```
结果:**PASS**
说明:
- prestorage submit / revoke 接线后的 Java 编译通过
- `AccountingAdjustProcessServiceImplTest` 通过13/13
- `AccountingAdjustPrestorageProcessServiceImplTest` 通过4/4
- 合计目标测试:`17/17` 通过
### 2. 数据库 transactional smoke
执行:在测试库开启事务后,插入一笔 `biz_prestorage_adjust` 主表记录 + 一笔 `biz_prestorage_adjust_detail` 明细记录,随后回读计数,再 `ROLLBACK`
验证点:
- 主表可写
- 明细表可写
- 外键约束正常
- 回读可见
- 回滚后不污染测试库
实际结果:
- `main_count=1`
- `detail_count=1`
- 回滚后再次检查 `adjustment_no='SMOKE-REV004-PRE-001'` 计数为 `0`
结果:**PASS**
## 当前结论
`application-dev` 指向的测试数据库现在已经具备 REV004 prestorage formal-table 结构,可直接用于:
1. 预存退款 / 预存转账 formal-table 双写
2. prestorage page/detail/stat formal-table 优先投影联调
3. 后续真实接口 smoke / canary 验证
## 真实 HTTP smoke补充于 2026-04-16 18:00 +08:00
为了避免命中本地旧 jar 进程,额外完成了以下动作:
1. 使用最新代码重新执行 `mvn -pl sw-business/sw-business-server -DskipTests package`
2. 以 `java -jar ... --server.port=48091` 启动一份隔离的新实例
3. 通过 `login-user` 头模拟管理员上下文,直连 `/admin-api/business/accounting-adjust/*` 接口做 smoke
### smoke 前置数据
向测试库临时插入:
- 源客户:`REV004_PRE_SMOKE_SRC`
- 目标客户:`REV004_PRE_SMOKE_TGT`
- 源账户余额:`100.00`
- 目标账户余额:`5.00`
### 1. prestorage-submitrefund
请求成功,返回:
- `adjustmentNo = REV004-PRF-990001-20260416180029`
- `resultStatus = SUCCESS`
DB 回读确认:
- `biz_prestorage_adjust` 新增 1 条 `REFUND`
- `biz_prestorage_adjust_detail` 新增 1 条 `REFUND_RESULT`
- 源账户余额由 `100.00 -> 90.00`
### 2. prestorage-submittransfer
请求成功,返回:
- `adjustmentNo = REV004-PTR-990001-20260416180029`
- `resultStatus = SUCCESS`
DB 回读确认:
- `biz_prestorage_adjust` 新增 1 条 `TRANSFER`
- `biz_prestorage_adjust_detail` 新增 2 条:
- `SOURCE_ACCOUNT`
- `TARGET_ACCOUNT`
- 源账户余额由 `90.00 -> 70.00`
- 目标账户余额由 `5.00 -> 25.00`
### 3. prestorage-page / prestorage-detail
在 48091 新实例上验证:
- `prestorage-page` 返回 2 条 smoke 数据
- `prestorage-detail?id=3` 可正常返回 transfer formal 详情
- transfer 记录状态为:
- `workOrderStatus = 2`
- `resultStatus = SUCCESS`
- `writeBackStatus = UPDATED`
### 4. prestorage-process / prestorage-attachments
在 48091 新实例上验证:
- `prestorage-process?adjustmentNo=REV004-PTR-990001-20260416180029` 返回成功
- `prestorage-attachments?...` 返回空数组 `[]`
说明:
- 当前 `process/attachments` 仍主要经 unified/legacy 查询口径返回,但因为 submit 继续写 `operat_log`,链路可正常工作
- 这两条在本轮已不构成阻塞性故障
### 5. prestorage-revoke
调用:
- `prestorage-revoke adjustmentNo=REV004-PTR-990001-20260416180029`
返回:
- `message = 预存转账撤销成功`
- `resultStatus = SUCCESS`
DB 回读确认:
- `biz_prestorage_adjust` 中该 transfer 主记录状态变为:
- `result_status = REVOKED`
- `execute_status = REVOKED`
- 对应 detail 状态均变为:
- `detail_status = REVOKED`
- `proc_type = REVOKE`
- 账户余额恢复为:
- 源账户 `90.00`
- 目标账户 `5.00`
- `prestorage-page` 再查可见该 transfer 记录:
- `workOrderStatus = 3`
- `canRevoke = false`
## 测试数据清理
为避免污染测试库smoke 完成后已执行清理:
- 删除临时 `biz_operat_log / detail`
- 删除临时 `biz_prestorage_adjust / detail`
- 删除临时 `biz_account`
- 删除临时 `biz_cust`
回读结果:
- `formal_main_left = 0`
- `operat_log_left = 0`
- `cust_left = 0`
## 当前仍未完全覆盖的点
1. 本轮已经证明 HTTP submit/query/revoke 主链路可工作;
2. 但 `prestorage-process / prestorage-attachments` 目前仍不是 strict formal-first而是依赖 unified/legacy 口径兜底;
3. 如果后续目标是“彻底以 formal-table 为唯一真值”,还需要继续收口这两条查询路径。
## 建议后续
1. backend PR 可以先按 prestorage formal-table 独立批次提交;
2. PR 描述中明确:
- `process/attachments` 当前可用,但仍保留 legacy/unified 查询兜底;
- 后续可再开一批做 strict formal-first 收口;
3. 保留 `REV004_prestorage_formal_tables_deploy.sql` 作为测试库 / 联调库初始化脚本。
## 补充复核2026-04-16 17:36 +08:00
### 1. 部署脚本幂等重放
再次执行:
```bash
PGPASSWORD='Em@123456' psql -h 192.168.10.130 -p 5436 -U sw_system -d sw_system -v ON_ERROR_STOP=1 -f sql/rev004/REV004_prestorage_formal_tables_deploy.sql
```
结果:**PASS**
关键输出:
- existing sequence/table/index 均以 `already exists, skipping` 形式跳过
- 没有出现失败或约束重复异常
说明:
- `REV004_prestorage_formal_tables_deploy.sql` 具备测试库重放幂等性
- 适合作为联调库/测试库初始化脚本继续使用
### 2. 本地服务存活验证
执行:
```bash
curl -sS http://127.0.0.1:48090/actuator/health
```
返回:
```json
{"status":"UP"}
```
说明:
- 当前本地 `sw-business-server` 进程存活
- 后续若补真实 HTTP 接口 smoke可直接基于该运行实例继续

View File

@ -0,0 +1,94 @@
# REV004 prestorage process/attachments strict formal-first2026-04-17
## 目标
收口:
- `GET /admin-api/business/accounting-adjust/prestorage-process`
- `GET /admin-api/business/accounting-adjust/prestorage-attachments`
使其优先读取 prestorage formal-table而不是继续主要依赖 legacy/unified fallback。
## 代码变更
核心变更位于:
- `AccountingAdjustProcessServiceImpl`
- `AccountingAdjustProcessServiceImplTest`
策略:
1. `getProcess(adjustmentNo)` 先尝试 `PrestorageFormalizationService.getView(adjustmentNo)`
2. 命中 formal view 时,直接组装 `AccountingAdjustProcessRespVO`
3. `getAttachments(adjustmentNo)` 先尝试读取 formal `attachmentRefs`
4. 仅在 formal 不存在时才回退到 synthetic / unified 口径
## 验证
### compile
```bash
mvn -pl sw-business/sw-business-server -DskipTests compile
```
结果:**PASS**
### targeted tests
```bash
mvn -pl sw-business/sw-business-server -Dtest=AccountingAdjustProcessServiceImplTest,AccountingAdjustPrestorageProcessServiceImplTest test
```
结果:**PASS**
- Tests run: 23
- Failures: 0
- Errors: 0
## fresh jar smokeport 48098
### health
- `GET /actuator/health` -> `{"status":"UP"}`
### smoke 数据
手工 seed
- `adjustmentNo = REV004-PTR-993001-SEED`
- formal main`biz_prestorage_adjust`
- formal detail`biz_prestorage_adjust_detail`
- attachment refs`101,proof-raw`
### process
调用:
- `GET /admin-api/business/accounting-adjust/prestorage-process?adjustmentNo=REV004-PTR-993001-SEED`
结果:**PASS**
返回关键字段:
- `objectType = LEGACY_PRESTORAGE_TRANSFER`
- `adjustType = TRANSFER`
- `actionAmount = 20.0`
- `resultStatus = SUCCESS`
- `approvalStatus = NOT_REQUIRED`
- `writeBackStatus = UPDATED`
- `attachmentRefs = ["101", "proof-raw"]`
- `applicant = 王五`
- `contactMobile = 13700000000`
- `latestMessage = 预存转账成功,目标户号=C-993002`
说明process 已命中 formal main而不是再走 unified detail 兜底。
### attachments
调用:
- `GET /admin-api/business/accounting-adjust/prestorage-attachments?adjustmentNo=REV004-PTR-993001-SEED`
结果:**PASS**
返回:
- ref=`101` -> 数值 ID 解析,当前附件实体不存在,返回 `resolved=false, message=附件不存在`
- ref=`proof-raw` -> 非数值引用,返回 `resolved=false, message=附件引用不是数值ID保留原始引用`
说明attachments 已优先读取 formal `attachmentRefs`,并保留现有解析策略。
## 清理
已删除:
- `biz_prestorage_adjust / detail` seed 数据
回读结果:
- `prestorage_main_left=0`
- `prestorage_detail_left=0`
运行态:
- `48098` 已停止
## 当前结论
本轮 prestorage 剩余查询缺口已完成 strict formal-first 收口:
1. `prestorage-process` 优先命中 formal
2. `prestorage-attachments` 优先命中 formal attachment refs
3. formal 缺失时仍可继续 fallback
4. 主链路 schema / 写路径无变更

View File

@ -0,0 +1,135 @@
# REV004 price-diff formal-table 已应用到 application-dev 测试库2026-04-17
## 目标库
依据:
- `sw-business/sw-business-server/src/main/resources/application-dev.yaml`
解析结果:
- Host`192.168.10.130`
- Port`5436`
- DB`sw_system`
- User`sw_system`
## 已执行脚本
- `sql/rev004/REV004_price_diff_formal_tables_deploy.sql`
## DDL 执行结果
结果:**PASS**
已确认存在:
- `biz_price_diff_adjust`
- `biz_price_diff_adjust_detail`
- `biz_price_diff_adjust_seq`
- `biz_price_diff_adjust_detail_seq`
已确认幂等重放通过:
- second apply 输出 `already exists, skipping`
- 无重复约束/重复索引异常
## 代码验证
### compile
```bash
mvn -pl sw-business/sw-business-server -DskipTests compile
```
结果:**PASS**
说明:
- 先顺手修复 develop 基线 compile blocker
- `CustApiImpl.java` 去掉 `updateCustPriceTemplateCode` 上多余 `@Override`
- `CustServiceImpl.java` 去掉 `dept.getCode()` 调用
- 之后串行重跑 compile 成功
- 曾出现一次 `NoSuchFileException ... target/generated-sources/...`,确认为 compile 与 test 并行访问同一 `target/` 目录导致的竞态,不属于业务代码错误
### targeted tests
```bash
mvn -pl sw-business/sw-business-server -Dtest=AccountingAdjustActionServiceImplTest,AccountingAdjustProcessServiceImplTest,AccountingAdjustQueryServiceImplTest,PriceDiffFormalizationServiceTest test
```
结果:**PASS**
- Tests run: 43
- Failures: 0
- Errors: 0
## HTTP smokefresh jar, port 48095
### health
- `GET /actuator/health` -> `{"status":"UP"}`
### submit
- `unsold-price-diff-submit` on charge `992205` -> `REV004-992205-20260417153413`
- `unsold-price-diff-submit` on charge `992206` -> `REV004-992206-20260417153414`
- 返回统一为:
- `objectType = PRICE_DIFF_ADJUST`
- `approvalStatus = PENDING_APPROVAL`
- `resultStatus = PENDING_APPROVAL`
- `writeBackStatus = PENDING`
### get / page
- `GET /admin-api/business/accounting-adjust/get?adjustmentNo=REV004-992205-20260417153413`
- 可返回 formal detail
- `priceDiffAmount=15.50`
- `billAmountBefore=100.00`
- `billAmountAfter=115.50`
- `extendedAmountBefore=100.00`
- `extendedAmountAfter=115.50`
- `GET /admin-api/business/accounting-adjust/page?...objectType=PRICE_DIFF_ADJUST`
- 可返回 2 条 fresh smoke formal-first 记录
- `reasonCodeLabel` 已能解析为字典文本(如 `用户协商` / `定价错误`
### approve / reject
- approve`/admin-api/business/accounting-adjust/approve`
- 返回 `APPROVED / SUCCESS / UPDATED`
- reject`/admin-api/business/accounting-adjust/reject`
- 返回 `REJECTED / FAIL / SKIPPED`
## DB 回读
`biz_price_diff_adjust`
- `REV004-992205-20260417153413 -> APPROVED | UPDATED | SUCCESS`
- `REV004-992206-20260417153414 -> REJECTED | SKIPPED | FAIL`
`biz_price_diff_adjust_detail`
- approve 明细:`SUCCESS | APPROVE_EXECUTE | approve price diff smoke`
- reject 明细:`REJECTED | REJECT | reject price diff smoke`
- approve 样例金额前后值:
- `bill_amount_before=100.00 -> bill_amount_after=115.50`
- `extended_amount_before=100.00 -> extended_amount_after=115.50`
`biz_charge`
- `992205 -> bill_amount=115.5000, extended_amount=115.5000, original_money=115.5000`
- `992206 -> bill_amount=80.0000, extended_amount=80.0000, original_money=80.0000`
## 测试数据清理
smoke 完成后已删除:
- `biz_operat_log / detail`identify_value = `992205`, `992206`
- `biz_price_diff_adjust / detail`
- `biz_charge``992205`, `992206`
- `biz_cust``REV004_PD_SMOKE_A`, `REV004_PD_SMOKE_B`
回读结果:
- `pricediff_main_left=0`
- `pricediff_detail_left=0`
- `operat_log_left=0`
- `charge_left=0`
- `cust_left=0`
## 运行态清理
用于 fresh-jar HTTP smoke 的临时实例:
- port `48095`
已停止,当前无残留 LISTEN 进程。
## 当前结论
本轮 price-diff formal-table 已达到:
1. DDL 可落库且可幂等重放;
2. unsold price-diff submit 能落 pending formal main/detail
3. approve/reject 会同步 formal 状态;
4. detail/page 对 `PRICE_DIFF_ADJUST` 已能返回 formal-first 结果;
5. 账单回写与当前 `applyPriceDiffWriteBack(...)` 口径一致;
6. fresh smoke / cleanup 证据完整。
## 当前仍需收口
- 这批尚未提交 commit / PR
- 如果后续要更贴近原系统 `PM_PRICE_RECORDS / DETAILS` 语义,可继续补:
- `PriceListId`
- `PriceCode`
- `IsLadder`
- `NewFeeId`
- 更细颗粒的 old/new late fee 与账单差额字段来源收口。

View File

@ -0,0 +1,212 @@
# REV004 redink formal-table 已应用到 application-dev 测试库2026-04-17
## 目标库
依据:
- `sw-business/sw-business-server/src/main/resources/application-dev.yaml`
解析结果:
- Host`192.168.10.130`
- Port`5436`
- DB`sw_system`
- User`sw_system`
## 已执行脚本
- `sql/rev004/REV004_redink_formal_tables_deploy.sql`
## DDL 执行结果
结果:**PASS**
已确认存在:
- `biz_redink_record`
- `biz_redink_record_detail`
- `biz_redink_record_seq`
- `biz_redink_record_detail_seq`
已确认幂等重放通过:
- second apply 输出 existing/skip 结果
- 本轮顺手把 sequence 创建方式从 `CREATE SEQUENCE IF NOT EXISTS` 收口为显式 `pg_class` 检查,规避 replay 时 sequence 级重复键异常
## 代码验证
### compile
```bash
mvn -pl sw-business/sw-business-server -DskipTests compile
```
结果:**PASS**
### targeted tests
```bash
mvn -pl sw-business/sw-business-server -Dtest=ChargeServiceAccountingAdjustTest,AccountingAdjustQueryServiceImplTest,RedinkFormalizationServiceTest test
```
结果:**PASS**
- Tests run: 34
- Failures: 0
- Errors: 0
## fresh query smokefresh jar, port 48096
### health
- `GET /actuator/health` -> `{"status":"UP"}`
### smoke 方式说明
REDINK_RECORD 当前依赖原交易定位 / bank follow-up 逻辑;本轮先采用:
1. application-dev 手工 seed 一条 redink formal 主表/明细表记录;
2. fresh jar 验证 `get/page` 是否已 formal-first 命中;
3. 不在本轮直接伪造 live bank follow-up 交易。
### seed 记录
- `adjustmentNo = REV004-RI-992305-SEED`
- `chargeId = 992305`
- formal 主表状态:
- `approvalStatus = NOT_REQUIRED`
- `executeStatus = UPDATED`
- `resultStatus = SUCCESS`
- bank follow-up 样例:`BK-992305`
### get / page
- `GET /admin-api/business/accounting-adjust/get?adjustmentNo=REV004-RI-992305-SEED`
- 返回:
- `objectType = REDINK_RECORD`
- `resultStatus = SUCCESS`
- `approvalStatus = NOT_REQUIRED`
- `writeBackStatus = UPDATED`
- `originalTranSeq = T-992305`
- `originalSysTranSeq = SYS-992305`
- detail 中包含:
- `bankTranSeq`
- `redinkAmount`
- `payStateBefore`
- `payStateAfter`
- `GET /admin-api/business/accounting-adjust/page?...objectType=REDINK_RECORD`
- 返回 1 条 formal-first 记录
- `reasonCodeLabel` 已能解析为字典文本(如 `收费错误`
## 当前结论
本轮 redink formal-table 已达到:
1. DDL 可落库且可幂等重放;
2. 结果型 formal-table 主从表已建模;
3. query detail/page 对 `REDINK_RECORD` 已能返回 formal-first
4. compile / targeted tests 通过;
5. fresh jar query smoke 已验证 formal-first 查询链路可用。
## 当前仍未完全覆盖
- 尚未完成“真实 redink 执行成功后自动落 formal 结果”的 live HTTP smoke
- 原因是当前红冲依赖原交易与 bank follow-up 外部链路,需要在下一轮补真实可复现数据后再做完整 execute smoke。
## 测试数据清理
已删除:
- `biz_redink_record / detail`
- `biz_charge`
- `biz_cust`
回读结果:
- `redink_main_left=0`
- `redink_detail_left=0`
- `charge_left=0`
- `cust_left=0`
## 运行态清理
用于 fresh-jar query smoke 的临时实例:
- port `48096`
已停止,当前无残留 LISTEN 进程。
## live execute smoke 阻塞证据2026-04-17 16:50 +08:00
本轮额外尝试了真实 redink 执行链路:
- fresh jar`48097`
- 请求:`POST /admin-api/business/charge/accounting-adjust`
- `objectType = REDINK_RECORD`
- `chargeId = 992306`
- `originalTranSeq = T-REDINK-NOPE`
接口响应:
```json
{"code":500,"data":null,"msg":"系统异常"}
```
从应用日志定位到的精确异常:
- `FeignException$ServiceUnavailable: [503]`
- `Load balancer does not contain an instance for the service business-bank-server`
- 失败位置:`TransactionApi#getTransactionByTranSeq(...)`
结论:
- 当前 live execute smoke 未能完成的直接原因是 **外部依赖 `business-bank-server` 在当前环境无可用实例**
- 这不是 redink formal-table 本身的 DDL / 查询接线问题。
因此本批已完成:
- compile
- targeted tests
- DDL apply / replay
- fresh query smoke
但“真实 redink 执行成功后自动落 formal”的端到端 smoke 仍需在 `business-bank-server` 可用时补跑。
## live execute smoke 成功补证2026-04-17 17:51 +08:00
在本轮额外启动本地 `business-bank-server`dev profile, port `48092`)并向测试库预置原交易后,重新完成了 REDINK_RECORD 的真实端到端执行 smoke。
### 前置
- 本地启动 `business-bank-server`,并成功注册到 Nacos dev`business-bank-server 192.168.9.109:48092 register finished`
- 向 `bk_transaction` seed 原交易:
- `tran_seq = T-REDINK-NOPE`
- `sys_tran_seq = SYS-REDINK-NOPE`
- `tran_type = PAY`
- `status = SUCCESS`
- `contract_no = 992306`
- `amount = 12000`
- 准备已收费营业账:`chargeId = 992306`
### execute 请求
`POST /admin-api/business/charge/accounting-adjust`
```json
{
"chargeId": 992306,
"objectType": "REDINK_RECORD",
"reasonCode": "1",
"reason": "redink execute smoke",
"originalTranSeq": "T-REDINK-NOPE"
}
```
### execute 响应
结果:**PASS**
返回:
- `adjustmentNo = REV004-992306-20260417175109`
- `objectType = REDINK_RECORD`
- `resultStatus = SUCCESS`
- `approvalStatus = NOT_REQUIRED`
- `writeBackStatus = UPDATED`
- `message = 冲正处理成功bank流水号=RV9923062026041717511073C805`
### DB 回读
`biz_redink_record`
- `adjustment_no = REV004-992306-20260417175109`
- `approval_status = NOT_REQUIRED`
- `execute_status = UPDATED`
- `result_status = SUCCESS`
- `bank_tran_seq = RV9923062026041717511073C805`
- `original_tran_seq = T-REDINK-NOPE`
`biz_redink_record_detail`
- `detail_status = SUCCESS`
- `proc_type = EXECUTE`
- `pay_state_before = 1`
- `pay_state_after = 0`
- `redink_amount = 120.00`
`biz_charge`
- `pay_state = 0`
- 支付信息已清空为红冲后的未收费态
`bk_transaction`
- 原交易 `T-REDINK-NOPE` 状态变为 `REVERSED`
- 新增 follow-up
- `tran_seq = RV9923062026041717511073C805`
- `tran_type = PAY_INVALID`
- `status = SUCCESS`
- `original_tran_seq = T-REDINK-NOPE`
### 查询回读
- `GET /admin-api/business/accounting-adjust/get?adjustmentNo=REV004-992306-20260417175109` -> formal-first 返回成功
- `GET /admin-api/business/accounting-adjust/page?...objectType=REDINK_RECORD` -> formal-first 返回成功
说明至此REDINK_RECORD 已补齐“真实执行 -> 自动落 formal -> formal-first 查询”的完整闭环证据。

View File

@ -0,0 +1,142 @@
# REV004 writtenoff formal-table 已应用到 application-dev 测试库2026-04-17
## 目标库
依据:
- `sw-business/sw-business-server/src/main/resources/application-dev.yaml`
解析结果:
- Host`192.168.10.130`
- Port`5436`
- DB`sw_system`
- User`sw_system`
## 已执行脚本
- `sql/rev004/REV004_writtenoff_formal_tables_deploy.sql`
## DDL 执行结果
结果:**PASS**
已确认存在:
- `biz_writtenoff_adjust`
- `biz_writtenoff_adjust_detail`
- `biz_writtenoff_adjust_seq`
- `biz_writtenoff_adjust_detail_seq`
已确认幂等重放通过:
- second apply 输出 `already exists, skipping`
- 无重复约束/重复索引异常
## 代码验证
### compile
```bash
mvn -pl sw-business/sw-business-server -DskipTests compile
```
结果:**PASS**
### targeted tests
```bash
mvn -pl sw-business/sw-business-server \
-Dtest=AccountingAdjustSoldProcessServiceImplTest,AccountingAdjustActionServiceImplTest,AccountingAdjustProcessServiceImplTest,AccountingAdjustQueryServiceImplTest,WrittenoffFormalizationServiceTest test
```
结果:**PASS**
- Tests run: 41
- Failures: 0
- Errors: 0
## HTTP smokefresh jar, port 48093
### submit
- `sold-submit` on charge `992005``REV004-SLD-992005-20260417143622`
- `sold-submit` on charge `992006``REV004-SLD-992006-20260417143623`
- 返回统一为:
- `objectType = WRITTENOFF_ADJUST`
- `approvalStatus = PENDING_APPROVAL`
- `resultStatus = PENDING_APPROVAL`
- `writeBackStatus = PENDING`
### DB 回读
`biz_writtenoff_adjust_detail`
- submit 后 detail 进入 `PENDING_APPROVAL / SUBMIT`
### query
- `GET /admin-api/business/accounting-adjust/get?adjustmentNo=...` 对 writtenoff 已返回 formal detail
- `GET /admin-api/business/accounting-adjust/page?...objectType=WRITTENOFF_ADJUST` 已返回 formal-first 列表
### approve / reject
- approve`/admin-api/business/accounting-adjust/approve`
- 返回 `APPROVED/SUCCESS/UPDATED`
- 账单 `extended_amount` 归零、`discount_money` 累加、`pay_state=SETTLED(2)`
- reject`/admin-api/business/accounting-adjust/reject`
- 返回 `REJECTED/FAIL/SKIPPED`
- 账单保持原值,不执行核销回写
## 测试数据清理
smoke 完成后已删除:
- `biz_operat_log / detail`identify_value = `992005`, `992006`
- `biz_writtenoff_adjust / detail`
- `biz_charge``992005`, `992006`
- `biz_cust``REV004_WO_SMOKE_A`, `REV004_WO_SMOKE_B`
回读结果:
- `writtenoff_main_left=0`
- `operat_log_left=0`
- `charge_left=0`
- `cust_left=0`
## 运行态清理
用于 fresh-jar HTTP smoke 的临时实例:
- port `48093`
已停止,当前无残留 LISTEN 进程。
## 当前结论
本轮 writtenoff formal-table 已达到:
1. DDL 可落库且可幂等重放;
2. sold submit 能落 pending formal main/detail
3. approve/reject 会同步 formal 状态;
4. detail/page 对 `WRITTENOFF_ADJUST` 已能返回 formal-first 结果;
5. sold submit 已补事务边界,避免 operat_log 与 formal-table 半成功;
6. 审批/驳回缺失 formal 主记录时将显式报错,避免静默漏更新。
## 当前未完成
- writtenoff formal-first 目前仍是最小实现,后续仍可优化 page 查询性能(避免 listAll + getView N+1
- 若需要更细的 charge_detail 差异映射到 formal 明细,可在后续补强。
## 最终补丁后复核2026-04-17 14:57 +08:00
针对本轮补加的两个可靠性修正再次执行 fresh-jar smoke
1. `createSoldAction(...)``@Transactional`,确保 synthetic `operat_log` 与 formal pending 记录同事务提交;
2. writtenoff approve/reject 缺失 formal 主记录时改为显式报错,避免静默跳过 formal 状态更新。
### fresh jar
- 端口:`48094`
- 启动方式:`/usr/bin/java -jar sw-business/sw-business-server/target/sw-business-server.jar --spring.profiles.active=dev --server.port=48094`
- `GET /actuator/health` 返回:`{"status":"UP"}`
### smoke 数据
- charge `992105`approve
- charge `992106`reject
- submit 返回调整单:
- `REV004-SLD-992105-20260417145725`
- `REV004-SLD-992106-20260417145726`
### HTTP 结果
- `sold-submit`:两笔均返回 `PENDING_APPROVAL / PENDING`
- `get?adjustmentNo=REV004-SLD-992105-20260417145725`:可返回 formal detail核销金额、账务年月等
- `page?objectType=WRITTENOFF_ADJUST`:可返回两笔 fresh smoke formal 记录
- `approve`:返回 `APPROVED / SUCCESS / UPDATED`
- `reject`:返回 `REJECTED / FAIL / SKIPPED`
### DB 回读
`biz_writtenoff_adjust`
- `REV004-SLD-992105-20260417145725 -> APPROVED | UPDATED | SUCCESS`
- `REV004-SLD-992106-20260417145726 -> REJECTED | SKIPPED | FAIL`
`biz_writtenoff_adjust_detail`
- approve 明细:`SUCCESS | APPROVE_EXECUTE | approve final smoke`
- reject 明细:`REJECTED | REJECT | reject final smoke`
`biz_charge`
- `992105 -> pay_state=2, extended_amount=0, discount_money=120, original_money=120`
- `992106 -> pay_state=1, extended_amount=88, discount_money=0, original_money=88`
说明最终补丁后writtenoff submit / get / page / approve / reject 主链路再次通过,且回写结果与预期一致。

View File

@ -0,0 +1,115 @@
# REV004 当前主线真值矩阵
## 主线基线
- backend`sw-system-cloud/develop @ 9462f3a12728b83bfe31e0b74c526f4256f5b361`
- docs`fujian_water_biz_doc/main @ b5efa3b2480b1a0b8a00b728ac434f833787b6b4`
- 生成时间:`2026-04-17 15:00 +08:00`
## 一、对象总览
| 对象 | objectType / 专属域 | formal-table 状态 | 主表 / 明细表 | 主接口状态 | strict formal-first 状态 |
|---|---|---|---|---|---|
| 预存调整 | prestorage | 已独立 | `biz_prestorage_adjust` / `biz_prestorage_adjust_detail` | 已接线 | 部分完成 |
| 坏账调整 | `BAD_DEBT_RECORD` | 已独立 | `biz_bad_debt_adjust` / `biz_bad_debt_adjust_detail` | 已接线 | 主链路完成 |
| 已销调整/核销 | `WRITTENOFF_ADJUST` | 已独立 | `biz_writtenoff_adjust` / `biz_writtenoff_adjust_detail` | 已接线 | 主链路完成 |
| 违约金减免 | `LATE_FEE_REDUCE` | 已独立 | `biz_latefee_reduce` / `biz_latefee_reduce_detail` | 已接线 | 主链路完成 |
| 分账调整 | `SPLIT_ADJUST` | 已独立 | `biz_split_adjust` / `biz_split_adjust_detail` | 已接线 | 专属接口完成 |
| 价差调整 | `PRICE_DIFF_ADJUST` | 已独立 | `biz_price_diff_adjust` / `biz_price_diff_adjust_detail` | 已接线 | 主链路完成 |
| 红冲记录 | `REDINK_RECORD` | 已独立 | `biz_redink_record` / `biz_redink_record_detail` | 已接线 | 主链路完成(执行链路受外部依赖阻塞补证) |
## 二、已独立对象明细
### 1. 价差调整 `PRICE_DIFF_ADJUST`
- DDL`sql/rev004/REV004_price_diff_formal_tables_deploy.sql`
- 表:`biz_price_diff_adjust``biz_price_diff_adjust_detail`
- 接口:
- `POST /admin-api/business/accounting-adjust/unsold-price-diff-submit`
- `POST /admin-api/business/accounting-adjust/unsold-price-diff-batch-submit`
- `POST /admin-api/business/accounting-adjust/approve`
- `POST /admin-api/business/accounting-adjust/reject`
- `GET /admin-api/business/accounting-adjust/get`
- `GET /admin-api/business/accounting-adjust/page`
- 当前判断:
- submit / approve / reject / get / page 已形成 formal-table 主链路
- 仍保留 legacy `operat_log` 兼容轨迹
- 当前按最小 formal-table 模式恢复,尚未一比一回归旧系统 `PM_PRICE_RECORDS / DETAILS` 全字段语义
### 2. 预存调整(退款 / 转账)
- DDL`sql/rev004/REV004_prestorage_formal_tables_deploy.sql`
- 表:`biz_prestorage_adjust``biz_prestorage_adjust_detail`
- 接口:
- `POST /admin-api/business/accounting-adjust/prestorage-submit`
- `POST /admin-api/business/accounting-adjust/prestorage-revoke`
- `GET /admin-api/business/accounting-adjust/prestorage-process`
- `GET /admin-api/business/accounting-adjust/prestorage-attachments`
- `GET /admin-api/business/accounting-adjust/prestorage-page`
- `GET /admin-api/business/accounting-adjust/prestorage-detail`
- 当前判断:
- submit / revoke / page / detail 已是 formal-table 主链路
- `process / attachments` 仍保留 legacy / unified fallback
### 3. 坏账调整
- DDL`sql/rev004/REV004_bad_debt_formal_tables_deploy.sql`
- 表:`biz_bad_debt_adjust``biz_bad_debt_adjust_detail`
- 接线口径:统一 `accounting-adjust` submit / approve / reject / page / detail
- 当前判断:主链路已 formal-first
### 4. 已销调整 / 核销
- DDL`sql/rev004/REV004_writtenoff_formal_tables_deploy.sql`
- 表:`biz_writtenoff_adjust``biz_writtenoff_adjust_detail`
- 接口:
- `POST /admin-api/business/accounting-adjust/sold-submit`
- `POST /admin-api/business/accounting-adjust/approve`
- `POST /admin-api/business/accounting-adjust/reject`
- `GET /admin-api/business/accounting-adjust/get`
- `GET /admin-api/business/accounting-adjust/page`
- 当前判断:主链路已 formal-first且已补事务边界 / fail-fast
### 5. 违约金减免
- DDL`sql/rev004/REV004_latefee_formal_tables_deploy.sql`
- 表:`biz_latefee_reduce``biz_latefee_reduce_detail`
- 接口:
- `POST /admin-api/business/accounting-adjust/unsold-late-fee-reduce-submit`
- `POST /admin-api/business/accounting-adjust/unsold-late-fee-reduce-batch-submit`
- 当前判断formal-table 主链路已建立
### 6. 分账调整
- 表:`biz_split_adjust``biz_split_adjust_detail`
- 专属接口:
- `POST /business/split-adjust/submit`
- `GET /business/split-adjust/page`
- `GET /business/split-adjust/detail`
- `GET /business/split-adjust/result`
- 当前判断:已独立为专属对象域
- 备注:`sql/rev004/` 目录下当前未看到单独 split deploy 脚本,说明库结构来源可能更早或另有维护路径
## 三、未独立对象
### 1. 红冲记录 `REDINK_RECORD`
- DDL`sql/rev004/REV004_redink_formal_tables_deploy.sql`
- 表:`biz_redink_record``biz_redink_record_detail`
- 当前判断:
- REDINK_RECORD 成功执行结果已落结果型 formal 主从表
- `get/page` 已接入 formal-first
- 保留 legacy `operat_log` 兼容轨迹
- 真实 live execute smoke 仍受 `business-bank-server` 无可用实例阻塞,已在 evidence 中记录精确异常
## 四、当前最适合的后续优先级
1. prestorage `process / attachments` strict formal-first 收口
2. 对外联调版“对象 → 表 → 接口 → 真值口径”说明
3. 待 `business-bank-server` 可用后补 redink live execute 完整 smoke
## 五、证据锚点
- backend 已合入:
- PR #77 -> `9462f3a12728b83bfe31e0b74c526f4256f5b361`writtenoff
- PR #78 -> `1964c7823291cd4972c72c50ffcad154f3a74b4c`price-diff
- PR #79 -> `d8596af47479ef28664b83200d86f7770c8b9bd4`redink
- docs 已合入:
- `b5efa3b2480b1a0b8a00b728ac434f833787b6b4`(前一轮矩阵基线)
- `c741164fa48dd79f4c43ffb15e3b093933dc642c`price-diff evidence
- `57763c634e0e6733d0861051f6b78c5dcdb9022f`redink evidence
- fresh smoke evidence
- `docs/evidence/rev004-writtenoff-formal-table-dev-db-apply-2026-04-17.md`
- `docs/evidence/rev004-price-diff-formal-table-dev-db-apply-2026-04-17.md`
- `docs/evidence/rev004-redink-formal-table-dev-db-apply-2026-04-17.md`
- formal-table 状态矩阵:`docs/guides/REV004_FORMAL_TABLE_STATUS_MATRIX.md`

View File

@ -0,0 +1,131 @@
# REV004 字典绑定矩阵
## 1. 文档目的
本文件用于明确 REV004 当前接口、前端查询条件与下拉口径,应如何绑定到系统字典。
原则:
- 旧字典能承接的继续承接;
- 旧字典承接不了的,仅最小新增;
- 不迁移旧字典体系;
- 不要求所有旧页面一次性切换。
---
## 2. 本轮新增字典
| 字典类型 | 用途 |
|---|---|
| `redink_reason` | 红冲/冲正原因 |
| `account_adjust_object_type` | REV004 当前开放对象类型 |
| `account_adjust_result_status` | REV004 结果状态 |
| `account_adjust_approval_status` | REV004 审批状态 |
| `account_adjust_writeback_status` | REV004 回写状态 |
---
## 3. 继续复用的旧字典
| 字典类型 | 用途 |
|---|---|
| `deposit_reason` | 预付费退款原因 |
| `late_fee_reason` | 违约金减免原因 |
| `price_reason` | 价差调整原因 |
| `separate_reason` | 分账/拆分原因 |
| `separate_type` | 分账调整方式(按水量 / 按费用组成) |
| `knotty_reason` | 呆坏账原因 |
| `knotty_type` | 呆坏账类型(呆账/坏账/纠纷账) |
| `payment_reason` | 已销/核销调整原因(当前作为核销调整过渡复用) |
| `proc_type` | 账务处理方式 |
| `business_type` | 业务大类归属 |
---
## 4. REV004 接口字段绑定矩阵
### 4.1 核心接口字段
| 字段 | 字段语义 | 绑定字典 | 说明 |
|---|---|---|---|
| `objectType` | 调整对象 | `account_adjust_object_type` | 前端对象筛选、标签显示、下拉选择主来源 |
| `resultStatus` | 处理结果状态 | `account_adjust_result_status` | 前端结果状态筛选、展示主来源 |
| `approvalStatus` | 审批状态 | `account_adjust_approval_status` | 前端审批角标/审批筛选主来源 |
| `writeBackStatus` | 回写状态 | `account_adjust_writeback_status` | 前端回写状态展示与筛选主来源 |
| `reasonCode` | 调整原因编码 | **按 objectType 动态绑定** | 不统一绑一个 reason 字典,而是按对象类型切换 |
---
### 4.2 `reasonCode` 动态绑定规则
| objectType | 绑定字典 | 说明 |
|---|---|---|
| `PREPAID_REFUND` | `deposit_reason` | 复用预存调整原因中的退款语义 |
| `REDINK_RECORD` | `redink_reason` | 旧库缺少红冲原因专属字典,本轮新增 |
| `BAD_DEBT_RECORD` | `knotty_reason` | 复用呆坏账原因 |
| `WRITTENOFF_ADJUST` | `payment_reason` | 当前过渡复用;若后续核销长期独立,可再拆专属字典 |
| `PRICE_DIFF_ADJUST` | `price_reason` | 复用价差调整原因 |
| `LATE_FEE_REDUCE` | `late_fee_reason` | 复用违约金减免原因 |
| `SPLIT_ADJUST` | `separate_reason` | 复用分账调整原因 |
---
### 4.3 与辅助类型字段的关系
| 使用场景 | 字段/语义 | 绑定字典 |
|---|---|---|
| 违约金减免二级方式 | 按金额 / 按日期 | `late_fee_type` |
| 分账调整二级方式 | 按水量 / 按费用组成 | `separate_type` |
| 呆坏账细分类型 | 呆账 / 坏账 / 纠纷账 | `knotty_type` |
| 账务结果处理动作 | 转预存 / 转退款 / 转销账 / 线下退款 | `proc_type` |
| 历史业务归类 / 大类筛选 | 预存调整 / 呆坏账 / 违约金减免 / 价差调整 / 已销调整 / 分账调整 | `business_type` |
> 说明:`business_type` 不作为 `objectType` 的替代来源。
> `objectType``account_adjust_object_type` 为主,`business_type` 仅作为旧页面/旧日志/业务大类归类兼容口径。
---
## 5. 前端下拉与查询接入建议
### 5.1 建议读取接口
- 字典数据接口:
- `GET /admin-api/system/dict-data/simple-list`
### 5.2 页面建议
#### REV004 查询页
- 对象类型下拉:`account_adjust_object_type`
- 结果状态下拉:`account_adjust_result_status`
- 审批状态下拉:`account_adjust_approval_status`
- 回写状态下拉:`account_adjust_writeback_status`
#### REV004 办理弹窗
- 原因下拉:根据当前 `objectType` 动态切换字典类型
- 例如:`PRICE_DIFF_ADJUST -> price_reason`
---
## 6. 非目标说明
本轮不做:
- 旧字典批量改名
- 历史页面一次性切换到新字典
- 旧业务表字段语义迁移
- 全账务领域统一字典重构
---
## 7. 当前特别说明
### `WRITTENOFF_ADJUST`
当前建议临时复用:
- `payment_reason`
这是过渡方案,不代表“核销调整”和“已销调整”语义完全等价。
若后续核销调整独立场景长期存在,建议再单独补:
- `writtenoff_reason`
### `REDINK_RECORD`
当前库中无现成“红冲原因/冲正原因”专属字典,故本轮新增:
- `redink_reason`

View File

@ -0,0 +1,100 @@
# REV004 最终主线验收 / 联调交付总表
## 1. 当前主线基线
### backend
- repo`emsoft-IF/sw-system-cloud`
- branch`develop`
- latest merge`ea159faa3bae2b7491d4e60cbe79e392e77e7345`
### docs
- repo`tangweijie/fujian_water_biz_doc`
- branch`main`
- latest mainline content以当前 `main` 分支最新提交为准(此处不再固化 commit sha避免总表在自我合并后立即过期
---
## 2. 已完成的 REV004 主对象真值恢复
| 对象 | objectType / 域 | 主表 | 当前主线状态 | 备注 |
|---|---|---|---|---|
| 预存调整 | prestorage | `biz_prestorage_adjust` / `biz_prestorage_adjust_detail` | 已完成 | process/attachments 也已 strict formal-first 收口 |
| 坏账调整 | `BAD_DEBT_RECORD` | `biz_bad_debt_adjust` / `biz_bad_debt_adjust_detail` | 已完成 | formal-first |
| 已销调整 / 核销 | `WRITTENOFF_ADJUST` | `biz_writtenoff_adjust` / `biz_writtenoff_adjust_detail` | 已完成 | formal-first |
| 违约金减免 | `LATE_FEE_REDUCE` | `biz_latefee_reduce` / `biz_latefee_reduce_detail` | 已完成 | formal-first |
| 分账调整 | `SPLIT_ADJUST` | `biz_split_adjust` / `biz_split_adjust_detail` | 已完成 | 专属对象域 |
| 价差调整 | `PRICE_DIFF_ADJUST` | `biz_price_diff_adjust` / `biz_price_diff_adjust_detail` | 已完成 | formal-first |
| 红冲记录 | `REDINK_RECORD` | `biz_redink_record` / `biz_redink_record_detail` | 已完成 | 结果型 formal-table已补齐 live execute 闭环证据 |
---
## 3. 本轮已合入主线的 PR / merge sha
### backend develop
- PR #77writtenoff formal-table
- merge sha`9462f3a12728b83bfe31e0b74c526f4256f5b361`
- PR #78price-diff formal-table
- merge sha`1964c7823291cd4972c72c50ffcad154f3a74b4c`
- PR #79redink formal-table
- merge sha`d8596af47479ef28664b83200d86f7770c8b9bd4`
- PR #80prestorage process/attachments strict formal-first
- merge sha`ea159faa3bae2b7491d4e60cbe79e392e77e7345`
### docs main
- price-diff evidence merge`c741164fa48dd79f4c43ffb15e3b093933dc642c`
- current truth matrix含 price-diffmerge`692ac419f6fab7da63e90e74e06d200e427580fa`
- redink evidence merge`57763c634e0e6733d0861051f6b78c5dcdb9022f`
- current truth matrix含 redinkmerge`89737608b356dcc3dd40e40d90cf9064059ca467`
- prestorage strict formal-first evidence merge`415b4cee1303f51c7a3aeb0a58722873e852452c`
---
## 4. 已有 evidence 文档
- `docs/evidence/rev004-prestorage-formal-table-dev-db-apply-2026-04-16.md`
- `docs/evidence/rev004-bad-debt-formal-table-dev-db-apply-2026-04-17.md`
- `docs/evidence/rev004-writtenoff-formal-table-dev-db-apply-2026-04-17.md`
- `docs/evidence/rev004-price-diff-formal-table-dev-db-apply-2026-04-17.md`
- `docs/evidence/rev004-redink-formal-table-dev-db-apply-2026-04-17.md`
- `docs/evidence/rev004-prestorage-strict-formal-first-2026-04-17.md`
---
## 5. 当前仍需说明的残留点
### 5.1 redink
- formal-table 已落主线
- compile / targeted tests / DDL / query smoke / live execute smoke 已完成
- 已确认:
- 自动创建 follow-up bank 交易
- 原交易状态更新为 `REVERSED`
- formal main/detail 自动落表
### 5.2 其他对象
- 当前主线里最明显未独立 formal-table 的核心对象已经大幅减少
- 如果继续扩展,下一步更适合做:
- 对外联调说明收口
- 或处理外部依赖类 blocker 补证
---
## 6. 给联调方的可直接口径
### 对前端
当前 REV004 主线可按独立对象化口径使用:
- prestorage
- bad debt
- writtenoff
- late fee reduce
- split adjust
- price diff
- redink
其中:
- prestorage 的 `process / attachments` 已 formal-first
- redink 已独立,且 live execute 闭环证据已补齐
### 对测试
优先参考对应 evidence 文档回归:
- 表结构是否存在
- DDL 是否幂等
- compile / targeted tests 是否通过
- fresh smoke 是否通过
- cleanup 是否完成
### 对产品 / 管理
REV004 本轮已基本完成主对象 formal-table 恢复与主线收口;后续重点已从“建模缺失”转向“外部依赖补证 + 联调说明完善”。

View File

@ -0,0 +1,220 @@
# REV004 原系统独立表 vs 当前新系统落地状态对照表
## 文档目的
梳理:
1. 原系统数据字典中,这些账务处理对象是否按独立表建模
2. 当前新系统 backend 是否已经恢复为独立 formal-table
3. 哪些对象当前仍停留在日志骨架 / 兼容接口模式
方便后续做对象化恢复排期判断。
---
## 一、结论总览
| 对象 | 原系统数据字典 | 当前新系统状态 | 备注 |
|---|---|---|---|
| 预存退款 | 有独立表 | **已实现 formal-table待进一步收口** | prestorage formal-table 代码已接线,测试库 DDL 已落HTTP smoke 已完成 |
| 预存退款详情 | 有独立表 | **已实现 formal-table待进一步收口** | `biz_prestorage_adjust_detail` 已建模、落测试库并完成 HTTP smoke 验证 |
| 预存转账 | 属于预存调整类型 | **已实现 formal-table待进一步收口** | transfer submit/revoke/page/detail 已接入 prestorage formal-tableprocess/attachments 仍保留 legacy/unified fallback |
| 违约金减免汇总 | 有独立表 | **已独立 formal-table** | `biz_latefee_reduce` |
| 违约金减免明细 | 有独立表 | **已独立 formal-table** | `biz_latefee_reduce_detail` |
| 分账调整汇总 | 有独立表 | **已独立 formal-table** | `biz_split_adjust` |
| 分账调整明细 | 有独立表 | **已独立 formal-table** | `biz_split_adjust_detail` |
| 呆坏账汇总 | 有独立表 | 未独立 formal-table | 当前仍走兼容接口 |
| 呆坏账明细 | 有独立表 | 未独立 formal-table | 当前无独立主从表 |
| 已销调整汇总 | 有独立表 | 未独立 formal-table | 当前仍走兼容接口 |
| 已销调整明细 | 有独立表 | 未独立 formal-table | 当前无独立主从表 |
| 价差调整汇总 | 有独立表 | 未独立 formal-table | 当前仍走兼容接口 |
| 价差调整明细 | 有独立表 | 未独立 formal-table | 当前无独立主从表 |
| 退款账 | 有独立结果对象 | 未独立 formal-table | 当前未恢复为正式对象表 |
---
## 二、原系统字典里能确认的对象
依据:
- `docs/design/04_Appendix/Archive/05_Data_Dictionary/营收数据字典.md`
在“收费、账务处理”目录项中,明确出现过以下对象/表:
### 预存相关
- `预存退款`
- `预存退款详情表`
### 违约金减免
- `账单-违约金减免汇总表`
- `账单-违约金减免详情表`
### 分账
- `分账调整汇总`
- `分账调整明细`
### 呆坏账
- `账单-呆坏帐汇总表`
- `账单-呆坏帐详情表`
### 已销调整
- `已销调整汇总`
- `已销调整明细`
### 价差调整
- `价差调整汇总`
- `价差调整明细`
### 退款结果类
- `退款账`
这说明:
**原系统数据字典口径中,这些对象不是只靠统一日志表达,而是按独立业务表设计。**
---
## 三、原系统字典里的相关字典项
原系统字典中,还单独存在这些字典项:
- `预存调整类型`
- `预存调整原因`
- `违约金减免类型`
- `违约金减免原因`
- `分账调整类型`
- `分账调整原因`
- `呆坏账类型`
- `呆坏账原因`
- `价差调整原因`
- `已销调整原因`
其中:
### 预存调整类型
- `1 = 预存退款`
- `2 = 预存转账`
这说明:
**原系统对“预存退款 / 预存转账”不只是页面操作概念,而是明确的业务类型定义。**
---
## 四、当前新系统已经恢复的对象
## 4.1 分账 `SPLIT_ADJUST`
### 已落地表
- `biz_split_adjust`
- `biz_split_adjust_detail`
### 已有接口
- `POST /admin-api/business/split-adjust/submit`
- `GET /admin-api/business/split-adjust/page`
- `GET /admin-api/business/split-adjust/detail`
- `GET /admin-api/business/split-adjust/result`
### 当前判断
**已恢复为正式对象。**
---
## 4.2 违约金减免 `LATE_FEE_REDUCE`
### 已落地表
- `biz_latefee_reduce`
- `biz_latefee_reduce_detail`
### 已有接口
- `POST /admin-api/business/accounting-adjust/unsold-late-fee-reduce-submit`
- `POST /admin-api/business/accounting-adjust/unsold-late-fee-reduce-batch-submit`
- 查询/审批继续走 `accounting-adjust` 兼容入口
### 当前判断
**已恢复为正式对象。**
---
## 五、当前新系统还没恢复的对象
## 5.1 预存退款 / 预存转账
### 当前实现
- `biz_account`:余额变化
- `biz_operat_log` / `biz_operat_log_detail`:兼容留痕
- `biz_prestorage_adjust` / `biz_prestorage_adjust_detail`formal-table 新实现
### 当前判断
**已实现 formal-table当前处于“可提交独立 PR、后续继续收口 process/attachments strict formal-first”的状态。**
当前已完成:
- prestorage DO / Mapper / FormalizationService
- submit / revoke 双写接线
- `page/detail/stat` formal-table 优先投影
- 测试库 DDL 已落
- compile / targeted tests 通过
- 真实 HTTP smokerefund/transfer/revoke/page/detail/process/attachments已完成
当前未完成:
- `process/attachments` strict formal-first 真值口径最终收口
---
## 5.2 坏账 `BAD_DEBT_RECORD`
### 当前实现
- 走 `accounting-adjust` 提交/查询/审批兼容链路
- 没有独立主表/明细表
### 当前判断
**还不是 formal-table。**
---
## 5.3 已销调整 / 核销 `WRITTENOFF_ADJUST`
### 当前实现
- 走兼容接口
- 无独立 formal-table
### 当前判断
**还不是 formal-table。**
---
## 5.4 价差调整 `PRICE_DIFF_ADJUST`
### 当前实现
- 走兼容接口
- 无独立 formal-table
### 当前判断
**还不是 formal-table。**
---
## 六、最简判断口径
### 原系统
**是“对象独立建模”口径**
- 业务对象有独立表
- 类型/原因有独立字典
### 当前新系统
**是“部分恢复”口径**
- 已恢复:
- 分账
- 违约金减免
- 未恢复:
- 预存
- 坏账
- 核销
- 价差
---
## 七、建议后续确认口径
可以直接对外说明:
> 原系统字典里,预存退款、违约金减免、分账、坏账、已销调整、价差调整等对象,都是按独立表设计的。
> 当前新系统只恢复了“分账”和“违约金减免”两条 formal-table 路线,其他对象仍主要走日志骨架 / 兼容接口模式。
> 因此后续若继续做对象化恢复,优先需要确认:预存、坏账、核销、价差哪些要继续恢复成独立 formal-table。
---

View File

@ -0,0 +1,114 @@
# REV004 上线前检查清单 / 联调问题清单
## 1. 当前基线
### backend
- branch: `develop`
- latest verified merge: `ea159faa3bae2b7491d4e60cbe79e392e77e7345`
### docs
- branch: `main`
- latest verified merge: `3741fd597df21c54356a1a09778074a8450c73cc`
---
## 2. 已完成对象(当前可联调)
- prestorage
- bad debt
- writtenoff
- late fee reduce
- split adjust
- price diff
- redink
说明:以上对象均已有主线 evidence 文档,可作为联调准入依据。
---
## 3. 上线前必查项
### A. 代码 / 构建
- [ ] backend 当前部署分支确认包含:`ea159faa...` 及之后需要上线的提交
- [ ] `mvn -pl sw-business/sw-business-server -DskipTests compile` 通过
- [ ] 目标对象对应 targeted tests 通过
- [ ] 关键接口 OpenAPI/Controller 路由与前端调用地址一致
### B. 数据库 / DDL
- [ ] 以下表在目标环境已存在:
- `biz_prestorage_adjust`
- `biz_prestorage_adjust_detail`
- `biz_bad_debt_adjust`
- `biz_bad_debt_adjust_detail`
- `biz_writtenoff_adjust`
- `biz_writtenoff_adjust_detail`
- `biz_latefee_reduce`
- `biz_latefee_reduce_detail`
- `biz_price_diff_adjust`
- `biz_price_diff_adjust_detail`
- `biz_redink_record`
- `biz_redink_record_detail`
- `biz_split_adjust`
- `biz_split_adjust_detail`
- [ ] 对应 deploy SQL 在目标环境幂等可重放
- [ ] 字典已对齐前端绑定(尤其 `account_adjust_*``price_reason``redink_reason` 等)
### C. 外部依赖
- [ ] `business-bank-server` 可用redink / refund 真实链路)
- [ ] Nacos 注册正常
- [ ] Redis 可用
- [ ] 目标环境数据库可写
- [ ] 如涉及 XXL/定时组件,端口与注册不会冲突
### D. 联调 smoke
- [ ] prestoragesubmit / revoke / page / detail / process / attachments
- [ ] bad debtsubmit / approve / reject / page / detail
- [ ] writtenoffsubmit / approve / reject / page / detail
- [ ] late fee reducesubmit / batch submit / page / detail
- [ ] splitsubmit / page / detail / result
- [ ] price diffsubmit / approve / reject / page / detail
- [ ] redinkexecute / get / page
### E. 清理
- [ ] 测试数据已清理
- [ ] 临时端口实例已停止
- [ ] evidence 已回写文档
---
## 4. 联调问题清单(当前已知)
### 4.1 当前已闭环
- prestorage `process / attachments` 已 strict formal-first
- redink 已补齐 live execute 成功补证
### 4.2 当前仍需关注
- redink / refund 一旦切到真实环境,需确认 `business-bank-server` 服务实例与原交易数据确实可用
- split 的 deploy SQL 来源需继续保持环境一致性(当前代码/对象域已独立,但表结构不在本轮 `sql/rev004` 内新增)
- 若未来要移除 legacy fallback需先做历史数据兼容评估
---
## 5. 推荐联调顺序
1. 字典与页面下拉/标签校验
2. prestorage 全链路
3. writtenoff / bad debt / price diff 审批链路
4. redink live execute
5. split / late fee reduce 补充场景
---
## 6. 对外沟通口径(可直接复用)
> 当前 REV004 主线已经完成主要账务对象的 formal-table 恢复与查询真值收口,包含预存、坏账、已销/核销、违约金减免、分账、价差、红冲。\
> 联调阶段请优先按各 evidence 文档验证目标环境的表结构、接口返回、fresh smoke 与清理结果;如涉及红冲/退款真实链路,请同时确认 `business-bank-server` 与原交易数据可用。
---
## 7. 证据索引
- `docs/guides/REV004_FINAL_MAINLINE_DELIVERY_SUMMARY.md`
- `docs/guides/REV004_CURRENT_TRUTH_MATRIX.md`
- `docs/evidence/rev004-prestorage-formal-table-dev-db-apply-2026-04-16.md`
- `docs/evidence/rev004-prestorage-strict-formal-first-2026-04-17.md`
- `docs/evidence/rev004-bad-debt-formal-table-dev-db-apply-2026-04-17.md`
- `docs/evidence/rev004-writtenoff-formal-table-dev-db-apply-2026-04-17.md`
- `docs/evidence/rev004-price-diff-formal-table-dev-db-apply-2026-04-17.md`
- `docs/evidence/rev004-redink-formal-table-dev-db-apply-2026-04-17.md`
- `docs/evidence/rev004-latefee-formal-table-dev-db-apply-2026-04-15.md`

View File

@ -0,0 +1,164 @@
# REV004 上线实施步骤清单 / 环境巡检清单
## 1. 适用范围
用于 REV004 账务处理对象主线恢复完成后的:
- 上线前环境核查
- 上线实施步骤
- 上线后核验
- 异常回滚与补证
当前主线基线:
- backend `develop``ea159faa3bae2b7491d4e60cbe79e392e77e7345`
- docs `main``9946fa75722eb4d13e213763ff2f0c9f8e1cb509`
---
## 2. 上线前环境巡检
### A. 服务注册
- [ ] `business-server` 正常注册到 Nacos
- [ ] `business-bank-server` 正常注册到 Nacos
- [ ] `system-server` / `infra-server` 可发现
- [ ] 不存在端口冲突(尤其 XXL executor 端口)
### B. 数据库
- [ ] PostgreSQL 连接正常
- [ ] 目标 schema 可写
- [ ] 下列表存在:
- `biz_prestorage_adjust`
- `biz_prestorage_adjust_detail`
- `biz_bad_debt_adjust`
- `biz_bad_debt_adjust_detail`
- `biz_writtenoff_adjust`
- `biz_writtenoff_adjust_detail`
- `biz_latefee_reduce`
- `biz_latefee_reduce_detail`
- `biz_price_diff_adjust`
- `biz_price_diff_adjust_detail`
- `biz_redink_record`
- `biz_redink_record_detail`
- `biz_split_adjust`
- `biz_split_adjust_detail`
- [ ] DDL 可幂等重放
### C. 中间件
- [ ] Redis 正常
- [ ] Nacos 正常
- [ ] RocketMQ / Rabbit / Kafka如环境需要状态符合部署要求
- [ ] XXL Admin 可访问,且不会因不可达阻断核心业务启动
### D. 外部依赖
- [ ] `business-bank-server` 能处理:
- `get-by-tran-seq`
- `createFollowupTransaction`
- [ ] 原交易测试数据可用redink/refund
---
## 3. 上线实施步骤
### Step 1 — 代码版本确认
- [ ] backend 部署目标包含 `ea159faa...` 之后所有需要上线提交
- [ ] docs 主线已可供联调/运维参考
### Step 2 — DDL 执行
按对象顺序执行/确认以下脚本:
- [ ] `REV004_prestorage_formal_tables_deploy.sql`
- [ ] `REV004_bad_debt_formal_tables_deploy.sql`
- [ ] `REV004_writtenoff_formal_tables_deploy.sql`
- [ ] `REV004_latefee_formal_tables_deploy.sql`
- [ ] `REV004_price_diff_formal_tables_deploy.sql`
- [ ] `REV004_redink_formal_tables_deploy.sql`
### Step 3 — 服务启动
建议顺序:
1. 基础依赖Nacos / Redis / DB
2. `business-bank-server`
3. `business-server`
4. 其余依赖服务
### Step 4 — 上线后即时 smoke
- [ ] `actuator/health`
- [ ] prestorage `process / attachments`
- [ ] writtenoff get/page
- [ ] bad debt get/page
- [ ] price diff get/page
- [ ] redink get/page
- [ ] redink execute若环境允许
---
## 4. 推荐联调顺序
1. 字典 / 下拉 / label 核对
2. prestorage 全链路
3. writtenoff / bad debt / price diff 审批链路
4. redink 执行链路
5. split / late fee reduce 补充场景
---
## 5. 上线后核验
### 数据核验
- [ ] 新请求是否优先落 formal 表
- [ ] `get/page` 是否优先命中 formal 数据
- [ ] fallback 仅在 formal 缺失时触发
### redink 特别核验
- [ ] 原交易状态是否转为 `REVERSED`
- [ ] follow-up bank 交易是否创建成功
- [ ] formal main/detail 是否同步落表
### prestorage 特别核验
- [ ] `prestorage-process` 返回 formal-first
- [ ] `prestorage-attachments` 返回 formal attachment refs
---
## 6. 回滚 / 降级思路
### 可逆项
- 查询口径改动可回滚为 legacy-fallback 优先
- formal 表为增量对象表,保留不影响旧日志骨架
### 不建议直接回滚项
- 已执行过的 DDL 不建议删除
- 已落表业务数据不应物理删除作为“回滚”手段
### 建议做法
- 保留 schema
- 回退服务代码到上一个稳定版本
- 用 evidence 文档确认受影响对象与链路
---
## 7. 现场问题快速定位
### 若 `get/page` 没命中 formal
检查:
- formal main/detail 是否已落表
- objectType 是否匹配
- adjustmentNo 是否一致
- fallback 是否被触发
### 若 redink execute 报错
检查:
- `business-bank-server` 是否可用
- Nacos 是否注册成功
- 原交易是否存在
- follow-up transaction 是否可写入 `bk_transaction`
### 若 prestorage process/attachments 异常
检查:
- `biz_prestorage_adjust` 是否存在该 adjustmentNo
- `attachmentRefs` 是否为空/格式异常
- ContentAttach 是否存在对应 ID
---
## 8. 对运维 / 测试的简版口径
> REV004 当前主线已完成主要账务对象 formal-table 恢复与查询收口。上线前请优先确认 formal 表结构、Nacos 注册、business-bank-server 可用性,以及对应 evidence 文档中的 smoke 范围。若 redink/refund 需走真实链路,请同时准备原交易测试数据。
---
## 9. 配套文档
- `REV004_FINAL_MAINLINE_DELIVERY_SUMMARY.md`
- `REV004_GO_LIVE_CHECKLIST.md`
- `REV004_CURRENT_TRUTH_MATRIX.md`
- `docs/evidence/rev004-*-formal-table-*.md`
- `docs/evidence/rev004-prestorage-strict-formal-first-2026-04-17.md`

View File

@ -10,7 +10,7 @@
|--------------|--------------|--------------|------------|------|
| 一期纳入范围:水量调整/金额调整/退款/冲正/坏账申请 | `12_REV_Detailed.md` REV-004 场景表 | `03_Interface_Design.md` `IF-REV-007` | `biz_charge*``biz_operat_log*` | 五类场景统一纳入一期,排除独立账务细表扩围 |
| 统一接口入口 | REV-004 接口映射 | `IF-REV-007` 请求/响应定义 | 账单与日志对象 | 不扩展到 `IF-REV-008``IF-REV-011` 等其他接口族 |
| 原交易校验 | REV-004 关键规则 | `sourceTradeNo` 字段 | `bk_transaction*` | 退款/冲正必须联动原交易主状态、回调结果与异常处理状态 |
| 原交易校验 | REV-004 关键规则 | `sourceTradeNo` 字段 | `bk_transaction*`;业务支付事实目标层 `biz_payment_record*` | 退款/冲正必须联动原业务支付事实、渠道交易主状态、回调结果与异常处理状态;支付主域归 `REV-003`/`SYS-009`REV-004 仅引用 |
| 处理结果回写 | REV-004 业务流程/关键规则 | `writeBackStatus``resultStatus` | `biz_charge` 状态承接 | `resultStatus``writeBackStatus` 必须分离表达 |
| 审批边界 | 审批留痕要求 | `approvalRequired``PENDING_APPROVAL` | 仅能力位,无独立审批表要求 | 一期不强接 BPM仅保留边界说明 |
| 留痕与依据 | 操作日志与审批留痕 | `remark``attachmentList` | `biz_operat_log` / `biz_operat_log_detail` | 必须覆盖处理类型、原交易引用、前后差异与附件依据 |

View File

@ -121,12 +121,23 @@
- 处理方式
- 原始处理痕迹
### 4.3 当前仍需进一步核实的字段
### 4.3 支付字段分层补充
旧支付域字段需要区分“业务支付事实”和“渠道交易事实”:
| 旧字段/语义 | REV-003 目标承接 | SYS-009 渠道承接 | 说明 |
|---|---|---|---|
| `PM_PAY_DETAILS.ActualMoney` 实收金额 | `biz_payment_record.payment_amount``biz_payment_record_detail.allocated_amount` | `bk_transaction*` 的渠道实付金额 | 业务实收与渠道到账可同值但语义不同,迁移校验需分别比对 |
| `PM_PAY_DETAILS.SoldMoney` 实销/核销金额 | `biz_payment_record_detail.allocated_amount` | - | 用于表达收款分配到账单/费用组成的核销结果 |
| 滞纳金/违约金金额 | `biz_payment_record_detail.detail_type = LATE_FEE` 或等价分类字段 | - | 不应只落入渠道交易总额,需能追溯本金与违约金分配 |
| 原流水号/渠道单号 | `biz_payment_record.source_transaction_no` | `bk_transaction*` 主交易号/渠道单号 | REV-003 保存业务引用SYS-009 保存渠道事实 |
### 4.4 当前仍需进一步核实的字段
以下字段建议进入下一轮字段核实清单:
- `CT_ACCOUNTS.Deposit / UnCheckMoney / Overdraft` 在当前 backend 的精确落点
- `PM_PAY_DETAILS.ActualMoney``bk_transaction*` 的最终字段承接方式
- `PM_PAY_DETAILS.ActualMoney``biz_payment_record.payment_amount` / `biz_payment_record_detail.allocated_amount``bk_transaction*` 的最终分层承接方式
- `IV_INVOICE_INFOS.SerialNo` 与当前发票协同请求号 / 受理号的对应关系
- `IV_INVOICE_INFOS.CndnCode / CndnNumber` 在当前新模型中的正式字段名

View File

@ -24,10 +24,10 @@
| `AT_CHARGE_DETAILS` | 营业账明细 | 账单费用组成、水量、金额、开票状态 | `ChargeAggregate` | `biz_charge_detail` | `online-main` | `implemented` | `reuse` | 明细层已存在稳定承接对象 |
| `CT_ACCOUNTS` | 账户信息 | 预存余额、未到账金额、透支额度 | `AccountBalance` | `biz_account` / 账户相关对象 | `online-main` | `partial` | `extend` | 需进一步确认与旧 `CT_ACCOUNTS` 字段对齐程度 |
| `CT_ACCOUNT_LOGS` | 账户流水 | 预存进出、余额变化、暂收流水 | `AccountTransaction` | `legacy_account_log_mapping` + 账户流水承接对象 | `mapping-layer` + `history-readonly` | `partial` | `extend` | 当前 `REV-004` 正式主口径未把账户流水建成核心在线对象 |
| `PM_PAY_COLLECTS` | 收费汇总 | 结账周期、收费总笔数、总金额、柜员/网点汇总 | `CollectionSummary` | `biz_collection` + 汇总查询结果 | `online-main` + `history-readonly` | `partial` | `extend` | 汇总语义可承接,旧统计台账宜只读保留 |
| `PM_PAY_SUBTOTALS` | 收费小计 | 按渠道、收费类型、收退标识的小计结果 | `CollectionSummary` | `biz_collection` + 汇总查询结果 | `history-readonly` | `readonly` | `retain-readonly` | 不建议为旧小计表单独在线重建 |
| `PM_PAY_DETAILS` | 收费明细 | 实收、实销、滞纳金、红冲关联、收费员 | `Transaction` / `CollectionDetail` | `bk_transaction*` + 收费结果关系 | `online-main` + `mapping-layer` | `partial` | `extend` | 需补旧收费明细到新交易对象的映射关系 |
| `AT_REFUNDS` | 退款账 | 退款金额、退款状态、退款时间、退款人 | `AccountingRequest` / `Transaction` | `IF-REV-007` 退款场景 + `bk_transaction*` | `online-main` + `mapping-layer` | `partial` | `extend` | 退款语义已有,旧退款账未见独立在线对象 |
| `PM_PAY_COLLECTS` | 收费汇总 | 结账周期、收费总笔数、总金额、柜员/网点汇总 | `CollectionSummary` | `biz_collection` + 目标/原型 `biz_payment_record*` + 汇总查询结果 | `online-main` + `history-readonly` | `partial` | `extend` | 汇总语义可由 REV-003 支付事实目标层和报表承接,旧统计台账宜只读保留 |
| `PM_PAY_SUBTOTALS` | 收费小计 | 按渠道、收费类型、收退标识的小计结果 | `CollectionSummary` | 目标/原型 `biz_payment_record*` + `biz_collection` + 汇总查询结果 | `history-readonly` / target-projection | `partial` | `retain-readonly` | 不建议为旧小计表单独在线重建;新发生业务应从 REV-003 支付事实目标层汇总生成 |
| `PM_PAY_DETAILS` | 收费明细 | 实收、实销、滞纳金、红冲关联、收费员 | `PaymentRecord` / `PaymentRecordDetail` / `Transaction` | REV-003 目标/原型 `biz_payment_record``biz_payment_record_detail` + SYS-009 `bk_transaction*` | `online-main` + `mapping-layer` | `partial` | `extend` | 业务支付事实和分配明细优先映射到 REV-003渠道流水仅承接支付渠道事实 |
| `AT_REFUNDS` | 退款账 | 退款金额、退款状态、退款时间、退款人 | `AccountingRequest` / `PaymentRecord` / `Transaction` | `IF-REV-007` 退款场景 + REV-003 目标/原型 `biz_payment_record*` + `bk_transaction*` | `online-main` + `mapping-layer` | `partial` | `extend` | 退款由 REV-004 发起处理,但原支付事实来自 REV-003渠道退款/原流水来自 SYS-009 |
| `PM_ACCOUNT_RECORDS` | 预存退款汇总 | 预存退款申请单、申请人、流程审批信息 | `AccountingRequest` | `legacy_finance_record_mapping` | `mapping-layer` + `history-readonly` | `partial` | `extend` | 在线保留申请语义,旧审批字段按只读保留 |
| `PM_ACCOUNT_RECORD_DETAILS` | 预存退款详情 | 客户、退款金额、原流水、目标流水、处理方式 | `AccountingEvidence` / `Transaction` | `legacy_finance_record_mapping` + `bk_transaction*` | `mapping-layer` + `history-readonly` | `partial` | `extend` | 需要重点保留原流水、目标流水和退款金额映射 |
| `PM_AMOUNT_RECORDS` | 调整减免汇总 | 水量/金额调整申请、原因、流程审批 | `AccountingRequest` | `IF-REV-007` 调整场景 + `legacy_finance_record_mapping` | `mapping-layer` + `history-readonly` | `partial` | `extend` | 新系统已有统一入口,但旧申请单结构未一对一承接 |
@ -35,7 +35,7 @@
| `PM_PRICE_RECORDS` | 价差调整汇总 | 调价差额修正申请、调价号、原因、审批 | `AccountingRequest` | `legacy_finance_record_mapping` | `mapping-layer` + `history-readonly` | `partial` | `extend` | 汇总申请宜按迁移映射保留 |
| `PM_PRICE_RECORD_DETAILS` | 价差调整明细 | 原账单、新账单、调价前后金额、滞纳金差额 | `ChargeAggregate` / `AccountingEvidence` | `biz_charge` / `biz_charge_detail` + 映射层 | `online-main` + `mapping-layer` | `partial` | `extend` | 语义已部分被账单重算能力承接 |
| `PM_PAYMENT_RECORDS` | 已销调整汇总 | 已收费后修正申请单、原因、流程 | `AccountingRequest` | `legacy_finance_record_mapping` | `mapping-layer` + `history-readonly` | `partial` | `extend` | 不建议按旧汇总表在线重建 |
| `PM_PAYMENT_RECORD_DETAILS` | 已销调整明细 | 原账单、新账单、实收金额、抵扣金额、退款人员 | `AccountingEvidence` / `Transaction` | `IF-REV-007` 冲正场景 + `bk_transaction*` + 映射层 | `online-main` + `mapping-layer` | `partial` | `extend` | 与冲正、退款、原交易校验强相关 |
| `PM_PAYMENT_RECORD_DETAILS` | 已销调整明细 | 原账单、新账单、实收金额、抵扣金额、退款人员 | `AccountingEvidence` / `PaymentRecordDetail` / `Transaction` | `IF-REV-007` 冲正场景 + REV-003 目标/原型 `biz_payment_record_detail` + `bk_transaction*` + 映射层 | `online-main` + `mapping-layer` | `partial` | `extend` | 与冲正、退款、原交易校验强相关REV-004 引用支付明细但不拥有支付主域 |
| `PM_KNOTTY_RECORDS` | 呆坏账汇总 | 坏账申请单、申请原因、审批流程 | `AccountingRequest` | `IF-REV-007` 坏账场景 + `legacy_finance_record_mapping` | `mapping-layer` + `history-readonly` | `partial` | `extend` | 坏账申请语义已有,旧流程单需映射保留 |
| `PM_KNOTTY_RECORD_DETAILS` | 呆坏账明细 | 账单、账期、坏账金额、处理人、处理时间 | `AccountingEvidence` / `AccountingResult` | `biz_charge` + `biz_operat_log*` + 映射层 | `online-main` + `mapping-layer` | `partial` | `extend` | 需保留账龄、原因、结果和核销状态 |
| `PM_LATEFEE_RECORDS` | 违约金减免汇总 | 滞纳金减免申请、原因、审批 | `AccountingRequest` | `legacy_finance_record_mapping` | `mapping-layer` + `history-readonly` | `readonly` | `retain-readonly` | 当前一期不建议独立在线化 |

View File

@ -45,21 +45,21 @@
### 3.1 数量校验
- [ ] `PM_PAY_COLLECTS``PM_PAY_SUBTOTALS``PM_PAY_DETAILS` 迁移或承接数量已核对
- [ ] 旧收费明细与新交易对象 / 收费承接对象数量差异已解释
- [ ] `PM_PAY_COLLECTS``PM_PAY_SUBTOTALS``PM_PAY_DETAILS` 迁移或承接数量已核对,并区分 REV-003 业务支付事实目标层、SYS-009 渠道交易事实与历史只读投影
- [ ] 旧收费明细与新业务支付事实目标对象 / 渠道交易对象 / 收费承接对象数量差异已解释
- [ ] 实时收费日志如仅保留历史只读,其归档记录数已校对
### 3.2 金额校验
- [ ] 旧收费明细 `ActualMoney` 汇总与新交易金额汇总一致
- [ ] 旧收费明细 `SoldMoney` 汇总与核销金额汇总一致,或差异已解释
- [ ] 旧收费明细 `ActualMoney` 汇总与 REV-003 业务支付金额、SYS-009 渠道交易金额分别核对一致,或差异已解释
- [ ] 旧收费明细 `SoldMoney` 汇总与 REV-003 支付分配/核销金额汇总一致,或差异已解释
- [ ] 旧收费汇总 `TotalMoney` 与新汇总结果一致
- [ ] 第三方交易流水涉及的金额抽样与新交易对象一致
### 3.3 关系校验
- [ ] 每笔收费明细都能追到原账单或新账单映射
- [ ] 每笔收费明细的重要流水号都能追到新交易对象
- [ ] 每笔收费明细都能追到原账单或新账单映射,并能追到 REV-003 业务支付事实目标对象或历史只读投影
- [ ] 每笔收费明细的重要流水号都能追到 SYS-009 新交易对象,且与 REV-003 业务支付记录引用关系一致
- [ ] 若存在红冲引用,原收费记录与后续记录链条未断裂
### 3.4 抽样校验

View File

@ -0,0 +1,73 @@
-- REV004 account adjust dictionaries
-- Target DB: sw_system (PostgreSQL)
-- Purpose:
-- 1) Reuse existing legacy reason/type/proc/business dictionaries
-- 2) Add the minimal new dictionaries needed for REV004 object/status semantics
-- Note:
-- This script is idempotent by (type) and (dict_type, value) checks.
BEGIN;
-- ============================================================
-- 1. Dict types
-- ============================================================
INSERT INTO system_dict_type (name, type, status, remark, creator, updater, category)
SELECT v.name, v.type, 0, v.remark, 'omx', 'omx', 'REV004'
FROM (VALUES
('红冲原因', 'redink_reason', 'REV004 红冲/冲正原因'),
('账务调整对象类型', 'account_adjust_object_type', 'REV004 objectType 字典'),
('账务调整结果状态', 'account_adjust_result_status', 'REV004 resultStatus 字典'),
('账务调整审批状态', 'account_adjust_approval_status', 'REV004 approvalStatus 字典'),
('账务调整回写状态', 'account_adjust_writeback_status', 'REV004 writeBackStatus 字典')
) AS v(name, type, remark)
WHERE NOT EXISTS (
SELECT 1 FROM system_dict_type t WHERE t.type = v.type AND t.deleted = 0
);
-- ============================================================
-- 2. Dict data
-- ============================================================
INSERT INTO system_dict_data (sort, label, value, dict_type, status, color_type, css_class, remark, creator, updater)
SELECT v.sort, v.label, v.value, v.dict_type, 0, v.color_type, v.css_class, v.remark, 'omx', 'omx'
FROM (VALUES
-- redink_reason
(10, '收费错误', '1', 'redink_reason', 'danger', '', 'REV004 红冲原因'),
(20, '用户拒缴', '2', 'redink_reason', 'warning', '', 'REV004 红冲原因'),
(30, '银行撤销', '3', 'redink_reason', 'warning', '', 'REV004 红冲原因'),
(40, '网络异常', '4', 'redink_reason', 'info', '', 'REV004 红冲原因'),
(90, '其它', '9', 'redink_reason', 'default', '', 'REV004 红冲原因'),
-- account_adjust_object_type
(10, '预付费退款', 'PREPAID_REFUND', 'account_adjust_object_type', 'success', '', 'REV004 objectType'),
(20, '红冲记录', 'REDINK_RECORD', 'account_adjust_object_type', 'danger', '', 'REV004 objectType'),
(30, '坏账申请', 'BAD_DEBT_RECORD', 'account_adjust_object_type', 'warning', '', 'REV004 objectType'),
(40, '核销调整', 'WRITTENOFF_ADJUST', 'account_adjust_object_type', 'warning', '', 'REV004 objectType'),
(50, '价差调整', 'PRICE_DIFF_ADJUST', 'account_adjust_object_type', 'info', '', 'REV004 objectType'),
(60, '违约金减免', 'LATE_FEE_REDUCE', 'account_adjust_object_type', 'info', '', 'REV004 objectType'),
(70, '账单拆分', 'SPLIT_ADJUST', 'account_adjust_object_type', 'primary', '', 'REV004 objectType'),
-- account_adjust_result_status
(10, '成功', 'SUCCESS', 'account_adjust_result_status', 'success', '', 'REV004 resultStatus'),
(20, '待审批', 'PENDING_APPROVAL', 'account_adjust_result_status', 'warning', '', 'REV004 resultStatus'),
(30, '失败', 'FAIL', 'account_adjust_result_status', 'danger', '', 'REV004 resultStatus'),
-- account_adjust_approval_status
(10, '无需审批', 'NOT_REQUIRED', 'account_adjust_approval_status', 'default', '', 'REV004 approvalStatus'),
(20, '待审批', 'PENDING_APPROVAL', 'account_adjust_approval_status', 'warning', '', 'REV004 approvalStatus'),
(30, '审批通过', 'APPROVED', 'account_adjust_approval_status', 'success', '', 'REV004 approvalStatus'),
(40, '审批驳回', 'REJECTED', 'account_adjust_approval_status', 'danger', '', 'REV004 approvalStatus'),
-- account_adjust_writeback_status
(10, '已回写', 'UPDATED', 'account_adjust_writeback_status', 'success', '', 'REV004 writeBackStatus'),
(20, '待回写', 'PENDING', 'account_adjust_writeback_status', 'warning', '', 'REV004 writeBackStatus'),
(30, '已跳过', 'SKIPPED', 'account_adjust_writeback_status', 'default', '', 'REV004 writeBackStatus')
) AS v(sort, label, value, dict_type, color_type, css_class, remark)
WHERE NOT EXISTS (
SELECT 1
FROM system_dict_data d
WHERE d.dict_type = v.dict_type
AND d.value = v.value
AND d.deleted = 0
);
COMMIT;