Store.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. <?php
  2. /**
  3. *
  4. * @author: xaboy<365615158@qq.com>
  5. * @day: 2017/12/12
  6. */
  7. namespace app\wap\controller;
  8. use app\admin\model\system\SystemConfig;
  9. use app\wap\model\store\StoreBargain;
  10. use app\wap\model\store\StoreBargainUser;
  11. use app\wap\model\store\StoreBargainUserHelp;
  12. use app\wap\model\store\StoreCategory;
  13. use app\wap\model\store\StoreCoupon;
  14. use app\wap\model\store\StoreSeckill;
  15. use app\wap\model\store\StoreCouponIssue;
  16. use app\wap\model\store\StoreCouponIssueUser;
  17. use app\wap\model\store\StoreCouponUser;
  18. use app\wap\model\store\StorePink;
  19. use app\wap\model\store\StoreProductReply;
  20. use app\wap\model\store\StoreCart;
  21. use app\wap\model\store\StoreOrder;
  22. use app\wap\model\store\StoreProduct;
  23. use app\wap\model\store\StoreProductAttr;
  24. use app\wap\model\store\StoreProductRelation;
  25. use app\wap\model\user\User;
  26. use app\wap\model\user\WechatUser;
  27. use app\wap\model\store\StoreCombination;
  28. use app\core\util\GroupDataService;
  29. use app\core\util\SystemConfigService;
  30. use service\UtilService;
  31. use think\Cache;
  32. use think\Request;
  33. use think\Url;
  34. use service\JsonService;
  35. class Store extends AuthController
  36. {
  37. public function index($keyword = '',$cid = '',$sid = '')
  38. {
  39. if($keyword != '') $keyword = base64_decode($keyword);
  40. $keyword = addslashes($keyword);
  41. $cid = intval($cid);
  42. $sid = intval($sid);
  43. $category = null;
  44. if($sid)
  45. $category = StoreCategory::get($sid);
  46. if($cid && !$category)
  47. $category = StoreCategory::get($cid);
  48. $this->assign(compact('keyword','cid','sid','category'));
  49. return $this->fetch();
  50. }
  51. public function category()
  52. {
  53. $_category = StoreCategory::all(function($query){
  54. $query->field('id,pid,cate_name')->where('is_show',1)->order('sort DESC');
  55. })->toArray();
  56. $category = [];
  57. foreach ($_category as $c){
  58. if(!$c['pid']){
  59. $c['child'] = [];
  60. $category[$c['id']] = $c;
  61. }
  62. }
  63. foreach ($_category as $c){
  64. if($c['pid']){
  65. $category[$c['pid']]['child'][] = $c;
  66. }
  67. }
  68. foreach ($category as $key => $value) {
  69. if(!isset($value['id'])){
  70. unset($category[$key]);
  71. }
  72. }
  73. $this->assign(compact('category'));
  74. return $this->fetch();
  75. }
  76. public function issue_coupon()
  77. {
  78. $list = $list = StoreCouponIssue::validWhere('A')->join('__STORE_COUPON__ B','A.cid = B.id')
  79. ->field('A.*,B.coupon_price,B.use_min_price')->order('B.sort DESC,A.id DESC')->select()->toArray();
  80. $sort = [];
  81. $lists= [];
  82. foreach ($list as &$v){
  83. $v['add_time'] = date('Y/m/d',$v['add_time']);
  84. $v['end_time'] = date('Y/m/d',$v['end_time']);
  85. if((int)$v['is_permanent']==0 && $v['remain_count'] >0){
  86. $sort[] = $v['is_get'] = StoreCouponIssueUser::be(['uid'=>$this->userInfo['uid'],'issue_coupon_id'=>$v['id']]) ? 1:0;
  87. array_push($lists,$v);
  88. }
  89. else if((int)$v['is_permanent']==1){
  90. $sort[] = $v['is_get'] = StoreCouponIssueUser::be(['uid'=>$this->userInfo['uid'],'issue_coupon_id'=>$v['id']]) ? 1:0;
  91. array_push($lists,$v);
  92. }
  93. }
  94. array_multisort($sort,SORT_ASC,SORT_NUMERIC,$lists);
  95. $this->assign(compact('lists'));
  96. return $this->fetch();
  97. }
  98. public function detail($id = 0)
  99. {
  100. if(!$id || !($storeInfo = StoreProduct::getValidProduct($id))) return $this->failed('商品不存在或已下架!');
  101. $storeInfo['userLike'] = StoreProductRelation::isProductRelation($id,$this->userInfo['uid'],'like');
  102. $storeInfo['like_num'] = StoreProductRelation::productRelationNum($id,'like');
  103. $storeInfo['userCollect'] = StoreProductRelation::isProductRelation($id,$this->userInfo['uid'],'collect');
  104. list($productAttr,$productValue) = StoreProductAttr::getProductAttrDetail($id);
  105. setView($this->userInfo['uid'],$id,$storeInfo['cate_id'],'viwe');
  106. $urlShare = SystemConfigService::get('site_url').Url::build('wap/Store/detail',['id'=>$id,'spuid'=>$this->uid]);
  107. $this->assign([
  108. 'urlShare'=>$urlShare,
  109. 'storeInfo'=>$storeInfo,
  110. 'similarity'=>StoreProduct::cateIdBySimilarityProduct($storeInfo['cate_id'],'id,store_name,image,price,sales,ficti',4),
  111. 'productAttr'=>$productAttr,
  112. 'productValue'=>$productValue,
  113. 'reply'=>StoreProductReply::getRecProductReply($storeInfo['id']),
  114. 'replyCount'=>StoreProductReply::productValidWhere()->where('product_id',$storeInfo['id'])->count(),
  115. 'mer_id' => StoreProduct::where('id',$storeInfo['id'])->value('mer_id')
  116. ]);
  117. return $this->fetch();
  118. }
  119. public function reply_list($productId = '')
  120. {
  121. if(!$productId || !is_numeric($productId)) return $this->failed('商品不存在!');
  122. $this->assign([
  123. 'productId'=>$productId,
  124. 'replyCount'=>StoreProductReply::productValidWhere()->where('product_id',$productId)->count(),
  125. 'picReplyCount'=>StoreProductReply::productValidWhere()->where('product_id',$productId)->where('pics',['<>',''],['<>','[]'])->count()
  126. ]);
  127. return $this->fetch();
  128. }
  129. public function cart()
  130. {
  131. return $this->fetch();
  132. }
  133. public function confirm_order($cartId = '')
  134. {
  135. if(!is_string($cartId) || !$cartId ){
  136. return $this->failed('请提交购买的商品!');
  137. }
  138. $cartGroup = StoreCart::getUserProductCartList($this->userInfo['uid'],$cartId,1);
  139. if(count($cartGroup['invalid']))
  140. return $this->failed($cartGroup['invalid'][0]['productInfo']['store_name'].'已失效!');
  141. if(!$cartGroup['valid']) return $this->failed('请提交购买的商品!');
  142. $cartInfo = $cartGroup['valid'];
  143. $priceGroup = StoreOrder::getOrderPriceGroup($cartInfo);
  144. $other = [
  145. 'offlinePostage'=>SystemConfigService::get('offline_postage'),
  146. 'integralRatio'=>SystemConfigService::get('integral_ratio')
  147. ];
  148. $usableCoupon = StoreCouponUser::beUsableCoupon($this->userInfo['uid'],$priceGroup['totalPrice']);
  149. $cartIdA = explode(',',$cartId);
  150. $seckill_id=0;
  151. $bargain_id=0;
  152. if(count($cartIdA) == 1){
  153. $cartInfoMark = StoreCart::where('id',$cartId)->find();
  154. if((int)$cartInfoMark['seckill_id']>0) $seckill_id = $cartInfoMark['seckill_id'];
  155. else if((int)$cartInfoMark['bargain_id']>0) $bargain_id = $cartInfoMark['bargain_id'];
  156. else $seckill_id=0;
  157. }
  158. $this->assign([
  159. 'usableCoupon'=>$usableCoupon,
  160. 'seckill_id'=>$seckill_id,
  161. 'bargain_id'=>$bargain_id,
  162. 'cartInfo'=>$cartInfo,
  163. 'priceGroup'=>$priceGroup,
  164. 'orderKey'=>StoreOrder::cacheOrderInfo($this->userInfo['uid'],$cartInfo,$priceGroup,$other),
  165. 'offlinePostage'=>$other['offlinePostage'],
  166. 'userInfo'=>User::getUserInfo($this->userInfo['uid']),
  167. 'integralRatio'=>$other['integralRatio']
  168. ]);
  169. return $this->fetch();
  170. }
  171. public function combination(){
  172. $where = array();
  173. $store_combination = StoreCombination::getAll(0,20);
  174. $this->assign('list',$store_combination);
  175. return $this->fetch();
  176. }
  177. //获取列表
  178. public function get_list(){
  179. return JsonService::successful(StoreCombination::get_list(20));
  180. }
  181. public function combination_detail($id = 0){
  182. if(!$id) return $this->failed('拼团不存在或已下架');
  183. $combinationOne = StoreCombination::getCombinationOne($id);
  184. if(!$combinationOne) return $this->failed('拼团不存在或已下架');
  185. $combinationOne['images'] = json_decode($combinationOne['images'],true);
  186. $combinationOne['userLike'] = StoreProductRelation::isProductRelation($combinationOne['product_id'],$this->userInfo['uid'],'like');
  187. $combinationOne['like_num'] = StoreProductRelation::productRelationNum($combinationOne['product_id'],'like');
  188. $combinationOne['userCollect'] = StoreProductRelation::isProductRelation($combinationOne['product_id'],$this->userInfo['uid'],'collect');
  189. $pink = StorePink::getPinkAll($id);//拼团列表
  190. setView($this->userInfo['uid'],$id,$combinationOne['cate_id'],'viwe','combination');
  191. StoreCombination::editIncBrowse($id);
  192. $pindAll = array();
  193. foreach ($pink as $k=>$v){
  194. $pink[$k]['count'] = StorePink::getPinkPeople($v['id'],$v['people']);
  195. $pink[$k]['h'] = date('H',$v['stop_time']);
  196. $pink[$k]['i'] = date('i',$v['stop_time']);
  197. $pink[$k]['s'] = date('s',$v['stop_time']);
  198. $pindAll[] = $v['id'];//开团团长ID
  199. }
  200. $user = WechatUser::get($this->uid)->toArray();//用户信息
  201. $site_name = SystemConfig::getValue('site_name');//网站名称
  202. $site_logo = SystemConfig::getValue('site_logo');//网站LOGO
  203. $wechat_qrcode = SystemConfig::getValue('wechat_qrcode');//公众号二维码
  204. $this->assign([
  205. 'pink'=>$pink,
  206. 'user'=>$user,
  207. 'site_name'=>$site_name,
  208. 'site_logo'=>$site_logo,
  209. 'wechat_qrcode'=>str_replace('\\','/',$wechat_qrcode),
  210. 'pindAll'=>$pindAll,
  211. 'storeInfo'=>$combinationOne,
  212. 'reply'=>StoreProductReply::getRecProductReply($combinationOne['product_id']),
  213. 'replyCount'=>StoreProductReply::productValidWhere()->where('product_id',$combinationOne['product_id'])->count(),
  214. 'mer_id' => StoreProduct::where('id',$combinationOne['product_id'])->value('mer_id')
  215. ]);
  216. return $this->fetch();
  217. }
  218. public function combination_order(Request $request){
  219. $data = UtilService::getMore([
  220. ['cartId',0],
  221. ['pinkId',0],
  222. ],$request);
  223. if($data['pinkId']) if(StorePink::getIsPinkUid($data['pinkId'])) return $this->redirect(Url::build('my/order',['uni'=>StoreOrder::getStoreIdPink($data['pinkId'])]));
  224. if($data['pinkId']) if(StoreOrder::getIsOrderPink($data['pinkId'])) return $this->redirect(Url::build('my/order',['uni'=>StoreOrder::getStoreIdPink($data['pinkId'])]));;
  225. $cartId = $data['cartId'];
  226. $pinkId = $data['pinkId'];
  227. if(!is_string($cartId) || !$cartId )
  228. return $this->failed('请提交购买的商品!');
  229. $cartGroup = StoreCart::getUserCombinationProductCartList($this->userInfo['uid'],$cartId);
  230. if(count($cartGroup['invalid']))
  231. return $this->failed($cartGroup['invalid'][0]['productInfo']['store_name'].'已失效!');
  232. if(!$cartGroup['valid']) return $this->failed('请提交购买的商品!');
  233. $cartInfo = $cartGroup['valid'];
  234. foreach ($cartInfo as $k=>$cart){
  235. if($cart['combination_id']){
  236. $cartInfo[$k]['productInfo']['price'] = StoreCombination::where('id',$cart['combination_id'])->value('price');
  237. $cartInfo[$k]['productInfo']['image'] = StoreCombination::where('id',$cart['combination_id'])->value('image');
  238. $cartInfo[$k]['productInfo']['slider_image'] = json_decode(StoreCombination::where('id',$cart['combination_id'])->value('images'),true);
  239. }
  240. }
  241. $priceGroup = StoreOrder::getCombinationOrderPriceGroup($cartInfo);
  242. $other = [
  243. 'offlinePostage'=>SystemConfigService::get('offline_postage'),
  244. 'integralRatio'=>SystemConfigService::get('integral_ratio')
  245. ];
  246. $this->assign([
  247. 'cartInfo'=>$cartInfo,
  248. 'priceGroup'=>$priceGroup,
  249. 'orderKey'=>StoreOrder::cacheOrderInfo($this->userInfo['uid'],$cartInfo,$priceGroup,$other),
  250. 'offlinePostage'=>$other['offlinePostage'],
  251. 'userInfo'=>User::getUserInfo($this->userInfo['uid']),
  252. 'integralRatio'=>$other['integralRatio'],
  253. 'pinkId'=>$pinkId
  254. ]);
  255. return $this->fetch();
  256. }
  257. /**
  258. * 秒杀列表页
  259. *
  260. */
  261. public function seckill_index(){
  262. $storeSeckill=StoreSeckill::where('is_del',0)->where('status',1)->where('start_time','<',time())->where('stop_time','>',time())->order('sort desc')->select()->toArray();
  263. $this->assign('seckillProduct',$storeSeckill);
  264. return $this->fetch();
  265. }
  266. /**
  267. * 秒杀详情页
  268. * @param string $id
  269. */
  270. public function seckill_detail($id = ''){
  271. if(!$id || !($storeInfo = StoreSeckill::getValidProduct($id))) return $this->failed('商品不存在或已下架!');
  272. $storeInfo['userLike'] = StoreProductRelation::isProductRelation($storeInfo['id'],$this->userInfo['uid'],'like','product_seckill');
  273. $storeInfo['like_num'] = StoreProductRelation::productRelationNum($storeInfo['id'],'like','product_seckill');
  274. $storeInfo['userCollect'] = StoreProductRelation::isProductRelation($storeInfo['id'],$this->userInfo['uid'],'collect','product_seckill');
  275. list($productAttr,$productValue) = StoreProductAttr::getProductAttrDetail($storeInfo['product_id']);
  276. $wechatInfo = WechatUser::get($this->userInfo['uid']);
  277. setView($this->userInfo['uid'],$id,$storeInfo['product_id'],'viwe','seckill');
  278. //是否关注
  279. if(!$wechatInfo) $isFollow = 0;
  280. else $isFollow = $wechatInfo['subscribe'];
  281. $this->assign([
  282. 'storeInfo'=>$storeInfo,
  283. // 'similarity'=>StoreProduct::cateIdBySimilarityProduct($storeInfo['cate_id'],'id,store_name,image,price,sales',4),
  284. 'productAttr'=>$productAttr,
  285. 'productValue'=>$productValue,
  286. 'reply'=>StoreProductReply::getRecProductReply($storeInfo['product_id']),
  287. 'replyCount'=>StoreProductReply::productValidWhere()->where('product_id',$storeInfo['product_id'])->count(),
  288. 'mer_id' => 0,
  289. 'merchant'=>null,
  290. 'site'=>SystemConfigService::more(['wechat_qrcode','wechat_name','wechat_avatar']),
  291. 'isFollow'=>$isFollow
  292. ]);
  293. // var_dump(SystemConfigService::more(['wechat_qrcode','wechat_name','wechat_avatar']));die;
  294. return $this->fetch();
  295. }
  296. public function cut_list(){
  297. $bargain = StoreBargain::getList();
  298. $bargain = StoreBargainUser::getUserList($bargain);
  299. $bargainUser = StoreBargainUser::getBargainUserStatusSuccess();
  300. $this->assign([
  301. 'bargain'=>$bargain,
  302. 'bargainUser'=>$bargainUser,
  303. ]);
  304. return $this->fetch();
  305. }
  306. public function cut_con($id = 0,$bargainUid = 0){
  307. if(!$id) return $this->failed('参数错误');
  308. //砍价产品
  309. $bargain = StoreBargain::getBargainTerm($id);
  310. $bargain['time'] = time();
  311. $description = isset($bargain['description'])?htmlspecialchars_decode($bargain['description']):'';
  312. $rule = isset($bargain['rule']) ? htmlspecialchars_decode($bargain['rule']) : '';
  313. if(!$bargainUid)
  314. //判断当前登录人是不是砍价
  315. if(!StoreBargainUser::isBargainUser($id,$this->userInfo['uid']))
  316. // 参与砍价
  317. if(!StoreBargainUser::setBargain($id,$this->userInfo['uid'])) return $this->failed('参与失败,请重新参与砍价',Url::build('store/bargain'));
  318. //顶部人数
  319. StoreBargain::addBargainLook($id);
  320. $lookCount = StoreBargain::getBargainLook()['look'];//观看人数
  321. $shareCount = StoreBargain::getBargainShare()['share'];//观看人数
  322. //砍价
  323. $selfCut = 0;
  324. if(!$bargainUid){
  325. $res = StoreBargainUserHelp::setBargainUserHelp($id,$bargainUid ? $bargainUid : $this->userInfo['uid'],$this->userInfo['uid']);
  326. if($res) {
  327. $selfCut = 1;
  328. if(!StoreBargainUserHelp::getSurplusPrice($id,$bargainUid ? $bargainUid : $this->userInfo['uid'])){
  329. $bargainUserTableId = StoreBargainUser::getBargainUserTableId($id,$bargainUid ? $bargainUid : $this->userInfo['uid']);
  330. $bargain = StoreBargain::where('id',$id)->find()->toArray();
  331. $bargainUser = StoreBargainUser::where('id',$bargainUserTableId)->find()->toArray();
  332. }
  333. }
  334. $userInfoBargain = $this->userInfo;
  335. }else $userInfoBargain = User::getUserInfo($bargainUid);
  336. //砍价帮
  337. $bargainUserTableId = StoreBargainUser::setUserBargain($id,$bargainUid ? $bargainUid : $this->userInfo['uid']);
  338. $storeBargainUserHelp = StoreBargainUserHelp::getList($bargainUserTableId,15);
  339. //获取砍价帮总人数
  340. $count = StoreBargainUserHelp::getBargainUserHelpPeopleCount($id,$bargainUid ? $bargainUid : $this->userInfo['uid']);
  341. //获取用户还剩余的砍价金额
  342. $price = StoreBargainUserHelp::getSurplusPrice($id,$bargainUid ? $bargainUid : $this->userInfo['uid']);
  343. //获取砍价进度条
  344. $pricePercent = StoreBargainUserHelp::getSurplusPricePercent($id,$bargainUid ? $bargainUid : $this->userInfo['uid']);
  345. $selfCutPrice = bcsub(bcsub($bargain['price'],$price,2),$bargain['min_price'],2);
  346. //判断当前登录人是否砍价 1 微砍价 2 已砍价
  347. $userInfoBargainBool = StoreBargainUserHelp::isBargainUserHelpCount($id,$bargainUid,$this->userInfo['uid']) ? 1 : 2;
  348. $this->assign([
  349. 'userInfoBargainBool'=>$userInfoBargainBool,
  350. 'selfCut'=>$selfCut,
  351. 'userInfoBargain'=>$userInfoBargain,
  352. 'selfCutPrice'=>$selfCutPrice,
  353. 'bargain'=>$bargain,
  354. 'description'=>$description,
  355. 'rule'=>$rule,
  356. 'shareCount'=>$shareCount,
  357. 'lookCount'=>$lookCount,
  358. 'userCount'=>StoreBargainUser::count(),
  359. 'userHelpList'=>$storeBargainUserHelp,
  360. 'count'=>$count,
  361. 'price'=>$price,
  362. 'pricePercent'=>$pricePercent,
  363. 'bargainUid'=>$bargainUid,
  364. ]);
  365. return $this->fetch();
  366. }
  367. }