diff --git a/app/Amqp/Consumer/AssignDoctorConsumer.php b/app/Amqp/Consumer/AssignDoctorConsumer.php index f26e1be..947f9c6 100644 --- a/app/Amqp/Consumer/AssignDoctorConsumer.php +++ b/app/Amqp/Consumer/AssignDoctorConsumer.php @@ -5,13 +5,17 @@ declare(strict_types=1); namespace App\Amqp\Consumer; use App\Model\OrderInquiry; +use App\Services\InquiryService; use App\Services\UserDoctorService; use App\Utils\Log; use Hyperf\Amqp\Result; use Hyperf\Amqp\Annotation\Consumer; use Hyperf\Amqp\Message\ConsumerMessage; +use Hyperf\DbConnection\Db; use Hyperf\Redis\Redis; use PhpAmqpLib\Message\AMQPMessage; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\NotFoundExceptionInterface; /** * 分配医生 @@ -20,34 +24,44 @@ use PhpAmqpLib\Message\AMQPMessage; #[Consumer(exchange: 'amqp.direct', routingKey: 'AssignDoctor', queue: 'assign.doctor.queue', nums: 1)] class AssignDoctorConsumer extends ConsumerMessage { + /** + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + */ public function consumeMessage($data, AMQPMessage $message): string { Log::getInstance()->error("开始执行 分配医生 队列:" . json_encode($data, JSON_UNESCAPED_UNICODE)); + Db::beginTransaction(); + try { // 获取订单数据 $params = array(); $params['order_inquiry_id'] = $data['order_inquiry_id']; $order_inquiry = OrderInquiry::getOne($params); if (empty($order_inquiry)) { + Db::rollBack(); Log::getInstance()->error("队列执行失败原因:未查询到对应订单数据"); return Result::DROP;// 销毁 } // 检测订单分配状态 if (!empty($order_inquiry['doctor_id'])){ + Db::rollBack(); Log::getInstance()->error("队列执行失败原因:已分配医生"); return Result::DROP;// 销毁 } // 检测订单类型 if ($order_inquiry['inquiry_type'] != 2 && $order_inquiry['inquiry_type'] != 4){ + Db::rollBack(); Log::getInstance()->error("队列执行失败原因:订单非快速问诊、问诊购药类型"); return Result::DROP;// 销毁 } // 检测订单退款状态 if (in_array($order_inquiry['inquiry_refund_status'],[1,2,3])){ + Db::rollBack(); // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭) Log::getInstance()->error("队列执行失败原因:订单存在退款"); return Result::DROP;// 销毁 @@ -55,6 +69,7 @@ class AssignDoctorConsumer extends ConsumerMessage // 检测订单状态 if ($order_inquiry['inquiry_status'] != 2){ + Db::rollBack(); // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) Log::getInstance()->info("订单状态错误:当前为" . $order_inquiry['inquiry_status'] . " 无法进行分配"); return Result::DROP;// 销毁 @@ -62,6 +77,7 @@ class AssignDoctorConsumer extends ConsumerMessage // 检测订单支付状态 if ($order_inquiry['inquiry_pay_status'] != 2){ + Db::rollBack(); // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) Log::getInstance()->info("订单支付状态错误:当前为" . $order_inquiry['inquiry_pay_status'] . " 无法进行分配"); return Result::DROP;// 销毁 @@ -71,12 +87,23 @@ class AssignDoctorConsumer extends ConsumerMessage $pay_time = strtotime($order_inquiry['pay_time']); $diff_time = time() - $pay_time; if ($diff_time < 0){ + Db::rollBack(); Log::getInstance()->info("订单支付状态错误:时间计算错误"); return Result::DROP;// 销毁 } if ($diff_time > 300){ // 超出5分钟,执行退款 + $InquiryService = new InquiryService(); + $InquiryService->inquiryRefund($order_inquiry['order_inquiry_id'],"分配医生失败"); + + // 退款成功 + Db::commit(); + Log::getInstance()->info("订单已退款"); + + // 加入消息通知队列 + + return Result::ACK; } $redis = $this->container->get(Redis::class); @@ -112,9 +139,13 @@ class AssignDoctorConsumer extends ConsumerMessage $params['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; OrderInquiry::edit($params,$data); + Db::commit(); Log::getInstance()->error("分配医生 队列执行成功"); + + // 加入消息通知队列 return Result::ACK; } catch (\Exception $e) { + Db::rollBack(); Log::getInstance()->error("队列执行失败原因:" . $e->getMessage()); return Result::REQUEUE; // 重回队列 } diff --git a/app/Controller/InquiryController.php b/app/Controller/InquiryController.php index 4bfad29..2023b58 100644 --- a/app/Controller/InquiryController.php +++ b/app/Controller/InquiryController.php @@ -51,4 +51,31 @@ class InquiryController extends AbstractController $data = $InquiryService->getPatientInquiryCase(); return $this->response->json($data); } + + /** + * 检测快速、购药订单分配医生状态 + * @return ResponseInterface + */ + public function getInquiryAssign(): ResponseInterface + { + $InquiryService = new InquiryService(); + $data = $InquiryService->getInquiryAssign(); + return $this->response->json($data); + } + + /** + * 新增医生评价 + * @return ResponseInterface + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + */ + public function addInquiryEvaluation(): ResponseInterface + { + $request = $this->container->get(InquiryRequest::class); + $request->scene('addInquiryEvaluation')->validateResolved(); + + $InquiryService = new InquiryService(); + $data = $InquiryService->addInquiryEvaluation(); + return $this->response->json($data); + } } \ No newline at end of file diff --git a/app/Controller/UserController.php b/app/Controller/UserController.php index 2630977..2dcfced 100644 --- a/app/Controller/UserController.php +++ b/app/Controller/UserController.php @@ -98,24 +98,24 @@ class UserController extends AbstractController // return $this->response->json($pay_config); // 发起退款 - $WechatPay = new WechatPay(1); - - $params = array(); - $params['order_inquiry_id'] = 1; - $order_inquiry = OrderInquiry::getOne($params); - - - $options = array(); - $options['transaction_id'] = $order_inquiry['escrow_trade_no']; - $options['out_refund_no'] = $order_inquiry['inquiry_refund_no']; - $options['reason'] = "退款原因"; - $options['amount'] = [ - 'refund' => (int)1, - 'total' => (int)1, - 'currency' => "CNY", - ]; - - $result = $WechatPay->refund($options); - dump($result); +// $WechatPay = new WechatPay(1); +// +// $params = array(); +// $params['order_inquiry_id'] = 1; +// $order_inquiry = OrderInquiry::getOne($params); +// +// +// $options = array(); +// $options['transaction_id'] = $order_inquiry['escrow_trade_no']; +// $options['out_refund_no'] = $order_inquiry['inquiry_refund_no']; +// $options['reason'] = "退款原因"; +// $options['amount'] = [ +// 'refund' => (int)1, +// 'total' => (int)1, +// 'currency' => "CNY", +// ]; +// +// $result = $WechatPay->refund($options); +// dump($result); } } \ No newline at end of file diff --git a/app/Middleware/Auth/AuthMiddleware.php b/app/Middleware/Auth/AuthMiddleware.php index 53b1fee..39af594 100644 --- a/app/Middleware/Auth/AuthMiddleware.php +++ b/app/Middleware/Auth/AuthMiddleware.php @@ -115,7 +115,7 @@ class AuthMiddleware implements MiddlewareInterface $params['user_id'] = $result['userInfo']['user_id']; $user = User::getOne($params); if (empty($user)){ - return $this->response->json(fail(HttpEnumCode::USER_STATUS_ERROR)); + return $this->response->json(fail(HttpEnumCode::HTTP_ERROR)); } if ($user['user_status'] == 0){ diff --git a/app/Model/OrderEvaluation.php b/app/Model/OrderEvaluation.php index c11c285..d0da28d 100644 --- a/app/Model/OrderEvaluation.php +++ b/app/Model/OrderEvaluation.php @@ -6,6 +6,7 @@ namespace App\Model; +use Hyperf\Database\Model\Collection; use Hyperf\Snowflake\Concern\Snowflake; /** @@ -100,4 +101,57 @@ class OrderEvaluation extends Model ->whereBetween('avg_score',$avg_score_params) ->count(); } + + /** + * 获取信息-单条 + * @param array $params + * @param array $fields + * @return object|null + */ + public static function getOne(array $params, array $fields = ['*']): object|null + { + return self::where($params)->first($fields); + } + + /** + * 获取数据-多 + * @param array $params + * @param array $fields + * @return Collection|array + */ + public static function getList(array $params = [], array $fields = ['*']): Collection|array + { + return self::where($params)->get($fields); + } + + /** + * 获取是否存在 + * @param array $params + * @return bool + */ + public static function getExists(array $params): bool + { + return self::where($params)->exists(); + } + + /** + * 修改 + * @param array $params + * @param array $data + * @return int + */ + public static function edit(array $params = [], array $data = []): int + { + return self::where($params)->update($data); + } + + /** + * 新增 + * @param array $data + * @return \Hyperf\Database\Model\Model|OrderEvaluation + */ + public static function addOrderEvaluation(array $data): \Hyperf\Database\Model\Model|OrderEvaluation + { + return self::create($data); + } } diff --git a/app/Model/OrderInquiryRefund.php b/app/Model/OrderInquiryRefund.php index c37a99c..e1d19d7 100644 --- a/app/Model/OrderInquiryRefund.php +++ b/app/Model/OrderInquiryRefund.php @@ -13,9 +13,11 @@ use Hyperf\Snowflake\Concern\Snowflake; * @property int $patient_id 患者id * @property int $order_inquiry_id 订单-问诊id * @property string $inquiry_no 系统订单编号 - * @property string $out_refund_no 系统退款编号 + * @property string $inquiry_refund_no 系统退款编号 * @property string $refund_id 第三方退款单号 * @property int $inquiry_refund_status 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭) + * @property string $refund_total 退款金额 + * @property string $refund_reason 退款原因 * @property string $success_time 退款成功时间 * @property \Carbon\Carbon $created_at 创建时间 * @property \Carbon\Carbon $updated_at 修改时间 @@ -32,7 +34,7 @@ class OrderInquiryRefund extends Model /** * The attributes that are mass assignable. */ - protected array $fillable = ['inquiry_refund_id', 'patient_id', 'order_inquiry_id', 'inquiry_no', 'out_refund_no', 'refund_id', 'inquiry_refund_status', 'success_time', 'created_at', 'updated_at']; + protected array $fillable = ['inquiry_refund_id', 'patient_id', 'order_inquiry_id', 'inquiry_no', 'inquiry_refund_no', 'refund_id', 'inquiry_refund_status', 'refund_total', 'refund_reason', 'success_time', 'created_at', 'updated_at']; protected string $primaryKey = "inquiry_refund_id"; @@ -57,4 +59,14 @@ class OrderInquiryRefund extends Model { return self::where($params)->get($fields); } + + /** + * 新增 + * @param array $data + * @return \Hyperf\Database\Model\Model|OrderInquiryRefund + */ + public static function addOrderInquiryRefund(array $data): \Hyperf\Database\Model\Model|OrderInquiryRefund + { + return self::create($data); + } } diff --git a/app/Request/InquiryRequest.php b/app/Request/InquiryRequest.php index c8587f1..c5d7e83 100644 --- a/app/Request/InquiryRequest.php +++ b/app/Request/InquiryRequest.php @@ -30,6 +30,14 @@ class InquiryRequest extends FormRequest 'inquiry_mode', // 订单问诊方式(1:图文 2:视频 3:语音 4:电话 5:会员) 'client_type', // 客户端类型(1:手机 2:电脑) ], + 'addInquiryEvaluation' => [ // 新增医生评价 + 'doctor_id', + 'order_inquiry_id', + 'reply_quality',// 回复质量 + 'service_attitude', // 服务态度 + 'reply_progress',// 回复速度 + 'content', + ], ]; /** @@ -57,6 +65,12 @@ class InquiryRequest extends FormRequest 'is_family_history' => ['sometimes','numeric','min:0','max:1'], 'is_pregnant' => ['sometimes','numeric','min:0','max:1'], 'client_type' => 'required|integer|min:1|max:2', + + 'doctor_id' => 'required', + 'order_inquiry_id' => 'required', + 'reply_quality' => 'required|integer|min:0|max:5', + 'service_attitude' => 'required|integer|min:0|max:5', + 'reply_progress' => 'required|integer|min:0|max:5',// ]; } diff --git a/app/Services/DoctorInquiryService.php b/app/Services/DoctorInquiryService.php index 0571bae..83866e4 100644 --- a/app/Services/DoctorInquiryService.php +++ b/app/Services/DoctorInquiryService.php @@ -38,27 +38,27 @@ class DoctorInquiryService extends BaseService return fail(HttpEnumCode::HTTP_ERROR, "未知医生"); } - if ($doctor['idcard_status'] != 1){ + if ($doctor['idcard_status'] != 1) { return fail(HttpEnumCode::HTTP_ERROR, "请先进行实名认证"); } - if ($doctor['iden_auth_status'] != 1){ + if ($doctor['iden_auth_status'] != 1) { return fail(HttpEnumCode::HTTP_ERROR, "请先进行身份认证"); } - if ($doctor['is_bind_bank'] != 1){ + if ($doctor['is_bind_bank'] != 1) { return fail(HttpEnumCode::HTTP_ERROR, "请先进行绑定结算银行卡"); } // 接诊开关 $result['info']['is_open'] = 0; - if ($inquiry_type == 1){ + if ($inquiry_type == 1) { // 专家 $result['info']['is_open'] = $doctor['is_img_expert_reception']; - }elseif ($inquiry_type == 2){ + } elseif ($inquiry_type == 2) { // 快速 $result['info']['is_open'] = $doctor['is_img_quick_reception']; - }elseif ($inquiry_type == 3){ + } elseif ($inquiry_type == 3) { // 公益 $result['info']['is_open'] = $doctor['is_img_welfare_reception']; } @@ -74,7 +74,7 @@ class DoctorInquiryService extends BaseService $params['inquiry_type'] = $inquiry_type; $params['inquiry_mode'] = $inquiry_mode; $system_inquiry_config = SystemInquiryConfig::getOne($params); - if (empty($system_inquiry_config)){ + if (empty($system_inquiry_config)) { return fail(HttpEnumCode::SERVER_ERROR); } @@ -84,19 +84,19 @@ class DoctorInquiryService extends BaseService $params['inquiry_type'] = $inquiry_type; $params['inquiry_mode'] = $inquiry_mode; $doctor_inquiry_config = DoctorInquiryConfig::getOne($params); - if (empty($doctor_inquiry_config)){ + if (empty($doctor_inquiry_config)) { // 接诊价格 $result['info']['inquiry_price'] = $system_inquiry_config['inquiry_price'] ?: 0; - if ($inquiry_type == 3){ + if ($inquiry_type == 3) { // 公益问诊,存在价格档次,默认第一档 - $inquiry_price = explode(',',$system_inquiry_config['inquiry_price']); + $inquiry_price = explode(',', $system_inquiry_config['inquiry_price']); $result['info']['inquiry_price'] = $inquiry_price[0]; } - }else{ + } else { // 接诊价格 $result['info']['inquiry_price'] = $doctor_inquiry_config['inquiry_price'] ?: 0; - if ($inquiry_type == 2){ + if ($inquiry_type == 2) { // 快速-系统配置 $result['info']['inquiry_price'] = $system_inquiry_config['inquiry_price']; } @@ -124,9 +124,8 @@ class DoctorInquiryService extends BaseService // 系统价格(公益问诊) $result['config']['system_inquiry_price'] = []; - if ($inquiry_type == 3) - { - $result['config']['system_inquiry_price'] = explode(',',$system_inquiry_config['inquiry_price']); + if ($inquiry_type == 3) { + $result['config']['system_inquiry_price'] = explode(',', $system_inquiry_config['inquiry_price']); } return success($result); @@ -152,15 +151,15 @@ class DoctorInquiryService extends BaseService return fail(HttpEnumCode::HTTP_ERROR, "未知医生"); } - if ($doctor['idcard_status'] != 1){ + if ($doctor['idcard_status'] != 1) { return fail(HttpEnumCode::HTTP_ERROR, "请先进行实名认证"); } - if ($doctor['iden_auth_status'] != 1){ + if ($doctor['iden_auth_status'] != 1) { return fail(HttpEnumCode::HTTP_ERROR, "请先进行身份认证"); } - if ($doctor['is_bind_bank'] != 1){ + if ($doctor['is_bind_bank'] != 1) { return fail(HttpEnumCode::HTTP_ERROR, "请先进行绑定结算银行卡"); } @@ -170,8 +169,8 @@ class DoctorInquiryService extends BaseService $params['inquiry_type'] = $inquiry_type; $params['inquiry_mode'] = $inquiry_mode; $doctor_inquiry_config = DoctorInquiryConfig::getOne($params); - if (empty($doctor_inquiry_config)){ - if ($inquiry_type != 2){ + if (empty($doctor_inquiry_config)) { + if ($inquiry_type != 2) { // 快速问诊可能会存在未创建的情况 return fail(HttpEnumCode::HTTP_ERROR, "请先完善问诊配置"); } @@ -183,43 +182,50 @@ class DoctorInquiryService extends BaseService $params['doctor_id'] = $user_info['client_user_id']; $data = array(); - if ($inquiry_type == 1){ + if ($inquiry_type == 1) { // 专家 $data['is_img_expert_reception'] = $is_open; - }elseif ($inquiry_type == 2){ + } elseif ($inquiry_type == 2) { // 快速 $data['is_img_quick_reception'] = $is_open; - }elseif ($inquiry_type == 3){ + } elseif ($inquiry_type == 3) { // 公益 $data['is_img_welfare_reception'] = $is_open; } - UserDoctor::editUserDoctor($params,$data); + UserDoctor::editUserDoctor($params, $data); - if ($inquiry_type == 2){ - // 系统问诊配置表 + if ($inquiry_type == 2 && $is_open == 1) { $params = array(); + $params['doctor_id'] = $user_info['client_user_id']; $params['inquiry_type'] = $inquiry_type; $params['inquiry_mode'] = $inquiry_mode; - $system_inquiry_config = SystemInquiryConfig::getOne($params); - if (empty($system_inquiry_config)){ - Db::rollBack(); - return fail(HttpEnumCode::SERVER_ERROR); - } + $doctor_inquiry_config = DoctorInquiryConfig::getOne($params); + if (empty($doctor_inquiry_config)) { + // 系统问诊配置表 + $params = array(); + $params['inquiry_type'] = $inquiry_type; + $params['inquiry_mode'] = $inquiry_mode; + $system_inquiry_config = SystemInquiryConfig::getOne($params); + if (empty($system_inquiry_config)) { + Db::rollBack(); + return fail(HttpEnumCode::SERVER_ERROR); + } - // 快速问诊,需创建 - $data = array(); - $data['doctor_id'] = $user_info['client_user_id']; - $data['system_inquiry_config_id'] = $system_inquiry_config['system_inquiry_config_id']; - $data['inquiry_type'] = $inquiry_type; - $data['inquiry_mode'] = $inquiry_mode; - $data['work_num_day'] = $system_inquiry_config['max_work_num_day'] ?: 0; - $data['inquiry_price'] = $system_inquiry_config['inquiry_price']; + // 快速问诊,需创建 + $data = array(); + $data['doctor_id'] = $user_info['client_user_id']; + $data['system_inquiry_config_id'] = $system_inquiry_config['system_inquiry_config_id']; + $data['inquiry_type'] = $inquiry_type; + $data['inquiry_mode'] = $inquiry_mode; + $data['work_num_day'] = $system_inquiry_config['max_work_num_day'] ?: 0; + $data['inquiry_price'] = $system_inquiry_config['inquiry_price']; - $doctor_inquiry_config = DoctorInquiryConfig::addInquiryConfig($data); - if (empty($doctor_inquiry_config)){ - Db::rollBack(); - return fail(HttpEnumCode::SERVER_ERROR); + $doctor_inquiry_config = DoctorInquiryConfig::addInquiryConfig($data); + if (empty($doctor_inquiry_config)) { + Db::rollBack(); + return fail(HttpEnumCode::SERVER_ERROR); + } } } @@ -245,7 +251,7 @@ class DoctorInquiryService extends BaseService $inquiry_price = $this->request->input('inquiry_price');// 接诊价格 $work_num_day = $this->request->input('work_num_day');// 每日接诊数量 - if ($inquiry_type == 2){ + if ($inquiry_type == 2) { // 快速问诊无需配置 return fail(); } @@ -258,15 +264,15 @@ class DoctorInquiryService extends BaseService return fail(HttpEnumCode::HTTP_ERROR, "未知医生"); } - if ($doctor['idcard_status'] != 1){ + if ($doctor['idcard_status'] != 1) { return fail(HttpEnumCode::HTTP_ERROR, "请先进行实名认证"); } - if ($doctor['iden_auth_status'] != 1){ + if ($doctor['iden_auth_status'] != 1) { return fail(HttpEnumCode::HTTP_ERROR, "请先进行身份认证"); } - if ($doctor['is_bind_bank'] != 1){ + if ($doctor['is_bind_bank'] != 1) { return fail(HttpEnumCode::HTTP_ERROR, "请先进行绑定结算银行卡"); } @@ -275,21 +281,21 @@ class DoctorInquiryService extends BaseService $params['inquiry_type'] = $inquiry_type; $params['inquiry_mode'] = $inquiry_mode; $system_inquiry_config = SystemInquiryConfig::getOne($params); - if (empty($system_inquiry_config)){ + if (empty($system_inquiry_config)) { return fail(HttpEnumCode::SERVER_ERROR); } // 验证-每日接诊数量 - if ($work_num_day > $system_inquiry_config['max_work_num_day']){ - return fail(HttpEnumCode::HTTP_ERROR,"超出每日最大接诊数量"); + if ($work_num_day > $system_inquiry_config['max_work_num_day']) { + return fail(HttpEnumCode::HTTP_ERROR, "超出每日最大接诊数量"); } // 验证-问诊价格 // 义诊时不判断,义诊为选择价格,价格后台可调节 - if ($inquiry_type == 3){ - if (!empty($system_inquiry_config['min_inquiry_price']) && !empty($system_inquiry_config['max_inquiry_price'])){ - if ($inquiry_price > $system_inquiry_config['max_inquiry_price'] || $inquiry_price < $system_inquiry_config['min_inquiry_price']){ - return fail(HttpEnumCode::HTTP_ERROR,"问诊价格填写错误"); + if ($inquiry_type == 3) { + if (!empty($system_inquiry_config['min_inquiry_price']) && !empty($system_inquiry_config['max_inquiry_price'])) { + if ($inquiry_price > $system_inquiry_config['max_inquiry_price'] || $inquiry_price < $system_inquiry_config['min_inquiry_price']) { + return fail(HttpEnumCode::HTTP_ERROR, "问诊价格填写错误"); } } } @@ -303,7 +309,7 @@ class DoctorInquiryService extends BaseService $params['inquiry_type'] = $inquiry_type; $params['inquiry_mode'] = $inquiry_mode; $doctor_inquiry_config = DoctorInquiryConfig::getOne($params); - if (empty($doctor_inquiry_config)){ + if (empty($doctor_inquiry_config)) { // 创建 $data = array(); $data['doctor_id'] = $user_info['client_user_id']; @@ -314,7 +320,7 @@ class DoctorInquiryService extends BaseService $data['inquiry_price'] = $inquiry_price; $doctor_inquiry_config = DoctorInquiryConfig::addInquiryConfig($data); - if (empty($doctor_inquiry_config)){ + if (empty($doctor_inquiry_config)) { Db::rollBack(); return fail(HttpEnumCode::SERVER_ERROR); } @@ -326,39 +332,39 @@ class DoctorInquiryService extends BaseService $data['old_price'] = 0; $data['new_price'] = $inquiry_price; $doctor_inquiry_price_record = DoctorInquiryPriceRecord::addRecord($data); - if (empty($doctor_inquiry_price_record)){ + if (empty($doctor_inquiry_price_record)) { Db::rollBack(); return fail(HttpEnumCode::SERVER_ERROR); } - }else{ + } else { // 在线问诊限制在线问诊验证修改次数 - if ($inquiry_type == 1 && $doctor_inquiry_config['inquiry_price'] != $inquiry_price){ + if ($inquiry_type == 1 && $doctor_inquiry_config['inquiry_price'] != $inquiry_price) { // 获取月份内总调整次数 $params = array(); - $params[] = ['doctor_id','=',$user_info['client_user_id']]; - $params[] = ['inquiry_config_id','=',$doctor_inquiry_config['inquiry_config_id']]; - $params[] = ['created_at','>',date('Y-m-01',time())]; + $params[] = ['doctor_id', '=', $user_info['client_user_id']]; + $params[] = ['inquiry_config_id', '=', $doctor_inquiry_config['inquiry_config_id']]; + $params[] = ['created_at', '>', date('Y-m-01', time())]; $modify_month_count = DoctorInquiryPriceRecord::getCount($params); - if ($modify_month_count >= 5){ + if ($modify_month_count >= 5) { // 每自然月仅限调整5次 Db::rollBack(); - return fail(HttpEnumCode::HTTP_ERROR,"问诊价格每自然月仅限调整5次"); + return fail(HttpEnumCode::HTTP_ERROR, "问诊价格每自然月仅限调整5次"); } $params = array(); - $params[] = ['doctor_id','=',$user_info['client_user_id']]; - $params[] = ['inquiry_config_id','=',$doctor_inquiry_config['inquiry_config_id']]; - $params[] = ['created_at','>',date('Y-m-d',time())]; + $params[] = ['doctor_id', '=', $user_info['client_user_id']]; + $params[] = ['inquiry_config_id', '=', $doctor_inquiry_config['inquiry_config_id']]; + $params[] = ['created_at', '>', date('Y-m-d', time())]; $modify_month_count = DoctorInquiryPriceRecord::getCount($params); - if ($modify_month_count >= 1){ + if ($modify_month_count >= 1) { // 问诊价格每日仅限调整1次 Db::rollBack(); - return fail(HttpEnumCode::HTTP_ERROR,"问诊价格每日仅限调整1次"); + return fail(HttpEnumCode::HTTP_ERROR, "问诊价格每日仅限调整1次"); } } // 修改 - if ($doctor_inquiry_config['work_num_day'] != $work_num_day || $doctor_inquiry_config['inquiry_price'] != $inquiry_price){ + if ($doctor_inquiry_config['work_num_day'] != $work_num_day || $doctor_inquiry_config['inquiry_price'] != $inquiry_price) { $params = array(); $params['inquiry_config_id'] = $doctor_inquiry_config['inquiry_config_id']; @@ -366,7 +372,7 @@ class DoctorInquiryService extends BaseService $data['work_num_day'] = $work_num_day; $data['inquiry_price'] = $inquiry_price; - DoctorInquiryConfig::editInquiryConfig($params,$data); + DoctorInquiryConfig::editInquiryConfig($params, $data); // 记录修改记录 $data = array(); @@ -375,7 +381,7 @@ class DoctorInquiryService extends BaseService $data['old_price'] = $doctor_inquiry_config['inquiry_price']; $data['new_price'] = $inquiry_price; $doctor_inquiry_price_record = DoctorInquiryPriceRecord::addRecord($data); - if (empty($doctor_inquiry_price_record)){ + if (empty($doctor_inquiry_price_record)) { Db::rollBack(); return fail(HttpEnumCode::SERVER_ERROR); } @@ -398,37 +404,33 @@ class DoctorInquiryService extends BaseService * @param string|int $doctor_id 医生id * @return int */ - public function getDoctorInquiryPrice(string|int $inquiry_type, string|int $inquiry_mode,string|int $doctor_id): int + public function getDoctorInquiryPrice(string|int $inquiry_type, string|int $inquiry_mode, string|int $doctor_id): int { - if (empty($doctor_id)){ - throw new BusinessException(); - } - // 接诊类型(1:专家问诊 2:快速问诊 3:公益问诊) - if ($inquiry_type == 1 || $inquiry_type == 3){ + if ($inquiry_type == 1 || $inquiry_type == 3) { // 专家-公益 $params = array(); $params['doctor_id'] = $doctor_id; $params['inquiry_type'] = $inquiry_type; $params['inquiry_mode'] = $inquiry_mode; $doctor_inquiry_config = DoctorInquiryConfig::getOne($params); - if (empty($doctor_inquiry_config)){ - throw new BusinessException( "当前医生未开通对应服务,请重新选择",HttpEnumCode::HTTP_ERROR); + if (empty($doctor_inquiry_config)) { + throw new BusinessException("当前医生未开通对应服务,请重新选择", HttpEnumCode::HTTP_ERROR); } $inquiry_price = $doctor_inquiry_config['inquiry_price'] ?: 0; - }elseif($inquiry_type == 2 || $inquiry_type == 4){ + } elseif ($inquiry_type == 2 || $inquiry_type == 4) { // 快速-购药 $params = array(); $params['inquiry_type'] = $inquiry_type; $params['inquiry_mode'] = $inquiry_mode; $system_inquiry_config = SystemInquiryConfig::getOne($params); - if (empty($system_inquiry_config)){ + if (empty($system_inquiry_config)) { throw new BusinessException(); } $inquiry_price = $system_inquiry_config['inquiry_price'] ?: 0; - }else{ + } else { throw new BusinessException(); } diff --git a/app/Services/InquiryService.php b/app/Services/InquiryService.php index 5ba735b..76cadc0 100644 --- a/app/Services/InquiryService.php +++ b/app/Services/InquiryService.php @@ -4,16 +4,21 @@ namespace App\Services; use App\Amqp\Producer\CancelUnpayOrdersDelayDirectProducer; use App\Constants\HttpEnumCode; +use App\Exception\BusinessException; use App\Model\DiseaseClass; use App\Model\InquiryCaseProduct; +use App\Model\OrderEvaluation; use App\Model\OrderInquiry; use App\Model\OrderInquiryCase; use App\Model\OrderInquiryCoupon; +use App\Model\OrderInquiryRefund; use App\Model\PatientFamily; use App\Model\PatientFamilyHealth; use App\Model\PatientFamilyPersonal; use App\Model\Product; use App\Model\UserDoctor; +use App\Model\UserPatient; +use App\Utils\Mask; use App\Utils\PcreMatch; use Extend\Wechat\WechatPay; use Hyperf\Amqp\Producer; @@ -361,6 +366,116 @@ class InquiryService extends BaseService return success($order_inquiry_case->toArray()); } + /** + * 检测快速、购药订单分配医生状态 + * @return array + */ + public function getInquiryAssign(): array + { + $user_info = $this->request->getAttribute("userInfo") ?? []; + $order_inquiry_id = $this->request->route('order_inquiry_id'); + + $params = array(); + $params['order_inquiry_id'] = $order_inquiry_id; + $params['patient_id'] = $user_info['client_user_id']; + $order_inquiry = OrderInquiry::getOne($params); + if (empty($order_inquiry)) { + return fail(); + } + + if (empty($order_inquiry['doctor_id'])) { + return success(); + } + + // 检测订单类型 + if ($order_inquiry['inquiry_type'] != 2 && $order_inquiry['inquiry_type'] != 4) { + return fail(HttpEnumCode::HTTP_ERROR, "订单类型不允许检测"); + } + + // 检测订单退款状态 + if (!in_array($order_inquiry['inquiry_refund_status'], [0, 4, 5])) { + // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭) + return fail(HttpEnumCode::HTTP_ERROR, "订单已退款"); + } + + $result = array(); + $result['doctor_id'] = $order_inquiry['doctor_id']; + + return success($result); + } + + /** + * 新增医生评价 + * @return array + */ + public function addInquiryEvaluation(): array + { + $user_info = $this->request->getAttribute("userInfo") ?? []; + $doctor_id = $this->request->input('doctor_id'); + $order_inquiry_id = $this->request->input('order_inquiry_id'); + $reply_quality = $this->request->input('reply_quality'); + $service_attitude = $this->request->input('service_attitude'); + $reply_progress = $this->request->input('reply_progress'); // + $content = $this->request->input('content'); + + $params = array(); + $params['order_inquiry_id'] = $order_inquiry_id; + $params['patient_id'] = $user_info['client_user_id']; + $order_inquiry = OrderInquiry::getOne($params); + if (empty($order_inquiry)) { + return fail(); + } + + // 检测订单状态 + if ($order_inquiry['inquiry_status'] != 5) { + // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) + return fail(HttpEnumCode::HTTP_ERROR, "请问诊完成后进行评价"); + } + + // 检测是否评价过 + $params = array(); + $params['doctor_id'] = $doctor_id; + $params['patient_id'] = $user_info['client_user_id']; + $params['order_inquiry_id'] = $order_inquiry_id;; + $order_evaluation = OrderEvaluation::getOne($params); + if (!empty($order_evaluation)){ + // 已评价 + return success(); + } + + // 获取用户数据 + $params = array(); + $params['patient_id'] = $user_info['client_user_id']; + $user_patient = UserPatient::getOne($params); + + // 整理数据 + $reply_quality = $reply_quality * 20; + $service_attitude = $service_attitude * 20; + $reply_progress = $reply_progress * 20; + + // 计算平均值 (百分制,回复质量占4、服务态度占3、回复速度占3,计算公式:每个得分 * 占比 相加) + $avg_score = $reply_quality * 0.4 + $service_attitude * 0.3 + $reply_progress * 0.3; + + $data = array(); + $data['doctor_id'] = $doctor_id; + $data['patient_id'] = $user_info['client_user_id']; + $data['order_inquiry_id'] = $order_inquiry_id; + $data['name_mask'] = Mask::maskNameStr($user_patient['user_name']); + $data['reply_quality'] = $reply_quality; + $data['service_attitude'] = $service_attitude; + $data['reply_progress'] = $reply_progress; + $data['avg_score'] = $avg_score; + $data['type'] = 1; + $data['content'] = $content; + $order_evaluation = OrderEvaluation::addOrderEvaluation($data); + if (empty($order_evaluation)){ + return fail(); + } + + return success(); + } + + /** * 获取医生未接诊订单数量 * @param string $doctor_id 医生id @@ -393,7 +508,7 @@ class InquiryService extends BaseService { $params = array(); $params['doctor_id'] = $doctor_id; - if (!empty($inquiry_type)){ + if (!empty($inquiry_type)) { $params['inquiry_type'] = $inquiry_type; // 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) } $params['inquiry_status'] = 4; // 已接诊 @@ -453,4 +568,107 @@ class InquiryService extends BaseService $params['inquiry_status'] = $inquiry_status; return OrderInquiry::getCount($params); } + + /** + * 订单退款接口 + * 务必外层接收异常,回滚事务 + * @param string $order_inquiry_id + * @param string $refund_reason 退款原因 + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + */ + public function inquiryRefund(string $order_inquiry_id, string $refund_reason) + { + // 获取订单数据 + $params = array(); + $params['order_inquiry_id'] = $order_inquiry_id; + $order_inquiry = OrderInquiry::getOne($params); + if (empty($order_inquiry)) { + throw new BusinessException("订单数据为空"); + } + + // 检测问诊订单状态 + if (in_array($order_inquiry['inquiry_status'], [2, 3, 4, 5])) { + // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) + throw new BusinessException("订单状态错误"); + } + + // 检测订单退款状态 + if (in_array($order_inquiry['inquiry_refund_status'], [2, 3, 4, 5])) { + // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭) + throw new BusinessException("订单退款状态错误"); + } + + // 检测支付状态 + if (in_array($order_inquiry['inquiry_pay_status'], [2])) { + // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + throw new BusinessException("订单支付状态错误"); + } + + // 发起退款 + $WechatPay = new WechatPay(1); + + $generator = $this->container->get(IdGeneratorInterface::class); + + // 系统退款编号 + $inquiry_refund_no = $generator->generate(); + + $options = array(); + $options['transaction_id'] = $order_inquiry['escrow_trade_no']; + $options['out_refund_no'] = $inquiry_refund_no; + $options['reason'] = $refund_reason; + $options['amount'] = [ + 'refund' => (int)$order_inquiry['payment_amount_total'] * 100, + 'total' => (int)$order_inquiry['payment_amount_total'] * 100, + 'currency' => "CNY", + ]; + + $result = $WechatPay->refund($options); + + // 处理订单退款状态 + // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭) + if ($result['status'] == "SUCCESS") { + // 退款成功 + $inquiry_refund_status = 3; + } elseif ($result['status'] == "CLOSED") { + // 退款关闭 + $inquiry_refund_status = 5; + } elseif ($result['status'] == "PROCESSING") { + // 退款处理中 + $inquiry_refund_status = 2; + } elseif ($result['status'] == "ABNORMAL") { + // 退款异常,此情况不处理,进行短信通知 + throw new BusinessException("订单退款状态异常"); + } else { + throw new BusinessException("订单退款状态错误"); + } + + // 新增退款表 + $data = array(); + $data['patient_id'] = $order_inquiry['patient_id']; + $data['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; + $data['inquiry_no'] = $order_inquiry['inquiry_no']; + $data['inquiry_refund_no'] = $inquiry_refund_no; + $data['refund_id'] = $result['refund_id']; + $data['inquiry_refund_status'] = $inquiry_refund_status; + $data['refund_total'] = $order_inquiry['payment_amount_total']; + $data['refund_reason'] = $refund_reason; + + if ($inquiry_refund_status == 3 && !empty($result['success_time'])) { + $data['success_time'] = date("Y-m-d H:i:s", strtotime($result['success_time'])); // 退款成功时间 + } + + $order_inquiry_refund = OrderInquiryRefund::addOrderInquiryRefund($data); + if (empty($order_inquiry_refund)) { + throw new BusinessException("添加退款表失败"); + } + + // 修改问诊订单表状态 + $data = array(); + $data['inquiry_refund_status'] = $inquiry_refund_status; + + $params = array(); + $params['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; + OrderInquiry::edit($params, $data); + } } \ No newline at end of file diff --git a/app/Services/PatientDoctorService.php b/app/Services/PatientDoctorService.php index 9c1951f..cdfda8d 100644 --- a/app/Services/PatientDoctorService.php +++ b/app/Services/PatientDoctorService.php @@ -382,57 +382,10 @@ class PatientDoctorService extends BaseService if ($inquiry_type == 2 || $inquiry_type == 4){ // 快速问诊-问诊购药 - // 获取问诊配置 - $params = array(); - $params['inquiry_type'] = $inquiry_type; - $params['inquiry_mode'] = $inquiry_mode; - $system_inquiry_config = SystemInquiryConfig::getOne($params); - if (empty($system_inquiry_config)){ - return fail(HttpEnumCode::SERVER_ERROR); - } - - // 获取系统工作时间 - $params = array(); - $params['system_inquiry_config_id'] = $system_inquiry_config['system_inquiry_config_id']; - $system_inquiry_time = SystemInquiryTime::getList($params); - if (empty($system_inquiry_time)){ - return fail(HttpEnumCode::SERVER_ERROR); - } - - // 检测当前是否坐班时间 - $is_time_pass = false; - - foreach ($system_inquiry_time as $item){ - $start_time = strtotime(date('Y-m-d') . ' ' .$item['start_time']); - $end_time = strtotime(date('Y-m-d') . ' ' .$item['end_time']); - if ($start_time < time() && $end_time > time()){ - // 符合当前时间区间 - $is_time_pass = true; - } - } - - if (!$is_time_pass){ - // 非坐班时间 - // 检测是否存在对应问诊的在线医生 - $UserDoctorService = new UserDoctorService(); - $is_online = $UserDoctorService->checkDoctorOnline($inquiry_type); - if (!$is_online){ - $UserDoctorService = new UserDoctorService(); - - // 获取当前时间10分钟前接诊中的医生 - $doctors = $UserDoctorService->getBeforeCurrentTimeDoctor(10,$inquiry_type); - if (empty($doctors)){ - // 获取当前时间30分钟前接诊中的医生 - $doctors = $UserDoctorService->getBeforeCurrentTimeDoctor(30,$inquiry_type); - if (empty($doctors)){ - return fail(HttpEnumCode::HTTP_ERROR,'当前不再就诊时间范围内,请您选择其它问诊服务'); - } - } - } - }else{ - // 坐班时间,检测全部医生接诊是否达到上限-暂不处理 - // 获取符合条件医生 - // 获取当前医生接诊订单数 + $UserDoctorService = new UserDoctorService(); + $doctor_id = $UserDoctorService->getInquiryAssignDoctor($inquiry_type); + if (empty($doctor_id)){ + return fail(); } } diff --git a/config/routes.php b/config/routes.php index 0d2c343..3f8edb2 100644 --- a/config/routes.php +++ b/config/routes.php @@ -75,7 +75,6 @@ Router::addGroup('/doctor', function () { // 获取患者问诊病例 Router::get('/case/{inquiry_case_id:\d+}', [InquiryController::class, 'getPatientInquiryCase']); - }); //银行卡 @@ -192,15 +191,6 @@ Router::addGroup('/patient', function () { // 问诊 Router::addGroup('/inquiry', function () { - // 医生数据 - Router::addGroup('/doctor', function () { - // 获取问诊医生列表 - Router::get('', [PatientDoctorController::class, 'getInquiryDoctorList']); - - // 获取问诊医生详情 - Router::get('/{doctor_id:\d+}', [PatientDoctorController::class, 'getInquiryDoctorInfo']); - }); - // 订单 Router::addGroup('/order', function () { // 创建订单 @@ -209,18 +199,30 @@ Router::addGroup('/patient', function () { // 检测是否可以接诊 Router::get('/check', [PatientDoctorController::class, 'getDoctorInquiryCheck']); + + // 检测快速、购药订单分配医生状态 + Router::get('/assign/{order_inquiry_id:\d+}', [InquiryController::class, 'getInquiryAssign']); + + // 新增医生评价 + Router::post('/evaluation', [InquiryController::class, 'addInquiryEvaluation']); }); // 医生数据 Router::addGroup('/doctor', function () { + // 获取医生列表-问诊 + Router::get('/inquiry', [PatientDoctorController::class, 'getInquiryDoctorList']); + + // 获取医生详情-问诊 + Router::get('/{doctor_id:\d+}', [PatientDoctorController::class, 'getInquiryDoctorInfo']); + // 医生详情简介-详情中的简介 Router::get('/profile/{doctor_id:\d+}', [PatientDoctorController::class, 'getDoctorProfile']); // 删除服务过患者的医生 - Router::delete('/{doctor_id:\d+}', [UserPatientController::class, 'deletePatientDoctor']); + Router::delete('/history/{doctor_id:\d+}', [UserPatientController::class, 'deletePatientDoctor']); // 获取我的问诊、关注医生列表 - Router::get('/list', [PatientDoctorController::class, 'getDoctorList']); + Router::get('/my', [PatientDoctorController::class, 'getDoctorList']); }); // 家庭成员 @@ -406,4 +408,89 @@ Router::addGroup('/im', function () { Router::put('/avatar', [UserController::class, 'putUserAvatar']); }); -Router::get('/testpay', [UserController::class, 'testpay']); \ No newline at end of file +Router::get('/testpay', [UserController::class, 'testpay']); + + +// 未开发接口 + + + +// 获取问诊订单列表-问诊订单 +Router::post('/3', [CallBackController::class, 'imCallBack']); + +// 获取订单详情-问诊订单 +Router::post('/4', [CallBackController::class, 'imCallBack']); + +// 取消问诊-问诊订单-未接诊时 +Router::post('/5', [CallBackController::class, 'imCallBack']); + +// 删除问诊订单-问诊订单-订单完成 +Router::post('/6', [CallBackController::class, 'imCallBack']); + +// 取消支付-问诊订单-未支付 +Router::post('/7', [CallBackController::class, 'imCallBack']); + + +// 获取药品订单列表-药品订单 +Router::post('/8', [CallBackController::class, 'imCallBack']); + +// 获取药品订单详情-药品订单 +Router::post('/9', [CallBackController::class, 'imCallBack']); + +// 获取地址列表-地址管理 +Router::post('/10', [CallBackController::class, 'imCallBack']); + +// 获取地址列表-地址管理 +Router::post('/11', [CallBackController::class, 'imCallBack']); + +// 添加/修改地址-地址管理 +Router::post('/12', [CallBackController::class, 'imCallBack']); + +// 删除地址-地址管理 +Router::post('/13', [CallBackController::class, 'imCallBack']); + +// 获取处方列表-处方管理 +Router::post('/14', [CallBackController::class, 'imCallBack']); + +// 获取处方详情-处方管理 +Router::post('/15', [CallBackController::class, 'imCallBack']); + +// 获取处方支付页详情-处方管理 +Router::post('/16', [CallBackController::class, 'imCallBack']); + +// 创建处方订单-处方管理 +Router::post('/17', [CallBackController::class, 'imCallBack']); + +// 删除处方记录-处方管理 +Router::post('/18', [CallBackController::class, 'imCallBack']); + +// 获取问诊价格列表-消息-无问诊消息时 +Router::post('/19', [CallBackController::class, 'imCallBack']); + +// 获取系统消息列表-系统消息 +Router::post('/20', [CallBackController::class, 'imCallBack']); + +// 获取服务、退款、福利、物流消息列表-系统消息 +Router::post('/21', [CallBackController::class, 'imCallBack']); + +// 消息已读-系统消息 +Router::post('/22', [CallBackController::class, 'imCallBack']); + +// 全部消息已读-系统消息-服务消息 +Router::post('/23', [CallBackController::class, 'imCallBack']); + + +// 获取问诊消息列表-消息 +Router::post('/24', [CallBackController::class, 'imCallBack']); + +// 新增关注医生 +Router::post('/25', [CallBackController::class, 'imCallBack']); + +// 获取患者-医生关注状态 +Router::post('/26', [CallBackController::class, 'imCallBack']); + +// 获取患者简短问诊病例-聊天界面 +Router::post('/27', [CallBackController::class, 'imCallBack']); + +// 新增医生接诊-医生端 +Router::post('/28', [CallBackController::class, 'imCallBack']); \ No newline at end of file