StoreAdminForm.php 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\client\models\v1\store;
  8. use app\constants\AdminPickLink;
  9. use app\models\Admin;
  10. use app\models\BrowseLog;
  11. use app\models\Cart;
  12. use app\models\Cat;
  13. use app\models\Goods;
  14. use app\models\Option;
  15. use app\models\Order;
  16. use app\models\OrderDetail;
  17. use app\models\OrderGoodsCancel;
  18. use app\models\OrderRefund;
  19. use app\models\Store;
  20. use app\models\StoreMini;
  21. use app\models\User;
  22. use app\models\UserShareLog;
  23. use EasyWeChat\Factory;
  24. use EasyWeChat\Kernel\BaseClient;
  25. use yii\base\Model;
  26. use yii\db\Expression;
  27. use app\modules\admin\models\MchForm;
  28. use app\plugins\scanCodePay\models\Order as ScanCodePayOrder;
  29. class StoreAdminForm extends Model
  30. {
  31. public $mch_id = 0;
  32. public $date_range;
  33. public $start_date;
  34. public $end_date;
  35. public $wechat;
  36. public $type;
  37. public $tab;
  38. public $logo;
  39. public $name;
  40. public $coordinate;
  41. public $address;
  42. public function rules()
  43. {
  44. return [
  45. [['start_date', 'end_date', 'type', 'tab'], 'integer'],
  46. [['mch_id'], 'safe'],
  47. [['logo', 'name', 'coordinate', 'address'], 'string']
  48. ];
  49. }
  50. public function storeInfo(){
  51. /**
  52. * 判断是否为管理员
  53. * 店铺logo 店铺名称 店铺管理员
  54. * 访客数 今昨日
  55. * 订单数量 今昨日
  56. * 成交金额 今昨日
  57. * 补货通知[]
  58. * 待付款数量 待发货数量 待售后数量 待评价数量 待处理数量
  59. **/
  60. try {
  61. //店铺logo 店铺名称
  62. // $admin = Admin::findOne(['type' => 'store', 'type_id' => get_store_id()]);
  63. // if ((int)$admin->saas_user_id !== (int)get_saas_user_id()) {
  64. // throw new \Exception("非店铺管理员");
  65. // }
  66. $store_info = Store::find()->where(['id' => get_store_id()])->select('id, name, logo')->asArray()->one();
  67. $saas_name = !empty(get_saas_user()->name) ? get_saas_user()->name : "未设置";
  68. //店铺管理员名称
  69. $store_info['user_name'] = $saas_name;
  70. $whereMch = [];
  71. if($this->mch_id){
  72. $whereMch = ['mch_id' => $this->mch_id];
  73. $mch_info = (new MchForm(['mch_id' => $this->mch_id]))->mchInfo();
  74. }
  75. //获取昨日凌晨时间
  76. $yet = strtotime(date('Y-m-d')) - (60 * 60 * 24);
  77. //获取今日凌晨时间
  78. $td = strtotime(date('Y-m-d'));
  79. //获取明日凌晨时间
  80. $tot = strtotime(date('Y-m-d')) + (60 * 60 * 24);
  81. $timestamp = time();
  82. $day = [
  83. 'begin_date' => date('Ymd', $timestamp),
  84. 'end_date' => date('Ymd', $timestamp),
  85. ];
  86. $lastday = [
  87. 'begin_date' => date('Ymd', strtotime("-1 day", $timestamp)),
  88. 'end_date' => date('Ymd', strtotime("-1 day", $timestamp)),
  89. ];
  90. //访客数
  91. //今日访客
  92. $today_visit = $this->getVisit($day);
  93. //昨日访客
  94. $yes_visit = $this->getVisit($lastday);
  95. //订单数
  96. $order_query = Order::find()->where(['is_delete' => 0, 'store_id' => get_store_id(), 'is_show'=>1])->andWhere(
  97. [
  98. 'trade_status' => [
  99. Order::ORDER_FLOW_NO_SEND,
  100. Order::ORDER_FLOW_SEND,
  101. Order::ORDER_FLOW_CONFIRM
  102. ],
  103. 'is_pay' => Order::IS_PAY_TRUE
  104. ]
  105. )->andWhere($whereMch)->select('id, trade_status, created_at');
  106. //成交额
  107. $money_query = clone $order_query;
  108. //今日订单数
  109. $order_count = (clone $order_query)->andWhere(['>', 'created_at', $td])->count();
  110. //昨日订单数
  111. $yet_order_count = (clone $order_query)->andWhere(['and', ['>', 'created_at', $yet], ['<','created_at', $td]])->count();
  112. //成交额
  113. $money_count = (float)(clone $order_query)->andWhere(['>', 'created_at', $td])->sum('pay_price');
  114. //昨日成交额
  115. $yet_money_count = (clone $order_query)->andWhere(['and', ['>','created_at',$yet], ['<','created_at',$td]])->sum('pay_price');
  116. //通知
  117. $goods = Goods::find()->where(['store_id' => get_store_id(), 'status' => 1, 'is_delete' => 0])->andWhere($whereMch)->select('id, goods_num, attr, use_attr, goods_no')->asArray()->all();
  118. $arr = [];
  119. $i = 0;
  120. foreach($goods as $item){
  121. // 判断无规格商品的总库存
  122. if ($item['goods_num'] * 1 < 10 && $item['use_attr'] == 0) {
  123. $arr[$i]['id'] = $item['id'];
  124. $arr[$i]['notice'] = 'id:' . $item['id'] . ' 货号:' . $item['goods_no'] . "库存不足,请及时补货";
  125. $i++;
  126. }
  127. // 判断有规格商品的总库存
  128. if ($item['use_attr'] != 0 && !empty($item['attr'])) {
  129. $attrs = json_decode($item['attr'],true);
  130. foreach($attrs as $attr){
  131. if ($attr['num']*1 < 10) {
  132. $arr[$i]['id'] = $item['id'];
  133. $arr[$i]['notice'] = 'id:' . $item['id'] . ' 货号:' . $attr['no'] . '规格:' . $attr['attr_list'][0]['attr_name'] . "库存不足,请及时补货";
  134. $i++;
  135. }
  136. }
  137. }
  138. }
  139. $notice = $arr;
  140. //订单
  141. $order_query = Order::find()->where(['store_id'=>get_store_id(), 'is_delete'=>0, 'is_show'=>1])->andWhere($whereMch);
  142. //待付款
  143. $pay_order = $order_query->andWhere(['OR', ['is_pay' => Order::IS_PAY_FALSE, 'trade_status' => Order::ORDER_FLOW_DEFAULT], ['AND', ['is_pay' => Order::IS_PAY_FALSE, 'pay_type' => Order::PAY_TYPE_COD], ['<>', 'trade_status', Order::ORDER_FLOW_CANCEL]]])->count();
  144. //待发货
  145. $send_order = Order::find()->where(['store_id'=>get_store_id(), 'is_delete'=>0, 'is_show'=>1])->andWhere($whereMch)->andWhere(['OR', ['trade_status' => Order::ORDER_FLOW_NO_SEND], ['is_pay' => Order::IS_PAY_FALSE, 'pay_type' => Order::PAY_TYPE_COD, 'trade_status' => Order::ORDER_FLOW_DEFAULT]])->count();
  146. //待售后
  147. // $after_sale_order = Order::find()->where(['store_id'=>get_store_id(), 'is_delete'=>0, 'is_sale'=>0, 'is_show'=>1])->andWhere(['or', ['trade_status'=>2], ['trade_status'=>3]])->count();
  148. $after_sale_order = OrderRefund::find()->alias('or')->leftJoin(['o' => Order::tableName()], 'or.order_id = o.id')->where(['or.store_id'=>get_store_id(), 'or.is_delete'=>0, 'o.is_delete' => 0, 'o.is_show' => 1])->andWhere($whereMch)->andWhere(['IS NOT', 'o.id', NULL])->andWhere(['or', ['or.is_agree' => 0], ['or.status'=>0]])->count();
  149. //待评价
  150. $commit_order = Order::find()->where(['store_id'=>get_store_id(), 'is_delete'=>0, 'is_sale'=>1, 'is_show'=>1])->andWhere($whereMch)->andWhere(['is_comment'=>0,'trade_status'=>3])->count();
  151. //待处理
  152. // $sale_order = Order::find()->where(['store_id'=>get_store_id(), 'is_delete'=>0, 'is_show'=>1])->andWhere(['<>', 'trade_status', '1'])->andWhere(['is_sale' => 0])->count();
  153. $sale_order = OrderRefund::find()->alias('or')->leftJoin(['o' => Order::tableName()], 'or.order_id = o.id')->where(['or.store_id'=>get_store_id(), 'or.is_delete'=>0, 'o.is_delete'=>0, 'o.is_show'=>1])->andWhere($whereMch)->andWhere(['IS NOT', 'o.id', NULL])->andWhere(['or', ['or.is_agree' => 0], ['or.status'=>0]])->count(); //总加购人数
  154. $buy_count = Order::find()->where(['store_id'=>get_store_id(), 'is_delete'=>0, 'is_sale'=>1, 'is_show'=>1])->andWhere($whereMch)->andWhere(['<>', 'trade_status', '1'])->andWhere(['is_pay'=>1])->groupBy('user_id')->count();
  155. //昨日加购人数
  156. $yet_buy_count = Order::find()->where(['store_id'=>get_store_id(), 'is_delete'=>0, 'is_sale'=>1, 'is_show'=>1])->andWhere($whereMch)->andWhere(['<>', 'trade_status', '1'])->andWhere(['is_pay'=>1])->groupBy('user_id')->andWhere(['and', ['>','created_at',$yet], ['>','created_at',$td]])->count();
  157. //未结算
  158. $pay_order_money = Order::find()->where(['store_id'=>get_store_id(), 'is_delete'=>0, 'is_sale'=>1, 'is_show'=>1])->andWhere($whereMch)->andWhere(['<>', 'trade_status', '1'])->andWhere(['is_pay'=>0])->sum('pay_price');
  159. //昨日未结算
  160. $yet_pay_order_money = Order::find()->where(['store_id'=>get_store_id(), 'is_delete'=>0, 'is_sale'=>1, 'is_show'=>1])->andWhere($whereMch)->andWhere(['<>', 'trade_status', '1'])->andWhere(['is_pay'=>0])->andWhere(['and', ['>','created_at',$yet], ['>','created_at',$td]])->sum('pay_price');
  161. if(!$this->mch_id){
  162. try {
  163. $payload = \Yii::$app->jwt->getPayload();
  164. } catch (\Exception $e) {
  165. return [
  166. 'code' => 0,
  167. 'msg' => $e->getMessage(),
  168. 'status' => 401
  169. ];
  170. }
  171. $store_admin_id = $payload['store_admin_id'];
  172. if ($store_admin_id) {
  173. $store_admin = \app\models\StoreAdmin::findOne($store_admin_id);
  174. $rules = !empty($store_admin->rules) ? explode(',', $store_admin->rules) : [];
  175. } else {
  176. $pickLink = AdminPickLink::LIST;
  177. if ($pickLink) {
  178. $rules = array_column($pickLink, 'key');
  179. }
  180. }
  181. }
  182. if($this->mch_id){
  183. $rules = [
  184. "goods",
  185. "order",
  186. "refund_order",
  187. "category",
  188. "evaluate",
  189. "store_data",
  190. "clerk",
  191. 'mch_store_data',
  192. 'mch_account_withdrawal',
  193. 'mch_promote_code',
  194. 'mch_scan_code_verification',
  195. 'mch_withdrawal_details'
  196. ];
  197. $today_visit = (new MchForm(['mch_id' => $this->mch_id]))->mchVisit(date('Ymd'));
  198. $yes_visit = (new MchForm(['mch_id' => $this->mch_id]))->mchVisit(date('Ymd', time()-86400));
  199. }
  200. //实时概况
  201. $statistics_data = [];
  202. //成交订单数
  203. $pay_order_query = Order::find()->where(['store_id' => get_store_id()])
  204. ->andWhere(['OR', ['is_pay' => 1], ['is_pay' => 0, 'pay_type' => Order::PAY_TYPE_COD]])
  205. ->andWhere(['<>', 'trade_status', 1]);
  206. $statistics_data['pay_order_count'] = (clone $pay_order_query)->select('id')->count();
  207. //成交金额
  208. $statistics_data['pay_order_price'] = (clone $pay_order_query)->select('pay_price')->sum('pay_price');
  209. //成交人数
  210. $statistics_data['pay_count'] = (clone $pay_order_query)->groupBy('user_id')
  211. ->select('user_id')->count();
  212. //成交商品数
  213. $statistics_data['pay_goods_count'] = OrderDetail::find()->alias('od')
  214. ->select('SUM(od.num)')
  215. ->leftJoin(['o' => Order::tableName()], 'od.order_id=o.id')
  216. ->where(['od.is_delete' => 0, 'o.is_delete' => 0, 'o.is_pay' => 1, 'o.store_id' => get_store_id()])
  217. ->scalar();
  218. //成交客单价
  219. $statistics_data['pay_single_price'] = $statistics_data['pay_count'] ?
  220. bcdiv($statistics_data['pay_order_price'], $statistics_data['pay_count'], 2) : 0;
  221. //退款订单数
  222. $cancel_order_query = OrderGoodsCancel::find()
  223. ->where([
  224. 'NOT IN', 'status', [OrderGoodsCancel::STATUS_REFUSE, OrderGoodsCancel::STATUS_CANCEL]
  225. ])->andWhere(['store_id' => get_store_id()]);
  226. $statistics_data['cancel_order_count'] = (clone $cancel_order_query)->select('id')->count();
  227. //退款金额
  228. $statistics_data['cancel_order_price'] = (clone $cancel_order_query)
  229. ->select('refund_price')->sum('refund_price');
  230. $scanPayOrder = ScanCodePayOrder::getMchOrder($this->mch_id,$td);
  231. $scanPayOrderYet = ScanCodePayOrder::getMchOrder($this->mch_id,$yet,$td);
  232. return [
  233. 'code' => 0,
  234. 'msg' => "获取成功",
  235. 'data' => [
  236. 'order' => [
  237. 'pay_order_count' => $pay_order,//待付款
  238. 'send_order_count' => $send_order,//待发货
  239. 'after_sale_order_count' => $after_sale_order,//待售后
  240. 'comment_order_count' => $commit_order,//待评价
  241. 'sale_order_count' => $sale_order //待处理
  242. ],
  243. 'notice' => $notice,
  244. 'store' => $store_info,
  245. 'mch' => $mch_info,
  246. 'total' => [
  247. 'order_num' => [//订单数
  248. 'order_count' => $order_count + ($scanPayOrder['order_num'] ?? 0),
  249. 'yet_order_count' => $yet_order_count + ($scanPayOrderYet['order_num'] ?? 0)
  250. ],
  251. 'money' => [//成交额
  252. 'money_count' => bcadd($money_count,($scanPayOrder['order_price'] ?? 0),2),
  253. 'yet_money_count' => bcadd($yet_money_count??0,($scanPayOrderYet['order_price'] ?? 0),2)
  254. ],
  255. 'visit' => [//访问量
  256. "today_visit_count" => $today_visit??0,
  257. "yet_visit_count" => $yes_visit??0
  258. ],
  259. 'browse' => [ //浏览量
  260. "today_see_count" => $today_visit??0,
  261. "yet_see_count" => $yes_visit??0
  262. ],
  263. 'buy_people' => [//加购人数
  264. "buy_count" => $buy_count??0,
  265. "yet_buy_count" => $yet_buy_count??0
  266. ],
  267. 'pay_order_money' => [//未结算
  268. "pay_order_money" => $pay_order_money??0,
  269. "yet_pay_order_money" => $yet_pay_order_money??0
  270. ]
  271. ],
  272. 'rules' => $rules,
  273. 'statistics_data' => $statistics_data
  274. ]
  275. ];
  276. }catch (\Exception $e){
  277. return [
  278. 'code'=>0,
  279. 'msg'=>$e->getMessage()
  280. ];
  281. }
  282. }
  283. public function getYesData()
  284. {
  285. try {
  286. $whereMch = [
  287. 'trade_status' => [
  288. Order::ORDER_FLOW_NO_SEND,
  289. Order::ORDER_FLOW_SEND,
  290. Order::ORDER_FLOW_CONFIRM
  291. ],
  292. 'is_pay' => Order::IS_PAY_TRUE
  293. ];
  294. if($this->mch_id){
  295. $whereMch = ['mch_id' => $this->mch_id];
  296. }
  297. $store_id = \get_store_id();
  298. $timestamp = time();
  299. $lastday = [
  300. 'begin_date' => date('Ymd', strtotime("-1 day", $timestamp)),
  301. 'end_date' => date('Ymd', (strtotime("-1 day", $timestamp))),
  302. ];
  303. $yes_start_date = mktime(0,0,0,date('m'),date('d')-1,date('Y'));
  304. $yes_end_date = mktime(0,0,0,date('m'),date('d'),date('Y'))-1;
  305. //昨日访客
  306. $yes_visit = $this->getVisit($lastday);
  307. if($this->mch_id){
  308. $yes_visit = (new MchForm())->mchVisit(date('Ymd', time()-86400));
  309. }
  310. //昨日订单数
  311. $yes_order_count = Order::find()->where(['is_delete' => 0, 'store_id' => $store_id])->andWhere($whereMch)->andWhere(['and', ['>=', 'created_at', $yes_start_date], ['<=', 'created_at', $yes_end_date]])->select('id')->count();
  312. //昨日订单支付金额
  313. $yes_order_price = Order::find()->where(['is_delete' => 0, 'store_id' => $store_id])->andWhere($whereMch)->andWhere(['and', ['>=', 'created_at', $yes_start_date], ['<=', 'created_at', $yes_end_date]])->select('total_price')->sum('total_price');
  314. //昨日经营情况
  315. $yes_data = [
  316. 'visit' => $yes_visit ?: 0,
  317. 'visit_num' => $yes_visit ?: 0,
  318. 'order_count' => $yes_order_count,
  319. 'order_price' => $yes_order_price ?: 0
  320. ];
  321. return [
  322. 'code' => 0,
  323. 'msg' => "获取成功",
  324. 'data' => $yes_data
  325. ];
  326. } catch (\Exception $e) {
  327. return [
  328. 'code'=>0,
  329. 'msg'=>$e->getMessage()
  330. ];
  331. }
  332. }
  333. public function shopData()
  334. {
  335. try {
  336. $whereMch = [];
  337. $whereMchBrowseLog = [];
  338. $whereMchGoods = [];
  339. if($this->mch_id){
  340. $whereMch = ['mch_id' => $this->mch_id];
  341. $whereMchBrowseLog = ['log_id' => Goods::find()->select('id')->where(['mch_id' => $this->mch_id])];
  342. $whereMchGoods = ['g.mch_id' => $this->mch_id];
  343. }
  344. //基础数据
  345. $store_id = get_store_id();
  346. $type = (int)$this->type;
  347. $tab = (int)$this->tab;
  348. $timestamp = time();
  349. $lastday = [
  350. 'begin_date' => date('Ymd', strtotime("-1 day", $timestamp)),
  351. 'end_date' => date('Ymd', (strtotime("-1 day", $timestamp) + (60 * 60 * 24))),
  352. ];
  353. $start_date = strtotime($this->start_date);
  354. $end_date = strtotime($this->end_date);
  355. $yes_start_date = mktime(0,0,0,date('m'),date('d')-1,date('Y'));
  356. $yes_end_date = mktime(0,0,0,date('m'),date('d'),date('Y'))-1;
  357. //昨日访客
  358. $yes_visit = $this->getVisit($lastday);
  359. //昨日订单数
  360. $yes_order_count = Order::find()->where(['is_delete' => 0])->andWhere(['and', ['>=', 'created_at', $yes_start_date], ['<=', 'created_at', $yes_end_date]])->select('id')->count();
  361. //昨日订单支付金额
  362. $yes_order_price = Order::find()->where(['is_delete' => 0])->andWhere(['and', ['>=', 'created_at', $yes_start_date], ['<=', 'created_at', $yes_end_date]])->select('total_price')->sum('total_price');
  363. //昨日经营情况
  364. $yes_data = [
  365. 'visit' => $yes_visit,
  366. 'order_count' => $yes_order_count,
  367. 'order_price' => $yes_order_price
  368. ];
  369. $time = [
  370. 'begin_date' => date("Ymd", $start_date ?: strtotime('-1 month')),
  371. 'end_date' => date("Ymd", $end_date ?: strtotime('now')),
  372. ];
  373. $table_data = [];
  374. //访问人数
  375. if ($type === 1 || ($tab === 0 && empty($type))) {
  376. $new_data = $this->getData($time);
  377. $table_data = $new_data;
  378. } else {
  379. $data_arr = $this->getDateByInterval($time['begin_date'], $time['end_date']);
  380. $new_data = $data_arr;
  381. //分享数据
  382. if ($type === 2) {
  383. foreach ($new_data as &$item) {
  384. $log = UserShareLog::find()->alias('usl')->leftJoin(['u' => User::tableName()], 'usl.parent_id = u.id')->where(['store_id' => get_store_id()])
  385. ->select([new Expression('count(usl.id) as value')])
  386. ->groupBy(new Expression('FROM_UNIXTIME(usl.created_at, "%Y%m%d")'))
  387. ->andWhere(['and', ['>', 'usl.created_at', strtotime($item['date'])], ['<', 'usl.created_at', (strtotime($item['date']) + (24*60*60))]])
  388. ->asArray()->one();
  389. $data = [];
  390. $data['value'] = (int)$log['value'] ?: 0;
  391. $item = array_merge($item, $data);
  392. }
  393. $table_data = $new_data;
  394. }
  395. if ($type === 3 || ($tab === 1 && empty($type))) {
  396. //商品浏览量
  397. foreach ($new_data as &$item) {
  398. $log = BrowseLog::find()->where(['store_id' => get_store_id(), 'is_delete' => 0])
  399. ->select([new Expression('count(id) as value')])
  400. ->groupBy(new Expression('FROM_UNIXTIME(created_at, "%Y%m%d")'))
  401. ->andWhere(['and', ['>', 'created_at', strtotime($item['date'])], ['<', 'created_at', (strtotime($item['date']) + (24*60*60))]])
  402. ->andWhere($whereMchBrowseLog)
  403. ->asArray()->one();
  404. $data = [];
  405. $data['value'] = (int)$log['value'] ?: 0;
  406. $item = array_merge($item, $data);
  407. }
  408. /**
  409. * 表格数据
  410. */
  411. $table_data = BrowseLog::find()->alias('bl')->leftJoin(['g' => Goods::tableName()], 'bl.log_id = g.id')
  412. ->where(['bl.store_id' => get_store_id(), 'bl.is_delete' => 0])->andWhere($whereMch)
  413. ->select(['g.name', 'g.cover_pic', new Expression('count(bl.id) as value'), new Expression('FROM_UNIXTIME(bl.created_at, "%Y/%m/%d") as date')])
  414. ->groupBy([new Expression('FROM_UNIXTIME(bl.created_at, "%Y%m%d")'), 'bl.log_id'])
  415. ->andWhere(['and', ['>', 'bl.created_at', strtotime($time['begin_date'])], ['<', 'bl.created_at', (strtotime($time['end_date']) + (24*60*60))]])
  416. ->asArray()->all();
  417. }
  418. if ($type === 4) {
  419. //加购人数
  420. foreach ($new_data as &$item) {
  421. $cat_log = Cart::find()->where(['store_id' => get_store_id(), 'is_delete' => 0])->andWhere($whereMch)
  422. ->select([new Expression('count(id) as value')])
  423. ->groupBy(new Expression('FROM_UNIXTIME(created_at, "%Y%m%d")'))
  424. ->andWhere(['and', ['>', 'created_at', strtotime($item['date'])], ['<', 'created_at', (strtotime($item['date']) + (24 * 60 * 60))]])
  425. ->asArray()->one();
  426. $data = [];
  427. $data['value'] = (int)$cat_log['value'] ?: 0;
  428. $item = array_merge($item, $data);
  429. }
  430. $table_data = Cart::find()->alias('c')->leftJoin(['g' => Goods::tableName()], 'c.goods_id = g.id')
  431. ->where(['c.store_id' => get_store_id(), 'c.is_delete' => 0])->andWhere($whereMchGoods)
  432. ->select(['g.name', 'g.cover_pic', new Expression('count(c.id) as value'), new Expression('FROM_UNIXTIME(c.created_at, "%Y/%m/%d") as date')])
  433. ->groupBy([new Expression('FROM_UNIXTIME(c.created_at, "%Y%m%d")'), 'c.goods_id'])
  434. ->andWhere(['and', ['>', 'c.created_at', strtotime($time['begin_date'])], ['<', 'c.created_at', (strtotime($time['end_date']) + (24*60*60))]])
  435. ->asArray()->all();
  436. }
  437. if ($type === 5 || $type === 6) {
  438. //支付人数
  439. //加购人数
  440. foreach ($new_data as &$item) {
  441. $cat_log = Order::find()->where(['store_id' => get_store_id(), 'is_delete' => 0, 'is_pay' => 1])->andWhere($whereMch)
  442. ->select([new Expression('sum(total_price) as price'),new Expression('count(id) as value')])
  443. ->groupBy([new Expression('FROM_UNIXTIME(created_at, "%Y%m%d")'), 'user_id'])
  444. ->andWhere(['and', ['>', 'created_at', strtotime($item['date'])], ['<', 'created_at', (strtotime($item['date']) + (24 * 60 * 60))]])
  445. ->asArray()->one();
  446. $data = [];
  447. if ($type === 5) {
  448. $data['value'] = (int)$cat_log['value'] ?: 0;
  449. }
  450. if ($type === 6) {
  451. $data['value'] = (float)$cat_log['price'] ?: 0;
  452. }
  453. $item = array_merge($item, $data);
  454. }
  455. $table_data = OrderDetail::find()->alias('od')->leftJoin(['o' => Order::tableName()], 'od.order_id = o.id')
  456. ->leftJoin(['g' => Goods::tableName()], 'od.goods_id = g.id')->where(['o.store_id' => get_store_id(), 'o.is_delete' => 0, 'o.is_pay' => 1])->andWhere($whereMchGoods)
  457. ->select(['g.name', 'g.cover_pic', new Expression('count(od.id) as value'), new Expression('FROM_UNIXTIME(o.created_at, "%Y/%m/%d") as date')])
  458. ->groupBy([new Expression('FROM_UNIXTIME(o.created_at, "%Y%m%d")'), 'od.goods_id'])
  459. ->andWhere(['and', ['>', 'o.created_at', strtotime($time['begin_date'])], ['<', 'o.created_at', (strtotime($time['end_date']) + (24*60*60))]])
  460. ->asArray()->all();
  461. }
  462. }
  463. return [
  464. 'code' => 0,
  465. 'msg' => '获取成功',
  466. 'data' => [
  467. 'data' => $new_data,
  468. 'table_data' => $table_data
  469. ],
  470. ];
  471. } catch (\Exception $e) {
  472. return [
  473. 'code'=>0,
  474. 'msg'=>$e->getMessage()
  475. ];
  476. }
  477. }
  478. //修改商城信息
  479. public function getStoreInfo()
  480. {
  481. $t = \Yii::$app->db->beginTransaction();
  482. try {
  483. $logo = $this->logo;
  484. $name = $this->name;
  485. $coordinate = $this->coordinate;
  486. $address = $this->address;
  487. if (\Yii::$app->request->isPost) {
  488. $store = Store::findOne(get_store_id());
  489. if ($logo) {
  490. $store->logo = $logo;
  491. Option::set('logo', $logo, get_store_id(), 'store');
  492. Option::set('web_log', $logo, get_store_id(), 'web');
  493. }
  494. if ($name) {
  495. $store->name = $name;
  496. Option::set('name', $name, get_store_id(), 'store');
  497. }
  498. if ($coordinate) {
  499. $store->coordinate = $coordinate;
  500. }
  501. if ($address) {
  502. $store->address = $address;
  503. }
  504. if (!$store->save()) {
  505. throw new \Exception(json_encode($store->errors));
  506. }
  507. $t->commit();
  508. return [
  509. 'code' => 0,
  510. 'msg' => "保存成功"
  511. ];
  512. } else {
  513. $store = Store::find()->alias('s')->where(['s.id' => get_store_id()])
  514. ->leftJoin(['a' => Admin::tableName()], 's.admin_id = a.id')
  515. ->select('s.logo, s.name, s.coordinate, s.address, a.username')
  516. ->asArray()->one();
  517. $data = [];
  518. $data['url'] = \Yii::$app->request->getHostInfo();
  519. $store = array_merge($store, $data);
  520. return [
  521. 'code' => 0,
  522. 'msg' => '获取成功',
  523. 'data' => $store
  524. ];
  525. }
  526. } catch (\Exception $e) {
  527. $t->rollBack();
  528. return [
  529. 'code'=>0,
  530. 'msg'=>$e->getMessage()
  531. ];
  532. }
  533. }
  534. public function getVisit($time){
  535. //如果是模板方式
  536. if(is_open_platform('wx', get_store_id())){
  537. //获取三方平台配置信息
  538. $config = [
  539. 'app_id' => Option::get("platform_third_appid", 0, 'saas')['value'],
  540. 'secret' => Option::get("platform_third_secret", 0, 'saas')['value'],
  541. 'token' => Option::get("platform_token", 0, 'saas')['value'],
  542. 'aes_key' => Option::get("platform_encodingAesKey", 0, 'saas')['value']
  543. ];
  544. //设置小程序配置
  545. $store_mini = StoreMini::find()->where(['id'=>get_mini_id()])->select('id, appid, authorizer_refresh_token')->one();
  546. if(empty($store_mini->appid) || empty($store_mini->authorizer_refresh_token)){
  547. return 0;
  548. }
  549. $openPlatform = Factory::openPlatform($config);
  550. $mini_program = $openPlatform->miniProgram($store_mini->appid, $store_mini->authorizer_refresh_token);
  551. $data = [
  552. 'begin_date' => $time['begin_date'],
  553. 'end_date' => $time['end_date']
  554. ];
  555. $client = new BaseClient($mini_program);
  556. $res = $client->httpPostJson("datacube/getweanalysisappiddailysummarytrend", $data);
  557. \Yii::error($time['begin_date'].'-'.$time['end_date']."今天访问数据已出炉");
  558. \Yii::error($res);
  559. return $res['list'][0]['visit_total']; //返回访问人数
  560. } else {
  561. $data = [
  562. 'begin_date' => $time['begin_date'],
  563. 'end_date' => $time['end_date']
  564. ];
  565. $mini_program = $this->wechat;
  566. if ($mini_program) {
  567. $res = $mini_program->data_cube->summaryTrend($data['begin_date'], $data['end_date']);
  568. return $res['list'][0]['visit_total']; //返回访问人数
  569. } else {
  570. return 0;
  571. }
  572. }
  573. }
  574. public function getData($time)
  575. {
  576. try {
  577. $data = [
  578. 'begin_date' => $time['begin_date'],
  579. 'end_date' => $time['end_date']
  580. ];
  581. $data_arr = $this->getDateByInterval($data['begin_date'], $data['end_date']);
  582. if (is_isv()) {
  583. //获取三方平台配置信息
  584. $config = [
  585. 'app_id' => Option::get("platform_third_appid", 0, 'saas')['value'],
  586. 'secret' => Option::get("platform_third_secret", 0, 'saas')['value'],
  587. 'token' => Option::get("platform_token", 0, 'saas')['value'],
  588. 'aes_key' => Option::get("platform_encodingAesKey", 0, 'saas')['value']
  589. ];
  590. //设置小程序配置
  591. $store_mini = StoreMini::find()->where(['id'=>get_mini_id()])->select('id, appid, authorizer_refresh_token')->one();
  592. if(empty($store_mini->appid) || empty($store_mini->authorizer_refresh_token)){
  593. return [
  594. 'code'=>1,
  595. 'msg'=>"参数配置错误"
  596. ];
  597. }
  598. $openPlatform = Factory::openPlatform($config);
  599. $mini_program = $openPlatform->miniProgram($store_mini->appid, $store_mini->authorizer_refresh_token);
  600. foreach ($data_arr as &$item) {
  601. $data = [
  602. 'begin_date' => date('Ymd', strtotime($item['date'])),
  603. 'end_date' => date('Ymd', strtotime($item['date']))
  604. ];
  605. $item['visit'] = 0;
  606. $client = new BaseClient($mini_program);
  607. $res = $client->httpPostJson("datacube/getweanalysisappiddailyvisittrend", $data);
  608. if (isset($res['list'][0]['visit_pv'])) {
  609. $item['value'] = $res['list'][0]['visit_pv'];
  610. }
  611. }
  612. return $data_arr;
  613. } else {
  614. $mini_program = $this->wechat;
  615. if ($mini_program) {
  616. foreach ($data_arr as &$item) {
  617. $res = $mini_program->data_cube->dailyVisitTrend(date('Ymd', strtotime($item['date'])), date('Ymd', strtotime($item['date'])));
  618. if (isset($res['list'][0]['visit_pv'])) {
  619. $item['value'] = $res['list'][0]['visit_pv'];
  620. } else {
  621. $item['value'] = 0;
  622. }
  623. }
  624. }
  625. }
  626. return $data_arr;
  627. } catch (\Exception $e) {
  628. return [
  629. 'code' => 1,
  630. 'msg' => $e->getMessage()
  631. ];
  632. }
  633. }
  634. public function getDateByInterval(string $st, string $et, string $format = 'Y/m/d') :array
  635. {
  636. //日期格式不正确
  637. if (strtotime($st) > strtotime($et)) return [];
  638. $returnData = [];
  639. $i = 0;
  640. do {
  641. $temp = [];
  642. $tempDate = date('Y/m/d', strtotime('+' . $i . ' day', strtotime($st)));
  643. // $temp['name'] = date('Y-m-d', strtotime('+' . $i . ' day', strtotime($st)));
  644. // $temp['startDate'] = date('Y-m-d', strtotime('+' . $i . ' day', strtotime($st)));
  645. // $temp['endDate'] = date('Y-m-d', strtotime('+' . $i . ' day', strtotime($st)));
  646. $temp['date'] = date($format, strtotime('+' . $i . ' day', strtotime($st)));
  647. $returnData[] = $temp;
  648. $i++;
  649. } while (strtotime($tempDate) < strtotime($et));
  650. return $returnData;
  651. }
  652. }