ufutx.dma/app/Models/Order.php
2026-03-04 14:42:40 +08:00

245 lines
6.6 KiB
PHP

<?php
namespace App\Models;
use App\Console\Commands\DmaQuestionNotice;
use BeyondCode\Comments\Traits\HasComments;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Support\Facades\DB;
use Log;
class Order extends BaseModel
{
use HasComments;
const ORDER_PRICE = 20000;
//支付状态
const UNPAID_STATUS = "UNPAID"; //未支付
const PAID_STATUS = "PAID"; //已支付
//服务状态
const NOTSTART_STATUS = 'NOTSTART'; //未开始
const STARTING_STATUS = "STARTING"; //进行中
const FINISHED_STATUS = "FINISHED"; //已完成
const SUSPEND_STATUS = "SUSPEND"; //暂停中
const DELIVER_ONLINE = 1;
const DELIVER_OFFLINE = 2;
public function user()
{
return $this->belongsTo(User::class, 'user_id', 'id');
}
public function payment()
{
return $this->hasOne(Payment::class, "id", "payment_id");
}
public function userInfo()
{
return $this->belongsTo(UserInfo::class, 'user_id', 'user_id');
}
public function serviceRoleOrders()
{
return $this->hasMany(ServiceRoleOrder::class, 'order_id', 'id');
}
public function reappraises()
{
return $this->hasMany(Reappraise::class, 'order_id', 'id');
}
public function guides()
{
return $this->hasOne(Guide::class, 'order_id', 'id');
}
public function service()
{
return $this->hasOne(Service::class, 'id', 'type_id');
}
public function group()
{
return $this->hasOne(Group::class, 'order_id', 'id');
}
public function offline_order()
{
return $this->hasOne(OfflineOrder::class);
}
public function orderSurveys()
{
return $this->hasMany(OrderSurvey::class);
}
public function commission()
{
return $this->hasMany(OrderCommission::class);
}
public function agency()
{
return $this->belongsTo(Partner::class,'agency_id','id');
}
public function service_role(){
return $this->hasMany(ServiceRoleOrder::class,'order_id','id');
}
public function scheme()
{
return $this->hasOne(GuideScheme::class, 'order_id', 'id');
}
public function orderUserInfo()
{
return $this->hasOne(OrderUserInfo::class, 'order_id', 'id');
}
public function asginSigner()
{
return $this->hasOne(AsignSigner::class, 'order_id', 'id')->whereIn('status', [0,1,2]);
}
public function asginContract()
{
return $this->hasOne(AsignContract::class, 'order_id', 'id')->whereIn('status', [0,1,2]);
}
public function agreement()
{
return $this->hasOne(Agreement::class, 'order_id', 'id');
}
public function orderMedicalReports()
{
return $this->hasMany(OrderMedicalReport::class,'order_id', 'id');
}
public function afterDmaQuestion()
{
return $this->hasOne(DmaQuestion::class, "order_id", "id")->where("type", 1);
}
public function afterMedicalReport()
{
return $this->hasOne(MedicalReport::class, "user_id", "user_id")->where("type", 1);
}
public function scopeScheme($query)
{
$scheme = request()->scheme;
if (is_numeric($scheme)) {
if ($scheme) {
return $query->whereIn('service_status', ['SCHEME','DELIVER','FINISHED']);
}else {
return $query->where('service_status', 'NOSCHEME');
}
}
return $query;
}
/**
* 已支付订单
* @param $query
* @return mixed
*/
public function scopePaid($query)
{
return $query->where('pay_status', 'PAID');
}
/**
* 没有绑定企业微信订单
* @param $query
* @return mixed
*/
public function scopeNoWorkChatGroup($query)
{
return $query->whereHas('group', function ($sql){
$sql->whereNull('chat_id');
});
}
/**
* 订单关键词搜索
* @param $query
* @return mixed
*/
public function scopeKeyword($query)
{
$keyword = trim(request()->keyword);
if (!$keyword) return $query;
return $query->where('name', 'like', '%'.$keyword.'%')->orWhere('mobile', 'like', '%'.$keyword.'%');
}
public function scopeServiceOrder($query)
{
return $query->where('type', 'SERVICE');
}
public static function getHaveOrder($user_id,$mobile){
$have_order = self::where('mobile',$mobile)->where('user_id',0)->orderByDesc('id')->first();
if($have_order){
$have_order->user_id = $user_id;
$have_order->save();
}
}
//推荐人
public function recommendUser()
{
return $this->hasOneThrough(User::class, RecommendUser::class, 'user_id', 'id', 'user_id', 'recommend_user_id')->selectRaw("ufutx_users.id, ufutx_users.name, ufutx_users.mobile");
}
public function updateServerStatus($user,$service_status,$delivery_img=""){
DB::beginTransaction();
$order = Order::getPayOrder($user->id);
$order->service_status = $service_status;
if(!empty($delivery_img)){
$order->delivery_img = $delivery_img;
}
$order->save();
MarkOrderLog::create(['order_id'=>$order->id,'operate_id'=>$user->id,'operate_name'=>$user->name,'remark'=>"用户确认收货,修改server_status:".$service_status]);
DB::commit();
return true;
}
/**
* 获取用户已支付订单
* @param $user_id
* @return mixed
*/
public static function getPayOrder($user_id){
$order = Order::whereHas("group")->where('user_id',$user_id)->where('pay_status','PAID')->orderByDesc('id')->first();
return $order;
}
/**
* 订单可操作权限
* @param mixed $role_ids // 有权限的角色id
* @return void
*/
public function orderAuthStatus($user_id, $role_ids): bool
{
// 查询当前用户在订单中的角色
$has_role_ids = $this->serviceRoleOrders()->where("user_id", $user_id)->pluck("role_id")->toArray();
// 订单外行政角色
$admin_role_id = DmaServiceUserRole::where("user_id", $user_id)->where("role", ServiceRole::ADMINISTRATIVE)->value("role");
if ($admin_role_id) {
$has_role_ids[] = $admin_role_id;
}
Log::info("当前用户id: ".$user_id);
Log::info("当前用户角色:". json_encode($has_role_ids));
Log::info("有权限角色: ".json_encode($role_ids));
// 比较角色时候在有权限角色内
$res = array_intersect($role_ids, $has_role_ids);
return count($res)?true:false;
}
}