cqp 1 bulan lalu
induk
melakukan
117e826d62

+ 45 - 1
app/Model/DataScopeBaseModel.php

@@ -6,8 +6,12 @@ use Illuminate\Database\Eloquent\Model;
 
 class DataScopeBaseModel extends Model
 {
-    //人员id字段
+    //人员id字段 创建人
     const employee_column = '';
+    //有权限的人的表
+    const table_column = '';
+    //有权限的人的表关联id
+    const table_id_column = '';
 
     public function __construct(array $attributes = [])
     {
@@ -79,6 +83,46 @@ class DataScopeBaseModel extends Model
         }
     }
 
+    //根据公司过滤 加人员
+    public function scopeTopAndEmployeeClear($query, $user, $search)
+    {
+        $top_depart_id = "top_depart_id";
+
+        $table = $query->getQuery()->from;
+        $alias = $table; // 默认为原表名
+
+        // 如果 $table 里包含 " as ",说明有别名,截取别名部分
+        if (strpos($table, ' as ') !== false) {
+            $segments = explode(' as ', $table);
+            $table = trim(end($segments));
+
+            $top_depart_id = $table . '.top_depart_id';
+        }
+
+        $query->where($top_depart_id, $user['top_depart_id']);
+
+        // 获取模型的实例
+        $model = $query->getModel();
+        // 获取模型类名
+        $className = get_class($model);
+        $relationTable = defined($className . '::table_column') ? constant($className . '::table_column') : '';
+        $relationTableId = defined($className . '::table_id_column') ? constant($className . '::table_id_column') : '';
+
+        if($user['is_admin'] != Employee::IS_ADMIN_TWO){
+            if (! empty($relationTable) && ! empty($relationTableId)) {
+                $query->whereExists(function ($subQuery) use ($relationTable, $user, $alias, $relationTableId) {
+                    $subQuery->from($relationTable)
+                        ->whereColumn($relationTable . ".{$relationTableId}", $alias . '.id') // 关联主表的 ID
+                        ->where($relationTable . '.data_id', $user['id'])         // 过滤当前操作人
+                        ->where($relationTable . '.del_time', 0)                 // 排除已删除的关联记录
+                        ->where($relationTable . '.top_depart_id', 0);
+                });
+            }
+        }
+
+        return $query;
+    }
+
     public function getQx($data, $user){
         if(empty($data['menu_id'])) return Employee::AUTH_ONE; // 我的
         if($user['is_admin'] == Employee::IS_ADMIN_TWO) return Employee::AUTH_THREE; // 全部

+ 2 - 0
app/Model/Item.php

@@ -11,6 +11,8 @@ class Item extends DataScopeBaseModel
     const UPDATED_AT = 'upd_time';
     protected $dateFormat = 'U';
     const employee_column = "crt_id";
+    const table_column = "item_employee";
+    const table_id_column = "item_id";
 
     public static $field = ['title','id','code','start_time','end_time','mark','crt_id','crt_time','state','budget','charge_id','item_attribute','field','is_review_required','review_id','priority_id'];
     public static $report_field_1 = ['title','id','code','start_time','end_time','mark','budget','field'];

+ 2 - 1
app/Model/ItemNode.php

@@ -11,7 +11,8 @@ class ItemNode extends DataScopeBaseModel
     const UPDATED_AT = 'upd_time';
     protected $dateFormat = 'U';
     const employee_column = "crt_id";
-
+    const table_column = "item_node_employee";
+    const table_id_column = "item_node_id";
     const Order_type = "item_node";
 
     public static $field = ['*'];

+ 12 - 0
app/Model/ItemNodeEmployee.php

@@ -0,0 +1,12 @@
+<?php
+
+namespace App\Model;
+
+class ItemNodeEmployee extends DataScopeBaseModel
+{
+    protected $guarded = [];
+    protected $table = "item_node_employee"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+}

+ 33 - 6
app/Service/ItemService.php

@@ -9,6 +9,7 @@ use App\Model\ItemDetails;
 use App\Model\ItemEmployee;
 use App\Model\ItemNode;
 use App\Model\ItemNodeDetails;
+use App\Model\ItemNodeEmployee;
 use App\Model\Tag;
 use App\Model\SysMenu;
 use Illuminate\Support\Facades\DB;
@@ -152,7 +153,7 @@ class ItemService extends Service
             ItemEmployee::where('del_time',0)
                 ->where('item_id', $id)
                 ->where('data_id', $old_employee_id)
-                ->update(['del_time' => $time]);
+                ->delete();
 
             ItemEmployee::insert([
                 'item_id' => $id,
@@ -288,10 +289,10 @@ class ItemService extends Service
         return $model;
     }
 
-    public function itemCommon2($data,$user, $field = []){
+    public function itemCommon1($data,$user, $field = []){
         if(empty($field)) $field = Item::$field;
 
-        $model = Item::TopClear($user,$data);
+        $model = Item::TopAndEmployeeClear($user,$data);
         $model = $model->where('del_time',0)
             ->select($field)
             ->orderby('id', 'desc');
@@ -316,7 +317,7 @@ class ItemService extends Service
             $model = $this->itemCommon($data, $user);
         }else{
             //项目管理
-            $model = $this->itemCommon2($data, $user);
+            $model = $this->itemCommon1($data, $user);
         }
 
         $list = $this->limit($model,'',$data);
@@ -509,6 +510,7 @@ class ItemService extends Service
             DB::beginTransaction();
 
             $model = ItemNode::where('id', $data['id'])->first();
+            $old_employee_id = $model->charge_id;
             $tableName = $model->getTable();
             $model->title = $data['title'] ?? '';
             $model->mark = $data['mark'] ?? "";
@@ -528,8 +530,12 @@ class ItemService extends Service
             ItemNodeDetails::where('del_time',0)
                 ->where('item_node_id', $model->id)
                 ->update(['del_time' => $time]);
+
             $this->saveNodeDetail($model->id, $time, $data);
 
+            // 人员项目节点表
+            $this->saveNodeEmployee($model->id, $time, $data, $user, $old_employee_id);
+
             list($status, $msg) = CustomFieldSettingService::syncCustomFieldData($model->id, $tableName, $data, $user);
             if (! $status) {
                 DB::rollBack();
@@ -576,7 +582,11 @@ class ItemService extends Service
             $model->top_depart_id = $data['top_depart_id'];
             $model->save();
 
-            $this->saveNodeDetail($model->id, time(), $data);
+            $time = time();
+            $this->saveNodeDetail($model->id, $time, $data);
+
+            // 人员项目节点表
+            $this->saveNodeEmployee($model->id, $time, $data, $user);
 
             list($status, $msg) = CustomFieldSettingService::syncCustomFieldData($model->id, $tableName, $data, $user);
             if (!$status) {
@@ -593,6 +603,23 @@ class ItemService extends Service
         return [true, ''];
     }
 
+    private function saveNodeEmployee($id, $time, $data, $user, $old_employee_id = 0){
+        if($old_employee_id != $data['charge_id']){
+            ItemNodeEmployee::where('del_time',0)
+                ->where('item_node_id', $id)
+                ->where('data_id', $old_employee_id)
+                ->delete();
+
+            ItemNodeEmployee::insert([
+                'item_node_id' => $id,
+                'item_id' => $data['item_id'],
+                'data_id' => $data['charge_id'],
+                'top_depart_id' => $user['top_depart_id'],
+                'crt_time' => $time
+            ]);
+        }
+    }
+
     private function saveNodeDetail($id, $time, $data){
         if(! empty($data['man_list'])){
             $unit = [];
@@ -730,7 +757,7 @@ class ItemService extends Service
     public function itemNodeCommon($data,$user, $field = []){
         if(empty($field)) $field = ItemNode::$field;
 
-        $model = ItemNode::TopClear($user,$data);
+        $model = ItemNode::TopAndEmployeeClear($user,$data);
         $model = $model->where('del_time',0)
             ->select($field)
             ->orderby('id', 'desc');