toArray(),'icd_name'); if (!empty($icd_name)){ $icd_name = implode(';',$icd_name); }else{ $icd_name = ""; } $ca = new Ca(); // 获取云证书签名 $data = array(); $data['created_at'] = $order_prescription['doctor_created_time']; $data['department_custom_name'] = $hospital_department_custom['department_name'] ?: ""; $data['user_name'] = $order_prescription['patient_name']; $data['sex'] = sexToStringSex($order_prescription['patient_sex']); $data['age'] = $order_prescription['patient_age']; $data['allergy_history'] = $order_inquiry_case['allergy_history'] ?: "无"; $data['icd_name'] = $icd_name; $data['doctor_advice'] = $order_prescription['doctor_advice'] ?: "无"; // 商品数据 $data['product'] = array(); foreach ($order_prescription_product as $item){ $product = array(); $product['product_name'] = $item['product_name'] . "(" . $item['product_spec'] . ")"; // 商品名称+商品规格 $product['single_unit'] = $item['single_unit'] ?: ""; // 单次剂量(例:1次1包) $product['frequency_use'] = $item['frequency_use'] ?: ""; // 使用频率(例:1天3次) $product['single_use'] = $item['single_use'] ?: ""; // 单次用法(例:口服) $product['prescription_product_num'] = $item['prescription_product_num'] . $item['packaging_unit']; // 商品数量 + 基本包装单位(例:盒/瓶) $data['product'][] = $product; } dump("签名获取成功"); $cert_sign_result = $ca->getCertSign("491925054435950592", "491925054435950592", $data); // 验证云证书签名-验证无需处理,只要不返回错误即可 $ca->verifyPkcs7($cert_sign_result['signP7'],$data); dump("签名验证成功"); // 下载基础处方pdf图片 $oss = new Oss(); $filename = "basic/file/prescription.jpg"; $prescription_image = $oss->getObjectToRAM($filename); dump("下载基础处方pdf图片成功"); $manager = new ImageManager(); $image = $manager->make($prescription_image); $fontPath = './extend/Ca/ZiYuYongSongTi-2.ttf'; // 处方号 $image->text($order_prescription['prescription_code'], 1480, 540, function ($font) use($fontPath) { $font->file($fontPath); $font->size(60); $font->align('left'); }); // 日期 $image->text(date('Y-m-d',strtotime($order_prescription['doctor_created_time'])), 354, 675, function ($font) use($fontPath) { $font->file($fontPath); $font->size(60); $font->align('left'); }); // 科室 $image->text($hospital_department_custom['department_name'] ?: "", 1385, 675, function ($font) use($fontPath) { $font->file($fontPath); $font->size(60); $font->align('left'); }); // 姓名 $image->text($order_prescription['patient_name'], 354, 795, function ($font) use($fontPath) { $font->file($fontPath); $font->size(60); $font->align('left'); }); // 性别 $image->text(sexToStringSex($order_prescription['patient_sex']), 1385, 790, function ($font) use($fontPath) { $font->file($fontPath); $font->size(60); $font->align('left'); }); // 年龄 $image->text($order_prescription['patient_age'], 354, 900, function ($font) use($fontPath) { $font->file($fontPath); $font->size(60); $font->align('left'); }); // 过敏史 $image->text($order_inquiry_case['allergy_history'] ?: "无", 405, 1030, function ($font) use($fontPath) { $font->file($fontPath); $font->size(60); $font->align('left'); }); // 初步诊断 $image->text($icd_name, 445, 1145, function ($font) use($fontPath) { $font->file($fontPath); $font->size(60); $font->align('left'); }); // 医生建议 $image->text($order_prescription['doctor_advice'] ?: "无", 445, 1252, function ($font) use($fontPath) { $font->file($fontPath); $font->size(60); $font->align('left'); }); // 商品数据 foreach ($order_prescription_product as $key => $item){ $x_axis = 229; $y_axis = 1600 + $key * 250; $x_axis_num = 1900;// 数量使用 // 商品名称 $image->text($item['product_name'], $x_axis, $y_axis, function ($font) use($fontPath) { $font->file($fontPath); $font->size(50); $font->align('left'); }); $image->text("X" . $item['prescription_product_num'] . $item['packaging_unit'], $x_axis_num, $y_axis, function ($font) use($fontPath) { $font->file($fontPath); $font->size(50); $font->align('left'); }); // 用量 $image->text("用量:" . $item['single_unit'] . " " . $item['frequency_use'], $x_axis, $y_axis+70, function ($font) use($fontPath) { $font->file($fontPath); $font->size(50); $font->align('left'); }); // 用法 $image->text("用法:" . $item['single_use'], $x_axis, $y_axis+140, function ($font) use($fontPath) { $font->file($fontPath); $font->size(50); $font->align('left'); }); } // 生成图片 $img_result = (string) $image->encode('png', 75); // 图片生成pdf $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false); $pdf->AddPage(); $pdf->Image('@' . $img_result, 10, 10, 0, 0, '', '', '', false, 300, '', false, false, 0, false, false, false); $filename = $order_prescription['order_prescription_id'] . '.' . 'pdf'; // 图片生成的处方pdf存储为本地文件 $pdf->Output(dirname(__DIR__, 2) . "/" . $filename ,"F"); dump("图片生成pdf成功"); // 下载签名图片 $style = "image/resize,m_lfit,w_100,h_350"; $sign_image = $oss->getCusTomObjectToRAM($sign_image_path,$style); $sign_image = base64_encode($sign_image); if (!$sign_image){ throw new BusinessException("签名图片下载失败"); } dump("下载签名图片成功"); if ($user['user_type'] == 2){ $sign_param = [ [ // 医生端 "llx"=>"120", // 左边底部X坐标 "lly"=>"190", // 左边底部Y坐标 "urx"=>"190", // 右边上部x坐标 "ury"=>"140", // 右边上部y坐标 "pageList"=>[1], "sealImg"=>$sign_image ], ]; }else{ $sign_param = [ [ // 药师端 "llx"=>"350", // 左边底部X坐标 "lly"=>"190", // 左边底部Y坐标 "urx"=>"440", // 右边上部x坐标 "ury"=>"140", // 右边上部y坐标 "pageList"=>[1], "sealImg"=>$sign_image ] ]; } // 打开处方pdf文件 $pdf_file = fopen("./runtime/" . $filename,'r'); // 处方pdf进行签章 $data = array(); $data['sign_param'] = json_encode($sign_param); $data['pdf_file'] = $pdf_file; $sign_pdf_result = $ca->addSignPdf("491925054435950592",$data); if (empty($sign_pdf_result[0]['fileId'])){ throw new BusinessException("处方签章失败"); } dump("处方pdf进行签章成功"); // 下载处方签章文件 $file_id = $sign_pdf_result[0]['fileId']; $prescription_pdf_result = $ca->getSignedFile("491925054435950592",$file_id); if (empty($prescription_pdf_result)){ throw new BusinessException("下载处方签章文件失败"); } dump("下载处方签章文件成功"); // 上传oss $filename = "applet/prescription/" . $order_prescription['order_prescription_id'] . '.' . 'pdf'; $prescription_pdf_url = $oss->putObject($filename, $prescription_pdf_result); return $prescription_pdf_url; } catch (\Exception $e) { throw new BusinessException($e->getMessage()); } } }