hospital-applets-api/app/Model/OrderInquiry.php

615 lines
23 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
namespace App\Model;
use Hyperf\Database\Model\Collection;
use Hyperf\Database\Model\Relations\HasOne;
use Hyperf\Database\Query\Builder;
use Hyperf\DbConnection\Db;
use Hyperf\Snowflake\Concern\Snowflake;
/**
* @property int $order_inquiry_id 主键id
* @property int $user_id 用户id-患者
* @property int $patient_id 患者id
* @property int $doctor_id 医生id未分配时为null
* @property int $family_id 家庭成员id就诊用户
* @property int $inquiry_type 订单类型1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药 5:检测)
* @property int $inquiry_mode 接诊方式1:图文 2:视频 3:语音 4:电话 5:会员 6:疑难会诊 7:附赠 8:健康包 9:随访包)
* @property int $inquiry_status 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
* @property int $is_delete 删除状态0:否 1:是)
* @property int $inquiry_refund_status 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常)
* @property int $inquiry_pay_channel 支付渠道1:小程序支付 2:微信扫码支付 3:模拟支付)
* @property int $inquiry_pay_status 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
* @property string $inquiry_no 系统订单编号
* @property string $escrow_trade_no 第三方支付流水号
* @property string $amount_total 订单金额
* @property string $coupon_amount_total 优惠卷总金额
* @property string $payment_amount_total 实际付款金额
* @property string $pay_time 支付时间
* @property string $reception_time 接诊时间(已接诊)
* @property string $complete_time 订单完成时间(问诊完成时间)
* @property string $finish_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 取消订单备注(自动添加)
* @property int $times_number 沟通次数0为不限制次数
* @property int $duration 沟通时长分钟0为不限制时长
* @property string $patient_name 患者姓名-就诊人
* @property string $patient_name_mask 患者姓名-就诊人(掩码)
* @property int $patient_sex 患者性别-就诊人0:未知 1:男 2:女)
* @property int $patient_age 患者年龄-就诊人
* @property \Carbon\Carbon $created_at 创建时间
* @property \Carbon\Carbon $updated_at 修改时间
* @property-read UserDoctor|null $UserDoctor
* @property-read OrderInquiryCase|null $OrderInquiryCase
*/
class OrderInquiry extends Model
{
use Snowflake;
/**
* The table associated with the model.
*/
protected ?string $table = 'order_inquiry';
/**
* 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', 'statistics_status', 'statistics_time', 'is_withdrawal', 'withdrawal_time', 'cancel_time', 'cancel_reason', 'cancel_remarks', 'times_number', 'duration', 'patient_name', 'patient_name_mask', 'patient_sex', 'patient_age', 'created_at', 'updated_at'];
protected string $primaryKey = "order_inquiry_id";
/**
* 关联医生表
*/
public function UserDoctor(): HasOne
{
return $this->hasOne(UserDoctor::class, 'doctor_id', 'doctor_id');
}
/**
* 关联问诊病例表
*/
public function OrderInquiryCase(): HasOne
{
return $this->hasOne(OrderInquiryCase::class, 'order_inquiry_id', 'order_inquiry_id');
}
/**
* 获取问诊订单-单条
* @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 $data 新增数据
* @return \Hyperf\Database\Model\Model|OrderInquiry
*/
public static function addOrderInquiry(array $data): \Hyperf\Database\Model\Model|OrderInquiry
{
return self::create($data);
}
/**
* 获取信息-多条
* @param array $params
* @param array $fields
* @return object|null
*/
public static function getList(array $params, array $fields = ['*']): object|null
{
return self::where($params)->get($fields);
}
/**
* 获取数量
* @param array $params
* @return int
*/
public static function getCount(array $params): int
{
return self::where($params)->count();
}
/**
* 获取某段时间数量
* @param array $params
* @param array $created_at
* @return int
*/
public static function getDateCount(array $params, array $created_at): int
{
return self::where($params)->whereBetween('created_at', $created_at)->count();
}
/**
* 获取单条,排序
* @param array $params
* @param array $fields
* @return object|null
*/
public static function getOrderOne(array $params, array $fields = ['*']): object|null
{
return self::where($params)->orderBy('created_at', 'desc')->first($fields);
}
/**
* 获取医生某一时间段接诊订单分页数据
* 已结束
* @param array $params
* @param array $reception_time 接诊时间区间 ['2023-01-02','2023-01-03']
* @param array $fields
* @param int|null $page
* @param int|null $per_page
* @return int|mixed|string
*/
public static function getDoctorFinishDateOrderInquiryPage(array $params, array $reception_time, array $fields = ["*"], int $page = null, ?int $per_page = 10): mixed
{
$raw = self::where($params)
->whereBetween('finish_time', $reception_time)
->orderBy('finish_time')
->paginate($per_page, $fields, "page", $page);
$data = array();
$data['current_page'] = $raw->currentPage();// 当前页码
$data['total'] = $raw->total();//数据总数
$data['data'] = $raw->items();//数据
$data['per_page'] = $raw->perPage();//每页个数
$data['last_page'] = $raw->lastPage();//最后一页
return $data;
}
/**
* 获取医生某一时间段接诊订单分页数据
* 已结束
* @param array $params
* @param array $reception_time 接诊时间区间 ['2023-01','2023-01']
* @param array $inquiry_status_params
* @param array $inquiry_type_not_params
* @param array $fields
* @param int|null $page
* @param int|null $per_page
* @return int|mixed|string
*/
public static function getDoctorCreatedDateOrderInquiryPage(array $params, array $reception_time, array $inquiry_status_params,array $inquiry_type_not_params = [],array $fields = ["*"], int $page = null, ?int $per_page = 10): mixed
{
$raw = self::where($params)
->when($inquiry_type_not_params, function ($query, $inquiry_type_not_params) {
$query->whereNotIn('inquiry_type', $inquiry_type_not_params);
})
->whereIn('inquiry_status', $inquiry_status_params)
->whereBetween('reception_time', $reception_time)
->orderBy('reception_time','desc')
->paginate($per_page, $fields, "page", $page);
$data = array();
$data['current_page'] = $raw->currentPage();// 当前页码
$data['total'] = $raw->total();//数据总数
$data['data'] = $raw->items();//数据
$data['per_page'] = $raw->perPage();//每页个数
$data['last_page'] = $raw->lastPage();//最后一页
return $data;
}
/**
* 获取医生可提现金额-坐班医生
* @param array $params
* @param array $inquiry_status_params
* @param array $inquiry_type_not_params
* @param array $fields
* @return int|mixed|string
*/
public static function getCooperationDoctorCanWithdrawalInquiryOrder(array $params, array $inquiry_status_params,array $inquiry_type_not_params = [],array $fields = ["*"]): mixed
{
$data = self::where($params)
->when($inquiry_type_not_params, function ($query, $inquiry_type_not_params) {
$query->whereNotIn('inquiry_type', $inquiry_type_not_params);
})
->whereIn('inquiry_status', $inquiry_status_params)
->get($fields);
return $data;
}
/**
* 获取医生接诊订单分页数据
* 已结束
* @param array $params
* @param array $inquiry_status_params
* @param array $fields
* @param int|null $page
* @param int|null $per_page
* @return int|mixed|string
*/
public static function getDoctorOrderInquiryPage(array $params, array $inquiry_status_params, array $fields = ["*"], int $page = null, ?int $per_page = 10): mixed
{
$raw = self::where($params)
->whereIn('inquiry_status', $inquiry_status_params)
->orderBy('finish_time', 'desc')
->paginate($per_page, $fields, "page", $page);
$data = array();
$data['current_page'] = $raw->currentPage();// 当前页码
$data['total'] = $raw->total();//数据总数
$data['data'] = $raw->items();//数据
$data['per_page'] = $raw->perPage();//每页个数
$data['last_page'] = $raw->lastPage();//最后一页
return $data;
}
/**
* 获取医生接诊订单分页数据-坐班医生
* 已结束
* @param array $params
* @param array $inquiry_status_params
* @param array $inquiry_type_not_params
* @param array $fields
* @param int|null $page
* @param int|null $per_page
* @return int|mixed|string
*/
public static function getCooperationDoctorOrderInquiryPage(array $params, array $inquiry_status_params,array $inquiry_type_not_params = [], array $fields = ["*"], int $page = null, ?int $per_page = 10): mixed
{
$raw = self::where($params)
->whereIn('inquiry_status', $inquiry_status_params)
->when($inquiry_type_not_params, function ($query, $inquiry_type_not_params) {
$query->whereNotIn('inquiry_type', $inquiry_type_not_params);
})
->orderBy('finish_time', 'desc')
->paginate($per_page, $fields, "page", $page);
$data = array();
$data['current_page'] = $raw->currentPage();// 当前页码
$data['total'] = $raw->total();//数据总数
$data['data'] = $raw->items();//数据
$data['per_page'] = $raw->perPage();//每页个数
$data['last_page'] = $raw->lastPage();//最后一页
return $data;
}
/**
* 获取医生接诊的订单金额
* @param array $params
* @param array $reception_time 接诊时间区间
* @param array $inquiry_status_params inquiry_status字段搜索条件
* @return int|mixed|string
*/
public static function getDoctorAmountTotal(array $params, array $reception_time, array $inquiry_status_params): mixed
{
return self::where($params)
->whereIn('inquiry_status', $inquiry_status_params)
->whereBetween('reception_time', $reception_time)
->orderBy('reception_time')
->sum("amount_total");
}
/**
* 获取医生接诊的订单金额-坐班医生
* @param array $params
* @param array $reception_time 接诊时间区间
* @param array $inquiry_status_params inquiry_status字段搜索条件
* @return int|mixed|string
*/
public static function getCooperationDoctorAmountTotal(array $params, array $reception_time, array $inquiry_status_params,array $inquiry_type_not_params = []): mixed
{
return self::where($params)
->when($inquiry_type_not_params, function ($query, $inquiry_type_not_params) {
$query->whereNotIn('inquiry_type', $inquiry_type_not_params);
})
->whereIn('inquiry_status', $inquiry_status_params)
->whereBetween('reception_time', $reception_time)
->orderBy('reception_time')
->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
* @param array $inquiry_status_params
* @param array $fields
* @return Collection|array
*/
public static function getInquiryStatusWithDoctorList(array $params, array $inquiry_status_params, array $fields = ["*"]): Collection|array
{
return self::with([
'UserDoctor' => function ($query) {
$query->orderBy('is_platform_deep_cooperation', 'desc');
}
])
->where($params)
->whereIn('inquiry_status', $inquiry_status_params)
->get($fields);
}
/**
* 获取某种状态、不包含某医生的所有订单
* @param array $params
* @param array $inquiry_status_params
* @param array $not_in_params
* @param array $fields
* @return Collection|array
*/
public static function getInquiryStatusWithDoctorNotInList(array $params, array $inquiry_status_params, array $not_in_params, array $fields = ["*"]): Collection|array
{
return self::with([
'UserDoctor' => function ($query) {
$query->orderBy('is_platform_deep_cooperation', 'desc');
}
])
->where($params)
->whereIn('inquiry_status', $inquiry_status_params)
->whereNotIn('doctor_id', $not_in_params)
->get($fields);
}
/**
* 获取某种状态的订单
* @param array $params
* @param array $inquiry_status_params
* @param array $fields
* @return object|null
*/
public static function getInquiryStatusOne(array $params, array $inquiry_status_params, array $fields = ["*"]): object|null
{
return self::where($params)
->whereIn('inquiry_status', $inquiry_status_params)
->first($fields);
}
/**
* 获取某种状态的订单
* @param array $params
* @param array $inquiry_status_params
* @param array $fields
* @return object|null
*/
public static function getInquiryStatusList(array $params, array $inquiry_status_params, array $fields = ["*"]): object|null
{
return self::where($params)
->whereIn('inquiry_status', $inquiry_status_params)
->get($fields);
}
/**
* 修改
* @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 $params
* @param array $inquiry_status_params
* @param array $fields
* @param int|null $page
* @param int|null $per_page
* @return int|mixed|string
*/
public static function getPatientOrderInquiryPage(array $params, array $inquiry_status_params, array $fields = ["*"], int $page = null, ?int $per_page = 10): mixed
{
$raw = self::with([
'OrderInquiryCase:inquiry_case_id,order_inquiry_id,disease_desc',
])
->where($params)
->when($inquiry_status_params, function ($query, $inquiry_status_params) {
$query->whereIn('inquiry_status', $inquiry_status_params);
})
->orderBy('created_at', 'desc')
->paginate($per_page, $fields, "page", $page);
$data = array();
$data['current_page'] = $raw->currentPage();// 当前页码
$data['total'] = $raw->total();//数据总数
$data['data'] = $raw->items();//数据
$data['per_page'] = $raw->perPage();//每页个数
$data['last_page'] = $raw->lastPage();//最后一页
return $data;
}
/**
* 获取信息-多条
* @param array $params
* @param array $in_params
* @param array $fields
* @return object|null
*/
public static function getInList(array $params, array $in_params, array $fields = ['*']): object|null
{
return self::where($params)->whereIn('order_inquiry_id', $in_params)->get($fields);
}
/**
* 获取某种状态的订单总数
* @param array $params
* @param array $inquiry_status_params
* @return int
*/
public static function getInquiryStatusCount(array $params, array $inquiry_status_params): int
{
return self::where($params)->whereIn("inquiry_status", $inquiry_status_params)->count();
}
/**
* 获取某种状态的所有订单
* @param array $params
* @param array $inquiry_status_params
* @param array $fields
* @param int|null $page
* @param int|null $per_page
* @return array
*/
public static function getInquiryStatusWithDoctorPage(array $params, array $inquiry_status_params, array $fields = ["*"], int $page = null, ?int $per_page = 10): array
{
$raw = self::where($params)
->whereIn('inquiry_status', $inquiry_status_params)
->orderBy('complete_time', 'desc')
->paginate($per_page, $fields, "page", $page);
$data = array();
$data['current_page'] = $raw->currentPage();// 当前页码
$data['total'] = $raw->total();//数据总数
$data['data'] = $raw->items();//数据
$data['per_page'] = $raw->perPage();//每页个数
$data['last_page'] = $raw->lastPage();//最后一页
return $data;
}
/**
* 获取某种状态的订单-限制条数
* @param array $params
* @param array $inquiry_status_params
* @param array $fields
* @param int $offset 起始
* @param int $limit 个数
* @return Collection|array
*/
public static function getInquiryStatusLimit(array $params, array $inquiry_status_params, array $fields = ["*"],int $offset = 0,int $limit = 10): Collection|array
{
return self::where($params)
->whereIn('inquiry_status', $inquiry_status_params)
->offset($offset)
->limit($limit)
->get($fields);
}
/**
* 获取问诊结束会话列表-分页
* @param array $params
* @param array $fields
* @param int|null $page
* @param int|null $per_page
* @return array
*/
public static function getInquiryEndPage(array $params, int $page = null, ?int $per_page = 10): array
{
// 参考sql
// SELECT t1.* FROM test t1 INNER JOIN (
// SELECT user_id, MAX(create_at) AS max_create_at FROM test GROUP BY user_id
// ) t2 ON t1.user_id = t2.user_id AND t1.create_at = t2.max_create_at;
$subQuery = self::select(["user_id","family_id",Db::raw('max(reception_time) as at')])
->whereNotIn('user_id', function ($query) use ($params){
$query->select('user_id')
->from('order_inquiry')
->whereIn('inquiry_status', [1,2,3,4])
->where($params)
->groupBy(["user_id"]);
})
->where($params)
->groupBy(["user_id","family_id"]);
$query = self:: joinSub($subQuery, 'sub_query', function($join) {
$join->on('order_inquiry.user_id', '=', 'sub_query.user_id')
->on('order_inquiry.family_id', '=', 'sub_query.family_id')
->on('order_inquiry.reception_time', '=', 'sub_query.at');
})
->whereIn('inquiry_status', [5,6])
->where($params)
->orderBy("sub_query.at",'desc');
$fields = [
'order_inquiry.order_inquiry_id',
'order_inquiry.user_id',
'order_inquiry.patient_id',
'order_inquiry.doctor_id',
'order_inquiry.family_id',
'order_inquiry.inquiry_type',
'order_inquiry.inquiry_mode',
'order_inquiry.inquiry_status',
'order_inquiry.inquiry_no',
'order_inquiry.reception_time',
'order_inquiry.complete_time',
'order_inquiry.finish_time',
'order_inquiry.cancel_time',
'order_inquiry.cancel_reason',
'order_inquiry.cancel_remarks',
'order_inquiry.patient_name',
'order_inquiry.patient_sex',
'order_inquiry.patient_age',
'order_inquiry.created_at',
];
$result = $query->paginate($per_page, $fields, "page", $page);
$data = array();
$data['current_page'] = $result->currentPage();// 当前页码
$data['total'] = $result->total();//数据总数
$data['data'] = $result->items();//数据
$data['per_page'] = $result->perPage();//每页个数
$data['last_page'] = $result->lastPage();//最后一页
return $data;
}
/**
* 获取某种状态的最后一条订单
* @param array $params
* @param array $inquiry_status_params
* @param array $fields
* @return object|null
*/
public static function getInquiryStatusLastOne(array $params, array $inquiry_status_params,array $fields = ["*"]): object|null
{
return self::where($params)
->whereIn("inquiry_status", $inquiry_status_params)
->latest()
->first($fields);
}
/**
* 获取最后一条订单
* @param array $params
* @param array $fields
* @return object|null
*/
public static function getInquiryLastOne(array $params,array $fields = ["*"]): object|null
{
return self::where($params)
->latest()
->first($fields);
}
}