all(); $key = $request->input('key'); if (!isset($key) or empty($key) or $key <> '5Kj9P1pL0f8e7Vw3I2qX4mT6zJ1OxWcQ') { return response()->json([ 'status' => 400, 'msg' => 'key验证失败', 'transactionSerialNumber' => null, 'platReceiveTime' => null ], 400); } // 验证规则 $rules = [ 'hospitalCode' => 'required|string|max:20', 'hospitalName' => 'required|string|max:70', 'postTime' => 'required|date_format:Y-m-d H:i:s.u', 'usci' => 'required|string|max:20', 'healthExaminationId' => 'required|string|max:26', 'examTypeCode' => 'required|string|max:2', 'examTypeName' => 'required|string|max:50', 'examTypeText' => 'required|string|max:50', 'examDate' => 'required|date', 'healthCertificateId' => 'required|string|max:26', 'billingStatus' => 'required|string|max:1|in:0,1', 'name' => 'required|string|max:70', 'photo' => 'required|string', // base64 string 'tel' => 'required|string|max:20', 'gender' => 'required|string|max:1', 'genderName' => 'required|string|max:20', 'identifierTypeCode' => 'required|string|max:2', 'identifierTypeName' => 'required|string|max:50', 'identifierValue' => 'required|string|max:18', 'hasBacterialDysentery' => 'required|string|max:1', 'bacterialDysenteryPractitionerName' => 'required|string|max:70', 'bacterialDysenteryDate' => 'required|date', 'hasTyphoid' => 'required|string|max:1', 'typhoidPractitionerName' => 'required|string|max:70', 'typhoidDate' => 'required|date', 'hasViralHepatitis' => 'required|string|max:1', 'viralHepatitisPractitionerName' => 'required|string|max:70', 'viralHepatitisDate' => 'required|date', 'hasActiveTB' => 'required|string|max:1', 'activeTBPractitionerCode' => 'required|string|max:70', 'activeTBDate' => 'required|date', 'hasSkinDiseases' => 'required|string|max:1', 'skinDiseasesPractitionerName' => 'required|string|max:70', 'skinDiseasesDate' => 'required|date', 'hasHandFungal' => 'required|string|max:2', 'handFungalPractitionerName' => 'nullable|string|max:70', 'handFungalDate' => 'nullable|date', 'hasCholera' => 'required|string|max:2', 'choleraPractitionerName' => 'nullable|string|max:70', 'choleraTestDate' => 'nullable|date', 'hasAmebicDysentery' => 'required|string|max:2', 'amebicDysenteryPractitionerName' => 'nullable|string|max:70', 'amebicDysenteryDate' => 'nullable|date', 'hasHandEczema' => 'required|string|max:2', 'handEczemaPractitionerName' => 'nullable|string|max:70', 'handEczemaDate' => 'nullable|date', 'hasHandPsoriasis' => 'required|string|max:2', 'handPsoriasisPractitionerName' => 'nullable|string|max:70', 'handPsoriasisDate' => 'nullable|date', 'validityDate' => 'required|date', 'expiryDate' => 'required|date', 'effectiveTime' => 'required|date_format:Y-m-d H:i:s', 'updateTime' => 'required|date_format:Y-m-d H:i:s', 'healthCertificateUrl' => 'required|string|max:200', 'isEffective' => 'required|string|max:1|in:0,1', ]; // 可选字段列表(这些字段存在时才验证) $optionalFields = [ 'bacterialDysenteryNote', 'bacterialDysenteryPractitionerNumber', 'bacterialDysenteryPractitionerLocalId', 'typhoidNote', 'typhoidPractitionerNumber', 'typhoidPractitionerLocalId', 'viralHepatitisNote', 'viralHepatitisPractitionerNumber', 'viralHepatitisPractitionerLocalId', 'activeTBNote', 'activeTBPractitionerNumber', 'activeTBPractitionerLocalId', 'skinDiseasesNote', 'skinDiseasesPractitionerNumber', 'skinDiseasesPractitionerLocalId', 'handFungalNote', 'handFungalPractitionerNumber', 'handFungalPractitionerLocalId', 'choleraNote', 'choleraPractitionerNumber', 'choleraPractitionerLocalId', 'amebicDysenteryNote', 'amebicDysenteryPractitionerNumber', 'amebicDysenteryPractitionerLocalId', 'handEczemaNote', 'handEczemaPractitionerNumber', 'handEczemaPractitionerLocalId', 'handPsoriasisNote', 'handPsoriasisPractitionerNumber', 'handPsoriasisPractitionerLocalId', ]; foreach ($optionalFields as $field) { if (isset($input[$field])) { $rules[$field] = 'string'; } } // 开始验证 $validator = Validator::make($input, $rules); if ($validator->fails()) { return response()->json([ 'status' => 400, 'msg' => '验证失败:' . json_encode($validator->errors(), JSON_UNESCAPED_UNICODE), 'transactionSerialNumber' => null, 'platReceiveTime' => null ], 400); } // 处理 base64 图片上传 $base64Image = $request->input('photo'); preg_match("/data:image\/(.*?);base64,/", $base64Image, $matches); $imageType = isset($matches[1]) ? $matches[1] : 'jpg'; // 检查是否是合法的 base64 图片格式 if (!isset($matches[0])) { return response()->json([ 'status' => 400, 'msg' => '图片格式不正确', 'transactionSerialNumber' => null, 'platReceiveTime' => null ], 400); } // 截取 base64 图片内容 $imageData = substr($base64Image, strpos($base64Image, ',') + 1); $imageData = base64_decode($imageData); // 生成唯一文件名 $fileName = Str::random(40) . '.' . $imageType; // 存储路径(public 目录下) $filePath = 'health_certificate/photo/' . date('Ymd') . '/' . $fileName; // 使用本地磁盘写入文件 Storage::disk('public')->put($filePath, $imageData); // 构建访问 URL 或者直接存相对路径 $photoPath = '/storage/' . $filePath; // 获取所有数据 $data = $request->except(['photo']); // 替换 photo 字段为路径 $data['photo'] = $photoPath; unset($data['key']); // 插入数据库 try { $id = DB::table('health_certificate_push')->insertGetId($data); return response()->json([ 'status' => 0, 'msg' => '健康证明信息已成功插入', 'transactionSerialNumber' => $id, 'platReceiveTime' => date('Y-m-d H:i:s'), ]); } catch (\Exception $e) { return response()->json([ 'status' => 500, 'msg' => '插入失败:' . $e->getMessage(), 'transactionSerialNumber' => null, 'platReceiveTime' => null ], 500); } } public function uploadPdf(Request $request) { date_default_timezone_set('PRC'); $key = $request->input('key'); $hospitalCode = $request->input('hospitalCode'); $hospitalName = $request->input('hospitalName'); $healthExaminationId = $request->input('healthExaminationId'); $reportId = $request->input('reportId'); if(!isset($hospitalCode)){ return response()->json([ 'status' => 400, 'msg' => '医院code不能为空' ], 400); } if(!isset($healthExaminationId)){ return response()->json([ 'status' => 400, 'msg' => '体检号不能为空' ], 400); } $file = $request->file('file'); if (!$key || $key !== '5Kj9P1pL0f8e7Vw3I2qX4mT6zJ1OxWcQ') { return response()->json([ 'status' => 400, 'msg' => 'key验证失败' ], 400); } if (!$file) { return response()->json([ 'status' => 400, 'msg' => 'pdf文件不能为空' ], 400); } $path = 'health_certificate/pdf/' . date('Ymd'); $fullPath = public_path($path); if (!is_dir($fullPath)) { mkdir($fullPath, 0777, true); } // 获取 MIME 类型(推荐使用 getMimeType) $mimeType = $file->getMimeType(); // 也可以手动读取真实内容判断 MIME(可选) // $content = file_get_contents($file->getRealPath()); // $finfo = finfo_open(FILEINFO_MIME_TYPE); // $mimeType = finfo_buffer($finfo, $content); // finfo_close($finfo); $mimeTypeToExtension = [ 'image/png' => 'png', 'image/jpeg' => 'jpg', 'application/pdf' => 'pdf', ]; if (!isset($mimeTypeToExtension[$mimeType])) { return response()->json([ 'status' => 400, 'msg' => '不支持的文件格式' ], 400); } $file_extension = $mimeTypeToExtension[$mimeType]; // 验证大小:2MB以内 if ($file->getSize() > 2 * 1024 * 1024) { return response()->json([ 'status' => 400, 'msg' => '文件大小不能超过2M' ], 400); } // 生成唯一文件名 $filename = uniqid() . '_' . mt_rand(0, 999999) . '.' . $file_extension; $path = $file->store($path, 'public'); $url = '/storage/' . $path . '/' . $filename; $record=DB::table('health_certificate_push')->where(['hospitalCode'=>$hospitalCode,'healthExaminationId'=>$healthExaminationId])->get(); if(count($record)==0){ return response()->json([ 'status' => 400, 'msg' => '未找到对应体检记录,请先提交对应体检记录' ], 400); } $record=DB::table('health_certificate_push')->where(['hospitalCode'=>$hospitalCode,'healthExaminationId'=>$healthExaminationId])->update(['pdf'=>$url]); if($record){ return response()->json([ 'status' => 0, 'msg' => '上传成功', 'data'=>[ 'url' => $url, 'reportId'=>$reportId ] ]); }else{ return response()->json([ 'status' => 400, 'msg' => '提交pdf失败' ], 400); } } }