'TXT文件不存在,请检查 storage/app/medical_items.txt' ]); } $fileContent = File::get($filePath); $txtItems = json_decode($fileContent, true); if (json_last_error() !== JSON_ERROR_NONE) { return view('compare-result', [ 'error' => 'TXT文件不是有效的JSON格式:' . json_last_error_msg() ]); } // 提取TXT中的项目并按名称分组(保留完整信息) $txtItemsGrouped = collect($txtItems) ->filter(function($item) { return !empty($item['itemName']); }) ->groupBy('itemName') ->map(function($group) { // 每个名称只保留第一条记录的信息 return $group->first(); }); // 提取TXT中的itemName $txtNames = $txtItemsGrouped->keys()->sort()->values()->all(); // 2. 从数据库查询项目(表名:s_check_item) $dbItems = DB::table('s_check_item') ->distinct() ->where(['is_del' => 0,'item_class_id'=>4]) ->whereNotNull('item_name') ->get(['id', 'item_name']) ->keyBy('item_name'); // 按名称作为键 $dbNames = $dbItems->keys()->sort()->values()->all(); // 3. 数据比对 $txtCollection = collect($txtNames); $dbCollection = collect($dbNames); $onlyInTxt = $txtCollection->diff($dbCollection)->all(); $onlyInDb = $dbCollection->diff($txtCollection)->all(); $inBothNames = $txtCollection->intersect($dbCollection)->all(); // 4. 处理两者都存在的项目,关联设备信息 $inBothWithDevices = []; foreach ($inBothNames as $name) { // 获取TXT中的scheduleName $txtItem = $txtItemsGrouped->get($name); $scheduleNames = !empty($txtItem['scheduleName']) ? explode(',', $txtItem['scheduleName']) : []; // 去除空格并过滤空值 $scheduleNames = array_filter(array_map('trim', $scheduleNames)); // 获取数据库项目ID $checkItem = $dbItems->get($name); $checkItemId = $checkItem ? $checkItem->id : null; // 查询匹配的设备ID $deviceIds = []; if (!empty($scheduleNames)) { $devices = DB::table('s_devices') ->whereIn('device_name', $scheduleNames) ->get(['id', 'device_name']); $deviceIds = $devices->pluck('id')->all(); } $inBothWithDevices[] = [ 'name' => $name, 'check_item_id' => $checkItemId, 'schedule_names' => $scheduleNames, 'device_ids' => $deviceIds, 'device_count' => count($deviceIds) ]; } // 5. 传递数据到视图 return view('compare-result', [ 'summary' => [ 'txt_total' => count($txtNames), 'db_total' => count($dbNames), 'only_in_txt_count' => count($onlyInTxt), 'only_in_db_count' => count($onlyInDb), 'in_both_count' => count($inBothNames) ], 'onlyInTxt' => $onlyInTxt, 'onlyInDb' => $onlyInDb, 'inBoth' => $inBothWithDevices, 'error' => null ]); } catch (\Exception $e) { return view('compare-result', [ 'error' => '比对失败:' . $e->getMessage() ]); } } }