NameRuleController.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <?php
  2. namespace App\Http\Controllers\API;
  3. use App\Exports\DownloadHelper;
  4. use App\Exports\NameRuleExport;
  5. use App\Http\Controllers\Controller;
  6. use App\Http\Requests\API\NamingRule\AutonameRequest;
  7. use App\Http\Requests\API\NamingRule\CombinationSettingRequest;
  8. use App\Http\Requests\API\NamingRule\CreateOrUpdateRequest;
  9. use App\Http\Requests\API\NamingRule\ParseRequest;
  10. use App\Http\Resources\API\NamingRuleCombinationResource;
  11. use App\Http\Resources\API\NamingRuleResource;
  12. use App\Http\Resources\API\NamingRuleSimpleResource;
  13. use App\Imports\NameRuleImport;
  14. use App\Models\Asset;
  15. use App\Models\CustomField;
  16. use App\Models\Enums\LibraryType;
  17. use App\Models\NamingRule;
  18. use App\Models\Project;
  19. use App\Services\NamingRule\NamingRuleCheck;
  20. use Illuminate\Http\Request;
  21. use Illuminate\Support\Facades\Auth;
  22. use Illuminate\Support\Facades\DB;
  23. use Maatwebsite\Excel\Facades\Excel;
  24. class NameRuleController extends Controller
  25. {
  26. use DownloadHelper;
  27. /**
  28. * Display a listing of the resource.
  29. */
  30. public function index(Request $request)
  31. {
  32. $pageSize=$request->get('page_size') ?? 10;
  33. $sort=$request->input('sort','desc');
  34. $namingRules = NamingRule::allowed()->with(['company'])->filter($request->all())->orderBy('created_at',$sort)->paginate($pageSize);
  35. if(Auth::user()->super_admin){
  36. $namingRules->transform(function (NamingRule $namingRules) {
  37. $namingRules->display_id = $namingRules->id;
  38. return $namingRules;
  39. });
  40. return NamingRuleResource::collection($namingRules);
  41. }
  42. return NamingRuleResource::collection($namingRules);
  43. }
  44. /**
  45. * Store a newly created resource in storage.
  46. */
  47. public function store(CreateOrUpdateRequest $request)
  48. {
  49. $formData = $request->only(['name', 'status', 'company_id', 'global']);
  50. if (! Auth::user()->super_admin) {
  51. $formData['company_id'] = Auth::user()->company_id;
  52. unset($formData['global']);
  53. }
  54. NamingRule::create($formData);
  55. return $this->created();
  56. }
  57. /**
  58. * Display the specified resource.
  59. */
  60. public function show(string $id)
  61. {
  62. $namingRule = NamingRule::query()->allowed()->findOrFail($id);
  63. return new NamingRuleResource($namingRule);
  64. }
  65. /**
  66. * Update the specified resource in storage.
  67. */
  68. public function update(CreateOrUpdateRequest $request, string $id)
  69. {
  70. $namingRule = NamingRule::query()->allowed()->findOrFail($id);
  71. $namingRule->fill($request->only([
  72. 'name', 'status', 'global'
  73. ]));
  74. $namingRule->save();
  75. return $this->noContent();
  76. }
  77. /**
  78. * Remove the specified resource from storage.
  79. */
  80. public function destroy(string $id)
  81. {
  82. DB::transaction(function () use ($id) {
  83. $namerule = NamingRule::query()->allowed()->findOrFail($id);
  84. $namerule->delete();
  85. $customfield = CustomField::query()->where('group', $id);
  86. if (!empty($customfield)) {
  87. $customfield->delete();
  88. }
  89. });
  90. return $this->noContent();
  91. }
  92. public function enabled()
  93. {
  94. $namingRules = NamingRule::where('status', 1)->where(function ($query) {
  95. return $query->where("company_id", Auth::user()->company_id)->orWhere(function ($query){
  96. $query->where('company_id',0)->where( 'global',1);
  97. });
  98. })->select(['id', 'name'])->get();
  99. return $this->success([
  100. 'data' => $namingRules
  101. ]);
  102. }
  103. public function combinationSetting(CombinationSettingRequest $request, string $id)
  104. {
  105. $namingRule = NamingRule::query()->allowed()->findOrFail($id);
  106. $namingRule->combination_rules = $request->all();
  107. $namingRule->save();
  108. return $this->noContent();
  109. }
  110. public function combinationShow(string $id){
  111. $nameRule=NamingRule::query()->allowed()->findOrFail($id);
  112. return new NamingRuleCombinationResource($nameRule);
  113. }
  114. public function autoname(AutonameRequest $request, string $id)
  115. {
  116. $namingRule = NamingRule::query()->allowed()->findOrFail($id);
  117. if (! $namingRule->combination_rules) {
  118. return $this->badRequest("Please set naming combination rules");
  119. }
  120. $code = match ($request->code_type) {
  121. "project","container_project"=> Project::query()->find($request->code_id)?->code,
  122. "container_asset" => Asset::query()->find($request->code_id)?->code,
  123. "container_custom"=>'custom',
  124. default => ""
  125. };
  126. if (! $code) {
  127. return $this->badRequest("The supported type or selected item does not exist");
  128. }
  129. $name = $code;
  130. foreach ($namingRule->combination_rules as $rule) {
  131. if (! isset($request->fields[$rule['field']])) {
  132. return $this->badRequest(sprintf("%s field is required", $rule['field']));
  133. }
  134. $name .= $rule['link'] . $request->fields[$rule['field']];
  135. }
  136. return $this->success([
  137. 'data' => $name
  138. ]);
  139. }
  140. public function parse(ParseRequest $request, string $id)
  141. {
  142. $namingRule = NamingRule::query()->allowed()->findOrFail($id);
  143. if (! $namingRule->combination_rules) {
  144. return $this->badRequest("Please set naming combination rules");
  145. }
  146. $code = match (LibraryType::from($request->object_type)) {
  147. LibraryType::PROJECT => Project::query()->find($request->object_id)?->code,
  148. LibraryType::ASSET => Asset::query()->find($request->object_id)?->code,
  149. LibraryType::CUSTOM =>"custom",
  150. };
  151. $namingRuleCheck = new NamingRuleCheck();
  152. $items = [];
  153. $index=1;
  154. foreach ($request->names as $name) {
  155. $pathInfo = pathinfo($name);
  156. $filename=$pathInfo['filename'];
  157. $items[] = [
  158. 'index'=>$index++,
  159. 'name' => $name,
  160. ...$namingRuleCheck->checkByName($filename, $namingRule, $code)
  161. ];
  162. }
  163. return $this->success([
  164. 'data' => $items,
  165. ]);
  166. }
  167. public function exportCustom(Request $request)
  168. {
  169. return $this->downloadExcelHelper(
  170. new NameRuleExport(),
  171. "NameRule",
  172. $request->get("extension"),
  173. );
  174. }
  175. public function importCustom(Request $request)
  176. {
  177. Excel::import(new NameRuleImport(), $request->file("file"));
  178. return $this->created();
  179. }
  180. }