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
+
+
+
+ @if(isset($records))
+
+
查询结果
+
共 {{ count($records) }} 条记录
+
+
+
+
+
+
+
+
+ | 姓名 |
+ 电话 |
+ 身份证号 |
+ 创建时间 |
+ 机构名称 |
+
+
+
+ @foreach($records as $record)
+
+ | {{ $record->name ?? '空' }} |
+ {{ $record->tel ?? '空' }} |
+ {{ $record->id_card_num ?? '空' }} |
+ {{ $record->created_at ?? '空' }} |
+ {{ $record->org_name ?? '空' }} |
+
+ @endforeach
+
+
+
+
+ @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;