125 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
| <?php
 | |
| 
 | |
| namespace app\model;
 | |
| 
 | |
| use app\exception\RepositoryException;
 | |
| use think\db\exception\DataNotFoundException;
 | |
| use think\db\exception\DbException;
 | |
| use think\db\exception\ModelNotFoundException;
 | |
| use think\model\relation\HasOne;
 | |
| 
 | |
| class AccountCoupon extends Base
 | |
| {
 | |
|     public const STATUS_NORMAL  = 'normal';//正常
 | |
|     public const STATUS_USED    = 'used';//已使用
 | |
|     public const STATUS_INVALID = 'invalid';//已失效
 | |
| 
 | |
|     public const CODE_SALT        = 'R5S6Y1';//优惠券加密密码盐
 | |
| 
 | |
|     /**
 | |
|      * 状态列表
 | |
|      *
 | |
|      * @return string[]
 | |
|      */
 | |
|     public static function statusList(): array
 | |
|     {
 | |
|         return [self::STATUS_NORMAL, self::STATUS_USED, self::STATUS_INVALID];
 | |
|     }
 | |
| 
 | |
|     public function coupon(): HasOne
 | |
|     {
 | |
|         return $this->hasOne(Coupon::class, 'id', 'coupon_id')->bind(
 | |
|             [
 | |
|                 'amount',
 | |
|                 'name',
 | |
|                 'cover',
 | |
|                 'type',
 | |
|                 'condition',
 | |
|                 'begin_at',
 | |
|                 'end_at',
 | |
|             ]
 | |
|         );
 | |
|     }
 | |
|     public function account(): HasOne
 | |
|     {
 | |
|         return $this->hasOne(Account::class, 'id', 'account_id')->bind(
 | |
|             [
 | |
|                 'nickname',
 | |
|                 'mobile',
 | |
|             ]
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 优惠券使用
 | |
|      *
 | |
|      * @param  int  $accountId
 | |
|      * @param  int  $id
 | |
|      * @param  string  $orderCoding
 | |
|      * @param  string  $checkBy
 | |
|      * @return bool
 | |
|      * @throws DataNotFoundException
 | |
|      * @throws DbException
 | |
|      * @throws ModelNotFoundException
 | |
|      * @throws RepositoryException
 | |
|      */
 | |
|     public static function use(int $accountId, int $id, string $orderCoding = '',$checkBy =""): bool
 | |
|     {
 | |
|         $where = ['coupon_id' => $id, 'account_id' => $accountId, 'status' => AccountCoupon::STATUS_NORMAL];
 | |
|         if (!$accountCoupon = self::findOne($where)) {
 | |
|             throw new RepositoryException('您的优惠券不存在');
 | |
|         }
 | |
| 
 | |
|         if (!empty($accountCoupon['deleted_at'])) {
 | |
|             throw new RepositoryException('您的优惠券不存在-2');
 | |
|         }
 | |
| 
 | |
|         if (!$coupon = Coupon::findById($id)) {
 | |
|             throw new RepositoryException('此优惠券不存在或已下架');
 | |
|         }
 | |
| 
 | |
|         if (!empty($coupon['deleted_at'])) {
 | |
|             throw new RepositoryException('此优惠券已下架');
 | |
|         }
 | |
| 
 | |
|         $now = date('Y-m-d H:i:s');
 | |
|         if ($now < $coupon['begin_at'] || $now > $coupon['end_at']) {
 | |
|             throw new RepositoryException('此优惠券不在有效期');
 | |
|         }
 | |
| 
 | |
|         if($accountCoupon["status"] != AccountCoupon::STATUS_NORMAL){
 | |
|             throw new RepositoryException('优惠券已使用或已失效');
 | |
|         }
 | |
| 
 | |
|         return $accountCoupon->save([
 | |
|             'used_at'      => $now,
 | |
|             'status'       => self::STATUS_USED,
 | |
|             'order_coding' => $orderCoding,
 | |
|             'check_by' => $checkBy,
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 获取首页优惠券
 | |
|      * 没有或已领取则返回null
 | |
|      *
 | |
|      * @param  int  $accountId
 | |
|      * @return Coupon|array|\think\Model|null
 | |
|      * @throws DataNotFoundException
 | |
|      * @throws DbException
 | |
|      * @throws ModelNotFoundException
 | |
|      */
 | |
|     public static function homeCoupon(int $accountId)
 | |
|     {
 | |
|         if (!$coupon = Coupon::homeCoupon()) {
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         if (self::where('account_id', $accountId)->where('coupon_id', $coupon['id'])->count() > 0) {
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         return $coupon;
 | |
|     }
 | |
| }
 |