RequirementController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. <?php
  2. namespace App\Http\Controllers\API;
  3. use App\Exports\DownloadHelper;
  4. use App\Exports\RequirementExport;
  5. use App\Http\Controllers\Controller;
  6. use App\Http\Requests\API\Requirement\ClosedRequest;
  7. use App\Http\Requests\API\Requirement\CreateOrUpdateRequest;
  8. use App\Http\Requests\API\Requirement\LinkPlanRequest;
  9. use App\Http\Requests\API\Requirement\BatchCreateRequest;
  10. use App\Http\Resources\API\AssetRequirementResource;
  11. use App\Http\Resources\API\RequirementResource;
  12. use App\Http\Resources\API\RequirementSimpleResource;
  13. use App\Imports\RequirementImport;
  14. use App\Models\Approval;
  15. use App\Models\Asset;
  16. use App\Models\Enums\ActionObjectType;
  17. use App\Models\Enums\FileObjectType;
  18. use App\Models\Enums\RequirementStatus;
  19. use App\Models\Enums\ObjectAction;
  20. use App\Models\Plan;
  21. use App\Models\ProjectRequirement;
  22. use App\Models\Requirement;
  23. use App\Repositories\ActionRepository;
  24. use App\Services\File\FileAssociationService;
  25. use App\Services\History\ModelChangeDetector;
  26. use Illuminate\Http\Request;
  27. use Illuminate\Support\Facades\Auth;
  28. use Illuminate\Support\Facades\DB;
  29. use Maatwebsite\Excel\Facades\Excel;
  30. class RequirementController extends Controller
  31. {
  32. use DownloadHelper;
  33. /**
  34. * Display a listing of the resource.
  35. */
  36. public function index(Request $request)
  37. {
  38. $pageSize=$request->get('page_size') ?? 10;
  39. $requirements = Requirement::filter($request->all())
  40. ->allowed()
  41. ->where('company_id',Auth::user()->company_id)
  42. ->orderBy('created_at', $request->input('sort','desc'))
  43. ->with(['createdBy', 'plan','group','asset.parent','projects'])
  44. ->paginate($pageSize);
  45. make_display_id($requirements,$pageSize);
  46. return AssetRequirementResource::collection($requirements);
  47. }
  48. //公共Requirement查询
  49. public function publicSearch(Request $request)
  50. {
  51. $pageSize=$request->get('page_size') ?? 10;
  52. $requirements = Requirement::filter($request->all())
  53. ->allowed()
  54. ->where('company_id',Auth::user()->company_id)
  55. ->orderByDesc('created_at')
  56. ->paginate($pageSize);
  57. make_display_id($requirements,$pageSize);
  58. return RequirementSimpleResource::collection($requirements);
  59. }
  60. // public function byAsset(Request $request,string $assetId)
  61. // {
  62. // $requirements=Requirement::filter($request->all())->with(['createdBy', 'plan','group']) ->where('asset_id', $assetId)->simplePaginate();
  63. //
  64. // return AssetRequirementResource::collection($requirements);
  65. // }
  66. public function export(Request $request)
  67. {
  68. return $this->downloadExcelHelper(
  69. new RequirementExport(),
  70. "requirement",
  71. $request->get("extension"),
  72. );
  73. }
  74. /**
  75. * Store a newly created resource in storage.
  76. */
  77. public function store(FileAssociationService $service, CreateOrUpdateRequest $request)
  78. {
  79. $requirement = new Requirement();
  80. $requirement->mergeFillable([
  81. 'company_id', 'created_by',
  82. ]);
  83. $service->check(
  84. $request->get("file_ids", []),
  85. FileObjectType::REQUIREMENT,
  86. $request->get("file_uuid"),
  87. );
  88. $requirement->fill([
  89. ...$request->all(),
  90. 'company_id' => Auth::user()->company_id,
  91. 'description' => $request->description? (new \App\Services\File\ImageUrlService)->interceptImageUrl($request->description) : null,
  92. 'created_by' => Auth::id(),
  93. ]);
  94. $requirement->save();
  95. //如果选择了需求关联的项目,则同时进行关联
  96. $projectsId = $request->get('project_id', []);
  97. if(!empty($projectsId) && $projectsId !== []){
  98. foreach ($projectsId as $projectId){
  99. ProjectRequirement::query()->firstOrCreate([
  100. 'project_id' => $projectId,
  101. 'requirement_id' => $requirement->id,
  102. 'asset_id' => $request->asset_id,
  103. 'requirement_group_id'=> $request->requirement_group_id,
  104. ]);
  105. }
  106. }
  107. ActionRepository::createRequirement(
  108. $requirement, ObjectAction::CREATED
  109. );
  110. $service->association($requirement->id);
  111. return $this->created();
  112. }
  113. /**
  114. * Display the specified resource.
  115. */
  116. public function show(string $id)
  117. {
  118. $requirement = Requirement::query()->allowed()->with('projects')->findOrFail($id);
  119. return new RequirementResource($requirement);
  120. }
  121. /**
  122. * Update the specified resource in storage.
  123. */
  124. public function update(CreateOrUpdateRequest $request, string $id)
  125. {
  126. $requirement = Requirement::allowed()->findOrFail($id);
  127. $requirement->fill([
  128. ...$request->all(),
  129. 'description' => $request->description? (new \App\Services\File\ImageUrlService)->interceptImageUrl($request->description) : null,
  130. ]);
  131. $changes = ModelChangeDetector::detector(ActionObjectType::REQUIREMENT, $requirement);
  132. DB::transaction(function () use ($requirement,$request) {
  133. ProjectRequirement::where('requirement_id', $requirement->id)->delete();
  134. $requirement->save();
  135. //如果选择了需求关联的项目,则同时进行关联
  136. $projectsId=$request->project_id;
  137. if (!empty($request->project_id)){
  138. foreach ($projectsId as $projectId){
  139. ProjectRequirement::query()->firstOrCreate([
  140. 'project_id' => $projectId,
  141. 'requirement_id' => $requirement->id,
  142. 'asset_id' => $request->asset_id,
  143. 'requirement_group_id'=> $request->requirement_group_id,
  144. ]);
  145. }
  146. }
  147. });
  148. ActionRepository::createRequirement(
  149. $requirement, ObjectAction::EDITED,objectChanges: $changes
  150. );
  151. return $this->noContent();
  152. }
  153. /**
  154. * Remove the specified resource from storage.
  155. */
  156. public function destroy(string $id)
  157. {
  158. $requirement = Requirement::query()->allowed()->with(['projects','tasks'])->findOrFail($id);
  159. $requirement->delete();
  160. Approval::query()->where('object_type','requirement')->where('object_id',$id)->delete();
  161. ActionRepository::createRequirement(
  162. $requirement, ObjectAction::DELETED
  163. );
  164. return $this->noContent();
  165. }
  166. public function close(Request $request,string $id){
  167. $requirement = Requirement::allowed()->findOrFail($id);
  168. $requirement->status = RequirementStatus::CLOSED->value;
  169. $changes = ModelChangeDetector::detector(ActionObjectType::REQUIREMENT, $requirement);
  170. $requirement->save();
  171. ActionRepository::createRequirement(
  172. $requirement,
  173. ObjectAction::CLOSED,
  174. $request->comment?(new \App\Services\File\ImageUrlService)->interceptImageUrl($request->comment) : null,
  175. objectChanges: $changes
  176. );
  177. return $this->noContent();
  178. }
  179. public function start(Request $request, string $id)
  180. {
  181. $requirement = Requirement::allowed()->findOrFail($id);
  182. $requirement->status = RequirementStatus::ACTIVE->value;
  183. $changes = ModelChangeDetector::detector(ActionObjectType::REQUIREMENT, $requirement);
  184. $requirement->save();
  185. ActionRepository::createRequirement(
  186. $requirement,
  187. ObjectAction::STARTED,
  188. $request->comment?(new \App\Services\File\ImageUrlService)->interceptImageUrl($request->comment) : null,
  189. objectChanges: $changes
  190. );
  191. return $this->noContent();
  192. }
  193. public function linkPlan(LinkPlanRequest $request, string $planId)
  194. {
  195. $plan = Plan::query()->findOrFail($planId);
  196. Requirement::query()->allowed()->where("asset_id", $plan->asset_id)
  197. ->whereIn('id', $request->get("requirement_ids"))
  198. ->update([
  199. 'plan_id' => $plan->id,
  200. ]);
  201. return $this->noContent();
  202. }
  203. public function unlinkPlan(LinkPlanRequest $request)
  204. {
  205. Requirement::query()->allowed()->whereIn('id', $request->get("requirement_ids"))
  206. ->update([
  207. 'plan_id' => null,
  208. ]);
  209. return $this->noContent();
  210. }
  211. public function batchStore(BatchCreateRequest $request)
  212. {
  213. $requirementsData = $request->all();
  214. $companyId = Auth::user()->company_id;
  215. $created_by = Auth::id();
  216. DB::transaction(function () use ($requirementsData,$companyId,$created_by) {
  217. foreach ($requirementsData as $k => $data) {
  218. $requirement = new Requirement();
  219. $requirement->mergeFillable([
  220. 'company_id', 'created_by',
  221. ]);
  222. if($k != 0){
  223. $requirementsData[$k]["requirement_group_id"] = $requirementsData[$k]["requirement_group_id"] == 'ditto'?$requirementsData[$k-1]["requirement_group_id"]:$requirementsData[$k]["requirement_group_id"];
  224. $requirementsData[$k]["priority"] = $requirementsData[$k]["priority"] == 'ditto'? $requirementsData[$k-1]["priority"]: $requirementsData[$k]["priority"];
  225. $requirementsData[$k]["plan_id"] = $requirementsData[$k]["plan_id"] == 'ditto'? $requirementsData[$k-1]["plan_id"]: $requirementsData[$k]["plan_id"];
  226. $requirementsData[$k]["project_id"]=$requirementsData[$k]["project_id"] == 'ditto'? $requirementsData[$k-1]["project_id"]: $requirementsData[$k]["project_id"];
  227. }
  228. $requirement->fill([
  229. ...$requirementsData[$k],
  230. 'company_id' => $companyId,
  231. 'created_by' => $created_by,
  232. 'status' => RequirementStatus::ACTIVE,
  233. 'mailto' => [],
  234. ]);
  235. DB::transaction(function () use ($requirement,$requirementsData,$k) {
  236. $requirement->save();
  237. //如果选择了需求关联的项目,则同时进行关联
  238. $projectsId=$requirementsData[$k]['project_id'];
  239. if (!empty($projectsId)){
  240. foreach ($projectsId as $projectId){
  241. ProjectRequirement::query()->firstOrCreate([
  242. 'project_id' => $projectId,
  243. 'requirement_id' => $requirement->id,
  244. 'asset_id' => $requirementsData[$k]['asset_id'],
  245. 'requirement_group_id'=> $requirementsData[$k]['requirement_group_id'],
  246. ]);
  247. }
  248. }
  249. });
  250. ActionRepository::createRequirement(
  251. $requirement, ObjectAction::CREATED
  252. );
  253. }
  254. });
  255. return $this->created();
  256. }
  257. public function import(Request $request)
  258. {
  259. Excel::import(new RequirementImport(), $request->file("file"));
  260. return $this->created();
  261. }
  262. }