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
+37
View File
@@ -0,0 +1,37 @@
# 电信请求书系统 — 批处理流水线
## 概要
端到端月次请求书发行批处理流程。模拟从外部系统CDR取込到请求书分割输出的完整处理链。
## 流水线阶段
| 阶段 | 类型 | 功能 | COBOL类型 |
|------|------|------|-----------|
| 1 | `15-csv-fb-nolf` | 外部CDR CSV取込(固定长変換) | CSV→FB |
| 2 | `13-validation-nodup` | CDR字段校验 | 校验(不含重复) |
| 3 | `34-sort` | CDR排序(按客户/时间) | SORT |
| 4 | `02-matching-1-N` | 合同↔CDR关联(1:N) | 1:N匹配 |
| 5 | `24-table-search` | 资费表检索(套餐单价) | 内部表检索 |
| 6 | `25-subprogram` | 计费计算(时长×单价) | 子程序 |
| 7 | `05-branch-if` | 料金阶梯判定 | IF分支 |
| 8 | `07-keybreak-summary` | 加入者月汇总 | key切汇总 |
| 9 | `04-edit-getput` | 请求书编辑输出 | 编辑输出 |
| 10 | `10-divide-50` | 请求书50分割 | 50分割 |
## 执行
```bash
cd pipeline && bash run-pipeline.sh
```
## 前提条件
- GnuCOBOL (cobc) 在 PATH 中
- 各类型目录已编译
## 验证方法
1. 各阶段rc=0确认
2. 输出文件存在确认
3. 请求书记录数确认
@@ -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.
+16
View File
@@ -0,0 +1,16 @@
# 电信请求书系统 — 流水线配置
# Telecom Billing System — Pipeline Configuration
# 流水线阶段定义 (按执行顺序)
# 格式: STAGE=<编号>,<类型目录>,<输入文件>,<输出文件>,<参数>
STAGE=01,TYPE=15-csv-fb-nolf,INPUT=cdr-raw.csv,OUTPUT=cdr-fixed.dat,DESC=CDR取込(外部CSV→固定长)
STAGE=02,TYPE=13-validation-nodup,INPUT=cdr-fixed.dat,OUTPUT=cdr-validated.dat,DESC=CDR字段校验
STAGE=03,TYPE=34-sort,INPUT=cdr-validated.dat,OUTPUT=cdr-sorted.dat,DESC=CDR排序(按客户/时间)
STAGE=04,TYPE=02-matching-1-N,INPUT=cdr-sorted.dat,OUTPUT=matched-cdr.dat,DESC=合同↔CDR匹配(1:N)
STAGE=05,TYPE=24-table-search,INPUT=tariff-query.dat,OUTPUT=tariff-result.dat,DESC=资费表检索
STAGE=06,TYPE=25-subprogram,INPUT=matched-cdr.dat,OUTPUT=billed-cdr.dat,DESC=计费计算(时长×单价)
STAGE=07,TYPE=05-branch-if,INPUT=billed-cdr.dat,OUTPUT=rated-output.dat,DESC=料金阶梯判定(IF)
STAGE=08,TYPE=07-keybreak-summary,INPUT=rated-output.dat,OUTPUT=monthly-summary.dat,DESC=加入者月汇总(key切)
STAGE=09,TYPE=04-edit-getput,INPUT=monthly-summary.dat,OUTPUT=invoice-output.dat,DESC=请求书编辑输出
STAGE=10,TYPE=10-divide-50,INPUT=invoice-output.dat,OUTPUT=split-output/,DESC=请求书50分割