toArray(), 'icd_name'); if (!empty($icd_name)) { if (count($icd_name) > 1) { $icd_name = implode(';', $icd_name); } else { $icd_name = $icd_name[0]; } } 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; } $cert_sign_result = $ca->getCertSign($user_entity_id, $user_entity_id, $data); // 验证云证书签名-验证无需处理,只要不返回错误即可 $ca->verifyPkcs7($cert_sign_result['signP7'], $data); dump("云证书签名验证成功"); if ($user['user_type'] == 3) { $cert_sign_result = $ca->getCertSign($hospital_entity_id, $hospital_entity_id, $data); // 验证云证书签名-验证无需处理,只要不返回错误即可 $ca->verifyPkcs7($cert_sign_result['signP7'], $data); dump("医院云证书签名获取成功"); } $oss = new Oss(); // 医生 if ($user['user_type'] == 2) { // 下载基础处方图片 $prescription_basic_filename = "basic/file/prescription.jpg"; $prescription_image = $oss->getObjectToRAM($prescription_basic_filename); dump("下载基础处方图片成功"); $manager = new ImageManager(); $image = $manager->make($prescription_image); $fontPath = './extend/Ca/msyh.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); dump("处方图片生成成功"); // 上传处方图片至oss $prescription_img_oss_filename = "applet/prescription/" . $order_prescription['order_prescription_id'] . '.' . 'jpg'; $prescription_img_url = $oss->putObject($prescription_img_oss_filename, $img_result); $prescription_img_url = '/' . $prescription_img_url; dump("处方图片上传oss成功"); // 图片生成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); $prescription_pdf_local_filename = $order_prescription['order_prescription_id'] . '.' . 'pdf'; // 图片生成的处方pdf存储为本地文件 $pdf->Output(dirname(__DIR__, 2) . "/" . $prescription_pdf_local_filename, "F"); dump("处方图片生成pdf成功"); } // 药师 if ($user['user_type'] == 3) { // 下载医生开具的处方pdf // 去除第一个/ oss不识别 $prescription_pdf_path = substr($order_prescription['prescription_pdf'], 1, strlen($order_prescription['prescription_pdf']) - 1); $local = "./runtime/" . $order_prescription['order_prescription_id'] . '.' . 'pdf'; $oss->getObjectToLocal($prescription_pdf_path, $local); 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/" . $order_prescription['order_prescription_id'] . ".pdf", 'r'); if (!$pdf_file) { throw new BusinessException("处方图片打开失败"); } // 处方pdf进行签章 $data = array(); $data['sign_param'] = json_encode($sign_param); $data['pdf_file'] = $pdf_file; $sign_pdf_result = $ca->addSignPdf($user_entity_id, $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($user_entity_id, $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); dump("处方pdf上传pss成功"); if ($user['user_type'] == 3) { // 药师端时,需要进行系统签章 // 把药师签章的pdf存储至本地文件 $file = fopen("./runtime/" . $order_prescription['order_prescription_id'] . '.' . 'pdf', "w"); fwrite($file, $prescription_pdf_result); fclose($file); // 下载医院签名图片 $style = "image/resize,w_300,h_300"; $sign_image = $oss->getCusTomObjectToRAM($hospital_sign_image_path, $style); $sign_image = base64_encode($sign_image); if (!$sign_image) { throw new BusinessException("医院签名图片下载失败"); } $sign_param = [ [ // 医院签章 "llx" => "370", // 左边底部X坐标 控制左右(越小越左) "lly" => "210", // 左边底部Y坐标 控制上下(越小越下) "urx" => "520", // 右边上部x坐标 "ury" => "360", // 右边上部y坐标 "pageList" => [1], "sealImg" => $sign_image ], ]; // 打开处方pdf文件 unset($pdf_file); $pdf_file = fopen("./runtime/" . $order_prescription['order_prescription_id'] . ".pdf", 'r'); // 处方pdf进行签章 $data = array(); $data['sign_param'] = json_encode($sign_param); $data['pdf_file'] = $pdf_file; $hospital_sign_pdf_result = $ca->addSignPdf($hospital_entity_id, $data); if (empty($hospital_sign_pdf_result[0]['fileId'])) { throw new BusinessException("处方签章失败"); } dump("处方pdf进行医院签章成功"); // 下载处方签章文件 unset($prescription_pdf_result); $file_id = $hospital_sign_pdf_result[0]['fileId']; $prescription_pdf_result = $ca->getSignedFile($hospital_entity_id, $file_id); if (empty($prescription_pdf_result)) { throw new BusinessException("下载处方签章文件失败"); } dump("下载医院处方签章文件成功"); // 上传oss $hospital_filename = "applet/prescription/" . $order_prescription['order_prescription_id'] . '.' . 'pdf'; $prescription_pdf_url = $oss->putObject($hospital_filename, $prescription_pdf_result); dump("上传医院处方签章文件成功"); } $result = array(); $result['prescription_img_url'] = $prescription_img_url ?? $order_prescription['prescription_img']; $result['prescription_pdf_url'] = '/' . $prescription_pdf_url ?: ""; return $result; } catch (\Exception $e) { throw new BusinessException($e->getMessage()); } } // 上报处方平台 public function reportPrescription(array $order_inquiry, array $order_prescription, array $order_prescription_product, array $order_product): array { $wg = new WaitGroup(); $wg->add(8); $user = []; // 就诊患者用户数据 $patient_family = []; // 家庭成员-基本信息 $order_prescription_icd = []; // 处方关联疾病数据 $user_doctor = []; // 医生数据 $user_doctor_info = []; // 医生详情数据 $user_pharmacist = []; // 药师数据 $user_pharmacist_info = []; // 药师详数据 $order_inquiry_case = []; // 病例数据 // 获取就诊患者用户数据 $user_id = $order_inquiry['user_id']; co(function () use ($wg, &$user, $user_id) { $params = array(); $params['user_id'] = $user_id; $user = User::getOne($params)->toArray(); // 计数器减一 $wg->done(); }); // 获取家庭成员-基本信息 $family_id = $order_inquiry['family_id']; co(function () use ($wg, &$patient_family, $family_id) { $params = array(); $params['family_id'] = $family_id; $patient_family = PatientFamily::getOne($params); // 计数器减一 $wg->done(); }); // 获取处方关联疾病数据 $order_prescription_id = $order_prescription['order_prescription_id']; co(function () use ($wg, &$order_prescription_icd, $order_prescription_id) { $params = array(); $params['order_prescription_id'] = $order_prescription_id; $order_prescription_icd = OrderPrescriptionIcd::getList($params); // 计数器减一 $wg->done(); }); // 获取医生数据 $doctor_id = $order_prescription['doctor_id']; co(function () use ($wg, &$user_doctor, $doctor_id) { $params = array(); $params['doctor_id'] = $doctor_id; $user_doctor = UserDoctor::getOne($params); // 计数器减一 $wg->done(); }); // 获取医生详情数据 $doctor_id = $order_prescription['doctor_id']; co(function () use ($wg, &$user_doctor_info, $doctor_id) { $params = array(); $params['doctor_id'] = $doctor_id; $user_doctor_info = UserDoctorInfo::getOne($params); // 计数器减一 $wg->done(); }); // 获取药师数据 $pharmacist_id = $order_prescription['pharmacist_id']; co(function () use ($wg, &$user_pharmacist, $pharmacist_id) { $params = array(); $params['pharmacist_id'] = $pharmacist_id; $user_pharmacist = UserPharmacist::getOne($params); // 计数器减一 $wg->done(); }); // 获取药师详情数据 $pharmacist_id = $order_prescription['pharmacist_id']; co(function () use ($wg, &$user_pharmacist_info, $pharmacist_id) { $params = array(); $params['pharmacist_id'] = $pharmacist_id; $user_pharmacist_info = UserPharmacistInfo::getOne($params); // 计数器减一 $wg->done(); }); // 获取病例数据 $order_inquiry_id = $order_inquiry['order_inquiry_id']; co(function () use ($wg, &$order_inquiry_case, $order_inquiry_id) { $params = array(); $params['order_inquiry_id'] = $order_inquiry_id; $params['status'] = 1; $order_inquiry_case = OrderInquiryCase::getOne($params); // 计数器减一 $wg->done(); }); $wg->wait(); if (empty($user)) { throw new BusinessException("用户数据错误"); } if (empty($patient_family)) { throw new BusinessException("用户家庭成员错误"); } if (empty($order_prescription_icd)) { throw new BusinessException("处方疾病数据错误"); } if (empty($user_doctor)) { throw new BusinessException("医生数据错误"); } if (empty($user_doctor_info)) { throw new BusinessException("医生详情数据错误"); } if (empty($user_pharmacist)) { throw new BusinessException("药师数据错误"); } if (empty($user_pharmacist_info)) { throw new BusinessException("药师详情数据错误"); } if (empty($order_inquiry_case)) { throw new BusinessException("病例数据错误"); } // 处理疾病数据 $icd_name = array_column($order_prescription_icd->toArray(), 'icd_name'); if (!empty($icd_name)) { if (count($icd_name) > 1) { $icd_name = implode(';', $icd_name); } else { $icd_name = $icd_name[0]; } } else { $icd_name = ""; } // 获取医生科室 $params = array(); $params['department_custom_id'] = $user_doctor['department_custom_id']; $hospital_department_custom = HospitalDepartmentCustom::getOne($params); if (empty($hospital_department_custom)) { throw new BusinessException("医生科室数据错误"); } $arg = array(); $arg['terminalCode'] = "ZD-10003"; $arg['orderNo'] = $order_product['order_product_no']; // 订单编号 $arg['transactNo'] = $order_product['escrow_trade_no']; // 流水单号 $arg['payDate'] = $order_product['pay_time']; // 支付时间 $arg['money'] = $order_product['payment_amount_total']; // 订单金额 $arg['freight'] = $order_product['logistics_fee']; // 运费(单位:元) $arg['takeTypeCode'] = 2; // 取货方式 1 自提 2 快递,目前只支持快递,传固定值 2 $arg['buyerName'] = $order_product['consignee_name'];// 收货人姓名 $arg['buyerPhone'] = $order_product['consignee_tel'];// 收货人联系方式 $arg['buyerAddress'] = $order_product['address'];// 收货人地址 $arg['provinceCode'] = $order_product['province_id']; // 收货地址(省) 编码 $arg['provinceName'] = $order_product['province']; // 收货地址(省) 名称 $arg['cityCode'] = $order_product['city_id']; // 收货地址(市) 编码 $arg['cityName'] = $order_product['city']; // 收货地址(市) 名称 $arg['districtCode'] = $order_product['county_id']; // 收货地址(区 县)编码 $arg['districtName'] = $order_product['county']; // 收货地址(区 县)名称 $arg['presList'][0]['prescriptionNo'] = $order_prescription['prescription_code']; // 处方编号 $arg['presList'][0]['prescriptionSubType'] = 1; // 处方类型 0:无类型 1:普 通处方 2:儿科处 方 $arg['presList'][0]['patientName'] = $order_prescription['patient_name']; // 就诊人姓名 $arg['presList'][0]['patientPhone'] = $user['mobile']; // 就诊人联系方式 $arg['presList'][0]['idCard'] = $patient_family['id_number']; // 身份证号 $arg['presList'][0]['advice'] = $order_prescription['doctor_advice'] ?: ""; // 医嘱 $arg['presList'][0]['diagnosisName'] = $icd_name ?: ""; // 诊断 $arg['presList'][0]['thirdDoctorName'] = $user_doctor['user_name']; // 开方医生姓名 $arg['presList'][0]['thirdDeptName'] = $hospital_department_custom['department_name'] ?: ""; // 开方科室名称 $arg['presList'][0]['thirdDoctorNameImg'] = addAliyunOssWebsite($user_doctor_info['sign_image']); // 开方医生签名链接 $arg['presList'][0]['prescriptionTime'] = $order_prescription['doctor_created_time']; // 开方时间 $arg['presList'][0]['thirdFirstPharmacist'] = $user_pharmacist['user_name']; // 初审药师姓名 $arg['presList'][0]['thirdFirstPharmacistImg'] = addAliyunOssWebsite($user_pharmacist_info['sign_image']); // 初审药师签名链接 $arg['presList'][0]['thirdFirstTime'] = $order_prescription['pharmacist_verify_time']; // 初审时间 $arg['presList'][0]['thirdLastPharmacist'] = $user_pharmacist['user_name']; // 终审药师姓名 $arg['presList'][0]['thirdLastPharmacistImg'] = addAliyunOssWebsite($user_pharmacist_info['sign_image']); // 终审药师签名 链接 $arg['presList'][0]['ThirdLastTime'] = $order_prescription['pharmacist_verify_time']; // 终审时间 $arg['presList'][0]['thirdSignImg'] = addAliyunOssWebsite("/basic/file/hospital_signature.png"); // 处方签章链接 $arg['presList'][0]['referenceCharge'] = $order_product['amount_total']; // 处方费用(不包含运费) $arg['presList'][0]['chiefComplaint'] = $order_inquiry_case['disease_desc'] ?: ""; // 主诉 $arg['presList'][0]['historyPresent'] = $order_inquiry_case['disease_class_name'] ?: ""; // 现病史 $arg['presList'][0]['pastHistory'] = $order_inquiry_case['family_history'] ?: "无"; // 既往史 $arg['presList'][0]['physicalExamination'] = "无"; // 体格检查 $arg['presList'][0]['supplementaryExamination'] = "无"; // 辅助检查 $arg['presList'][0]['allergicHistory'] = $order_inquiry_case['allergy_history'] ?: "无"; // 过敏史 // 药品数据 foreach ($order_prescription_product as $key => $item) { // 获取商品数据 $pamras = array(); $pamras['product_id'] = $item['product_id']; $product = Product::getOne($pamras); if (empty($product)) { throw new BusinessException("药品数据错误"); } $arg['presList'][0]['drugList'][$key]['drugCode'] = $product['product_platform_code']; // 药品编码 $arg['presList'][0]['drugList'][$key]['approvalNumber'] = $product['license_number']; // 批准文号 $arg['presList'][0]['drugList'][$key]['drugName'] = $product['product_name']; // 药品名称 $arg['presList'][0]['drugList'][$key]['specifications'] = $product['product_spec']; // 药品规格 $arg['presList'][0]['drugList'][$key]['price'] = $product['product_price']; // 药品单价 $arg['presList'][0]['drugList'][$key]['packingCount'] = $item['prescription_product_num']; // 药品数量 $arg['presList'][0]['drugList'][$key]['surplusPackingCount'] = 0; // 处方药品剩余使用数量 $arg['presList'][0]['drugList'][$key]['packingUnit'] = $product['packaging_unit']; // 药品单位 $arg['presList'][0]['drugList'][$key]['singleDosage'] = 1; // 单次用量 $arg['presList'][0]['drugList'][$key]['singleDosageUnit'] = "片"; // 单次用量单位 $arg['presList'][0]['drugList'][$key]['useName'] = $product['single_use']; // 用法名称 $arg['presList'][0]['drugList'][$key]['frequencyName'] = $product['frequency_use']; // 频次名称 $arg['presList'][0]['drugList'][$key]['useDays'] = $product['available_days']; // 使用天数 $arg['presList'][0]['orderDrugList'][$key]['drugCode'] = $product['product_platform_code']; // 药品编码 $arg['presList'][0]['orderDrugList'][$key]['approvalNumber'] = $product['license_number']; // 批准文号 $arg['presList'][0]['orderDrugList'][$key]['drugName'] = $product['product_name']; // 药品名称 $arg['presList'][0]['orderDrugList'][$key]['specifications'] = $product['product_spec']; // 药品规格 $arg['presList'][0]['orderDrugList'][$key]['price'] = $product['product_price']; // 药品单价 $arg['presList'][0]['orderDrugList'][$key]['drugCount'] = $item['prescription_product_num']; // 药品数量 $arg['presList'][0]['orderDrugList'][$key]['packingUnit'] = $product['packaging_unit']; // 药品单位 } Log::getInstance()->info(json_encode($arg,JSON_UNESCAPED_UNICODE)); dump($arg); $Prescription = new Prescription(); $result = $Prescription->reportPrescription($arg); dump($result); if ($result['resultCode'] != "1000"){ if ($result['resultCode'] == "1008"){ // 没有相关药品或库存不足 } if(!empty($result['resultDesc'])){ throw new BusinessException($result['resultDesc']); } throw new BusinessException("上报处方平台失败"); } return $arg; } }