Files
cobol-java-v3/benchmark-programs/pipeline/main-pipeline-driver.cbl
NB-076 94400d50d4 feat: add benchmark-programs — 58 telecom COBOL test programs
作为子目录纳入系统,与核心测试管道协同

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-25 09:53:21 +08:00

258 lines
9.5 KiB
COBOL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.