ApprovalController.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  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\CopyContainerFileRequest;
  6. use App\Http\Requests\API\Approval\CreateOrUpdateRequest;
  7. use App\Http\Resources\API\ActionByApprovalLogResource;
  8. use App\Http\Resources\API\ApprovalCollection;
  9. use App\Http\Resources\API\ApprovalFlowDetailResource;
  10. use App\Http\Resources\API\FileDownloadResource;
  11. use App\Http\Resources\API\FileSimpleResource;
  12. use App\Http\Resources\API\UserProfileResource;
  13. use App\Models\Action;
  14. use App\Models\Approval;
  15. use App\Models\ApprovalFlow;
  16. use App\Models\Container;
  17. use App\Models\Enums\ApprovalFlowObjectType;
  18. use App\Models\Enums\ApprovalFlowType;
  19. use App\Models\Enums\ApprovalObjectType;
  20. use App\Models\Enums\FileObjectType;
  21. use App\Models\Enums\FolderObjectType;
  22. use App\Models\Enums\ObjectAction;
  23. use App\Models\Enums\ObjectApprovalStatus;
  24. use App\Models\File;
  25. use App\Models\Folder;
  26. use App\Models\Scopes\CompanyScope;
  27. use App\Repositories\ActionRepository;
  28. use App\Repositories\ApprovalRepository;
  29. use App\Services\Approval\ActionService;
  30. use App\Services\Approval\StoreService;
  31. use Illuminate\Database\Eloquent\Builder;
  32. use Illuminate\Http\Request;
  33. use Illuminate\Support\Facades\Auth;
  34. use function Symfony\Component\Translation\t;
  35. class ApprovalController extends Controller
  36. {
  37. /**
  38. * Display a listing of the resource.
  39. */
  40. public function index(Request $request)
  41. {
  42. $pageSize=$request->get('page_size') ?? 10;
  43. $query = Approval::with(['createdBy']);
  44. match ($request->get("tab")) {
  45. 'wait_for_me' => $query->allowed(),
  46. 'pr' => $query->where("created_by", Auth::id()),
  47. 'my_approval' => $query->where("action_users", 'like', '%,'.Auth::id().',%'),
  48. default => $query->allowed(true),
  49. };
  50. $approvals = $query->filter($request->all())->orderByDesc("created_at")->paginate($pageSize);
  51. make_display_id($approvals,$pageSize);
  52. return new ApprovalCollection($approvals);
  53. }
  54. public function publicSearch(Request $request){
  55. $pageSize=$request->get('page_size') ?? 10;
  56. $approvals= Approval::filter($request->all())->allowed(true)->orderByDesc("created_at")->paginate($pageSize);
  57. make_display_id($approvals,$pageSize);
  58. return new ApprovalCollection($approvals);
  59. }
  60. /**
  61. * Store a newly created resource in storage.
  62. */
  63. public function store(CreateOrUpdateRequest $request, StoreService $service)
  64. {
  65. $service->store();
  66. return $this->created();
  67. }
  68. /**
  69. * Display the specified resource.
  70. */
  71. public function show(string $id)
  72. {
  73. $approval = Approval::query()
  74. ->where("id", $id)
  75. ->allowed(true)
  76. ->firstOrFail();
  77. $approvalObjectType = ApprovalObjectType::from($approval->object_type);
  78. $object = $approvalObjectType
  79. ->modelBuilder()
  80. ->findOrFail($approval->object_id);
  81. $actions = Action::with(['createdBy', 'file'])->where([
  82. 'object_type' => $approvalObjectType->actionObjectType(),
  83. 'object_id' => $object->id,
  84. 'additional_id' => $approval->id,
  85. ])->orderByDesc("created_at")->get();
  86. $subObjects = [];
  87. if ($approvalObjectType == ApprovalObjectType::CONTAINER_FILE && $approval->sub_object_ids) {
  88. $containerFiles = File::query()->whereIn("id", $approval->sub_object_ids)->get();
  89. $subObjects = FileDownloadResource::collection($containerFiles);
  90. }
  91. return $this->success([
  92. 'data' => [
  93. 'id' => $approval->id,
  94. 'status' => $approval->status,
  95. 'object_type' => $approval->object_type,
  96. 'object_id' => $approval->object_id,
  97. 'object' => [
  98. 'id' => $object->id,
  99. 'name' => $object[$approvalObjectType->nameField()],
  100. ],
  101. 'remark' => $approval->remark,
  102. 'node_level' => $approval->node_level,
  103. 'created_by' => new UserProfileResource($approval->createdBy),
  104. 'approval_flow' => new ApprovalFlowDetailResource($approval->approvalFlow),
  105. 'approval_logs' => ActionByApprovalLogResource::collection($actions),
  106. 'sub_objects' => $subObjects,
  107. 'file_copied' => $approval->file_copied,
  108. 'copy_file_permission' => $approvalObjectType == ApprovalObjectType::CONTAINER_FILE
  109. && $approval->last_action_user_id == Auth::id()
  110. && $approval->status == ObjectApprovalStatus::APPROVED->value,
  111. ]
  112. ]);
  113. }
  114. public function action(ActionRequest $request, string $id, ActionService $actionService)
  115. {
  116. $approval = Approval::query()
  117. ->allowed()
  118. ->whereIn("status", [
  119. ObjectApprovalStatus::DOING->value,
  120. ])
  121. ->find($id);
  122. throw_validation_if(! $approval, "No authority for approval");
  123. $actionService->action($approval, $request->status, $request->get("comment"), $request->file("signature_file"));
  124. return $this->noContent();
  125. }
  126. public function detail(Request $request)
  127. {
  128. //判断是否已经有审批
  129. $approvalList = Approval::query()
  130. ->withoutGlobalScope(CompanyScope::class)
  131. ->where('object_type', $request->get('object_type'))
  132. ->where('object_id', $request->get('object_id'))
  133. ->get();
  134. $approval = '';
  135. foreach ($approvalList as $item) {
  136. if (in_array($request->get('file_id'),$item->sub_object_ids)){
  137. $approval = $item;
  138. }
  139. }
  140. //Get total approvalFlow
  141. if ($approval) {
  142. $approvalFlow = ApprovalFlow::query()->withoutGlobalScope(CompanyScope::class)->find($approval->approval_flow_id);
  143. }else{
  144. return $this->success([
  145. 'data' => [],
  146. ]);
  147. }
  148. //获取审批时间
  149. $action = Action::with(['createdBy', 'file'])->where([
  150. 'object_type' => $request->get('object_type'),
  151. 'object_id' => $request->get('object_id'),
  152. 'additional_id' => $approval->id,
  153. ])->orderBy("created_at")->get();
  154. return $this->success([
  155. 'data' => ApprovalRepository::approvalDetail($approvalFlow,ActionByApprovalLogResource::collection($action)),
  156. ]);
  157. }
  158. /**
  159. * Update the specified resource in storage.
  160. */
  161. public function update(CreateOrUpdateRequest $request, string $id)
  162. {
  163. $approval = Approval::query()->findOrFail($id);
  164. ApprovalObjectType::from($approval->object_type)
  165. ->modelBuilderAllowed($approval->object_id)
  166. ->findOrFail($approval->object_id);
  167. $approval->remark = $request->remark;
  168. $approval->save();
  169. return $this->noContent();
  170. }
  171. /**
  172. * Remove the specified resource from storage.
  173. */
  174. public function cancel(Request $request)
  175. {
  176. $mode = $request->get("mode", "approval");
  177. throw_validation_if(!$request->get("id"), "ID cannot be empty");
  178. $where = match ($mode) {
  179. "approval" => ["id" => $request->id],
  180. "object_type" => ["object_type" => $request->object_type, "object_id" => $request->id],
  181. default => [],
  182. };
  183. throw_validation_if(! $where, "Please enter valid parameters.");
  184. $approval = Approval::query()
  185. ->whereIn("status", [
  186. ObjectApprovalStatus::DOING->value,
  187. ])
  188. ->where($where)
  189. ->first();
  190. throw_validation_if(! $approval, "The data does not exist or the operation is denied permission.");
  191. $approvalObjectType = ApprovalObjectType::from($approval->object_type);
  192. $object = $approvalObjectType->modelBuilderAllowed($approval->object_id)->findOrFail($approval->object_id);
  193. $approval->status = ObjectApprovalStatus::CANCELED;
  194. $approval->save();
  195. ActionRepository::createByApproval($approval, ObjectAction::APPROVED_CANCELED);
  196. if ($approvalObjectType == ApprovalObjectType::CONTAINER_FILE) {
  197. File::query()->whereIn("id", $approval->sub_object_ids)->update([
  198. 'approval_status' => ObjectApprovalStatus::WAIT
  199. ]);
  200. } else {
  201. $object->approval_status = ObjectApprovalStatus::CANCELED;
  202. $object->save();
  203. }
  204. return $this->noContent();
  205. }
  206. /**
  207. * @param CopyContainerFileRequest $request
  208. * @param string $id
  209. * @return \Illuminate\Http\Response
  210. */
  211. public function copyContainerFile(CopyContainerFileRequest $request, string $id)
  212. {
  213. $approval = Approval::query()
  214. ->where("status", ObjectApprovalStatus::APPROVED->value)
  215. ->where("last_action_user_id", Auth::id())
  216. ->where("object_type", ApprovalObjectType::CONTAINER_FILE)
  217. ->find($id);
  218. throw_validation_if(! $approval, "No authority for approval");
  219. $targetFolder = Folder::query()
  220. ->where("object_type", FolderObjectType::CONTAINER)
  221. ->where("object_id", $approval->object_id)
  222. ->find($request->get("target_folder_id"));
  223. throw_validation_if(! $targetFolder, "Target folder does not exist.");
  224. $files = File::query()->whereIn("id", $approval->sub_object_ids)->get();
  225. foreach ($files as $file) {
  226. $fileBuilder = File::query()
  227. ->where('object_type', FileObjectType::CONTAINER)
  228. ->where('object_id', $file->object_id)
  229. ->where("title", $file->title)
  230. ->where("source", 1)
  231. ->where("folder_id", $targetFolder->id);
  232. $version = (clone $fileBuilder)->count();
  233. (clone $fileBuilder)->update(['is_latest_version' => 0]);
  234. $file->replicate()->fill([
  235. 'source_file_id' => $file->id,
  236. 'folder_id' => $targetFolder->id,
  237. 'version' => $version + 1,
  238. 'is_latest_version' => 1,
  239. ])->save();
  240. }
  241. $approval->file_copied = true;
  242. $approval->save();
  243. return $this->noContent();
  244. }
  245. }