ProjectController.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. <?php
  2. namespace App\Http\Controllers\API;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\API\Project\CreateOrUpdateRequest;
  5. use App\Http\Requests\API\Project\LinkRequirementByPlanRequest;
  6. use App\Http\Requests\API\Project\LinkRequirementRequest;
  7. use App\Http\Requests\API\Project\PostponeRequest;
  8. use App\Http\Requests\API\Project\UnlinkRequirementRequest;
  9. use App\Http\Resources\API\ProjectAssetResource;
  10. use App\Http\Resources\API\ProjectDetailResource;
  11. use App\Http\Resources\API\SimplePlanResource;
  12. use App\Http\Resources\API\ProjectRequirementResource;
  13. use App\Http\Resources\API\ProjectResource;
  14. use App\Http\Resources\API\RequirementResource;
  15. use App\Models\Asset;
  16. use App\Models\Enums\ObjectAction;
  17. use App\Models\Enums\ProjectStatus;
  18. use App\Models\Plan;
  19. use App\Models\Project;
  20. use App\Models\ProjectAsset;
  21. use App\Models\ProjectPlan;
  22. use App\Models\ProjectRequirement;
  23. use App\Models\Requirement;
  24. use App\Repositories\ActionRepository;
  25. use Illuminate\Http\Request;
  26. use Illuminate\Support\Facades\Auth;
  27. class ProjectController extends Controller
  28. {
  29. /**
  30. * Display a listing of the resource.
  31. */
  32. public function index(Request $request)
  33. {
  34. $projectAsset = ProjectAsset::filter($request->all())->simplePaginate();
  35. foreach ($projectAsset as $item){
  36. $item->project = Project::find($item->project_id);
  37. $item->asset = Asset::find($item->asset_id);
  38. }
  39. return ProjectAssetResource::collection($projectAsset);
  40. }
  41. /**
  42. * Store a newly created resource in storage.
  43. */
  44. public function store(CreateOrUpdateRequest $request)
  45. {
  46. $project = new Project();
  47. $project->mergeFillable([
  48. 'company_id', 'created_by'
  49. ]);
  50. $project->fill([
  51. ...$request->all(),
  52. 'company_id' => Auth::user()->company_id,
  53. 'created_by' => Auth::id(),
  54. 'whitelist' => $request->whitelist ? sprintf(",%s", implode(',', $request->whitelist)) : null,
  55. ]);
  56. $project->save();
  57. ActionRepository::createByProject($project, ObjectAction::CREATED);
  58. if ($request->has("assets")) {
  59. foreach ($request->get("assets", []) as $assetId) {
  60. ProjectAsset::create([
  61. 'project_id' => $project->id,
  62. 'asset_id' => $assetId,
  63. ]);
  64. }
  65. }
  66. if ($request->has("plans")) {
  67. foreach ($request->get("plans", []) as $planId) {
  68. ProjectPlan::create([
  69. 'project_id' => $project->id,
  70. 'plan_id' => $planId,
  71. ]);
  72. }
  73. }
  74. return $this->created();
  75. }
  76. /**
  77. * Display the specified resource.
  78. */
  79. public function show(string $id)
  80. {
  81. $project = Project::findOrFail($id);
  82. return new ProjectDetailResource($project);
  83. }
  84. /**
  85. * Update the specified resource in storage.
  86. */
  87. public function update(CreateOrUpdateRequest $request, string $id)
  88. {
  89. $project = Project::findOrFail($id);
  90. $project->fill([
  91. ...$request->all(),
  92. 'whitelist' => $request->whitelist ? sprintf(",%s", implode(',', $request->whitelist)) : null,
  93. ]);
  94. $project->save();
  95. ActionRepository::createByProject($project, ObjectAction::EDITED);
  96. if ($request->has("assets")) {
  97. ProjectAsset::where('project_id', $project->id)->delete();
  98. foreach ($request->get("assets", []) as $assetId) {
  99. ProjectAsset::create([
  100. 'project_id' => $project->id,
  101. 'asset_id' => $assetId,
  102. ]);
  103. }
  104. }
  105. if ($request->has("plans")) {
  106. ProjectPlan::where('project_id', $project->id)->delete();
  107. foreach ($request->get("plans", []) as $planId) {
  108. ProjectPlan::create([
  109. 'project_id' => $project->id,
  110. 'plan_id' => $planId,
  111. ]);
  112. }
  113. }
  114. return $this->noContent();
  115. }
  116. /**
  117. * Remove the specified resource from storage.
  118. */
  119. public function destroy(string $id)
  120. {
  121. $project = Project::findOrFail($id);
  122. $project->delete();
  123. ActionRepository::createByProject($project, ObjectAction::DELETED);
  124. return $this->noContent();
  125. }
  126. public function closed(Request $request, string $id)
  127. {
  128. $project = Project::findOrFail($id);
  129. $project->status = ProjectStatus::CLOSED->value;
  130. $project->save();
  131. ActionRepository::createByProject($project, ObjectAction::CLOSED, $request->get("comment"));
  132. return $this->noContent();
  133. }
  134. public function start(Request $request, string $id)
  135. {
  136. $project = Project::findOrFail($id);
  137. $project->status = ProjectStatus::DOING->value;
  138. $project->save();
  139. ActionRepository::createByProject($project, ObjectAction::STARTED, $request->get("comment"));
  140. return $this->noContent();
  141. }
  142. public function pause(Request $request, string $id)
  143. {
  144. $project = Project::findOrFail($id);
  145. $project->status = ProjectStatus::PAUSE->value;
  146. $project->save();
  147. ActionRepository::createByProject($project, ObjectAction::PAUSED, $request->get("comment"));
  148. return $this->noContent();
  149. }
  150. /**
  151. * 延期
  152. *
  153. * @param PostponeRequest $request
  154. * @param string $id
  155. * @return \Illuminate\Http\Response
  156. */
  157. public function postpone(PostponeRequest $request, string $id)
  158. {
  159. $project = Project::findOrFail($id);
  160. $project->fill($request->only([
  161. 'begin', 'end'
  162. ]));
  163. $project->save();
  164. ActionRepository::createByProject($project, ObjectAction::DELAY, $request->get("comment"));
  165. return $this->noContent();
  166. }
  167. public function linkRequirement(LinkRequirementRequest $request, string $id)
  168. {
  169. $project = Project::findOrFail($id);
  170. $requirement = Requirement::findOrFail($request->requirement_id);
  171. $exists = ProjectAsset::query()
  172. ->where('project_id', $project->id)
  173. ->where('asset_id', $requirement->asset_id)
  174. ->count();
  175. if (! $exists) {
  176. return $this->forbidden("Please select the correct requirement");
  177. }
  178. ProjectRequirement::query()->firstOrCreate([
  179. 'project_id' => $project->id,
  180. 'requirement_id' => $requirement->id,
  181. ]);
  182. return $this->noContent();
  183. }
  184. public function unlinkRequirement(UnlinkRequirementRequest $request, string $id)
  185. {
  186. $project = Project::findOrFail($id);
  187. $requirement = Requirement::findOrFail($request->requirement_id);
  188. $exists = ProjectAsset::query()
  189. ->where('project_id', $project->id)
  190. ->where('asset_id', $requirement->asset_id)
  191. ->count();
  192. if (! $exists) {
  193. return $this->forbidden("Please select the correct requirement");
  194. }
  195. ProjectRequirement::query()->where([
  196. 'project_id' => $project->id,
  197. 'requirement_id' => $requirement->id,
  198. ])->delete();
  199. return $this->noContent();
  200. }
  201. public function linkRequirementByPlan(LinkRequirementByPlanRequest $request, string $id)
  202. {
  203. $project = Project::findOrFail($id);
  204. $plan = Plan::findOrFail($request->plan_id);
  205. foreach ($plan->requirements as $requirement) {
  206. ProjectRequirement::query()->firstOrCreate([
  207. 'project_id' => $project->id, 'requirement_id' => $requirement->id,
  208. ]);
  209. }
  210. return $this->noContent();
  211. }
  212. public function plan(string $id)
  213. {
  214. $project = Project::findOrFail($id);
  215. return SimplePlanResource::collection($project->plans);
  216. }
  217. public function requirement(string $id)
  218. {
  219. $project = Project::findOrFail($id);
  220. $requirements = $project->requirements()->with(['createdBy'])->simplePaginate();
  221. return ProjectRequirementResource::collection($requirements);
  222. }
  223. public function notLinkAssetRequirement(string $id)
  224. {
  225. $project = Project::findOrFail($id);
  226. $requirements = $project->assets
  227. ? Requirement::query()->whereIn('asset_id', $project->assets?->pluck('id')->toArray())->simplePaginate()
  228. : [];
  229. return RequirementResource::collection($requirements);
  230. }
  231. }