Expedite.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. <?php
  2. namespace app\api\controller;
  3. use AlibabaCloud\Client\AlibabaCloud;
  4. use AlibabaCloud\Client\Exception\ClientException;
  5. use AlibabaCloud\Client\Exception\ServerException;
  6. use app\common\model\CouponConfig;
  7. use app\common\model\ExchangeGoods;
  8. use app\common\model\GoodsCate;
  9. use app\common\model\GoodsServe;
  10. use app\common\model\MallMenu;
  11. use app\common\model\OrderComment;
  12. use app\common\model\RemarkLabel;
  13. use app\common\model\StoreGoods;
  14. use app\common\model\UserCollect;
  15. use app\common\model\UserTrack;
  16. use app\common\service\Activity;
  17. use think\Db;
  18. /**
  19. * @title 不需要验证token接口(
  20. * ,商品列表等)
  21. * @controller Expedite
  22. * @package app\api\controller
  23. */
  24. class Expedite extends Base
  25. {
  26. public function initialize(){
  27. parent::initialize();
  28. parent::setUid();
  29. }
  30. /**
  31. * @title 获取首页轮播图
  32. * @desc 获取首页轮播图
  33. * @author qc
  34. * @url /api/Expedite/getBanner
  35. * @method GET
  36. * @header name:Authorization require:1 desc:Token
  37. * @param name:num type:int default:5 desc:查询数量
  38. * @return name:cover type:srting default:-- desc:图片路径
  39. * @return name:link type:srting default:-- desc:链接
  40. */
  41. public function getBanner()
  42. {
  43. $num = input('get.num',5);
  44. $place = input('get.place',1);
  45. $list = Db::name('store_banner')
  46. ->field('id,cover,link')
  47. ->where(['is_deleted'=>0,'place'=>$place])
  48. ->limit(0,$num)
  49. ->order('sort desc ,id desc')
  50. ->select();
  51. $this->success('ok',['list'=>$list]);
  52. }
  53. /**
  54. * @title 获取首页小菜单
  55. * @desc 获取首页小菜单
  56. * @author qc
  57. * @url /api/Expedite/getIndexMenu
  58. * @method GET
  59. * @header name:Authorization require:1 desc:Token
  60. * @param name:num type:int default:5 desc:查询数量
  61. * @return name:logo type:srting default:-- desc:图片路径
  62. * @return name:link type:srting default:-- desc:跳转链接
  63. */
  64. public function getIndexMenu()
  65. {
  66. $list = MallMenu::where('is_deleted',0)->select()->toArray();
  67. $this->success('ok',$list);
  68. }
  69. /**
  70. * @title 获取商品分类(四级)
  71. * @desc 获取商品分类(四级)
  72. * @author qc
  73. * @url /api/Expedite/getGoodsCate
  74. * @method GET
  75. * @header name:Authorization require:1 desc:Token
  76. * @return name:id type:int default:-- desc:分类id
  77. * @return name:title type:srting default:-- desc:标题
  78. * @return name:logo type:srting default:-- desc:图片路径
  79. * @return name:lev type:srting default:-- desc:分类等级(1,2,3,4)
  80. * @return name:children type:array default:-- desc:下级分类(数据同上)
  81. */
  82. public function getGoodsCate()
  83. {
  84. $list = GoodsCate::getCateTree();
  85. $this->success('ok',['list'=>$list]);
  86. }
  87. /**
  88. * @title 获取商品列表
  89. * @desc 获取商品列表
  90. * @author qc
  91. * @url /api/Expedite/getGoodsList
  92. * @method GET
  93. * @header name:Authorization require:1 desc:Token
  94. * @param name:page type:int default:1 desc:页数
  95. * @param name:page_num type:int default:20 desc:每页数
  96. * @param name:goods_name type:string require:0 default:-- desc:商品名称
  97. * @param name:first_classify type:int require:0 default:-- desc:一级分类id
  98. * @param name:second_classify type:int require:0 default:-- desc:二级分类id
  99. * @param name:third_classify type:int require:0 default:-- desc:三级分类id
  100. * @param name:fourth_classify type:int require:0 default:-- desc:四级分类id
  101. * @return name:name type:string default:-- desc:商品名称
  102. * @return name:cover type:string default:-- desc:商品封面图
  103. * @return name:desc type:string default:-- desc:商品简述(副标题)
  104. * @return name:low_price type:float default:-- desc:最低售价
  105. * @return name:low_original type:float default:-- desc:最低原价格
  106. * @return name:detail type:int default:-- desc:商品详情
  107. * @return name:first_classify type:int require:0 default:-- desc:一级分类id
  108. * @return name:second_classify type:int require:0 default:-- desc:二级分类id
  109. * @return name:third_classify type:int require:0 default:-- desc:三级分类id
  110. * @return name:fourth_classify type:int require:0 default:-- desc:四级分类id
  111. * @return name:freight_type type:int default:-- desc:运费类型0固定金额,1运费模板
  112. * @return name:freight_id type:int default:-- desc:模板id(freight_type=1)
  113. * @return name:postage type:float default:-- desc:运费(freight_type=0)
  114. * @return name:share_money type:float default:-- desc:分享返利金额
  115. * @return name:source_pic type:string default:-- desc:商品溯源图(多张)
  116. * @return name:goods_match type:string default:-- desc:商品搭配推荐(多个用|隔开)
  117. * @return name:item_list type:array default:-- desc:商品多规格列表
  118. * @return name:item_list.spec_info type:array default:-- desc:规格型号设置['规格组id'=>'规格id','规格组id'=>'规格id'];
  119. * @return name:item_list.goods_no type:string default:-- desc:规格货号
  120. * @return name:item_list.goods_title:string default:-- desc:规格标题
  121. * @return name:item_list.cover type:string default:-- desc:规格封面
  122. * @return name:item_list.stock type:int default:-- desc:剩余库存
  123. * @return name:item_list.original_price type:float default:-- desc:原价
  124. * @return name:item_list.sell_price type:float default:-- desc:售价
  125. * @return name:item_list.sell_price type:float default:-- desc:售价
  126. * @return name:first_classify_name type:int require:0 default:-- desc:一级分类名
  127. * @return name:second_classify_name type:int require:0 default:-- desc:二级分类名
  128. * @return name:third_classify_name type:int require:0 default:-- desc:三级分类名
  129. * @return name:fourth_classify_name type:int require:0 default:-- desc:四级分类名
  130. */
  131. public function getGoodsList(){
  132. $all_cate = GoodsCate::field('id,title')->select()->toArray();
  133. $all_cate = array_column($all_cate,null,'id');
  134. $input = input('get.');
  135. $sel_where = [];
  136. $sel_where[] = ['status','=',1];
  137. $sel_where[] = ['is_deleted','=',0];
  138. if(isset_full($input,'goods_name'))$sel_where[] = ['name','like',"%".$input['goods_name']."%"];
  139. if(isset_full($input,'first_classify'))$sel_where[] = ['first_classify','=',$input['first_classify']];
  140. if(isset_full($input,'second_classify'))$sel_where[] = ['second_classify','=',$input['second_classify']];
  141. if(isset_full($input,'third_classify'))$sel_where[] = ['third_classify','=',$input['third_classify']];
  142. if(isset_full($input,'fourth_classify'))$sel_where[] = ['fourth_classify','=',$input['fourth_classify']];
  143. $list = StoreGoods::with(['itemList'])->where($sel_where)->limit($this->off_set,$this->page_num)->select()->toArray();
  144. foreach ($list as &$v){
  145. $v['first_classify_name'] = isset($all_cate[$v['first_classify']]['title']) ? $all_cate[$v['first_classify']]['title']:'';
  146. $v['second_classify_name'] = isset($all_cate[$v['second_classify']]['title']) ? $all_cate[$v['second_classify']]['title']:'';
  147. $v['third_classify_name'] = isset($all_cate[$v['third_classify']]['title']) ? $all_cate[$v['third_classify']]['title']:'';
  148. $v['fourth_classify_name'] = isset($all_cate[$v['fourth_classify']]['title']) ?$all_cate[$v['fourth_classify']]['title']:'';
  149. $v['low_original'] = min(array_column($v['item_list'],'original_price'));
  150. $v['low_price'] = min(array_column($v['item_list'],'sell_price'));
  151. }
  152. $this->success('ok',['list'=>$list]);
  153. }
  154. /**
  155. * @title 获取商品详情
  156. * @desc 获取商品详情
  157. * @author qc
  158. * @url /api/Expedite/getGoodsDetail
  159. * @method GET
  160. * @header name:Authorization require:1 desc:Token
  161. * @param name:goods_id type:int require:1 default:0 desc:商品id
  162. * @return name:name type:string default:-- desc:商品名称
  163. * @return name:cover type:string default:-- desc:商品封面图
  164. * @return name:desc type:string default:-- desc:商品简述(副标题)
  165. * @return name:low_price type:float default:-- desc:最低价格
  166. * @return name:max_price type:float default:-- desc:最高价格(下划线公用)
  167. * @return name:low_seckill type:float default:-- desc:最低秒杀价格(有秒杀活动)
  168. * @return name:low_group type:float default:-- desc:最低拼团价格(有拼团活动)
  169. * @return name:low_discount type:float default:-- desc:最低折扣价格(有折扣活动)
  170. * @return name:discount type:float default:-- desc:商品折扣(没有折扣为10,有折扣活动,例如75折,值为7.5)
  171. * @return name:freight_type type:int default:-- desc:运费类型0固定金额,1运费模板
  172. * @return name:freight_id type:int default:-- desc:模板id(freight_type=1)
  173. * @return name:postage type:float default:-- desc:运费(freight_type=0)
  174. * @return name:is_collect type:int default:-- desc:是否收藏(1是0否)
  175. * @return name:share_money type:float default:-- desc:分享返利金额
  176. * @return name:source_pic type:string default:-- desc:商品溯源图(多张)
  177. * @return name:goods_match type:string default:-- desc:商品搭配推荐(多个用|隔开)
  178. * @return name:remark_title type:array default:-- desc:评论标签(数组)
  179. * @return name:serve_title type:array default:-- desc:服务标签(数组)
  180. * @return name:item_list type:array default:-- desc:商品多规格列表
  181. * @return name:item_list.spec_info type:array default:-- desc:规格型号设置;
  182. * @return name:item_list.goods_no type:string default:-- desc:规格货号
  183. * @return name:item_list.goods_title:string default:-- desc:规格标题
  184. * @return name:item_list.cover type:string default:-- desc:规格封面
  185. * @return name:item_list.stock type:int default:-- desc:剩余库存
  186. * @return name:item_list.original_price type:float default:-- desc:原价
  187. * @return name:item_list.sell_price type:float default:-- desc:售价
  188. * @return name:item_list.seckill_price type:float default:-- desc:秒杀价(没有秒杀活动则=售价)
  189. * @return name:goods_param type:array default:-- desc:商品相关参数
  190. * @return name:goods_param.title type:string default:-- desc:参数名
  191. * @return name:goods_param.value type:string default:-- desc:参数值
  192. * @return name:seckill type:array default:-- desc:秒杀活动详情(为空:商品没有正在进行的秒杀活动)
  193. * @return name:seckill.start_time type:string default:-- desc:开始时间
  194. * @return name:seckill.end_time type:string default:-- desc:结束时间
  195. * @return name:group type:array default:-- desc:拼团活动
  196. * @return name:group.start_time type:string default:-- desc:开始时间
  197. * @return name:group.end_time type:string default:-- desc:结束时间
  198. * @return name:group.full_num type:int default:-- desc:成团人数
  199. * @return name:discount_act type:array default:-- desc:折扣活动
  200. * @return name:discount_act.id type:array default:-- desc:折扣活动id
  201. *
  202. */
  203. public function getGoodsDetail()
  204. {
  205. $goods_id = input('goods_id');
  206. if($this->user_id)UserTrack::createTrack($this->user_id,1,$goods_id);
  207. $detail = StoreGoods::with(['itemList'])->field('g.*,p.goods_param')->alias('g')->leftJoin('GoodsParam p','g.id = p.goods_id')->where('g.id',$goods_id)->find()->toArray();
  208. if(isset($detail['goods_param']) && !empty($detail['goods_param'])) $detail['goods_param'] = json_decode($detail['goods_param'],true);
  209. $detail['max_price'] = max(array_column($detail['item_list'],'original_price'));
  210. $detail['remark_title'] = RemarkLabel::getRemarkLabelTitle($detail['remark_label']);
  211. $detail['serve_title'] = GoodsServe::getServeLabelTitle($detail['serve_label']);
  212. $goods_act = Activity::goodsActivityList($goods_id);
  213. $detail['discount'] = 10;
  214. foreach ($detail['item_list'] as $ik=>&$iv)
  215. {
  216. $iv['seckill_price'] = $iv['sell_price'];
  217. $iv['group_price'] = $iv['sell_price'];
  218. $iv['discount_price'] = $iv['sell_price'];
  219. // 秒杀
  220. if(!empty($goods_act['seckill']['goods'])){
  221. foreach ($goods_act['seckill']['goods']['item'] as $sv){
  222. if($sv['spec_id'] == $iv['id']){
  223. $iv['seckill_price'] = $sv['seckill_price'];
  224. break;
  225. }
  226. }
  227. }
  228. // 拼团
  229. if(!empty($goods_act['group']['goods'])){
  230. foreach ($goods_act['group']['goods']['item'] as $gv){
  231. if($gv['spec_id'] == $iv['id']){
  232. $iv['group_price'] = $gv['group_price'];
  233. break;
  234. }
  235. }
  236. }
  237. // 折扣活动
  238. if(!empty($goods_act['discount']['act'])){
  239. $detail['discount'] = bcdiv($goods_act['discount']['act']['discount'],10,1);
  240. $iv['discount_price'] = bcmul($iv['sell_price'],$goods_act['discount']['act']['discount']/100,2);
  241. }
  242. }
  243. $detail['low_seckill'] = min(array_column($detail['item_list'],'seckill_price'));
  244. $detail['low_group'] = min(array_column($detail['item_list'],'group_price'));
  245. $detail['low_discount'] = min(array_column($detail['item_list'],'discount_price'));
  246. $detail['is_collect'] = UserCollect::checkCollectByType($this->user_id,1,$goods_id);
  247. $this->success('oK',['goods_info'=>$detail,'seckill'=>$goods_act['seckill']['act'],'group'=>$goods_act['group']['act'],'discount_act'=>$goods_act['discount']['act']]);
  248. }
  249. /**
  250. * @title 获取商品评论
  251. * @desc 获取商品评论
  252. * @author qc
  253. * @url /api/Expedite/getGoodsComment
  254. * @method GET
  255. * @header name:Authorization require:1 desc:Token
  256. * @param name:page type:int default:1 desc:页数
  257. * @param name:page_num type:int : default:20 desc:每页数
  258. * @param name:goods_id type:string require:0 default:-- desc:商品名称
  259. * @param name:create_at type:string require:0 default:-- desc:时间
  260. * @param name:spec_id type:string require:0 default:-- desc:规格id
  261. * @param name:sort_type type:int require:0 default:-- desc:排序(1,时间,2商品评分,3物流评分,4服务评分)
  262. * @param name:order_by type:int require:0 default:2 desc:排序规则(1升序,2降序)
  263. * @param name:type type:int require:0 default:0 desc:查询类型(0全部,1有图片)
  264. * @return name:spec_id type:string require:0 default:-- desc:规格id
  265. * @return name:content type:string default:-- desc:内容
  266. * @return name:images type:string default:-- desc:图片
  267. * @return name:video type:string default:-- desc:视频
  268. * @return name:goods_core type:int default:-- desc:商品评分
  269. * @return name:wl_core type:int default:-- desc:物流评分
  270. * @return name:serve_core type:int default:-- desc:服务评分
  271. * @return name:user type:array default:-- desc:会员信息
  272. * @return name:user.name type:string default:-- desc:会员名
  273. * @return name:user.headimg type:string default:-- desc:会员头像
  274. * @return name:total type:int default:-- desc:总评论数量
  275. */
  276. public function getGoodsComment()
  277. {
  278. $goods_id = input('get.goods_id');
  279. $spec_id = input('get.spec_id');
  280. $sort_type = input('get.sort_type',0);
  281. $order_by = input('get.order_by',2);
  282. $type = input('get.type',0);
  283. $oby = $order_by == 1 ?'asc' : 'desc';
  284. $where = [];
  285. $where[] = ['goods_id','=',$goods_id];
  286. if($spec_id) $where[] = ['spec_id','=',$spec_id];
  287. if($type) $where[] = ['images','<>',''];
  288. $sort_arr = ['id','id','goods_core','wl_core','serve_core'];
  289. $total = OrderComment::where($where)->count();
  290. $list = OrderComment::with('user')->where($where)
  291. ->order($sort_arr[$sort_type].' '.$oby)
  292. ->limit($this->off_set,$this->page_num)
  293. ->select();
  294. $this->success('ok',['list'=>$list ? $list->toArray():[],'total'=>$total]);
  295. }
  296. /**
  297. * @title 获取平台文案设置
  298. * @desc 获取平台文案设置
  299. * @author qc
  300. * @url /api/Expedite/getSysConfig
  301. * @method GET
  302. * @param name:search_name type:string default:-- desc:根据下面名称查(不传查全部的)
  303. * @return name:agreement type:string default:-- desc:用户协议
  304. * @return name:about_us type:string default:-- desc:关于我们
  305. * @return name:privacy type:string default:-- desc:隐私政策
  306. * @return name:agent_notice type:string default:-- desc:代理商须知
  307. * @return name:partner_item type:string default:-- desc:分销条款
  308. */
  309. public function getSysConfig(){
  310. $search_name = input('get.search_name');
  311. $con_name = $search_name? [$search_name] : ['agreement','about_us','privacy','agent_notice','partner_item'];
  312. $set = Db::name('system_config')->where('name','in',$con_name)->select();
  313. $ret = [];
  314. foreach ($set as $value) {
  315. $ret[$value['name']]=$value['value'];
  316. }
  317. $this->success('获取成功',$ret);
  318. }
  319. /**
  320. * @title 获取所有的优惠券设置
  321. * @desc 获取所有的优惠券设置
  322. * @author qc
  323. * @method GET
  324. * @url /api/Expedite/getCouponConfig
  325. * @param name:goods_id type:int require:0 default:限制商品id
  326. * @return name:id type:int default:-- desc:会员优惠券记录id
  327. * @return name:coupon_type type:int default:-- desc:优惠券类型0全场券1商品券
  328. * @return name:goods_id type:int default:-- desc:商品id
  329. * @return name:title type:int default:-- desc:标题
  330. * @return name:low_amount type:float default:-- desc:最低消费限制
  331. * @return name:amount type:float default:-- desc:券额
  332. * @return name:time_type type:int default:-- desc:使用时间限制0数限制(low_day)1时间限制(start_tm--end_tm)
  333. * @return name:low_day type:int default:-- desc:限制天数
  334. * @return name:start_tm type:string default:-- desc:开始使用时间
  335. * @return name:end_tm type:string default:-- desc:结束使用时间
  336. * @return name:status type:int default:-- desc:状态 (状态 0:失效 1:正常)
  337. * @return name:create_at type:string default:-- desc:时间
  338. * @return name:num type:int default:-- desc:优惠券总数量
  339. * @return name:user_num type:int default:-- desc:每人限制领取张数0不限制
  340. */
  341. public function getCouponConfig()
  342. {
  343. $goods_id = input('get.goods_id',0);
  344. $where = [];
  345. $where[] = ['is_deleted','=',0];
  346. $where[] = ['status','=',1];
  347. if($goods_id)$where[] = ['goods_id','in',[0,$goods_id]];
  348. $list = CouponConfig::where($where)->order('id desc')->select();
  349. $this->success('ok',['list'=>$list]);
  350. }
  351. /**
  352. * @title 发送短信验证码
  353. * @desc 发送短信验证码
  354. * @author qc
  355. * @url /api/Expedite/sendSms
  356. * @method POST
  357. * @param name:phone type:int require:1 default:-- desc:要获取验证码的手机号
  358. * @return name:code type:string default:-- desc:验证码
  359. */
  360. public function sendSms(){
  361. $phone = input('post.phone');
  362. if(empty($phone)) $this ->error('参数错误');
  363. $code = rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
  364. AlibabaCloud::accessKeyClient('LTAI5t76oDeTRvdNWZjs4oGd', '8Z1zyFjtaF4v9kdjJeWnlFVx3xhtEF')
  365. ->regionId('cn-hangzhou')->asDefaultClient();
  366. try {
  367. $result = AlibabaCloud::rpc()
  368. ->product('Dysmsapi')
  369. ->version('2017-05-25')
  370. ->action('SendSms')
  371. ->method('POST')
  372. ->host('dysmsapi.aliyuncs.com')
  373. ->options([
  374. 'query' => [
  375. 'RegionId' => "cn-hangzhou",
  376. 'PhoneNumbers' => $phone,
  377. 'SignName' => "沐风文化",
  378. 'TemplateCode' => "SMS_233057543",
  379. 'TemplateParam' => json_encode(array("code"=>$code)),
  380. ],
  381. ])->request();
  382. $result = $result->toArray();
  383. if($result['Code'] == "OK") {
  384. $sms_data = array(
  385. 'phone'=>$phone,
  386. 'code'=>$code,
  387. 'result'=>$result['Message']
  388. );
  389. Db::name('store_member_sms')->insert($sms_data);
  390. $this->error('发送成功',$code);
  391. }else{
  392. $this->error('发送失败');
  393. }
  394. } catch (ClientException $e) {
  395. $this->error($e->getErrorMessage() . PHP_EOL);
  396. } catch (ServerException $e) {
  397. $this->error($e->getErrorMessage() . PHP_EOL);
  398. }
  399. }
  400. }