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.
 
 

73 lines
2.3 KiB

<?php
namespace App\Service;
use Hyperf\DbConnection\Db;
use Hyperf\Redis\Redis;
use Hyperf\Utils\ApplicationContext;
class CouponService implements CoupnoServiceInterface
{
/**
* @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;
}
}