diff --git a/app/Admin/Services/AgreementService.php b/app/Admin/Services/AgreementService.php index b511aa7..f34d862 100644 --- a/app/Admin/Services/AgreementService.php +++ b/app/Admin/Services/AgreementService.php @@ -20,12 +20,19 @@ class AgreementService extends BaseService if (isset($data['images']) && $data['images']) { $images = []; foreach ($data['images'] as $value) { - $image = data_get($value, 'value'); - $url = Str::startsWith($image, ['http://', 'https://']) ? $image : Storage::url($image); - array_push($images, [ - 'value' => $image, - 'preview' => $url, - ]); + if (is_array($value)) { + $image = data_get($value, 'value'); + $url = Str::startsWith($image, ['http://', 'https://']) ? $image : Storage::url($image); + array_push($images, [ + 'value' => $image, + 'preview' => $url, + ]); + } else { + array_push($images, [ + 'value' => $value, + 'preview' => $value, + ]); + } } $data['images'] = $images; } @@ -47,14 +54,34 @@ class AgreementService extends BaseService return true; } - public function delete(string $ids): mixed + public function update($primaryKey, $data): bool { - $id = explode(',', $ids); + $model = $this->query()->whereKey($primaryKey)->firstOrFail(); + if (!$model->canUpdate()) { + return $this->setError('审核中, 无法修改'); + } + $data = $this->resloveData($data, $model); + $validate = $this->validate($data, $model); + if ($validate !== true) { + $this->setError($validate); - foreach (Agreement::whereIn('id', $id)->get() as $item) { - $item->delete(); + return false; } + $model->update($data); + $this->currentModel = $model; + return true; + } + + public function delete(string $ids): mixed + { + $list = $this->query()->with(['workflow'])->whereIn('id', explode(',', $ids))->get(); + foreach ($list as $item) { + if (!$item->canUpdate()) { + return $this->setError('审核中, 无法删除'); + } + $item->delete(); + } return true; } } diff --git a/app/Admin/Services/BaseService.php b/app/Admin/Services/BaseService.php index eb8acc5..02e300a 100644 --- a/app/Admin/Services/BaseService.php +++ b/app/Admin/Services/BaseService.php @@ -3,6 +3,7 @@ namespace App\Admin\Services; use Slowlyo\OwlAdmin\Services\AdminService; +use Illuminate\Database\Eloquent\Model; /** * @method Region getModel() @@ -14,6 +15,13 @@ class BaseService extends AdminService protected bool $modelSortAble = false; + protected Model $currentModel; + + public function getCurrentModel() + { + return $this->currentModel; + } + public function sortColumn() { return 'id'; @@ -78,7 +86,8 @@ class BaseService extends AdminService return false; } - $this->modelName::create($data); + $model = $this->modelName::create($data); + $this->currentModel = $model; return true; } @@ -93,8 +102,9 @@ class BaseService extends AdminService return false; } - - return $model->update($data); + $model->update($data); + $this->currentModel = $model; + return true; } public function delete(string $ids): mixed diff --git a/app/Http/Controllers/Api/AgreementController.php b/app/Http/Controllers/Api/AgreementController.php new file mode 100644 index 0000000..bf652f2 --- /dev/null +++ b/app/Http/Controllers/Api/AgreementController.php @@ -0,0 +1,102 @@ +guard()->user(); + $list = Agreement::with(['workflow']) + ->where('employee_id', $user->id) + ->filter($request->all()) + ->orderBy('id', 'desc') + ->paginate($request->input('per_page')); + + return AgreementResource::collection($list); + } + + public function show($id) + { + $info = Agreement::with(['employee', 'workflow'])->findOrFail($id); + + return AgreementResource::make($info); + } + + public function store(Request $request, AgreementService $service) + { + $user = $this->guard()->user(); + $data = $request->all(); + $data['employee_id'] = $user->id; + + try { + DB::beginTransaction(); + if (!$service->store($data)) { + throw new RuntimeException($result); + } + $model = $service->getCurrentModel(); + $workflow = WorkFlowService::make(); + if (!$workflow->apply($model->workflow, $user)) { + throw new RuntimeException($workflow->getError()); + } + + DB::commit(); + return response()->noContent(); + } catch (\Exception $e) { + DB::rollBack(); + throw new RuntimeException($e->getMessage()); + } + } + + public function update($id, Request $request, AgreementService $service) + { + $user = $this->guard()->user(); + $model = Agreement::where('employee_id', $user->id)->findOrFail($id); + + try { + DB::beginTransaction(); + if (!$service->update($id, $request->all())) { + throw new RuntimeException($service->getError()); + } + $workflow = WorkFlowService::make(); + if (!$workflow->apply($model->workflow, $user)) { + throw new RuntimeException($workflow->getError()); + } + + DB::commit(); + return response()->noContent(); + } catch (\Exception $e) { + DB::rollBack(); + throw new RuntimeException($e->getMessage()); + } + } + + public function destroy($id, AgreementService $service) + { + $user = $this->guard()->user(); + $model = Agreement::where('employee_id', $user->id)->findOrFail($id); + + try { + DB::beginTransaction(); + if (!$service->delete($id)) { + throw new RuntimeException($service->getError()); + } + + DB::commit(); + return response()->noContent(); + } catch (\Exception $e) { + DB::rollBack(); + throw new RuntimeException($e->getMessage()); + } + } +} diff --git a/app/Http/Controllers/Api/Hr/OvertimeController.php b/app/Http/Controllers/Api/Hr/OvertimeController.php index 193ac2c..a4e1ec0 100644 --- a/app/Http/Controllers/Api/Hr/OvertimeController.php +++ b/app/Http/Controllers/Api/Hr/OvertimeController.php @@ -42,12 +42,10 @@ class OvertimeController extends Controller try { DB::beginTransaction(); - $data = $service->resloveData($data); - $result = $service->validate($data); - if ($result !== true) { + if (!$service->store($data)) { throw new RuntimeException($result); } - $model = OvertimeApply::create($data); + $model = $service->getCurrentModel(); $workflow = WorkFlowService::make(); if (!$workflow->apply($model->workflow, $user)) { throw new RuntimeException($workflow->getError()); @@ -71,6 +69,7 @@ class OvertimeController extends Controller if (!$service->update($id, $request->all())) { throw new RuntimeException($service->getError()); } + $model = $service->getCurrentModel(); $workflow = WorkFlowService::make(); if (!$workflow->apply($model->workflow, $user)) { throw new RuntimeException($workflow->getError()); diff --git a/app/Http/Controllers/Api/Hr/SignRepairController.php b/app/Http/Controllers/Api/Hr/SignRepairController.php index 7853512..913b791 100644 --- a/app/Http/Controllers/Api/Hr/SignRepairController.php +++ b/app/Http/Controllers/Api/Hr/SignRepairController.php @@ -35,12 +35,10 @@ class SignRepairController extends Controller try { DB::beginTransaction(); - $data = $service->resloveData($data); - $result = $service->validate($data); - if ($result !== true) { + if (!$service->store($data)) { throw new RuntimeException($result); } - $model = EmployeeSignRepair::create($data); + $model = $service->getCurrentModel(); $workflow = WorkFlowService::make(); if (!$workflow->apply($model->workflow, $user)) { throw new RuntimeException($workflow->getError()); @@ -71,12 +69,9 @@ class SignRepairController extends Controller try { DB::beginTransaction(); - $data = $service->resloveData($request->all(), $model); - $result = $service->validate($data, $model); - if ($result !== true) { - throw new RuntimeException($result); + if (!$service->update($id, $request->all())) { + throw new RuntimeException($service->getError()); } - $model->update($data); $workflow = WorkFlowService::make(); if (!$workflow->apply($model->workflow, $user)) { throw new RuntimeException($workflow->getError()); diff --git a/app/Http/Controllers/Api/WorkflowController.php b/app/Http/Controllers/Api/WorkflowController.php index c1da57a..d89a8c5 100644 --- a/app/Http/Controllers/Api/WorkflowController.php +++ b/app/Http/Controllers/Api/WorkflowController.php @@ -4,7 +4,7 @@ namespace App\Http\Controllers\Api; use Illuminate\Http\{Request, Response}; use Illuminate\Database\Eloquent\Relations\Relation; -use App\Http\Resources\{ReimbursementResource, WorkflowLogResource, EmployeeSignRepairResource, HolidayApplyResource, OvertimeApplyResource}; +use App\Http\Resources\{ReimbursementResource, WorkflowLogResource, EmployeeSignRepairResource, HolidayApplyResource, OvertimeApplyResource, AgreementResource}; use App\Enums\CheckStatus; use App\Models\{WorkflowLog, WorkflowCheck}; use Illuminate\Support\Facades\DB; @@ -127,6 +127,7 @@ class WorkflowController extends Controller 'employee_sign_repairs' => EmployeeSignRepairResource::class, 'holiday_applies' => HolidayApplyResource::class, 'overtime_applies' => OvertimeApplyResource::class, + 'agreements' => AgreementResource::class, ]; return data_get($map, $key); } diff --git a/app/Http/Resources/AgreementResource.php b/app/Http/Resources/AgreementResource.php new file mode 100644 index 0000000..aa249a0 --- /dev/null +++ b/app/Http/Resources/AgreementResource.php @@ -0,0 +1,30 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'id' => $this->id, + 'name' => $this->name, + 'images' => $this->images, + + 'employee_id' => $this->employee_id, + 'employee' => EmployeeResource::make($this->whenLoaded('employee')), + + 'workflow_check' => WorkflowCheckResource::make($this->whenLoaded('workflow')), + + 'created_at' => $this->created_at->timestamp, + ]; + } +} diff --git a/routes/api.php b/routes/api.php index dc25272..d8a1b06 100644 --- a/routes/api.php +++ b/routes/api.php @@ -70,6 +70,9 @@ Route::group([ // 报销管理 Route::apiResource('reimbursements', \App\Http\Controllers\Api\ReimbursementController::class); + + // 合同管理 + Route::apiResource('agreements', \App\Http\Controllers\Api\AgreementController::class); // 审核流程 Route::get('workflow', [\App\Http\Controllers\Api\WorkflowController::class, 'index']);