修改服务通知排序,修改医生我的账户接口

This commit is contained in:
wucongxing 2023-04-07 10:46:19 +08:00
parent 5ddc4d1c0a
commit 5776001cfe
10 changed files with 171 additions and 91 deletions

View File

@ -0,0 +1,70 @@
<?php
declare(strict_types=1);
namespace App\Amqp\Consumer;
use App\Utils\Log;
use Hyperf\Amqp\Message\ConsumerDelayedMessageTrait;
use Hyperf\Amqp\Message\ProducerDelayedMessageTrait;
use Hyperf\Amqp\Message\Type;
use Hyperf\Amqp\Result;
use Hyperf\Amqp\Annotation\Consumer;
use Hyperf\Amqp\Message\ConsumerMessage;
use Hyperf\DbConnection\Db;
use PhpAmqpLib\Message\AMQPMessage;
/**
* 自动完成问诊订单
* 延迟队列
*/
#[Consumer(nums: 1)]
class AutoFinishInquiryDelayDirectConsumer extends ConsumerMessage
{
use ProducerDelayedMessageTrait;
use ConsumerDelayedMessageTrait;
protected string $exchange = 'amqp.delay.direct';
protected ?string $queue = 'auto_finish_inquiry.delay.queue';
protected string $type = Type::DIRECT; //Type::FANOUT;
protected string|array $routingKey = 'AutoFinishInquiry';
public function consumeMessage($data, AMQPMessage $message): string
{
Log::getInstance()->error("开始执行 自动完成问诊订单 队列:" . json_encode($data, JSON_UNESCAPED_UNICODE));
Db::beginTransaction();
try {
// 检测入参参数
if (empty($data['order_inquiry_id'])){
Log::getInstance()->error("自动完成问诊订单队列执行失败:入参错误");
return Result::DROP;
}
// 获取问诊订单数据
$params = array();
$params['order_inquiry_id'] = $data['order_inquiry_id'];
// 添加医生账户总表
// 医生账户表-日
// 修改问诊订单表
// 添加自动评价
// 回写患者病例
Db::commit();
Log::getInstance()->info("自动完成问诊订单队列执行成功");
return Result::ACK;
} catch (\Exception $e) {
Db::rollBack();
Log::getInstance()->error("自动完成问诊订单执行失败:" . $e->getMessage());
return Result::ACK; // 重回队列
}
}
}

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace App\Amqp\Producer;
use Hyperf\Amqp\Annotation\Producer;
use Hyperf\Amqp\Message\ProducerDelayedMessageTrait;
use Hyperf\Amqp\Message\ProducerMessage;
use Hyperf\Amqp\Message\Type;
/**
* 自动完成问诊订单
* 延迟队列
*/
#[Producer]
class AutoFinishInquiryDelayDirectProducer extends ProducerMessage
{
use ProducerDelayedMessageTrait;
protected string $exchange = 'amqp.delay.direct';
protected string $type = Type::DIRECT;
protected string|array $routingKey = 'AutoFinishInquiry';
public function __construct($data)
{
$this->payload = $data;
}
}

View File

@ -1,73 +0,0 @@
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace App\Listener;
use Hyperf\AsyncQueue\AnnotationJob;
use Hyperf\AsyncQueue\Event\AfterHandle;
use Hyperf\AsyncQueue\Event\BeforeHandle;
use Hyperf\AsyncQueue\Event\Event;
use Hyperf\AsyncQueue\Event\FailedHandle;
use Hyperf\AsyncQueue\Event\RetryHandle;
use Hyperf\Event\Annotation\Listener;
use Hyperf\Event\Contract\ListenerInterface;
use Hyperf\ExceptionHandler\Formatter\FormatterInterface;
use Hyperf\Logger\LoggerFactory;
use Psr\Log\LoggerInterface;
#[Listener]
class QueueHandleListener implements ListenerInterface
{
protected LoggerInterface $logger;
public function __construct(LoggerFactory $loggerFactory, protected FormatterInterface $formatter)
{
$this->logger = $loggerFactory->get('queue');
}
public function listen(): array
{
return [
AfterHandle::class,
BeforeHandle::class,
FailedHandle::class,
RetryHandle::class,
];
}
public function process(object $event): void
{
if ($event instanceof Event && $event->message->job()) {
$job = $event->message->job();
$jobClass = get_class($job);
if ($job instanceof AnnotationJob) {
$jobClass = sprintf('Job[%s@%s]', $job->class, $job->method);
}
$date = date('Y-m-d H:i:s');
switch (true) {
case $event instanceof BeforeHandle:
$this->logger->info(sprintf('[%s] Processing %s.', $date, $jobClass));
break;
case $event instanceof AfterHandle:
$this->logger->info(sprintf('[%s] Processed %s.', $date, $jobClass));
break;
case $event instanceof FailedHandle:
$this->logger->error(sprintf('[%s] Failed %s.', $date, $jobClass));
$this->logger->error($this->formatter->format($event->getThrowable()));
break;
case $event instanceof RetryHandle:
$this->logger->warning(sprintf('[%s] Retried %s.', $date, $jobClass));
break;
}
}
}
}

View File

@ -14,6 +14,7 @@ use Hyperf\HttpMessage\Stream\SwooleStream;
use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
use Hyperf\Redis\Redis;
use Monolog\Logger;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

View File

@ -100,7 +100,7 @@ class MessageNotice extends Model
public static function getMessageNoticePage(array $params, array $fields = ["*"], int $page = null, ?int $per_page = 10): array
{
$results = self::where($params)
->orderBy('notice_send_time')
->orderBy('notice_send_time','desc')
->paginate($per_page, $fields, "page", $page);
$data = array();

View File

@ -33,9 +33,10 @@ use Hyperf\Snowflake\Concern\Snowflake;
* @property string $reception_time 接诊时间(已接诊)
* @property string $complete_time 订单完成时间(问诊完成时间)
* @property string $finish_time 订单结束时间
* @property string $settlement_amount_total 订单与医生结算金额
* @property int $settlement_status 订单与医生结算状态0:未结算 1:已结算)
* @property string $settlement_time 订单与医生结算时间
* @property int $statistics_status 订单统计状态0:未统计 1:已统计 2:统计失败)
* @property string $statistics_time 订单统计时间
* @property int $is_withdrawal 是否提现0: 1: 2:提现中)
* @property string $withdrawal_time 提现时间
* @property string $cancel_time 订单取消时间
* @property int $cancel_reason 取消订单原因1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时)
* @property string $cancel_remarks 取消订单备注(自动添加)
@ -60,7 +61,7 @@ class OrderInquiry extends Model
/**
* The attributes that are mass assignable.
*/
protected array $fillable = ['order_inquiry_id', 'user_id', 'patient_id', 'doctor_id', 'family_id', 'inquiry_type', 'inquiry_mode', 'inquiry_status', 'is_delete', 'inquiry_refund_status', 'inquiry_pay_channel', 'inquiry_pay_status', 'inquiry_no', 'escrow_trade_no', 'amount_total', 'coupon_amount_total', 'payment_amount_total', 'pay_time', 'reception_time', 'complete_time', 'finish_time', 'settlement_amount_total', 'settlement_status', 'settlement_time', 'cancel_time', 'cancel_reason', 'cancel_remarks', 'patient_name', 'patient_name_mask', 'patient_sex', 'patient_age', 'created_at', 'updated_at'];
protected array $fillable = ['order_inquiry_id', 'user_id', 'patient_id', 'doctor_id', 'family_id', 'inquiry_type', 'inquiry_mode', 'inquiry_status', 'is_delete', 'inquiry_refund_status', 'inquiry_pay_channel', 'inquiry_pay_status', 'inquiry_no', 'escrow_trade_no', 'amount_total', 'coupon_amount_total', 'payment_amount_total', 'pay_time', 'reception_time', 'complete_time', 'finish_time', 'statistics_status', 'statistics_time', 'is_withdrawal', 'withdrawal_time', 'cancel_time', 'cancel_reason', 'cancel_remarks', 'patient_name', 'patient_name_mask', 'patient_sex', 'patient_age', 'created_at', 'updated_at'];
protected string $primaryKey = "order_inquiry_id";
@ -193,7 +194,7 @@ class OrderInquiry extends Model
* @param array $inquiry_status_params inquiry_status字段搜索条件
* @return int|mixed|string
*/
public static function getOrderInquiryAmountTotalSum(array $params, array $reception_time,array $inquiry_status_params): mixed
public static function getOrderInquiryBetweenTimeAmountTotalSum(array $params, array $reception_time, array $inquiry_status_params): mixed
{
return self::where($params)
->whereIn('inquiry_status',$inquiry_status_params)
@ -202,6 +203,20 @@ class OrderInquiry extends Model
->sum("amount_total");
}
/**
* 获取医生某种状态的订单金额
* @param array $params
* @param array $inquiry_status_params inquiry_status字段搜索条件
* @return int|mixed|string
*/
public static function getOrderInquiryAmountTotalSum(array $params, array $inquiry_status_params): mixed
{
return self::where($params)
->whereIn('inquiry_status',$inquiry_status_params)
->orderBy('reception_time')
->sum("amount_total");
}
/**
* 获取某种状态的所有订单
* @param array $params

View File

@ -180,11 +180,11 @@ class DoctorAccountService extends BaseService
return success();
}
$result = array();
$result['bank_card_id'] = $doctor_bank_card['bank_card_id'];
$result['bank_icon_path'] = $doctor_bank_card['BasicBank']['bank_icon_path'];
$result['bank_name'] = $doctor_bank_card['BasicBank']['bank_name'];
$result['bank_card_code_mask'] = $doctor_bank_card['bank_card_code_mask'];
$bank = array();
$bank['bank_card_id'] = $doctor_bank_card['bank_card_id'];
$bank['bank_icon_path'] = $doctor_bank_card['BasicBank']['bank_icon_path'];
$bank['bank_name'] = $doctor_bank_card['BasicBank']['bank_name'];
$bank['bank_card_code_mask'] = $doctor_bank_card['bank_card_code_mask'];
// 获取医生账户余额
if (!empty($order_inquiry_ids)){
@ -201,7 +201,8 @@ class DoctorAccountService extends BaseService
$balance_account = array_sum(array_column($order_inquiry->toArray(),'amount_total'));
}
}else{
$balance_account = $this->getDoctorBalanceAccount($user_info['client_user_id']);
$InquiryService = new InquiryService();
$balance_account = $InquiryService->getDoctorCanWithdrawalAmountTotal($user_info['client_user_id']);
}
if ($balance_account > 0) {
@ -211,10 +212,14 @@ class DoctorAccountService extends BaseService
// 计算医生个人所得税
$income_tax = $this->computeIndividualIncomeTax($balance_account);
$result['withdrawal_amount'] = floor(($balance_account - $income_tax) * 100) / 100;
$withdrawal_amount = floor(($balance_account - $income_tax) * 100) / 100;
$income_tax = floor($income_tax * 100) / 100;
$result['income_tax'] = $income_tax;
$result = array();
$result['bank'] = $bank;//银行数据
$result['withdrawal_amount'] = $withdrawal_amount; // 提现金额
$result['income_tax'] = $income_tax; // 个人所得税
return success($result);
}

View File

@ -799,17 +799,43 @@ class InquiryService extends BaseService
$params['doctor_id'] = $doctor_id;
$params['inquiry_refund_status'] = 0; // 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
$params['inquiry_pay_status'] = 2; // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
$params['settlement_status'] = 0; // 订单与医生结算状态0:未结算 1:已结算
$params['is_withdrawal'] = 0; // 是否提现0:否 1:是 2:提现中
$reception_time = [$start_date, $end_date];
$inquiry_status_params = [4, 5]; // 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$amount_total_sum = OrderInquiry::getOrderInquiryAmountTotalSum($params, $reception_time, $inquiry_status_params);
$amount_total_sum = OrderInquiry::getOrderInquiryBetweenTimeAmountTotalSum($params, $reception_time, $inquiry_status_params);
return $amount_total_sum ?: 0;
}
/**
* 获取医生可提现金额
* @param string $doctor_id
* @return int
*/
public function getDoctorCanWithdrawalAmountTotal(string $doctor_id): int
{
// 获取医生当日接诊订单金额
$params = array();
$params['doctor_id'] = $doctor_id;
$params['inquiry_refund_status'] = 0; // 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
$params['inquiry_pay_status'] = 2; // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
$params['statistics_status'] = 1; // 订单统计状态0:未统计 1:已统计 2:统计失败)
$params['is_withdrawal'] = 0; // 是否提现0:否 1:是 2:提现中)
$params['inquiry_status'] = 6; // 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$order_inquiry = OrderInquiry::getList($params);
if (empty($order_inquiry)){
return 0;
}
$order_inquiry = $order_inquiry->toArray();
return array_sum(array_column($order_inquiry,'amount_total'));
}
/**
* 获取患者某一状态下的问诊订单数量
* @param string $patient_id 患者id

View File

@ -2162,4 +2162,7 @@ class UserDoctorService extends BaseService
$inquiry_status_params = [1,3,4];
return OrderInquiry::getInquiryStatusCount($params,$inquiry_status_params);
}
// 获取医生已完成订单总额
}

View File

@ -10,6 +10,8 @@ declare(strict_types=1);
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
use Monolog\Logger;
$appEnv = env('APP_ENV', 'dev');
if ($appEnv == 'dev') {
$formatter = [
@ -33,9 +35,9 @@ return [
'class' => Monolog\Handler\StreamHandler::class,
'constructor' => [
'stream' => BASE_PATH . '/runtime/logs/hyperf.log',
'level' => Monolog\Logger::DEBUG,
'level' => Monolog\Logger::INFO,
],
],
'formatter' => $formatter,
]
],
];