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.

159 lines
4.5 KiB

5 years ago
6 years ago
6 years ago
  1. <?php
  2. namespace App\Service\v3\Implementations;
  3. use App\Constants\v3\ActivityType;
  4. use App\Constants\v3\ErrorCode;
  5. use App\Constants\v3\SsdbKeys;
  6. use App\Service\v3\Interfaces\GoodsActivityServiceInterface;
  7. use App\TaskWorker\SSDBTask;
  8. use App\Constants\v3\Store;
  9. use App\Constants\v3\Goods;
  10. use App\Model\v3\GoodsActivity;
  11. use App\Model\v3\GoodsActivityBanner;
  12. use Hyperf\Utils\ApplicationContext;
  13. class GoodsActivityService implements GoodsActivityServiceInterface
  14. {
  15. public function do($goodsId)
  16. {
  17. }
  18. public function check(GoodsActivity $goods, $num, $userId)
  19. {
  20. if (empty($goods)) {
  21. return ErrorCode::GOODS_ACTIVITY_ON_SALE_NO;
  22. }
  23. // 活动是否已经结束
  24. if ($goods->expire_time < time()) {
  25. return ErrorCode::GOODS_ACTIVITY_EXPIRED;
  26. }
  27. // 商户歇业
  28. if($goods->store->is_rest == 1){
  29. return ErrorCode::GOODS_ACTIVITY_ON_SALE_NO;
  30. }
  31. // 商品下架或已删除
  32. if($goods->on_sale == Goods::ON_SALE_NO || !is_null($goods->deleted_at)){
  33. return ErrorCode::GOODS_ACTIVITY_ON_SALE_NO;
  34. }
  35. // 商品库存不足
  36. if($goods->is_infinite != Goods::IS_INVENTORY && $goods->inventory < $num){
  37. return ErrorCode::GOODS_ACTIVITY_INVENTORY_ERROR;
  38. }
  39. // 是否超过限购数量
  40. if ($goods->restrict_num < $num) {
  41. return ErrorCode::GOODS_ACTIVITY_RESTRICT_LIMIT;
  42. }
  43. // 是否已经购买过(某个时间段内,时间段有商品的限制)
  44. $ssdb = ApplicationContext::getContainer()->get(SSDBTask::class);
  45. $hasBuy = $ssdb->exec('get', SsdbKeys::ACTIVITY_GOODS_BUY_RECORD.$userId.'_'.$goods->type.'_'.$goods->id);
  46. if ($hasBuy && $hasBuy >= $goods->time_limit_num) {
  47. return ErrorCode::GOODS_ACTIVITY_BUY;
  48. }
  49. return true;
  50. }
  51. public function undo()
  52. {
  53. // TODO: Implement undo() method.
  54. }
  55. public function getBanner($goodsId)
  56. {
  57. $banner = GoodsActivityBanner::query()->where('goods_id',$goodsId)->orderByDesc('type')->get();
  58. return $banner;
  59. }
  60. public function detail($goodsId)
  61. {
  62. $res = GoodsActivity::query()->with('store')->where('id',$goodsId)->first();
  63. return $res;
  64. }
  65. public function cacheRecord($goodsId, $num, $userId)
  66. {
  67. $goods = GoodsActivity::query()
  68. ->where('id', $goodsId)
  69. ->first();
  70. $ssdbKey = SsdbKeys::ACTIVITY_GOODS_BUY_RECORD.$userId.'_'.$goods->type.'_'.$goodsId;
  71. $expireTime = 0;
  72. if ($goods->time_limit_days >= 1) {
  73. $expireTime += strtotime(date('Y-m-d 23:59:59')) - time();
  74. var_dump('ex1', $expireTime);
  75. }
  76. $expireTime += ($goods->time_limit_days-1) * 86400;
  77. var_dump('ex2', $expireTime);
  78. $ssdb = ApplicationContext::getContainer()->get(SSDBTask::class);
  79. if (!$ssdb->exec('exists', $ssdbKey)) {
  80. $ssdb->exec('set', $ssdbKey, $num);
  81. $ssdb->exec('expire', $ssdbKey, $expireTime);
  82. } else {
  83. $ssdb->exec('incr', $ssdbKey, $num);
  84. }
  85. }
  86. public function clearCacheRecord($goodsId, $num, $userId)
  87. {
  88. $goods = GoodsActivity::query()
  89. ->where('id', $goodsId)
  90. ->first();
  91. var_dump('$goods', $goods, $goodsId);
  92. if (empty($goods)) {
  93. return true;
  94. }
  95. $ssdbKey = SsdbKeys::ACTIVITY_GOODS_BUY_RECORD.$userId.'_'.$goods->type.'_'.$goodsId;
  96. var_dump('ssdbkey', $ssdbKey);
  97. $ssdb = ApplicationContext::getContainer()->get(SSDBTask::class);
  98. if (!$ssdb->exec('exists', $ssdbKey)) {
  99. } else {
  100. $res = $ssdb->exec('incr', $ssdbKey, -1*$num);
  101. var_dump('res', $res, -1*$num);
  102. }
  103. }
  104. /**
  105. * 统计订单中活动商品的数量,并校验
  106. * @param $orderGoods
  107. * @param int $limitNum
  108. * @return bool
  109. */
  110. public function checkOrderActivityCount($orderGoods, $limitNum=1)
  111. {
  112. $sourceGoods = GoodsActivity::query()
  113. ->whereIn('id', array_values(array_column($orderGoods, 'goods_id')))
  114. ->get()->toArray();
  115. $limitNums = [
  116. ActivityType::FLASH_SALE => 1,
  117. ActivityType::GROUP_BUY => 1,
  118. ActivityType::NEW_PRODUCT => 1,
  119. ];
  120. $buyNum = 0;
  121. foreach ($sourceGoods as $key => &$goods) {
  122. if ($buyNum >= $limitNums[$goods['type']]) {
  123. return false;
  124. }
  125. $buyNum++;
  126. }
  127. return true;
  128. }
  129. }