Product.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <?php namespace App\Http\Controllers\Api;
  2. use App\Http\Controllers\Api\Api;
  3. use App\Http\Requests\Api\Product as Request;
  4. use App\Models\Business;
  5. use App\Models\Custom;
  6. use App\Models\Product as Model;
  7. use App\Models\Product\Attr as ProductAttr;
  8. use App\Models\Product\City as ProductCity;
  9. use App\Models\Product\Spec as ProductSpec;
  10. use App\Models\Product\Skus as ProductSkus;
  11. use App\Models\ProductPhoto;
  12. use App\Models\RegimentActive;
  13. use App\Models\Regiment;
  14. /**
  15. * 产品接口
  16. *
  17. * @author 刘相欣
  18. *
  19. * */
  20. class Product extends Api{
  21. /**
  22. * 获取产品列表 /api/product/get_list
  23. *
  24. * @param string $name 产品名称
  25. * @param int $page 页码,默认1
  26. * @param int $limit 每页条数,默认10条
  27. *
  28. * */
  29. public function get_list(Request $request,Model $Model,Custom $Custom,RegimentActive $RegimentActive){
  30. // 接口验签
  31. // $this->verify_sign();
  32. // 验证参数
  33. $request->scene('get_list')->validate();
  34. // 检查登录
  35. $uid = $this->getUid();
  36. // 获取客户信息
  37. $custom = $uid ? $Custom->getOne($uid) : [];
  38. // 接收参数
  39. $name = request('name','');
  40. $limit = request('limit',10);
  41. // 显示
  42. $map = [['status','=','0'],['stock','>',0]];
  43. // 分类ID
  44. if( $name ) $map[] = ['name','like','%'.$name.'%'];
  45. // 是否有城市
  46. $wherIn = empty($custom['city_id']) ? [1] : [1,$custom['city_id']];
  47. // 获取分页信息
  48. $Paginator = $Model->query()
  49. ->join('product_city','product_city.product_id','=','product.id')
  50. ->where($map)
  51. ->whereIn('product_city.city_id',$wherIn)
  52. ->groupBy('product_id')
  53. ->orderBy('product.sort')
  54. ->orderBy('product.id')
  55. ->paginate($limit,['product.id','product.sort','product.name','product.thumb','product.spec','product.price','product.market_price','product.stock']);
  56. // 获取数据
  57. $data['total'] = $Paginator->total();
  58. $data['current_page'] = $Paginator->currentPage();
  59. $data['per_page'] = $Paginator->perPage();
  60. $data['last_page'] = $Paginator->lastPage();
  61. $data['data'] = $Paginator->items();
  62. $time = time();
  63. // 处理请求
  64. foreach ( $data['data'] as $key => $value ) {
  65. // 处理数据
  66. $value['thumb'] = path_compat($value['thumb']);
  67. $value['regiment_active_id'] = null;
  68. $value['regiment_title'] = '';
  69. // 查询产品拼团信息
  70. $regiment = $RegimentActive::query()->where([['status','=',1],['start_time','<=',$time],['end_time','>=',$time],['product_id','=',$value['id']]])->first(['id as active_id','number','automatic']);
  71. // 如果有拼团信息
  72. if ( $regiment ) {
  73. $value['regiment_active_id']= $regiment['id'];
  74. $value['regiment_title'] = $regiment['automatic'] == 1 ? '多人团' : $regiment['number'].'人团';
  75. }
  76. // 重组数据
  77. $data['data'][$key] = $value;
  78. }
  79. // 返回结果
  80. return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
  81. }
  82. /**
  83. * 获取产品列表 /api/product/get_detail
  84. *
  85. * @param int $id 产品id
  86. *
  87. * */
  88. public function get_detail(Request $request,Model $Model,ProductPhoto $ProductPhoto,Business $Business,ProductAttr $ProductAttr,ProductSpec $ProductSpec,ProductSkus $ProductSkus,RegimentActive $RegimentActive,Regiment $Regiment ){
  89. // 接口验签
  90. // $this->verify_sign();
  91. // 验证参数
  92. $request->scene('get_detail')->validate();
  93. // 检查登录
  94. // $uid = $this->checkLogin();
  95. // 接收参数
  96. $id = request('id',0);
  97. // 显示
  98. $map[] = ['status','=','0'];
  99. // 查询
  100. $data = $Model->query()->where($map)->find($id,['id','name','thumb','stock','spec','poster','price','business_id','market_price']);
  101. // 如果没有数据
  102. if( !$data ) return json_send(['code'=>'error','msg'=>'产品已下架','data'=>['error'=>'产品已下架或不存在']]);
  103. // 转数组
  104. $data = $data->toArray();
  105. // 处理数据
  106. $data['thumb'] = path_compat($data['thumb']);
  107. $data['poster'] = $data['poster'] ? path_compat($data['poster']) : '';
  108. $data['description'] = $Model->getDesc($id);
  109. $data['business_info'] = $Business->getOne($data['business_id']);
  110. $data['photo_list'] = $ProductPhoto->getListByProductId($id);
  111. // 缩略图处理
  112. foreach ($data['photo_list'] as $key => $value) {
  113. $value['thumb'] = path_compat($value['thumb']);
  114. $data['photo_list'][$key] = $value;
  115. }
  116. // 主图追加进去
  117. if( $data['photo_list'] ) array_unshift($data['photo_list'],['id'=>0,'sort'=>0,'thumb'=>$data['thumb']]);
  118. // 获取产品属性
  119. $attr = $ProductAttr->getListByProductId($id);
  120. // 规格属性
  121. $specAttr = [];
  122. // 获取数据
  123. foreach ($attr as $value) {
  124. // 默认未选中
  125. $value['active'] = 0;
  126. $specAttr[$value['spec_id']]['spec_id'] = $value['spec_id'];
  127. $specAttr[$value['spec_id']]['spec_name'] = $ProductSpec->getOne($value['spec_id'],'name');
  128. $specAttr[$value['spec_id']]['attr_list'][] = $value;
  129. }
  130. // 获取规格详情数据
  131. $data['product_attr'] = array_values($specAttr);
  132. // 获取SKU数据
  133. $data['product_sku'] = $ProductSkus->getListByProductId($id);
  134. // 获取数据
  135. foreach ($data['product_sku'] as $key=>$value) {
  136. // 默认未选中
  137. $value['sku_thumb'] = $value['sku_thumb'] ? path_compat($value['sku_thumb']) : '';
  138. $data['product_sku'][$key]= $value;
  139. }
  140. // 手机号
  141. if( isset($data['business_info']['phone']) ) unset($data['business_info']['phone']);
  142. if( isset($data['business_info']['logopic']) ) $data['business_info']['logopic'] = path_compat($data['business_info']['logopic']);
  143. //拼团数据
  144. $time = time();
  145. $regimentWhere = [
  146. ['status','=',1],
  147. ['start_time','<=',$time],
  148. ['end_time','>=',$time],
  149. ['product_id','=',$data['id']]
  150. ];
  151. $regimentActive = $RegimentActive::query()
  152. ->where($regimentWhere)
  153. ->first();
  154. $data['regiment_list'] = [];
  155. $data['automatic_info'] = [];
  156. if ( $regimentActive ){
  157. $data['regiment_number'] = $regimentActive['number'];
  158. $data['regiment_active_id'] = $regimentActive['id'];
  159. $data['regiment_price'] = $regimentActive['regiment_price'];
  160. $data['regiment_quota'] = $regimentActive['quota'];
  161. $data['regiment_active'] = $regimentActive;
  162. $data['automatic_info'] = [];
  163. if ($regimentActive['automatic'] == 1){
  164. $automaticInfo = $Regiment::query()->where([['status','=',1],['active_id','=',$regimentActive['id']],['start_time','<=',$time],['end_time','>=',$time]])->first();
  165. if ($automaticInfo){
  166. $data['automatic_info'] = $automaticInfo;
  167. $data['regiment_type'] = 1;
  168. }else{
  169. $data['regiment_type'] = 2;
  170. }
  171. $data['regiment_title'] = '多人团';
  172. }else{
  173. $data['regiment_title'] = $regimentActive['number'].'人团';
  174. $data['regiment_type'] = 2;
  175. $regiment = $Regiment::query()
  176. ->join('custom','custom.uid','=','regiment.custom_uid')
  177. ->where([['regiment.active_id','=',$data['regiment_active_id']],['regiment.product_id','=',$data['id']],['regiment.status','=',1],['regiment.start_time','<=',$time],['regiment.end_time','>=',$time]])
  178. ->select(['regiment.*','custom.username','custom.userpic'])
  179. ->get();
  180. if ($regiment){
  181. foreach ($regiment as &$value) {
  182. $value['userpic'] = $value['userpic'] ? path_compat($value['userpic']) : '';
  183. $surplusNumber = $data['regiment_number'] - $value['people_number'];
  184. if ($surplusNumber > 0){
  185. $value['surplus_number'] = $surplusNumber;
  186. }else{
  187. $value['surplus_number'] = 0;
  188. }
  189. }
  190. $data['regiment_list'] = $regiment;
  191. }
  192. }
  193. }else{
  194. $data['regiment_active_id'] = null;
  195. $data['regiment_type'] = 0;
  196. }
  197. // 返回结果
  198. return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
  199. }
  200. /**
  201. * 获取产品列表 /api/product/get_sku
  202. *
  203. * @param int $id 产品id
  204. *
  205. * */
  206. public function get_sku(Request $request,ProductAttr $ProductAttr,ProductSpec $ProductSpec,ProductSkus $ProductSkus ){
  207. // 接口验签
  208. // $this->verify_sign();
  209. // 验证参数
  210. $request->scene('get_sku')->validate();
  211. // 检查登录
  212. $uid = $this->checkLogin();
  213. // 接收参数
  214. $id = request('id',0);
  215. // 获取产品属性
  216. $attr = $ProductAttr->getListByProductId($id);
  217. // 规格属性
  218. $specAttr = [];
  219. // 获取数据
  220. foreach ($attr as $value) {
  221. // 默认未选中
  222. $value['active'] = 0;
  223. $specAttr[$value['spec_id']]['spec_id'] = $value['spec_id'];
  224. $specAttr[$value['spec_id']]['spec_name'] = $ProductSpec->getOne($value['spec_id'],'name');
  225. $specAttr[$value['spec_id']]['attr_list'][] = $value;
  226. }
  227. // 获取规格详情数据
  228. $data['product_attr'] = $specAttr;
  229. // 获取SKU数据
  230. $data['product_sku'] = $ProductSkus->getListByProductId($id);
  231. // 返回结果
  232. return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
  233. }
  234. }