hasMany(OrderDetail::class); } public function address() { return $this->belongsTo(Address::class); } public function user() { return $this->belongsTo(User::class); } public function isNotUser($id) { return $this->user_id != $id; } public static function boot() { parent::boot(); // 自动生成订单的订单号 static::creating(function ($model) { if (is_null($model->no)) { $model->no = static::findAvailableNo($model->user_id); } }); static::created(function ($model) { // 订单成交量 Cache::increment(SiteCountCacheEnum::ORDER_COUNT); }); static::saved(function ($model) { // 支付 if ($model->status == OrderStatusEnum::PAID) { // 订单成交量 Cache::increment(SiteCountCacheEnum::PAY_ORDER_COUNT); $currMoney = Cache::get(SiteCountCacheEnum::SALE_ORDER_COUNT, 0); if (function_exists('bcadd')) { $money = bcadd($currMoney, $model->pay_amount); } else { $money = $currMoney + $model->pay_amount; } Cache::set(SiteCountCacheEnum::SALE_ORDER_COUNT, $money); } // 退款 elseif ($model->status == OrderStatusEnum::REFUND) { $currMoney = Cache::get(SiteCountCacheEnum::SALE_ORDER_COUNT, 0); if (function_exists('bcsub')) { $money = bcsub($currMoney, $model->pay_refund_fee); } else { $money = $currMoney - $model->pay_refund_fee; } Cache::increment(SiteCountCacheEnum::REFUND_ORDER_COUNT); Cache::set(SiteCountCacheEnum::SALE_ORDER_COUNT, $money); } }); } /** * @param string $userId * @param int $try * @return string * @throws \Exception */ public static function findAvailableNo($userId = '000000000', $try = 5) { $prefix = date('YmdHis'); $suffix = fixStrLength($userId, 9); for ($i = 0; $i < $try; ++ $i) { $no = $prefix . fixStrLength(random_int(0, 9999), 5) . $suffix; if (self::query()->where('no', $no)->doesntExist()) { return $no; } } throw new \Exception('流水号生成失败'); } }