Browse Source

Project operation record & project start, suspend, close, etc. are improved

moell 1 year ago
parent
commit
28efd3f0c1

+ 26 - 3
app/Http/Controllers/API/ProjectController.php

@@ -15,6 +15,7 @@ use App\Http\Resources\API\ProjectRequirementResource;
 use App\Http\Resources\API\ProjectResource;
 use App\Http\Resources\API\RequirementResource;
 use App\Models\Asset;
+use App\Models\Enums\ObjectAction;
 use App\Models\Enums\ProjectStatus;
 use App\Models\Plan;
 use App\Models\Project;
@@ -22,6 +23,7 @@ use App\Models\ProjectAsset;
 use App\Models\ProjectPlan;
 use App\Models\ProjectRequirement;
 use App\Models\Requirement;
+use App\Repositories\ActionRepository;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 
@@ -61,6 +63,8 @@ class ProjectController extends Controller
 
         $project->save();
 
+        ActionRepository::createByProject($project, ObjectAction::CREATED);
+
         if ($request->has("assets")) {
             foreach ($request->get("assets", []) as $assetId) {
                 ProjectAsset::create([
@@ -106,6 +110,8 @@ class ProjectController extends Controller
 
         $project->save();
 
+        ActionRepository::createByProject($project, ObjectAction::EDITED);
+
         if ($request->has("assets")) {
             ProjectAsset::where('project_id', $project->id)->delete();
 
@@ -140,39 +146,54 @@ class ProjectController extends Controller
 
         $project->delete();
 
+        ActionRepository::createByProject($project, ObjectAction::DELETED);
+
         return $this->noContent();
     }
 
-    public function closed(string $id)
+    public function closed(Request $request, string $id)
     {
         $project = Project::findOrFail($id);
 
         $project->status = ProjectStatus::CLOSED->value;
         $project->save();
 
+        ActionRepository::createByProject($project, ObjectAction::CLOSED, $request->get("comment"));
+
         return $this->noContent();
     }
 
-    public function start(string $id)
+    public function start(Request $request, string $id)
     {
         $project = Project::findOrFail($id);
 
         $project->status = ProjectStatus::DOING->value;
         $project->save();
 
+        ActionRepository::createByProject($project, ObjectAction::STARTED, $request->get("comment"));
+
         return $this->noContent();
     }
 
-    public function pause(string $id)
+    public function pause(Request $request, string $id)
     {
         $project = Project::findOrFail($id);
 
         $project->status = ProjectStatus::PAUSE->value;
         $project->save();
 
+        ActionRepository::createByProject($project, ObjectAction::PAUSED, $request->get("comment"));
+
         return $this->noContent();
     }
 
+    /**
+     * 延期
+     *
+     * @param PostponeRequest $request
+     * @param string $id
+     * @return \Illuminate\Http\Response
+     */
     public function postpone(PostponeRequest $request, string $id)
     {
         $project = Project::findOrFail($id);
@@ -182,6 +203,8 @@ class ProjectController extends Controller
         ]));
         $project->save();
 
+        ActionRepository::createByProject($project, ObjectAction::DELAY, $request->get("comment"));
+
         return $this->noContent();
     }
 

+ 17 - 0
app/Models/Action.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Action extends Model
+{
+    use HasFactory;
+
+    protected $guarded = ['id'];
+
+    protected $casts = [
+        'extra_fields' => 'array',
+    ];
+}

+ 12 - 0
app/Models/Enums/ActionObjectType.php

@@ -0,0 +1,12 @@
+<?php
+
+namespace App\Models\Enums;
+
+enum ActionObjectType: string
+{
+    case ASSET = "asset";
+
+    case PROJECT = "project";
+
+    case TASK = "task";
+}

+ 50 - 0
app/Models/Enums/ObjectAction.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace App\Models\Enums;
+
+enum ObjectAction: string
+{
+    case UPLOADED = "uploaded";
+
+    case UNDELETED = "undeleted";
+
+    case SUBMITTED = "submitted";
+
+    case STARTED = "started";
+
+    case REVIEWED = "reviewed";
+
+    case RESTARTED = "restarted";
+
+    case RESPOND = "respond";
+
+    case PAUSED = "paused";
+
+    case OPENED = "opened";
+
+    case MOVED = "moved";
+
+    case ISSUED = "issued";
+
+    case FINISHED = "finished";
+
+    case CREATED = "created";
+
+    case EDITED = "edited";
+
+    case DONE = "done";
+
+    case DELAY = "delay"; //延迟
+
+    case DELETED = "deleted";
+
+    case CONFIRMED = "confirmed";
+
+    case CLOSED = "closed";
+
+    case CHANGED = "changed";
+
+    case CANCELED = "canceled";
+
+    case ASSIGNED = "assigned";
+}

+ 49 - 0
app/Repositories/ActionRepository.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace App\Repositories;
+
+use App\Models\Action;
+use App\Models\Enums\ActionObjectType;
+use App\Models\Enums\ObjectAction;
+use App\Models\Project;
+use Illuminate\Support\Facades\Auth;
+
+class ActionRepository
+{
+    public static function create(
+        int $objectId,
+        ActionObjectType $objectType,
+        ObjectAction $action,
+        int|null $projectId = null,
+        string $comment = null,
+        array $extraFields = []
+    ): \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Builder
+    {
+        return Action::query()->create([
+            "object_id" => $objectId,
+            "object_type" => $objectType->value,
+            "action" => $action,
+            "project_id" => $projectId,
+            "comment" => $comment,
+            "extra_fields" => $extraFields ?: null,
+            "created_by" => Auth::id(),
+        ]);
+    }
+
+    public static function createByProject(
+        Project $project,
+        ObjectAction $action,
+        string $comment = null,
+        array $extraFields = []
+    ): \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Builder
+    {
+        return self::create(
+            $project->id,
+            ActionObjectType::PROJECT,
+            $action,
+            $project->id,
+            $comment,
+            $extraFields
+        );
+    }
+}

+ 34 - 0
database/migrations/2024_03_13_213605_create_actions_table.php

@@ -0,0 +1,34 @@
+<?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('actions', function (Blueprint $table) {
+            $table->id();
+            $table->integer("object_id")->index();
+            $table->string("object_type", 50);
+            $table->integer("project_id")->nullable()->index();
+            $table->string("action", 50);
+            $table->text("comment")->nullable();
+            $table->integer("created_by")->nullable();
+            $table->json("extra_fields")->nullable();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('actions');
+    }
+};