CensusMallSingleDay.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. <?php
  2. namespace common\models\census;
  3. use common\enums\RabbitMqEnum;
  4. use common\enums\RedisKeyEnum;
  5. use common\enums\StatusEnum;
  6. use common\models\base\BaseActiveRecord;
  7. use common\models\goods\Goods;
  8. use common\models\mall\Mall;
  9. use common\models\order\OrderDetail;
  10. use Yii;
  11. /**
  12. * This is the model class for table "qimall_census_mall_single_day".
  13. *
  14. * @property int $id ID
  15. * @property int $mall_id 商城ID
  16. * @property int $total_users 累计会员数
  17. * @property int $add_users 今日新增会员
  18. * @property int $total_visitors 今日访客数
  19. * @property int $total_actives 今日活跃数
  20. * @property int $total_views 今日浏览量
  21. * @property float $total_order_money 今日下单金额
  22. * @property float $total_pay_money 今日交易金额
  23. * @property string $date 日期
  24. * @property int|null $status 状态[-1:删除;0:禁用;1启用;]
  25. * @property int $created_at 创建时间
  26. * @property int $updated_at 上次更新数据时间
  27. */
  28. class CensusMallSingleDay extends BaseActiveRecord
  29. {
  30. /**
  31. * {@inheritdoc}
  32. */
  33. public static function tableName()
  34. {
  35. return '{{%census_mall_single_day}}';
  36. }
  37. /**
  38. * {@inheritdoc}
  39. */
  40. public function rules()
  41. {
  42. return [
  43. [['mall_id', 'total_users','add_users', 'total_visitors','total_actives', 'total_views', 'status', 'created_at',
  44. 'updated_at','add_goods','add_orders','add_pay_orders','add_pay_nums','add_pay_people_nums','add_refund_orders'], 'integer'],
  45. [['total_order_money','total_pay_money'], 'number'],
  46. [['date'], 'string', 'max' => 20],
  47. ];
  48. }
  49. /**
  50. * {@inheritdoc}
  51. */
  52. public function attributeLabels()
  53. {
  54. return [
  55. 'id' => 'ID',
  56. 'mall_id' => '商城ID',
  57. 'add_users' => '今日新增会员数',
  58. 'total_users' => '累计会员数',
  59. 'total_visitors' => '今日访客数',
  60. 'total_actives' => '今日活跃数',
  61. 'total_views' => '今日浏览量',
  62. 'total_order_money' => '今日下单金额',
  63. 'total_pay_money' => '今日交易金额',
  64. 'date' => '日期',
  65. 'status' => '状态[-1:删除;0:禁用;1启用;]',
  66. 'created_at' => '创建时间',
  67. 'updated_at' => '上次更新数据时间',
  68. ];
  69. }
  70. public static function setData($params)
  71. {
  72. try {
  73. if (empty($params['mall_id']) && empty($params['date'])) {
  74. return false;
  75. }
  76. $model = self::findOne(['mall_id' => $params['mall_id'], 'date' => $params['date'], 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
  77. if (empty($model)) {
  78. $model = new self();
  79. $model->mall_id = $params['mall_id'];
  80. $model->date = $params['date'];
  81. $model->loadDefaultValues();
  82. }
  83. if (!empty($params['views'])) $model->total_views += $params['views'];
  84. if (!empty($params['users'])) $model->total_users += $params['users'];
  85. if (!empty($params['add_users'])) $model->add_users += $params['add_users'];
  86. if (!empty($params['visitors'])) $model->total_visitors += $params['visitors'];
  87. if (!empty($params['actives'])) $model->total_actives += $params['actives'];
  88. if (!empty($params['order_money'])) $model->total_order_money += $params['order_money'];
  89. if (!empty($params['pay_money'])) $model->total_pay_money += $params['pay_money'];
  90. if (!empty($params['add_goods'])) $model->add_goods += $params['add_goods'];
  91. if (!empty($params['add_orders'])) $model->add_orders += $params['add_orders'];
  92. if (!empty($params['add_pay_orders'])) $model->add_pay_orders += $params['add_pay_orders'];
  93. if (!empty($params['add_pay_nums'])) $model->add_pay_nums += $params['add_pay_nums'];
  94. if (!empty($params['add_pay_people_nums'])) $model->add_pay_people_nums += $params['add_pay_people_nums'];
  95. if (!empty($params['add_refund_orders'])) $model->add_refund_orders += $params['add_refund_orders'];
  96. if (!$model->save()) throw new \Exception($model->getErrorMessage());
  97. return $model;
  98. } catch (\Exception $e) {
  99. self::$static_error = $e->getMessage();
  100. return false;
  101. }
  102. }
  103. public static function setSingleDayCache($mall_id, $field, $data, $type = 'views')
  104. {
  105. $redis = \Yii::$app->redis;
  106. $date = date('Y-m-d', time());
  107. $key = RedisKeyEnum::CENSUS_MALL_SINGLE_DATE;
  108. $redis_key = RedisKeyEnum::suffix($key, '', true) . ':' . $mall_id.':' . $date;
  109. $result = $redis->hget($redis_key, $field);
  110. switch ($type) {
  111. case 'views':
  112. $data['views'] = $data['views'] ?? 1;
  113. !empty($result) ? $result += $data['views'] : $result = $data['views'];
  114. break;
  115. case 'order_money':
  116. $data['order_money'] = $data['order_money'] ?? 0;
  117. !empty($result) ? $result += $data['order_money'] : $result = $data['order_money'];
  118. break;
  119. case 'add_orders':
  120. $data['add_orders'] = $data['add_orders'] ?? 0;
  121. !empty($result) ? $result += $data['add_orders'] : $result = $data['add_orders'];
  122. break;
  123. case 'pay_money':
  124. $data['pay_money'] = $data['pay_money'] ?? 0;
  125. !empty($result) ? $result += $data['pay_money'] : $result = $data['pay_money'];
  126. break;
  127. case 'users':
  128. $key = RedisKeyEnum::CENSUS_MALL;
  129. $mall_redis_key = RedisKeyEnum::suffix($key, '', true) . ':' . $mall_id;
  130. $total_users = $redis->hget($mall_redis_key, 'total_users');
  131. $result =1;
  132. if(!empty($total_users)) $result +=$total_users;
  133. break;
  134. case 'add_users':
  135. $data['add_users'] = $data['add_users'] ?? 0;
  136. !empty($result) ? $result += $data['add_users'] : $result = $data['add_users'];
  137. break;
  138. case 'visitors':
  139. $is_exit_redis_key = RedisKeyEnum::suffix( RedisKeyEnum::CENSUS_MALL_SINGLE_DATE, 'visitors_', true) .':' . $date;
  140. if(self::setBit($redis,$is_exit_redis_key,$data['user_id'],1)){
  141. //今天访问过的
  142. return ;
  143. }
  144. $data['visitors'] = $data['visitors'] ?? 1;
  145. !empty($result) ? $result += $data['visitors'] : $result = $data['visitors'];
  146. break;
  147. case 'actives':
  148. //活跃
  149. $is_exit_redis_key = RedisKeyEnum::suffix(RedisKeyEnum::CENSUS_MALL_SINGLE_DATE, 'actives_', true) .':' . $date;
  150. if(self::setBit($redis,$is_exit_redis_key,$data['user_id'],1)){
  151. //今天访问过的
  152. return ;
  153. }
  154. $data['actives'] = $data['actives'] ?? 1;
  155. !empty($result) ? $result += $data['actives'] : $result = $data['actives'];
  156. break;
  157. default:
  158. return;
  159. }
  160. $redis->hset($redis_key, $field, $result);
  161. $redis->expire($redis_key, 24 * 3600);
  162. $data['mall_id'] = $mall_id;
  163. $data['date'] = $date;
  164. \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $data, CensusMallSingleDay::class, 'setData');
  165. }
  166. public static function getData($mall_id,$date,$fields=null)
  167. {
  168. $redis = \Yii::$app->redis;
  169. $key = RedisKeyEnum::CENSUS_MALL_SINGLE_DATE;
  170. $redis_key = RedisKeyEnum::suffix($key, '', true) . ':' . $mall_id.':' . $date;
  171. if($fields){
  172. if(is_string($fields)){
  173. $result = $redis->hget($redis_key,$fields);
  174. return [$fields=>$result??0];
  175. }else{
  176. $result = $redis->hmget($redis_key,...$fields);
  177. $data = [];
  178. foreach ($fields as $k=>$v){
  179. $data[$v]=$result[$k]??0;
  180. }
  181. return $data;
  182. }
  183. }else{
  184. $result = $redis->hgetall($redis_key);
  185. if($result){
  186. foreach ($result as $k=>$v){
  187. if($k%2==0){
  188. $data[$k]['name'] = $v;
  189. }
  190. if($k%2==1)$data[$k-1]['num'] = $v;
  191. }
  192. return array_column($data,'num','name');
  193. }else{
  194. return [];
  195. }
  196. }
  197. }
  198. public $single_day_fields = ['mall_id', 'total_users', 'add_users', 'total_visitors',
  199. 'total_actives', 'total_views', 'total_order_money', 'total_pay_money',
  200. 'date', 'status', 'created_at', 'updated_at', 'add_goods', 'add_orders', 'add_pay_orders', 'add_pay_nums',
  201. 'add_pay_people_nums', 'add_refund_orders', 'settlement_commission', 'expenditure_commission'
  202. ];
  203. public function fixGoodsAdd($mall_id, $time = null)
  204. {
  205. $sql = "
  206. SELECT FROM_UNIXTIME(created_at,'%Y-%m-%d') as date ,count(*) as counts,mall_id FROM
  207. qimall_goods where mall_id = {$mall_id} and mch_id = 0 and status in (0,1) GROUP BY date
  208. ";
  209. $list = \Yii::$app->db->createCommand($sql)->queryAll();
  210. foreach ($list as $item) {
  211. $obj = CensusMallSingleDay::findOne(['mall_id' => $mall_id, 'date' => $item['date']]);
  212. $time = strtotime($item['date'] . ' 00:00:02');
  213. if (empty($obj)) {
  214. $info = [
  215. $mall_id,
  216. 0,
  217. 0, 0, 0, 0, 0, 0, $item['date'], 1, $time, $time, $item['counts'], 0, 0, 0, 0, 0, 0, 0
  218. ];
  219. $values_arr[] = $info;
  220. } else {
  221. $res = CensusMallSingleDay::updateAll(['created_at' => $time, 'updated_at' => $time, 'add_goods' => $item['counts']], ['id' => $obj['id']]);
  222. }
  223. }
  224. if (!empty($values_arr)) {
  225. \Yii::$app->db->createCommand()->batchInsert(
  226. CensusMallSingleDay::tableName(),
  227. $this->single_day_fields,
  228. $values_arr
  229. )->execute();
  230. }
  231. $counts = Goods::find()->where(['mall_id' => $mall_id, 'mch_id' => 0,
  232. 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])->count();
  233. $model = CensusMall::findOne(['mall_id' => $mall_id]);
  234. if (empty($model)) {
  235. $model = new CensusMall();
  236. $model->loadDefaultValues();
  237. $model->mall_id = $mall_id;
  238. }
  239. $model->add_goods = $counts;
  240. $res = $model->save();
  241. var_dump('fixGoodsAdd执行结束');
  242. }
  243. public function fixOrdersAdd($mall_id)
  244. {
  245. $sql = "
  246. SELECT FROM_UNIXTIME(created_at,'%Y-%m-%d') as date ,count(*) as counts,mall_id FROM
  247. qimall_order where mall_id = {$mall_id} and mch_id = 0 and store_id=0 GROUP BY date
  248. ";
  249. $list = \Yii::$app->db->createCommand($sql)->queryAll();
  250. foreach ($list as $item) {
  251. $time = strtotime($item['date'] . ' 00:00:02');
  252. $obj = CensusMallSingleDay::findOne(['mall_id' => $mall_id, 'date' => $item['date']]);
  253. if (empty($obj)) {
  254. $info = [
  255. $mall_id,
  256. 0,
  257. 0, 0, 0, 0, 0, 0, $item['date'], 1, $time, $time, 0, $item['counts'], 0, 0, 0, 0, 0, 0
  258. ];
  259. $values_arr[] = $info;
  260. } else {
  261. $time = strtotime($obj['date'] . ' 00:00:02');
  262. CensusMallSingleDay::updateAll(['created_at' => $time, 'updated_at' => $time, 'add_orders' => $item['counts']], ['id' => $obj['id']]);
  263. }
  264. }
  265. if (!empty($values_arr)) {
  266. \Yii::$app->db->createCommand()->batchInsert(
  267. CensusMallSingleDay::tableName(),
  268. $this->single_day_fields,
  269. $values_arr
  270. )->execute();
  271. }
  272. }
  273. public function fixPayOrdersAdd($mall_id)
  274. {
  275. $sql = "
  276. SELECT FROM_UNIXTIME(created_at,'%Y-%m-%d') as date ,count(*) as counts,sum(pay_money) as pay_money, mall_id FROM
  277. qimall_order where mall_id = {$mall_id} and mch_id = 0 and store_id=0 and pay_status=1 GROUP BY date
  278. ";
  279. $list = \Yii::$app->db->createCommand($sql)->queryAll();
  280. foreach ($list as $item) {
  281. $time = strtotime($item['date'] . ' 00:00:02');
  282. $obj = CensusMallSingleDay::findOne(['mall_id' => $mall_id, 'date' => $item['date']]);
  283. if (empty($obj)) {
  284. $obj = new CensusMallSingleDay();
  285. $obj->loadDefaultValues();
  286. $obj->mall_id = $mall_id;
  287. $obj->date = $item['date'];
  288. $info = [
  289. $mall_id,
  290. 0,
  291. 0, 0, 0, 0, 0, $item['pay_money'], $item['date'], 1, $time, $time, 0, 0, $item['counts'], 0, 0, 0, 0, 0
  292. ];
  293. $values_arr[] = $info;
  294. } else {
  295. $time = strtotime($obj['date'] . ' 00:00:02');
  296. CensusMallSingleDay::updateAll(['created_at' => $time, 'updated_at' => $time, 'total_pay_money' => $item['pay_money'], 'add_pay_orders' => $item['counts']], ['id' => $obj['id']]);
  297. }
  298. }
  299. if (!empty($values_arr)) {
  300. \Yii::$app->db->createCommand()->batchInsert(
  301. CensusMallSingleDay::tableName(),
  302. $this->single_day_fields,
  303. $values_arr
  304. )->execute();
  305. }
  306. var_dump('fixPayOrdersAdd执行结束');
  307. }
  308. public function fixAddPayPeopleNums($mall_id)
  309. {
  310. $sql = "
  311. SELECT t.date,t.mall_id,count(t.user_id) as counts FROM (
  312. SELECT FROM_UNIXTIME(created_at,'%Y-%m-%d') as date ,mall_id,user_id FROM
  313. qimall_order where mall_id = {$mall_id} and mch_id = 0 and store_id=0 and pay_status=1 GROUP BY date,user_id) t GROUP BY t.date
  314. ";
  315. $list = \Yii::$app->db->createCommand($sql)->queryAll();
  316. foreach ($list as $item) {
  317. $time = strtotime($item['date'] . ' 00:00:02');
  318. $obj = CensusMallSingleDay::findOne(['mall_id' => $mall_id, 'date' => $item['date']]);
  319. if (empty($obj)) {
  320. $obj = new CensusMallSingleDay();
  321. $obj->loadDefaultValues();
  322. $obj->mall_id = $mall_id;
  323. $obj->date = $item['date'];
  324. $info = [
  325. $mall_id,
  326. 0,
  327. 0, 0, 0, 0, 0, 0, $item['date'], 1, $time, $time, 0, 0, 0, $item['counts'], 0, 0, 0, 0
  328. ];
  329. $values_arr[] = $info;
  330. } else {
  331. $time = strtotime($obj['date'] . ' 00:00:02');
  332. CensusMallSingleDay::updateAll(['created_at' => $time, 'updated_at' => $time, 'add_pay_people_nums' => $item['counts']], ['id' => $obj['id']]);
  333. }
  334. }
  335. if (!empty($values_arr)) {
  336. \Yii::$app->db->createCommand()->batchInsert(
  337. CensusMallSingleDay::tableName(),
  338. $this->single_day_fields,
  339. $values_arr
  340. )->execute();
  341. }
  342. var_dump('fixAddPayPeopleNums执行结束');
  343. }
  344. public function fixPayOrdersNum($mall_id)
  345. {
  346. $sql = "
  347. SELECT FROM_UNIXTIME(od.created_at,'%Y-%m-%d') as date ,sum(od.num) as counts,od.mall_id FROM
  348. qimall_order_detail as od
  349. left join qimall_order as o on od.order_id = o.id
  350. where od.mall_id = {$mall_id} and od.mch_id = 0 and od.store_id=0 and o.pay_status = 1 GROUP BY date
  351. ";
  352. $list = \Yii::$app->db->createCommand($sql)->queryAll();
  353. foreach ($list as $item) {
  354. $time = strtotime($item['date'] . ' 00:00:02');
  355. $obj = CensusMallSingleDay::findOne(['mall_id' => $mall_id, 'date' => $item['date']]);
  356. if (empty($obj)) {
  357. $obj = new CensusMallSingleDay();
  358. $obj->loadDefaultValues();
  359. $obj->mall_id = $mall_id;
  360. $obj->date = $item['date'];
  361. $info = [
  362. $mall_id,
  363. 0,
  364. 0, 0, 0, 0, 0, 0, $item['date'], 1, $time, $time, 0, 0, 0, 0, $item['counts'], 0, 0, 0
  365. ];
  366. $values_arr[] = $info;
  367. } else {
  368. $time = strtotime($obj['date'] . ' 00:00:02');
  369. CensusMallSingleDay::updateAll(['created_at' => $time, 'updated_at' => $time, 'add_pay_nums' => $item['counts']], ['id' => $obj['id']]);
  370. }
  371. }
  372. if (!empty($values_arr)) {
  373. \Yii::$app->db->createCommand()->batchInsert(
  374. CensusMallSingleDay::tableName(),
  375. $this->single_day_fields,
  376. $values_arr
  377. )->execute();
  378. }
  379. var_dump('fixPayOrdersNum执行结束');
  380. }
  381. public function fixOrderRefund($mall_id)
  382. {
  383. $sql = "
  384. SELECT FROM_UNIXTIME(created_at,'%Y-%m-%d') as date ,count(*) as counts,mall_id FROM
  385. qimall_order_refund where mall_id = $mall_id and mch_id = 0 and store_id=0 GROUP BY date
  386. ";
  387. $list = \Yii::$app->db->createCommand($sql)->queryAll();
  388. foreach ($list as $item) {
  389. $time = strtotime($item['date'] . ' 00:00:02');
  390. $obj = CensusMallSingleDay::findOne(['mall_id' => $mall_id, 'date' => $item['date']]);
  391. if (empty($obj)) {
  392. $obj = new CensusMallSingleDay();
  393. $obj->loadDefaultValues();
  394. $obj->mall_id = $mall_id;
  395. $obj->date = $item['date'];
  396. $info = [
  397. $mall_id,
  398. 0,
  399. 0, 0, 0, 0, 0, 0, $item['date'], 1, $time, $time, 0, 0, 0, 0, 0, $item['counts'], 0, 0
  400. ];
  401. $values_arr[] = $info;
  402. } else {
  403. $time = strtotime($obj['date'] . ' 00:00:02');
  404. CensusMallSingleDay::updateAll(['created_at' => $time, 'updated_at' => $time, 'add_refund_orders' => $item['counts']], ['id' => $obj['id']]);
  405. }
  406. }
  407. if (!empty($values_arr)) {
  408. \Yii::$app->db->createCommand()->batchInsert(
  409. CensusMallSingleDay::tableName(),
  410. $this->single_day_fields,
  411. $values_arr
  412. )->execute();
  413. }
  414. var_dump('fixOrderRefund执行结束');
  415. }
  416. /**
  417. * 设置bit,带过期时间
  418. * @param $redis Redis实例
  419. * @param string $key 键
  420. * @param mixed $value 值
  421. * @param int $expire 过期时间
  422. * @return mixed 设置结果
  423. */
  424. public static function setBit($redis,$key,$value,$expire=24*3600)
  425. {
  426. if(!$redis->set($key.'expire', 1,'NX','EX',$expire)){
  427. $redis->expire($key, $expire);
  428. }
  429. return $redis->setbit($key, $value,1);
  430. }
  431. }