UserCouponLogic.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. <?php
  2. namespace app\api\logic;
  3. use app\common\logic\BaseLogic;
  4. use app\common\model\coupon\CouponCategory;
  5. use app\common\model\coupon\CouponRules;
  6. use app\common\model\coupon\UserCoupon;
  7. use app\common\model\goods\Goods;
  8. use think\db\Query;
  9. use think\db\Where;
  10. use think\Exception;
  11. use think\facade\Db;
  12. /**
  13. * @author 林海涛
  14. * @date 2024/7/18 下午4:49
  15. */
  16. class UserCouponLogic extends BaseLogic
  17. {
  18. public static function add($params)
  19. {
  20. Db::startTrans();
  21. try{
  22. $errMsgArr = [];
  23. $rules = CouponRules::whereIn('code',$params['codes'])->where('voucher_status',1)->lock(true)->select();
  24. $userCoupon = UserCoupon::where('user_id',$params['user_id'])
  25. ->whereIn('code',$params['codes'])
  26. ->where('voucher_count','>',0)
  27. ->select();
  28. if($rules->isEmpty()){
  29. $errMsgArr[] = '优惠券不存在';
  30. }
  31. $updateData = [];
  32. $createData = [];
  33. foreach($rules as $v) {
  34. if($v->voucher_status == 2){
  35. $errMsgArr[] = $v->event_name .'已设置为过期';
  36. continue;
  37. }
  38. if($v->remaining_count <= 0 ){
  39. $errMsgArr[] = $v->event_name .'数量不足';
  40. continue;
  41. }
  42. if($userCoupon->where('coupon_id',$v->id)->count()){
  43. $errMsgArr[] = $v->event_name . '已经领取过了,请勿重复领取';
  44. continue;
  45. }
  46. $updateData[$v->id] = ['remaining_count' => --$v->remaining_count];
  47. $createData[] = [
  48. 'user_id'=>$params['user_id'],
  49. 'coupon_id' => $v->id,
  50. 'code' => $v->code,
  51. 'voucher_status' => 0,
  52. 'voucher_count' =>1,
  53. 'amount' => $v->mold_type != 1 ? $v->amount:null,
  54. 'amount_require' => $v->amount_require,
  55. 'begin_use' => time(),
  56. 'discount_ratio' => $v->mold_type == 1 ? $v->discount_ratio:null,
  57. 'event_name' => $v->event_name,
  58. 'expire_time' => time()+$v->expire_time,
  59. 'max_deductible_price' => $v->mold_type == 1 ? $v->max_deductible_price:null,
  60. 'mold_type' => $v->mold_type,
  61. 'server_category_name' => $v->server_category_name
  62. ];
  63. }
  64. if(!empty($updateData)){
  65. CouponRules::updateWhenCase($updateData);
  66. }
  67. if(!empty($createData)){
  68. (new UserCoupon())->saveAll($createData);
  69. }
  70. Db::commit();
  71. return $errMsgArr;
  72. }catch(\Exception $e){
  73. Db::rollback();
  74. self::setError($e->getMessage());
  75. return false;
  76. }
  77. }
  78. /**
  79. * 我的优惠卷列表
  80. * @param $params
  81. * @return array|false
  82. */
  83. public static function userCouponList($params)
  84. {
  85. try{
  86. $where = [];
  87. $where[] = ['voucher_status','=',0];
  88. if(isset($params['voucher_status']) && is_array($params['voucher_status'])){
  89. $where[] = ['voucher_status','IN',$params['voucher_status']];
  90. }
  91. $where[] = ['user_id','=',$params['user_id']];
  92. $data = UserCoupon::where($where)
  93. ->where(function(Query $query){
  94. $query->where(' expire_time >'. time());
  95. })
  96. ->field(['id','code','amount','amount_require','begin_use','voucher_status','discount_ratio','event_name','expire_time','max_deductible_price','server_category_name','mold_type'])
  97. ->append(['voucher_status_text','discount_ratio_text'])
  98. ->order(['id' => 'desc'])
  99. ->select()
  100. ->toArray();
  101. $couponCodes = [];
  102. foreach($data as $k => $v){
  103. if($v['expire_time'] < time()){
  104. $couponCodes[] = $v['code'];
  105. $data[$k]['voucher_status_text'] = '已过期';
  106. }
  107. $data[$k]['begin_use'] = date("Y-m-d H:i:s",$v['begin_use'] );
  108. $data[$k]['expire_time'] = date("Y-m-d H:i:s",$v['expire_time'] );
  109. $data[$k]['amount_require'] = '满'.$v['amount_require'].'可用';
  110. }
  111. if(!empty($couponCodes)){
  112. UserCoupon::whereIn('code',$couponCodes)->update(['voucher_status'=>2]);
  113. }
  114. return $data;
  115. } catch (\Exception $e){
  116. Db::rollback();
  117. self::setError($e->getMessage());
  118. return false;
  119. }
  120. }
  121. /**
  122. * 商品分类优惠卷领取
  123. * @param $params
  124. * @return array|false
  125. */
  126. public static function categoryCouponLists($params)
  127. {
  128. try{
  129. $coupon_ids = CouponCategory::where('goods_category_id',$params['goods_category_id'])->column('coupon_id');
  130. $data = CouponRules::where('remaining_count','>',0)
  131. ->where('coupon_type',1)
  132. ->whereIn('id',$coupon_ids)
  133. ->where('voucher_status',1)
  134. ->append(['discount_ratio_text'])
  135. ->order(['id' => 'desc'])
  136. ->field(['code','amount','amount_require','discount_ratio','server_category_name',
  137. 'event_name','expire_time','max_deductible_price','mold_type',])
  138. ->select();
  139. foreach($data as $k => $v){
  140. $data[$k]['amount_require'] = '满'.$v['amount_require'].'可用';
  141. }
  142. $codes = $data->column('code');
  143. $userCouponCodes = [];
  144. if(!empty($code)){
  145. $userCouponCodes = UserCoupon::where('code',$codes)
  146. ->where('user_id',$params['user_id'])->column('code');
  147. }
  148. $data = $data->whereNotIn('code',$userCouponCodes)->toArray();
  149. return $data;
  150. }catch(\Exception $e){
  151. self::setError($e->getMessage());
  152. return false;
  153. }
  154. }
  155. public static function categoryWithAmountLists($params)
  156. {
  157. try{
  158. $coupon_all_ids =UserCoupon::where('user_id',$params['user_id'])
  159. ->where('voucher_count','>',0)
  160. ->where('voucher_status',0)
  161. ->where('expire_time','>',time())
  162. ->where('amount_require','<=',$params['amount'])
  163. ->column('coupon_id');
  164. $coupon_ids = CouponCategory::where('goods_category_id',$params['goods_category_id'])->whereIn('coupon_id',$coupon_all_ids)->column('coupon_id');
  165. // 商品Id - 代理Id - 代理券
  166. $remove_coupon_ids = [0];
  167. if(isset($params['goods_id']) && empty($params['goods_id'])){
  168. $property_activity_id = Goods::where('id',$params['goods_id'])->value('property_activity_id');
  169. $property_activity_id && $remove_coupon_ids = CouponRules::where('property_activity_id',$property_activity_id)->column('id')?:[0];
  170. }
  171. $data = UserCoupon::where('user_id',$params['user_id'])
  172. ->where('voucher_count','>',0)
  173. ->where('voucher_status',0)
  174. ->whereIn('coupon_id',$coupon_ids)
  175. ->whereNotIn('coupon_id',$remove_coupon_ids)
  176. ->append(['discount_ratio_text'])
  177. ->where('expire_time','>',time())
  178. ->visible(['id','coupon_id','amount','amount_require','begin_use','discount_ratio','event_name','expire_time','max_deductible_price','server_category_name','mold_type'])
  179. ->select()->toArray();
  180. foreach($data as $k => $v){
  181. $data[$k]['begin_use'] = date("Y-m-d H:i:s",$v['begin_use'] );
  182. $data[$k]['expire_time'] = date("Y-m-d H:i:s",$v['expire_time'] );
  183. $data[$k]['amount_require'] = '满'.$v['amount_require'].'可用';
  184. }
  185. return $data;
  186. } catch(\Exception $e){
  187. self::setError($e->getMessage());
  188. return false;
  189. }
  190. }
  191. }