You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
2.3 KiB

  1. <?php
  2. namespace App\Service\v3\Implementations;
  3. use App\Model\ShopCar;
  4. use App\Model\v3\Coupon;
  5. use App\Model\v3\CouponRec;
  6. use App\Service\v3\Interfaces\CouponRecServiceInterface;
  7. use Hyperf\DbConnection\Db;
  8. use Hyperf\Redis\Redis;
  9. use Hyperf\Utils\ApplicationContext;
  10. class CouponRecService implements CouponRecServiceInterface
  11. {
  12. public function do()
  13. {
  14. // TODO: Implement do() method.
  15. }
  16. public function check()
  17. {
  18. // TODO: Implement check() method.
  19. }
  20. public function undo()
  21. {
  22. // TODO: Implement undo() method.
  23. }
  24. /**
  25. * 获取当前订单可使用的优惠券
  26. * @param $totalAmount
  27. * @param $userId
  28. * @param $marketId
  29. * @param $type
  30. * @param $storeTypeIds
  31. */
  32. public function allForOrderOlAvailable($totalAmount, $userId, $marketId, $type, $storeTypeIds = [])
  33. {
  34. // 用户今日使用过的优惠券
  35. $redis = ApplicationContext::getContainer()->get(Redis::class);
  36. $couponTodayUsedIds = $redis->sMembers('coupon_'.date('Ymd').'_used_'.$userId);
  37. $currentTime = time();
  38. $builder = Db::table('lanzu_coupon_receive as receive')
  39. ->join('lanzu_coupon as coupon', 'coupon.id', '=', 'receive.coupon_id', 'inner');
  40. if (is_array($couponTodayUsedIds)&&!empty($couponTodayUsedIds)) {
  41. $builder->whereNotIn('coupon.id', $couponTodayUsedIds);
  42. }
  43. foreach ($storeTypeIds as $key => &$item) {
  44. $item = (string)$item;
  45. }
  46. if (!empty($storeTypeIds)) {
  47. $builder->whereJsonContains('coupon.storetype_ids', $storeTypeIds);
  48. }
  49. $builder->where(['receive.user_id' => $userId])
  50. ->whereIn('receive.status', [0,1])
  51. ->where('receive.number_remain', '>', 0)
  52. ->whereIn('coupon.type', [1,$type])
  53. ->where('coupon.full_amount', '<=', $totalAmount)
  54. ->where('coupon.usable_start_time', '<=', $currentTime)
  55. ->where('coupon.usable_end_time', '>=', $currentTime)
  56. ->where('coupon.usable_number', '<=', Db::raw('receive.number_remain'));
  57. if ($marketId) {
  58. $builder->whereJsonContains('coupon.market_ids', [(string)$marketId]);
  59. }
  60. return $builder->orderByRaw('coupon.discounts DESC, coupon.full_amount DESC')
  61. ->get()
  62. ->toArray();
  63. }
  64. }