Coupon.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. <?php
  2. namespace app\admin\model\shopro\user;
  3. use app\admin\model\shopro\Common;
  4. use app\admin\model\shopro\Coupon as CouponModel;
  5. use app\admin\model\shopro\user\User as UserModel;
  6. use app\admin\model\shopro\order\Order as OrderModel;
  7. class Coupon extends Common
  8. {
  9. protected $name = 'shopro_user_coupon';
  10. protected $type = [
  11. 'use_time' => 'timestamp'
  12. ];
  13. // 追加属性
  14. protected $append = [
  15. 'name',
  16. 'type',
  17. 'type_text',
  18. 'use_scope',
  19. 'use_scope_text',
  20. 'items',
  21. 'amount',
  22. 'amount_text',
  23. 'enough',
  24. 'limit_num',
  25. 'use_start_time',
  26. 'use_end_time',
  27. 'max_amount',
  28. 'is_double_discount',
  29. 'description',
  30. 'status',
  31. 'status_text',
  32. ];
  33. public function statusList()
  34. {
  35. return [
  36. 'used' => '已使用',
  37. 'can_use' => '立即使用',
  38. 'expired' => '已过期',
  39. 'cannot_use' => '暂不可用',
  40. 'geted' => '未使用' // 包括 can_use 和 cannot_use
  41. ];
  42. }
  43. public function scopeGeted($query)
  44. {
  45. return $query->whereNull('use_time')->whereExists(function ($query) {
  46. $table_name = (new CouponModel)->getQuery()->getTable();
  47. $user_coupon_name = (new self)->getQuery()->getTable();
  48. $query->table($table_name)->whereNull('deletetime')->whereIn('status', ['normal', 'hidden'])
  49. ->where($user_coupon_name . '.coupon_id=' . $table_name . '.id')
  50. ->where(function ($query) use ($user_coupon_name) {
  51. $query->where(function ($query) {
  52. $query->where('use_time_type', 'range')->where('use_end_time', '>=', time()); // 可用结束时间,大于当前时间,已经可用,或者暂不可用都算
  53. })->whereOr(function ($query) use ($user_coupon_name) {
  54. $query->where('use_time_type', 'days')
  55. ->whereRaw($user_coupon_name . '.createtime + ((start_days + days) * 86400) >= ' . time()); // 可用结束结束时间大于当前时间
  56. });
  57. });
  58. });
  59. }
  60. // 可以使用
  61. public function scopeCanUse($query)
  62. {
  63. return $query->whereNull('use_time')->whereExists(function ($query) {
  64. $table_name = (new CouponModel)->getQuery()->getTable();
  65. $user_coupon_name = (new self)->getQuery()->getTable();
  66. $query->table($table_name)->whereNull('deletetime')->whereIn('status', ['normal', 'hidden'])
  67. ->where($user_coupon_name . '.coupon_id=' . $table_name . '.id')
  68. ->where(function ($query) use ($user_coupon_name) {
  69. $query->where(function ($query) {
  70. $query->where('use_time_type', 'range')->where('use_start_time', '<=', time())->where('use_end_time', '>=', time());
  71. })->whereOr(function ($query) use ($user_coupon_name) {
  72. $query->where('use_time_type', 'days')
  73. ->whereRaw($user_coupon_name . '.createtime + (start_days * 86400) <= ' . time())
  74. ->whereRaw($user_coupon_name . '.createtime + ((start_days + days) * 86400) >= ' . time());
  75. });
  76. });
  77. });
  78. }
  79. // 暂不可用,还没到可使用日期
  80. public function scopeCannotUse($query)
  81. {
  82. return $query->whereNull('use_time')->whereExists(function ($query) {
  83. $table_name = (new CouponModel)->getQuery()->getTable();
  84. $user_coupon_name = (new self)->getQuery()->getTable();
  85. $query->table($table_name)->whereNull('deletetime')->whereIn('status', ['normal', 'hidden'])
  86. ->where($user_coupon_name . '.coupon_id=' . $table_name . '.id')
  87. ->where(function ($query) use ($user_coupon_name) {
  88. $query->where(function ($query) {
  89. $query->where('use_time_type', 'range')->where('use_start_time', '>', time());
  90. })->whereOr(function ($query) use ($user_coupon_name) {
  91. $query->where('use_time_type', 'days')
  92. ->whereRaw($user_coupon_name . '.createtime + (start_days * 86400) > ' . time());
  93. });
  94. });
  95. });
  96. }
  97. // 已使用
  98. public function scopeUsed($query)
  99. {
  100. return $query->whereNotNull('use_time');
  101. }
  102. // 未使用,但已过期
  103. public function scopeExpired($query)
  104. {
  105. return $query->whereNull('use_time')->whereExists(function ($query) {
  106. $table_name = (new CouponModel)->getQuery()->getTable();
  107. $user_coupon_name = (new self)->getQuery()->getTable();
  108. $query->table($table_name)->whereNull('deletetime')->whereIn('status', ['normal', 'hidden'])
  109. ->where($user_coupon_name . '.coupon_id=' . $table_name . '.id')
  110. ->where(function ($query) use ($user_coupon_name) {
  111. $query->where(function ($query) {
  112. $query->where('use_time_type', 'range')->where('use_end_time', '<', time());
  113. })->whereOr(function ($query) use ($user_coupon_name) {
  114. $query->where('use_time_type', 'days')
  115. ->whereRaw($user_coupon_name . '.createtime + ((start_days + days) * 86400) < ' . time());
  116. });
  117. });
  118. });
  119. }
  120. // 未使用,但已过期,或者已使用
  121. public function scopeInvalid($query)
  122. {
  123. return $query->where(function ($query) {
  124. $query->whereNotNull('use_time')->whereOr(function ($query) {
  125. $query->whereNull('use_time')->whereExists(function ($query) {
  126. $table_name = (new CouponModel)->getQuery()->getTable();
  127. $user_coupon_name = (new self)->getQuery()->getTable();
  128. $query->table($table_name)->whereNull('deletetime')->whereIn('status', ['normal', 'hidden'])
  129. ->where($user_coupon_name . '.coupon_id=' . $table_name . '.id')
  130. ->where(function ($query) use ($user_coupon_name) {
  131. $query->where(function ($query) {
  132. $query->where('use_time_type', 'range')->where('use_end_time', '<', time());
  133. })->whereOr(function ($query) use ($user_coupon_name) {
  134. $query->where('use_time_type', 'days')
  135. ->whereRaw($user_coupon_name . '.createtime + ((start_days + days) * 86400) < ' . time());
  136. });
  137. });
  138. });
  139. });
  140. });
  141. }
  142. public function getNameAttr($value, $data)
  143. {
  144. return $this->coupon ? $this->coupon->name : '';
  145. }
  146. public function getTypeAttr($value, $data)
  147. {
  148. return $this->coupon ? $this->coupon->type : '';
  149. }
  150. public function getUseScopeAttr($value, $data)
  151. {
  152. return $this->coupon ? $this->coupon->use_scope : '';
  153. }
  154. public function getItemsAttr($value, $data)
  155. {
  156. return $this->coupon ? $this->coupon->items : '';
  157. }
  158. public function getAmountAttr($value, $data)
  159. {
  160. return $this->coupon ? $this->coupon->amount : '';
  161. }
  162. public function getEnoughAttr($value, $data)
  163. {
  164. return $this->coupon ? $this->coupon->enough : '';
  165. }
  166. public function getLimitNumAttr($value, $data)
  167. {
  168. return $this->coupon ? $this->coupon->limit_num : '';
  169. }
  170. public function getUseStartTimeAttr($value, $data)
  171. {
  172. if ($this->coupon) {
  173. if ($this->coupon->use_time_type == 'days') {
  174. return date('Y-m-d H:i:s', $data['createtime'] + ($this->coupon->start_days * 86400));
  175. }
  176. return $this->coupon->use_start_time;
  177. }
  178. }
  179. public function getUseEndTimeAttr($value, $data)
  180. {
  181. if ($this->coupon) {
  182. if ($this->coupon->use_time_type == 'days') {
  183. return date('Y-m-d H:i:s', $data['createtime'] + (($this->coupon->start_days + $this->coupon->days) * 86400));
  184. }
  185. return $this->coupon->use_end_time;
  186. }
  187. }
  188. public function getMaxAmountAttr($value, $data)
  189. {
  190. return $this->coupon ? $this->coupon->max_amount : 0;
  191. }
  192. public function getIsDoubleDiscountAttr($value, $data)
  193. {
  194. return $this->coupon ? $this->coupon->is_double_discount : 0;
  195. }
  196. public function getDescriptionAttr($value, $data)
  197. {
  198. return $this->coupon ? $this->coupon->description : '';
  199. }
  200. public function getUseScopeTextAttr($value, $data)
  201. {
  202. return $this->coupon ? $this->coupon->use_scope : 0;
  203. }
  204. public function getAmountTextAttr($value, $data)
  205. {
  206. return $this->coupon ? $this->coupon->amount_text : 0;
  207. }
  208. public function getItemsValueAttr($value, $data)
  209. {
  210. return $this->coupon ? $this->coupon->items_value : 0;
  211. }
  212. public function getTypeTextAttr($value, $data)
  213. {
  214. return $this->coupon ? $this->coupon->type_text : 0;
  215. }
  216. // 我的优惠券使用状态
  217. public function getStatusAttr($value, $data)
  218. {
  219. if ($data['use_time']) {
  220. $status = 'used';
  221. } else {
  222. if ($this->use_start_time <= date('Y-m-d H:i:s') && $this->use_end_time >= date('Y-m-d H:i:s')) {
  223. $status = 'can_use';
  224. } else if ($this->use_end_time <= date('Y-m-d H:i:s')) {
  225. $status = 'expired';
  226. } else {
  227. // 未到使用日期
  228. $status = 'cannot_use';
  229. }
  230. }
  231. return $status;
  232. }
  233. public function getStatusTextAttr($value, $data)
  234. {
  235. $value = $value ?: ($this->status ?? '');
  236. if (strpos(request()->url(), 'addons/shopro') === false) {
  237. $value = in_array($value, ['can_use', 'cannot_use']) ? 'geted' : $value; // 后台,可以使用和咱不可用 合并
  238. }
  239. $list = $this->statusList();
  240. return isset($list[$value]) ? $list[$value] : '';
  241. }
  242. public function coupon()
  243. {
  244. return $this->belongsTo(CouponModel::class, 'coupon_id');
  245. }
  246. public function user()
  247. {
  248. return $this->belongsTo(User::class, 'user_id');
  249. }
  250. public function order()
  251. {
  252. return $this->belongsTo(OrderModel::class, 'use_order_id');
  253. }
  254. }