Browse Source

审批单可见性调整

moell 8 months ago
parent
commit
e97556a2ae

+ 12 - 3
app/Http/Controllers/API/ApprovalController.php

@@ -20,6 +20,7 @@ use App\Models\Enums\ObjectApprovalStatus;
 use App\Repositories\ActionRepository;
 use App\Services\Approval\ActionService;
 use App\Services\Approval\StoreService;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 
@@ -30,7 +31,15 @@ class ApprovalController extends Controller
      */
     public function index(Request $request)
     {
-        $approvals = Approval::with(['createdBy'])->filter($request->all())->orderByDesc("created_at")->paginate();
+        $query = Approval::with(['createdBy']);
+
+        match ($request->get("tab")) {
+            'wait_for_me' => $query->allowed(true),
+            'pr' => $query->where("created_by", Auth::id()),
+            default => $query->allowed(),
+        };
+
+        $approvals = $query->filter($request->all())->orderByDesc("created_at")->paginate();
 
         return new ApprovalCollection($approvals);
     }
@@ -52,7 +61,7 @@ class ApprovalController extends Controller
     {
         $approval = Approval::query()
             ->where("id", $id)
-            ->where(fn($query) => $query->where("users", 'like', '%,'.Auth::id().',%')->orWhere("created_by", Auth::id()))
+            ->allowed()
             ->firstOrFail();
 
         $approvalObjectType = ApprovalObjectType::from($approval->object_type);
@@ -88,7 +97,7 @@ class ApprovalController extends Controller
     public function action(ActionRequest $request, string $id, ActionService $actionService)
     {
         $approval = Approval::query()
-            ->where("users", 'like', '%,'.Auth::id().',%')
+            ->allowed(true)
             ->whereIn("status", [
                 ObjectApprovalStatus::DOING->value,
             ])

+ 0 - 13
app/ModelFilters/ApprovalFilter.php

@@ -17,19 +17,6 @@ class ApprovalFilter extends ModelFilter
     */
     public $relations = [];
 
-    public function setup()
-    {
-        $tab = $this->input['tab'] ?? null;
-
-        $this->where(function ($query) use ($tab) {
-            return match ($tab) {
-                'wait_for_me' => $query->where("users", 'like', '%,'.Auth::id().',%')->where("status", ObjectApprovalStatus::DOING),
-                'approved' => $query,
-                'pr' => $query->where("created_by", Auth::id()),
-                default => $query->where("created_by", Auth::id())->orWhere("users", 'like', '%,'.Auth::id().',%'),
-            };
-        });
-    }
 
     public function type($type): ModelFilter
     {

+ 26 - 0
app/Models/Approval.php

@@ -2,10 +2,14 @@
 
 namespace App\Models;
 
+use App\Models\Enums\ApprovalMode;
+use App\Models\Scopes\CompanyScope;
 use EloquentFilter\Filterable;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Support\Facades\Auth;
 
 class Approval extends Model
 {
@@ -21,8 +25,14 @@ class Approval extends Model
         'remark',
         'created_by',
         'status',
+        'company_id'
     ];
 
+    protected static function booted(): void
+    {
+        static::addGlobalScope(new CompanyScope);
+    }
+
     public function approvalFlow()
     {
         return $this->belongsTo(ApprovalFlow::class)->withTrashed();
@@ -32,4 +42,20 @@ class Approval extends Model
     {
         return $this->belongsTo(User::class, 'created_by');
     }
+
+    public function scopeAllowed(Builder $query, bool $isAction = false): void
+    {
+        $query->where(function(Builder $query) {
+            $query->where("users", 'like', '%,'.Auth::id().',%')
+                ->whereIn("approval_mode", [
+                    ApprovalMode::COUNTERSIGNATURE->value,
+                    ApprovalMode::ALTERNATIVE_APPROVAL->value,
+                ]);
+        })->orWhere(function (Builder $query) {
+            $query->where("users", 'like', ','.Auth::id().',%')
+                ->whereIn("approval_mode", [
+                    ApprovalMode::SEQUENTIAL_APPROVAL->value,
+                ]);
+        })->when(! $isAction, fn(Builder $query) => $query->orWhere("created_by", Auth::id()));
+    }
 }

+ 1 - 0
app/Services/Approval/StoreService.php

@@ -52,6 +52,7 @@ class StoreService
             'remark' => $remark,
             'created_by' => Auth::id(),
             'status' => ObjectApprovalStatus::DOING,
+            'company_id' => Auth::user()->company_id,
         ]);
 
         $extraFields = [

+ 28 - 0
database/migrations/2024_07_04_215858_add_company_id_to_approvals_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::table('approvals', function (Blueprint $table) {
+            $table->integer("company_id")->after("approval_flow_id");
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('approvals', function (Blueprint $table) {
+            $table->dropColumn(['company_id']);
+        });
+    }
+};