self::STATUS_WAIT, 'on_the_way' => self::STATUS_ONTHEWAY, 'distribute' => self::STATUS_DISTRIBUTE, 'check' => self::STATUS_CHECK, 'refund' => self::STATUS_REFUND, 'refuse' => self::STATUS_REFUSE, 'questions'=> self::STATUS_QUESTION, ]; protected $attributes = [ 'status' => self::STATUS_WAIT, 'is_failed'=> false, ]; protected $casts = [ 'is_failed' => 'bool', ]; protected $fillable = [ 'remarks', 'status', 'is_failed', 'checked_at', ]; /** * 订单 */ public function order() { return $this->belongsTo(Order::class, 'order_id'); } /** * 货运单商品 * */ public function packageProducts() { return $this->hasMany(OrderPackageProduct::class, 'order_package_id'); } public function orderProducts() { return $this->belongsToMany(OrderProduct::class, 'order_package_products', 'order_package_id', 'order_product_id'); } /** * 更新包裹物流状态 */ public function updatePackageStatus(int $status, ?Carbon $time = null) { //如果是签收或者自动签收,填入签收时间; 并填入包裹商品里面的售后有效期; $this->status = $status; if ($status == self::STATUS_CHECK || $status == self::STATUS_AUTOCHECK) { $this->checked_at = $time ?? now(); $this->orderProducts()->update([ 'after_expire_at'=>$this->checked_at->addDays(7), ]); //看这个包裹的订单下是否还有未签收的包裹,没有,则把订单status改为已完成, 并完成订单 if ($this->order->packages()->where('is_failed', false)->whereNotIn('status', [self::STATUS_CHECK, self::STATUS_AUTOCHECK])->doesntExist()) { $this->order()->update([ 'status' => Order::STATUS_COMPLETED, 'completed_at' => now(), ]); } } $this->save(); } }