リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: WorkOrder Pro
工程別進捗サマリー(計画h合計 vs 実績h合計・良品率)の表示追加
## 1. 目的
作業指示書の詳細画面(view.php)で、工程一覧テーブルの下に「進捗サマリー行」を追加する。現場リーダーが各指示書を開いたとき、計画工数合計・実績工数合計・差異・良品数合計・不良数合計・良品率を一目で把握できるようにする。A4印刷時にもサマリーが出力されるため、完了報告書として活用できる。
## 2. 具体的な仕様
### 2-1. 表示位置
`view.php` の工程一覧テーブル(`<table>` の `</tbody>` 直後)に `<tfoot>` を追加する。
### 2-2. 計算ロジック(PHP側)
`fetch_steps()` で取得済みの `$steps` 配列をループして以下を算出(PHPで計算し、HTMLに埋め込む):
```php
$sum_planned = 0.0;
$sum_actual = 0.0;
$sum_good = 0;
$sum_ng = 0;
$actual_count = 0; // actual_hours が NULL でない行数
foreach ($steps as $s) {
$sum_planned += (float)$s['planned_hours'];
if ($s['actual_hours'] !== null) {
$sum_actual += (float)$s['actual_hours'];
$actual_count++;
}
$sum_good += (int)$s['good_qty'];
$sum_ng += (int)$s['ng_qty'];
}
$diff = $sum_actual - $sum_planned; // 正=超過、負=前倒し
$total_qty = $sum_good + $sum_ng;
$yield_rate = $total_qty > 0 ? round($sum_good / $total_qty * 100, 1) : null;
```
### 2-3. HTMLテンプレート(tfoot)
工程一覧テーブルの列構成は「順・工程・担当・予定h・実績h・良品/不良・状態・開始・完了」(9列)なので tfoot も 9列に合わせる:
```html
<tfoot>
<tr style="background:#f0f4f8;font-weight:700;">
<td colspan="3" style="text-align:right">合計</td>
<td><?= h(number_format($sum_planned, 2)) ?>h</td>
<td>
<?= $actual_count > 0 ? h(number_format($sum_actual, 2)) . 'h' : '―' ?>
<?php if ($actual_count > 0): ?>
<span style="font-size:12px;color:<?= $diff > 0 ? '#dc2626' : '#16a34a' ?>">
(<?= $diff >= 0 ? '+' : '' ?><?= h(number_format($diff, 2)) ?>h)
</span>
<?php endif; ?>
</td>
<td>
<?= h((string)$sum_good) ?> / <?= h((string)$sum_ng) ?>
<?php if ($yield_rate !== null): ?>
<span style="font-size:12px;color:#374151">良品率 <?= h((string)$yield_rate) ?>%</span>
<?php endif; ?>
</td>
<td colspan="3"></td>
</tr>
</tfoot>
```
差異が正(超過)の場合は赤、負(前倒し)の場合は緑で表示する。
### 2-4. 良品率の条件
- `good_qty + ng_qty = 0` の場合(実績未入力)は良品率を表示しない(`―` または空欄)。
- `actual_hours` が全工程 NULL の場合は実績h合計も `―` 表示とし、差異も非表示。
### 2-5. 担当者フィルター適用時の挙動
`$worker_filter` が指定されている場合は絞り込み後の `$steps` でサマリーを計算する(フィルター後のデータのみ集計)。フィルター中はサマリー行の上に `※担当者フィルター適用中の集計` という注釈テキスト(`<small>` タグ)を添える。
## 3. 既存機能との整合
- `fetch_steps()` / `$steps` の取得ロジックは変更しない。
- テーブルの列構成・既存の `<thead>` / `<tbody>` は変更しない(`<tfoot>` を追加するのみ)。
- `pages/list.php` や `pages/dashboard.php` には一切変更を加えない。
- A4印刷用スタイル(`.no-print` クラスなし)のため、印刷時にも tfoot は出力される。既存の印刷レイアウトを崩さないよう tfoot には `border-top: 2px solid #1a2940` のみ追加する。
- スマホ表示では既存の `.table-wrap` の横スクロールに乗るため追加対応不要。
作業指示書の詳細画面(view.php)で、工程一覧テーブルの下に「進捗サマリー行」を追加する。現場リーダーが各指示書を開いたとき、計画工数合計・実績工数合計・差異・良品数合計・不良数合計・良品率を一目で把握できるようにする。A4印刷時にもサマリーが出力されるため、完了報告書として活用できる。
## 2. 具体的な仕様
### 2-1. 表示位置
`view.php` の工程一覧テーブル(`<table>` の `</tbody>` 直後)に `<tfoot>` を追加する。
### 2-2. 計算ロジック(PHP側)
`fetch_steps()` で取得済みの `$steps` 配列をループして以下を算出(PHPで計算し、HTMLに埋め込む):
```php
$sum_planned = 0.0;
$sum_actual = 0.0;
$sum_good = 0;
$sum_ng = 0;
$actual_count = 0; // actual_hours が NULL でない行数
foreach ($steps as $s) {
$sum_planned += (float)$s['planned_hours'];
if ($s['actual_hours'] !== null) {
$sum_actual += (float)$s['actual_hours'];
$actual_count++;
}
$sum_good += (int)$s['good_qty'];
$sum_ng += (int)$s['ng_qty'];
}
$diff = $sum_actual - $sum_planned; // 正=超過、負=前倒し
$total_qty = $sum_good + $sum_ng;
$yield_rate = $total_qty > 0 ? round($sum_good / $total_qty * 100, 1) : null;
```
### 2-3. HTMLテンプレート(tfoot)
工程一覧テーブルの列構成は「順・工程・担当・予定h・実績h・良品/不良・状態・開始・完了」(9列)なので tfoot も 9列に合わせる:
```html
<tfoot>
<tr style="background:#f0f4f8;font-weight:700;">
<td colspan="3" style="text-align:right">合計</td>
<td><?= h(number_format($sum_planned, 2)) ?>h</td>
<td>
<?= $actual_count > 0 ? h(number_format($sum_actual, 2)) . 'h' : '―' ?>
<?php if ($actual_count > 0): ?>
<span style="font-size:12px;color:<?= $diff > 0 ? '#dc2626' : '#16a34a' ?>">
(<?= $diff >= 0 ? '+' : '' ?><?= h(number_format($diff, 2)) ?>h)
</span>
<?php endif; ?>
</td>
<td>
<?= h((string)$sum_good) ?> / <?= h((string)$sum_ng) ?>
<?php if ($yield_rate !== null): ?>
<span style="font-size:12px;color:#374151">良品率 <?= h((string)$yield_rate) ?>%</span>
<?php endif; ?>
</td>
<td colspan="3"></td>
</tr>
</tfoot>
```
差異が正(超過)の場合は赤、負(前倒し)の場合は緑で表示する。
### 2-4. 良品率の条件
- `good_qty + ng_qty = 0` の場合(実績未入力)は良品率を表示しない(`―` または空欄)。
- `actual_hours` が全工程 NULL の場合は実績h合計も `―` 表示とし、差異も非表示。
### 2-5. 担当者フィルター適用時の挙動
`$worker_filter` が指定されている場合は絞り込み後の `$steps` でサマリーを計算する(フィルター後のデータのみ集計)。フィルター中はサマリー行の上に `※担当者フィルター適用中の集計` という注釈テキスト(`<small>` タグ)を添える。
## 3. 既存機能との整合
- `fetch_steps()` / `$steps` の取得ロジックは変更しない。
- テーブルの列構成・既存の `<thead>` / `<tbody>` は変更しない(`<tfoot>` を追加するのみ)。
- `pages/list.php` や `pages/dashboard.php` には一切変更を加えない。
- A4印刷用スタイル(`.no-print` クラスなし)のため、印刷時にも tfoot は出力される。既存の印刷レイアウトを崩さないよう tfoot には `border-top: 2px solid #1a2940` のみ追加する。
- スマホ表示では既存の `.table-wrap` の横スクロールに乗るため追加対応不要。
💬 返信 (3)
🛠 開発を開始しました (機能追加 (workorder-pro))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「WorkOrder Pro」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=workorder-pro
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/workorder-pro/
ご利用ありがとうございます!
ご要望いただいた「WorkOrder Pro」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=workorder-pro
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/workorder-pro/
ご利用ありがとうございます!
Echo
Iris