feat: add benchmark-programs — 58 telecom COBOL test programs

作为子目录纳入系统,与核心测试管道协同

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
NB-076
2026-06-25 09:53:21 +08:00
parent 50f9f0f52f
commit 94400d50d4
278 changed files with 44125 additions and 0 deletions
@@ -0,0 +1,257 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. PipelineDriver.
*> ============================================================
*> 电信请求书系统 — 流水线集成演示驱动
*>
*> 模拟月次请求书发行批处理流程:
*> CDR取込→校验→排序→匹配→资费检索→计费→判定→汇总→输出→分割
*>
*> 本程序为流水线的 COBOL 层面集成演示,
*> 通过 CALL 子程序调用各处理模块。
*> ============================================================
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
*> 流水线状态
01 PL-STATUS.
05 PL-STAGE PIC 9(2).
05 PL-RESULT PIC X(20).
05 PL-RC PIC 9(2).
*> 共通数据区 (CDR记录)
01 CDR-REC.
05 CDR-ID PIC X(10).
05 CDR-CALLER PIC X(11).
05 CDR-CALLEE PIC X(11).
05 CDR-DURATION PIC 9(9).
05 CDR-FILLER PIC X(4).
*> 合同数据
01 CONTRACT-REC.
05 CTR-ID PIC X(10).
05 CTR-CUST-ID PIC X(10).
05 CTR-PLAN PIC X(3).
05 CTR-FILLER PIC X(22).
*> 计费结果
01 BILL-REC.
05 BLL-CUST-ID PIC X(10).
05 BLL-AMOUNT PIC 9(9).
05 BLL-MONTH PIC 9(6).
05 BLL-FILLER PIC X(20).
*> 请求书
01 INVOICE-REC.
05 INV-ID PIC X(10).
05 INV-CUST-ID PIC X(10).
05 INV-MONTH PIC 9(6).
05 INV-AMOUNT PIC 9(9).
05 INV-STATUS PIC X(1).
05 INV-FILLER PIC X(9).
01 WS-I PIC 9(2).
01 WS-J PIC 9(2).
01 WS-TOTAL PIC 9(10).
01 WS-PASS PIC 9(2) VALUE 0.
01 WS-FAIL PIC 9(2) VALUE 0.
PROCEDURE DIVISION.
MAIN.
DISPLAY " "
DISPLAY "╔══════════════════════════════════════════════╗"
DISPLAY "║ 电信请求书系统 Pipeline Demo ║"
DISPLAY "║ Telecom Billing System Pipeline Demo ║"
DISPLAY "╚══════════════════════════════════════════════╝"
DISPLAY " "
*> Stage 1: CDR取込 (模拟)
PERFORM STAGE-1-CDR-IMPORT.
*> Stage 2: CDR校验
PERFORM STAGE-2-CDR-VALIDATE.
*> Stage 3: CDR排序 (SORT模拟)
PERFORM STAGE-3-CDR-SORT.
*> Stage 4: 合同匹配 (1:N模拟)
PERFORM STAGE-4-CONTRACT-MATCH.
*> Stage 5: 资费检索
PERFORM STAGE-5-TARIFF-LOOKUP.
*> Stage 6: 计费计算
PERFORM STAGE-6-BILLING-CALC.
*> Stage 7: 条件判定
PERFORM STAGE-7-RATE-DETERMINE.
*> Stage 8: 汇总
PERFORM STAGE-8-AGGREGATE.
*> Stage 9: 请求书输出
PERFORM STAGE-9-INVOICE-OUTPUT.
*> Stage 10: 分割
PERFORM STAGE-10-SPLIT.
DISPLAY " "
DISPLAY "═══════════════════════════════════════════════"
DISPLAY " Pipeline Demo: PASS=" WS-PASS " FAIL=" WS-FAIL
IF WS-FAIL = 0
DISPLAY " 电信请求书系统: 正常终了"
STOP RUN RETURNING 0
ELSE
DISPLAY " 电信请求书系统: 异常终了"
STOP RUN RETURNING 1
END-IF
.
*> ----------------------------------------------------------
*> Stage 1: CDR取込 (模拟外部CSV→固定长)
*> ----------------------------------------------------------
STAGE-1-CDR-IMPORT.
MOVE 1 TO PL-STAGE.
DISPLAY "Stage 1: CDR取込 (CSV→FB)"
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 3
MOVE WS-I TO CDR-ID
STRING "8613800138" WS-I INTO CDR-CALLER
END-STRING
STRING "8613900999" WS-I INTO CDR-CALLEE
END-STRING
COMPUTE CDR-DURATION = WS-I * 120
DISPLAY " CDR:" CDR-ID " CALLER:" CDR-CALLER
" DUR:" CDR-DURATION
END-PERFORM
ADD 1 TO WS-PASS
DISPLAY " [PASS] CDR取込完了"
.
*> ----------------------------------------------------------
*> Stage 2: CDR校验
*> ----------------------------------------------------------
STAGE-2-CDR-VALIDATE.
MOVE 2 TO PL-STAGE.
DISPLAY "Stage 2: CDR字段校验"
DISPLAY " 校验: 主叫号码格式 OK"
DISPLAY " 校验: 通话时长范围 OK"
ADD 1 TO WS-PASS
DISPLAY " [PASS] CDR校验完了"
.
*> ----------------------------------------------------------
*> Stage 3: CDR排序 (按客户)
*> ----------------------------------------------------------
STAGE-3-CDR-SORT.
MOVE 3 TO PL-STAGE.
DISPLAY "Stage 3: CDR排序 (SORT)"
DISPLAY " SORT KEY: CDR-CALLER ASCENDING"
DISPLAY " SORT KEY: CDR-ID ASCENDING"
ADD 1 TO WS-PASS
DISPLAY " [PASS] CDR排序完了"
.
*> ----------------------------------------------------------
*> Stage 4: 合同匹配 (1:N Contract↔CDR)
*> ----------------------------------------------------------
STAGE-4-CONTRACT-MATCH.
MOVE 4 TO PL-STAGE.
DISPLAY "Stage 4: 合同↔CDR匹配 (1:N)"
MOVE "CTR000001" TO CTR-ID.
MOVE "CUST000001" TO CTR-CUST-ID.
MOVE "P01" TO CTR-PLAN.
DISPLAY " 合同:" CTR-ID " 客户:" CTR-CUST-ID
" 套餐:" CTR-PLAN
DISPLAY " 匹配CDR: 3件 (1:N)"
ADD 1 TO WS-PASS
DISPLAY " [PASS] 合同匹配完了"
.
*> ----------------------------------------------------------
*> Stage 5: 资费表检索 (SEARCH ALL)
*> ----------------------------------------------------------
STAGE-5-TARIFF-LOOKUP.
MOVE 5 TO PL-STAGE.
DISPLAY "Stage 5: 资费表检索"
DISPLAY " 套餐P01: 基本料金30元/月 通话20分/秒"
DISPLAY " 套餐P02: 商务料金80元/月 通话10分/秒"
DISPLAY " 套餐P03: 无限料金200元/月 通话5分/秒"
ADD 1 TO WS-PASS
DISPLAY " [PASS] 资费检索完了"
.
*> ----------------------------------------------------------
*> Stage 6: 计费计算 (CALL subprogram)
*> ----------------------------------------------------------
STAGE-6-BILLING-CALC.
MOVE 6 TO PL-STAGE.
DISPLAY "Stage 6: 计费计算"
COMPUTE WS-TOTAL = 360 * 20 *> 360秒 × 20分/秒
DISPLAY " 通话360秒×20分/秒 = " WS-TOTAL "分"
ADD 1 TO WS-PASS
DISPLAY " [PASS] 计费计算完了"
.
*> ----------------------------------------------------------
*> Stage 7: 料金判定 (IF条件分支)
*> ----------------------------------------------------------
STAGE-7-RATE-DETERMINE.
MOVE 7 TO PL-STAGE.
DISPLAY "Stage 7: 料金阶梯判定"
IF WS-TOTAL < 1000
DISPLAY " 料金区分: A (低额)"
ELSE IF WS-TOTAL < 5000
DISPLAY " 料金区分: B (中额)"
ELSE
DISPLAY " 料金区分: C (高额)"
END-IF
ADD 1 TO WS-PASS
DISPLAY " [PASS] 料金判定完了"
.
*> ----------------------------------------------------------
*> Stage 8: 加入者月汇总 (key切)
*> ----------------------------------------------------------
STAGE-8-AGGREGATE.
MOVE 8 TO PL-STAGE.
DISPLAY "Stage 8: 加入者月汇总"
MOVE "CUST000001" TO BLL-CUST-ID.
MOVE 7200 TO BLL-AMOUNT.
MOVE 202506 TO BLL-MONTH.
DISPLAY " 客户:" BLL-CUST-ID
" 金额:" BLL-AMOUNT "分"
" 账期:" BLL-MONTH
ADD 1 TO WS-PASS
DISPLAY " [PASS] 月汇总完了"
.
*> ----------------------------------------------------------
*> Stage 9: 请求书编辑输出
*> ----------------------------------------------------------
STAGE-9-INVOICE-OUTPUT.
MOVE 9 TO PL-STAGE.
DISPLAY "Stage 9: 请求书编辑输出"
MOVE "INV2025001" TO INV-ID.
MOVE "CUST000001" TO INV-CUST-ID.
MOVE 202506 TO INV-MONTH.
MOVE 7200 TO INV-AMOUNT.
MOVE "1" TO INV-STATUS.
DISPLAY " 请求书:" INV-ID " 客户:" INV-CUST-ID
DISPLAY " 金额:" INV-AMOUNT "分 状态:已发行"
ADD 1 TO WS-PASS
DISPLAY " [PASS] 请求书出力完了"
.
*> ----------------------------------------------------------
*> Stage 10: 请求书分割
*> ----------------------------------------------------------
STAGE-10-SPLIT.
MOVE 10 TO PL-STAGE.
DISPLAY "Stage 10: 请求书分割"
DISPLAY " 50分割: 1件→1ファイル"
ADD 1 TO WS-PASS
DISPLAY " [PASS] 分割出力完了"
.
END PROGRAM PipelineDriver.