キクと散歩 法規制コードの3回目の修正

京橋川の土手をキクと散歩
checklist_results (プロジェクト別選択結果)

※課題:保存は全件DELETE → INSERT の洗い替え方式

カラム役割
project_idFK現場
regulation_idFK法規制
is_checkedboolean適用/非適用

c

法規制のコードを見直しを始めた・・・まずは現状分析

1.現在のテーブル構成

regulations`(法規制マスタ)

※課題:ai_description1列に「キーワード」と「制御フラグ」を混在させている

カラム役割
idPK
parent_idFK(self)親=null、子=親ID(2段構造)
group_codestring法律名(主に親)
ref_lawstring関係条文(主に子)
action_contentext実施すべき内容
full_law_texttext原文(展開表示用)
ai_descriptiontextAI判定用キーワード(【選択必須】/【選択しない】制御フラグも兼用)
explanation_imagestring解説画像
Custom_regulations (現場固有のその他規制)

regulations とほぼ同列構成project_id+is_checked
is_checked が直接カラムにあり、checklist_results とは別管理

2.現在の処理フロー

“`
[工事管理ページ]

▼ 法規制編集ボタン
[edit_Laws_Regulations.blade.php](編集画面)

├─ ✨AI法規制判定ボタン(タブ単位)
│ │
│ ▼ POST /projects/{id}/ai_recommend(Ajax)
│ AiRecommendationService::recommend()
│ – regulations 全件取得
│ – project->overview(工事概要テキスト)を入力
│ – Claude API に問い合わせ → ID配列を返却
│ – session(‘ai_suggestions’) に保存
│ – ページリロード → チェック状態に反映

├─ 手動チェック(親・子チェックボックス)

└─ 登録/更新ボタン → POST /projects/{id}/checklist/save
– checklist_results を全削除 → 再挿入
– custom_regulations の is_checked を更新

[index.blade.php](閲覧画面)
– checklist_results に is_checked=true のもののみ表示
– session(‘ai_suggestions’) があれば合体してハイライト

4-2. 第一段階:条件選択による法規制特定(モーダル☑ボックス)

モーダルのチェックボックスの項:”D:\Dropbox\03システムアシスト\00-Bulid-Assist\法規制の見直し\20260605法規制検索モーダル項目.xlsx”
この項目をモーダルで纏める
・検索条件は上記に示す

4-3. 第二段階:AIによる残留判定(複雑条件のみ)


検討したが良いAI判定の条件が絞れないので、今回は考慮しない・・・次のステップで

4-4. タブメニューの移動

現在nav_extraスロット(ヘッダー内)に注入しているタブを、コンテンツエリア上部に移動。
【現在】
ヘッダー行:[工事管理] [基本届出] [選択届出][元請責務] [元請確認] [環境関連] [その他規制]
【変更後】
ヘッダー行:[工事管理]
─────────────────────────────────
操作バー:[条件で特定] [印刷/PDF] [法規制表示] [登録/更新] | 改訂日: xxxx
─────────────────────────────────
タブ行: [選任・設置・届出] [元請責務] [元請確認] ・・・・
─────────────────────※タブメニューの名称はselect_modeに従ってください
コンテンツエリア────────────

@section(extra_tabs)の仕組みを廃止し、blade 内でタブを直接描画します。

共通化
項目現状改善案
タブ描画index と edit に同じコードが重複@include(‘Laws_Regulations._tab_bar)等のパーシャル化
法規制行の表示親・子の表示コードが両画面で重複@include(‘Laws_Regulations._regulation_row
条件モーダル新規components/laws_condition_modal.blade.phpとして独立コンポーネント化
キーワードマッチ処理新規App\Services\RegulationMatcherServiceとして Service 層に集約

3.現在の問題点

#問題影響
1AI判定の入力が project->overview(自由記述テキスト)のみAI精度が工事概要の書き方に大きく依存
2ai_descriptionに制御フラグ(【選択必須】)を埋め込み検索/条件判定とフラグが分離できていない
3「全件DELETE→INSERT」の洗い替え保存複数ブラウザ同時操作や途中エラー時にデータ消失リスク
4タブメニューがヘッダーの nav_extraスロットに注入レイアウト上の柔軟性が低い
5AI判定がセッションベース(ai_suggestions)ページ遷移・ログアウトで消える、DB永続化されない
6インライン onclick=””が混在(index.blade.php)CSPの unsafe-inline削除方針と矛盾

4.見直し方針と提案

4-1. CSVデータ構成の見直し(regulations テーブル)

Excelの法規制データを見直した:”D:\Dropbox\03システムアシスト\00-Bulid-Assist\法規制の見直し\20260605-法規制リストー最終.xlsx”
・このデータをCSVとする
・検索方法について、
select_modeには、選択させるか否かの条件を決めている
・必須:どの条件でも必ず選択する項目
・選択:キーワードによって選択するフラグ(select_OR、select_ANDに関係)
・保留:あまり重要ではなく、事例が少ないもの、当面、選択しない
・AI:キーワードでは選択できず、複数の条件からAIが判定するもの(ai_keywordsを参考)・・・当面AIは考えない(次のステップ、保留扱い)
・select_ORには、法規制を特定するときのキーワードを記載している
・キーワードは、選択条件のモーダルで決定する
・ここに改行された、キーワードはすべてORの条件となる
・select_ANDには、法規制を特定するときのキーワードを記載している
・キーワードは、選択条件のモーダルで決定する
・キーワードは、前のselect_ORとANDの条件となる
・ai_keywordsは、select_modeでAI判定とされたとき、参考にする文章を記載する
・full_law_textは、法規制の本文を記載している
・法規制の全文表示モーダルで使用

5.セキュリティ・共通化の提案

セキュリティ
項目現状改善案
テナント分離index と edit に同じコードが重複@include(‘Laws_Regulations._tab_bar)等のパーシャル化
洗い替え保存全DELETE→INSERT(危険)upsert()またはupdateOrCreate()に変更し、ソフトデリートを検討
AI入力overviewテキストをそのまま渡す条件値の構造化データに変更することでプロンプトインジェクション耐性が向上
インライン onclickindex.blade.phpに混在addEventListener` に統一(CLAUDE.md方針に準拠)
エビデンスファイルevidence/{filename}でpublic保存テナントIDをパスに含める(他プロジェクトのURLを推測されるリスク)

6.実装ステップの提案(優先順)

Step     内容
Step 1regulations テーブルにカラム追加(condition_keywords, always_apply, never_apply)+CSVデータの整備
Step 2条件選択モーダルの作成+RegulationMatcherService の実装+edit画面の「AIボタン」を「条件で絞り込む」ボタンに変更
Step 3タブをヘッダーから切り離してコンテンツ内に移動+edit/index 共通パーシャル化
Step 4洗い替え保存 → upsert 方式に変更
Step 5第二段階 AI判定(条件マッチ後の残留分のみ)+AI入力を構造化条件データに変更 |

ブックマークする パーマリンク.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です