329 lines
11 KiB
PHP
329 lines
11 KiB
PHP
<?php
|
|
|
|
namespace app\admin\model\app\coupon;
|
|
|
|
use app\admin\model\app\coupon\Coupon as CouponModel;
|
|
use app\admin\model\User as UserModel;
|
|
use app\admin\model\order\Order as OrderModel;
|
|
use think\Model;
|
|
class CouponUser extends Model
|
|
{
|
|
protected $name = 'app_coupon_user';
|
|
|
|
protected $type = [
|
|
'use_time' => 'timestamp'
|
|
];
|
|
|
|
// 追加属性
|
|
protected $append = [
|
|
'name',
|
|
'type',
|
|
// 'type_text',
|
|
// 'use_scope',
|
|
// 'use_scope_text',
|
|
// 'amount',
|
|
// 'amount_text',
|
|
// 'enough',
|
|
// 'limit_num',
|
|
// 'use_start_time',
|
|
// 'use_end_time',
|
|
// 'max_amount',
|
|
// 'double_discount_status',
|
|
// 'description',
|
|
'status',
|
|
'status_text',
|
|
'get_type',
|
|
'get_type_text'
|
|
];
|
|
|
|
|
|
public function statusList()
|
|
{
|
|
return [
|
|
'used' => '已使用',
|
|
'ban' => '作废',
|
|
'can_use' => '立即使用',
|
|
'expired' => '已过期',
|
|
'cannot_use' => '暂不可用',
|
|
'geted' => '未使用', // 包括 can_use 和 cannot_use
|
|
'get_destroy' => '已作废',
|
|
'get_stop' => '暂停领取'
|
|
];
|
|
}
|
|
|
|
public function getTypeList()
|
|
{
|
|
return [
|
|
'1' => '用户领取',
|
|
'2' => '后台发放'
|
|
];
|
|
}
|
|
|
|
|
|
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', [1,2])
|
|
->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')->where('status',1)->whereExists(function ($query) {
|
|
$table_name = (new CouponModel)->getQuery()->getTable();
|
|
$user_coupon_name = (new self)->getQuery()->getTable();
|
|
|
|
$query->table($table_name)->whereNull('deletetime')->whereIn('status',[1,2,3])
|
|
->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',[3])
|
|
->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', 1)
|
|
->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', 1)
|
|
->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 getGoodsBindIdsAttr($value, $data)
|
|
{
|
|
return $this->coupon ? $this->coupon->goods_bind_ids : '';
|
|
}
|
|
|
|
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->double_discount_status : 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 getGoodsValueAttr($value, $data)
|
|
{
|
|
return $this->coupon ? $this->coupon->goods_value : 0;
|
|
}
|
|
|
|
public function getTypeTextAttr($value, $data)
|
|
{
|
|
return $this->coupon ? $this->coupon->type_text : 0;
|
|
}
|
|
|
|
|
|
// 我的优惠券使用状态
|
|
public function getStatusAttr($value, $data)
|
|
{
|
|
|
|
if($data['status'] == 2){
|
|
$status = 'ban';
|
|
}elseif ($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 ?? '');
|
|
|
|
$list = $this->statusList();
|
|
return isset($list[$value]) ? $list[$value] : '';
|
|
}
|
|
|
|
public function getGetTypeTextAttr($value, $data)
|
|
{
|
|
$value = $value ?: ($this->get_type ?? '');
|
|
|
|
$list = $this->getTypeList();
|
|
return isset($list[$value]) ? $list[$value] : '';
|
|
}
|
|
|
|
|
|
public function coupon()
|
|
{
|
|
return $this->belongsTo(CouponModel::class, 'coupon_id');
|
|
}
|
|
|
|
public function user()
|
|
{
|
|
// return $this->belongsTo(UserModel::class, 'user_id')->setEagerlyType(0);
|
|
return $this->belongsTo('app\admin\model\User', 'user_id', 'id', [], 'LEFT')->setEagerlyType(0);
|
|
}
|
|
|
|
public function order()
|
|
{
|
|
return $this->belongsTo(OrderModel::class, 'use_order_id');
|
|
}
|
|
}
|