UserCouponLogic.php 9.3 KB

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