This commit is contained in:
parent
e34a4313d6
commit
00f39f15f4
@ -10,35 +10,69 @@ class InformationController extends Controller
|
|||||||
{
|
{
|
||||||
public function list(Request $request)
|
public function list(Request $request)
|
||||||
{
|
{
|
||||||
// フィルター取得
|
// パラメータ
|
||||||
$period = $request->input('period', 'month'); // デフォルト: 最新1ヵ月
|
$period = $request->input('period', 'month'); // month | all
|
||||||
|
$type = $request->input('type', 'all'); // task(<99) | hard(>99) | all
|
||||||
|
$status = $request->input('status', 'untreated'); // untreated(=1) | inprogress(=2) | done(=3) | all
|
||||||
|
|
||||||
$query = DB::table('bat_job_log')
|
$q = DB::table('operator_que as oq')
|
||||||
->leftJoin('device', 'bat_job_log.device_id', '=', 'device.device_id')
|
->leftJoin('user as u', 'oq.user_id', '=', 'u.user_id')
|
||||||
|
->leftJoin('park as p', 'oq.park_id', '=', 'p.park_id')
|
||||||
|
// オペレータマスタ(テーブル・カラム名は環境に合わせて調整)
|
||||||
|
->leftJoin('ope as o', 'oq.operator_id', '=', 'o.ope_id')
|
||||||
->select(
|
->select(
|
||||||
'bat_job_log.job_log_id',
|
'oq.que_id','oq.que_class','oq.user_id',
|
||||||
'bat_job_log.process_name',
|
DB::raw('u.user_name as user_name'),
|
||||||
'bat_job_log.job_name',
|
'oq.contract_id','oq.park_id',
|
||||||
'bat_job_log.device_id',
|
DB::raw('p.park_name as park_name'),
|
||||||
'device.park_id',
|
'oq.que_comment','oq.que_status','oq.que_status_comment',
|
||||||
'bat_job_log.status_comment',
|
'oq.work_instructions','oq.created_at','oq.updated_at','oq.operator_id',
|
||||||
'bat_job_log.status',
|
DB::raw('o.ope_name as operator_name')
|
||||||
'bat_job_log.status_comment as comment',
|
|
||||||
'bat_job_log.created_at',
|
|
||||||
'bat_job_log.updated_at'
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// 期間フィルター
|
// 期間: 登録日ベース(最新1ヵ月 or 全期間)
|
||||||
if ($period === 'month') {
|
if ($period === 'month') {
|
||||||
$query->where('bat_job_log.updated_at', '>=', now()->subMonth());
|
$q->where('oq.created_at', '>=', now()->subMonth());
|
||||||
}
|
}
|
||||||
// 'all'の場合はフィルターなし
|
|
||||||
|
|
||||||
$jobs = $query->orderByDesc('bat_job_log.job_log_id')->limit(50)->get();
|
// 種別: que_class
|
||||||
|
if ($type === 'task') {
|
||||||
|
$q->where('oq.que_class', '<', 99);
|
||||||
|
} elseif ($type === 'hard') {
|
||||||
|
$q->where('oq.que_class', '>', 99);
|
||||||
|
} // all は絞り込みなし
|
||||||
|
|
||||||
return view('admin.information.list', [
|
// ステータス: que_status
|
||||||
'jobs' => $jobs,
|
if ($status === 'untreated') {
|
||||||
'period' => $period,
|
$q->where('oq.que_status', 1);
|
||||||
|
} elseif ($status === 'inprogress') {
|
||||||
|
$q->where('oq.que_status', 2);
|
||||||
|
} elseif ($status === 'done') {
|
||||||
|
$q->where('oq.que_status', 3);
|
||||||
|
} // all は絞り込みなし
|
||||||
|
|
||||||
|
$jobs = $q->orderByDesc('oq.que_id')->paginate(50)->appends($request->query());
|
||||||
|
|
||||||
|
return view('admin.information.list', compact('jobs','period','type','status'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// ステータス一括更新(着手=2 / 対応完了=3)
|
||||||
|
public function updateStatus(Request $request)
|
||||||
|
{
|
||||||
|
$request->validate([
|
||||||
|
'ids' => 'required|array',
|
||||||
|
'action' => 'required|in:inprogress,done',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
$new = $request->action === 'inprogress' ? 2 : 3;
|
||||||
|
|
||||||
|
DB::table('operator_que')
|
||||||
|
->whereIn('que_id', $request->ids)
|
||||||
|
->update([
|
||||||
|
'que_status' => $new,
|
||||||
|
'updated_at' => now(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return back()->with('success', '選択したキューのステータスを更新しました。');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -8,6 +8,7 @@ use App\Services\ShjMailSendService;
|
|||||||
use App\Services\ShjNineService;
|
use App\Services\ShjNineService;
|
||||||
use App\Services\ShjTenService;
|
use App\Services\ShjTenService;
|
||||||
use App\Services\ShjSixService;
|
use App\Services\ShjSixService;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
class AppServiceProvider extends ServiceProvider
|
class AppServiceProvider extends ServiceProvider
|
||||||
{
|
{
|
||||||
@ -75,6 +76,42 @@ class AppServiceProvider extends ServiceProvider
|
|||||||
*/
|
*/
|
||||||
public function boot(): void
|
public function boot(): void
|
||||||
{
|
{
|
||||||
//
|
view()->composer('layouts.app', function($view){
|
||||||
|
|
||||||
|
$stats = DB::table('operator_que')
|
||||||
|
->selectRaw("
|
||||||
|
SUM(CASE WHEN que_status IN (1,2) AND que_class < 100 THEN 1 ELSE 0 END) AS task_total,
|
||||||
|
MAX(CASE WHEN que_status IN (1,2) AND que_class < 100 THEN created_at END) AS task_latest,
|
||||||
|
SUM(CASE WHEN que_status IN (1,2) AND que_class > 99 THEN 1 ELSE 0 END) AS hard_total,
|
||||||
|
MAX(CASE WHEN que_status IN (1,2) AND que_class > 99 THEN created_at END) AS hard_latest
|
||||||
|
")
|
||||||
|
->first();
|
||||||
|
|
||||||
|
$taskCount = (int)($stats->task_total ?? 0);
|
||||||
|
$hardCount = (int)($stats->hard_total ?? 0);
|
||||||
|
$taskLatest = $stats->task_latest ?? null;
|
||||||
|
$hardLatest = $stats->hard_latest ?? null;
|
||||||
|
|
||||||
|
// 最新5件 (未対応/作業中)
|
||||||
|
$latestTasks = DB::table('operator_que')
|
||||||
|
->whereIn('que_status',[1,2])
|
||||||
|
->where('que_class','<',100)
|
||||||
|
->orderByDesc('created_at')
|
||||||
|
->limit(5)
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$latestHards = DB::table('operator_que')
|
||||||
|
->whereIn('que_status',[1,2])
|
||||||
|
->where('que_class','>',99)
|
||||||
|
->orderByDesc('created_at')
|
||||||
|
->limit(5)
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$view->with(compact(
|
||||||
|
'taskCount','taskLatest',
|
||||||
|
'hardCount','hardLatest',
|
||||||
|
'latestTasks','latestHards'
|
||||||
|
));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,125 +19,95 @@
|
|||||||
<div class="card mb-3">
|
<div class="card mb-3">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h5 class="mb-3">絞り込み</h5>
|
<h5 class="mb-3">絞り込み</h5>
|
||||||
<!-- 1行目:表示期間フィルター -->
|
<!-- 表示期間 -->
|
||||||
<div class="row mb-2">
|
<div class="row mb-2">
|
||||||
<div class="col-md-12 font-weight-bold mb-1">表示期間フィルター</div>
|
<div class="col-md-12 font-weight-bold mb-1">表示期間フィルター</div>
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-3 mb-2">
|
<div class="col-md-3 mb-2">
|
||||||
<a href="{{ route('information', ['period' => 'month']) }}"
|
<a href="{{ request()->fullUrlWithQuery(['period'=>'month']) }}"
|
||||||
class="btn btn-sm filter-btn {{ (request('period', $period ?? 'month') == 'month') ? 'btn-warning' : 'btn-outline-secondary' }}"
|
class="btn btn-sm {{ (request('period',$period)=='month')?'btn-warning':'btn-outline-secondary' }}"
|
||||||
style="width:120px;height:32px;"
|
style="width:120px;height:32px;">最新1ヵ月</a>
|
||||||
data-group="period" data-value="month">
|
|
||||||
最新1ヵ月
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-2"></div>
|
<div class="col-md-3 mb-2"></div>
|
||||||
<div class="col-md-3 mb-2"></div>
|
<div class="col-md-3 mb-2"></div>
|
||||||
<div class="col-md-3 mb-2">
|
<div class="col-md-3 mb-2">
|
||||||
<a href="{{ route('information', ['period' => 'all']) }}"
|
<a href="{{ request()->fullUrlWithQuery(['period'=>'all']) }}"
|
||||||
class="btn btn-sm filter-btn {{ (request('period', $period ?? 'month') == 'all') ? 'btn-warning' : 'btn-outline-secondary' }}"
|
class="btn btn-sm {{ (request('period',$period)=='all')?'btn-warning':'btn-outline-secondary' }}"
|
||||||
style="width:120px;height:32px;"
|
style="width:120px;height:32px;">全期間表示</a>
|
||||||
data-group="period" data-value="all">
|
|
||||||
全期間表示
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 2行目:種別フィルター -->
|
|
||||||
|
<!-- 種別 -->
|
||||||
<div class="row mb-2">
|
<div class="row mb-2">
|
||||||
<div class="col-md-12 font-weight-bold mb-1">種別フィルター</div>
|
<div class="col-md-12 font-weight-bold mb-1">種別フィルター</div>
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-3 mb-2">
|
<div class="col-md-3 mb-2">
|
||||||
<a href="#"
|
<a href="{{ request()->fullUrlWithQuery(['type'=>'task']) }}"
|
||||||
class="btn btn-sm filter-btn {{ (request('type', $type ?? 'all') == 'month') ? 'btn-warning' : 'btn-outline-secondary' }}"
|
class="btn btn-sm {{ (request('type',$type)=='task')?'btn-warning':'btn-outline-secondary' }}"
|
||||||
style="width:120px;height:32px;"
|
style="width:120px;height:32px;">タスク</a>
|
||||||
data-group="type" data-value="month">
|
|
||||||
最新1ヵ月
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-2">
|
<div class="col-md-3 mb-2">
|
||||||
<a href="#"
|
<a href="{{ request()->fullUrlWithQuery(['type'=>'hard']) }}"
|
||||||
class="btn btn-sm filter-btn {{ (request('type', $type ?? 'all') == 'hard') ? 'btn-warning' : 'btn-outline-secondary' }}"
|
class="btn btn-sm {{ (request('type',$type)=='hard')?'btn-warning':'btn-outline-secondary' }}"
|
||||||
style="width:120px;height:32px;"
|
style="width:120px;height:32px;">ハード異常</a>
|
||||||
data-group="type" data-value="hard">
|
|
||||||
ハード異常
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-2"></div>
|
<div class="col-md-3 mb-2"></div>
|
||||||
<div class="col-md-3 mb-2">
|
<div class="col-md-3 mb-2">
|
||||||
<a href="#"
|
<a href="{{ request()->fullUrlWithQuery(['type'=>'all']) }}"
|
||||||
class="btn btn-sm filter-btn {{ (request('type', $type ?? 'all') == 'all') ? 'btn-warning' : 'btn-outline-secondary' }}"
|
class="btn btn-sm {{ (request('type',$type)=='all')?'btn-warning':'btn-outline-secondary' }}"
|
||||||
style="width:120px;height:32px;"
|
style="width:120px;height:32px;">全種別表示</a>
|
||||||
data-group="type" data-value="all">
|
|
||||||
全種別表示
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 3行目:ステータスフィルター -->
|
|
||||||
|
<!-- ステータス -->
|
||||||
<div class="row mb-2">
|
<div class="row mb-2">
|
||||||
<div class="col-md-12 font-weight-bold mb-1">ステータスフィルター</div>
|
<div class="col-md-12 font-weight-bold mb-1">ステータスフィルター</div>
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-3 mb-2">
|
<div class="col-md-3 mb-2">
|
||||||
<a href="#"
|
<a href="{{ request()->fullUrlWithQuery(['status'=>'untreated']) }}"
|
||||||
class="btn btn-sm filter-btn {{ (request('status', $status ?? 'untreated') == 'untreated') ? 'btn-warning' : 'btn-outline-secondary' }}"
|
class="btn btn-sm {{ (request('status',$status)=='untreated')?'btn-warning':'btn-outline-secondary' }}"
|
||||||
style="width:120px;height:32px;"
|
style="width:120px;height:32px;">未対応表示</a>
|
||||||
data-group="status" data-value="untreated">
|
|
||||||
未対応表示
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-2">
|
<div class="col-md-3 mb-2">
|
||||||
<a href="#"
|
<a href="{{ request()->fullUrlWithQuery(['status'=>'inprogress']) }}"
|
||||||
class="btn btn-sm filter-btn {{ (request('status', $status ?? '') == 'inprogress') ? 'btn-warning' : 'btn-outline-secondary' }}"
|
class="btn btn-sm {{ (request('status',$status)=='inprogress')?'btn-warning':'btn-outline-secondary' }}"
|
||||||
style="width:120px;height:32px;"
|
style="width:120px;height:32px;">着手を表示</a>
|
||||||
data-group="status" data-value="inprogress">
|
|
||||||
着手を表示
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-2">
|
<div class="col-md-3 mb-2">
|
||||||
<a href="#"
|
<a href="{{ request()->fullUrlWithQuery(['status'=>'done']) }}"
|
||||||
class="btn btn-sm filter-btn {{ (request('status', $status ?? '') == 'done') ? 'btn-warning' : 'btn-outline-secondary' }}"
|
class="btn btn-sm {{ (request('status',$status)=='done')?'btn-warning':'btn-outline-secondary' }}"
|
||||||
style="width:120px;height:32px;"
|
style="width:120px;height:32px;">対応完了を表示</a>
|
||||||
data-group="status" data-value="done">
|
|
||||||
対応完了を表示
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-2">
|
<div class="col-md-3 mb-2">
|
||||||
<a href="#"
|
<a href="{{ request()->fullUrlWithQuery(['status'=>'all']) }}"
|
||||||
class="btn btn-sm filter-btn {{ (request('status', $status ?? '') == 'all') ? 'btn-warning' : 'btn-outline-secondary' }}"
|
class="btn btn-sm {{ (request('status',$status)=='all')?'btn-warning':'btn-outline-secondary' }}"
|
||||||
style="width:120px;height:32px;"
|
style="width:120px;height:32px;">全ステータス表示</a>
|
||||||
data-group="status" data-value="all">
|
|
||||||
全ステータス表示
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 4行目:ステータス変更 -->
|
|
||||||
|
<!-- ステータス変更(POST) -->
|
||||||
<div class="row mb-2">
|
<div class="row mb-2">
|
||||||
<div class="col-md-12 font-weight-bold mb-1">ステータス変更</div>
|
<div class="col-md-12 font-weight-bold mb-1">ステータス変更</div>
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-3 mb-2">
|
<div class="col-md-3 mb-2">
|
||||||
<a href="#"
|
<button type="button" class="btn btn-sm btn-outline-secondary"
|
||||||
class="btn btn-sm filter-btn {{ (request('change', $change ?? '') == 'inprogress') ? 'btn-warning' : 'btn-outline-secondary' }}"
|
style="width:120px;height:32px;"
|
||||||
style="width:120px;height:32px;"
|
onclick="submitStatus('inprogress')">着手</button>
|
||||||
data-group="change" data-value="inprogress">
|
|
||||||
着手
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-2">
|
<div class="col-md-3 mb-2">
|
||||||
<a href="#"
|
<button type="button" class="btn btn-sm btn-outline-secondary"
|
||||||
class="btn btn-sm filter-btn {{ (request('change', $change ?? '') == 'done') ? 'btn-warning' : 'btn-outline-secondary' }}"
|
style="width:120px;height:32px;"
|
||||||
style="width:120px;height:32px;"
|
onclick="submitStatus('done')">対応完了</button>
|
||||||
data-group="change" data-value="done">
|
|
||||||
対応完了
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-2"></div>
|
<div class="col-md-3 mb-2"></div>
|
||||||
<div class="col-md-3 mb-2"></div>
|
<div class="col-md-3 mb-2"></div>
|
||||||
@ -147,82 +117,105 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- データテーブル -->
|
<!-- データテーブル(チェック付き) -->
|
||||||
<div class="table-responsive">
|
<form id="status-form" action="{{ route('information.status') }}" method="POST">
|
||||||
<table class="table table-bordered table-hover table-sm">
|
@csrf
|
||||||
<thead class="thead-light">
|
<input type="hidden" name="action" id="status-action" value="">
|
||||||
<tr>
|
<div class="table-responsive">
|
||||||
<th style="width:30px;"><input type="checkbox"></th>
|
@php
|
||||||
<th>キューID</th>
|
// キュー種別/ステータスの表示名マップ
|
||||||
<th>キュー種別</th>
|
$queueTypeMap = [
|
||||||
<th>利用者</th>
|
1=>'本人確認(社会人)', 2=>'本人確認(学生)', 3=>'タグ発送',
|
||||||
<th>定期契約ID</th>
|
4=>'予約告知通知', 5=>'定期更新通知', 6=>'返金処理',
|
||||||
<th>駐輪場</th>
|
7=>'再発行リミット超過', 8=>'支払い催促', 9=>'シール発行催促',
|
||||||
<th>キューコメント</th>
|
101=>'サーバーエラー', 102=>'プリンタエラー', 103=>'スキャナーエラー', 104=>'プリンタ用紙残少警告',
|
||||||
<th>キューステータス</th>
|
];
|
||||||
<th>コメント</th>
|
$statusMap = [1=>'キュー発生', 2=>'キュー作業中', 3=>'キュー作業済', 4=>'返金済'];
|
||||||
<th>登録日時</th>
|
// 対応画面への遷移リンク(存在する画面のみ)
|
||||||
<th>更新日時</th>
|
$queueLinkMap = [
|
||||||
<th>更新オペレータ</th>
|
1 => route('personal'), // 本人確認(社会人)
|
||||||
<th>リンク</th>
|
2 => route('personal'), // 本人確認(学生)
|
||||||
</tr>
|
3 => route('tagissue'), // タグ発送
|
||||||
</thead>
|
4 => route('reservation'), // 予約告知通知
|
||||||
<tbody>
|
5 => route('update_candidate'), // 定期更新通知
|
||||||
@foreach($jobs as $job)
|
6 => route('settlement_transactions'),// 返金処理(関連一覧に遷移)
|
||||||
<tr>
|
7 => route('tagissue'), // 再発行関連
|
||||||
<td style="background-color:#faebd7;"><input type="checkbox"></td>
|
8 => route('settlement_transactions'),// 支払い催促(関連一覧)
|
||||||
<td>{{ $job->job_log_id }}</td>
|
9 => route('seals'), // シール発行催促(履歴)
|
||||||
<td>{{ $job->process_name }}</td>
|
];
|
||||||
<td>{{ $job->job_name }}</td>
|
@endphp
|
||||||
<td>{{ $job->device_id }}</td>
|
<table class="table table-bordered table-hover table-sm">
|
||||||
<td>{{ $job->park_id }}</td>
|
<thead class="thead-light">
|
||||||
<td>{{ $job->status_comment }}</td>
|
<tr>
|
||||||
<td>{{ $job->status }}</td>
|
<th style="width:30px;"><input type="checkbox" id="select-all"></th>
|
||||||
<td>{{ $job->comment }}</td>
|
<th>キューID</th>
|
||||||
<td>{{ $job->created_at }}</td>
|
<th>キュー種別</th>
|
||||||
<td>{{ $job->updated_at }}</td>
|
<th>利用者</th>
|
||||||
<td>-</td>
|
<th>定期契約ID</th>
|
||||||
<td><a href="#">詳細</a></td>
|
<th>駐輪場</th>
|
||||||
</tr>
|
<th>キューコメント</th>
|
||||||
@endforeach
|
<th>キューステータス</th>
|
||||||
</tbody>
|
<th>コメント</th>
|
||||||
</table>
|
<th>登録日時</th>
|
||||||
</div>
|
<th>更新日時</th>
|
||||||
|
<th>更新オペレータ</th>
|
||||||
|
<th>リンク</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($jobs as $job)
|
||||||
|
<tr>
|
||||||
|
<td style="background-color:#faebd7;">
|
||||||
|
<input type="checkbox" name="ids[]" value="{{ $job->que_id }}">
|
||||||
|
</td>
|
||||||
|
<td>{{ $job->que_id }}</td>
|
||||||
|
<td>{{ $queueTypeMap[$job->que_class] ?? $job->que_class }}</td>
|
||||||
|
<td>{{ $job->user_name ?? $job->user_id }}</td>
|
||||||
|
<td>{{ $job->contract_id }}</td>
|
||||||
|
<td>{{ $job->park_name ?? $job->park_id }}</td>
|
||||||
|
<td>{{ $job->que_comment }}</td>
|
||||||
|
<td>{{ $statusMap[$job->que_status] ?? $job->que_status }}</td>
|
||||||
|
<td>
|
||||||
|
{{ $job->que_status_comment }}
|
||||||
|
@if(!empty($job->work_instructions))
|
||||||
|
<br><small class="text-muted">{{ $job->work_instructions }}</small>
|
||||||
|
@endif
|
||||||
|
</td>
|
||||||
|
<td>{{ $job->created_at }}</td>
|
||||||
|
<td>{{ $job->updated_at }}</td>
|
||||||
|
<td>{{ $job->operator_name ?? $job->operator_id ?? '-' }}</td>
|
||||||
|
<td>
|
||||||
|
@if(isset($queueLinkMap[$job->que_class]))
|
||||||
|
<a href="{{ $queueLinkMap[$job->que_class] }}">対応画面へ</a>
|
||||||
|
@else
|
||||||
|
-
|
||||||
|
@endif
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ページネーション -->
|
||||||
|
<div class="mt-2">
|
||||||
|
{{ $jobs->links() }}
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@push('scripts')
|
@push('scripts')
|
||||||
<script>
|
<script>
|
||||||
// ページロード時にデフォルト選択(初回アクセス時のみperiod, type, statusを自動選択)
|
function submitStatus(action){
|
||||||
window.addEventListener('DOMContentLoaded', function() {
|
const checked = document.querySelectorAll('input[name="ids[]"]:checked');
|
||||||
// URLにperiod/type/statusパラメータがなければ初期選択
|
if(checked.length === 0){ alert('対象を選択してください。'); return; }
|
||||||
const url = new URL(window.location.href);
|
document.getElementById('status-action').value = action;
|
||||||
const hasPeriod = url.searchParams.has('period');
|
document.getElementById('status-form').submit();
|
||||||
const hasType = url.searchParams.has('type');
|
}
|
||||||
const hasStatus = url.searchParams.has('status');
|
// 全選択
|
||||||
|
document.getElementById('select-all')?.addEventListener('change', function(){
|
||||||
if (!hasPeriod) {
|
document.querySelectorAll('input[name="ids[]"]').forEach(cb => cb.checked = this.checked);
|
||||||
document.querySelector('.filter-btn[data-group="period"][data-value="month"]')?.classList.replace('btn-outline-secondary', 'btn-warning');
|
});
|
||||||
}
|
|
||||||
if (!hasType) {
|
|
||||||
document.querySelector('.filter-btn[data-group="type"][data-value="all"]')?.classList.replace('btn-outline-secondary', 'btn-warning');
|
|
||||||
}
|
|
||||||
if (!hasStatus) {
|
|
||||||
document.querySelector('.filter-btn[data-group="status"][data-value="untreated"]')?.classList.replace('btn-outline-secondary', 'btn-warning');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// フィルターボタンの選択状態切替
|
|
||||||
document.querySelectorAll('.filter-btn').forEach(function(btn) {
|
|
||||||
btn.addEventListener('click', function() {
|
|
||||||
var group = btn.getAttribute('data-group');
|
|
||||||
document.querySelectorAll('.filter-btn[data-group="' + group + '"]').forEach(function(b) {
|
|
||||||
b.classList.remove('btn-warning');
|
|
||||||
b.classList.add('btn-outline-secondary');
|
|
||||||
});
|
|
||||||
btn.classList.remove('btn-outline-secondary');
|
|
||||||
btn.classList.add('btn-warning');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
@endpush
|
@endpush
|
||||||
@endsection
|
@endsection
|
||||||
@ -70,51 +70,74 @@
|
|||||||
|
|
||||||
<!-- Right navbar links -->
|
<!-- Right navbar links -->
|
||||||
<ul class="navbar-nav ml-auto">
|
<ul class="navbar-nav ml-auto">
|
||||||
<!-- Messages Dropdown Menu -->
|
<!-- ハード異常 件数表示(ドロップダウン任意表示:ここでは件数バッジのみ簡易) -->
|
||||||
<li class="nav-item dropdown">
|
<li class="nav-item dropdown">
|
||||||
<a class="nav-link text-danger" data-toggle="dropdown" href="#">
|
<a class="nav-link text-danger" data-toggle="dropdown" href="#">
|
||||||
<i class="fa fa-exclamation-circle"></i><span class="d-none d-md-inline">
|
<i class="fa fa-exclamation-circle"></i>
|
||||||
{{__('ハード異常:')}}</span> {{__(':stt件', ['stt' => 1])}} <small
|
<span class="d-none d-md-inline">ハード異常:</span>
|
||||||
class="d-none d-md-inline">{{__('最新:date', ['date' => '2018/09/01 15:00'])}} </small>
|
{{ $hardCount ?? 0 }}件
|
||||||
|
@if(!empty($hardLatest))
|
||||||
|
<small class="d-none d-md-inline">
|
||||||
|
最新:{{ \Carbon\Carbon::parse($hardLatest)->format('Y/m/d H:i') }}
|
||||||
|
</small>
|
||||||
|
@endif
|
||||||
</a>
|
</a>
|
||||||
|
@if(!empty($latestHards) && count($latestHards))
|
||||||
|
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
|
||||||
|
<span class="dropdown-header">
|
||||||
|
ハード異常 {{ $hardCount }}件(未/進行中)
|
||||||
|
</span>
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
|
@foreach($latestHards as $hq)
|
||||||
|
<a href="{{ route('information', ['type'=>'hard','status'=>'untreated']) }}" class="dropdown-item"
|
||||||
|
style="white-space:normal;">
|
||||||
|
{{ Str::limit($hq->que_comment ?? 'ハード異常', 40) }}
|
||||||
|
<span class="float-right text-muted text-sm">
|
||||||
|
{{ \Carbon\Carbon::parse($hq->created_at)->diffForHumans() }}
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
|
@endforeach
|
||||||
|
<a href="{{ route('information', ['type'=>'hard']) }}" class="dropdown-item dropdown-footer">
|
||||||
|
すべてを見る
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
</li>
|
</li>
|
||||||
<!-- Notifications Dropdown Menu -->
|
|
||||||
|
<!-- タスク 件数 + ドロップダウン最新5件 -->
|
||||||
<li class="nav-item dropdown">
|
<li class="nav-item dropdown">
|
||||||
<a class="nav-link" data-toggle="dropdown" href="#">
|
<a class="nav-link" data-toggle="dropdown" href="#">
|
||||||
<i class="fa fa-bell-o"></i><span class="d-none d-md-inline"> {{__('タスク:')}} </span>
|
<i class="fa fa-bell-o"></i>
|
||||||
{{__(':stt件', ['stt' => 5])}} <small
|
<span class="d-none d-md-inline">タスク:</span>
|
||||||
class="d-none d-md-inline">{{__('最新:date', ['date' => '2018/09/01 15:00'])}}</small>
|
{{ $taskCount ?? 0 }}件
|
||||||
|
@if(!empty($taskLatest))
|
||||||
|
<small class="d-none d-md-inline">
|
||||||
|
最新:{{ \Carbon\Carbon::parse($taskLatest)->format('Y/m/d H:i') }}
|
||||||
|
</small>
|
||||||
|
@endif
|
||||||
</a>
|
</a>
|
||||||
|
@if(!empty($latestTasks) && count($latestTasks))
|
||||||
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
|
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
|
||||||
<span class="dropdown-header">5 件のタスクが未完了です。</span>
|
<span class="dropdown-header">
|
||||||
|
タスク {{ $taskCount }}件(未/進行中)
|
||||||
|
</span>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<a href="#" class="dropdown-item">
|
@foreach($latestTasks as $tq)
|
||||||
タスクタイトルが入ります
|
<a href="{{ route('information', ['type'=>'task','status'=>'untreated']) }}" class="dropdown-item"
|
||||||
<span class="float-right text-muted text-sm">3 mins</span>
|
style="white-space:normal;">
|
||||||
|
{{ Str::limit($tq->que_comment ?? 'タスク', 40) }}
|
||||||
|
<span class="float-right text-muted text-sm">
|
||||||
|
{{ \Carbon\Carbon::parse($tq->created_at)->diffForHumans() }}
|
||||||
|
</span>
|
||||||
</a>
|
</a>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<a href="#" class="dropdown-item">
|
@endforeach
|
||||||
タスクタイトルが入ります
|
<a href="{{ route('information', ['type'=>'task']) }}" class="dropdown-item dropdown-footer">
|
||||||
<span class="float-right text-muted text-sm">12 hours</span>
|
過去のタスクを全て見る
|
||||||
</a>
|
</a>
|
||||||
<div class="dropdown-divider"></div>
|
|
||||||
<a href="#" class="dropdown-item">
|
|
||||||
タスクタイトルが入ります
|
|
||||||
<span class="float-right text-muted text-sm">2 days</span>
|
|
||||||
</a>
|
|
||||||
<div class="dropdown-divider"></div>
|
|
||||||
<a href="#" class="dropdown-item">
|
|
||||||
タスクタイトルが入ります
|
|
||||||
<span class="float-right text-muted text-sm">2 days</span>
|
|
||||||
</a>
|
|
||||||
<div class="dropdown-divider"></div>
|
|
||||||
<a href="#" class="dropdown-item">
|
|
||||||
タスクタイトルが入ります
|
|
||||||
<span class="float-right text-muted text-sm">2 days</span>
|
|
||||||
</a>
|
|
||||||
<div class="dropdown-divider"></div>
|
|
||||||
<a href="#" class="dropdown-item dropdown-footer">過去のタスクを全て見る</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
@endif
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/logout"><i class="fa fa-sign-out"></i> {{ __('ログアウト') }}</a>
|
<a class="nav-link" href="/logout"><i class="fa fa-sign-out"></i> {{ __('ログアウト') }}</a>
|
||||||
@ -132,24 +155,24 @@
|
|||||||
</a>
|
</a>
|
||||||
<div class="sidebar">
|
<div class="sidebar">
|
||||||
@php
|
@php
|
||||||
// タグ・シール管理
|
// タグ・シール管理
|
||||||
$tagRoutes = [
|
$tagRoutes = [
|
||||||
'tags', // 例: タグ・シール管理のroute名
|
'tags', // 例: タグ・シール管理のroute名
|
||||||
];
|
];
|
||||||
// 集計業務
|
// 集計業務
|
||||||
$aggregateRoutes = [
|
$aggregateRoutes = [
|
||||||
'aggregate', // 例: 集計業務のroute名
|
'aggregate', // 例: 集計業務のroute名
|
||||||
];
|
];
|
||||||
// 決済マスタ
|
// 決済マスタ
|
||||||
$settlementRoutes = [
|
$settlementRoutes = [
|
||||||
'settlement1',
|
'settlement1',
|
||||||
'settlement2', // 決済マスタの各route名
|
'settlement2', // 決済マスタの各route名
|
||||||
];
|
];
|
||||||
// システムマスタ
|
// システムマスタ
|
||||||
$systemRoutes = [
|
$systemRoutes = [
|
||||||
'system1',
|
'system1',
|
||||||
'system2', // システムマスタの各route名
|
'system2', // システムマスタの各route名
|
||||||
];
|
];
|
||||||
|
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
@ -189,11 +212,11 @@
|
|||||||
|
|
||||||
|
|
||||||
@php
|
@php
|
||||||
// <!-- タグ・シール管理 -->
|
// <!-- タグ・シール管理 -->
|
||||||
$webRoutes = [
|
$webRoutes = [
|
||||||
'tagissue', // タグ発行キュー処理、履歴表示
|
'tagissue', // タグ発行キュー処理、履歴表示
|
||||||
'seals', // タグシール管理
|
'seals', // タグシール管理
|
||||||
];
|
];
|
||||||
@endphp
|
@endphp
|
||||||
<li
|
<li
|
||||||
class="nav-item has-treeview @if(in_array(app('router')->currentRouteName(), $webRoutes)) menu-open @endif">
|
class="nav-item has-treeview @if(in_array(app('router')->currentRouteName(), $webRoutes)) menu-open @endif">
|
||||||
@ -223,16 +246,16 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
@php
|
@php
|
||||||
// 定期駐輪管理:ルート名がここに含まれている場合、展開&ハイライト
|
// 定期駐輪管理:ルート名がここに含まれている場合、展開&ハイライト
|
||||||
$parkingRoutes = [
|
$parkingRoutes = [
|
||||||
'periodical', // 定期利用・契約状況
|
'periodical', // 定期利用・契約状況
|
||||||
'contractor', // 契約者一覧
|
'contractor', // 契約者一覧
|
||||||
'contractor_List', // 未更新者一覧
|
'contractor_List', // 未更新者一覧
|
||||||
'update_candidate', // 更新予定者一覧
|
'update_candidate', // 更新予定者一覧
|
||||||
'reservation', // 予約者一覧
|
'reservation', // 予約者一覧
|
||||||
'personal', // 本人確認手動処理
|
'personal', // 本人確認手動処理
|
||||||
'using_status', // 区画別利用率状況
|
'using_status', // 区画別利用率状況
|
||||||
];
|
];
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
<li
|
<li
|
||||||
@ -322,10 +345,10 @@
|
|||||||
</a>
|
</a>
|
||||||
|
|
||||||
@php
|
@php
|
||||||
// 一般ウェブ管理:ルート名がここに含まれている場合、展開&ハイライト
|
// 一般ウェブ管理:ルート名がここに含まれている場合、展開&ハイライト
|
||||||
$webRoutes = [
|
$webRoutes = [
|
||||||
'news', // 最新ニュース登録
|
'news', // 最新ニュース登録
|
||||||
];
|
];
|
||||||
@endphp
|
@endphp
|
||||||
<li
|
<li
|
||||||
class="nav-item has-treeview @if(in_array(app('router')->currentRouteName(), $webRoutes)) menu-open @endif">
|
class="nav-item has-treeview @if(in_array(app('router')->currentRouteName(), $webRoutes)) menu-open @endif">
|
||||||
@ -349,13 +372,13 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
@php
|
@php
|
||||||
// 利用者マスタ:ルート名がここに含まれている場合、展開&ハイライト
|
// 利用者マスタ:ルート名がここに含まれている場合、展開&ハイライト
|
||||||
$userGroupRoutes = [
|
$userGroupRoutes = [
|
||||||
'users', // 利用者マスタ
|
'users', // 利用者マスタ
|
||||||
'regularcontracts', // 定期契約マスタ
|
'regularcontracts', // 定期契約マスタ
|
||||||
'reserves', // 定期予約マスタ
|
'reserves', // 定期予約マスタ
|
||||||
'usertypes', // 定期予約マスタ
|
'usertypes', // 定期予約マスタ
|
||||||
];
|
];
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
<li
|
<li
|
||||||
@ -407,28 +430,28 @@
|
|||||||
|
|
||||||
<!-- 駐輪場マスタ -->
|
<!-- 駐輪場マスタ -->
|
||||||
@php
|
@php
|
||||||
// 駐輪場マスタ:ルート名がここに含まれている場合、展開&ハイライト
|
// 駐輪場マスタ:ルート名がここに含まれている場合、展開&ハイライト
|
||||||
$parkingRoutes = [
|
$parkingRoutes = [
|
||||||
'ptypes',
|
'ptypes',
|
||||||
'parks',
|
'parks',
|
||||||
'managers',
|
'managers',
|
||||||
'print_areas',
|
'print_areas',
|
||||||
'operator_ques',
|
'operator_ques',
|
||||||
'regular_types',
|
'regular_types',
|
||||||
'jurisdiction_parkings',
|
'jurisdiction_parkings',
|
||||||
'city',
|
'city',
|
||||||
'pricelist',
|
'pricelist',
|
||||||
'prices',
|
'prices',
|
||||||
'psections',
|
'psections',
|
||||||
'price_add',
|
'price_add',
|
||||||
'price_info',
|
'price_info',
|
||||||
'price_edit',
|
'price_edit',
|
||||||
'zones',
|
'zones',
|
||||||
'stations',
|
'stations',
|
||||||
'terms',
|
'terms',
|
||||||
'contract_allowable_cities',
|
'contract_allowable_cities',
|
||||||
];
|
];
|
||||||
$current = app('router')->currentRouteName();
|
$current = app('router')->currentRouteName();
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
<!-- 駐輪場マスタ -->
|
<!-- 駐輪場マスタ -->
|
||||||
@ -501,13 +524,13 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
@php
|
@php
|
||||||
// 決済マスタ:ルート名がここに含まれている場合、展開&ハイライト
|
// 決済マスタ:ルート名がここに含まれている場合、展開&ハイライト
|
||||||
$paymentRoutes = [
|
$paymentRoutes = [
|
||||||
'tax', // 消費税マスタ
|
'tax', // 消費税マスタ
|
||||||
'payments', // 決済情報マスタ
|
'payments', // 決済情報マスタ
|
||||||
'settlement_transactions', // 決済トランザクション
|
'settlement_transactions', // 決済トランザクション
|
||||||
];
|
];
|
||||||
$current = app('router')->currentRouteName();
|
$current = app('router')->currentRouteName();
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
<!-- 決済マスタ -->
|
<!-- 決済マスタ -->
|
||||||
@ -522,40 +545,40 @@
|
|||||||
|
|
||||||
<ul class="nav nav-treeview" style="display: @if(in_array($current, $paymentRoutes)) block @else none @endif;">
|
<ul class="nav nav-treeview" style="display: @if(in_array($current, $paymentRoutes)) block @else none @endif;">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="{{ route('tax') }}"
|
<a href="{{ route('tax') }}"
|
||||||
class="nav-link @if($current === 'tax') active @endif">
|
class="nav-link @if($current === 'tax') active @endif">
|
||||||
<i class="fa fa-circle-o nav-icon"></i>
|
<i class="fa fa-circle-o nav-icon"></i>
|
||||||
<p>{{ __('消費税マスタ') }}</p>
|
<p>{{ __('消費税マスタ') }}</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="{{ route('payments') }}"
|
<a href="{{ route('payments') }}"
|
||||||
class="nav-link @if($current === 'payments') active @endif">
|
class="nav-link @if($current === 'payments') active @endif">
|
||||||
<i class="fa fa-circle-o nav-icon"></i>
|
<i class="fa fa-circle-o nav-icon"></i>
|
||||||
<p>{{ __("決済情報マスタ") }}</p>
|
<p>{{ __("決済情報マスタ") }}</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="{{ route('settlement_transactions') }}"
|
<a href="{{ route('settlement_transactions') }}"
|
||||||
class="nav-link @if($current === 'settlement_transactions') active @endif">
|
class="nav-link @if($current === 'settlement_transactions') active @endif">
|
||||||
<i class="fa fa-circle-o nav-icon"></i>
|
<i class="fa fa-circle-o nav-icon"></i>
|
||||||
<p>{{ __("決済トランザクション") }}</p>
|
<p>{{ __("決済トランザクション") }}</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
|
||||||
@php
|
@php
|
||||||
// システムマスタ:ルート名がここに含まれている場合、展開&ハイライト
|
// システムマスタ:ルート名がここに含まれている場合、展開&ハイライト
|
||||||
$systemRoutes = [
|
$systemRoutes = [
|
||||||
'opes',
|
'opes',
|
||||||
'devices',
|
'devices',
|
||||||
'operator_ques',
|
'operator_ques',
|
||||||
'settings',
|
'settings',
|
||||||
'mail_templates',
|
'mail_templates',
|
||||||
];
|
];
|
||||||
$current = app('router')->currentRouteName();
|
$current = app('router')->currentRouteName();
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
<!-- システムマスタ -->
|
<!-- システムマスタ -->
|
||||||
@ -602,11 +625,11 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
@php
|
@php
|
||||||
// マスタ管理:ルート名がここに含まれている場合、展開&ハイライト
|
// マスタ管理:ルート名がここに含まれている場合、展開&ハイライト
|
||||||
$masterRoutes = [
|
$masterRoutes = [
|
||||||
'inv_settings',
|
'inv_settings',
|
||||||
];
|
];
|
||||||
$current = app('router')->currentRouteName();
|
$current = app('router')->currentRouteName();
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
<!-- マスタ管理 -->
|
<!-- マスタ管理 -->
|
||||||
|
|||||||
@ -264,6 +264,7 @@ Route::middleware('auth')->group(function () {
|
|||||||
|
|
||||||
// 常時表示インフォメーション
|
// 常時表示インフォメーション
|
||||||
Route::get('/information', [InformationController::class, 'list'])->name('information');
|
Route::get('/information', [InformationController::class, 'list'])->name('information');
|
||||||
|
Route::post('/information/status', [InformationController::class, 'updateStatus'])->name('information.status');
|
||||||
|
|
||||||
// タグ発行キュー処理、履歴表示
|
// タグ発行キュー処理、履歴表示
|
||||||
Route::get('/tagissue', [App\Http\Controllers\Admin\TagissueController::class, 'list'])->name('tagissue');
|
Route::get('/tagissue', [App\Http\Controllers\Admin\TagissueController::class, 'list'])->name('tagissue');
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user