diff --git a/app/Models/WorkOrder/Reply.php b/app/Models/WorkOrder/Reply.php new file mode 100644 index 0000000..c78ce22 --- /dev/null +++ b/app/Models/WorkOrder/Reply.php @@ -0,0 +1,71 @@ +belongsTo(WorkOrder::class); + } + + public function scopeWorkOrderId($query, $work_order_id) + { + return $query->where('work_order_id', $work_order_id); + } + + + // before create + protected static function boot() + { + parent::boot(); + static::creating(function ($model) { + + $model->is_pending = 1; + + + // load work order + $model->load(['workOrder']); + + throw_if($model->workOrder->status == 'pending' || $model->workOrder->status == 'error', CommonException::class, '工单状态不正确'); + + // change work order status + if (auth('sanctum')->check()) { + $model->user_id = auth()->id(); + $model->workOrder->status = 'user_replied'; + } + + if (auth('remote')->check()) { + $model->user_id = null; + $model->workOrder->status = 'replied'; + } + + $model->workOrder->save(); + }); + + static::created(function ($model) { + if (auth('remote')->check()) { + $model->workOrder->status = 'replied'; + $model->workOrder->save(); + } + // dispatch + dispatch(new \App\Jobs\Remote\WorkOrder\Reply($model)); + dispatch(new \App\Jobs\Remote\WorkOrder\WorkOrder($model->workOrder, 'put')); + }); + } +} diff --git a/app/Models/WorkOrder/WorkOrder.php b/app/Models/WorkOrder/WorkOrder.php new file mode 100644 index 0000000..e29a1bb --- /dev/null +++ b/app/Models/WorkOrder/WorkOrder.php @@ -0,0 +1,133 @@ +belongsTo(User::class); + } + + // replies + public function replies() + { + return $this->hasMany(Reply::class); + } + + // host + public function host() + { + return $this->belongsTo(Host::class); + } + + public function module() + { + return $this->belongsTo(Module::class); + } + + // scope + public function scopeThisModule($query) + { + return $query->where('module_id', auth('remote')->id()); + } + + public function scopeUser($query) + { + return $query->where('user_id', auth()->id()); + } + + + // on create + protected static function boot() + { + parent::boot(); + + static::creating(function ($model) { + + if ($model->host_id) { + $model->load(['host']); + $model->module_id = $model->host->module_id; + } + + // if logged + if (auth('sanctum')->check()) { + $model->user_id = auth('sanctum')->id(); + + if ($model->host_id) { + if (!$model->user_id === $model->host->user_id) { + throw new CommonException('user_id not match host user_id'); + } + } + } else { + throw new CommonException('user_id is required'); + } + + + if ($model->host_id) { + $model->host->load('module'); + $module = $model->host->module; + + + if ($module === null) { + $model->status = 'open'; + } else { + $model->status = 'pending'; + } + } + }); + + // 更新时获取差异部分 + static::updating(function ($model) { + // $original = $model->getOriginal(); + // // dd($original); + // $diff = array_diff_assoc($model->attributes, $original); + + // // 如果更新了host_id,则抛出异常 + // if (isset($diff['host_id'])) { + // throw new CommonException('host_id cannot be updated'); + // } + + }); + + // updated + static::updated(function ($model) { + dispatch(new \App\Jobs\Remote\WorkOrder\WorkOrder($model, 'put')); + + // $original = $model->getOriginal(); + // $diff = array_diff_assoc($model->attributes, $original); + // // dd($diff); + // if (isset($diff['status'])) { + // $model->load(['host']); + // $model->host->load('module'); + // $module = $model->host->module; + // if ($module === null) { + // $model->status = 'open'; + // } else { + // $model->status = 'pending'; + // } + // $model->save(); + // } + }); + } +}