ApprovalController.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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\Database\Eloquent\Builder;
  22. use Illuminate\Http\Request;
  23. use Illuminate\Support\Facades\Auth;
  24. class ApprovalController extends Controller
  25. {
  26. /**
  27. * Display a listing of the resource.
  28. */
  29. public function index(Request $request)
  30. {
  31. $pageSize=$request->get('page_size') ?? 10;
  32. $query = Approval::with(['createdBy']);
  33. match ($request->get("tab")) {
  34. 'wait_for_me' => $query->allowed(true),
  35. 'pr' => $query->where("created_by", Auth::id()),
  36. default => $query->allowed(),
  37. };
  38. $approvals = $query->filter($request->all())->orderByDesc("created_at")->paginate($pageSize);
  39. make_display_id($approvals,$pageSize);
  40. return new ApprovalCollection($approvals);
  41. }
  42. public function publicSearch(Request $request){
  43. $pageSize=$request->get('page_size') ?? 10;
  44. $approvals= Approval::filter($request->all())->allowed(true)->orderByDesc("created_at")->paginate($pageSize);
  45. make_display_id($approvals,$pageSize);
  46. return new ApprovalCollection($approvals);
  47. }
  48. /**
  49. * Store a newly created resource in storage.
  50. */
  51. public function store(CreateOrUpdateRequest $request, StoreService $service)
  52. {
  53. $service->store();
  54. return $this->created();
  55. }
  56. /**
  57. * Display the specified resource.
  58. */
  59. public function show(string $id)
  60. {
  61. $approval = Approval::query()
  62. ->where("id", $id)
  63. ->allowed()
  64. ->firstOrFail();
  65. $approvalObjectType = ApprovalObjectType::from($approval->object_type);
  66. $object = $approvalObjectType
  67. ->modelBuilder()
  68. ->find($approval->object_id);
  69. $actions = Action::with(['createdBy', 'file'])->where([
  70. 'object_type' => $approvalObjectType->actionObjectType(),
  71. 'object_id' => $object->id,
  72. 'additional_id' => $approval->id,
  73. ])->orderByDesc("created_at")->get();
  74. return $this->success([
  75. 'data' => [
  76. 'id' => $approval->id,
  77. 'status' => $approval->status,
  78. 'object_type' => $approval->object_type,
  79. 'object_id' => $approval->object_id,
  80. 'object' => [
  81. 'id' => $object->id,
  82. 'name' => $object[$approvalObjectType->nameField()],
  83. ],
  84. 'remark' => $approval->remark,
  85. 'node_level' => $approval->node_level,
  86. 'created_by' => new UserProfileResource($approval->createdBy),
  87. 'approval_flow' => new ApprovalFlowDetailResource($approval->approvalFlow),
  88. 'approval_logs' => ActionByApprovalLogResource::collection($actions),
  89. ]
  90. ]);
  91. }
  92. public function action(ActionRequest $request, string $id, ActionService $actionService)
  93. {
  94. $approval = Approval::query()
  95. ->allowed(true)
  96. ->whereIn("status", [
  97. ObjectApprovalStatus::DOING->value,
  98. ])
  99. ->find($id);
  100. throw_validation_if(! $approval, "No authority for approval");
  101. $actionService->action($approval, $request->status, $request->get("comment"), $request->file("signature_file"));
  102. return $this->noContent();
  103. }
  104. /**
  105. * Update the specified resource in storage.
  106. */
  107. public function update(CreateOrUpdateRequest $request, string $id)
  108. {
  109. $approval = Approval::query()->findOrFail($id);
  110. ApprovalObjectType::from($approval->object_type)->modelBuilderAllowed($approval->object_id)->findOrFail($approval->object_id);
  111. $approval->remark = $request->remark;
  112. $approval->save();
  113. return $this->noContent();
  114. }
  115. /**
  116. * Remove the specified resource from storage.
  117. */
  118. public function cancel(Request $request)
  119. {
  120. $mode = $request->get("mode", "approval");
  121. throw_validation_if(!$request->get("id"), "ID cannot be empty");
  122. $where = match ($mode) {
  123. "approval" => ["id" => $request->id],
  124. "object_type" => ["object_type" => $request->object_type, "object_id" => $request->id],
  125. default => [],
  126. };
  127. throw_validation_if(! $where, "Please enter valid parameters.");
  128. $approval = Approval::query()
  129. ->whereIn("status", [
  130. ObjectApprovalStatus::DOING->value,
  131. ])
  132. ->where($where)
  133. ->first();
  134. throw_validation_if(! $approval, "The data does not exist or the operation is denied permission.");
  135. $object = ApprovalObjectType::from($approval->object_type)->modelBuilderAllowed($approval->object_id)->findOrFail($approval->object_id);
  136. $approval->status = ObjectApprovalStatus::CANCELED;
  137. $approval->save();
  138. ActionRepository::createByApproval($approval, ObjectAction::APPROVED_CANCELED);
  139. $object->approval_status = ObjectApprovalStatus::WAIT;
  140. $object->save();
  141. return $this->noContent();
  142. }
  143. }