feat: [pmis] 작업일보 6탭 CRUD 구현
- 마스터 + 인원/장비/자재/공사량/작업사진 6테이블 마이그레이션 - 6개 탭: 작업내용, 인원, 장비, 자재, 공사량, 작업사진 - 작업내용: 금일/명일 텍스트 + 날씨/기온/강수/미세먼지 메타 - 전일누계 + 금일 + 총계 누적 패턴 (인원/장비/자재/공사량) - 작업사진: 파일 업로드 + 사진목록/사진정보 2단 레이아웃 - 상태별 버튼 제어 (작성중→저장/삭제, 검토중→읽기전용) - 양식보기: 3페이지 전체화면 뷰어 (작업일보/인원장비/자재) - 검토자 지정 모달, 캘린더 스트립, 번개 랜덤데이터
This commit is contained in:
314
app/Http/Controllers/Juil/PmisDailyWorkReportController.php
Normal file
314
app/Http/Controllers/Juil/PmisDailyWorkReportController.php
Normal file
@@ -0,0 +1,314 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Juil;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Juil\PmisDailyWorkReport;
|
||||
use App\Models\Juil\PmisWorkReportEquipment;
|
||||
use App\Models\Juil\PmisWorkReportMaterial;
|
||||
use App\Models\Juil\PmisWorkReportPhoto;
|
||||
use App\Models\Juil\PmisWorkReportVolume;
|
||||
use App\Models\Juil\PmisWorkReportWorker;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class PmisDailyWorkReportController extends Controller
|
||||
{
|
||||
private function tenantId(): int
|
||||
{
|
||||
return (int) session('current_tenant_id', 1);
|
||||
}
|
||||
|
||||
public function show(Request $request): JsonResponse
|
||||
{
|
||||
$date = $request->input('date', now()->toDateString());
|
||||
$company = $request->input('company', '');
|
||||
|
||||
$report = PmisDailyWorkReport::tenant($this->tenantId())
|
||||
->where('date', $date)
|
||||
->when($company, fn ($q) => $q->where('company_name', $company))
|
||||
->first();
|
||||
|
||||
if (! $report) {
|
||||
$report = PmisDailyWorkReport::create([
|
||||
'tenant_id' => $this->tenantId(),
|
||||
'date' => $date,
|
||||
'company_name' => $company,
|
||||
'weather' => '맑음',
|
||||
'status' => 'draft',
|
||||
]);
|
||||
}
|
||||
|
||||
$report->load(['workers', 'equipments', 'materials', 'volumes', 'photos']);
|
||||
|
||||
return response()->json($report);
|
||||
}
|
||||
|
||||
public function monthStatus(Request $request): JsonResponse
|
||||
{
|
||||
$year = $request->integer('year', now()->year);
|
||||
$month = $request->integer('month', now()->month);
|
||||
$company = $request->input('company', '');
|
||||
|
||||
$reports = PmisDailyWorkReport::tenant($this->tenantId())
|
||||
->whereYear('date', $year)
|
||||
->whereMonth('date', $month)
|
||||
->when($company, fn ($q) => $q->where('company_name', $company))
|
||||
->withCount(['workers', 'equipments', 'materials', 'volumes', 'photos'])
|
||||
->get();
|
||||
|
||||
$result = [];
|
||||
foreach ($reports as $r) {
|
||||
$day = (int) $r->date->format('d');
|
||||
$hasData = $r->workers_count > 0 || $r->equipments_count > 0
|
||||
|| $r->materials_count > 0 || $r->volumes_count > 0
|
||||
|| $r->photos_count > 0
|
||||
|| $r->work_content_today;
|
||||
if ($hasData) {
|
||||
$result[$day] = $r->status;
|
||||
}
|
||||
}
|
||||
|
||||
return response()->json($result);
|
||||
}
|
||||
|
||||
public function update(Request $request, int $id): JsonResponse
|
||||
{
|
||||
$report = PmisDailyWorkReport::tenant($this->tenantId())->findOrFail($id);
|
||||
|
||||
$validated = $request->validate([
|
||||
'weather' => 'sometimes|string|max:50',
|
||||
'temp_low' => 'sometimes|nullable|numeric',
|
||||
'temp_high' => 'sometimes|nullable|numeric',
|
||||
'precipitation' => 'sometimes|nullable|numeric',
|
||||
'snowfall' => 'sometimes|nullable|numeric',
|
||||
'fine_dust' => 'sometimes|nullable|string|max:50',
|
||||
'ultra_fine_dust' => 'sometimes|nullable|string|max:50',
|
||||
'work_content_today' => 'sometimes|nullable|string',
|
||||
'work_content_tomorrow' => 'sometimes|nullable|string',
|
||||
'notes' => 'sometimes|nullable|string',
|
||||
'status' => 'sometimes|in:draft,review,approved',
|
||||
'options' => 'sometimes|nullable|array',
|
||||
]);
|
||||
|
||||
$report->update($validated);
|
||||
|
||||
return response()->json($report);
|
||||
}
|
||||
|
||||
public function destroy(int $id): JsonResponse
|
||||
{
|
||||
$report = PmisDailyWorkReport::tenant($this->tenantId())->findOrFail($id);
|
||||
$report->delete();
|
||||
|
||||
return response()->json(['message' => '삭제되었습니다.']);
|
||||
}
|
||||
|
||||
public function saveReviewers(Request $request, int $id): JsonResponse
|
||||
{
|
||||
$report = PmisDailyWorkReport::tenant($this->tenantId())->findOrFail($id);
|
||||
$reviewers = $request->input('reviewers', []);
|
||||
$options = $report->options ?? [];
|
||||
$options['reviewers'] = $reviewers;
|
||||
$report->update(['options' => $options]);
|
||||
|
||||
return response()->json(['message' => '검토자가 저장되었습니다.']);
|
||||
}
|
||||
|
||||
// ─── Worker CRUD ───
|
||||
|
||||
public function workerStore(Request $request): JsonResponse
|
||||
{
|
||||
$v = $request->validate([
|
||||
'report_id' => 'required|integer|exists:pmis_daily_work_reports,id',
|
||||
'work_type' => 'required|string|max:200',
|
||||
'job_type' => 'required|string|max:200',
|
||||
'prev_cumulative' => 'nullable|integer|min:0',
|
||||
'today_count' => 'nullable|integer|min:0',
|
||||
]);
|
||||
$v['tenant_id'] = $this->tenantId();
|
||||
$v['prev_cumulative'] = $v['prev_cumulative'] ?? 0;
|
||||
$v['today_count'] = $v['today_count'] ?? 0;
|
||||
$v['sort_order'] = (PmisWorkReportWorker::where('report_id', $v['report_id'])->max('sort_order') ?? 0) + 1;
|
||||
|
||||
return response()->json(PmisWorkReportWorker::create($v), 201);
|
||||
}
|
||||
|
||||
public function workerUpdate(Request $request, int $id): JsonResponse
|
||||
{
|
||||
$w = PmisWorkReportWorker::where('tenant_id', $this->tenantId())->findOrFail($id);
|
||||
$w->update($request->validate([
|
||||
'work_type' => 'sometimes|string|max:200',
|
||||
'job_type' => 'sometimes|string|max:200',
|
||||
'prev_cumulative' => 'nullable|integer|min:0',
|
||||
'today_count' => 'nullable|integer|min:0',
|
||||
]));
|
||||
|
||||
return response()->json($w);
|
||||
}
|
||||
|
||||
public function workerDestroy(int $id): JsonResponse
|
||||
{
|
||||
PmisWorkReportWorker::where('tenant_id', $this->tenantId())->findOrFail($id)->delete();
|
||||
|
||||
return response()->json(['message' => '삭제되었습니다.']);
|
||||
}
|
||||
|
||||
// ─── Equipment CRUD ───
|
||||
|
||||
public function equipmentStore(Request $request): JsonResponse
|
||||
{
|
||||
$v = $request->validate([
|
||||
'report_id' => 'required|integer|exists:pmis_daily_work_reports,id',
|
||||
'equipment_name' => 'required|string|max:200',
|
||||
'specification' => 'nullable|string|max:300',
|
||||
'prev_cumulative' => 'nullable|integer|min:0',
|
||||
'today_count' => 'nullable|integer|min:0',
|
||||
]);
|
||||
$v['tenant_id'] = $this->tenantId();
|
||||
$v['specification'] = $v['specification'] ?? '';
|
||||
$v['prev_cumulative'] = $v['prev_cumulative'] ?? 0;
|
||||
$v['today_count'] = $v['today_count'] ?? 0;
|
||||
$v['sort_order'] = (PmisWorkReportEquipment::where('report_id', $v['report_id'])->max('sort_order') ?? 0) + 1;
|
||||
|
||||
return response()->json(PmisWorkReportEquipment::create($v), 201);
|
||||
}
|
||||
|
||||
public function equipmentUpdate(Request $request, int $id): JsonResponse
|
||||
{
|
||||
$e = PmisWorkReportEquipment::where('tenant_id', $this->tenantId())->findOrFail($id);
|
||||
$e->update($request->validate([
|
||||
'equipment_name' => 'sometimes|string|max:200',
|
||||
'specification' => 'nullable|string|max:300',
|
||||
'prev_cumulative' => 'nullable|integer|min:0',
|
||||
'today_count' => 'nullable|integer|min:0',
|
||||
]));
|
||||
|
||||
return response()->json($e);
|
||||
}
|
||||
|
||||
public function equipmentDestroy(int $id): JsonResponse
|
||||
{
|
||||
PmisWorkReportEquipment::where('tenant_id', $this->tenantId())->findOrFail($id)->delete();
|
||||
|
||||
return response()->json(['message' => '삭제되었습니다.']);
|
||||
}
|
||||
|
||||
// ─── Material CRUD ───
|
||||
|
||||
public function materialStore(Request $request): JsonResponse
|
||||
{
|
||||
$v = $request->validate([
|
||||
'report_id' => 'required|integer|exists:pmis_daily_work_reports,id',
|
||||
'material_name' => 'required|string|max:200',
|
||||
'specification' => 'nullable|string|max:300',
|
||||
'unit' => 'nullable|string|max:50',
|
||||
'design_qty' => 'nullable|numeric|min:0',
|
||||
'prev_cumulative' => 'nullable|numeric|min:0',
|
||||
'today_count' => 'nullable|numeric|min:0',
|
||||
]);
|
||||
$v['tenant_id'] = $this->tenantId();
|
||||
$v['sort_order'] = (PmisWorkReportMaterial::where('report_id', $v['report_id'])->max('sort_order') ?? 0) + 1;
|
||||
|
||||
return response()->json(PmisWorkReportMaterial::create($v), 201);
|
||||
}
|
||||
|
||||
public function materialUpdate(Request $request, int $id): JsonResponse
|
||||
{
|
||||
$m = PmisWorkReportMaterial::where('tenant_id', $this->tenantId())->findOrFail($id);
|
||||
$m->update($request->validate([
|
||||
'material_name' => 'sometimes|string|max:200',
|
||||
'specification' => 'nullable|string|max:300',
|
||||
'unit' => 'nullable|string|max:50',
|
||||
'design_qty' => 'nullable|numeric|min:0',
|
||||
'prev_cumulative' => 'nullable|numeric|min:0',
|
||||
'today_count' => 'nullable|numeric|min:0',
|
||||
]));
|
||||
|
||||
return response()->json($m);
|
||||
}
|
||||
|
||||
public function materialDestroy(int $id): JsonResponse
|
||||
{
|
||||
PmisWorkReportMaterial::where('tenant_id', $this->tenantId())->findOrFail($id)->delete();
|
||||
|
||||
return response()->json(['message' => '삭제되었습니다.']);
|
||||
}
|
||||
|
||||
// ─── Volume CRUD ───
|
||||
|
||||
public function volumeStore(Request $request): JsonResponse
|
||||
{
|
||||
$v = $request->validate([
|
||||
'report_id' => 'required|integer|exists:pmis_daily_work_reports,id',
|
||||
'work_type' => 'required|string|max:200',
|
||||
'sub_work_type' => 'nullable|string|max:200',
|
||||
'unit' => 'nullable|string|max:50',
|
||||
'design_qty' => 'nullable|numeric|min:0',
|
||||
'prev_cumulative' => 'nullable|numeric|min:0',
|
||||
'today_count' => 'nullable|numeric|min:0',
|
||||
]);
|
||||
$v['tenant_id'] = $this->tenantId();
|
||||
$v['sort_order'] = (PmisWorkReportVolume::where('report_id', $v['report_id'])->max('sort_order') ?? 0) + 1;
|
||||
|
||||
return response()->json(PmisWorkReportVolume::create($v), 201);
|
||||
}
|
||||
|
||||
public function volumeUpdate(Request $request, int $id): JsonResponse
|
||||
{
|
||||
$vol = PmisWorkReportVolume::where('tenant_id', $this->tenantId())->findOrFail($id);
|
||||
$vol->update($request->validate([
|
||||
'work_type' => 'sometimes|string|max:200',
|
||||
'sub_work_type' => 'nullable|string|max:200',
|
||||
'unit' => 'nullable|string|max:50',
|
||||
'design_qty' => 'nullable|numeric|min:0',
|
||||
'prev_cumulative' => 'nullable|numeric|min:0',
|
||||
'today_count' => 'nullable|numeric|min:0',
|
||||
]));
|
||||
|
||||
return response()->json($vol);
|
||||
}
|
||||
|
||||
public function volumeDestroy(int $id): JsonResponse
|
||||
{
|
||||
PmisWorkReportVolume::where('tenant_id', $this->tenantId())->findOrFail($id)->delete();
|
||||
|
||||
return response()->json(['message' => '삭제되었습니다.']);
|
||||
}
|
||||
|
||||
// ─── Photo CRUD ───
|
||||
|
||||
public function photoStore(Request $request): JsonResponse
|
||||
{
|
||||
$v = $request->validate([
|
||||
'report_id' => 'required|integer|exists:pmis_daily_work_reports,id',
|
||||
'location' => 'nullable|string|max:200',
|
||||
'content' => 'nullable|string|max:500',
|
||||
'photo' => 'nullable|image|max:10240',
|
||||
]);
|
||||
|
||||
$path = '';
|
||||
if ($request->hasFile('photo')) {
|
||||
$path = $request->file('photo')->store('pmis/work-report-photos', 'public');
|
||||
}
|
||||
|
||||
$photo = PmisWorkReportPhoto::create([
|
||||
'tenant_id' => $this->tenantId(),
|
||||
'report_id' => $v['report_id'],
|
||||
'photo_path' => $path,
|
||||
'location' => $v['location'] ?? '',
|
||||
'content' => $v['content'] ?? '',
|
||||
'photo_date' => now()->toDateString(),
|
||||
'sort_order' => (PmisWorkReportPhoto::where('report_id', $v['report_id'])->max('sort_order') ?? 0) + 1,
|
||||
]);
|
||||
|
||||
return response()->json($photo, 201);
|
||||
}
|
||||
|
||||
public function photoDestroy(int $id): JsonResponse
|
||||
{
|
||||
PmisWorkReportPhoto::where('tenant_id', $this->tenantId())->findOrFail($id)->delete();
|
||||
|
||||
return response()->json(['message' => '삭제되었습니다.']);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user