You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
4.4 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;
class ItemDuiBiController extends Controller
{
public function compareWithTxt(Request $request)
{
try {
// 1. 读取并解析TXT文件
$filePath = storage_path('app/medical_items.txt');
if (!File::exists($filePath)) {
return view('compare-result', [
'error' => '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()
]);
}
}
}