From 6cfd928845fe03bb67af8a7f805ae306a0f86aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9D=99?= Date: Mon, 13 Dec 2021 20:11:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E6=83=A0=E5=88=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Endpoint/Api/Filters/UserCouponFilter.php | 25 +++++++ .../Controllers/Account/CouponController.php | 29 ++++++++ .../Api/Http/Controllers/CouponController.php | 29 ++++++++ .../Api/Http/Resources/CouponResource.php | 27 ++++++++ app/Endpoint/Api/routes.php | 4 ++ app/Models/Coupon.php | 3 + app/Models/User.php | 10 +++ app/Models/UserCoupon.php | 68 +++++++++++++++++++ 8 files changed, 195 insertions(+) create mode 100644 app/Endpoint/Api/Filters/UserCouponFilter.php create mode 100644 app/Endpoint/Api/Http/Controllers/Account/CouponController.php create mode 100644 app/Endpoint/Api/Http/Controllers/CouponController.php create mode 100644 app/Endpoint/Api/Http/Resources/CouponResource.php diff --git a/app/Endpoint/Api/Filters/UserCouponFilter.php b/app/Endpoint/Api/Filters/UserCouponFilter.php new file mode 100644 index 00000000..6fc71d59 --- /dev/null +++ b/app/Endpoint/Api/Filters/UserCouponFilter.php @@ -0,0 +1,25 @@ +isUnuse(); + break; + + case 'used': + $this->isUsed(); + break; + + case 'expired': + $this->isExpired(); + break; + } + } +} diff --git a/app/Endpoint/Api/Http/Controllers/Account/CouponController.php b/app/Endpoint/Api/Http/Controllers/Account/CouponController.php new file mode 100644 index 00000000..0990bece --- /dev/null +++ b/app/Endpoint/Api/Http/Controllers/Account/CouponController.php @@ -0,0 +1,29 @@ +user(); + + $coupons = $user->coupons() + ->filter(array_merge([ + 'status' => 'unuse', + ], $request->all())) + ->simplePaginate(PaginatorHelper::resolvePerPage('per_page', 20, 50)); + + return CouponResource::make($coupons); + } +} diff --git a/app/Endpoint/Api/Http/Controllers/CouponController.php b/app/Endpoint/Api/Http/Controllers/CouponController.php new file mode 100644 index 00000000..006c0036 --- /dev/null +++ b/app/Endpoint/Api/Http/Controllers/CouponController.php @@ -0,0 +1,29 @@ +user(); + + $coupons = $user->coupons() + ->filter(array_merge([ + 'status' => 'unuse', + ], $request->all())) + ->simplePaginate(PaginatorHelper::resolvePerPage('per_page', 20, 50)); + + return CouponResource::collection($coupons); + } +} diff --git a/app/Endpoint/Api/Http/Resources/CouponResource.php b/app/Endpoint/Api/Http/Resources/CouponResource.php new file mode 100644 index 00000000..8ea52be6 --- /dev/null +++ b/app/Endpoint/Api/Http/Resources/CouponResource.php @@ -0,0 +1,27 @@ + $this->id, + 'name' => $this->coupon_name, + 'type' => $this->coupon_type, + 'amount' => $this->coupon_amount_format, + 'threshold' => $this->coupon_threshold_format, + 'use_start_at' => $this->use_start_at, + 'use_end_at' => $this->use_end_at, + ]; + } +} diff --git a/app/Endpoint/Api/routes.php b/app/Endpoint/Api/routes.php index 5dc016fc..7caf32fc 100644 --- a/app/Endpoint/Api/routes.php +++ b/app/Endpoint/Api/routes.php @@ -9,6 +9,7 @@ use App\Endpoint\Api\Http\Controllers\Auth\LogoutController; use App\Endpoint\Api\Http\Controllers\Auth\RegisterController; use App\Endpoint\Api\Http\Controllers\Auth\ResetPasswordController; use App\Endpoint\Api\Http\Controllers\CaptchaController; +use App\Endpoint\Api\Http\Controllers\CouponController; use App\Endpoint\Api\Http\Controllers\MessageController; use App\Endpoint\Api\Http\Controllers\Product\HotController; use App\Endpoint\Api\Http\Controllers\Product\ProductCategoryController; @@ -87,5 +88,8 @@ Route::group([ Route::get('messages/wait-read-num', [MessageController::class, 'waitReadNum']); Route::post('messages/read/{message}', [MessageController::class, 'read']); Route::post('messages/batch-read', [MessageController::class, 'batchRead']); + + // 我的优惠券 + Route::get('coupons', [CouponController::class, 'index']); }); }); diff --git a/app/Models/Coupon.php b/app/Models/Coupon.php index b11d9858..e8ff7867 100644 --- a/app/Models/Coupon.php +++ b/app/Models/Coupon.php @@ -12,6 +12,9 @@ class Coupon extends Model use HasFactory; use HasDateTimeFormatter; + public const TYPE_VALUE = 1; // 抵扣券 + public const TYPE_DISCOUNT = 2; // 折扣券 + protected $casts = [ 'amount' => Price::class, 'threshold'=>Price::class, diff --git a/app/Models/User.php b/app/Models/User.php index 4fdd6348..9b3b7f1b 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -128,6 +128,16 @@ class User extends Model implements AuthorizableContract, AuthenticatableContrac return $this->hasMany(AfterSale::class); } + /** + * 属于此用户的优惠券 + * + * @return void + */ + public function coupons() + { + return $this->hasMany(UserCoupon::class); + } + /** * 禁用用户 * diff --git a/app/Models/UserCoupon.php b/app/Models/UserCoupon.php index 84ac0b9d..5e61dea9 100644 --- a/app/Models/UserCoupon.php +++ b/app/Models/UserCoupon.php @@ -2,12 +2,15 @@ namespace App\Models; +use App\Helpers\Numeric as NumericHelper; +use EloquentFilter\Filterable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class UserCoupon extends Model { use HasFactory; + use Filterable; protected $fillable = [ 'user_id', @@ -23,6 +26,32 @@ class UserCoupon extends Model 'updated_at', ]; + /** + * 仅查询已过期的优惠券 + */ + public function scopeIsExpired($query) + { + return $query->where('status', 0)->where('use_end_at', '<=', now()); + } + + /** + * 仅查询已使用的优惠券 + */ + public function scopeIsUsed($query) + { + return $query->where('status', 1); + } + + /** + * 仅查询未使用的优惠券 + */ + public function scopeIsUnuse($query) + { + $time = now(); + + return $query->where('status', 0)->where('use_start_at', '<', $time)->where('use_end_at', '>', $time); + } + /** * 优惠券可用范围规则 * @@ -32,4 +61,43 @@ class UserCoupon extends Model { return $this->hasMany(CouponRange::class, 'coupon_id', 'coupon_id'); } + + /** + * 确认此优惠券是否是折扣券 + * + * @return bool + */ + public function isDiscountCoupon(): bool + { + return $this->coupon_type === Coupon::TYPE_DISCOUNT; + } + + /** + * 获取此优惠券的面值 + * + * @return string + */ + public function getCouponAmountFormatAttribute(): string + { + $value = $this->attributes['coupon_amount']; + + // 如果是折扣券 + if ($this->isDiscountCoupon()) { + return NumericHelper::trimZero(bcdiv($value, 10, 1)); + } + + return NumericHelper::trimZero(bcdiv($value, 100, 2)); + } + + /** + * 获取此优惠券的面值 + * + * @return string + */ + public function getCouponThresholdFormatAttribute(): string + { + return NumericHelper::trimZero( + bcdiv($this->attributes['coupon_threshold'], 100, 2) + ); + } }