store-manage/app/Http/Controllers/Api/WorkflowController.php

136 lines
4.2 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Admin\Services\WorkFlowService;
use App\Enums\CheckStatus;
use App\Exceptions\RuntimeException;
use App\Http\Resources\TaskResource;
use App\Http\Resources\WorkflowLogResource;
use App\Models\TaskHygiene;
use App\Models\WorkflowCheck;
use App\Models\WorkflowLog;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class WorkflowController extends Controller
{
public function index(Request $request)
{
$request->validate([
'subject_type' => 'required',
]);
$subjectType = $request->input('subject_type');
$user = $this->guard()->user();
$include = ['check'];
if ($request->input('include')) {
$explodes = explode(',', $request->input('include'));
$include = array_merge($include, $explodes);
}
$orderBy = <<<'MySQL'
CASE
WHEN check_status = 2 THEN 100
ELSE 0
END
MySQL;
$list = WorkflowLog::with($include)
->whereHas('check', fn ($q) => $q->where('subject_type', $subjectType))
->own($user)
->where('check_status', '>', CheckStatus::None->value)
->orderBy(DB::raw($orderBy), 'DESC')
->orderBy('id', 'desc')
->paginate($request->input('per_page'));
return WorkflowLogResource::collection($list);
}
public function show($id, Request $request, WorkFlowService $service)
{
$include = ['check'];
if ($request->input('include')) {
$explodes = explode(',', $request->input('include'));
$include = array_merge($include, $explodes);
}
$info = WorkflowLog::with($include)->findOrFail($id);
// 当前用户是否可以审核
$checkable = false;
$user = $this->guard()->user();
if ($user && $info->check_status == CheckStatus::Processing && $service->authCheck($user, $info)) {
$checkable = true;
}
return ['data' => WorkflowLogResource::make($info), 'checkable' => $checkable];
}
public function logs($id, Request $request)
{
$check = WorkflowCheck::findOrFail($id);
$logs = $check->logs()->with(['checkUser'])->sort()->get();
return WorkflowLogResource::collection($logs);
}
public function cancel($id, Request $request, WorkFlowService $workFlowService)
{
$user = $this->guard()->user();
$check = WorkflowCheck::where('employee_id', $user->id)->findOrFail($id);
try {
DB::beginTransaction();
if (! $workFlowService->cancel($check)) {
throw new RuntimeException($workFlowService->getError());
}
DB::commit();
return response('', Response::HTTP_OK);
} catch (\Exception $e) {
DB::rollBack();
throw new RuntimeException($e->getMessage());
}
}
public function check($id, Request $request, WorkFlowService $workFlowService)
{
$request->validate([
'status' => ['required'],
'remarks' => [Rule::requiredIf(fn () => ! $request->input('status'))],
], [
'remarks.required_if' => '未通过原因必填',
]);
$log = WorkflowLog::findOrFail($id);
$user = $this->guard()->user();
try {
DB::beginTransaction();
if (! $workFlowService->check($user, $log, (bool) $request->input('status'), ['remarks' => $request->input('remarks')])) {
throw new RuntimeException($workFlowService->getError());
}
DB::commit();
return response('', Response::HTTP_OK);
} catch (\Exception $e) {
DB::rollBack();
throw new RuntimeException($e->getMessage());
}
}
protected function mapResource(string $model)
{
$class = match ($model) {
TaskHygiene::class => TaskResource::class,
default => 'App\\Http\\Resources\\'.class_basename($model).'Resource',
};
if (! class_exists($class)) {
throw new RuntimeException('未知的 subject_type');
}
return $class;
}
}