cqp 1 giorno fa
parent
commit
bc0089eacf
1 ha cambiato i file con 20 aggiunte e 7 eliminazioni
  1. 20 7
      app/Service/ItemService.php

+ 20 - 7
app/Service/ItemService.php

@@ -3005,16 +3005,23 @@ class ItemService extends Service
         $item_node_mission_id = $data['item_node_mission_id'] ?? 0;
         $employee_id = $data['employee_id'] ?? 0;
 
+        // 是否是超级管理员
+        $isAdmin = ($user['is_admin'] ?? 0) == Employee::IS_ADMIN_TWO;
+
         $model = ItemNodeMission::from('item_node_mission as i');
         $model = $model->TopAndEmployeeClear($user, $data)
+
             // 2. 优化重点:把报告可见性逻辑直接作为 JOIN 条件绑定
-            ->leftJoin('item_node_mission_content as e', function($join) use ($user) {
+            ->leftJoin('item_node_mission_content as e', function($join) use ($user, $isAdmin) {
                 $join->on('i.id', '=', 'e.item_node_mission_id')
-                    ->where('e.del_time', 0)
-                    ->where(function($q) use ($user) {
+                    ->where('e.del_time', 0);
+
+                // 如果【不是】超级管理员,才进行严格的“负责人/自己填写的报告”权限隔离
+                if (!$isAdmin) {
+                    $join->where(function($q) use ($user) {
                         // 或者是当前登录人自己写的报告
                         $q->where('e.data_id', $user['id'])
-                            // 或者当前登录人是这笔任务的负责人(利用已铺平的负责人表,精准到任务 i.id)
+                            // 或者当前登录人是这笔任务的负责人
                             ->orWhereExists(function ($subQuery) use ($user) {
                                 $subQuery->from('item_node_mission_employee')
                                     ->whereColumn('item_node_mission_employee.item_node_mission_id', 'i.id')
@@ -3022,17 +3029,23 @@ class ItemService extends Service
                                     ->where('item_node_mission_employee.del_time', 0);
                             });
                     });
+                }
+                // 如果是超级管理员,直接跳过限制,无缝关联该任务下的【所有】进展报告
             })
             ->where('e.del_time', 0)
+
+            // 【重要修复】:下面的业务筛选必须查主表 `i` 的字段!
+            // 因为主表 `i` 是必然有数据的,而 `e` 是 leftJoin 出来的,查 `i` 才能保证索引和数据的绝对正确
             ->when(! empty($item_id), function ($query) use($item_id){
-                return $query->where('e.item_id', $item_id);
+                return $query->where('i.item_id', $item_id);
             })
             ->when(! empty($item_node_id), function ($query) use($item_node_id){
-                return $query->where('e.item_node_id', $item_node_id);
+                return $query->where('i.item_node_id', $item_node_id);
             })
             ->when(! empty($item_node_mission_id), function ($query) use($item_node_mission_id){
-                return $query->where('e.item_node_mission_id', $item_node_mission_id);
+                return $query->where('i.item_node_mission_id', $item_node_mission_id);
             })
+            // 如果传了具体要查某个人(employee_id)写的报告,这里可以查 e.data_id
             ->when(! empty($employee_id), function ($query) use($employee_id){
                 return $query->where('e.data_id', $employee_id);
             })