CensusMallController.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  1. <?php
  2. namespace console\controllers;
  3. use common\enums\RedisKeyEnum;
  4. use common\enums\StatusEnum;
  5. use common\models\backend\Admin;
  6. use common\models\census\CensusMall;
  7. use common\models\census\CensusMallAnalysis;
  8. use common\models\census\CensusMallCapital;
  9. use common\models\census\CensusMallCapitalStatistics;
  10. use common\models\census\CensusMallPurchasingPower;
  11. use common\models\census\CensusMallRfAnalysis;
  12. use common\models\census\CensusMallRmAnalysis;
  13. use common\models\census\CensusMallSingleDay;
  14. use common\models\census\CensusMallUserLevelSingleDay;
  15. use common\models\common\CapitalLog;
  16. use common\models\common\CommissionLog;
  17. use common\models\goods\Goods;
  18. use common\models\mall\Mall;
  19. use common\models\order\Order;
  20. use common\models\order\OrderDetail;
  21. use common\models\order\OrderRefund;
  22. use common\models\user\User;
  23. use common\models\user\UserWallet;
  24. use yii\console\Controller;
  25. use yii\console\ExitCode;
  26. use yii\db\Expression;
  27. use Yii;
  28. class CensusMallController extends Controller
  29. {
  30. public function actionIndex()
  31. {
  32. try {
  33. $this->sendSite();
  34. } catch (\Throwable $th) {
  35. }
  36. try {
  37. $mall_list = Mall::getEnableMallList(true);
  38. $time = strtotime(date('Y-m-d', time()) . ' 00:00:00');
  39. $config_list = CensusMallAnalysis::getConfigList();
  40. foreach ($mall_list as $mall) {
  41. $rf_arr = [];
  42. $rm_arr = [];
  43. $rf_list = CensusMallRfAnalysis::lists(['where' => [['mall_id' => $mall['id']]], 'index' => 'purchase_interval']);
  44. $rm_list = CensusMallRmAnalysis::lists(['where' => [['mall_id' => $mall['id']]], 'index' => 'purchase_interval']);
  45. foreach ($config_list as $key => $item) {
  46. list($rf, $rm) = $this->getRfRm($mall, $time, $rf_list, $rm_list, $item['min'], $item['max'], $key);
  47. if (!empty($rf)) $rf_arr[] = $rf;
  48. if (!empty($rm)) $rm_arr[] = $rm;
  49. }
  50. //rf
  51. $redis = \Yii::$app->redis;
  52. if (!empty($rf_arr)) {
  53. $redis_key = RedisKeyEnum::suffix(RedisKeyEnum::CENSUS_MALL_RF_ANALYSIS, '', true) . ':' . $mall['id'];
  54. $redis->set($redis_key, json_encode($rf_arr));
  55. foreach ($rf_arr as $item) {
  56. CensusMallRfAnalysis::setData($item);
  57. }
  58. }
  59. //rm
  60. if (!empty($rm_arr)) {
  61. $redis_key = RedisKeyEnum::suffix(RedisKeyEnum::CENSUS_MALL_RM_ANALYSIS, '', true) . ':' . $mall['id'];
  62. $redis->set($redis_key, json_encode($rm_arr));
  63. foreach ($rm_arr as $item) {
  64. CensusMallRmAnalysis::setData($item);
  65. }
  66. }
  67. }
  68. return true;
  69. } catch (\Exception $e) {
  70. return false;
  71. }
  72. }
  73. protected function getRfRm($mall, $time, $rf_list, $rm_list, $start, $end, $purchase_interval = '1')
  74. {
  75. $head_date = date('Y-m-d', $time - $end * 24 * 3600);
  76. $tail_date = date('Y-m-d', $time - $start * 24 * 3600);
  77. if ($start != $end) {
  78. $head_date_start_time = strtotime($head_date . ' 00:00:00');
  79. $head_date_end_time = strtotime($head_date . ' 23:59:59');
  80. $head_list = CensusMallAnalysis::lists([
  81. 'where' => [
  82. ['mall_id' => $mall['id']],
  83. ['>=', 'created_at', $head_date_start_time],
  84. ['<=', 'created_at', $head_date_end_time],
  85. ],
  86. ]);
  87. }
  88. $tail_date_start_time = strtotime($tail_date . ' 00:00:00');
  89. $tail_date_end_time = strtotime($tail_date . ' 23:59:59');
  90. $where = [
  91. ['mall_id' => $mall['id']],
  92. ['>=', 'created_at', $tail_date_start_time],
  93. ['<=', 'created_at', $tail_date_end_time],
  94. ];
  95. $tail_list = CensusMallAnalysis::lists([
  96. 'where' => $where,
  97. ]);
  98. if (isset($rf_list[$purchase_interval])) {
  99. $rf_row = $rf_list[$purchase_interval];
  100. if (!empty($head_list)) {
  101. foreach ($head_list as $item) {
  102. switch ($item['buy_numbers']) {
  103. case 0:
  104. break;
  105. case 1:
  106. case 2:
  107. case 3:
  108. case 4:
  109. if ($rf_row['f_users' . $item['buy_numbers']] > 0) $rf_row['f_users' . $item['buy_numbers']]--;
  110. if ($rf_row['f_total_pay_money' . $item['buy_numbers']] > $item['total_pay_money']) {
  111. $rf_row['f_total_pay_money' . $item['buy_numbers']] -= $item['total_pay_money'];
  112. }
  113. break;
  114. default:
  115. if ($rf_row['f_users5'] > 0) $rf_row['f_users5']--;
  116. if ($rf_row['f_total_pay_money5'] > $item['total_pay_money']) $rf_row['f_total_pay_money5'] -= $item['total_pay_money'];
  117. }
  118. }
  119. }
  120. } else {
  121. $rf_row = ['purchase_interval' => $purchase_interval,
  122. 'f_users1' => 0, 'f_users2' => 0, 'f_users3' => 0, 'f_users4' => 0, 'f_users5' => 0,
  123. 'f_total_pay_money1' => 0, 'f_total_pay_money2' => 0, 'f_total_pay_money3' => 0, 'f_total_pay_money4' => 0, 'f_total_pay_money5' => 0,
  124. ];
  125. }
  126. foreach ($tail_list as $item) {
  127. switch ($item['buy_numbers']) {
  128. case 0:
  129. break;
  130. case 1:
  131. case 2:
  132. case 3:
  133. case 4:
  134. $rf_row['f_users' . $item['buy_numbers']]++;
  135. $rf_row['f_total_pay_money' . $item['buy_numbers']] += $item['total_pay_money'];
  136. $rf_row['f_total_pay_money' . $item['buy_numbers']] = bcmul($rf_row['f_total_pay_money' . $item['buy_numbers']] ,1,2);
  137. break;
  138. default:
  139. $rf_row['f_users5']++;
  140. $rf_row['f_total_pay_money5'] += $item['total_pay_money'];
  141. $rf_row['f_total_pay_money5'] = bcmul($rf_row['f_total_pay_money5'],1,2);
  142. }
  143. }
  144. if (isset($rm_list[$purchase_interval])) {
  145. $rm_row = $rm_list[$purchase_interval];
  146. if (!empty($head_list)) {
  147. foreach ($head_list as $item) {
  148. if ($item['total_pay_money'] >= 2000) {
  149. if ($rm_row['m_users5'] > 0) $rm_row['m_users1']--;
  150. if ($rm_row['m_total_pay_money5'] > $item['total_pay_money']) $rm_row['m_total_pay_money5'] -= $item['total_pay_money'];
  151. } elseif ($item['total_pay_money'] >= 1000 && $item['total_pay_money'] < 2000) {
  152. if ($rm_row['m_users4'] > 0) $rm_row['m_users4']--;
  153. if ($rm_row['m_total_pay_money4'] > $item['total_pay_money']) $rm_row['m_total_pay_money4'] -= $item['total_pay_money'];
  154. } elseif ($item['total_pay_money'] >= 500 && $item['total_pay_money'] < 1000) {
  155. if ($rm_row['m_users3'] > 0) $rm_row['m_users3']--;
  156. if ($rm_row['m_total_pay_money3'] > $item['total_pay_money']) $rm_row['m_total_pay_money3'] -= $item['total_pay_money'];
  157. } elseif ($item['total_pay_money'] >= 200 && $item['total_pay_money'] < 500) {
  158. if ($rm_row['m_users2'] > 0) $rm_row['m_users2']--;
  159. if ($rm_row['m_total_pay_money2'] > $item['total_pay_money']) $rm_row['m_total_pay_money2'] -= $item['total_pay_money'];
  160. } else {
  161. if ($rm_row['m_users1'] > 0) $rm_row['m_users1']--;
  162. if ($rm_row['m_total_pay_money1'] > $item['total_pay_money']) $rm_row['m_total_pay_money1'] -= $item['total_pay_money'];
  163. }
  164. }
  165. }
  166. } else {
  167. $rm_row = ['purchase_interval' => $purchase_interval,
  168. 'm_users1' => 0, 'm_users2' => 0, 'm_users3' => 0, 'm_users4' => 0, 'm_users5' => 0,
  169. 'm_total_pay_money1' => 0, 'm_total_pay_money2' => 0, 'm_total_pay_money3' => 0, 'm_total_pay_money4' => 0, 'm_total_pay_money5' => 0,
  170. ];
  171. }
  172. foreach ($tail_list as $item) {
  173. if ($item['total_pay_money'] >= 2000) {
  174. $rm_row['m_users5']++;
  175. $rm_row['m_total_pay_money5'] += $item['total_pay_money'];
  176. $rm_row['m_total_pay_money5'] = bcmul($rm_row['m_total_pay_money5'],1,2);
  177. } elseif ($item['total_pay_money'] >= 1000 && $item['total_pay_money'] < 2000) {
  178. $rm_row['m_users4']++;
  179. $rm_row['m_total_pay_money4'] += $item['total_pay_money'];
  180. $rm_row['m_total_pay_money4'] = bcmul($rm_row['m_total_pay_money4'],1,2);
  181. } elseif ($item['total_pay_money'] >= 500 && $item['total_pay_money'] < 1000) {
  182. $rm_row['m_users3']++;
  183. $rm_row['m_total_pay_money3'] += $item['total_pay_money'];
  184. $rm_row['m_total_pay_money3'] = bcmul($rm_row['m_total_pay_money3'],1,2);
  185. } elseif ($item['total_pay_money'] >= 200 && $item['total_pay_money'] < 500) {
  186. $rm_row['m_users1']++;
  187. $rm_row['m_total_pay_money2'] += $item['total_pay_money'];
  188. $rm_row['m_total_pay_money2'] = bcmul($rm_row['m_total_pay_money2'],1,2);
  189. } else {
  190. $rm_row['m_users1']++;
  191. $rm_row['m_total_pay_money1'] += $item['total_pay_money'];
  192. $rm_row['m_total_pay_money1'] = bcmul($rm_row['m_total_pay_money1'],1,2);
  193. }
  194. }
  195. return [$rf_row, $rm_row];
  196. }
  197. //初始化基础分析表
  198. public function actionInitAna($mall_id = null)
  199. {
  200. $mall_list = Mall::getEnableMallList(true);
  201. if ($mall_id) {
  202. $mall = Mall::findOne(['id' => $mall_id]);
  203. $this->initAna($mall);
  204. } else {
  205. foreach ($mall_list as $mall) {
  206. $this->initAna($mall);
  207. }
  208. }
  209. }
  210. protected function initAna($mall)
  211. {
  212. $mall_id = $mall['id'];
  213. $sql = "
  214. SELECT t.mall_id, t.user_id,t.date,sum(t.pay_money) as total_pay_money,count(*) as buy_numbers from (
  215. SELECT FROM_UNIXTIME(pay_time, '%Y-%m-%d') as date,user_id,mall_id, pay_money FROM qimall_order where mall_id = $mall_id and pay_status = 1
  216. ) t GROUP BY t.user_id,t.date
  217. ";
  218. $list = \Yii::$app->getDb()->createCommand($sql)->queryAll();
  219. foreach ($list as $item) {
  220. $model = CensusMallAnalysis::findOne(['mall_id' => $mall['id'], 'user_id' => $item['user_id'], 'date' => $item['date'], 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
  221. if (empty($model)) {
  222. $model = new CensusMallAnalysis();
  223. $model->date = $item['date'];
  224. $model->user_id = $item['user_id'];
  225. $model->mall_id = $mall['id'];
  226. $model->loadDefaultValues();
  227. }
  228. $model->buy_numbers = $item['buy_numbers'];
  229. $model->total_pay_money = $item['total_pay_money'];
  230. $model->save();
  231. $item['created_at'] = strtotime($item['date'] . ' 00:20:00');
  232. $res = CensusMallAnalysis::updateAll(['created_at' => strtotime($item['date'] . ' 00:20:00')],
  233. ['mall_id' => $item['mall_id'], 'user_id' => $item['user_id'], 'date' => $item['date']]
  234. );
  235. var_dump($res);
  236. }
  237. }
  238. //初始化rf,rm表
  239. public function actionInitRfm()
  240. {
  241. $mall_list = Mall::getEnableMallList(true);
  242. $time = strtotime(date('Y-m-d', time()) . ' 00:00:00');
  243. $config_list = CensusMallAnalysis::getConfigList();
  244. foreach ($mall_list as $mall) {
  245. $rf_arr = [];
  246. $rm_arr = [];
  247. foreach ($config_list as $key => $item) {
  248. list($rf, $rm) = $this->initRfRm($mall, $time, $item['min'], $item['max'], $key);
  249. if (!empty($rf)) $rf_arr[] = $rf;
  250. if (!empty($rm)) $rm_arr[] = $rm;
  251. }
  252. if (!empty($rf_arr)) {
  253. $redis_key = RedisKeyEnum::suffix(RedisKeyEnum::CENSUS_MALL_RF_ANALYSIS, '', true) . ':' . $mall['id'];
  254. $redis = \Yii::$app->redis;
  255. $redis->set($redis_key, json_encode($rf_arr));
  256. foreach ($rf_arr as $item) {
  257. CensusMallRfAnalysis::setData($item);
  258. }
  259. }
  260. if (!empty($rm_arr)) {
  261. $redis_key = RedisKeyEnum::suffix(RedisKeyEnum::CENSUS_MALL_RM_ANALYSIS, '', true) . ':' . $mall['id'];
  262. $redis = \Yii::$app->redis;
  263. $redis->set($redis_key, json_encode($rm_arr));
  264. foreach ($rm_arr as $item) {
  265. CensusMallRmAnalysis::setData($item);
  266. }
  267. }
  268. }
  269. }
  270. protected function initRfRm($mall, $time, $start, $end, $purchase_interval = 'r_1_30')
  271. {
  272. $start_time = strtotime(date('Y-m-d', $time - $start * 24 * 3600) . ' 23:59:59');
  273. if ($end) {
  274. $end_time = strtotime(date('Y-m-d', $time - $end * 24 * 3600) . ' 23:59:59');
  275. }
  276. $where[] = ['mall_id' => $mall['id']];
  277. $where[] = ['<', 'created_at', $start_time];
  278. if (isset($end_time)) $where[] = ['>=', 'created_at', $end_time];
  279. $list = CensusMallAnalysis::lists([
  280. 'where' => $where,
  281. 'group' => 'user_id',
  282. 'select' => 'mall_id,user_id,sum(total_pay_money) as total_pay_money,sum(buy_numbers) as buy_numbers,'
  283. ]);
  284. $rf_row = ['purchase_interval' => $purchase_interval,
  285. 'mall_id' => $mall['id'],
  286. 'f_users1' => 0, 'f_users2' => 0, 'f_users3' => 0, 'f_users4' => 0, 'f_users5' => 0,
  287. 'f_total_pay_money1' => 0, 'f_total_pay_money2' => 0, 'f_total_pay_money3' => 0, 'f_total_pay_money4' => 0, 'f_total_pay_money5' => 0,
  288. ];
  289. foreach ($list as $item) {
  290. switch ($item['buy_numbers']) {
  291. case 0:
  292. break;
  293. case 1:
  294. case 2:
  295. case 3:
  296. case 4:
  297. $rf_row['f_users' . $item['buy_numbers']]++;
  298. $rf_row['f_total_pay_money' . $item['buy_numbers']] += $item['total_pay_money'];
  299. $rf_row['f_total_pay_money' . $item['buy_numbers']] = bcmul($rf_row['f_total_pay_money' . $item['buy_numbers']],1,2);
  300. break;
  301. default:
  302. $rf_row['f_users5']++;
  303. $rf_row['f_total_pay_money5'] += $item['total_pay_money'];
  304. $rf_row['f_total_pay_money5'] = bcmul($rf_row['f_total_pay_money5'],1,2);
  305. }
  306. }
  307. $rm_row = ['purchase_interval' => $purchase_interval,
  308. 'mall_id' => $mall['id'],
  309. 'm_users1' => 0, 'm_users2' => 0, 'm_users3' => 0, 'm_users4' => 0, 'm_users5' => 0,
  310. 'm_total_pay_money1' => 0, 'm_total_pay_money2' => 0, 'm_total_pay_money3' => 0, 'm_total_pay_money4' => 0, 'm_total_pay_money5' => 0,
  311. ];
  312. foreach ($list as $item) {
  313. if ($item['total_pay_money'] >= 2000) {
  314. $rm_row['m_users5']++;
  315. $rm_row['m_total_pay_money5'] += $item['total_pay_money'];
  316. $rm_row['m_total_pay_money5'] = bcmul($rm_row['m_total_pay_money5'],1,2);
  317. } elseif ($item['total_pay_money'] >= 1000 && $item['total_pay_money'] < 2000) {
  318. $rm_row['m_users4']++;
  319. $rm_row['m_total_pay_money4'] += $item['total_pay_money'];
  320. $rm_row['m_total_pay_money4'] = bcmul($rm_row['m_total_pay_money4'],1,2);
  321. } elseif ($item['total_pay_money'] >= 500 && $item['total_pay_money'] < 1000) {
  322. $rm_row['m_users3']++;
  323. $rm_row['m_total_pay_money3'] += $item['total_pay_money'];
  324. $rm_row['m_total_pay_money3'] = bcmul($rm_row['m_total_pay_money3'],1,2);
  325. } elseif ($item['total_pay_money'] >= 200 && $item['total_pay_money'] < 500) {
  326. $rm_row['m_users2']++;
  327. $rm_row['m_total_pay_money2'] += $item['total_pay_money'];
  328. $rm_row['m_total_pay_money2'] = bcmul($rm_row['m_total_pay_money2'],1,2);
  329. } else {
  330. $rm_row['m_users1']++;
  331. $rm_row['m_total_pay_money1'] += $item['total_pay_money'];
  332. $rm_row['m_total_pay_money1'] = bcmul($rm_row['m_total_pay_money1'],1,2);
  333. }
  334. }
  335. return [$rf_row, $rm_row];
  336. }
  337. //商城单日数据,需添加定时任务
  338. public function actionMallSingleDay($mall_id=null)
  339. {
  340. $mall_list = Mall::getEnableMallList(true);
  341. $time = time();
  342. $date = date('Y-m-d', $time);
  343. $start_time = strtotime($date . ' 00:00:00');
  344. foreach ($mall_list as $mall) {
  345. $mall_id = $mall['id'];
  346. $goods_counts = $this->getCounts($mall['id'], $start_time);
  347. list($order_counts,$add_pay_orders,$add_pay_nums,$add_pay_people_nums,$add_refund_orders) = $this->getOrders($mall['id'], $start_time);
  348. list($settlement_commission,$expenditure_commission) = $this->fixCommissionDate($mall['id'], $start_time);
  349. $obj = CensusMallSingleDay::findOne(['mall_id'=>$mall_id,'date'=>$date]);
  350. if(empty($obj)){
  351. $obj = new CensusMallSingleDay();
  352. $obj->loadDefaultValues();
  353. $obj->mall_id = $mall_id;
  354. $obj->date = $date;
  355. }
  356. $obj->add_goods = $goods_counts??0;
  357. $obj->add_orders = $order_counts??0;
  358. $obj->add_pay_orders = $add_pay_orders??0;
  359. $obj->add_pay_nums = $add_pay_nums??0;
  360. $obj->add_pay_people_nums = $add_pay_people_nums??0;
  361. $obj->add_refund_orders = $add_refund_orders??0;
  362. $obj->settlement_commission = $settlement_commission??0;
  363. $obj->expenditure_commission = $expenditure_commission??0;
  364. $res = $obj->save();
  365. var_dump($res);
  366. }
  367. }
  368. protected function getCounts($mall_id, $start_time)
  369. {
  370. return Goods::find()->where(['mall_id' => $mall_id])->andWhere(['>=', 'created_at', $start_time])->count();
  371. }
  372. protected function getOrders($mall_id, $start_time)
  373. {
  374. $order_counts = Order::find()->where(['mall_id' => $mall_id])->andWhere(['>=', 'created_at', $start_time])->count();
  375. $add_pay_orders = Order::find()->where(['mall_id' => $mall_id,'pay_status'=>1])->andWhere(['>=', 'created_at', $start_time])->count();
  376. $add_pay_nums = OrderDetail::find()->where(['mall_id' => $mall_id])->andWhere(['>=', 'created_at', $start_time])->andWhere(['<>','order_status',0])->sum('num');
  377. $add_refund_orders = OrderRefund::find()->where(['mall_id' => $mall_id])->andWhere(['>=', 'created_at', $start_time])->count();
  378. $add_pay_people_nums = Order::find()->where(['mall_id' => $mall_id,'pay_status'=>1])
  379. ->andWhere(['>=', 'created_at', $start_time])
  380. ->groupBy('user_id')
  381. ->count();
  382. return [$order_counts,$add_pay_orders,$add_pay_nums,$add_pay_people_nums,$add_refund_orders];
  383. }
  384. public function fixCommissionDate($mall_id,$start_time)
  385. {
  386. $query = CommissionLog::find()->where(['mall_id' => $mall_id])->andWhere(['>=', 'created_at', $start_time]);
  387. $list = $query->select(new Expression("mall_id,
  388. sum(change_num) as change_num,change_type"))
  389. ->groupBy('change_type')->asArray()->all();
  390. $settlement_commission = 0;
  391. $expenditure_commission = 0;
  392. foreach ($list as $item){
  393. if($item['change_type']=='add'){
  394. $settlement_commission+=$item['change_num'];
  395. }else{
  396. $expenditure_commission+=$item['change_num'];
  397. }
  398. }
  399. return [$settlement_commission,$expenditure_commission];
  400. }
  401. //会员等级单日统计,需添加定时任务
  402. public function actionUserLevelSingleDay($mall_id=null){
  403. $mall_list = Mall::getEnableMallList(true);
  404. foreach ($mall_list as $mall) {
  405. $mall_id = $mall['id'];
  406. $this->userLevelSingle($mall_id);
  407. }
  408. }
  409. public function userLevelSingle($mall_id){
  410. $list = User::lists(
  411. [
  412. 'where' => [
  413. ['mall_id' => $mall_id],
  414. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]
  415. ],
  416. 'select' => 'count(*) as counts,level',
  417. 'group' => 'level'
  418. ]
  419. );
  420. foreach ($list as $item) {
  421. $date = date('Y-m-d', time());
  422. $model = CensusMallUserLevelSingleDay::findOne(['mall_id' => $mall_id, 'date' => $date, 'level' => $item['level']]);
  423. if (empty($model)) {
  424. $model = new CensusMallUserLevelSingleDay();
  425. $model->loadDefaultValues();
  426. $model->mall_id = $mall_id;
  427. $model->level = $item['level'];
  428. $model->date = $date;
  429. }
  430. $model->numbers = $item['counts'];
  431. $res = $model->save();
  432. }
  433. var_dump('userLevelSingle执行结束');
  434. }
  435. //商城资金统计,需添加定时任务
  436. public function actionCapital($mall_id = null)
  437. {
  438. if (!empty($mall_id)) {
  439. $mall = Mall::findOne(['id' => $mall_id]);
  440. if ($mall) {
  441. $this->capitalBalance($mall['id']);
  442. $this->capitalScore($mall['id']);
  443. $this->capitalCommission($mall['id']);
  444. }
  445. } else {
  446. $mall_list = Mall::getEnableMallList(true);
  447. foreach ($mall_list as $mall) {
  448. $this->capitalBalance($mall['id']);
  449. $this->capitalScore($mall['id']);
  450. $this->capitalCommission($mall['id']);
  451. }
  452. }
  453. }
  454. public function capitalBalance($mall_id)
  455. {
  456. $type = 'balance';
  457. $total_nums = UserWallet::find()->where(['mall_id' => $mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])->sum('total_balance');
  458. CapitalLog::$capitalType = $type;
  459. $use_nums = CapitalLog::find()->where(['mall_id' => $mall_id, 'change_type' => 'sub', 'status' => StatusEnum::ENABLED])->sum('change_num');
  460. $surplus_nums = UserWallet::find()->where(['mall_id' => $mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])->sum('balance');
  461. CapitalLog::$capitalType = $type;
  462. $withdrawal_nums = CapitalLog::find()->where(['mall_id' => $mall_id,
  463. 'change_type' => 'sub',
  464. 'from_type' => 'withdrawal',
  465. 'status' => StatusEnum::ENABLED])->sum('change_num');
  466. $model = CensusMallCapital::findOne(['mall_id' => $mall_id, 'type' => $type]);
  467. if (empty($model)) {
  468. $model = new CensusMallCapital();
  469. $model->mall_id = $mall_id;
  470. $model->type = $type;
  471. }
  472. $model->total_nums = $total_nums ?? 0;
  473. $model->use_nums = $use_nums ?? 0;
  474. $model->surplus_nums = $surplus_nums ?? 0;
  475. $model->withdrawal_nums = $withdrawal_nums ?? 0;
  476. $res = $model->save();
  477. var_dump('capitalBalance执行结束');
  478. }
  479. public function capitalScore($mall_id)
  480. {
  481. $type = 'score';
  482. $result = UserWallet::find()->where(['mall_id' => $mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
  483. ->select('sum(total_score) as total_score,sum(total_use_score) as total_use_score,sum(score) as score')
  484. ->groupBy('mall_id')
  485. ->asArray()
  486. ->one();
  487. $model = CensusMallCapital::findOne(['mall_id' => $mall_id, 'type' => $type]);
  488. if (empty($model)) {
  489. $model = new CensusMallCapital();
  490. $model->mall_id = $mall_id;
  491. $model->type = $type;
  492. }
  493. $model->total_nums = $result['total_score'] ?? 0;
  494. $model->use_nums = $result['total_use_score'] ?? 0;
  495. $model->surplus_nums = $result['score'] ?? 0;
  496. $res = $model->save();
  497. var_dump('capitalScore执行结束');
  498. }
  499. public function capitalCommission($mall_id)
  500. {
  501. $type = 'commission';
  502. $result = UserWallet::find()->where(['mall_id' => $mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
  503. ->select('sum(total_commission) as total_commission,sum(frozen_commission) as frozen_commission,sum(commission) as commission')
  504. ->asArray()
  505. ->one();
  506. CapitalLog::$capitalType = $type . '_frozen';
  507. $cancel_nums = CapitalLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::DELETE])->sum('change_num');
  508. $frozen_commission = CapitalLog::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::DISABLED])->sum('change_num');
  509. $model = CensusMallCapital::findOne(['mall_id' => $mall_id, 'type' => $type]);
  510. if (empty($model)) {
  511. $model = new CensusMallCapital();
  512. $model->mall_id = $mall_id;
  513. $model->type = $type;
  514. }
  515. CapitalLog::$capitalType = $type;
  516. $commission_sum = CapitalLog::find()->where(['mall_id' => $mall_id, 'change_type' =>'add'])
  517. ->andWhere(['!=', 'from_type', 'withdrawal']) // 过滤提现驳回增加的记录
  518. ->sum('change_num');
  519. $withdrawal_nums = CapitalLog::find()->where([
  520. 'mall_id' => $mall_id,
  521. 'change_type' => 'sub',
  522. 'from_type' => 'withdrawal'
  523. ])->sum('change_num');
  524. if(empty($commission_sum)) $commission_sum = 0;
  525. if(empty($frozen_commission)) $frozen_commission = 0;
  526. $model->total_nums = $commission_sum;
  527. $model->surplus_nums = $result['commission'] ?? 0;
  528. $model->unsettled = $frozen_commission ?? 0;
  529. $model->cancel_nums = $cancel_nums ?? 0;
  530. $model->withdrawal_nums = $withdrawal_nums ?? 0;
  531. $res = $model->save();
  532. var_dump('capitalCommission执行结束');
  533. }
  534. public function sendSite()
  535. {
  536. $mall = [];
  537. $mall_list = Mall::find()
  538. ->select(['id', 'mall_sign', 'name'])
  539. ->where(['is_recycle' => 0, 'is_delete' => 0, 'status' => 1])
  540. ->andWhere(['>', 'expired_at', time()])
  541. ->orWhere(['=', 'expired_at', 0])
  542. ->all();
  543. $user_count_list = User::find()
  544. ->select(['mall_id', 'count(id) as user_total'])
  545. ->groupBy('mall_id')
  546. ->asArray()
  547. ->all();
  548. $user_count_list = static::getArrByKey($user_count_list, 'mall_id');
  549. $census_list = CensusMall::find()->asArray()->all();
  550. $census_list = static::getArrByKey($census_list, 'mall_id');
  551. $admin_list = Admin::find()
  552. ->select(['id', 'mall_id', 'username'])
  553. ->where(['>', 'mall_id', 0])
  554. ->andWhere(['is_default' => 1])
  555. ->all();
  556. $admin_list = static::getArrByKey($admin_list, 'mall_id');
  557. $total_commission_list = UserWallet::find()->select(['mall_id', 'sum(total_commission) as total'])->groupBy('mall_id')->asArray()->all();
  558. $total_commission_list = static::getArrByKey($total_commission_list, 'mall_id');
  559. foreach ($mall_list as $item) {
  560. $user_count = $user_count_list[$item->id]['user_total'] ?? 0;
  561. $total_pay_money = $census_list[$item->id]['total_pay_money'] ?? 0;
  562. $username = $admin_list[$item->id]['username'] ?? '';
  563. $total_commission = !empty($total_commission_list[$item->id]['total']) ? $total_commission_list[$item->id]['total'] : 0;
  564. $mall[] = [
  565. 'mall_id' => $item->id,
  566. 'mall_name' => $item->name,
  567. 'mobile' => $username,
  568. 'total_user' => $user_count,
  569. 'total_price' => $total_pay_money ?? 0,
  570. 'total_commission' => $total_commission,
  571. ];
  572. }
  573. $data['host'] = \Yii::$app->services->setting->platform->get('system.api_url');
  574. $data['data'] = $mall;
  575. $url = "https://middle-api.qijianshigw.com/qimall-statistics/data/submit";
  576. $headers['Content-Type'] = 'application/json; charset=utf-8';
  577. $client = new \GuzzleHttp\Client();
  578. $result = $client->request('POST', $url, ['form_params' => $data]);
  579. }
  580. protected static function getArrByKey(array $array, string $key)
  581. {
  582. $res = [];
  583. foreach ($array as $item) {
  584. $res[$item[$key]] = $item;
  585. }
  586. return $res;
  587. }
  588. public function actionCapitalDate()
  589. {
  590. try {
  591. $mall_list = Mall::getEnableMallList(true);
  592. if (empty($mall_list)) {
  593. return true;
  594. }
  595. $now_time = time();
  596. $date = date('Y-m-d', $now_time);
  597. $insert_data = [];
  598. foreach ($mall_list as $mall) {
  599. $data = CensusMallCapital::find()->where([
  600. 'mall_id' => $mall['id'],
  601. 'type' => ['balance', 'score', 'commission'],
  602. 'status' => StatusEnum::ENABLED])
  603. ->asArray()->all();
  604. $data = array_column($data, null, 'type');
  605. $insert_data[] = [
  606. $mall['id'],
  607. $date,
  608. $data['balance']['surplus_nums'] ?? 0,
  609. $data['commission']['surplus_nums'] ?? 0,
  610. $data['score']['surplus_nums'] ?? 0,
  611. StatusEnum::ENABLED,
  612. $now_time,
  613. $now_time
  614. ];
  615. }
  616. $fields = [
  617. 'mall_id',
  618. 'statistics_date',
  619. 'balance_surplus_nums',
  620. 'commission_surplus_nums',
  621. 'score_surplus_nums',
  622. 'status',
  623. 'created_at',
  624. 'updated_at'
  625. ];
  626. if ($insert_data) {
  627. Yii::$app->db->createCommand()->batchInsert(
  628. CensusMallCapitalStatistics::tableName(),
  629. $fields,
  630. $insert_data
  631. )->execute();
  632. }
  633. return ExitCode::OK;
  634. } catch (\Exception $e) {
  635. echo $e->getMessage();
  636. return ExitCode::UNSPECIFIED_ERROR;
  637. }
  638. }
  639. }