Просмотр исходного кода

优惠券增加编码,剩余数量字段,商品优惠券列表接口处理

林海涛 1 год назад
Родитель
Сommit
9703257612

+ 53 - 28
app/api/logic/UserCouponLogic.php

@@ -19,28 +19,41 @@ class UserCouponLogic extends BaseLogic
         Db::startTrans();
         try{
             $errMsgArr = [];
-            $rules = CouponRules::whereIn('id',$params['coupon_ids'])->lock(true)->select();
+            $rules = CouponRules::whereIn('code',$params['codes'])->where('voucher_status',1)->lock(true)->select();
             $userCoupon = UserCoupon::where('user_id',$params['user_id'])
-                ->whereIn('coupon_id',$params['coupon_ids'])
+                ->whereIn('code',$params['codes'])
                 ->where('voucher_count','>',0)
                 ->select();
             $updateData = [];
             $createData = [];
             foreach($rules as $v) {
-                if ($v->expire_time < time()) {
-                    $errMsgArr[]  = $v->event_name .'已过期';
-                    continue;
-                }
                 if($v->voucher_status == 2){
                     $errMsgArr[] = $v->event_name .'已设置为过期';
                     continue;
                 }
+                if($v->remaining_count <= 0 ){
+                    $errMsgArr[] = $v->event_name .'数量不足';
+                }
                 if($userCoupon->where('coupon_id',$v->id)->count()){
                     $errMsgArr[] = $v->event_name . '已领取';
                     continue;
                 }
-                $updateData[$v->id] = ['voucher_count' => --$v->voucher_count];
-                $createData[] = ['user_id'=>$params['user_id'],'coupon_id' => $v->id,'voucher_count' =>1];
+                $updateData[$v->id] = ['remaining_count' => --$v->remaining_count];
+                $createData[] = [
+                    'user_id'=>$params['user_id'],
+                    'code' => $v->code,
+                    'voucher_status' => 0,
+                    'voucher_count' =>1,
+                    'amount' => $v->mold_type != 1 ? $v->amount:null,
+                    'amount_require' => $v->amount_require,
+                    'begin_use' => time(),
+                    'discount_ratio' =>  $v->mold_type == 1 ? $v->discount_ratio:null,
+                    'event_name' => $v->event_name,
+                    'expire_time' => time()+$v->expire_time,
+                    'max_deductible_price' => $v->mold_type == 1 ? $v->max_deductible_price:null,
+                    'mold_type' => $v->mold_type,
+                    'server_category_name' => $v->server_category_name
+                ];
             }
             CouponRules::updateWhenCase($updateData);
             if(!empty($createData)){
@@ -69,36 +82,39 @@ class UserCouponLogic extends BaseLogic
                 $where[] = ['voucher_status','IN',$params['voucher_status']];
             }
             $where[] = ['user_id','=',$params['user_id']];
-
             $data = UserCoupon::with(['couponRules'=>function(Query $query){
-                $query->withoutField(['voucher_status','voucher_count']);
+                $query->field(['id','code']);
                 $query->with(['couponWithCategory'=>function(Query $query){
                     $query->field('id,name');
                 }]);
             }])
                 ->where($where)
-                ->field(['id', 'user_id', 'coupon_id', 'voucher_status','voucher_count'])
+                ->where(function(Query $query){
+                    $query->where(' expire_time >'. (time()-86400*7));
+                })
+                ->field(['id', 'user_id', 'code','begin_use','expire_time', 'voucher_status','voucher_count'])
+                ->append(['voucher_status_text'])
                 ->order(['id' => 'desc'])
                 ->select()
                 ->toArray();
-            $couponIds = [];
+            $couponCodes = [];
             foreach($data as $k => $v){
                 if($v['couponRules']){
-                    if($v['voucher_status'] !=2 &&($v['couponRules']['begin_use'] <time() || $data['couponRules']['expire_time'] > time())){
-                        $couponIds[] = $v['coupon_id'];
-                        $v['voucher_status'] = 2;
-                    }
-                    $v['couponRules']['begin_use'] = date("Y-m-d H:i:s",$v['couponRules']['begin_use'] );
-                    $v['couponRules']['expire_time'] = date("Y-m-d H:i:s",$v['couponRules']['expire_time'] );
                     $v['couponRules']['goods_category_ids'] = array_column($v['couponRules']['couponWithCategory'],'id');
                     $data[$k] = $v;
                 }
+                if($v['expire_time'] < time()){
+                    $couponCodes[] = $v['code'];
+                    $data[$k]['voucher_status_text'] = '已过期';
+                }
+                $data[$k]['begin_use'] = date("Y-m-d H:i:s",$v['begin_use'] );
+                $data[$k]['expire_time'] = date("Y-m-d H:i:s",$v['expire_time'] );
             }
-            if(!empty($couponIds)){
-                UserCoupon::whereIn('coupon_id',$couponIds)->update(['voucher_status'=>2]);
+            if(!empty($couponCodes)){
+                UserCoupon::whereIn('code',$couponCodes)->update(['voucher_status'=>2]);
             }
             return $data;
-        }catch(\Exception $e){
+        } catch (\Exception $e){
             Db::rollback();
             self::setError($e->getMessage());
             return false;
@@ -113,15 +129,24 @@ class UserCouponLogic extends BaseLogic
     public static function categoryCouponList($params)
     {
         try{
-            $data =  CouponRules::with(['couponWithCategory'=>function(Query $query) use($params){
-                $query->where('goods_category_id',$params['goods_category_id']);
-            }])->field(['id', 'amount', 'coupon_type','amount_require', 'discount_ratio', 'event_name', 'expire_time', 'max_deductible_price', 'mold_type', 'server_category_name', 'voucher_count'])
-                ->order(['id' => 'desc'])
-                ->select()
-                ->toArray();
+            $data =  CouponRules::alias('cr')
+                ->leftJoin('coupon_category cc','cc.coupon_id = cr.id')
+                ->where('cc.goods_category_id',$params['goods_category_id'])
+                ->where('cr.remaining_count','>',0)
+                ->where('cr.voucher_status',1)
+                ->order(['cr.id' => 'desc'])
+                ->field(['cr.id','cr.code','cr.amount','cr.amount_require','cr.discount_ratio','cr.server_category_name',
+                    'cr.event_name','cr.expire_time','cr.max_deductible_price','cr.mold_type',])
+                ->select();
+            $codes = $data->column('code');
+            $userCouponCodes = [];
+            if(!empty($code)){
+                $userCouponCodes = UserCoupon::where('code',$codes)
+                    ->where('user_id',$params['user_id'])->column('code');
+            }
+            $data = $data->whereNotIn('code',$userCouponCodes)->toArray();
             return $data;
         }catch(\Exception $e){
-            Db::rollback();
             self::setError($e->getMessage());
             return false;
         }

+ 3 - 3
app/api/validate/UserCouponValidate.php

@@ -8,18 +8,18 @@ use app\common\validate\BaseValidate;
  */
 class UserCouponValidate extends BaseValidate {
     protected $rule = [
-        'coupon_ids' => 'require',
+        'codes' => 'require',
         'goods_category_id'=> 'require',
         'voucher_status'=>'require'
     ];
     protected $field = [
-        'coupon_ids' => '优惠券ID组',
+        'codes' => '优惠券编码组',
         'goods_category_id'=>'分类ID',
         'voucher_status'=>'参数',
     ];
     public function sceneAdd()
     {
-        return $this->only(['coupon_ids']);
+        return $this->only(['code']);
     }
 
     public function sceneVoucher()

+ 14 - 1
app/common/model/coupon/UserCoupon.php

@@ -2,6 +2,8 @@
 
 namespace app\common\model\coupon;
 use app\common\model\BaseModel;
+use app\common\model\dict\DictData;
+use think\facade\Cache;
 
 /**
  * @author 林海涛
@@ -15,7 +17,18 @@ class UserCoupon extends BaseModel
 
     public function couponRules()
     {
-        return $this->hasOne(CouponRules::class,'id','coupon_id');
+        return $this->hasOne(CouponRules::class,'code','code');
+    }
+    public function getVoucherStatusTextAttr($value,$data):string
+    {
+        $default = Cache::get('VOUCHER_STATUS');
+        if (!$default) {
+            $status = DictData::whereIn('type_value', 'voucher_status')->column('name','value');
+            Cache::set('VOUCHER_STATUS', json_encode($status,true),5);
+        } else {
+            $status = json_decode($default);
+        }
+        return $status[$data['voucher_status']] ?? '';
     }
 
 }