|
|
<?php
namespace App\Service;
use Hyperf\DbConnection\Db;use Hyperf\Redis\Redis;use Hyperf\Utils\ApplicationContext;
class CouponService implements CouponServiceInterface{
/** * @inheritDoc */ public function getOrderCanUseCoupons($orderAmount, $marketId, $userId, $fields=[], $type = 1, $storeTypeIds = [0]) {
// 用户今日使用过的优惠券
$redis = ApplicationContext::getContainer()->get(Redis::class); $couponTodayUsedIds = $redis->sMembers('coupon_'.date('Ymd').'_used_'.$userId); $currentTime = time();
$builder = Db::table('ims_system_coupon_user_receive as receive') ->join('ims_system_coupon_user as coupon', 'coupon.id', '=', 'receive.system_coupon_user_id', 'inner');
if (is_array($fields)&&!empty($fields)) { $builder->select($fields); }
if (is_array($couponTodayUsedIds)&&!empty($couponTodayUsedIds)) { $builder->whereNotIn('coupon.id', $couponTodayUsedIds); }
return $builder->where(['receive.user_id' => $userId]) ->whereIn('receive.status', [0,1]) ->where('receive.number_remain', '>', 0) ->whereIn('coupon.type', [1,$type]) ->where('coupon.full_amount', '<=', $orderAmount) ->where('coupon.usable_start_time', '<=', $currentTime) ->where('coupon.usable_end_time', '>=', $currentTime) ->where('coupon.usable_number', '<=', Db::raw('receive.number_remain')) ->where('coupon.market_id', 'in', [0, $marketId]) ->whereIn('coupon.storetype_id', $storeTypeIds) ->orderByRaw('coupon.discounts DESC, coupon.full_amount DESC') ->get() ->toArray(); }
/** * 缓存优惠券今日使用情况 * @param $userId * @param $couponId * @param $couponRecId * @return bool */ function cacheTodayCouponUsed($userId, $couponId, $couponRecId) {
$redis = ApplicationContext::getContainer()->get(Redis::class);
$setRes = $redis->sAdd( 'coupon_'.date('Ymd').'_used_'.$userId, $couponId );
$expireRes = $redis->expire( 'coupon_'.date('Ymd').'_used_'.$userId, strtotime(date('Y-m-d').' 23:59:59')-time() );
return $setRes&&$expireRes; }}
|