Browse Source

project plans

moell 1 year ago
parent
commit
aa52d0bf4b

+ 34 - 0
app/Http/Controllers/API/ProjectController.php

@@ -5,8 +5,10 @@ namespace App\Http\Controllers\API;
 use App\Http\Controllers\Controller;
 use App\Http\Requests\API\Project\CreateOrUpdateRequest;
 use App\Http\Requests\API\Project\PostponeRequest;
+use App\Http\Resources\API\PlanResource;
 use App\Http\Resources\API\ProjectResource;
 use App\Models\Enums\ProjectStatus;
+use App\Models\Plan;
 use App\Models\Project;
 use App\Models\ProjectAsset;
 use App\Models\ProjectPlan;
@@ -167,4 +169,36 @@ class ProjectController extends Controller
 
         return $this->noContent();
     }
+
+    public function linkRequirement(string $id)
+    {
+
+    }
+
+    public function unlinkRequirement(string $id)
+    {
+
+    }
+
+    public function linkRequirementByPlan(string $id)
+    {
+
+    }
+
+    public function plan(string $id)
+    {
+        $project = Project::findOrFail($id);
+
+        return PlanResource::collection($project->plans);
+    }
+
+    public function requirement(string $id)
+    {
+
+    }
+
+    public function notLinkAssetRequirement(string $id)
+    {
+
+    }
 }

+ 22 - 0
app/Http/Resources/API/PlanResource.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace App\Http\Resources\API;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class PlanResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return [
+            'id' => $this->id,
+            'title' => $this->title,
+        ];
+    }
+}

+ 5 - 0
app/Models/Project.php

@@ -19,4 +19,9 @@ class Project extends Model
     {
         static::addGlobalScope(new CompanyScope);
     }
+
+    public function plans(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
+    {
+        return $this->belongsToMany(Plan::class, 'project_plan');
+    }
 }

+ 15 - 0
app/Models/ProjectRequirement.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class ProjectRequirement extends Model
+{
+    use HasFactory;
+
+    protected $table = 'project_requirement';
+
+    public $timestamps = false;
+}

+ 28 - 0
database/migrations/2024_01_23_130940_craete_project_requirement_table.php

@@ -0,0 +1,28 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::create('project_requirement', function (Blueprint $table) {
+            $table->id();
+            $table->integer('project_id')->index();
+            $table->integer('requirement_id')->index();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('project_requirement');
+    }
+};

+ 15 - 1
routes/api.php

@@ -36,5 +36,19 @@ Route::middleware(['auth:sanctum'])->group(function () {
     Route::patch("project/{project}/closed", [API\ProjectController::class, "closed"])->name("project.closed");
     Route::patch("project/{project}/start", [API\ProjectController::class, "start"])->name("project.start");
     Route::patch("project/{project}/pause", [API\ProjectController::class, "pause"])->name("project.pause");
-    Route::patch("project/{project}/postpone", [API\ProjectController::class, "postpone"])->name("project.postpone");
+    Route::patch("project/{project}/postpone", [API\ProjectController::class, "postpone"])
+        ->name("project.postpone");
+    Route::patch("project/{project}/link-requirement", [API\ProjectController::class, "linkRequirement"])
+        ->name("project.link-requirement");
+    Route::patch("project/{project}/unlink-requirement", [API\ProjectController::class, "unlinkRequirement"])
+        ->name("project.unlink-requirement");
+    Route::patch("project/{project}/unlink-requirement-by-plan/{project_requirement}", [API\ProjectController::class, "linkRequirementByPlan"])
+        ->name("project.unlink-requirement-by-plan");
+
+    Route::get("project/{project}/plan", [API\ProjectController::class, "plan"])
+        ->name("project.plan"); //项目关联计划
+    Route::get("project/{project}/requirement", [API\ProjectController::class, "requirement"])
+        ->name("project.requirement"); //项目需求
+    Route::get("project/{project}/not-link-asset-requirement", [API\ProjectController::class, "notLinkAssetRequirement"])
+        ->name("project.not-link-asset-requirement"); //项目未关联的资产需求
 });

+ 24 - 0
tests/Feature/API/ProjectTest.php

@@ -6,6 +6,7 @@ use App\Models\Asset;
 use App\Models\Enums\ProjectStatus;
 use App\Models\Plan;
 use App\Models\Project;
+use App\Models\ProjectPlan;
 use Carbon\Carbon;
 use Illuminate\Foundation\Testing\RefreshDatabase;
 use Illuminate\Foundation\Testing\WithFaker;
@@ -141,4 +142,27 @@ class ProjectTest extends TestCase
 
         $response->assertStatus(204);
     }
+
+    public function test_project_plans_test(): void
+    {
+        $project = Project::factory()->create();
+        $plan = Plan::factory()->create();
+
+        $projectPlan = ProjectPlan::create([
+            'project_id' => $project->id,
+            'plan_id' => $plan->id,
+        ]);
+
+        $response = $this->get(route('project.plan', ['project' => $project->id]));
+
+        $response->assertStatus(200)
+            ->assertJsonStructure([
+                'data' => [
+                    '*' => [
+                        'id',
+                        'title'
+                    ]
+                ]
+            ])->assertJsonPath("data.0.id", $projectPlan->id);
+    }
 }