Files
cobol-java-v3/detailed-design-docs/design_KIN09CSV.md
T
hangshuo652 b94757d9df feat: V3系统评审问题修复
1. 场景价值与技术合理性修复:
   - 补充docs/SCENE_VALUE.md(业务背景、痛点分析、用户场景、竞品对比、价值量化)
   - 添加用户操作流程图(Mermaid)
   - 添加3个真实业务案例量化数据

2. 演示与文档修复:
   - 创建docs/API.md(完整API文档)
   - 创建docs/QUICKSTART.md(5分钟快速入门指南)

3. AI使用日志修复:
   - 更新AGENTS.md,添加强制自动执行的AI使用日志记录指令
   - 在_AI_USAGE_LOG.md末尾添加范式执行统计

4. 安全性修复:
   - 在agents/llm.py中添加输入过滤(防Prompt注入)
   - 添加输出验证、速率限制、详细日志

5. 架构设计修复:
   - 创建tools/registry.py工具注册表
   - 修改orchestrator.py和orchestrator_db.py使用注册表动态获取运行器

6. 开发范式修复:
   - 在_AI_USAGE_LOG.md末尾添加范式执行统计
2026-08-29 13:23:28 +08:00

208 lines
7.4 KiB
Markdown
Raw 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.
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 勤怠休暇管理システム |
| 2 | プログラムID | KIN09CSV |
| 3 | プログラム名 | 勤怠CSV出力処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | GETPUT(編集出力) |
| 6 | 機能概要 | DAILY_RECORDSをDBからSELECTし、STRING WITH POINTERでCSV行を編集、WRITE AFTER ADVANCINGPAGE/2 LINES/1 LINE)で出力する。INSPECT REPLACINGでCSV危険文字をサニタイズする。 |
### 前提条件
| NO | 対象ファイル/DB | 条件 |
|----|----------------|------|
| 1 | DAILY_RECORDS | KIN08DBUにより当月勤怠データが登録済みであること |
| 2 | MONTHLY_ABSENCE | KIN08DBUにより当月集計が完了していること |
| 3 | PARM | YEARMONTH=YYYYMM は必須。省略時はABEND |
### PARM引数
コマンドラインで以下の形式で指定。
```
YEARMONTH=202605,MODE=FULL
```
| パラメータ | 必須 | デフォルト | 説明 |
|-----------|:---:|:--------:|------|
| YEARMONTH | ○ | — | 処理対象年月(YYYYMM形式) |
| MODE | ○ | FULL | FULL=日別+月次全項目出力, SHORT=月次集計のみ |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|
| 1 | CSV-OUTPUT | OUTREC | KIN09W01 | O | KIN09REC | FB | | 200 | PS |
### 使用DBテーブル
| NO | テーブル名 | 処理内容 |
|----|-----------|---------|
| 1 | DAILY_RECORDS | SELECT WHERE TARGET_DATE LIKE 'YYYYMM%' ORDER BY EMP_ID, TARGET_DATE |
| 2 | MONTHLY_ABSENCE | SELECT WHERE YEAR_MONTH = :WS-YEAR-MONTH ORDER BY EMP_ID |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC |
| 2 | ABEND処理SUB | SUB03END | ZANENDAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.PARM解析(ACCEPT FROM COMMAND-LINE
INSPECT WS-PARM TALLYING WS-COMMA-CNT FOR ALL ','
IF WS-COMMA-CNT < 1
DISPLAY 'WARNING: Missing MODE, using FULL'
END-IF
UNSTRING WS-PARM DELIMITED BY ','
INTO WS-PARM1 WS-PARM2
END-UNSTRING
UNSTRING WS-PARM1 DELIMITED BY '='
INTO WS-KEY1 WS-VALUE1
END-UNSTRING
UNSTRING WS-PARM2 DELIMITED BY '='
INTO WS-KEY2 WS-VALUE2
END-UNSTRING
YEARMONTH設定、MODE設定(FULL/SHORT判定)
必須チェック:YEARMONTH未設定 → ABEND(CALL SUB03END)
1-4.ワークエリア初期化
1-5.DB接続(EXEC SQL CONNECT TO 'data/kin.db'
1-6.出力ファイルOPENKIN09W01
1-7.ヘッダー行書出(WRITE AFTER ADVANCING PAGE
社員番号,日付,出勤時刻,退勤時刻,休暇種別,
年休時間,事假時間,因公特批假時間,病欠時間,未申請欠勤時間
2.主処理(2000MAJSOR)(FETCH EOFまで下記を繰り返す)
2-1.CURSOR FETCHDAILY_RECORDS
2-2.CSV危険文字サニタイズ(INSPECT REPLACING
MOVE 各項目を退避 → WS-SAFE-FIELD
INSPECT WS-SAFE-FIELD REPLACING ALL ',' BY ';'
ALL X"0D" BY SPACE
ALL X"0A" BY SPACE
2-3.CSV行編集(STRING WITH POINTER
MOVE 1 TO WS-PTR
STRING
WS-EMP-ID DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-DATE DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-TIME-IN DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-TIME-OUT DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-LEAVE-TYPE DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-ANNUAL-H DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-PERSONAL-H DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-OFFICIAL-H DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-SICK-H DELIMITED BY SIZE
',' DELIMITED BY SIZE
WS-ABSENT-H DELIMITED BY SIZE
INTO WS-CSV-LINE WITH POINTER WS-PTR
END-STRING
2-4.行数カウンタ加算
2-5.100行ごとにヘッダー再出力(WRITE AFTER ADVANCING 2 LINES + ヘッダー行)
100件毎 → WRITE WS-SEC-REC AFTER ADVANCING 2 LINES
WRITE WS-HDR-REC AFTER ADVANCING 1 LINE
2-6.データ行出力(WRITE AFTER ADVANCING 1 LINE
WRITE WS-OUT-REC FROM WS-CSV-LINE AFTER ADVANCING 1 LINE
3.MODE=SHORT時のみ追加処理(2500-SHORT-MODE
3-1.MONTHLY_ABSENCE CURSOR OPEN
3-2.STRINGで集計行編集
3-3.セクション区切り出力
WRITE WS-SEC-REC AFTER ADVANCING 2 LINES
3-4.集計行出力
WRITE WS-OUT-REC AFTER ADVANCING 1 LINE
4.終了処理(3000STPSOR
4-1.CURSOR CLOSE
4-2.DB切断
4-3.出力ファイルCLOSE
4-4.出力件数メッセージ出力
【メッセージ編集】
メッセージ番号:6(出力件数)
PARM1'CSV-OUTPUT'
PARM2CUN-W01OUT(出力行数)
4-5.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
### WRITE AFTER ADVANCING 3種の使い分け
| タイミング | 構文 | 説明 |
|-----------|------|------|
| ファイル先頭 | WRITE header-rec AFTER ADVANCING PAGE | 改ページ(最初のヘッダー) |
| 100行ごと | WRITE sep-rec AFTER ADVANCING 2 LINES | セクション区切り(空行2行) |
| 100行ごと | WRITE header-rec AFTER ADVANCING 1 LINE | 再ヘッダー出力 |
| データ行 | WRITE data-rec AFTER ADVANCING 1 LINE | 通常データ行 |
---
## 出力レコード定義
### CSV-OUTPUTOUTREC/KIN09REC200B FB
| No | 項目名 | 設定元 | 属性 | 備考 |
|----|--------|--------|------|------|
| 1 | CSV-LINE | STRING編集結果 | X(200) | CSV1行分の文字列データ |
---
## CSVフォーマット
ヘッダー行(WRITE AFTER ADVANCING PAGEで出力):
```
社員番号,日付,出勤時刻,退勤時刻,休暇種別,年休時間,事假時間,因公特批假時間,病欠時間,未申請欠勤時間
```
データ行:
```
00000101,20260501,0900,1800,99,0.0,0.0,0.0,0.0,0.0
00000101,20260502,0900,1300,02,0.0,4.0,0.0,0.0,4.0
```
MODE=SHORT時の集計行(WRITE AFTER ADVANCING 2 LINESで区切り):
```
社員番号,年月,年休計,事假計,因公特批假計,病欠計,未申請欠勤計
00000101,202605,8.0,4.0,0.0,0.0,4.0
```
---
## カバレッジ構文一覧
| 構文 | 用途 |
|------|------|
| ACCEPT FROM COMMAND-LINE | PARM解析 |
| INSPECT TALLYING | カンマ区切り数チェック |
| INSPECT REPLACING | CSV危険文字置換 ← 新規 |
| STRING WITH POINTER | 位置指定CSV行編集 ← 新規 |
| WRITE AFTER ADVANCING PAGE | ページヘッダー制御 ← 新規 |
| WRITE AFTER ADVANCING 2 LINES | セクション区切り ← 新規 |
| WRITE AFTER ADVANCING 1 LINE | データ行出力 ← 新規 |
| STRING | CSV行編集(DELIMITED BY SIZE |
| EXEC SQL SELECT(CURSOR) | DB読込 |
| DISPLAY | 警告メッセージ表示 |