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.
 
 

163 lines
4.7 KiB

<?php
namespace App\Service\v3\Implementations;
use App\Constants\v3\ActivityType;
use App\Constants\v3\ErrorCode;
use App\Constants\v3\SsdbKeys;
use App\Exception\ErrorCodeException;
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\Redis\Redis;
use Hyperf\Utils\ApplicationContext;
class GoodsActivityService implements GoodsActivityServiceInterface
{
public function do($goodsId)
{
}
public function check(GoodsActivity $goods, $num, $userId)
{
$redis = ApplicationContext::getContainer()->get(Redis::class);
$inventoryKey = 'goods_inventory_sold_2_'.$goods->id; // 拼接activity_type和goods_id
if (empty($goods)) {
return ErrorCode::GOODS_ACTIVITY_NOT_EXISTS;
}
// 活动是否已经结束
if ($goods->expire_time < time()) {
return ErrorCode::GOODS_ACTIVITY_EXPIRED;
}
// 商户歇业
if($goods->store->is_rest == 1){
return ErrorCode::STORE_REST;
}
// 商品下架或已删除
if($goods->on_sale == 0 || !is_null($goods->deleted_at)){
return ErrorCode::GOODS_ACTIVITY_ON_SALE_NO;
}
// 商品库存不足
// 获取冻结的库存
// $inventoryFrozen = (int)$redis->get($inventoryKey);
$inventoryFrozen = 0;
if($goods->is_infinite != 1 && $goods->inventory < ($num+$inventoryFrozen)){
return ErrorCode::GOODS_ACTIVITY_INVENTORY_ERROR;
}
// 是否超过限购数量
if ($goods->restrict_num != 0 && $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.'_'.$goods->type.'_'.$goods->id);
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()
->where('id', $goodsId)
->first();
$ssdbKey = SsdbKeys::ACTIVITY_GOODS_BUY_RECORD.$userId.'_'.$goods->type.'_'.$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);
}
}
public function clearCacheRecord($goodsId, $num, $userId)
{
$goods = GoodsActivity::query()
->where('id', $goodsId)
->first();
if (empty($goods)) {
return true;
}
$ssdbKey = SsdbKeys::ACTIVITY_GOODS_BUY_RECORD.$userId.'_'.$goods->type.'_'.$goodsId;
$ssdb = ApplicationContext::getContainer()->get(SSDBTask::class);
if (!$ssdb->exec('exists', $ssdbKey)) {
} else {
$res = $ssdb->exec('incr', $ssdbKey, -1*$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;
}
}