Coupon.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <?php
  2. namespace app\frontend\modules\coupon\models;
  3. /**
  4. * Class Coupon
  5. * @package app\frontend\modules\coupon\models
  6. * @property int status
  7. * @property int get_type
  8. * @property int level_limit
  9. */
  10. class Coupon extends \app\common\models\Coupon
  11. {
  12. public $table = 'yz_coupon';
  13. protected $casts = [
  14. 'goods_ids' => 'json',
  15. 'category_ids' => 'json',
  16. 'goods_names' => 'json',
  17. 'categorynames' => 'json',
  18. 'time_start' => 'date',
  19. // 'time_end' => 'date',
  20. 'member_tags_ids' => 'json',
  21. 'member_tags_names' => 'json',
  22. ];
  23. const TYPE_ALL = 0;//全部
  24. const TYPE_SHOP = 1;//平台
  25. const TYPE_STORE = 2;//门店
  26. const TYPE_HOTEL = 3;//酒店
  27. const TYPE_GOODS = 4;//指定商品
  28. const TYPE_CATE = 5;//指定分类
  29. const TYPE_EXCHANGE = 6;//兑换券
  30. const TYPE_MONEY_OFF = 7;//满减券
  31. const TYPE_DISCOUNT = 8;//折扣券
  32. const TYPE_OVERDUE = 9;//快过期
  33. const TYPE_GOOD_AND_STORE = 10;//平台商品和门店
  34. /**
  35. * @var array
  36. */
  37. public static $typeComment = [
  38. self::TYPE_ALL => '全部',
  39. self::TYPE_SHOP => '平台',
  40. self::TYPE_STORE => '门店',
  41. self::TYPE_HOTEL => '酒店',
  42. self::TYPE_GOODS => '指定商品',
  43. self::TYPE_CATE => '分类商品',
  44. self::TYPE_EXCHANGE => '兑换券',
  45. self::TYPE_MONEY_OFF => '满减券',
  46. self::TYPE_DISCOUNT => '折扣券',
  47. self::TYPE_GOOD_AND_STORE => '平台商品和门店',
  48. ];
  49. //前台需要整数的"立减值"
  50. // public function getDeductAttribute($value)
  51. // {
  52. // return intval($value);
  53. // }
  54. //前台需要整数的"折扣值", 即"打几折"
  55. // public function getDiscountAttribute($value)
  56. // {
  57. // return intval($value);
  58. // }
  59. //获取该用户可领取的优惠券的状态
  60. public static function getCouponsForMember($memberId, $memberLevel, $couponId = null, $time = null, $coupon_type = '')
  61. {
  62. // 通过id找到会员等级
  63. $memberLevel = \app\common\models\MemberLevel::find($memberLevel)->level;
  64. $res = static::uniacid()
  65. ->select(['yz_coupon.id', 'yz_coupon.name', 'yz_coupon.coupon_method', 'yz_coupon.deduct', 'yz_coupon.discount', 'yz_coupon.enough', 'yz_coupon.use_type', 'yz_coupon.category_ids',
  66. 'yz_coupon.categorynames', 'yz_coupon.goods_ids', 'yz_coupon.goods_names', 'yz_coupon.time_limit', 'yz_coupon.time_days', 'yz_coupon.time_start', 'yz_coupon.time_end', 'yz_coupon.get_max', 'yz_coupon.total',
  67. 'yz_coupon.money', 'yz_coupon.credit', 'yz_coupon.updated_at', 'use_conditions']);
  68. if ($coupon_type) {
  69. switch ($coupon_type) {
  70. case Coupon::TYPE_SHOP:
  71. $res->where('yz_coupon.use_type', Coupon::COUPON_SHOP_USE);
  72. break;
  73. case Coupon::TYPE_STORE:
  74. if (app('plugins')->isEnabled('store-cashier')) {
  75. $res->whereIn('yz_coupon.use_type', [Coupon::COUPON_STORE_USE, Coupon::COUPON_SINGLE_STORE_USE]);
  76. }
  77. break;
  78. case Coupon::TYPE_HOTEL:
  79. if (app('plugins')->isEnabled('hotel')) {
  80. $res->whereIn('yz_coupon.use_type', [Coupon::COUPON_ONE_HOTEL_USE, Coupon::COUPON_MORE_HOTEL_USE]);
  81. }
  82. break;
  83. case Coupon::TYPE_GOODS:
  84. $res->where('yz_coupon.use_type', Coupon::COUPON_GOODS_USE);
  85. break;
  86. case Coupon::TYPE_CATE:
  87. $res->where('yz_coupon.use_type', Coupon::COUPON_CATEGORY_USE);
  88. break;
  89. case Coupon::TYPE_EXCHANGE:
  90. $res->where('yz_coupon.use_type', Coupon::COUPON_EXCHANGE_USE);
  91. break;
  92. case Coupon::TYPE_GOOD_AND_STORE:
  93. if (app('plugins')->isEnabled('store-cashier')) {
  94. $res->where('yz_coupon.use_type', Coupon::COUPON_GOODS_AND_STORE_USE);
  95. }
  96. break;
  97. case Coupon::TYPE_MONEY_OFF:
  98. $res->where('yz_coupon.coupon_method', Coupon::COUPON_MONEY_OFF);
  99. break;
  100. case Coupon::TYPE_DISCOUNT:
  101. $res->where('yz_coupon.coupon_method', Coupon::COUPON_DISCOUNT);
  102. break;
  103. }
  104. };
  105. if (!app('plugins')->isEnabled('store-cashier')) {
  106. $res->whereNotIn('yz_coupon.use_type', [Coupon::COUPON_STORE_USE, Coupon::COUPON_SINGLE_STORE_USE]);
  107. }
  108. if (!app('plugins')->isEnabled('hotel')) {
  109. $res->whereNotIn('yz_coupon.use_type', [Coupon::COUPON_ONE_HOTEL_USE, Coupon::COUPON_MORE_HOTEL_USE]);
  110. }
  111. $res->where('yz_coupon.get_type', '=', 1)
  112. ->where('yz_coupon.status', '=', 1)
  113. ->where('yz_coupon.get_max', '!=', 0)
  114. // 优惠券的level_limit改为存储yz_member_level表的id,所以要关联yz_member_level表
  115. //->memberLevel($memberLevel);
  116. ->leftjoin('yz_member_level', 'yz_coupon.level_limit', '=', 'yz_member_level.id')
  117. ->where(function ($query) use ($memberLevel) {
  118. $query->where('yz_member_level.level', '<=', !empty($memberLevel) ? $memberLevel : 0)//如果会员等级为空,也就是会员表等级默认的0,则默认为0,等级肯定大于等于1
  119. ->orWhere('yz_coupon.level_limit', '=', -1);
  120. });
  121. if (!is_null($couponId)) {
  122. $res = $res->where('yz_coupon.id', '=', $couponId);
  123. }
  124. if (!is_null($time)) {
  125. $res = $res->unexpired($time);
  126. }
  127. return $res->withCount(['hasManyMemberCoupon as member_got_count' => function ($query) use ($memberId) {
  128. return $query->where('uid', '=', $memberId);
  129. }]);
  130. }
  131. //领券中心复制一份出来,为避免影响其他功能
  132. public static function centerCouponsForMember($memberId, $memberLevel, $couponId = null, $time = null, $coupon_type = '')
  133. {
  134. // 通过id找到会员等级
  135. $memberLevel = \app\common\models\MemberLevel::find($memberLevel)->level;
  136. $res = static::uniacid()
  137. ->select(['yz_coupon.id', 'yz_coupon.name', 'yz_coupon.coupon_method', 'yz_coupon.deduct', 'yz_coupon.discount', 'yz_coupon.enough', 'yz_coupon.use_type', 'yz_coupon.category_ids',
  138. 'yz_coupon.categorynames', 'yz_coupon.goods_ids', 'yz_coupon.goods_names', 'yz_coupon.time_limit', 'yz_coupon.time_days', 'yz_coupon.time_start', 'yz_coupon.time_end', 'yz_coupon.get_max', 'yz_coupon.total',
  139. 'yz_coupon.money', 'yz_coupon.credit', 'yz_coupon.updated_at', 'use_conditions', 'yz_coupon.is_integral_exchange_coupon', 'yz_coupon.exchange_coupon_integral']);
  140. if ($coupon_type) {
  141. switch ($coupon_type) {
  142. case Coupon::TYPE_SHOP:
  143. $res->where('yz_coupon.use_type', Coupon::COUPON_SHOP_USE);
  144. break;
  145. case Coupon::TYPE_STORE:
  146. if (app('plugins')->isEnabled('store-cashier')) {
  147. $res->whereIn('yz_coupon.use_type', [Coupon::COUPON_STORE_USE, Coupon::COUPON_SINGLE_STORE_USE]);
  148. }
  149. break;
  150. case Coupon::TYPE_HOTEL:
  151. if (app('plugins')->isEnabled('hotel')) {
  152. $res->whereIn('yz_coupon.use_type', [Coupon::COUPON_ONE_HOTEL_USE, Coupon::COUPON_MORE_HOTEL_USE]);
  153. }
  154. break;
  155. case Coupon::TYPE_GOODS:
  156. $res->where('yz_coupon.use_type', Coupon::COUPON_GOODS_USE);
  157. break;
  158. case Coupon::TYPE_CATE:
  159. $res->where('yz_coupon.use_type', Coupon::COUPON_CATEGORY_USE);
  160. break;
  161. case Coupon::TYPE_EXCHANGE:
  162. $res->where('yz_coupon.use_type', Coupon::COUPON_EXCHANGE_USE);
  163. break;
  164. case Coupon::TYPE_GOOD_AND_STORE:
  165. if (app('plugins')->isEnabled('store-cashier')) {
  166. $res->where('yz_coupon.use_type', Coupon::COUPON_GOODS_AND_STORE_USE);
  167. }
  168. break;
  169. case Coupon::TYPE_MONEY_OFF:
  170. $res->where('yz_coupon.coupon_method', Coupon::COUPON_MONEY_OFF);
  171. break;
  172. case Coupon::TYPE_DISCOUNT:
  173. $res->where('yz_coupon.coupon_method', Coupon::COUPON_DISCOUNT);
  174. break;
  175. }
  176. };
  177. if (!app('plugins')->isEnabled('store-cashier')) {
  178. $res->whereNotIn('yz_coupon.use_type', [Coupon::COUPON_STORE_USE, Coupon::COUPON_SINGLE_STORE_USE]);
  179. }
  180. if (!app('plugins')->isEnabled('hotel')) {
  181. $res->whereNotIn('yz_coupon.use_type', [Coupon::COUPON_ONE_HOTEL_USE, Coupon::COUPON_MORE_HOTEL_USE]);
  182. }
  183. //会员标签查询
  184. if (app('plugins')->isEnabled('member-tags')) {
  185. //存在会员标签的才进行查询限制
  186. $memberTags = \Yunshop\MemberTags\Common\models\MemberTagsRelationModel::uniacid()->where('member_id', $memberId)->pluck('tag_id');
  187. $res->where(function ($query) use ($memberTags) {
  188. $query->where(function ($query2) use ($memberTags) {
  189. $i = 0;
  190. foreach ($memberTags as $item) {
  191. if ($i > 0) {
  192. $query2->orWhereRaw("FIND_IN_SET(?,TRIM(TRAILING ']' FROM TRIM(LEADING '[' FROM member_tags_ids)))", $item);
  193. } else {
  194. $query2->whereRaw("FIND_IN_SET(?,TRIM(TRAILING ']' FROM TRIM(LEADING '[' FROM member_tags_ids)))", $item);
  195. }
  196. $i++;
  197. }
  198. })->orWhere(function ($query) {
  199. $query->whereNull('member_tags_ids')->orWhereRaw("LENGTH(TRIM( TRAILING ']' FROM TRIM( LEADING '[' FROM member_tags_ids ) )) = 0");
  200. });
  201. });
  202. }
  203. $res->where('yz_coupon.get_type', '=', 1)
  204. ->where('yz_coupon.status', '=', 1)
  205. ->where('yz_coupon.get_max', '!=', 0)
  206. // 优惠券的level_limit改为存储yz_member_level表的id,所以要关联yz_member_level表
  207. //->memberLevel($memberLevel);
  208. ->leftjoin('yz_member_level', 'yz_coupon.level_limit', '=', 'yz_member_level.id')
  209. ->where(function ($query) use ($memberLevel) {
  210. $query->where('yz_member_level.level', '<=', !empty($memberLevel) ? $memberLevel : 0)//如果会员等级为空,也就是会员表等级默认的0,则默认为0,等级肯定大于等于1
  211. ->orWhere('yz_coupon.level_limit', '=', -1);
  212. });
  213. if (!is_null($couponId)) {
  214. $res = $res->where('yz_coupon.id', '=', $couponId);
  215. }
  216. if (!is_null($time)) {
  217. $res = $res->unexpired($time);
  218. }
  219. return $res->withCount(['hasManyMemberCoupon as member_got_count' => function ($query) use ($memberId) {
  220. return $query->where(['uid' => $memberId , 'get_type' => 1]);
  221. }]);
  222. }
  223. //指定ID的, 在优惠券中心可领取的, 优惠券
  224. public static function getAvailableCouponById($couponId)
  225. {
  226. return static::uniacid()
  227. ->where('id', '=', $couponId)
  228. ->where(function ($query) {
  229. $query->where('total', '>', 0)
  230. ->orWhere(function ($query) {
  231. $query->where('total', '=', -1);
  232. });
  233. })
  234. ->where('status', '=', 1)
  235. ->where('get_type', '=', 1)
  236. ->first();
  237. }
  238. }