|
|
@@ -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);
|
|
|
})
|