StoreSeckillController.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <?php
  2. namespace app\api\controller\activity;
  3. use app\models\store\StoreDescription;
  4. use app\models\store\StoreProductAttr;
  5. use app\models\store\StoreProductAttrValue;
  6. use app\models\store\StoreVisit;
  7. use app\models\system\SystemAttachment;
  8. use app\models\store\StoreProductRelation;
  9. use app\models\store\StoreProductReply;
  10. use app\models\store\StoreSeckill;
  11. use app\Request;
  12. use crmeb\services\GroupDataService;
  13. use crmeb\services\QrcodeService;
  14. use crmeb\services\SystemConfigService;
  15. use crmeb\services\UtilService;
  16. use Exception;
  17. use think\db\exception\DataNotFoundException;
  18. use think\db\exception\DbException;
  19. use think\db\exception\ModelNotFoundException;
  20. /**
  21. * 秒杀商品类
  22. * Class StoreSeckillController
  23. * @package app\api\controller\activity
  24. */
  25. class StoreSeckillController
  26. {
  27. /**
  28. * 秒杀商品时间区间
  29. * @param Request $request
  30. * @return mixed
  31. */
  32. public function index(Request $request)
  33. {
  34. //秒杀时间段
  35. $seckillTime = GroupDataService::getData('routine_seckill_time', 0, true, $request->mer_id()) ?? [];
  36. $seckillTimeIndex = 0;
  37. if (count($seckillTime)) {
  38. foreach ($seckillTime as $key => &$value) {
  39. $currentHour = date('H');
  40. $activityEndHour = bcadd((int)$value['time'], (int)$value['continued'], 0);
  41. if ($activityEndHour > 24) {
  42. $value['time'] = strlen((int)$value['time']) == 2 ? (int)$value['time'] . ':00' : '0' . (int)$value['time'] . ':00';
  43. $value['state'] = '即将开始';
  44. $value['status'] = 2;
  45. $value['stop'] = (int)bcadd(strtotime(date('Y-m-d')), bcmul($activityEndHour, 3600, 0));
  46. } else {
  47. if ($currentHour >= (int)$value['time'] && $currentHour < $activityEndHour) {
  48. $value['time'] = strlen((int)$value['time']) == 2 ? (int)$value['time'] . ':00' : '0' . (int)$value['time'] . ':00';
  49. $value['state'] = '抢购中';
  50. $value['stop'] = (int)bcadd(strtotime(date('Y-m-d')), bcmul($activityEndHour, 3600, 0));
  51. $value['status'] = 1;
  52. if (!$seckillTimeIndex) $seckillTimeIndex = $key;
  53. } else if ($currentHour < (int)$value['time']) {
  54. $value['time'] = strlen((int)$value['time']) == 2 ? (int)$value['time'] . ':00' : '0' . (int)$value['time'] . ':00';
  55. $value['state'] = '即将开始';
  56. $value['status'] = 2;
  57. $value['stop'] = (int)bcadd(strtotime(date('Y-m-d')), bcmul($activityEndHour, 3600, 0));
  58. } else if ($currentHour >= $activityEndHour) {
  59. $value['time'] = strlen((int)$value['time']) == 2 ? (int)$value['time'] . ':00' : '0' . (int)$value['time'] . ':00';
  60. $value['state'] = '已结束';
  61. $value['status'] = 0;
  62. $value['stop'] = (int)bcadd(strtotime(date('Y-m-d')), bcmul($activityEndHour, 3600, 0));
  63. }
  64. }
  65. }
  66. }
  67. $data['lovely'] = SystemConfigService::get('seckill_header_banner', '', false, $request->mer_id());
  68. if (strstr($data['lovely'], 'http') === false && strlen(trim($data['lovely']))) $data['lovely'] = SystemConfigService::get('site_url', '', false, $request->mer_id()) . $data['lovely'];
  69. $data['lovely'] = str_replace('\\', '/', $data['lovely']);
  70. $data['seckillTime'] = $seckillTime;
  71. $data['seckillTimeIndex'] = $seckillTimeIndex;
  72. return app('json')->successful($data);
  73. }
  74. /**
  75. * 秒杀商品列表
  76. * @param Request $request
  77. * @param $time
  78. * @return mixed
  79. * @throws Exception
  80. */
  81. public function lst(Request $request, $time)
  82. {
  83. list($page, $limit) = UtilService::getMore([
  84. ['page', 0],
  85. ['limit', 0],
  86. ], $request, true);
  87. if (!$time) return app('json')->fail('参数错误');
  88. $seckillInfo = StoreSeckill::seckillList($time, $page, $limit, $request->mer_id());
  89. if (count($seckillInfo)) {
  90. foreach ($seckillInfo as $key => &$item) {
  91. if ($item['quota'] > 0) {
  92. $quota = StoreProductAttrValue::where('product_id', $item['id'])->where('type', 1)->value('SUM(quota)');
  93. $percent = (int)bcmul(bcdiv(bcsub($item['quota'], $quota), $item['quota'], 2), 100, 0);
  94. $item['percent'] = $percent;
  95. $item['stock'] = $quota;
  96. } else {
  97. $item['percent'] = 100;
  98. $item['stock'] = 0;
  99. }
  100. $item['price'] = floatval($item['price']);
  101. $item['ot_price'] = floatval($item['ot_price']);
  102. }
  103. }
  104. return app('json')->successful($seckillInfo);
  105. }
  106. /**
  107. * 秒杀商品详情
  108. * @param Request $request
  109. * @param $id
  110. * @param int $time
  111. * @return mixed
  112. * @throws DataNotFoundException
  113. * @throws DbException
  114. * @throws ModelNotFoundException
  115. */
  116. public function detail(Request $request, $id, $time = 0)
  117. {
  118. $mer_id = $request->mer_id();
  119. $storeInfo = StoreSeckill::getValidProduct($id, '*', $request->mer_id());
  120. if ($storeInfo)
  121. $storeInfo = $storeInfo->hidden(['cost', 'add_time', 'is_del'])->toArray();
  122. else
  123. $storeInfo = [];
  124. if (!$id || !$storeInfo) return app('json')->fail('商品不存在或已下架!');
  125. $siteUrl = sys_config('site_url', '', $mer_id);
  126. $storeInfo['image'] = set_file_url($storeInfo['image'], $siteUrl);
  127. $storeInfo['image_base'] = set_file_url($storeInfo['image'], $siteUrl);
  128. $storeInfo['code_base'] = QrcodeService::getWechatQrcodePath($id . '_seckill_detail_wap.jpg', '/pages/activity/goods_seckill_details/index?id=' . $id . '&time=' . $time . '&status=1');
  129. $uid = $request->uid();
  130. $storeInfo['userLike'] = StoreProductRelation::isProductRelation($id, $uid, 'like', 'product_seckill');
  131. $storeInfo['like_num'] = StoreProductRelation::productRelationNum($id, 'like', 'product_seckill');
  132. $storeInfo['userCollect'] = StoreProductRelation::isProductRelation($storeInfo['product_id'], $uid, 'collect');
  133. $storeInfo['uid'] = $uid;
  134. $storeInfo['description'] = StoreDescription::getDescription($id, 1);
  135. $data['storeInfo'] = $storeInfo;
  136. StoreVisit::setView($uid, $id, $storeInfo['product_id'], 'viwe');
  137. $data['reply'] = StoreProductReply::getRecProductReply($storeInfo['product_id']);
  138. $data['replyCount'] = StoreProductReply::productValidWhere()->where('product_id', $storeInfo['product_id'])->count();
  139. if ($data['replyCount']) {
  140. $goodReply = StoreProductReply::productValidWhere()->where('product_id', $storeInfo['product_id'])->where('product_score', 5)->count();
  141. $data['replyChance'] = $goodReply;
  142. if ($goodReply) {
  143. $data['replyChance'] = bcdiv($goodReply, $data['replyCount'], 2);
  144. $data['replyChance'] = bcmul($data['replyChance'], 100, 2);
  145. }
  146. } else $data['replyChance'] = 100;
  147. list($productAttr, $productValue) = StoreProductAttr::getProductAttrDetail($id, $uid, 0, 1);
  148. foreach ($productValue as $k => $v) {
  149. $productValue[$k]['product_stock'] = StoreProductAttrValue::where('product_id', $storeInfo['product_id'])->where('suk', $v['suk'])->where('type', 0)->value('stock');
  150. }
  151. $data['productAttr'] = $productAttr;
  152. $data['productValue'] = $productValue;
  153. return app('json')->successful($data);
  154. }
  155. /**
  156. * 获取秒杀小程序二维码
  157. * @param Request $request
  158. * @param $id
  159. * @return mixed
  160. */
  161. public function code(Request $request, $id, $stop_time = '')
  162. {
  163. $url = QrcodeService::getRoutineQrcodePath($id, $request->uid(), 2, compact('stop_time'), $request->mer_id());
  164. if ($url) {
  165. return app('json')->success(['code' => $url]);
  166. } else {
  167. return app('json')->success(['code' => '']);
  168. }
  169. }
  170. }