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.

195 lines
8.9 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\Internal;
use App\Http\Controllers\Controller;
use App\Services\Admin\YeWu\HealthCheckupService;
use App\Services\OrgService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
class CheckUpController extends Controller
{
//给第三的接口,创建体检记录
public function CreateCheckupRecord(Request $request)
{
// 验证请求数据
$encrypted_data = request('encrypted_data');
$iv = request('iv');
$encrypt_iv = bin2hex(random_bytes(16 / 2));
if (!isset($iv)) return \Yz::echoError1('加密时使用的iv不能为空');
$encrypted_data = \App\Lib\Tools::AESDecrypt($encrypted_data, config('app.globals.AES_KEY'), $iv);
if (!$encrypted_data) return \Yz::echoError1('encrypted_data解密失败');
$encrypted_data = json_decode($encrypted_data, true);
$validator = Validator::make($encrypted_data, [
'checkup_info.type' => 'required|integer',
'checkup_info.free_type' => 'required|integer',
'checkup_info.name' => 'required|string',
'checkup_info.sex' => 'required|integer',
'checkup_info.tel' => 'required|string',
'checkup_info.id_card_num' => 'required|string',
'checkup_info.doc_type_id' => 'required|integer',
'checkup_info.doc_type_name' => 'required|string',
'checkup_info.org_sn' => 'required|string',
'checkup_info.tijian_num' => 'required|string',
'checkup_info.tijian_time' => 'required|date',
'checkup_info.report_content' => 'required|array',
'checkup_info.report_content.*.item_name' => 'required|string',
'checkup_info.report_content.*.item_result' => 'required|string',
'checkup_info.report_content.*.item_range' => 'required|array',
'checkup_info.report_content.*.flag' => 'required|string',
'checkup_info.report_content.*.item_unit' => 'required|string',
'checkup_info.report_content.*.check_time' => 'required|date',
'checkup_info.result_status' => 'required|integer',
'checkup_info.shenhe_time' => 'required|date',
'checkup_info.result_content' => 'required|string',
]);
if ($validator->fails()) {
return \Yz::echoError1($validator->errors());
}
$checkupInfo = $encrypted_data['checkup_info'];
$checkupInfo['institution_sn'] = $checkupInfo['org_sn'];
$checkupInfo['industry_type'] = $checkupInfo['doc_type_name'];
$checkupInfo['register_time'] = $checkupInfo['tijian_time'];
$checkupInfo['issue_time'] = null;
$checkupInfo['expire_time'] = null;
$checkupInfo['is_sanfang'] = 1;
$s = app()->make(HealthCheckupService::class);
$res = $s->CreateRecord($checkupInfo);
if ($res['status'] !== true) {
return \Yz::echoError1($res['msg']);
} else {
$msg = "记录完成";
if ($checkupInfo['type'] == 1 and $checkupInfo['free_type'] == 0) {
$msg = $msg . ",免费用户请调用上传资料接口上传相关证明文件,否则无效。";
}
$send_data = ["tijian_num" => $checkupInfo['tijian_num']];
$send_data = json_encode($send_data, JSON_UNESCAPED_UNICODE);
return \Yz::Return(true, $msg, ['info' => $this->AESEncrypt($send_data, $encrypt_iv), 'iv' => $encrypt_iv]);
}
}
//给第三的接口上传体检结果pdf文档
public function UploadPdf(Request $request)
{
$encrypted_data = request('encrypted_data');
$iv = request('iv');
$encrypt_iv = bin2hex(random_bytes(16 / 2));
if (!isset($iv)) return \Yz::echoError1('加密时使用的iv不能为空');
$encrypted_data = \App\Lib\Tools::AESDecrypt($encrypted_data, config('app.globals.AES_KEY'), $iv);
if (!$encrypted_data) return \Yz::echoError1('encrypted_data解密失败');
$decrypted_data = json_decode($encrypted_data, true);
//dd($decrypted_data);
// 验证请求数据
$validator = Validator::make($decrypted_data, [
'type' => 'required|integer', //1证明材料2报告材料pdf
'tijian_num' => 'required|string',
'org_sn' => 'required|string',
'files' => 'required|array',
// 'files.*' => 'required|file|mimes:pdf,jpg,png,webp|max:2048',// 每个文件必须是PDF格式且大小不超过2MB
]);
if ($validator->fails()) {
return \Yz::echoError1($validator->errors());
}
$type = $decrypted_data['type'];
//查询体检号是否存在
$service = new OrgService();
$res = $service->GetOrgInfo($decrypted_data['org_sn']);
if ($res['status'] !== true) {
return \Yz::echoError1($res['msg']);
}
//查询体检号是否存在
$checkupInfo = DB::table('examination_records')
->where([
'tijian_num' => $decrypted_data['tijian_num'],
'institution_id' => $res['data']->id,
])->orderBy('id', 'desc')->first();
if (!$checkupInfo) {
return \Yz::echoError1("体检号不存在");
}
// if ($request->hasFile('files') && $request->file('files')) {
if (count($decrypted_data['files']) > 0) {
$filesUrls = [];
if ($type == 1) {
$path = 'uploads/sanfang_img/' . date('Ymd'); // 根据当前日期创建子目录
}
if ($type == 2) {
$path = 'uploads/pdfs/' . date('Ymd'); // 根据当前日期创建子目录
}
$mimeTypeToExtension = [
'image/png' => 'png',
'image/jpeg' => 'jpg',
'application/pdf' => 'pdf',
];
foreach ($decrypted_data['files'] as $file) {
// 保存文件到磁盘
$fullPath = public_path($path);
if (!is_dir($fullPath)) {
mkdir($fullPath, 0777, true); // 创建目录,包括必要的父目录
}
$file_data = \App\Lib\Tools::AESDecrypt($file, config('app.globals.AES_KEY'), $iv);
// 检查文件大小是否超过2MB
$fileSize = strlen($file_data); // 获取文件数据的长度(字节数)
if ($fileSize > 2 * 1024 * 1024) { // 如果文件大小超过2MB
return \Yz::echoError1("文件大小超过2MB上传被拒绝。");
}
$finfo = finfo_open();
// 根据文件内容获取其MIME类型
$mimeType = finfo_buffer($finfo, $file_data, FILEINFO_MIME_TYPE);
// 关闭finfo资源
finfo_close($finfo);
// dd($mimeType);
if (array_key_exists($mimeType, $mimeTypeToExtension)) {
$file_extension = $mimeTypeToExtension[$mimeType];
} else {
return \Yz::echoError1("获取文件格式失败");
}
$filename = uniqid() . '_' . mt_rand(0, 999999) . '.' . $file_extension;
// 定义存储路径
file_put_contents($fullPath . '/' . $filename, $file_data);
// $file->storeAs($path, $filename, 'public'); // 使用 'public' 磁盘
$filesUrls[] = '/storage/' . $path . '/' . $filename;
}
if ($type == 1) {
foreach ($filesUrls as $fileUrl) {
$insert_img = DB::table('appointment_img')->insert([
'type' => 9,//通用证明材料
'imgurl' => $fileUrl,
'examination_records_id' => $checkupInfo->id,
]);
}
if ($insert_img) {
$u = DB::table('examination_records')->where('id', $checkupInfo->id)->update(['is_has_file' => 1, 'updated_at' => date('Y-m-d H:i:s')]);
}
}
if ($type == 2) {
$u = DB::table('examination_records')->where('id', $checkupInfo->id)->update(['pdfs' => json_encode($filesUrls, JSON_UNESCAPED_UNICODE), 'updated_at' => date('Y-m-d H:i:s')]);
}
if (!$u) {
return \Yz::echoError1("上传文件失败");
}
$send_data = ["tijian_num" => $checkupInfo->tijian_num];
$send_data = json_encode($send_data, JSON_UNESCAPED_UNICODE);
return \Yz::Return(true, '上传成功', ['info' => $this->AESEncrypt($send_data, $encrypt_iv), 'iv' => $encrypt_iv]);
}
return \Yz::echoError1("上传文件失败");
}
function AESEncrypt($data, $encrypt_iv)
{
// return $data;
return \App\Lib\Tools::AESEncrypt($data, config('app.globals.AES_KEY'), $encrypt_iv);
}
}