リクエスト詳細
🐛 バグ報告
対応完了
対象アプリ: LotTrace - ロット追跡・トレーサビリティ管理システム
ダッシュボードのアラート件数メトリクスと表示件数が乖離する
## 1. 不具合の内容
ダッシュボード上部の「期限切れ原材料」メトリクスカードには `count($expired)` (最大10件) を表示しているが、`$expired_count` (全件数のCOUNT) は別変数として取得しており、両者が使い分けられていない。
具体的には:
- メトリクスカード「アラート件数」は `$alert_count = $expired_count + $expiring_count + $unused_count + $stockout_count` を使用 → **全件数の合計**
- メトリクスカード「期限切れ原材料」は `count($expired)` を使用 → **LIMIT 10 で取得した配列の件数(最大10)**
例えば期限切れロットが15件存在する場合、「アラート件数」には15が加算されるが「期限切れ原材料」カードには10と表示される。同一画面内で同じ指標が異なる数値で表示される不整合が生じる。
## 2. 根拠・発生しそうな条件
`pages/dashboard.php` の該当箇所:
```php
// 全件COUNT(正しい値)
$expired_count = (int)(fetch_one("SELECT COUNT(*) AS c FROM material_lots WHERE expiry_date IS NOT NULL AND expiry_date < ?", [$today])['c'] ?? 0);
// LIMIT 10 の配列(最大10件)
$expired = fetch_all("SELECT ... LIMIT 10", [$today]);
// アラート件数には $expired_count(全件)を使用
$alert_count = $expired_count + $expiring_count + $unused_count + $stockout_count;
// メトリクスカードには count($expired)(最大10)を使用
<div class="num danger"><?= count($expired) ?></div>
```
期限切れロットが11件以上になると確実に表示が食い違う。稼働が続くほど発生確率が上がる。
## 3. 期待動作
「期限切れ原材料」メトリクスカードには `$expired_count`(全件数のCOUNT結果)を表示すべき。「アラート件数」と同じデータソースを使うことで一貫性が保たれる。
## 4. 修正方針
`pages/dashboard.php` のメトリクスカード表示部分を以下のように修正する:
```php
// 修正前
<div class="num danger"><?= count($expired) ?></div>
// 修正後
<div class="num danger"><?= (int)$expired_count ?></div>
```
同様に、`$expiring`・`$unused`・`$stockout` の各テーブル表示は「LIMIT 10 件を表示中」という注記(例:「件数: N件(上位10件を表示)」)を追加すると、全件数と表示件数の乖離をユーザーが認識できて親切。ただし最低限の修正はメトリクスカードの数値ソースを `$expired_count` に統一することで完了する。
ダッシュボード上部の「期限切れ原材料」メトリクスカードには `count($expired)` (最大10件) を表示しているが、`$expired_count` (全件数のCOUNT) は別変数として取得しており、両者が使い分けられていない。
具体的には:
- メトリクスカード「アラート件数」は `$alert_count = $expired_count + $expiring_count + $unused_count + $stockout_count` を使用 → **全件数の合計**
- メトリクスカード「期限切れ原材料」は `count($expired)` を使用 → **LIMIT 10 で取得した配列の件数(最大10)**
例えば期限切れロットが15件存在する場合、「アラート件数」には15が加算されるが「期限切れ原材料」カードには10と表示される。同一画面内で同じ指標が異なる数値で表示される不整合が生じる。
## 2. 根拠・発生しそうな条件
`pages/dashboard.php` の該当箇所:
```php
// 全件COUNT(正しい値)
$expired_count = (int)(fetch_one("SELECT COUNT(*) AS c FROM material_lots WHERE expiry_date IS NOT NULL AND expiry_date < ?", [$today])['c'] ?? 0);
// LIMIT 10 の配列(最大10件)
$expired = fetch_all("SELECT ... LIMIT 10", [$today]);
// アラート件数には $expired_count(全件)を使用
$alert_count = $expired_count + $expiring_count + $unused_count + $stockout_count;
// メトリクスカードには count($expired)(最大10)を使用
<div class="num danger"><?= count($expired) ?></div>
```
期限切れロットが11件以上になると確実に表示が食い違う。稼働が続くほど発生確率が上がる。
## 3. 期待動作
「期限切れ原材料」メトリクスカードには `$expired_count`(全件数のCOUNT結果)を表示すべき。「アラート件数」と同じデータソースを使うことで一貫性が保たれる。
## 4. 修正方針
`pages/dashboard.php` のメトリクスカード表示部分を以下のように修正する:
```php
// 修正前
<div class="num danger"><?= count($expired) ?></div>
// 修正後
<div class="num danger"><?= (int)$expired_count ?></div>
```
同様に、`$expiring`・`$unused`・`$stockout` の各テーブル表示は「LIMIT 10 件を表示中」という注記(例:「件数: N件(上位10件を表示)」)を追加すると、全件数と表示件数の乖離をユーザーが認識できて親切。ただし最低限の修正はメトリクスカードの数値ソースを `$expired_count` に統一することで完了する。
💬 返信 (3)
🛠 開発を開始しました (バグ修正 (lottrace))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「LotTrace - ロット追跡・トレーサビリティ管理システム」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=lottrace
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/lottrace/
ご利用ありがとうございます!
ご要望いただいた「LotTrace - ロット追跡・トレーサビリティ管理システム」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=lottrace
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/lottrace/
ご利用ありがとうございます!
Echo
Iris