From c28959832ffe0cc59018da2ffdf4fac04f388649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B2=A9=E4=BB=9488?= <> Date: Tue, 13 Jan 2026 14:33:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8B=E5=8D=95=E5=B9=B6=E8=A7=A3=E5=AF=86?= =?UTF-8?q?=E9=A2=84=E7=BA=A6=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/RecordQueryController.php | 150 ++++++++++++++++++ .../resources/views/record_query.blade.php | 87 ++++++++++ Laravel/routes/web.php | 5 + Laravel/sql.sql | 89 +++++++++++ 4 files changed, 331 insertions(+) create mode 100644 Laravel/app/Http/Controllers/RecordQueryController.php create mode 100644 Laravel/resources/views/record_query.blade.php create mode 100644 Laravel/sql.sql diff --git a/Laravel/app/Http/Controllers/RecordQueryController.php b/Laravel/app/Http/Controllers/RecordQueryController.php new file mode 100644 index 0000000..704c2e1 --- /dev/null +++ b/Laravel/app/Http/Controllers/RecordQueryController.php @@ -0,0 +1,150 @@ + '', + 'endDate' => '', + 'type' => '', + 'records' => null + ]); + } + + public function query(Request $request) + { + $startDate = $request->input('start_date'); + $endDate = $request->input('end_date'); + $type = $request->input('type'); // 1预约 2登记 + + if (!$startDate || !$endDate || !$type) { + return redirect()->back()->with('error', '请填写完整查询条件'); + } + + if ($type == 1) { + // 查询预约表 + $records = DB::table('appointment_record') + ->select('name', 'tel', 'id_card_num', 'created_at', 'org_name') + ->whereBetween('created_at', [$startDate, $endDate]) + ->where('is_del', 0) + ->get(); + } else { + // 查询登记表 + $records = DB::table('examination_records') + ->select('name', 'tel', 'id_card_num', 'created_at', DB::raw('(select name from medical_institution where id = institution_id) as org_name')) + ->whereBetween('created_at', [$startDate, $endDate]) + ->where('is_del', 0) + ->get(); + } + + // 解密处理 + foreach ($records as $record) { + // 解密电话 + if ($record->tel) { + $decryptTel = HSM::HsmDecrypt($record->tel); + $record->tel = $decryptTel['status'] ? $decryptTel['data'] : '解密失败'; + } + + // 解密身份证号 + if ($record->id_card_num) { + $decryptIdCard = HSM::HsmDecrypt($record->id_card_num); + $record->id_card_num = $decryptIdCard['status'] ? $decryptIdCard['data'] : '解密失败'; + } + } + + return view('record_query', compact('records', 'startDate', 'endDate', 'type')); + } + + public function export(Request $request) + { + $startDate = $request->input('start_date'); + $endDate = $request->input('end_date'); + $type = $request->input('type'); // 1预约 2登记 + + if (!$startDate || !$endDate || !$type) { + return redirect()->back()->with('error', '请填写完整查询条件'); + } + + if ($type == 1) { + // 查询预约表 + $records = DB::table('appointment_record') + ->select('name', 'tel', 'id_card_num', 'created_at', 'org_name') + ->whereBetween('created_at', [$startDate, $endDate]) + ->where('is_del', 0) + ->get(); + } else { + // 查询登记表 + $records = DB::table('examination_records') + ->select('name', 'tel', 'id_card_num', 'created_at', DB::raw('(select name from medical_institution where id = institution_id) as org_name')) + ->whereBetween('created_at', [$startDate, $endDate]) + ->where('is_del', 0) + ->get(); + } + + // 解密处理 + foreach ($records as $record) { + // 解密电话 + if ($record->tel) { + $decryptTel = HSM::HsmDecrypt($record->tel); + $record->tel = $decryptTel['status'] ? $decryptTel['data'] : '解密失败'; + } else { + $record->tel = '空'; + } + + // 解密身份证号 + if ($record->id_card_num) { + $decryptIdCard = HSM::HsmDecrypt($record->id_card_num); + $record->id_card_num = $decryptIdCard['status'] ? $decryptIdCard['data'] : '解密失败'; + } else { + $record->id_card_num = '空'; + } + + // 处理空值 + $record->name = $record->name ?? '空'; + $record->created_at = $record->created_at ?? '空'; + $record->org_name = $record->org_name ?? '空'; + } + + // 设置CSV文件名 + $fileName = 'records_' . date('YmdHis') . '.csv'; + + // 设置响应头 + $headers = [ + 'Content-Type' => 'text/csv', + 'Content-Disposition' => 'attachment; filename="' . $fileName . '"', + ]; + + // 创建CSV内容 + $callback = function() use ($records) { + $handle = fopen('php://output', 'w'); + + // 写入BOM头,解决中文乱码问题 + fwrite($handle, chr(0xEF) . chr(0xBB) . chr(0xBF)); + + // 写入表头 + fputcsv($handle, ['姓名', '电话', '身份证号', '创建时间', '机构名称'], ','); + + // 写入数据 + foreach ($records as $record) { + fputcsv($handle, [ + $record->name, + $record->tel, + $record->id_card_num, + $record->created_at, + $record->org_name + ], ','); + } + + fclose($handle); + }; + + return response()->stream($callback, 200, $headers); + } +} diff --git a/Laravel/resources/views/record_query.blade.php b/Laravel/resources/views/record_query.blade.php new file mode 100644 index 0000000..2141de6 --- /dev/null +++ b/Laravel/resources/views/record_query.blade.php @@ -0,0 +1,87 @@ + + + + + + 记录查询 + + + + +
+

记录查询

+ + @if(session('error')) +
+ {{ session('error') }} +
+ @endif + +
+ @csrf +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+
+ + @if(isset($records)) +
+

查询结果

+

共 {{ count($records) }} 条记录

+ + +
+ @csrf + + + + +
+ +
+ + + + + + + + + + + + @foreach($records as $record) + + + + + + + + @endforeach + +
姓名电话身份证号创建时间机构名称
{{ $record->name ?? '空' }}{{ $record->tel ?? '空' }}{{ $record->id_card_num ?? '空' }}{{ $record->created_at ?? '空' }}{{ $record->org_name ?? '空' }}
+
+
+ @endif +
+ + \ No newline at end of file diff --git a/Laravel/routes/web.php b/Laravel/routes/web.php index 1b89c76..507ee12 100644 --- a/Laravel/routes/web.php +++ b/Laravel/routes/web.php @@ -48,3 +48,8 @@ Route::any('/yuju_test', function () { //测试 语句 Route::any('/pljm','App\Http\Controllers\TestController@jiami' ); Route::any('/jiemage','App\Http\Controllers\TestController@jiemi_age' ); + +// 记录查询路由 +Route::get('/record/query', 'App\Http\Controllers\RecordQueryController@index')->name('record.index'); +Route::post('/record/query', 'App\Http\Controllers\RecordQueryController@query')->name('record.query'); +Route::post('/record/export', 'App\Http\Controllers\RecordQueryController@export')->name('record.export'); diff --git a/Laravel/sql.sql b/Laravel/sql.sql new file mode 100644 index 0000000..5ecd4e6 --- /dev/null +++ b/Laravel/sql.sql @@ -0,0 +1,89 @@ +/* + Navicat Premium Data Transfer + + Source Server : 本地 + Source Server Type : MySQL + Source Server Version : 50726 + Source Host : localhost:3306 + Source Schema : common + + Target Server Type : MySQL + Target Server Version : 50726 + File Encoding : 65001 + + Date: 12/01/2026 11:06:57 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for appointment_record +-- ---------------------------- +DROP TABLE IF EXISTS `appointment_record`; +CREATE TABLE `appointment_record` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '预约记录表', + `source` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据来源', + `tel` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电话', + `sex` tinyint(2) NULL DEFAULT NULL COMMENT '性别 0女1男', + `age` int(11) NULL DEFAULT NULL COMMENT '创建记录时的年龄', + `birthday` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `fee_type` int(10) NULL DEFAULT NULL COMMENT '收费类型0免费1自费', + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容json', + `type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '体检类型 1,健康证2老年人', + `calendar_id` int(11) NULL DEFAULT NULL COMMENT '关联的机构日历表', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', + `id_card_num` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '证件号', + `person_id` int(10) NULL DEFAULT NULL COMMENT '关联的用户id', + `openid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `date` datetime(0) NULL DEFAULT NULL COMMENT '预约的日期', + `time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '预约的时间段', + `doc_type_id` int(10) NULL DEFAULT NULL COMMENT '行业证件id', + `doc_type_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '行业证件名称', + `org_id` int(10) NULL DEFAULT NULL COMMENT '预约的机构id', + `org_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '预约的机构code', + `org_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '预约的机构name', + `status` int(10) NULL DEFAULT NULL COMMENT '0关闭1已预约2已体检', + `created_at` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `updated_at` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0), + `is_del` int(4) NULL DEFAULT 0 COMMENT '0否1删除', + `hmac` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '摘要', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 40 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '预约记录表,在本平台预约的信息先进入此表,体检完成进入 ”体检记录表“' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for examination_records +-- ---------------------------- +DROP TABLE IF EXISTS `examination_records`; +CREATE TABLE `examination_records` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '体检记录表', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '体检人姓名', + `sex` tinyint(4) NULL DEFAULT NULL COMMENT '性别 0女1男', + `age` int(11) NULL DEFAULT NULL COMMENT '创建记录时的年龄', + `birthday` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `tel` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电话', + `id_card_num` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '证件号', + `head_img` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '头像base64', + `type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '1,健康证2老年人', + `industry_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '健康证行业类型名称', + `institution_id` int(11) NULL DEFAULT NULL COMMENT '体检机构ID', + `tijian_num` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '体检机构生成的体检号', + `tijian_time` datetime(0) NULL DEFAULT NULL COMMENT '体检时间', + `register_time` datetime(0) NULL DEFAULT NULL COMMENT '登记时间', + `report_file` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '体检报告文件', + `report_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '报告内容json', + `fee_type` int(2) NULL DEFAULT NULL COMMENT '收费类型0免费1自费', + `result_status` tinyint(4) NULL DEFAULT NULL COMMENT '体检结果状态 0不合格1合格', + `pdfs` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'pdf列表', + `issue_time` datetime(0) NULL DEFAULT NULL COMMENT '发证时间', + `expire_time` datetime(0) NULL DEFAULT NULL COMMENT '证件到期时间', + `is_del` int(4) NULL DEFAULT 0 COMMENT '是否删除 0否1是', + `created_at` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP(0), + `updated_at` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0), + `hmac` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `is_sanfang` tinyint(4) NULL DEFAULT 0 COMMENT '是否是三方机构0否1是', + `is_has_file` tinyint(4) NULL DEFAULT 0 COMMENT '是否上传证明文件(三方免费必须传文件)', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '体检记录表' ROW_FORMAT = Dynamic; + +SET FOREIGN_KEY_CHECKS = 1;