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; } } } }
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; }
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; }
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'); } } }
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'); } } } }