IndexForm.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\client\models\v1;
  8. use app\models\Mch;
  9. use app\models\User;
  10. use app\modules\client\models\v1\diy\DiyTemplateForm;
  11. use yii\base\Model;
  12. class IndexForm extends Model
  13. {
  14. public $store_id;
  15. public $_platform;
  16. public $page_id;
  17. public function search()
  18. {
  19. if($this->page_id) {
  20. $model = new DiyTemplateForm();
  21. $model->store_id = $this->store_id;
  22. $model->attributes = \Yii::$app->request->get();
  23. $res = $model->detail();
  24. if($res['code'] == 0) {
  25. return $res;
  26. } else {
  27. return $res;
  28. }
  29. }
  30. }
  31. private function getBlockList()
  32. {
  33. }
  34. /**
  35. * @param Store $store
  36. */
  37. private function getModuleList($store)
  38. {
  39. $list = json_decode($store->home_page_module, true);
  40. if (!$list) {
  41. $list = [
  42. [
  43. 'name' => 'notice',
  44. ],
  45. [
  46. 'name' => 'banner',
  47. ],
  48. [
  49. 'name' => 'search',
  50. ],
  51. [
  52. 'name' => 'nav',
  53. ],
  54. [
  55. 'name' => 'topic',
  56. ],
  57. [
  58. 'name' => 'coupon',
  59. ],
  60. [
  61. 'name' => 'cat',
  62. ],
  63. ];
  64. } else {
  65. $new_list = [];
  66. foreach ($list as $item) {
  67. if (stripos($item['name'], 'block-') !== false) {
  68. $names = explode('-', $item['name']);
  69. $new_list[] = [
  70. 'name' => $names[0],
  71. 'block_id' => $names[1],
  72. ];
  73. } elseif (stripos($item['name'], 'single_cat-') !== false) {
  74. $names = explode('-', $item['name']);
  75. $new_list[] = [
  76. 'name' => $names[0],
  77. 'cat_id' => $names[1],
  78. ];
  79. } elseif (stripos($item['name'], 'video-') !== false) {
  80. $names = explode('-', $item['name']);
  81. $new_list[] = [
  82. 'name' => $names[0],
  83. 'video_id' => $names[1],
  84. ];
  85. } else {
  86. $new_list[] = $item;
  87. }
  88. }
  89. $list = $new_list;
  90. }
  91. return $list;
  92. }
  93. public function getMiaoshaData()
  94. {
  95. $ms_next = false;
  96. $miaosha = Miaosha::findOne([
  97. 'store_id' => $this->store_id,
  98. ]);
  99. if (!$miaosha) {
  100. return [
  101. 'code' => 1,
  102. 'msg' => '暂无秒杀安排',
  103. ];
  104. }
  105. $miaosha->open_time = json_decode($miaosha->open_time, true);
  106. $list = MiaoshaGoods::find()->alias('mg')
  107. ->select('mg.id,g.name,g.cover_pic AS pic,g.original_price AS price,mg.attr,mg.start_time')
  108. ->leftJoin(['g' => MsGoods::tableName()], 'mg.goods_id=g.id')
  109. ->where([
  110. 'AND',
  111. [
  112. 'mg.is_delete' => 0,
  113. 'g.is_delete' => 0,
  114. 'mg.open_date' => date('Y-m-d'),
  115. 'g.status' => 1,
  116. 'mg.start_time' => date('H'),
  117. 'mg.store_id' => $this->store_id,
  118. ],
  119. ['in','mg.start_time', $miaosha->open_time],
  120. ])
  121. ->orderBy('g.sort ASC,g.created_at DESC')
  122. ->limit(10)
  123. ->asArray()->all();
  124. if (empty($list)) {
  125. $ms_next = true;
  126. $next = MiaoshaGoods::find()->alias('mg')
  127. ->where([
  128. 'AND',
  129. [
  130. 'mg.is_delete' => 0,
  131. 'g.is_delete' => 0,
  132. 'g.status' => 1,
  133. 'mg.store_id' => $this->store_id,
  134. ],
  135. ['=','mg.open_date',date('Y-m-d')],
  136. ['>','mg.start_time', date('H')],
  137. ])->orWhere([
  138. 'AND',
  139. [
  140. 'mg.is_delete' => 0,
  141. 'g.is_delete' => 0,
  142. 'g.status' => 1,
  143. 'mg.store_id' => $this->store_id,
  144. ],
  145. ['>','mg.open_date',date('Y-m-d')],
  146. ])
  147. ->leftJoin(['g' => MsGoods::tableName()], 'mg.goods_id=g.id')
  148. ->orderBy('mg.open_date asc,mg.start_time asc')
  149. ->select('mg.start_time,mg.open_date,mg.id')->one();
  150. $list = MiaoshaGoods::find()->alias('mg')
  151. ->select('mg.id,g.name,g.cover_pic AS pic,g.original_price AS price,mg.attr,mg.start_time,mg.open_date')
  152. ->leftJoin(['g' => MsGoods::tableName()], 'mg.goods_id=g.id')
  153. ->where([
  154. 'AND',
  155. [
  156. 'mg.is_delete' => 0,
  157. 'g.is_delete' => 0,
  158. 'mg.open_date' => $next->open_date,
  159. 'g.status' => 1,
  160. 'mg.start_time' => $next->start_time,
  161. 'mg.store_id' => $this->store_id,
  162. ],
  163. ['in','mg.start_time', $miaosha->open_time],
  164. ])
  165. ->orderBy('mg.open_date asc,mg.start_time asc')
  166. ->limit(10)
  167. ->asArray()
  168. ->all();
  169. }
  170. //////
  171. $startTime = intval(date('H'));
  172. $openDate = time();
  173. foreach ($list as $i => $item) {
  174. $item['attr'] = json_decode($item['attr'], true);
  175. $list[$i] = $item;
  176. $price_list = [];
  177. foreach ($item['attr'] as $attr) {
  178. if ($attr['miaosha_price'] <= 0) {
  179. $price_list[] = doubleval($item['price']);
  180. } else {
  181. $price_list[] = doubleval($attr['miaosha_price']);
  182. }
  183. }
  184. $list[$i]['price'] = number_format($list[$i]['price'], 2, '.', '');
  185. $list[$i]['miaosha_price'] = number_format(min($price_list), 2, '.', '');
  186. unset($list[$i]['attr']);
  187. $startTime = $item['start_time'];
  188. $openDate = strtotime($item['open_date']);
  189. };
  190. $openDate = $openDate>strtotime(date('Y-m-d',time()))?date('m.d',$openDate):'';
  191. if (count($list) == 0){
  192. return [
  193. 'name' => '暂无秒杀活动',
  194. 'rest_time' => 0,
  195. 'goods_list' => null,
  196. ];
  197. }else{
  198. $name = $ms_next?'预告':'';
  199. return [
  200. // 'name' => intval(date('H')) . '点场',
  201. 'name' => $startTime . '点场'.$name,
  202. 'ms_next' => $ms_next,
  203. 'date' => $openDate,
  204. 'rest_time' => max(intval(strtotime(date('Y-m-d ' . $startTime . ':59:59')) - time()), 0),
  205. 'goods_list' => $list,
  206. ];
  207. }
  208. }
  209. public function getPintuanData()
  210. {
  211. $num_query = PtOrderDetail::find()->alias('pod')
  212. ->select('pod.goods_id,SUM(pod.num) AS sale_num')
  213. ->leftJoin(['po' => PtOrder::tableName()], 'pod.order_id=po.id')
  214. ->where([
  215. 'AND',
  216. [
  217. 'pod.is_delete' => 0,
  218. 'po.is_delete' => 0,
  219. 'po.is_pay' => 1,
  220. ],
  221. ])->groupBy('pod.goods_id');
  222. $list = PtGoods::find()->alias('pg')
  223. ->select('pg.*,pod.sale_num')
  224. ->leftJoin(['pod' => $num_query], 'pg.id=pod.goods_id')
  225. ->where([
  226. 'AND',
  227. [
  228. 'pg.is_delete' => 0,
  229. 'pg.status' => 1,
  230. 'pg.store_id' => $this->store_id,
  231. ],
  232. ])->orderBy('pg.is_hot DESC,pg.sort ASC,pg.created_at DESC')
  233. ->limit(10)
  234. ->asArray()->all();
  235. $new_list = [];
  236. foreach ($list as $item) {
  237. $new_list[] = [
  238. 'id' => $item['id'],
  239. 'pic' => $item['cover_pic'],
  240. 'name' => $item['name'],
  241. 'price' => number_format($item['price'], 2, '.', ''),
  242. 'sale_num' => intval($item['sale_num'] ? $item['sale_num'] : 0) + intval($item['virtual_sales'] ? $item['virtual_sales'] : 0),
  243. ];
  244. }
  245. return [
  246. 'goods_list' => $new_list,
  247. ];
  248. }
  249. /**
  250. * 获取首页活动弹窗列表
  251. */
  252. public function getActModalList()
  253. {
  254. $act_list = [];
  255. return $act_list;
  256. $fxhb_act = $this->getFxhbAct();
  257. if ($fxhb_act) {
  258. $act_list[] = $fxhb_act;
  259. }
  260. foreach ($act_list as $i => $item) {
  261. if ($i == 0)
  262. $act_list[$i]['show'] = true;
  263. else
  264. $act_list[$i]['show'] = false;
  265. $act_list[$i]['list'][] = $item;
  266. }
  267. return $act_list;
  268. }
  269. private function getFxhbAct()
  270. {
  271. $act_data = [
  272. 'name' => '一起拆红包',
  273. 'pic_url' => \Yii::$app->request->hostInfo . \Yii::$app->request->baseUrl . '/statics/images/fxhb/act_modal.png',
  274. 'pic_width' => 750,
  275. 'pic_height' => 696,
  276. 'url' => '/pages/fxhb/open/open',
  277. 'open_type' => 'navigate',
  278. 'page_id' => 'fxhb'
  279. ];
  280. $fxhb_setting = FxhbSetting::findOne([
  281. 'store_id' => $this->store_id,
  282. ]);
  283. if (!$fxhb_setting || $fxhb_setting->game_open != 1) {
  284. return null;
  285. }
  286. if ($user = \Yii::$app->user->isGuest) {
  287. return $act_data;
  288. }
  289. /** @var User $user */
  290. $user = get_user_id();
  291. /** @var FxhbHongbao $hongbao */
  292. $hongbao = FxhbHongbao::find()->where([
  293. 'user_id' => $user->id,
  294. 'store_id' => $this->store_id,
  295. 'parent_id' => 0,
  296. 'is_finish' => 0,
  297. 'is_expire' => 0,
  298. ])->one();
  299. if (!$hongbao)
  300. return $act_data;
  301. if (time() > $hongbao->expire_time) {
  302. $hongbao->is_expire = 1;
  303. $hongbao->save();
  304. return $act_data;
  305. }
  306. return null;
  307. }
  308. public function getYuyueData()
  309. {
  310. $list = YyGoods::find()->where(['store_id' => $this->store_id, 'is_delete' => 0, 'status' => 1])
  311. ->select(['id', 'name', 'cover_pic', 'price'])
  312. ->limit(10)->orderBy(['sort' => SORT_ASC])->asArray()->all();
  313. return $list;
  314. }
  315. public function getMchList()
  316. {
  317. $list = Mch::find()->where([
  318. 'store_id' => $this->store_id,
  319. 'is_delete' => 0,
  320. 'is_open' => 1,
  321. 'is_lock' => 0,
  322. 'is_recommend' => 1,
  323. ])->select('id,name,logo')
  324. ->orderBy('sort ASC,addtime DESC')->limit(10)
  325. ->asArray()->all();
  326. return $list ? $list : [];
  327. }
  328. private function getUrl($url)
  329. {
  330. preg_match('/^[^\?+]\?([\w|\W]+)=([\w|\W]*?)&([\w|\W]+)=([\w|\W]*?)$/', $url, $res);
  331. return $res;
  332. }
  333. }