Expedite.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  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\GoodsSeason;
  10. use app\common\model\GoodsSellInfo;
  11. use app\common\model\GoodsServe;
  12. use app\common\model\GoodsTerritory;
  13. use app\common\model\MallMenu;
  14. use app\common\model\OrderComment;
  15. use app\common\model\RemarkLabel;
  16. use app\common\model\StoreGoods;
  17. use app\common\model\StoreGoodsItem;
  18. use app\common\model\TopSearch;
  19. use app\common\model\UserCollect;
  20. use app\common\model\UserTrack;
  21. use app\common\service\Activity;
  22. use think\Db;
  23. /**
  24. * @title 不需要验证token接口(商品列表等)
  25. * @controller Expedite
  26. * @package app\api\controller
  27. */
  28. class Expedite extends Base
  29. {
  30. public function initialize(){
  31. parent::initialize();
  32. parent::setUid();
  33. }
  34. /**
  35. * @title 获取首页轮播图(广告位)
  36. * @desc 获取首页轮播图(广告位)
  37. * @author qc
  38. * @url /api/Expedite/getBanner
  39. * @method GET
  40. * @header name:Authorization require:1 desc:Token
  41. * @param name:place type:int default:1 desc:展示位置1商城首页2营养百科3视频专栏4商城商品5商城活动6商城分类7商城广告8预售
  42. * @param name:num type:int default:5 desc:查询数量
  43. * @return name:cover type:srting default:-- desc:图片路径
  44. * @return name:link type:srting default:-- desc:链接
  45. */
  46. public function getBanner()
  47. {
  48. $num = input('get.num',5);
  49. $place = input('get.place',1);
  50. $list = Db::name('store_banner')
  51. ->field('id,cover,link')
  52. ->where(['is_deleted'=>0,'place'=>$place])
  53. ->limit(0,$num)
  54. ->order('sort desc ,id desc')
  55. ->select();
  56. $this->success('ok',['list'=>$list]);
  57. }
  58. /**
  59. * @title 获取首页小菜单
  60. * @desc 获取首页小菜单
  61. * @author qc
  62. * @url /api/Expedite/getIndexMenu
  63. * @method GET
  64. * @header name:Authorization require:1 desc:Token
  65. * @param name:num type:int default:5 desc:查询数量
  66. * @return name:logo type:srting default:-- desc:图片路径
  67. * @return name:link type:srting default:-- desc:跳转链接
  68. */
  69. public function getIndexMenu()
  70. {
  71. $list = MallMenu::where('is_deleted',0)->select()->toArray();
  72. $this->success('ok',$list);
  73. }
  74. /**
  75. * @title 获取商品分类(四级)
  76. * @desc 获取商品分类(四级)
  77. * @author qc
  78. * @url /api/Expedite/getGoodsCate
  79. * @method GET
  80. * @header name:Authorization require:1 desc:Token
  81. * @return name:id type:int default:-- desc:分类id
  82. * @return name:title type:srting default:-- desc:标题
  83. * @return name:logo type:srting default:-- desc:图片路径
  84. * @return name:lev type:srting default:-- desc:分类等级(1,2,3,4)
  85. * @return name:children type:array default:-- desc:下级分类(数据同上)
  86. */
  87. public function getGoodsCate()
  88. {
  89. $list = GoodsCate::getCateTree();
  90. $this->success('ok',['list'=>$list]);
  91. }
  92. /**
  93. * @title 获取商品第一级分类
  94. * @desc 获取商品第一级分类
  95. * @author qc
  96. * @url /api/Expedite/getGoodsCate
  97. * @method GET
  98. * @header name:Authorization require:1 desc:Token
  99. * @return name:id type:int default:-- desc:分类id
  100. * @return name:title type:srting default:-- desc:标题
  101. * @return name:logo type:srting default:-- desc:图片路径
  102. * @return name:lev type:srting default:-- desc:分类等级
  103. */
  104. public function getFirstClassify()
  105. {
  106. $list = GoodsCate::field('id,title,logo,lev')->where('lev',1)->select()->toArray();
  107. $this->success('ok',['list'=>$list]);
  108. }
  109. /**
  110. * @title 获取商品时令设置(二级)
  111. * @desc 获取商品时令设置(二级)
  112. * @author qc
  113. * @url /api/Expedite/getGoodsSeason
  114. * @method GET
  115. * @header name:Authorization require:1 desc:Token
  116. * @return name:id type:int default:-- desc:分类id
  117. * @return name:title type:srting default:-- desc:标题
  118. * @return name:lev type:srting default:-- desc:分类等级(1,2)
  119. * @return name:children type:array default:-- desc:下级分类(数据同上)
  120. */
  121. public function getGoodsSeason()
  122. {
  123. $list = GoodsSeason::getSeasonTree();
  124. $this->success('ok',['list'=>$list]);
  125. }
  126. /**
  127. * @title 获取商品地域设置(二级)
  128. * @desc 获取商品地域设置(二级)
  129. * @author qc
  130. * @url /api/Expedite/getGoodsTerritory
  131. * @method GET
  132. * @header name:Authorization require:1 desc:Token
  133. * @return name:id type:int default:-- desc:分类id
  134. * @return name:title type:srting default:-- desc:标题
  135. * @return name:lev type:srting default:-- desc:分类等级(1,2)
  136. * @return name:children type:array default:-- desc:下级分类(数据同上)
  137. */
  138. public function getGoodsTerritory()
  139. {
  140. $list = GoodsTerritory::getTerritoryTree();
  141. $this->success('ok',['list'=>$list]);
  142. }
  143. /**
  144. * @title 获取商品列表
  145. * @desc 获取商品列表
  146. * @author qc
  147. * @url /api/Expedite/getGoodsList
  148. * @method GET
  149. * @header name:Authorization require:1 desc:Token
  150. * @param name:page type:int default:1 desc:页数
  151. * @param name:page_num type:int default:20 desc:每页数
  152. * @param name:goods_name type:string require:0 default:-- desc:商品名称
  153. * @param name:first_classify type:int require:0 default:-- desc:一级分类id
  154. * @param name:second_classify type:int require:0 default:-- desc:二级分类id
  155. * @param name:third_classify type:int require:0 default:-- desc:三级分类id
  156. * @param name:fourth_classify type:int require:0 default:-- desc:四级分类id
  157. * @param name:is_presell type:int require:0 default:0 desc:是否是预售(0否1是)
  158. * @param name:first_season type:int require:0 default:-- desc:第一级时令id
  159. * @param name:second_season type:int require:0 default:-- desc:第二级时令id
  160. * @param name:first_territory type:int require:0 default:-- desc:第一级地域id
  161. * @param name:second_territory type:int require:0 default:-- desc:第二级地域id
  162. * @param name:column_id type:int require:0 default:-- desc:推荐专栏id
  163. * @param name:is_zx type:int require:0 default:-1 desc:是否是产地直销(-1全部,0否,1是)
  164. * @return name:name type:string default:-- desc:商品名称
  165. * @return name:cover type:string default:-- desc:商品封面图
  166. * @return name:desc type:string default:-- desc:商品简述(副标题)
  167. * @return name:low_price type:float default:-- desc:最低售价
  168. * @return name:low_original type:float default:-- desc:最低原价格
  169. * @return name:total_num type:int default:-- desc:商品总数量
  170. * @return name:detail type:int default:-- desc:商品详情
  171. * @return name:first_classify type:int require:0 default:-- desc:一级分类id
  172. * @return name:second_classify type:int require:0 default:-- desc:二级分类id
  173. * @return name:third_classify type:int require:0 default:-- desc:三级分类id
  174. * @return name:fourth_classify type:int require:0 default:-- desc:四级分类id
  175. * @return name:freight_type type:int default:-- desc:运费类型0固定金额,1运费模板
  176. * @return name:freight_id type:int default:-- desc:模板id(freight_type=1)
  177. * @return name:postage type:float default:-- desc:运费(freight_type=0)
  178. * @return name:share_money type:float default:-- desc:分享返利金额
  179. * @return name:source_pic type:string default:-- desc:商品溯源图(多张)
  180. * @return name:goods_match type:string default:-- desc:商品搭配推荐(多个用|隔开)
  181. * @return name:item_list type:array default:-- desc:商品多规格列表
  182. * @return name:item_list.spec_info type:array default:-- desc:规格型号设置['规格组id'=>'规格id','规格组id'=>'规格id'];
  183. * @return name:item_list.goods_no type:string default:-- desc:规格货号
  184. * @return name:item_list.goods_title:string default:-- desc:规格标题
  185. * @return name:item_list.cover type:string default:-- desc:规格封面
  186. * @return name:item_list.stock type:int default:-- desc:剩余库存
  187. * @return name:item_list.original_price type:float default:-- desc:原价
  188. * @return name:item_list.sell_price type:float default:-- desc:售价
  189. * @return name:item_list.sell_price type:float default:-- desc:售价
  190. * @return name:first_classify_name type:int require:0 default:-- desc:一级分类名
  191. * @return name:second_classify_name type:int require:0 default:-- desc:二级分类名
  192. * @return name:third_classify_name type:int require:0 default:-- desc:三级分类名
  193. * @return name:fourth_classify_name type:int require:0 default:-- desc:四级分类名
  194. * @return name:is_presell type:int require:0 default:-- desc:是否是预售商品(0否1是)
  195. * @return name:sell_time type:string require:0 default:-- desc:预售时间
  196. * @return name:first_season type:int require:0 default:0 desc:第一级时令id
  197. * @return name:second_season type:int require:0 default:0 desc:第二级时令id
  198. * @return name:first_territory type:int require:0 default:0 desc:第一级地域id
  199. * @return name:second_territory type:int require:0 default:0 desc:第二级地域id
  200. * @return name:first_season_name type:string require:0 default:0 desc:第一级时令名称
  201. * @return name:second_season_name type:string require:0 default:0 desc:第二级时令名称
  202. * @return name:first_territory_name type:string require:0 default:0 desc:第一级地域名称
  203. * @return name:second_territory_name type:string require:0 default:0 desc:第二级地域名称
  204. */
  205. public function getGoodsList(){
  206. $all_cate = GoodsCate::field('id,title')->select()->toArray();
  207. $all_cate = array_column($all_cate,null,'id');
  208. $all_season = GoodsSeason::field('id,title')->select()->toArray();
  209. $all_season = array_column($all_season,null,'id');
  210. $all_territory= GoodsTerritory::field('id,title')->select()->toArray();
  211. $all_territory = array_column($all_territory,null,'id');
  212. $input = input('get.');
  213. $sel_where = [];
  214. $sel_where[] = ['status','=',1];
  215. $sel_where[] = ['is_deleted','=',0];
  216. if(isset_full($input,'goods_name'))$sel_where[] = ['name','like',"%".$input['goods_name']."%"];
  217. if(isset_full($input,'first_classify'))$sel_where[] = ['first_classify','=',$input['first_classify']];
  218. if(isset_full($input,'second_classify'))$sel_where[] = ['second_classify','=',$input['second_classify']];
  219. if(isset_full($input,'third_classify'))$sel_where[] = ['third_classify','=',$input['third_classify']];
  220. if(isset_full($input,'fourth_classify'))$sel_where[] = ['fourth_classify','=',$input['fourth_classify']];
  221. if(isset_full($input,'first_season'))$sel_where[] = ['first_season','=',$input['first_season']];
  222. if(isset_full($input,'second_season'))$sel_where[] = ['second_season','=',$input['second_season']];
  223. if(isset_full($input,'first_territory'))$sel_where[] = ['first_territory','=',$input['first_territory']];
  224. if(isset_full($input,'second_territory'))$sel_where[] = ['second_territory','=',$input['second_territory']];
  225. if(isset_full($input,'column_id'))$sel_where[] = ['column_id','=',$input['column_id']];
  226. if(isset($input['is_zx']) && $input['is_zx'] >=0 ) $sel_where[] = ['is_zx','=',$input['is_zx']];
  227. if(isset_full($input,'is_presell')){
  228. $sel_where[] = ['is_presell','=',$input['is_presell']];
  229. }else{
  230. $sel_where[] = ['is_presell','=',0];
  231. }
  232. $list = StoreGoods::with(['itemList'])->where($sel_where)->limit($this->off_set,$this->page_num)->select()->toArray();
  233. foreach ($list as &$v){
  234. $v['first_classify_name'] = isset($all_cate[$v['first_classify']]['title']) ? $all_cate[$v['first_classify']]['title']:'';
  235. $v['second_classify_name'] = isset($all_cate[$v['second_classify']]['title']) ? $all_cate[$v['second_classify']]['title']:'';
  236. $v['third_classify_name'] = isset($all_cate[$v['third_classify']]['title']) ? $all_cate[$v['third_classify']]['title']:'';
  237. $v['fourth_classify_name'] = isset($all_cate[$v['fourth_classify']]['title']) ?$all_cate[$v['fourth_classify']]['title']:'';
  238. $v['low_original'] = min(array_column($v['item_list'],'original_price'));
  239. $v['low_price'] = min(array_column($v['item_list'],'sell_price'));
  240. $v['first_season_name'] = isset($all_season[$v['first_season']]['title']) ? $all_season[$v['first_season']]['title']:'';
  241. $v['second_season_name'] = isset($all_season[$v['second_season']]['title']) ? $all_season[$v['second_season']]['title']:'';
  242. $v['first_territory_name'] = isset($all_territory[$v['first_territory']]['title']) ? $all_territory[$v['first_territory']]['title']:'';
  243. $v['second_territory_name'] = isset($all_territory[$v['second_territory']]['title']) ? $all_territory[$v['second_territory']]['title']:'';
  244. $v['total_num'] = array_sum(array_column($v['item_list'],'base_stock'));
  245. }
  246. $this->success('ok',['list'=>$list]);
  247. }
  248. /**
  249. * @title 获取商品详情
  250. * @desc 获取商品详情
  251. * @author qc
  252. * @url /api/Expedite/getGoodsDetail
  253. * @method GET
  254. * @header name:Authorization require:1 desc:Token
  255. * @param name:goods_id type:int require:1 default:0 desc:商品id
  256. * @return name:name type:string default:-- desc:商品名称
  257. * @return name:cover type:string default:-- desc:商品封面图
  258. * @return name:desc type:string default:-- desc:商品简述(副标题)
  259. * @return name:low_price type:float default:-- desc:最低价格
  260. * @return name:max_price type:float default:-- desc:最高价格(下划线公用)
  261. * @return name:low_seckill type:float default:-- desc:最低秒杀价格(有秒杀活动)
  262. * @return name:low_group type:float default:-- desc:最低拼团价格(有拼团活动)
  263. * @return name:low_discount type:float default:-- desc:最低折扣价格(有折扣活动)
  264. * @return name:discount type:float default:-- desc:商品折扣(没有折扣为10,有折扣活动,例如75折,值为7.5)
  265. * @return name:freight_type type:int default:-- desc:运费类型0固定金额,1运费模板
  266. * @return name:freight_id type:int default:-- desc:模板id(freight_type=1)
  267. * @return name:postage type:float default:-- desc:运费(freight_type=0)
  268. * @return name:is_collect type:int default:-- desc:是否收藏(1是0否)
  269. * @return name:effect type:string default:-- desc:商品功效(多个用|隔开)
  270. * @return name:explain type:string default:-- desc:商品说明(使用说明)
  271. * @return name:share_money type:float default:-- desc:分享返利金额
  272. * @return name:source_pic type:string default:-- desc:商品溯源图(多张)
  273. * @return name:goods_match type:string default:-- desc:商品搭配推荐(多个用|隔开)
  274. * @return name:remark_title type:array default:-- desc:评论标签(数组)
  275. * @return name:serve_title type:array default:-- desc:服务标签(数组)
  276. * @return name:is_presell type:int require:0 default:-- desc:是否是预售商品(0否1是,预售商品不加购物)
  277. * @return name:sell_time type:string require:0 default:-- desc:预售时间
  278. * @return name:first_season type:int require:0 default:0 desc:第一级时令id
  279. * @return name:second_season type:int require:0 default:0 desc:第二级时令id
  280. * @return name:first_territory type:int require:0 default:0 desc:第一级地域id
  281. * @return name:second_territory type:int require:0 default:0 desc:第二级地域id
  282. * @return name:first_season_name type:string require:0 default:0 desc:第一级时令名称
  283. * @return name:second_season_name type:string require:0 default:0 desc:第二级时令名称
  284. * @return name:first_territory_name type:string require:0 default:0 desc:第一级地域名称
  285. * @return name:second_territory_name type:string require:0 default:0 desc:第二级地域名称
  286. * @return name:item_list type:array default:-- desc:商品多规格列表
  287. * @return name:item_list.spec_info type:array default:-- desc:规格型号设置;
  288. * @return name:item_list.goods_no type:string default:-- desc:规格货号
  289. * @return name:item_list.goods_title:string default:-- desc:规格标题
  290. * @return name:item_list.cover type:string default:-- desc:规格封面
  291. * @return name:item_list.stock type:int default:-- desc:剩余库存
  292. * @return name:item_list.original_price type:float default:-- desc:原价
  293. * @return name:item_list.sell_price type:float default:-- desc:售价
  294. * @return name:item_list.seckill_price type:float default:-- desc:秒杀价(没有秒杀活动则=售价)
  295. * @return name:goods_param type:array default:-- desc:商品相关参数
  296. * @return name:goods_param.title type:string default:-- desc:参数名
  297. * @return name:goods_param.value type:string default:-- desc:参数值
  298. * @return name:seckill type:array default:-- desc:秒杀活动详情(为空:商品没有正在进行的秒杀活动)
  299. * @return name:seckill.start_time type:string default:-- desc:开始时间
  300. * @return name:seckill.end_time type:string default:-- desc:结束时间
  301. * @return name:group type:array default:-- desc:拼团活动
  302. * @return name:group.start_time type:string default:-- desc:开始时间
  303. * @return name:group.end_time type:string default:-- desc:结束时间
  304. * @return name:group.full_num type:int default:-- desc:成团人数
  305. * @return name:discount_act type:array default:-- desc:折扣活动
  306. * @return name:discount_act.id type:array default:-- desc:折扣活动id
  307. *
  308. */
  309. public function getGoodsDetail()
  310. {
  311. $goods_id = input('goods_id');
  312. if($this->user_id)UserTrack::createTrack($this->user_id,1,$goods_id);
  313. $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();
  314. if(isset($detail['goods_param']) && !empty($detail['goods_param'])) $detail['goods_param'] = json_decode($detail['goods_param'],true);
  315. $detail['max_price'] = max(array_column($detail['item_list'],'original_price'));
  316. $detail['remark_title'] = RemarkLabel::getRemarkLabelTitle($detail['remark_label']);
  317. $detail['serve_title'] = GoodsServe::getServeLabelTitle($detail['serve_label']);
  318. $detail['first_season_name'] ='';
  319. $detail['first_season_name'] ='';
  320. $detail['first_territory_name'] ='';
  321. $detail['first_season_name'] ='';
  322. if($detail['first_season']) $detail['first_season_name'] = GoodsSeason::where('id',$detail['first_season'])->value('title');
  323. if($detail['second_season']) $detail['second_season_name'] = GoodsSeason::where('id',$detail['second_season'])->value('title');
  324. if($detail['first_territory']) $detail['first_territory_name'] = GoodsTerritory::where('id',$detail['first_territory'])->value('title');
  325. if($detail['second_territory']) $detail['second_territory_name'] = GoodsTerritory::where('id',$detail['second_territory'])->value('title');
  326. $goods_act = Activity::goodsActivityList($goods_id);
  327. $detail['discount'] = 10;
  328. foreach ($detail['item_list'] as $ik=>&$iv)
  329. {
  330. $iv['seckill_price'] = $iv['sell_price'];
  331. $iv['group_price'] = $iv['sell_price'];
  332. $iv['discount_price'] = $iv['sell_price'];
  333. // 秒杀
  334. if(!empty($goods_act['seckill']['goods'])){
  335. foreach ($goods_act['seckill']['goods']['item'] as $sv){
  336. if($sv['spec_id'] == $iv['id']){
  337. $iv['seckill_price'] = $sv['seckill_price'];
  338. break;
  339. }
  340. }
  341. }
  342. // 拼团
  343. if(!empty($goods_act['group']['goods'])){
  344. foreach ($goods_act['group']['goods']['item'] as $gv){
  345. if($gv['spec_id'] == $iv['id']){
  346. $iv['group_price'] = $gv['group_price'];
  347. break;
  348. }
  349. }
  350. }
  351. // 折扣活动
  352. if(!empty($goods_act['discount']['act'])){
  353. $detail['discount'] = bcdiv($goods_act['discount']['act']['discount'],10,1);
  354. $iv['discount_price'] = bcmul($iv['sell_price'],$goods_act['discount']['act']['discount']/100,2);
  355. }
  356. }
  357. $detail['low_seckill'] = min(array_column($detail['item_list'],'seckill_price'));
  358. $detail['low_group'] = min(array_column($detail['item_list'],'group_price'));
  359. $detail['low_discount'] = min(array_column($detail['item_list'],'discount_price'));
  360. $detail['is_collect'] = UserCollect::checkCollectByType($this->user_id,1,$goods_id);
  361. $this->success('oK',['goods_info'=>$detail,'seckill'=>$goods_act['seckill']['act'],'group'=>$goods_act['group']['act'],'discount_act'=>$goods_act['discount']['act']]);
  362. }
  363. /**
  364. * @title 获取商品评论
  365. * @desc 获取商品评论
  366. * @author qc
  367. * @url /api/Expedite/getGoodsComment
  368. * @method GET
  369. * @header name:Authorization require:1 desc:Token
  370. * @param name:page type:int default:1 desc:页数
  371. * @param name:page_num type:int : default:20 desc:每页数
  372. * @param name:goods_id type:string require:0 default:-- desc:商品名称
  373. * @param name:create_at type:string require:0 default:-- desc:时间
  374. * @param name:spec_id type:string require:0 default:-- desc:规格id
  375. * @param name:sort_type type:int require:0 default:-- desc:排序(1,时间,2商品评分,3物流评分,4服务评分)
  376. * @param name:order_by type:int require:0 default:2 desc:排序规则(1升序,2降序)
  377. * @param name:type type:int require:0 default:0 desc:查询类型(0全部,1有图片)
  378. * @return name:spec_id type:string require:0 default:-- desc:规格id
  379. * @return name:content type:string default:-- desc:内容
  380. * @return name:images type:string default:-- desc:图片
  381. * @return name:video type:string default:-- desc:视频
  382. * @return name:goods_core type:int default:-- desc:商品评分
  383. * @return name:wl_core type:int default:-- desc:物流评分
  384. * @return name:serve_core type:int default:-- desc:服务评分
  385. * @return name:user type:array default:-- desc:会员信息
  386. * @return name:user.name type:string default:-- desc:会员名
  387. * @return name:user.headimg type:string default:-- desc:会员头像
  388. * @return name:total type:int default:-- desc:总评论数量
  389. */
  390. public function getGoodsComment()
  391. {
  392. $goods_id = input('get.goods_id');
  393. $spec_id = input('get.spec_id');
  394. $sort_type = input('get.sort_type',0);
  395. $order_by = input('get.order_by',2);
  396. $type = input('get.type',0);
  397. $oby = $order_by == 1 ?'asc' : 'desc';
  398. $where = [];
  399. $where[] = ['goods_id','=',$goods_id];
  400. if($spec_id) $where[] = ['spec_id','=',$spec_id];
  401. if($type) $where[] = ['images','<>',''];
  402. $sort_arr = ['id','id','goods_core','wl_core','serve_core'];
  403. $total = OrderComment::where($where)->count();
  404. $list = OrderComment::with('user')->where($where)
  405. ->order($sort_arr[$sort_type].' '.$oby)
  406. ->limit($this->off_set,$this->page_num)
  407. ->select();
  408. $this->success('ok',['list'=>$list ? $list->toArray():[],'total'=>$total]);
  409. }
  410. /**
  411. * @title 获取平台文案设置
  412. * @desc 获取平台文案设置
  413. * @author qc
  414. * @url /api/Expedite/getSysConfig
  415. * @method GET
  416. * @param name:search_name type:string default:-- desc:根据下面名称查(不传查全部的)
  417. * @return name:agreement type:string default:-- desc:用户协议
  418. * @return name:about_us type:string default:-- desc:关于我们
  419. * @return name:privacy type:string default:-- desc:隐私政策
  420. * @return name:agent_notice type:string default:-- desc:代理商须知
  421. * @return name:partner_item type:string default:-- desc:分销条款
  422. * @return name:refund_desc type:string default:-- desc:退款退货说明
  423. * @return name:user_equity type:string default:-- desc:会员权益
  424. * @return name:integral_channel type:string default:-- desc:积分渠道
  425. * @return name:sign_rule type:string default:-- desc:签到规则
  426. * @return name:write_off type:string default:-- desc:注销须知
  427. */
  428. public function getSysConfig(){
  429. $search_name = input('get.search_name');
  430. $con_name = $search_name? [$search_name] : ['agreement','about_us','privacy','agent_notice','partner_item','refund_desc','user_equity','integral_channel','sign_rule','write_off'];
  431. $set = Db::name('system_config')->where('name','in',$con_name)->select();
  432. $ret = [];
  433. foreach ($set as $value) {
  434. $ret[$value['name']]=$value['value'];
  435. }
  436. $this->success('获取成功',$ret);
  437. }
  438. /**
  439. * @title 获取所有的优惠券设置
  440. * @desc 获取所有的优惠券设置
  441. * @author qc
  442. * @method GET
  443. * @url /api/Expedite/getCouponConfig
  444. * @param name:goods_id type:int require:0 default:限制商品id
  445. * @return name:id type:int default:-- desc:会员优惠券记录id
  446. * @return name:coupon_type type:int default:-- desc:优惠券类型0全场券1商品券
  447. * @return name:goods_id type:int default:-- desc:商品id
  448. * @return name:title type:int default:-- desc:标题
  449. * @return name:low_amount type:float default:-- desc:最低消费限制
  450. * @return name:amount type:float default:-- desc:券额
  451. * @return name:time_type type:int default:-- desc:使用时间限制0数限制(low_day)1时间限制(start_tm--end_tm)
  452. * @return name:low_day type:int default:-- desc:限制天数
  453. * @return name:start_tm type:string default:-- desc:开始使用时间
  454. * @return name:end_tm type:string default:-- desc:结束使用时间
  455. * @return name:status type:int default:-- desc:状态 (状态 0:失效 1:正常)
  456. * @return name:create_at type:string default:-- desc:时间
  457. * @return name:num type:int default:-- desc:优惠券总数量
  458. * @return name:user_num type:int default:-- desc:每人限制领取张数0不限制
  459. */
  460. public function getCouponConfig()
  461. {
  462. $goods_id = input('get.goods_id',0);
  463. $where = [];
  464. $where[] = ['is_deleted','=',0];
  465. $where[] = ['status','=',1];
  466. if($goods_id)$where[] = ['goods_id','in',[0,$goods_id]];
  467. $list = CouponConfig::where($where)->order('id desc')->select();
  468. $this->success('ok',['list'=>$list]);
  469. }
  470. /**
  471. * @title 发送短信验证码
  472. * @desc 发送短信验证码
  473. * @author qc
  474. * @url /api/Expedite/sendSms
  475. * @method POST
  476. * @param name:phone type:int require:1 default:-- desc:要获取验证码的手机号
  477. * @return name:code type:string default:-- desc:验证码
  478. */
  479. public function sendSms(){
  480. $phone = input('post.phone');
  481. if(empty($phone)) $this ->error('参数错误');
  482. $code = rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
  483. AlibabaCloud::accessKeyClient('LTAI5tEEfowhMkLu8auo6n6G', 'ch94CL3TEwNAxXNREweZl3gfk8jQ84')
  484. ->regionId('cn-hangzhou')->asDefaultClient();
  485. try {
  486. $result = AlibabaCloud::rpc()
  487. ->product('Dysmsapi')
  488. ->version('2017-05-25')
  489. ->action('SendSms')
  490. ->method('POST')
  491. ->host('dysmsapi.aliyuncs.com')
  492. ->options([
  493. 'query' => [
  494. 'RegionId' => "cn-hangzhou",
  495. 'PhoneNumbers' => $phone,
  496. 'SignName' => "康养食品",
  497. 'TemplateCode' => "SMS_241155218",
  498. 'TemplateParam' => json_encode(array("code"=>$code)),
  499. ],
  500. ])->request();
  501. $result = $result->toArray();
  502. if($result['Code'] == "OK") {
  503. $sms_data = array(
  504. 'phone'=>$phone,
  505. 'code'=>$code,
  506. 'result'=>$result['Message']
  507. );
  508. Db::name('store_member_sms')->insert($sms_data);
  509. $this->success('发送成功',$code);
  510. }else{
  511. $this->error('发送失败');
  512. }
  513. } catch (ClientException $e) {
  514. $this->error($e->getErrorMessage() . PHP_EOL);
  515. } catch (ServerException $e) {
  516. $this->error($e->getErrorMessage() . PHP_EOL);
  517. }
  518. }
  519. /**
  520. * @title 获取商品热搜设置
  521. * @desc 获取商品热搜设置
  522. * @author qc
  523. * @url /api/Expedite/goodsTopSearch
  524. * @method GET
  525. * @return name:title type:string default:-- desc:标题
  526. */
  527. public function goodsTopSearch()
  528. {
  529. $list = TopSearch::field('id,title')->where(['status'=>1,'is_deleted'=>0])->order('sort desc,id desc')->select()->toArray();
  530. $this->success('ok',['list'=>$list]);
  531. }
  532. /**
  533. * @title 获取热销商品
  534. * @desc 获取热销商品
  535. * @author qc
  536. * @url /api/Expedite/getHotSell
  537. * @method GET
  538. * @return name:goods_id type:int default:-- desc:商品id
  539. * @return name:name type:string default:-- desc:商品名
  540. * @return name:cover type:string default:-- desc:商品图片
  541. * @return name:low_price type:float default:-- desc:最低价
  542. * @return name:line_money type:float default:-- desc:下划线价格
  543. */
  544. public function getHotSell()
  545. {
  546. $sel_time = date('Y-m-d H:i:s',strtotime('-70 days'));
  547. $list = GoodsSellInfo::field('i.goods_id,sum(i.num) total_num,g.name,g.cover,g.low_price')->where('i.create_at','> time',$sel_time)
  548. ->alias('i')
  549. ->leftJoin('StoreGoods g','g.id = i.goods_id')
  550. ->group('i.goods_id')
  551. ->order('total_num desc')
  552. ->limit(0,20)
  553. ->select()->toArray();
  554. array_walk($list,function (&$v){
  555. $v['line_money'] = StoreGoodsItem::where(['goods_id'=>$v['goods_id']])->max('original_price');
  556. });
  557. $this->success('ok',['list'=>$list]);
  558. }
  559. }