From be63ae2ab28d73007b4589c76f3ce8ad614ed916 Mon Sep 17 00:00:00 2001 From: yanzai Date: Wed, 23 Jul 2025 13:52:59 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=AF=B9=E6=AF=94=EF=BC=8C?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=95=B0=E6=8D=AE=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../API/Admin/YeWu/PlanListController.php | 4 - .../Controllers/API/ItemDuiBiController.php | 122 +++++++++++ Laravel/app/Http/Middleware/Log.php | 4 + .../Services/Admin/YeWu/PlanListService.php | 2 +- .../resources/views/compare-result.blade.php | 204 ++++++++++++++++++ Laravel/routes/api.php | 1 - Laravel/routes/web.php | 3 +- 7 files changed, 333 insertions(+), 7 deletions(-) create mode 100644 Laravel/app/Http/Controllers/API/ItemDuiBiController.php create mode 100644 Laravel/resources/views/compare-result.blade.php diff --git a/Laravel/app/Http/Controllers/API/Admin/YeWu/PlanListController.php b/Laravel/app/Http/Controllers/API/Admin/YeWu/PlanListController.php index 12f617e..3905aca 100644 --- a/Laravel/app/Http/Controllers/API/Admin/YeWu/PlanListController.php +++ b/Laravel/app/Http/Controllers/API/Admin/YeWu/PlanListController.php @@ -56,10 +56,6 @@ class PlanListController extends Controller } } - - - - return \Yz::Return(false, '已有重复的计划明细,禁止创建!' . $msg . '已存在相同记录,
存在于:
' . $msglist . '
对应记录Id为:' . $msgIds . '
请先删除后再操作', $checkList); } //查询勾选的时间范围内所有的节假日 diff --git a/Laravel/app/Http/Controllers/API/ItemDuiBiController.php b/Laravel/app/Http/Controllers/API/ItemDuiBiController.php new file mode 100644 index 0000000..938f7f5 --- /dev/null +++ b/Laravel/app/Http/Controllers/API/ItemDuiBiController.php @@ -0,0 +1,122 @@ + '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() + ]); + } + } +} diff --git a/Laravel/app/Http/Middleware/Log.php b/Laravel/app/Http/Middleware/Log.php index 7f995c3..4ddfa33 100644 --- a/Laravel/app/Http/Middleware/Log.php +++ b/Laravel/app/Http/Middleware/Log.php @@ -52,6 +52,10 @@ class Log return $response; + } + public function terminate(Request $request, $response) + { + } public static function getTrustedProxiesIp(){ //获取用户真实ip \request()->setTrustedProxies(\request()->getClientIps(),Request::HEADER_X_FORWARDED_FOR); diff --git a/Laravel/app/Services/Admin/YeWu/PlanListService.php b/Laravel/app/Services/Admin/YeWu/PlanListService.php index 145b0dd..4de4bf5 100644 --- a/Laravel/app/Services/Admin/YeWu/PlanListService.php +++ b/Laravel/app/Services/Admin/YeWu/PlanListService.php @@ -142,7 +142,7 @@ WHERE $planPatientType = explode(",", $p->patient_type); if (!empty(array_diff($commPatientType, $planPatientType))) { continue; - } + } //过期的排在后面 $time = $p->date . ' ' . $p->end_time; if ($time > $nowtime) { diff --git a/Laravel/resources/views/compare-result.blade.php b/Laravel/resources/views/compare-result.blade.php new file mode 100644 index 0000000..5862a29 --- /dev/null +++ b/Laravel/resources/views/compare-result.blade.php @@ -0,0 +1,204 @@ + + + + + + 项目比对结果 + + + + + +
+

项目比对结果

+ + + @if($error) +
+ {{ $error }} +
+ @else + +
+

+ 统计摘要 +

+
+
+ TXT文件总项目数: + {{ $summary['txt_total'] }} +
+
+ 数据库总项目数: + {{ $summary['db_total'] }} +
+
+ 仅TXT存在: + {{ $summary['only_in_txt_count'] }} +
+
+ 仅数据库存在: + {{ $summary['only_in_db_count'] }} +
+
+ 两者都存在: + {{ $summary['in_both_count'] }} +
+
+
+ + +
+

+ 仅TXT文件中存在的项目({{ count($onlyInTxt) }}项) +

+
+ + + + + + + + + @foreach($onlyInTxt as $index => $name) + + + + + @endforeach + @if(empty($onlyInTxt)) + + + + @endif + +
序号项目名称
{{ $index + 1 }}{{ $name }}
无数据
+
+
+ + +
+

+ 仅数据库中存在的项目({{ count($onlyInDb) }}项) +

+
+ + + + + + + + + @foreach($onlyInDb as $index => $name) + + + + + @endforeach + @if(empty($onlyInDb)) + + + + @endif + +
序号项目名称
{{ $index + 1 }}{{ $name }}
无数据
+
+
+ + +
+

+ 两者都存在的项目({{ count($inBoth) }}项) +

+
+ + + + + + + + + + + + + @foreach($inBoth as $index => $item) + + + + + + + + + @endforeach + @if(empty($inBoth)) + + + + @endif + +
序号项目名称s_check_item ID设备数量设备IDTXT中的scheduleName
{{ $index + 1 }}{{ $item['name'] }}{{ $item['check_item_id'] ?: '-' }}{{ $item['device_count'] }} + @if(!empty($item['device_ids'])) +
+ {{ implode(', ', $item['device_ids']) }} + @if(count($item['device_ids']) > 3) + 共 {{ count($item['device_ids']) }} 个设备ID + @endif +
+ @else + - + @endif +
+ @if(!empty($item['schedule_names'])) +
+ {{ implode(', ', $item['schedule_names']) }} + @if(count($item['schedule_names']) > 2) + 共 {{ count($item['schedule_names']) }} 个地点 + @endif +
+ @else + - + @endif +
无数据
+
+
+ @endif +
+ + diff --git a/Laravel/routes/api.php b/Laravel/routes/api.php index 5c4d81b..f6fc786 100644 --- a/Laravel/routes/api.php +++ b/Laravel/routes/api.php @@ -163,4 +163,3 @@ Route::group(['middleware'=>['log']],function () { Route::any('/PacsSaveApplyInfo','App\Http\Controllers\API\Third\CSharpController@PacsSaveApplyInfo' )->middleware('log');;//给pacs推送检查申请单 Route::any('/PacsCancelApplyInfo','App\Http\Controllers\API\Third\CSharpController@PacsCancelApplyInfo' )->middleware('log');;//给pacs推送取消检查申请单 - diff --git a/Laravel/routes/web.php b/Laravel/routes/web.php index 543ba6e..70baa7b 100644 --- a/Laravel/routes/web.php +++ b/Laravel/routes/web.php @@ -39,4 +39,5 @@ Route::get('/yiji', function (Request $request) { //cas 登录 Route::get('/casLogin', 'App\Http\Controllers\API\CAS\CasLoginController@login'); - +Route::get('/compare-items', 'App\Http\Controllers\API\ItemDuiBiController@compareWithTxt') + ->name('compare.items');