統合工事管理システムを製作中。。。

投稿者: | 2026-04-22

皆様こんにちは!

普段の仕事で電気設備工事のプロジェクト管理をしていると、「スケジュールはExcel、写真はLINE、図面はPDF…」と情報が散らばってしまい、何かと手間がかかります。そこで今回、電気設備工事に特化した統合工事管理システムその名も「OpenDS」を ClaudeCode と一緒に製作中です。今回はその途中経過をご紹介します。

🏗️ OpenDS とは?

OpenDS は弱電工事プロジェクトの情報を1つのシステムに集約する 統合工事管理Webアプリです。

  • 工程表(ガントチャート)でスケジュールを一元管理
  • 図面・写真を現場からLINEで直接アップロード
  • Claude AI が工程の遅延や期限超過を自動で通知
  • 材料の積算・単価管理まで対応

🛠️ 主な機能

① プロジェクト管理

案件ごとに「プロジェクトコード(例:P202603001)」を自動生成して管理します。ステータス(下書き → 進行中 → 完了)、現場住所、担当チームをまとめて登録。複数ユーザーにリーダー・メンバーの役割を割り当てられます。

② 工程表(ガントチャート)

工程を親子関係で階層管理できるガントチャートです。各タスクに進捗率(0〜100%)・開始日・終了日を設定し、色分け表示で視覚的に把握できます。追加期間(サブタスク)も同じ構造で管理でき、マイルストーンのラベルも自由に設定可能です。

③ 図面管理

間取図・配線図・単線図の3種類に対応。ブラウザ上のキャンバスエディタで描画できるほか、DXF・DWG・JWW・PDFファイルのアップロードも可能です。リビジョン管理で変更履歴を追跡できます。

④ 写真管理(LINE連携)

施工前・施工中・完成・材料・品質管理・安全管理の6カテゴリで写真を分類保存できます。Webからのアップロードに加え、現場のLINEグループから直接写真を送るだけでシステムに取り込まれる機能を実装中です。

⑤ AI通知機能(← ここが一番の特徴!)

Claude AI が工程データを解析して、期限超過・直近の締め切り・本日の作業をLINEでわかりやすく通知してくれます。詳しくは後述します。

⑥ 積算管理

材料の数量表・単価管理も搭載。通常単価に加えて AI推定単価も設定でき、コスト見積もりを補助します。

💻 技術スタック

区分 技術
バックエンド PHP 7.4+、MySQL / MariaDB
フロントエンド Vanilla JS、Canvas API(図面エディタ)
AI Anthropic Claude(Haiku 4.5 / Sonnet)
メッセージング LINE Messaging API(Webhook / Push)
セキュリティ 2段階認証(TOTP)、Cloudflare連携、IP制御
インフラ CORESERVER CoreX(densetu.andount.com)

🔔 AI通知機能の詳細

単なるリマインダーではなく、工程データを Claude が読み解いて自然な文章で通知してくれるのが特徴です。

通知に含まれる情報は以下の4点を自動収集して Claude に渡します:

  1. 本日の作業工程:今日が開始日または終了日のタスク
  2. 今後7日以内の期限:進捗率と残り日数を添えて
  3. 期限超過タスク:アラート付きで警告
  4. 進行中案件の概況:プロジェクト全体のサマリー

AI通知のコアとなるコードはこんなイメージです:

// AiNotificationService.php - コンテキスト収集とClaudeへの送信
private function buildPrompt(array $context): string
{
    $lines = ["あなたは工事管理システムのAIアシスタントです。以下の工程情報を確認し、"];
    $lines[] = "現場担当者にわかりやすい日本語で通知メッセージを作成してください。\\n";

    if (!empty($context['today_tasks'])) {
        $lines[] = "【本日の作業】";
        foreach ($context['today_tasks'] as $t) {
            $lines[] = "・{$t['task_name']}(進捗:{$t['progress']}%)";
        }
    }
    if (!empty($context['overdue_tasks'])) {
        $lines[] = "\\n【⚠️ 期限超過】";
        foreach ($context['overdue_tasks'] as $t) {
            $lines[] = "・{$t['task_name']}({$t['days_overdue']}日超過、進捗:{$t['progress']}%)";
        }
    }
    return implode("\\n", $lines);
}

public function sendNotification(int $projectId, array $userIds): void
{
    $context  = $this->collectContext($projectId);
    $prompt   = $this->buildPrompt($context);

    $response = $this->claude->messages()->create([
        'model'      => 'claude-haiku-4-5',
        'max_tokens' => 800,
        'messages'   => [['role' => 'user', 'content' => $prompt]],
    ]);
    $message = $response->content[0]->text;

    // LINE Multicast で複数ユーザーに一括送信
    $this->line->multicast($userIds, $message);
}

📸 LINE からの写真アップロードの仕組み

現場スタッフはわざわざWebにログインしなくても、プロジェクトと紐づいたLINEグループに写真を送るだけで工事写真としてシステムに登録されます。

// webhook.php - LINE から届いた画像をプロジェクトに紐付けて保存
if ($event['message']['type'] === 'image') {
    $messageId  = $event['message']['id'];
    $lineUserId = $event['source']['userId'];
    $groupId    = $event['source']['groupId'] ?? null;

    // LINE グループ → プロジェクトを解決
    $project = $this->projectRepo->findByLineGroup($groupId);
    if (!$project) { return; }

    // 重複チェック(message_id でユニーク管理)
    if ($this->photoRepo->existsByLineMessageId($messageId)) { return; }

    // LINE Content API から画像取得 → photos テーブルへ保存
    $imageData = $this->lineClient->getMessageContent($messageId);
    $this->photoRepo->saveFromLine([
        'project_id'      => $project['id'],
        'line_message_id' => $messageId,
        'line_user_id'    => $lineUserId,
        'source'          => 'line',
        'image_data'      => $imageData,
        'taken_at'        => date('Y-m-d H:i:s'),
    ]);
}

📅 工程表(ガントチャート)の設計

工程の親子関係を1つのテーブルで管理するシンプルな設計にしました。

CREATE TABLE schedules (
    id          INT AUTO_INCREMENT PRIMARY KEY,
    project_id  INT NOT NULL,
    parent_id   INT DEFAULT NULL,        -- 親タスクのID(NULLなら最上位)
    task_name   VARCHAR(200) NOT NULL,
    start_date  DATE NOT NULL,
    end_date    DATE NOT NULL,
    progress    TINYINT DEFAULT 0,       -- 0〜100%
    bar_label   VARCHAR(100),            -- マイルストーンラベル
    sort_order  INT DEFAULT 0,
    created_at  DATETIME DEFAULT CURRENT_TIMESTAMP
);

このシンプルな親子構造で、メイン工程と追加期間(サブフェーズ)を柔軟に表現できます。

😅 開発中に苦労していること

課題①:リアルタイムな工程の可視化

ガントチャートの描画をブラウザ側のJavaScriptで行うため、日付スケールの計算や親子タスクの折りたたみ表示など、フロントエンド実装に思ったより時間がかかっています。

課題②:LINEグループとプロジェクトの紐付け

複数の現場ごとにLINEグループが存在するため、「どのグループがどのプロジェクトか」の管理を正確に行う必要があります。誤ったプロジェクトに写真が紐付かないよう、LINE Group IDの検証ロジックを丁寧に設計しています。

課題③:AI通知のタイミング設計

毎日自動で通知するとうっとうしくなるため、「期限3日前」「当日」「超過翌日」など通知タイミングのルール設計が重要です。現在ルールを詰めているところです。

🚀 現在の開発状況と今後の予定

実装済み:

  • プロジェクト作成・管理・チーム割り当て
  • 工程表の登録・ガントチャート表示
  • 写真管理(Web経由)・カテゴリ分類
  • 認証(ログイン・2FA・IP制御)
  • AI通知サービスの基盤実装

開発中・今後:

  • LINE経由の写真アップロード(Webhook連携)
  • 図面エディタのキャンバス実装
  • 積算シートのUI仕上げ
  • AI通知の自動スケジューリング(cron連携)
  • 日報・議事録・検査記録の入力フォーム

✅ まとめ

電気設備工事という少し地味な分野ですが、現場では「情報の分散」「抜け漏れ」「写真整理」が本当に大変です。OpenDS はそれらをまるっと解決することを目指して製作中です。

ClaudeCode と一緒に作ると、セキュリティ設計やDB設計まで一緒に考えてくれるので、一人で作っているのに設計レビューを受けているような感覚で進められています。

完成したらあらためてご紹介しますので、お楽しみに!

コメントを残す

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