下单并解密预约记录

main
岩仔88 3 weeks ago
parent 765e541056
commit c28959832f

@ -0,0 +1,150 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Lib\HSM;
class RecordQueryController extends Controller
{
public function index()
{
return view('record_query', [
'startDate' => '',
'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);
}
}

@ -0,0 +1,87 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>记录查询</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container mt-5">
<h2 class="text-center mb-4">记录查询</h2>
@if(session('error'))
<div class="alert alert-danger">
{{ session('error') }}
</div>
@endif
<form action="{{ route('record.query') }}" method="POST" class="mb-5">
@csrf
<div class="row g-3">
<div class="col-md-4">
<label for="start_date" class="form-label">开始日期</label>
<input type="datetime-local" class="form-control" id="start_date" name="start_date" value="{{ $startDate ?? '' }}" required>
</div>
<div class="col-md-4">
<label for="end_date" class="form-label">结束日期</label>
<input type="datetime-local" class="form-control" id="end_date" name="end_date" value="{{ $endDate ?? '' }}" required>
</div>
<div class="col-md-4">
<label for="type" class="form-label">记录类型</label>
<select class="form-select" id="type" name="type" required>
<option value="" {{ empty($type ?? '') ? 'selected' : '' }}>请选择类型</option>
<option value="1" {{ ($type ?? '') == 1 ? 'selected' : '' }}>预约</option>
<option value="2" {{ ($type ?? '') == 2 ? 'selected' : '' }}>登记</option>
</select>
</div>
</div>
<div class="mt-4 text-center">
<button type="submit" class="btn btn-primary btn-lg">查询</button>
</div>
</form>
@if(isset($records))
<div class="mt-5">
<h3>查询结果</h3>
<p>共 {{ count($records) }} 条记录</p>
<!-- 导出CSV按钮 -->
<form action="{{ route('record.export') }}" method="POST" style="display: inline;">
@csrf
<input type="hidden" name="start_date" value="{{ $startDate }}">
<input type="hidden" name="end_date" value="{{ $endDate }}">
<input type="hidden" name="type" value="{{ $type }}">
<button type="submit" class="btn btn-success mb-3">导出CSV</button>
</form>
<div class="table-responsive">
<table class="table table-bordered table-hover">
<thead class="table-dark">
<tr>
<th>姓名</th>
<th>电话</th>
<th>身份证号</th>
<th>创建时间</th>
<th>机构名称</th>
</tr>
</thead>
<tbody>
@foreach($records as $record)
<tr>
<td>{{ $record->name ?? '空' }}</td>
<td>{{ $record->tel ?? '空' }}</td>
<td>{{ $record->id_card_num ?? '空' }}</td>
<td>{{ $record->created_at ?? '空' }}</td>
<td>{{ $record->org_name ?? '空' }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
@endif
</div>
</body>
</html>

@ -48,3 +48,8 @@ Route::any('/yuju_test', function () { //测试 语句
Route::any('/pljm','App\Http\Controllers\TestController@jiami' ); Route::any('/pljm','App\Http\Controllers\TestController@jiami' );
Route::any('/jiemage','App\Http\Controllers\TestController@jiemi_age' ); 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');

@ -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;
Loading…
Cancel
Save