@extends('layouts.app') @section('title', $project->name . ' - 概覽') @section('content') @include('projects._nav')
@if(session('success'))
{{ session('success') }}
@endif
{{-- 左欄:專案資訊 --}}
{{-- 基本資訊 --}}
專案資訊
@can('update', $project) 編輯 @endcan
系統名稱 {{ $project->name }}
@php $contracts = $project->contracts()->orderBy('name')->get(); @endphp @if($contracts->isNotEmpty())
合約
@foreach($contracts as $c) {{ $c->name ?: $c->project_type }} @endforeach
@endif
客戶 {{ $project->client?->name ?? '未分類' }}
開始日期 {{ $project->start_date ?? '—' }}
結束日期 {{ $project->end_date ?? '—' }}
類型 {{ $project->project_type ?? '—' }}
開發工具 {{ $project->dev_tool ?? '—' }}
@if($project->estimated_man_days)
評估人天 {{ $project->estimated_man_days }} 天
@endif @can('update', $project) @if($project->contract_amount)
合約金額 NT$ {{ number_format($project->contract_amount) }}
@endif @endcan @if($project->deliverables)
交付項目 {{ $project->deliverables }}
@endif
{{-- 進行中議題 --}} @php $recentIssues = \App\Models\Issue::with(['assignee']) ->where('project_id', $project->id) ->where('status', 'in_progress') ->orderBy('updated_at', 'desc') ->limit(10)->get(); $trackers = \App\Models\IssueTracker::asOptions(); $priorities = \App\Models\IssuePriority::asOptions(); @endphp @if($recentIssues->isNotEmpty())
進行中議題
全部議題
@foreach($recentIssues as $issue) @php $tColor = $trackers[$issue->tracker]['color'] ?? 'secondary'; $tLabel = $trackers[$issue->tracker]['label'] ?? $issue->tracker; $pData = $priorities[$issue->priority] ?? null; @endphp @endforeach
# 類型 標題 優先權 負責人
#{{ $issue->redmine_id ?? $issue->id }} {{ $tLabel }} {{ $issue->title }} @if($pData) {{ $pData['label'] }} @endif {{ $issue->assignee?->name ?? '—' }}
@endif {{-- 文件 --}} @php $recentDocs = $project->docs()->where('type','doc')->latest()->limit(5)->get() @endphp
@if($recentDocs->isNotEmpty())
@foreach($recentDocs as $doc) {{ $doc->title }} {{ $doc->updated_at?->format('Y-m-d') }} @endforeach
@else
尚無文件
@endif
{{-- Wiki --}} @php $wikiDocs = $project->docs()->where('type','wiki')->latest()->limit(5)->get() @endphp
@if($wikiDocs->isNotEmpty())
@foreach($wikiDocs as $doc) {{ $doc->title }} {{ $doc->updated_at?->format('Y-m-d') }} @endforeach
@else
尚無 Wiki 頁面
@endif
{{-- 右欄:統計 + 成員 --}}
{{-- 議題統計 --}} @php $issueStats = \App\Models\Issue::where('project_id', $project->id) ->selectRaw('status, COUNT(*) as cnt') ->groupBy('status')->pluck('cnt','status'); $totalIssues = $issueStats->sum(); $openIssues = $issueStats->only(['pending','in_progress','hold','watching'])->sum(); @endphp
議題統計
{{ $openIssues }}
進行中
{{ $issueStats['completed'] ?? 0 }}
已完成
{{ $totalIssues }}
總計
@if($totalIssues > 0) @php $pct = round(($issueStats['completed'] ?? 0) / $totalIssues * 100) @endphp
完成率 {{ $pct }}% @endif
查看所有議題 @can('view', $project) + 新增議題 @endcan
{{-- 成員 --}} @can('viewMembers', $project)
成員 ({{ $project->members->count() }})
@can('update', $project) 管理 @endcan
@foreach($project->members->take(10) as $m)
{{ $m->name }}
@endforeach @if($project->members->count() > 10)
... 以及另外 {{ $project->members->count() - 10 }} 位成員
@endif
@endcan {{-- 附件 --}} @if($project->attachments->isNotEmpty())
附件 ({{ $project->attachments->count() }})
@foreach($project->attachments->take(5) as $att) {{ $att->filename }} @endforeach
@can('update', $project) @endcan
@endif
@endsection