香洲二院小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
mini_xzey/app/Http/Logics/Registration/RecordLogic.php

167 lines
6.2 KiB

<?php
declare(strict_types = 1);
namespace App\Http\Logics\Registration;
use App\Dictionary\Order\PayType;
use App\Dictionary\Order\SourceId;
use App\Dictionary\Order\Type;
use App\Exceptions\GeneralException;
use App\Models\Order;
use App\Models\RegistrationRecord;
use App\Services\HisHttp\Client;
use App\Utils\Traits\Logger;
use App\Utils\Traits\MiniProgramAuth;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Support\Facades\Cache;
use ReflectionException;
use Symfony\Component\HttpFoundation\Response;
use UnifyPayment\Cores\Struct\RefundOrder;
use UnifyPayment\Unify;
class RecordLogic
{
use Logger;
use MiniProgramAuth;
private Client $his_client;
private RegistrationRecord $reg_record_model;
private Order $order_model;
/**
* RecordLogic Construct
* @throws AuthenticationException
*/
public function __construct()
{
$this->authInitialize();
$this->setChannel('refund');
$this->his_client = app('HisHttpService');
$this->reg_record_model = new RegistrationRecord();
$this->order_model = new Order();
}
/**
* 获取挂号记录列表
* @param string $patient_id
* @param string $start_date
* @param string $end_date
* @return array
* @throws GeneralException
*/
public function getRecordLists(string $patient_id, string $start_date, string $end_date): array
{
$response = $this->his_client->getRegisterRecordLists($patient_id, $start_date, $end_date);
if (!isset($response['RESULTCODE']) || $response['RESULTCODE'] !== '0') {
throw new GeneralException($response['ERRORMSG'] ?? '暂无相关挂号记录!', Response::HTTP_SERVICE_UNAVAILABLE);
}
// 缓存2小时
Cache::set('Registration.Record.'. $this->open_id.'.'. $patient_id, json_encode($response, JSON_UNESCAPED_UNICODE), 2 * 60 * 60);
return $response;
}
/**
* 退号
* @param string $patient_id
* @param string $reg_serial_no
* @return true
* @throws GeneralException
*/
public function refundRegisterRecord(string $patient_id, string $reg_serial_no): true
{
$cache_key = 'Registration.Record.'. $this->open_id.'.'. $patient_id;
$record_info = Cache::get($cache_key);
if (empty($record_info)) {
throw new GeneralException($response['ERRORMSG'] ?? '查询不到需要退号的挂号记录,请重新再试!', Response::HTTP_SERVICE_UNAVAILABLE);
}
$record_info = json_decode($record_info, true);
// 获取具体的预约详情
$record_info = xmlArrayToListByKey($record_info, 'ITEM');
foreach ($record_info['ITEM'] as $v) {
if ($v['VISITNO'] === $reg_serial_no) {
$info = $v;
break;
}
}
if (empty($info)) {
throw new GeneralException('查询不到需要退号的挂号记录,请重新再试!', Response::HTTP_SERVICE_UNAVAILABLE);
}
$this->info('患者需退号的挂号记录', $info);
// 查询小程序上的挂号记录
$reg_record = $this->reg_record_model->getRecordByRegID($reg_serial_no);
if (empty($reg_record) || empty($reg_record->order()->order_id)) {
throw new GeneralException('非小程序渠道挂号,请在人工窗口退号退费处理', Response::HTTP_SERVICE_UNAVAILABLE);
}
$order_info = &$reg_record->order();
$order_id = &$order_info->order_id;
$fee = &$order_info->self_fee;
$this->info('患者需退号的数据库挂号记录', $reg_record->toArray());
// 检查是否可以退号
$response = $this->his_client->checkRefundRegisterStatus($reg_serial_no);
$this->info('检查是否可进行退号', $response);
if (!isset($response['RESULTCODE']) || $response['RESULTCODE'] !== '0') {
throw new GeneralException($response['ERRORMSG'] ?? '当前挂号记录不可退号!', Response::HTTP_BAD_REQUEST);
}
// 开始退号
$response = $this->his_client->refundRegister($reg_serial_no, $order_id, date('Y-m-d'), date('H:i:s'), (string) ($fee / 100));
$this->info('退号结果', $response);
if (!isset($response['RESULTCODE']) || $response['RESULTCODE'] !== '0') {
throw new GeneralException($response['ERRORMSG'] ?? '退号失败,请重新再试!', Response::HTTP_BAD_REQUEST);
}
// 创建退款单
$refund_order_id = $this->order_model->getRefundOrderId($order_id);
$refund_order_info = $this->order_model->createRefundOReverseOrder(
$order_info->id,
$refund_order_id,
PayType::from($order_info->pay_type),
$fee,
$this->open_id,
$patient_id,
$order_info->patient_name,
Type::from($order_info->order_type),
SourceId::from($order_info->source_id)
);
$this->info('创建退款订单', ['id' => $refund_order_info->id]);
if (empty($refund_order_info)) {
throw new GeneralException($response['ERRORMSG'] ?? '退号成功,退费失败,请重新再试!', Response::HTTP_BAD_REQUEST);
}
// 退款
try {
$refund_order_obj = new RefundOrder($order_id, $refund_order_id, $fee, '患者自行退号退费');
$response = Unify::common(env('unify'))->order->refund($refund_order_obj);
$this->info('退号退费结果', $response);
} catch (ReflectionException $e) {
$this->order_model->reverseOrderOpera($refund_order_id, $fee, false);
throw new GeneralException($e->getMessage() ?? '退号成功,退费失败,请重新再试!', Response::HTTP_SERVICE_UNAVAILABLE);
}
if (empty($response) || $response['status'] !== 200 || $response['success'] !== true) {
$this->order_model->reverseOrderOpera($refund_order_id, $fee, false);
throw new GeneralException($response['msg'] ?? '退号成功,退费失败,请重新再试!', Response::HTTP_BAD_REQUEST);
}
$this->order_model->reverseOrderOpera($refund_order_id, $fee, true);
return true;
}
}