|
|
<?php
namespace App\Service\v3\Implementations;
use App\Constants\v3\ActivityType;use App\Constants\v3\ErrorCode;use App\Constants\v3\SsdbKeys;use App\Service\v3\Interfaces\GoodsActivityServiceInterface;use App\TaskWorker\SSDBTask;use App\Constants\v3\Store;use App\Constants\v3\Goods;use App\Model\v3\GoodsActivity;use App\Model\v3\GoodsActivityBanner;use Hyperf\Utils\ApplicationContext;
class GoodsActivityService implements GoodsActivityServiceInterface{ public function do($goodsId) {
}
public function check($goodsId, $num, $userId) { $goods = GoodsActivity::query()->with('store')->where('id', $goodsId)->first();
// 活动是否已经结束
if ($goods->expire_time < time()) { return ErrorCode::GOODS_ACTIVITY_EXPIRED; }
// 商户歇业
if($goods->store->is_rest != Store::IS_OPEN_YES){ return ErrorCode::GOODS_ACTIVITY_ON_SALE_NO; }
// 商品下架或已删除
if($goods->on_sale == Goods::ON_SALE_NO || !is_null($goods->deleted_at)){ return ErrorCode::GOODS_ACTIVITY_ON_SALE_NO; }
// 商品库存不足
if($goods->is_infinite != Goods::IS_INVENTORY && $goods->inventory < $num){ return ErrorCode::GOODS_ACTIVITY_INVENTORY_ERROR; }
// 是否超过限购数量
if ($goods->restrict_num > $num) { return ErrorCode::GOODS_ACTIVITY_RESTRICT_LIMIT; }
// 是否已经购买过(某个时间段内,时间段有商品的限制)
$ssdb = ApplicationContext::getContainer()->get(SSDBTask::class); $hasBuy = $ssdb->exec('get', SsdbKeys::ACTIVITY_GOODS_BUY_RECORD.$userId.'_'.$goodsId); if ($hasBuy && $hasBuy >= $goods->time_limit_num) { return ErrorCode::GOODS_ACTIVITY_BUY; }
return true; }
public function undo() { // TODO: Implement undo() method.
}
public function getBanner($goodsId) { $banner = GoodsActivityBanner::query()->where('goods_id',$goodsId)->orderByDesc('type')->get(); return $banner; }
public function detail($goodsId) { $res = GoodsActivity::query()->with('store')->where('id',$goodsId)->first(); return $res; }
public function cacheRecord($goodsId, $num, $userId) {
$goods = GoodsActivity::query()->select('time_limit_days', 'time_limit_num') ->where('id', $goodsId) ->first();
$ssdbKey = SsdbKeys::ACTIVITY_GOODS_BUY_RECORD.$userId.'_'.$goodsId;
$expireTime = 0; if ($goods->time_limit_days <= 1) { $expireTime += strtotime(date('Y-m-d 23:59:59')) - time(); } $expireTime += ($goods->time_limit_days-1) *86400;
$ssdb = ApplicationContext::getContainer()->get(SSDBTask::class);
if (!$ssdb->exec('exists', $ssdbKey)) { $ssdb->exec('set', $ssdbKey, $num); $ssdb->exec('expire', $ssdbKey, $expireTime); } else { $ssdb->exec('incr', $ssdbKey, $num); }
}
/** * 统计订单中活动商品的数量,并校验 * @param $orderGoods * @param int $limitNum * @return bool */ public function checkOrderActivityCount($orderGoods, $limitNum=1) {
$sourceGoods = GoodsActivity::query() ->whereIn('id', array_values(array_column($orderGoods, 'goods_id'))) ->get()->toArray();
$limitNums = [ ActivityType::FLASH_SALE => 1, ActivityType::GROUP_BUY => 1, ActivityType::NEW_PRODUCT => 1, ];
$buyNum = 0; foreach ($sourceGoods as $key => &$goods) { if ($buyNum >= $limitNums[$goods['type']]) { return false; } $buyNum++; }
return true; }}
|