예제 #1
0
 public function actionSceneId()
 {
     $sql = 'select scene_id, count(*) as c from wx_staff where scene_id != 0 group by scene_id having c > 1 order by c desc';
     $rows = \Yii::$app->db->createCommand($sql)->queryAll();
     foreach ($rows as $row) {
         //            echo $row['scene_id'] . ': ' . $row['c'] . PHP_EOL;
         $staffs = MStaff::findAll(['scene_id' => $row['scene_id']]);
         $cat_staffs = [];
         foreach ($staffs as $staff) {
             $cat_staffs[$staff->cat][] = $staff;
         }
         $cat_staffs['individual'] = [];
         if (!empty($cat_staffs[MStaff::SCENE_CAT_IN])) {
             $cat_staffs['individual'] = array_merge($cat_staffs['individual'], $cat_staffs[MStaff::SCENE_CAT_IN]);
         }
         if (!empty($cat_staffs[MStaff::SCENE_CAT_OUT])) {
             $cat_staffs['individual'] = array_merge($cat_staffs['individual'], $cat_staffs[MStaff::SCENE_CAT_OUT]);
         }
         if (!empty($cat_staffs[MStaff::SCENE_CAT_FAN])) {
             $cat_staffs['individual'] = array_merge($cat_staffs['individual'], $cat_staffs[MStaff::SCENE_CAT_FAN]);
         }
         $first = null;
         foreach ($cat_staffs['individual'] as $individual_staff) {
             if (null === $first) {
                 $first = $individual_staff;
                 continue;
             }
             if ($individual_staff->openid == $first->openid) {
                 echo "duplicate staff! " . $individual_staff->openid . ' ' . $individual_staff->name . PHP_EOL;
                 $individual_staff->delete();
             }
         }
         if (empty($cat_staffs[MStaff::SCENE_CAT_OFFICE])) {
         } else {
             if (count($cat_staffs[MStaff::SCENE_CAT_OFFICE]) > 1) {
                 $all_offices = [];
                 $first = null;
                 foreach ($cat_staffs[MStaff::SCENE_CAT_OFFICE] as $cat_staff) {
                     echo $cat_staff->scene_id . $cat_staff->name . PHP_EOL;
                     if (null === $first) {
                         $first = $cat_staff;
                         $all_offices[] = $first;
                         continue;
                     }
                     if ($cat_staff->office_id == $first->office_id) {
                         echo "duplicate staff! " . $cat_staff->office_id . ' ' . $cat_staff->name . PHP_EOL;
                         $cat_staff->delete();
                     } else {
                         $cat_staff->scene_id = MStaff::newSceneId($cat_staff->gh_id);
                         $cat_staff->save(false);
                         echo 'change OFFICE sceneid: ' . $cat_staff->name . ' ' . $first->scene_id . ' -> ' . $cat_staff->scene_id . PHP_EOL;
                         $all_offices[] = $cat_staff;
                     }
                 }
                 $musers = MUser::findAll(['scene_pid' => $first->scene_id]);
                 foreach ($musers as $muser) {
                     $cnt = count($all_offices);
                     $index = rand(0, $cnt - 1);
                     echo 'change USER belongto: ' . $muser->nickname . ' ' . $muser->belongto . ' -> ' . $all_offices[$index]->office_id . PHP_EOL;
                     $muser->belongto = $all_offices[$index]->office_id;
                     $muser->scene_pid = $all_offices[$index]->scene_id;
                     $muser->save(false);
                 }
             } else {
                 $cat_staff = $cat_staffs[MStaff::SCENE_CAT_OFFICE][0];
                 echo $cat_staff->scene_id . $cat_staff->name . PHP_EOL;
                 $musers = MUser::findAll(['scene_pid' => $cat_staff->scene_id]);
                 foreach ($musers as $muser) {
                     echo 'change USER belongto: ' . $muser->nickname . ' ' . $muser->belongto . ' -> ' . $cat_staff->office_id . PHP_EOL;
                     $muser->belongto = $cat_staff->office_id;
                     $muser->save(false);
                 }
             }
             foreach ($cat_staffs['individual'] as $individual_staff) {
                 $individual_staff->scene_id = MStaff::newSceneId($individual_staff->gh_id);
                 $individual_staff->save(false);
                 echo 'change INDIVIDUAL sceneid: ' . $individual_staff->name . ' ' . $cat_staff->scene_id . ' -> ' . $individual_staff->scene_id . PHP_EOL;
             }
         }
     }
 }
예제 #2
0
파일: MStaff.php 프로젝트: noikiy/wowewe
 public function beforeSave($insert)
 {
     if (parent::beforeSave($insert)) {
         if ($insert) {
             $this->scene_id = MStaff::newSceneId($this->gh_id);
         }
         //            if ($this->cat == static::SCENE_CAT_OFFICE && $this->office->hasOfficeStaff()) {
         //                throw new \yii\web\HttpException(500, 'this office has already owned one scene_id!');
         //            }
         return true;
     }
     return false;
 }
예제 #3
0
파일: MUser.php 프로젝트: noikiy/wowewe
 public function newSceneIdForOpenid()
 {
     $staff = new MStaff();
     $staff->gh_id = $this->gh_id;
     $staff->openid = $this->openid;
     $staff->scene_id = MStaff::newSceneId($this->gh_id);
     $staff->name = $this->nickname;
     $staff->cat = MStaff::SCENE_CAT_FAN;
     if (!$staff->save(false)) {
         U::W(['error', __METHOD__, $staff]);
     }
     return $staff;
 }
예제 #4
0
 public function actionR2()
 {
     $lock = 'LOCK#1';
     $gh_id = 'G';
     $office_id = rand(1, 100000);
     for ($i = 0; $i < 10000; $i++) {
         if (yii::$app->mutex->acquire($lock, 10)) {
             $staff = new MStaff();
             $staff->gh_id = $gh_id;
             $staff->office_id = $office_id;
             $staff->scene_id = MStaff::newSceneId($gh_id);
             $staff->name = 'office-' . $office_id;
             $staff->cat = MStaff::SCENE_CAT_OFFICE;
             if (!$staff->save(false)) {
                 U::W(['error', __METHOD__, $staff]);
             }
             yii::$app->mutex->release($lock);
         } else {
             yii::error('acquire lock error in R2');
         }
     }
 }
예제 #5
0
파일: MOffice.php 프로젝트: noikiy/wowewe
 public function afterSave($insert, $changedAttributes)
 {
     if ($insert) {
         if ($this->need_scene_id) {
             //hbhe
             if (yii::$app->mutex->acquire(MStaff::SCENE_LOCK, MStaff::SCENE_LOCK_WAIT_TIME_SECOND)) {
                 $staff = new MStaff();
                 $staff->gh_id = $this->gh_id;
                 $staff->office_id = $this->office_id;
                 $staff->scene_id = MStaff::newSceneId($this->gh_id);
                 $staff->name = $this->title;
                 $staff->cat = MStaff::SCENE_CAT_OFFICE;
                 if (!$staff->save(false)) {
                     U::W(['error', __METHOD__, $staff]);
                 }
                 //yii::$app->mutex->release($lock);
                 yii::$app->mutex->release(MStaff::SCENE_LOCK);
             } else {
                 yii::error('acquire lock error');
             }
         }
     }
 }