Product.php 7.1 KB

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