123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- <?php
- namespace app\admin\model\shopro\user;
- use app\admin\model\shopro\Common;
- use app\admin\model\shopro\Coupon as CouponModel;
- use app\admin\model\shopro\user\User as UserModel;
- use app\admin\model\shopro\order\Order as OrderModel;
- class Coupon extends Common
- {
- protected $name = 'shopro_user_coupon';
- protected $type = [
- 'use_time' => 'timestamp'
- ];
- // 追加属性
- protected $append = [
- 'name',
- 'type',
- 'type_text',
- 'use_scope',
- 'use_scope_text',
- 'items',
- 'amount',
- 'amount_text',
- 'enough',
- 'limit_num',
- 'use_start_time',
- 'use_end_time',
- 'max_amount',
- 'is_double_discount',
- 'description',
- 'status',
- 'status_text',
- ];
- public function statusList()
- {
- return [
- 'used' => '已使用',
- 'can_use' => '立即使用',
- 'expired' => '已过期',
- 'cannot_use' => '暂不可用',
- 'geted' => '未使用' // 包括 can_use 和 cannot_use
- ];
- }
- public function scopeGeted($query)
- {
- return $query->whereNull('use_time')->whereExists(function ($query) {
- $table_name = (new CouponModel)->getQuery()->getTable();
- $user_coupon_name = (new self)->getQuery()->getTable();
- $query->table($table_name)->whereNull('deletetime')->whereIn('status', ['normal', 'hidden'])
- ->where($user_coupon_name . '.coupon_id=' . $table_name . '.id')
- ->where(function ($query) use ($user_coupon_name) {
- $query->where(function ($query) {
- $query->where('use_time_type', 'range')->where('use_end_time', '>=', time()); // 可用结束时间,大于当前时间,已经可用,或者暂不可用都算
- })->whereOr(function ($query) use ($user_coupon_name) {
- $query->where('use_time_type', 'days')
- ->whereRaw($user_coupon_name . '.createtime + ((start_days + days) * 86400) >= ' . time()); // 可用结束结束时间大于当前时间
- });
- });
- });
- }
- // 可以使用
- public function scopeCanUse($query)
- {
- return $query->whereNull('use_time')->whereExists(function ($query) {
- $table_name = (new CouponModel)->getQuery()->getTable();
- $user_coupon_name = (new self)->getQuery()->getTable();
- $query->table($table_name)->whereNull('deletetime')->whereIn('status', ['normal', 'hidden'])
- ->where($user_coupon_name . '.coupon_id=' . $table_name . '.id')
- ->where(function ($query) use ($user_coupon_name) {
- $query->where(function ($query) {
- $query->where('use_time_type', 'range')->where('use_start_time', '<=', time())->where('use_end_time', '>=', time());
- })->whereOr(function ($query) use ($user_coupon_name) {
- $query->where('use_time_type', 'days')
- ->whereRaw($user_coupon_name . '.createtime + (start_days * 86400) <= ' . time())
- ->whereRaw($user_coupon_name . '.createtime + ((start_days + days) * 86400) >= ' . time());
- });
- });
- });
- }
- // 暂不可用,还没到可使用日期
- public function scopeCannotUse($query)
- {
- return $query->whereNull('use_time')->whereExists(function ($query) {
- $table_name = (new CouponModel)->getQuery()->getTable();
- $user_coupon_name = (new self)->getQuery()->getTable();
- $query->table($table_name)->whereNull('deletetime')->whereIn('status', ['normal', 'hidden'])
- ->where($user_coupon_name . '.coupon_id=' . $table_name . '.id')
- ->where(function ($query) use ($user_coupon_name) {
- $query->where(function ($query) {
- $query->where('use_time_type', 'range')->where('use_start_time', '>', time());
- })->whereOr(function ($query) use ($user_coupon_name) {
- $query->where('use_time_type', 'days')
- ->whereRaw($user_coupon_name . '.createtime + (start_days * 86400) > ' . time());
- });
- });
- });
- }
- // 已使用
- public function scopeUsed($query)
- {
- return $query->whereNotNull('use_time');
- }
- // 未使用,但已过期
- public function scopeExpired($query)
- {
- return $query->whereNull('use_time')->whereExists(function ($query) {
- $table_name = (new CouponModel)->getQuery()->getTable();
- $user_coupon_name = (new self)->getQuery()->getTable();
- $query->table($table_name)->whereNull('deletetime')->whereIn('status', ['normal', 'hidden'])
- ->where($user_coupon_name . '.coupon_id=' . $table_name . '.id')
- ->where(function ($query) use ($user_coupon_name) {
- $query->where(function ($query) {
- $query->where('use_time_type', 'range')->where('use_end_time', '<', time());
- })->whereOr(function ($query) use ($user_coupon_name) {
- $query->where('use_time_type', 'days')
- ->whereRaw($user_coupon_name . '.createtime + ((start_days + days) * 86400) < ' . time());
- });
- });
- });
- }
- // 未使用,但已过期,或者已使用
- public function scopeInvalid($query)
- {
- return $query->where(function ($query) {
- $query->whereNotNull('use_time')->whereOr(function ($query) {
- $query->whereNull('use_time')->whereExists(function ($query) {
- $table_name = (new CouponModel)->getQuery()->getTable();
- $user_coupon_name = (new self)->getQuery()->getTable();
- $query->table($table_name)->whereNull('deletetime')->whereIn('status', ['normal', 'hidden'])
- ->where($user_coupon_name . '.coupon_id=' . $table_name . '.id')
- ->where(function ($query) use ($user_coupon_name) {
- $query->where(function ($query) {
- $query->where('use_time_type', 'range')->where('use_end_time', '<', time());
- })->whereOr(function ($query) use ($user_coupon_name) {
- $query->where('use_time_type', 'days')
- ->whereRaw($user_coupon_name . '.createtime + ((start_days + days) * 86400) < ' . time());
- });
- });
- });
- });
- });
- }
- public function getNameAttr($value, $data)
- {
- return $this->coupon ? $this->coupon->name : '';
- }
- public function getTypeAttr($value, $data)
- {
- return $this->coupon ? $this->coupon->type : '';
- }
- public function getUseScopeAttr($value, $data)
- {
- return $this->coupon ? $this->coupon->use_scope : '';
- }
- public function getItemsAttr($value, $data)
- {
- return $this->coupon ? $this->coupon->items : '';
- }
- public function getAmountAttr($value, $data)
- {
- return $this->coupon ? $this->coupon->amount : '';
- }
- public function getEnoughAttr($value, $data)
- {
- return $this->coupon ? $this->coupon->enough : '';
- }
- public function getLimitNumAttr($value, $data)
- {
- return $this->coupon ? $this->coupon->limit_num : '';
- }
- public function getUseStartTimeAttr($value, $data)
- {
- if ($this->coupon) {
- if ($this->coupon->use_time_type == 'days') {
- return date('Y-m-d H:i:s', $data['createtime'] + ($this->coupon->start_days * 86400));
- }
- return $this->coupon->use_start_time;
- }
- }
- public function getUseEndTimeAttr($value, $data)
- {
- if ($this->coupon) {
- if ($this->coupon->use_time_type == 'days') {
- return date('Y-m-d H:i:s', $data['createtime'] + (($this->coupon->start_days + $this->coupon->days) * 86400));
- }
- return $this->coupon->use_end_time;
- }
- }
- public function getMaxAmountAttr($value, $data)
- {
- return $this->coupon ? $this->coupon->max_amount : 0;
- }
- public function getIsDoubleDiscountAttr($value, $data)
- {
- return $this->coupon ? $this->coupon->is_double_discount : 0;
- }
- public function getDescriptionAttr($value, $data)
- {
- return $this->coupon ? $this->coupon->description : '';
- }
- public function getUseScopeTextAttr($value, $data)
- {
- return $this->coupon ? $this->coupon->use_scope : 0;
- }
- public function getAmountTextAttr($value, $data)
- {
- return $this->coupon ? $this->coupon->amount_text : 0;
- }
- public function getItemsValueAttr($value, $data)
- {
- return $this->coupon ? $this->coupon->items_value : 0;
- }
- public function getTypeTextAttr($value, $data)
- {
- return $this->coupon ? $this->coupon->type_text : 0;
- }
- // 我的优惠券使用状态
- public function getStatusAttr($value, $data)
- {
- if ($data['use_time']) {
- $status = 'used';
- } else {
- if ($this->use_start_time <= date('Y-m-d H:i:s') && $this->use_end_time >= date('Y-m-d H:i:s')) {
- $status = 'can_use';
- } else if ($this->use_end_time <= date('Y-m-d H:i:s')) {
- $status = 'expired';
- } else {
- // 未到使用日期
- $status = 'cannot_use';
- }
- }
- return $status;
- }
- public function getStatusTextAttr($value, $data)
- {
- $value = $value ?: ($this->status ?? '');
- if (strpos(request()->url(), 'addons/shopro') === false) {
- $value = in_array($value, ['can_use', 'cannot_use']) ? 'geted' : $value; // 后台,可以使用和咱不可用 合并
- }
- $list = $this->statusList();
- return isset($list[$value]) ? $list[$value] : '';
- }
- public function coupon()
- {
- return $this->belongsTo(CouponModel::class, 'coupon_id');
- }
- public function user()
- {
- return $this->belongsTo(User::class, 'user_id');
- }
- public function order()
- {
- return $this->belongsTo(OrderModel::class, 'use_order_id');
- }
- }
|