This commit is contained in:
wucongxing 2023-07-28 18:22:15 +08:00
parent ff5d622110
commit 22620a3eb9
3 changed files with 77 additions and 911 deletions

View File

@ -467,4 +467,78 @@ class DetectionService extends BaseService
$result['data']['inquiry_no'] = (string)$order_detection['detection_no']; // 订单编号
return success($result);
}
// 取消未支付检测订单
public function cancelUnpayDetectionOrder(string|int $order_no, string|int $cancel_reason, string|int $cancel_remarks){
$result = array();
$result['status'] = 1;
$result['message'] = "成功";
// 获取检测订单数据
$params = array();
$params['detection_no'] = $order_no;
$order_detection = OrderDetection::getOne($params);
if (empty($order_detection)){
$result['status'] = 0;
$result['message'] = "取消未支付的检测订单失败:未查询到对应订单数据";
return $result;
}
// 检测订单状态
if ($order_detection['detection_status'] == 5) {
// 检测订单状态(1:待支付 2:待绑定 3:检测中 4:检测完成 5:已取消)
$result['status'] = 2;
$result['message'] = "取消未支付的检测订单:订单已取消";
return $result;
}
if ($order_detection['detection_status'] != 1) {
// 检测订单状态(1:待支付 2:待绑定 3:检测中 4:检测完成 5:已取消)
$result['status'] = 0;
$result['message'] = "取消未支付的检测订单:订单状态为" . $order_detection['detection_status'] . "无法执行";
return $result;
}
// 检测订单退款状态
if (!in_array($order_detection['detection_refund_status'], [0, 4, 5])) {
// 检测订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常)
$result['status'] = 0;
$result['message'] = "取消未支付的检测订单:订单正在退款中";
return $result;
}
// 检测订单支付状态
if ($order_detection['detection_pay_status'] == 2) {
// 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
$result['status'] = 2;
$result['message'] = "取消未支付的检测订单:订单已支付";
return $result;
}
// 检测订单删除状态
if ($order_detection['is_delete'] == 1) {
// 删除状态0:否 1:是)
$result['status'] = 2;
$result['message'] = "取消未支付的检测订单:订单已被删除";
return $result;
}
// 取消检测订单
$data = array();
$data['detection_status'] = 5; // 检测订单状态(1:待支付 2:待绑定 3:检测中 4:检测完成 5:已取消)
if ($cancel_reason == 3){
$data['detection_pay_status'] = 5; // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
}
$data['cancel_time'] = date("Y-m-d H:i:s", time());
$data['cancel_reason'] = $cancel_reason; // 取消订单原因1:主动取消 2:客服取消 3:支付超时)
$data['cancel_remarks'] = $cancel_remarks; // 取消订单备注
$data['updated_at'] = date("Y-m-d H:i:s", time());
$params = array();
$params['order_detection_id'] = $order_detection['order_detection_id'];
OrderDetection::editOrderDetection($params,$data);
return $result;
}
}

View File

@ -1,911 +0,0 @@
<?php
namespace App\Services;
use App\Constants\HttpEnumCode;
use App\Exception\BusinessException;
use App\Model\OrderInquiry;
use App\Model\OrderProduct;
use App\Model\PatientFamily;
use App\Model\Product;
use App\Model\UserCaCert;
use App\Model\HospitalDepartmentCustom;
use App\Model\OrderInquiryCase;
use App\Model\OrderPrescription;
use App\Model\OrderPrescriptionIcd;
use App\Model\OrderPrescriptionProduct;
use App\Model\OrderProductItem;
use App\Model\User;
use App\Model\UserDoctor;
use App\Model\UserDoctorInfo;
use App\Model\UserPharmacist;
use App\Model\UserPharmacistInfo;
use App\Utils\Log;
use Extend\Alibaba\Oss;
use Extend\Ca\Ca;
use Extend\Ca\CaOffline;
use Extend\Ca\CaOnline;
use Extend\Prescription\Prescription;
use Hyperf\Contract\LengthAwarePaginatorInterface;
use Hyperf\Utils\WaitGroup;
use Intervention\Image\ImageManager;
use Swoole\Coroutine\Channel;
use TCPDF;
class OrderPrescriptionService_1 extends BaseService
{
/**
* 获取医生是否存在被驳回处方
* @param string $doctor_id 医生id
* @return bool
*/
public function getDoctorExistsAuditFail(string $doctor_id): bool
{
$params = array();
$params['doctor_id'] = $doctor_id;
$params['pharmacist_audit_status'] = 2;// 处方审核状态0:审核中 1:审核成功 2:审核驳回)
$params['platform_audit_status'] = 1;// 处方平台审核状态0:审核中 1:审核成功 2:审核驳回)
$params['is_delete'] = 0;// 是否删除0:否 1:是)
return OrderPrescription::getExists($params);
}
/**
* 获取药师待审核处方-分页
* @param string $pharmacist_id 药师id
* @param int $pharmacist_audit_status 药师审核状态0:审核中 1:审核成功 2:审核驳回)
* @param int $platform_audit_status
* @param string|int $page
* @param string|int $per_page
* @return array
*/
public function getPharmacistWaitAuditPage(string $pharmacist_id, int $pharmacist_audit_status, int $platform_audit_status, string|int $page = 1, string|int $per_page = 10): array
{
$params = array();
$params['pharmacist_id'] = $pharmacist_id;
if ($pharmacist_audit_status == 0 && $platform_audit_status == 0){
$params['prescription_status'] = 1; // 处方状态1:待审核 2:待使用 3:已失效 4:已使用)
}
$params['pharmacist_audit_status'] = $pharmacist_audit_status; // 药师审核状态0:审核中 1:审核成功 2:审核驳回)
$params['platform_audit_status'] = $platform_audit_status; // 处方平台审核状态0:审核中 1:审核成功 2:审核驳回)
return OrderPrescription::getPage($params, ['*'], $page, $per_page);
}
/**
* 获取处方中开方药品
* @param string|int $order_prescription_id
* @return array
*/
public function getproductList(string|int $order_prescription_id): array
{
$params = array();
$params['order_prescription_id'] = $order_prescription_id;
$order_prescription_products = OrderPrescriptionProduct::getLimit($params);
if (empty($order_prescription_products)) {
return [];
}
$result = [];
foreach ($order_prescription_products as $order_prescription_product) {
$data = array();
$data['product_id'] = $order_prescription_product['product_id'];
$data['prescription_product_num'] = $order_prescription_product['prescription_product_num'];
$data['product_name'] = $order_prescription_product['product_name'] ?? "";
$data['product_spec'] = $order_prescription_product['product_spec'] ?? "";
$data['single_unit'] = $order_prescription_product['single_unit'] ?? "";
$data['single_use'] = $order_prescription_product['single_use'] ?? "";
$data['packaging_unit'] = $order_prescription_product['packaging_unit'] ?? "";
$data['frequency_use'] = $order_prescription_product['frequency_use'] ?? "";
$data['available_days'] = $order_prescription_product['available_days'] ?? 0;
$result[] = $data;
}
unset($order_product_items);
return $result;
}
/**
* 获取患者某一状态下的处方数量
* @param string $patient_id 患者id
* @param int $prescription_status 处方状态1:待审核 2:待使用 3:已失效 4:已使用)
* @return int
*/
public function getPatientPrescriptionWithStatus(string $patient_id, int $prescription_status): int
{
$params = array();
$params['patient_id'] = $patient_id;
$params['prescription_status'] = $prescription_status;
$params['pharmacist_audit_status'] = 1;
return OrderPrescription::getCount($params);
}
/**
* 开具处方
* 医生-正常开具
* 药师-先开具药师处方,再开具医院签章
* @param string $order_prescription_id
* @param string $user_id
* @return array
*/
public function openPrescription(string $order_prescription_id, string $user_id): array
{
try {
// 获取用户数据
$params = array();
$params['user_id'] = $user_id;
$user = User::getOne($params);
if (empty($user)) {
throw new BusinessException("用户数据错误");
}
if ($user['user_type'] != 2 && $user['user_type'] != 3) {
throw new BusinessException("用户类型错误");
}
// 获取用户、医院签名图片地址、用户标识信息
$params = array();
$params['user_id'] = $user['user_id'];
if ($user['user_type'] == 2) {
$user_doctor_info = UserDoctorInfo::getOne($params);
if (empty($user_doctor_info)) {
throw new BusinessException("用户数据错误");
}
$user_sign_image_path = $user_doctor_info['sign_image'];
$user_entity_id = "491925054435950592";
} else {
$user_pharmacist_info = UserPharmacistInfo::getOne($params);
if (empty($user_pharmacist_info)) {
throw new BusinessException("用户数据错误");
}
$user_sign_image_path = $user_pharmacist_info['sign_image'];
$user_entity_id = $user['user_id'];
$hospital_sign_image_path = "basic/file/hospital_signature.png";
$hospital_entity_id = "5345345461";
}
if (empty($user_sign_image_path) || empty($user_entity_id)) {
throw new BusinessException("无签名图片/用户唯一标识");
}
// 去除第一个/ oss不识别
$sign_image_path = substr($user_sign_image_path, 1, strlen($user_sign_image_path) - 1);
// 获取处方数据
$params = array();
$params['order_prescription_id'] = $order_prescription_id;
$order_prescription = OrderPrescription::getOne($params);
if (empty($order_prescription)) {
throw new BusinessException("处方数据错误");
}
if (empty($order_prescription['doctor_created_time'])) {
throw new BusinessException("医生开方日期错误");
}
// 检测处方图片
if ($user['user_type'] == 3 && empty($order_prescription['prescription_img'])) {
throw new BusinessException("处方图片错误");
}
// 创建协程客户端
$wg = new WaitGroup();
// 创建通道
$channel = new Channel();
$wg->add(4);
// 获取处方关联疾病名称
$icd_name = "";
co(function () use ($wg,$channel,&$icd_name,$order_prescription_id) {
defer(function() use ($wg) {
$wg->done();
});
$params = array();
$params['order_prescription_id'] = $order_prescription_id;
$order_prescription_icd = OrderPrescriptionIcd::getList($params);
if (empty($order_prescription_icd)) {
$channel->push('处方疾病数据错误');
return;
}
$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];
}
}
});
// 获取处方关联商品数据
$order_prescription_product = [];
co(function () use ($wg,$channel,&$order_prescription_product,$order_prescription_id) {
defer(function() use ($wg) {
$wg->done();
});
$params = array();
$params['order_prescription_id'] = $order_prescription_id;
$order_prescription_product = OrderPrescriptionProduct::getList($params);
if (empty($order_prescription_product)) {
$channel->push('处方药品数据错误');
return;
}
});
// 获取医生自定义科室数据
$hospital_department_custom = [];
$doctor_id = $order_prescription['doctor_id'];
co(function () use ($wg,$channel,&$hospital_department_custom,$doctor_id) {
defer(function() use ($wg) {
$wg->done();
});
// 获取医生数据
$params = array();
$params['doctor_id'] = $doctor_id;
$user_doctor = UserDoctor::getOne($params);
if (empty($user_doctor)) {
$channel->push('医生数据错误');
return;
}
// 获取医生自定义科室数据
$params = array();
$params['department_custom_id'] = $user_doctor['department_custom_id'];
$hospital_department_custom = HospitalDepartmentCustom::getOne($params);
if (empty($hospital_department_custom)) {
$channel->push('医生自定义数据错误');
return;
}
});
// 获取处方关联病例数据
$order_inquiry_case = [];
$order_inquiry_id = $order_prescription['order_inquiry_id'];
co(function () use ($wg,$channel,&$order_inquiry_case,$order_inquiry_id) {
defer(function() use ($wg) {
$wg->done();
});
$params = array();
$params['order_inquiry_id'] = $order_inquiry_id;
$order_inquiry_case = OrderInquiryCase::getOne($params);
if (empty($order_inquiry_case)) {
$channel->push('处方病例数据错误');
return;
}
});
// 结束
$wg->wait();
// 判断通道是否存在异常数据
$res = $channel->isEmpty();
if ($res){
// 读取通道数据
$data = $channel->pop();
// 关闭channel通道
$channel->close();
throw new BusinessException($data);
}else{
// 关闭channel通道
$channel->close();
}
$CaOnline = new CaOnline();
// 获取云证书签名
$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 = $CaOnline->getCertSign($user_entity_id, $user_entity_id, $data);
dump("获取用户云证书签名成功");
// 验证云证书签名-验证无需处理,只要不返回错误即可
dump("验证用户云证书签名");
$CaOnline->verifyPkcs7($cert_sign_result['signP7'], $data);
dump("验证用户云证书签名成功");
if ($user['user_type'] == 3) {
dump("获取医院云证书签名");
unset($cert_sign_result);
$cert_sign_result = $CaOnline->getCertSign($hospital_entity_id, $hospital_entity_id, $data);
dump("获取医院云证书签名成功");
// 验证云证书签名-验证无需处理,只要不返回错误即可
dump("验证医院云证书签名");
$CaOnline->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 = $CaOnline->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 = $CaOnline->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 = $CaOnline->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 = $CaOnline->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());
}
}
/**
* 上报处方平台
* @param string $order_product_id 商品订单id
* @return bool
*/
public function reportPrescription(string $order_product_id): bool
{
// 获取商品订单数据
$params = array();
$params['order_product_id'] = $order_product_id;
$order_product = OrderProduct::getOne($params);
if (empty($order_product)) {
throw new BusinessException("上报处方平台失败:商品订单数据错误");
}
// 获取处方数据
$params = array();
$params['order_prescription_id'] = $order_product['order_prescription_id'];
$order_prescription = OrderPrescription::getOne($params);
if (empty($order_prescription)) {
throw new BusinessException("上报处方平台失败:处方数据错误");
}
// 获取问诊订单数据
$params = array();
$params['order_inquiry_id'] = $order_prescription['order_inquiry_id'];
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
throw new BusinessException("上报处方平台失败:问诊订单数据错误");
}
// 获取商品订单列表数据
$params = array();
$params['order_product_id'] = $order_product['order_product_id'];
$order_product_item = OrderProductItem::getList($params);
if (empty($order_product_item)) {
throw new BusinessException("上报处方平台失败:商品订单列表数据错误");
}
$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'];
$doctor_id = $order_prescription['doctor_id'];
$family_id = $order_inquiry['family_id'];
$pharmacist_id = $order_prescription['pharmacist_id'];
$order_inquiry_id = $order_inquiry['order_inquiry_id'];
// 获取就诊患者用户数据
co(function () use ($wg, &$user, $user_id) {
$params = array();
$params['user_id'] = $user_id;
$user = User::getOne($params)->toArray();
// 计数器减一
$wg->done();
});
// 获取家庭成员-基本信息
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();
});
// 获取医生数据
co(function () use ($wg, &$user_doctor, $doctor_id) {
$params = array();
$params['doctor_id'] = $doctor_id;
$user_doctor = UserDoctor::getOne($params);
// 计数器减一
$wg->done();
});
// 获取医生详情数据
co(function () use ($wg, &$user_doctor_info, $doctor_id) {
$params = array();
$params['doctor_id'] = $doctor_id;
$user_doctor_info = UserDoctorInfo::getOne($params);
// 计数器减一
$wg->done();
});
// 获取药师数据
co(function () use ($wg, &$user_pharmacist, $pharmacist_id) {
$params = array();
$params['pharmacist_id'] = $pharmacist_id;
$user_pharmacist = UserPharmacist::getOne($params);
// 计数器减一
$wg->done();
});
// 获取药师详情数据
co(function () use ($wg, &$user_pharmacist_info, $pharmacist_id) {
$params = array();
$params['pharmacist_id'] = $pharmacist_id;
$user_pharmacist_info = UserPharmacistInfo::getOne($params);
// 计数器减一
$wg->done();
});
// 获取病例数据
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_product_item as $key => $item) {
// 获取商品数据
$params = array();
$params['product_id'] = $item['product_id'];
$product = Product::getOne($params);
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['amount']; // 药品数量
$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['amount']; // 药品数量
$arg['presList'][0]['orderDrugList'][$key]['packingUnit'] = $product['packaging_unit']; // 药品单位
}
$Prescription = new Prescription();
$result = $Prescription->reportPrescription($arg);
if ($result['resultCode'] != "1000"){
if(!empty($result['resultDesc'])){
throw new BusinessException("上报处方平台失败:" .$result['resultDesc']);
}
throw new BusinessException("上报处方平台失败:操作编码:" . $result['resultCode']);
}
return true;
}
}

View File

@ -274,6 +274,9 @@ Router::addGroup('/patient', function () {
// 获取检测机构合作医生列表
Router::get('/doctor', [DetectionController::class, 'getDetectionDoctorList']);
// 获取患者进行中的订单
Router::get('/progress-order', [DetectionController::class, 'getDetectionDoctorList']);
// 检测项目
Router::addGroup('/project', function () {
// 获取合作公司检测项目列表