info(json_encode($data, JSON_UNESCAPED_UNICODE)); try { // 检测执行次数 $Utils = new Utils(); $redis_key = "CompleteServicePackage" . $data['order_no']; $res = $Utils->checkHandleNumber($redis_key); if (!$res) { Log::getInstance("queue-AutoCompleteServicePackage")->error("超出最大执行次数或检测错误"); return Result::ACK; } }catch (\Throwable $e){ Log::getInstance("queue-AutoCompleteServicePackage")->error($e->getMessage()); return Result::REQUEUE; } try { // 检测入参参数 $res = $this->detectInputParameters($data); if (!$res){ Log::getInstance("queue-AutoCompleteServicePackage")->error("入参错误" ); return Result::ACK; } // 获取订单数据 $params = array(); $params['order_service_no'] = $data['order_no']; $order_service_package = OrderServicePackage::getOne($params); if (empty($order_service_package)){ Log::getInstance("queue-AutoCompleteServicePackage")->error("订单错误" ); return Result::ACK; } // 检测订单状态 $res = $this->detectOrderStatus($order_service_package); if (!$res){ Log::getInstance("queue-AutoCompleteServicePackage")->error("订单状态错误" ); return Result::ACK; } // 检测订单结束时间 $res = $this->detectOrderFinishTime($order_service_package); if (!$res){ // 未到结束时间,重新加入队列 $res = $this->addQueue($order_service_package); if (!$res){ // 重新添加队列失败 return Result::REQUEUE; } return Result::DROP; } // 获取订单详情数据 $params = array(); $params['order_service_no'] = $data['order_no']; $order_service_package_detail = OrderServicePackageDetail::getOne($params); if (empty($order_service_package_detail)){ Log::getInstance("queue-AutoCompleteServicePackage")->error("订单详情错误" ); return Result::ACK; } }catch (\Throwable $e){ Log::getInstance("queue-AutoCompleteServicePackage")->error($e->getMessage()); return Result::REQUEUE; } // 处理业务 Db::beginTransaction(); try { // 处理服务包订单为已完成 $data = array(); $data['order_service_status'] = 4;// 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) $params = array(); $params['order_service_id'] = $order_service_package['order_service_id']; OrderServicePackage::edit($params,$data); // 处理统计问题 if ($order_service_package['amount_total'] > 0) { // 计算本次问诊服务包问诊金额 $amount_total = bcmul( (string)$order_service_package_detail['service_count'], bcmul( (string)$order_service_package_detail['single_inquiry_price'], 0.75, 3), 3 ); // 处理医生账户总表 $res = $this->handleDoctorAccount($amount_total,$order_service_package['doctor_id']); if (!$res) { Db::rollBack(); return Result::REQUEUE; } // 处理医生账户表-日 $res = $this->handleDoctorAccountDay($amount_total,$order_service_package['doctor_id'],$order_service_package['start_time']); if (!$res) { Db::rollBack(); return Result::REQUEUE; } } Db::commit(); }catch (\Throwable $e){ Db::rollBack(); Log::getInstance("queue-AutoCompleteServicePackage")->error($e->getMessage()); return Result::REQUEUE; } // 发送消息 try { // 获取订单医生数据 $params = array(); $params['doctor_id'] = $order_service_package['doctor_id']; $user_doctor = UserDoctor::getOne($params); if (empty($user_doctor)) { Log::getInstance("queue-AutoCompleteServicePackage")->error("医生数据错误"); return Result::ACK; } $params = array(); $params['order_service_id'] = $order_service_package['order_service_id']; $order_service_package_inquiry = OrderServicePackageInquiry::getOne($params); if (!empty($order_service_package_inquiry)){ // 获取医生数据 $params = array(); $params['doctor_id'] = $order_service_package['doctor_id']; $user_doctor = UserDoctor::getOne($params); if (!empty($user_doctor)) { // 医生-通知医生患者的服务包服务结束 $MessagePush = new MessagePush($user_doctor['user_id'], $order_service_package_inquiry['inquiry_no']); $MessagePush->doctorServicePackageFinish(); } // 患者-通知患者服务包服务已结束 $MessagePush = new MessagePush($order_service_package['user_id'], $order_service_package_inquiry['inquiry_no']); $MessagePush->patientServicePackageFinish(); } }catch (\Throwable $e){ Log::getInstance("queue-AutoCompleteServicePackage")->error($e->getMessage()); return Result::ACK; } return Result::ACK; } /** * 检测入参参数 * @param array $data * @return bool */ public function detectInputParameters(array $data): bool { if (empty($data['order_no'])){ return false; } return true; } /** * 检测订单状态 * @param array|object $order_service_package * @return bool */ public function detectOrderStatus(array|object $order_service_package): bool { if ($order_service_package['order_service_status'] == 1){ Log::getInstance("queue-AutoCompleteServicePackage")->error("订单未支付" ); return false; } if ($order_service_package['order_service_status'] == 2){ Log::getInstance("queue-AutoCompleteServicePackage")->error("订单未开始" ); return false; } if ($order_service_package['order_service_status'] == 4){ Log::getInstance("queue-AutoCompleteServicePackage")->error("订单已完成" ); return false; } if ($order_service_package['order_service_status'] == 5){ Log::getInstance("queue-AutoCompleteServicePackage")->error("订单已取消" ); return false; } // 订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常) if (!in_array($order_service_package['refund_status'],[0,4,5])){ Log::getInstance("queue-AutoCompleteServicePackage")->error("订单退款中" ); return false; } // 订单支付状态 if ($order_service_package['pay_status'] != 2){ Log::getInstance("queue-AutoCompleteServicePackage")->error("订单未支付" ); return false; } return true; } /** * 检测订单结束时间 * @param array|object $order_service_package * @return bool */ public function detectOrderFinishTime(array|object $order_service_package): bool { $finish_time = strtotime($order_service_package['finish_time']); $diff_time = time() - $finish_time; if ($diff_time < 0 && ($diff_time > -7200)){ // 负数,表示还未到完成时间。重新加入队列 return false; } // 正数,已到或已超完成时间。可以取消。 return true; } /** * 重新加入队列 * @param array|object $order_service_package * @return bool */ public function addQueue(array|object $order_service_package): bool { try { $finish_time = strtotime($order_service_package['finish_time']); // 结束时间大于当前时间 if ($finish_time > time()){ $time = $finish_time - time(); $queue_data = array(); $queue_data['order_no'] = $order_service_package['order_service_no']; $message = new AutoCompleteServicePackageDelayDirectProducer($queue_data); $message->setDelayMs(1000 * $time); $producer = $this->container->get(Producer::class); $res = $producer->produce($message); if (!$res) { return false; } } }catch (\Throwable $e){ Log::getInstance("queue-AutoCompleteServicePackage")->error($e->getMessage()); return false; } return true; } /** * 处理医生账户总表 * 创建/修改医生账户总表中总金额、账户余额数据 * @param string|int $amount_total * @param string|int $doctor_id * @return bool */ protected function handleDoctorAccount(string|int $amount_total,string|int $doctor_id): bool { $amount_total = bcmul((string)$amount_total,"0.75",8); $params = array(); $params['doctor_id'] = $doctor_id; $doctor_account = DoctorAccount::getOne($params); if (empty($doctor_account)) { // 首次 $data = array(); $data['doctor_id'] = $doctor_id; $data['total_amount'] = $amount_total; $data['balance_account'] = $amount_total; $data['applied_withdrawal_amount'] = 0; $data['actual_withdrawal_amount'] = 0; $data['income_tax'] = 0; $doctor_account = DoctorAccount::addDoctorAccount($data); if (empty($doctor_account)) { return false; } } else { // 非首次 // 总金额(已结束订单的总金额) $params = array(); $params['account_id'] = $doctor_account['account_id']; DoctorAccount::inc($params, 'total_amount', (float)$amount_total); // 账户余额 DoctorAccount::inc($params, 'balance_account', (float)$amount_total); } return true; } /** * 处理医生账户表-日 * @param string|int $amount_total * @param string|int $doctor_id * @param string $start_time * @return bool */ protected function handleDoctorAccountDay(string|int $amount_total,string|int $doctor_id,string $start_time): bool { $amount_total = bcmul((string)$amount_total,"0.75",8); $params = array(); $params['doctor_id'] = $doctor_id; $params['date'] = date('Y-m-d', strtotime($start_time)); $doctor_account_day = DoctorAccountDay::getOne($params); if (empty($doctor_account_day)) { // 当日首次 $data = array(); $data['doctor_id'] = $doctor_id; $data['year'] = date('Y', strtotime($start_time)); $data['month'] = date('m', strtotime($start_time)); $data['day'] = date('d', strtotime($start_time)); $data['date'] = date('Y-m-d', strtotime($start_time)); $data['total_amount'] = $amount_total; $doctor_account_day = DoctorAccountDay::addDoctorAccountDay($data); if (empty($doctor_account_day)) { return false; } } else { // 非当日首次 $params = array(); $params['account_detail_id'] = $doctor_account_day['account_detail_id']; DoctorAccountDay::inc($params, 'total_amount', (float)$amount_total); } return true; } }