UserCouponLogic.php 11 KB

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