ApprovalController.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. namespace App\Http\Controllers\API;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\API\Approval\ActionRequest;
  5. use App\Http\Requests\API\Approval\CreateOrUpdateRequest;
  6. use App\Http\Resources\API\ActionByApprovalLogResource;
  7. use App\Http\Resources\API\ApprovalCollection;
  8. use App\Http\Resources\API\ApprovalFlowDetailResource;
  9. use App\Http\Resources\API\UserProfileResource;
  10. use App\Models\Action;
  11. use App\Models\Approval;
  12. use App\Models\ApprovalFlow;
  13. use App\Models\Enums\ApprovalFlowObjectType;
  14. use App\Models\Enums\ApprovalFlowType;
  15. use App\Models\Enums\ApprovalObjectType;
  16. use App\Models\Enums\ObjectAction;
  17. use App\Models\Enums\ObjectApprovalStatus;
  18. use App\Repositories\ActionRepository;
  19. use App\Services\Approval\ActionService;
  20. use App\Services\Approval\StoreService;
  21. use Illuminate\Http\Request;
  22. use Illuminate\Support\Facades\Auth;
  23. class ApprovalController extends Controller
  24. {
  25. /**
  26. * Display a listing of the resource.
  27. */
  28. public function index(Request $request)
  29. {
  30. $approvals = Approval::with(['createdBy'])->filter($request->all())->orderByDesc("created_at")->paginate();
  31. return new ApprovalCollection($approvals);
  32. }
  33. /**
  34. * Store a newly created resource in storage.
  35. */
  36. public function store(CreateOrUpdateRequest $request, StoreService $service)
  37. {
  38. $service->store();
  39. return $this->created();
  40. }
  41. /**
  42. * Display the specified resource.
  43. */
  44. public function show(string $id)
  45. {
  46. $approval = Approval::query()
  47. ->where("id", $id)
  48. ->where(fn($query) => $query->where("users", 'like', '%,'.Auth::id().',%')->orWhere("created_by", Auth::id()))
  49. ->firstOrFail();
  50. $approvalObjectType = ApprovalObjectType::from($approval->object_type);
  51. $object = $approvalObjectType
  52. ->modelBuilder()
  53. ->find($approval->object_id);
  54. $actions = Action::with(['createdBy'])->where([
  55. 'object_type' => $approvalObjectType->actionObjectType(),
  56. 'object_id' => $object->id,
  57. 'additional_id' => $approval->id,
  58. ])->orderByDesc("created_at")->get();
  59. return $this->success([
  60. 'data' => [
  61. 'id' => $approval->id,
  62. 'status' => $approval->status,
  63. 'object_type' => $approval->object_type,
  64. 'object_id' => $approval->object_id,
  65. 'object' => [
  66. 'id' => $object->id,
  67. 'name' => $object[$approvalObjectType->nameField()],
  68. ],
  69. 'remark' => $approval->remark,
  70. 'node_level' => $approval->node_level,
  71. 'created_by' => new UserProfileResource($approval->createdBy),
  72. 'approval_flow' => new ApprovalFlowDetailResource($approval->approvalFlow),
  73. 'approval_logs' => ActionByApprovalLogResource::collection($actions),
  74. ]
  75. ]);
  76. }
  77. public function action(ActionRequest $request, string $id, ActionService $actionService)
  78. {
  79. $approval = Approval::query()
  80. ->where("users", 'like', '%,'.Auth::id().',%')
  81. ->whereIn("status", [
  82. ObjectApprovalStatus::DOING->value,
  83. ])
  84. ->find($id);
  85. throw_validation_if(! $approval, "No authority for approval");
  86. $actionService->action($approval, $request->status, $request->get("comment"));
  87. return $this->noContent();
  88. }
  89. /**
  90. * Update the specified resource in storage.
  91. */
  92. public function update(CreateOrUpdateRequest $request, string $id)
  93. {
  94. $approval = Approval::query()->findOrFail($id);
  95. ApprovalObjectType::from($approval->object_type)->modelBuilderAllowed($approval->object_id)->findOrFail($approval->object_id);
  96. $approval->remark = $request->remark;
  97. $approval->save();
  98. return $this->noContent();
  99. }
  100. /**
  101. * Remove the specified resource from storage.
  102. */
  103. public function cancel(string $id)
  104. {
  105. $approval = Approval::query()
  106. ->whereIn("status", [
  107. ObjectApprovalStatus::DOING->value,
  108. ])
  109. ->findOrFail($id);
  110. $object = ApprovalObjectType::from($approval->object_type)->modelBuilderAllowed($approval->object_id)->findOrFail($approval->object_id);
  111. $approval->status = ObjectApprovalStatus::CANCELED;
  112. $approval->save();
  113. ActionRepository::createByApproval($approval, ObjectAction::APPROVED_CANCELED);
  114. $object->approval_status = ObjectApprovalStatus::WAIT;
  115. $object->save();
  116. return $this->noContent();
  117. }
  118. }