Product.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. namespace app\api\model\plus\seckill;
  3. use app\common\exception\BaseException;
  4. use app\common\model\plus\seckill\Product as SeckillProductModel;
  5. use app\api\model\product\Product as ProductModel;
  6. /**
  7. * 限时秒杀模型
  8. */
  9. class Product extends SeckillProductModel
  10. {
  11. /**
  12. * 隐藏字段
  13. */
  14. protected $hidden = [
  15. 'sales_initial',
  16. 'total_sales',
  17. 'is_delete',
  18. 'app_id',
  19. 'create_time',
  20. 'update_time'
  21. ];
  22. /**
  23. * 获取商品列表(用于订单结算)
  24. */
  25. public static function getSeckillProduct($params)
  26. {
  27. // 秒杀任务详情
  28. $seckills = self::detail($params['seckill_product_id'], ['seckillSku']);
  29. if (empty($seckills)) {
  30. throw new BaseException(['msg' => '秒杀商品不存在或已结束']);
  31. }
  32. // 秒杀商品详情
  33. $product = ProductModel::detail($seckills['product_id']);
  34. // 积分商品sku信息
  35. $point_sku = null;
  36. if ($product['spec_type'] == 10) {
  37. $point_sku = $seckills['seckillSku'][0];
  38. } else {
  39. //多规格
  40. foreach ($seckills['seckillSku'] as $sku) {
  41. if ($sku['seckill_product_sku_id'] == $params['seckill_product_sku_id']) {
  42. $point_sku = $sku;
  43. break;
  44. }
  45. }
  46. }
  47. if ($point_sku == null) {
  48. throw new BaseException(['msg' => '秒杀商品规格不存在']);
  49. }
  50. // 商品sku信息
  51. $product['product_sku'] = ProductModel::getProductSku($product, $params['product_sku_id']);
  52. $product['seckill_sku'] = $point_sku;
  53. // 商品列表
  54. $productList = [$product->hidden(['category', 'content', 'image', 'sku'])];
  55. foreach ($productList as &$item) {
  56. // 商品单价
  57. $item['product_price'] = $point_sku['seckill_price'];
  58. // 商品购买数量
  59. $item['total_num'] = $params['product_num'];
  60. $item['spec_sku_id'] = $item['product_sku']['spec_sku_id'];
  61. // 商品购买总金额
  62. $item['total_price'] = $point_sku['seckill_price'] * $item['total_num'];
  63. $item['seckill_product_sku_id'] = $point_sku['seckill_product_sku_id'];
  64. $item['product_sku_id'] = $params['product_sku_id'];
  65. $item['product_source_id'] = $point_sku['seckill_product_id'];
  66. // 秒杀活动id
  67. $item['activity_id'] = $seckills['seckill_activity_id'];
  68. $item['sku_source_id'] = $point_sku['seckill_product_sku_id'];
  69. // 秒杀最大购买数
  70. $item['seckill_product'] = [
  71. 'limit_num' => $seckills['limit_num']
  72. ];
  73. }
  74. return $productList;
  75. }
  76. /**
  77. * 获取首页秒杀商品显示
  78. */
  79. public function getProductList($seckill_activity_id, $limit)
  80. {
  81. // 获取列表数据
  82. $list = $this->with(['product.image.file', 'seckillSku'])
  83. ->where('seckill_activity_id', '=', $seckill_activity_id)
  84. ->where('is_delete', '=', 0)
  85. ->limit($limit)
  86. ->visible(['product.product_id','product.product_name','product.file_path'])
  87. ->select();
  88. foreach ($list as $product) {
  89. $seckill_arr = array_column($product['seckillSku']->toArray(), 'seckill_price');
  90. $product_arr = array_column($product['seckillSku']->toArray(), 'product_price');
  91. sort($seckill_arr);
  92. sort($product_arr);
  93. $product['seckill_price'] = current($seckill_arr);
  94. $product['product_price'] = current($product_arr);
  95. $real_product = $product['product'];
  96. $real_product['file_path'] = $product['product']['image'][0]['file_path'];
  97. unset($product['seckillSku']);
  98. unset($real_product['image']);
  99. }
  100. return $list;
  101. }
  102. /**
  103. * 列表页秒杀商品
  104. * 目前未分页,后续有可能会分页
  105. */
  106. public function getActivityList($seckill_activity_id){
  107. // 获取列表数据
  108. $list = $this->with(['product.image.file', 'seckillSku'])
  109. ->where('seckill_activity_id', '=', $seckill_activity_id)
  110. ->where('is_delete', '=', 0)
  111. ->visible(['product.product_id','product.product_name','product.file_path'])
  112. ->select();
  113. foreach ($list as $product) {
  114. $seckill_arr = array_column($product['seckillSku']->toArray(), 'seckill_price');
  115. $product_arr = array_column($product['seckillSku']->toArray(), 'product_price');
  116. sort($seckill_arr);
  117. sort($product_arr);
  118. $product['seckill_price'] = current($seckill_arr);
  119. $product['product_price'] = current($product_arr);
  120. $product['product']['file_path'] = $product['product']['image'][0]['file_path'];
  121. unset($product['seckillSku']);
  122. unset($product['product']['image']);
  123. }
  124. return $list;
  125. }
  126. public function getSeckillDetail($seckill_product_id)
  127. {
  128. $result = $this->with(['product.image.file', 'seckillSku.productSku.image'])
  129. ->where('seckill_product_id', '=', $seckill_product_id)->find();
  130. if (!empty($result)) {
  131. $seckill_arr = array_column($result->toArray()['seckillSku'], 'seckill_price');
  132. $product_arr = array_column($result->toArray()['seckillSku'], 'product_price');
  133. sort($seckill_arr);
  134. sort($product_arr);
  135. $result['seckill_price'] = current($seckill_arr);
  136. $result['line_price'] = current($product_arr);
  137. if (count($seckill_arr) > 1) {
  138. $res['seckill_high_price'] = end($seckill_arr);
  139. $res['line_high_price'] = end($product_arr);
  140. }
  141. }
  142. return $result;
  143. }
  144. }