20], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => 'ID', 'mall_id' => '商城ID', 'add_users' => '今日新增会员数', 'total_users' => '累计会员数', 'total_visitors' => '今日访客数', 'total_actives' => '今日活跃数', 'total_views' => '今日浏览量', 'total_order_money' => '今日下单金额', 'total_pay_money' => '今日交易金额', 'date' => '日期', 'status' => '状态[-1:删除;0:禁用;1启用;]', 'created_at' => '创建时间', 'updated_at' => '上次更新数据时间', ]; } public static function setData($params) { try { if (empty($params['mall_id']) && empty($params['date'])) { return false; } $model = self::findOne(['mall_id' => $params['mall_id'], 'date' => $params['date'], 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]); if (empty($model)) { $model = new self(); $model->mall_id = $params['mall_id']; $model->date = $params['date']; $model->loadDefaultValues(); } if (!empty($params['views'])) $model->total_views += $params['views']; if (!empty($params['users'])) $model->total_users += $params['users']; if (!empty($params['add_users'])) $model->add_users += $params['add_users']; if (!empty($params['visitors'])) $model->total_visitors += $params['visitors']; if (!empty($params['actives'])) $model->total_actives += $params['actives']; if (!empty($params['order_money'])) $model->total_order_money += $params['order_money']; if (!empty($params['pay_money'])) $model->total_pay_money += $params['pay_money']; if (!empty($params['add_goods'])) $model->add_goods += $params['add_goods']; if (!empty($params['add_orders'])) $model->add_orders += $params['add_orders']; if (!empty($params['add_pay_orders'])) $model->add_pay_orders += $params['add_pay_orders']; if (!empty($params['add_pay_nums'])) $model->add_pay_nums += $params['add_pay_nums']; if (!empty($params['add_pay_people_nums'])) $model->add_pay_people_nums += $params['add_pay_people_nums']; if (!empty($params['add_refund_orders'])) $model->add_refund_orders += $params['add_refund_orders']; if (!$model->save()) throw new \Exception($model->getErrorMessage()); return $model; } catch (\Exception $e) { self::$static_error = $e->getMessage(); return false; } } public static function setSingleDayCache($mall_id, $field, $data, $type = 'views') { $redis = \Yii::$app->redis; $date = date('Y-m-d', time()); $key = RedisKeyEnum::CENSUS_MALL_SINGLE_DATE; $redis_key = RedisKeyEnum::suffix($key, '', true) . ':' . $mall_id.':' . $date; $result = $redis->hget($redis_key, $field); switch ($type) { case 'views': $data['views'] = $data['views'] ?? 1; !empty($result) ? $result += $data['views'] : $result = $data['views']; break; case 'order_money': $data['order_money'] = $data['order_money'] ?? 0; !empty($result) ? $result += $data['order_money'] : $result = $data['order_money']; break; case 'add_orders': $data['add_orders'] = $data['add_orders'] ?? 0; !empty($result) ? $result += $data['add_orders'] : $result = $data['add_orders']; break; case 'pay_money': $data['pay_money'] = $data['pay_money'] ?? 0; !empty($result) ? $result += $data['pay_money'] : $result = $data['pay_money']; break; case 'users': $key = RedisKeyEnum::CENSUS_MALL; $mall_redis_key = RedisKeyEnum::suffix($key, '', true) . ':' . $mall_id; $total_users = $redis->hget($mall_redis_key, 'total_users'); $result =1; if(!empty($total_users)) $result +=$total_users; break; case 'add_users': $data['add_users'] = $data['add_users'] ?? 0; !empty($result) ? $result += $data['add_users'] : $result = $data['add_users']; break; case 'visitors': $is_exit_redis_key = RedisKeyEnum::suffix( RedisKeyEnum::CENSUS_MALL_SINGLE_DATE, 'visitors_', true) .':' . $date; if(self::setBit($redis,$is_exit_redis_key,$data['user_id'],1)){ //今天访问过的 return ; } $data['visitors'] = $data['visitors'] ?? 1; !empty($result) ? $result += $data['visitors'] : $result = $data['visitors']; break; case 'actives': //活跃 $is_exit_redis_key = RedisKeyEnum::suffix(RedisKeyEnum::CENSUS_MALL_SINGLE_DATE, 'actives_', true) .':' . $date; if(self::setBit($redis,$is_exit_redis_key,$data['user_id'],1)){ //今天访问过的 return ; } $data['actives'] = $data['actives'] ?? 1; !empty($result) ? $result += $data['actives'] : $result = $data['actives']; break; default: return; } $redis->hset($redis_key, $field, $result); $redis->expire($redis_key, 24 * 3600); $data['mall_id'] = $mall_id; $data['date'] = $date; \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $data, CensusMallSingleDay::class, 'setData'); } public static function getData($mall_id,$date,$fields=null) { $redis = \Yii::$app->redis; $key = RedisKeyEnum::CENSUS_MALL_SINGLE_DATE; $redis_key = RedisKeyEnum::suffix($key, '', true) . ':' . $mall_id.':' . $date; if($fields){ if(is_string($fields)){ $result = $redis->hget($redis_key,$fields); return [$fields=>$result??0]; }else{ $result = $redis->hmget($redis_key,...$fields); $data = []; foreach ($fields as $k=>$v){ $data[$v]=$result[$k]??0; } return $data; } }else{ $result = $redis->hgetall($redis_key); if($result){ foreach ($result as $k=>$v){ if($k%2==0){ $data[$k]['name'] = $v; } if($k%2==1)$data[$k-1]['num'] = $v; } return array_column($data,'num','name'); }else{ return []; } } } public $single_day_fields = ['mall_id', 'total_users', 'add_users', 'total_visitors', 'total_actives', 'total_views', 'total_order_money', 'total_pay_money', 'date', 'status', 'created_at', 'updated_at', 'add_goods', 'add_orders', 'add_pay_orders', 'add_pay_nums', 'add_pay_people_nums', 'add_refund_orders', 'settlement_commission', 'expenditure_commission' ]; public function fixGoodsAdd($mall_id, $time = null) { $sql = " SELECT FROM_UNIXTIME(created_at,'%Y-%m-%d') as date ,count(*) as counts,mall_id FROM qimall_goods where mall_id = {$mall_id} and mch_id = 0 and status in (0,1) GROUP BY date "; $list = \Yii::$app->db->createCommand($sql)->queryAll(); foreach ($list as $item) { $obj = CensusMallSingleDay::findOne(['mall_id' => $mall_id, 'date' => $item['date']]); $time = strtotime($item['date'] . ' 00:00:02'); if (empty($obj)) { $info = [ $mall_id, 0, 0, 0, 0, 0, 0, 0, $item['date'], 1, $time, $time, $item['counts'], 0, 0, 0, 0, 0, 0, 0 ]; $values_arr[] = $info; } else { $res = CensusMallSingleDay::updateAll(['created_at' => $time, 'updated_at' => $time, 'add_goods' => $item['counts']], ['id' => $obj['id']]); } } if (!empty($values_arr)) { \Yii::$app->db->createCommand()->batchInsert( CensusMallSingleDay::tableName(), $this->single_day_fields, $values_arr )->execute(); } $counts = Goods::find()->where(['mall_id' => $mall_id, 'mch_id' => 0, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])->count(); $model = CensusMall::findOne(['mall_id' => $mall_id]); if (empty($model)) { $model = new CensusMall(); $model->loadDefaultValues(); $model->mall_id = $mall_id; } $model->add_goods = $counts; $res = $model->save(); var_dump('fixGoodsAdd执行结束'); } public function fixOrdersAdd($mall_id) { $sql = " SELECT FROM_UNIXTIME(created_at,'%Y-%m-%d') as date ,count(*) as counts,mall_id FROM qimall_order where mall_id = {$mall_id} and mch_id = 0 and store_id=0 GROUP BY date "; $list = \Yii::$app->db->createCommand($sql)->queryAll(); foreach ($list as $item) { $time = strtotime($item['date'] . ' 00:00:02'); $obj = CensusMallSingleDay::findOne(['mall_id' => $mall_id, 'date' => $item['date']]); if (empty($obj)) { $info = [ $mall_id, 0, 0, 0, 0, 0, 0, 0, $item['date'], 1, $time, $time, 0, $item['counts'], 0, 0, 0, 0, 0, 0 ]; $values_arr[] = $info; } else { $time = strtotime($obj['date'] . ' 00:00:02'); CensusMallSingleDay::updateAll(['created_at' => $time, 'updated_at' => $time, 'add_orders' => $item['counts']], ['id' => $obj['id']]); } } if (!empty($values_arr)) { \Yii::$app->db->createCommand()->batchInsert( CensusMallSingleDay::tableName(), $this->single_day_fields, $values_arr )->execute(); } } public function fixPayOrdersAdd($mall_id) { $sql = " SELECT FROM_UNIXTIME(created_at,'%Y-%m-%d') as date ,count(*) as counts,sum(pay_money) as pay_money, mall_id FROM qimall_order where mall_id = {$mall_id} and mch_id = 0 and store_id=0 and pay_status=1 GROUP BY date "; $list = \Yii::$app->db->createCommand($sql)->queryAll(); foreach ($list as $item) { $time = strtotime($item['date'] . ' 00:00:02'); $obj = CensusMallSingleDay::findOne(['mall_id' => $mall_id, 'date' => $item['date']]); if (empty($obj)) { $obj = new CensusMallSingleDay(); $obj->loadDefaultValues(); $obj->mall_id = $mall_id; $obj->date = $item['date']; $info = [ $mall_id, 0, 0, 0, 0, 0, 0, $item['pay_money'], $item['date'], 1, $time, $time, 0, 0, $item['counts'], 0, 0, 0, 0, 0 ]; $values_arr[] = $info; } else { $time = strtotime($obj['date'] . ' 00:00:02'); CensusMallSingleDay::updateAll(['created_at' => $time, 'updated_at' => $time, 'total_pay_money' => $item['pay_money'], 'add_pay_orders' => $item['counts']], ['id' => $obj['id']]); } } if (!empty($values_arr)) { \Yii::$app->db->createCommand()->batchInsert( CensusMallSingleDay::tableName(), $this->single_day_fields, $values_arr )->execute(); } var_dump('fixPayOrdersAdd执行结束'); } public function fixAddPayPeopleNums($mall_id) { $sql = " SELECT t.date,t.mall_id,count(t.user_id) as counts FROM ( SELECT FROM_UNIXTIME(created_at,'%Y-%m-%d') as date ,mall_id,user_id FROM 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 "; $list = \Yii::$app->db->createCommand($sql)->queryAll(); foreach ($list as $item) { $time = strtotime($item['date'] . ' 00:00:02'); $obj = CensusMallSingleDay::findOne(['mall_id' => $mall_id, 'date' => $item['date']]); if (empty($obj)) { $obj = new CensusMallSingleDay(); $obj->loadDefaultValues(); $obj->mall_id = $mall_id; $obj->date = $item['date']; $info = [ $mall_id, 0, 0, 0, 0, 0, 0, 0, $item['date'], 1, $time, $time, 0, 0, 0, $item['counts'], 0, 0, 0, 0 ]; $values_arr[] = $info; } else { $time = strtotime($obj['date'] . ' 00:00:02'); CensusMallSingleDay::updateAll(['created_at' => $time, 'updated_at' => $time, 'add_pay_people_nums' => $item['counts']], ['id' => $obj['id']]); } } if (!empty($values_arr)) { \Yii::$app->db->createCommand()->batchInsert( CensusMallSingleDay::tableName(), $this->single_day_fields, $values_arr )->execute(); } var_dump('fixAddPayPeopleNums执行结束'); } public function fixPayOrdersNum($mall_id) { $sql = " SELECT FROM_UNIXTIME(od.created_at,'%Y-%m-%d') as date ,sum(od.num) as counts,od.mall_id FROM qimall_order_detail as od left join qimall_order as o on od.order_id = o.id where od.mall_id = {$mall_id} and od.mch_id = 0 and od.store_id=0 and o.pay_status = 1 GROUP BY date "; $list = \Yii::$app->db->createCommand($sql)->queryAll(); foreach ($list as $item) { $time = strtotime($item['date'] . ' 00:00:02'); $obj = CensusMallSingleDay::findOne(['mall_id' => $mall_id, 'date' => $item['date']]); if (empty($obj)) { $obj = new CensusMallSingleDay(); $obj->loadDefaultValues(); $obj->mall_id = $mall_id; $obj->date = $item['date']; $info = [ $mall_id, 0, 0, 0, 0, 0, 0, 0, $item['date'], 1, $time, $time, 0, 0, 0, 0, $item['counts'], 0, 0, 0 ]; $values_arr[] = $info; } else { $time = strtotime($obj['date'] . ' 00:00:02'); CensusMallSingleDay::updateAll(['created_at' => $time, 'updated_at' => $time, 'add_pay_nums' => $item['counts']], ['id' => $obj['id']]); } } if (!empty($values_arr)) { \Yii::$app->db->createCommand()->batchInsert( CensusMallSingleDay::tableName(), $this->single_day_fields, $values_arr )->execute(); } var_dump('fixPayOrdersNum执行结束'); } public function fixOrderRefund($mall_id) { $sql = " SELECT FROM_UNIXTIME(created_at,'%Y-%m-%d') as date ,count(*) as counts,mall_id FROM qimall_order_refund where mall_id = $mall_id and mch_id = 0 and store_id=0 GROUP BY date "; $list = \Yii::$app->db->createCommand($sql)->queryAll(); foreach ($list as $item) { $time = strtotime($item['date'] . ' 00:00:02'); $obj = CensusMallSingleDay::findOne(['mall_id' => $mall_id, 'date' => $item['date']]); if (empty($obj)) { $obj = new CensusMallSingleDay(); $obj->loadDefaultValues(); $obj->mall_id = $mall_id; $obj->date = $item['date']; $info = [ $mall_id, 0, 0, 0, 0, 0, 0, 0, $item['date'], 1, $time, $time, 0, 0, 0, 0, 0, $item['counts'], 0, 0 ]; $values_arr[] = $info; } else { $time = strtotime($obj['date'] . ' 00:00:02'); CensusMallSingleDay::updateAll(['created_at' => $time, 'updated_at' => $time, 'add_refund_orders' => $item['counts']], ['id' => $obj['id']]); } } if (!empty($values_arr)) { \Yii::$app->db->createCommand()->batchInsert( CensusMallSingleDay::tableName(), $this->single_day_fields, $values_arr )->execute(); } var_dump('fixOrderRefund执行结束'); } /** * 设置bit,带过期时间 * @param $redis Redis实例 * @param string $key 键 * @param mixed $value 值 * @param int $expire 过期时间 * @return mixed 设置结果 */ public static function setBit($redis,$key,$value,$expire=24*3600) { if(!$redis->set($key.'expire', 1,'NX','EX',$expire)){ $redis->expire($key, $expire); } return $redis->setbit($key, $value,1); } }