| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459 |
- <?php
- namespace common\models\census;
- use common\enums\RabbitMqEnum;
- use common\enums\RedisKeyEnum;
- use common\enums\StatusEnum;
- use common\models\base\BaseActiveRecord;
- use common\models\goods\Goods;
- use common\models\mall\Mall;
- use common\models\order\OrderDetail;
- use Yii;
- /**
- * This is the model class for table "qimall_census_mall_single_day".
- *
- * @property int $id ID
- * @property int $mall_id 商城ID
- * @property int $total_users 累计会员数
- * @property int $add_users 今日新增会员
- * @property int $total_visitors 今日访客数
- * @property int $total_actives 今日活跃数
- * @property int $total_views 今日浏览量
- * @property float $total_order_money 今日下单金额
- * @property float $total_pay_money 今日交易金额
- * @property string $date 日期
- * @property int|null $status 状态[-1:删除;0:禁用;1启用;]
- * @property int $created_at 创建时间
- * @property int $updated_at 上次更新数据时间
- */
- class CensusMallSingleDay extends BaseActiveRecord
- {
- /**
- * {@inheritdoc}
- */
- public static function tableName()
- {
- return '{{%census_mall_single_day}}';
- }
- /**
- * {@inheritdoc}
- */
- public function rules()
- {
- return [
- [['mall_id', 'total_users','add_users', 'total_visitors','total_actives', 'total_views', 'status', 'created_at',
- 'updated_at','add_goods','add_orders','add_pay_orders','add_pay_nums','add_pay_people_nums','add_refund_orders'], 'integer'],
- [['total_order_money','total_pay_money'], 'number'],
- [['date'], 'string', 'max' => 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);
- }
- }
|