| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- <?php
- namespace addons\DoubleCopy\common\logic;
- use addons\DoubleCopy\common\enums\DoubleCopyEnum;
- use addons\DoubleCopy\common\models\DoubleCopyChangePos;
- use addons\DoubleCopy\common\models\DoubleCopyChangeTopid;
- use addons\DoubleCopy\common\models\DoubleCopyLevel;
- use addons\DoubleCopy\common\models\DoubleCopyUser;
- use common\enums\StatusEnum;
- use common\models\user\UserPartitionRelationship;
- use common\traits\ErrorTrait;
- use Yii;
- use yii\db\Exception;
- use yii\helpers\Json;
- /**
- * 二二复制修改位置
- * Class ChangePosLogic
- * @Author: lun
- * @DateTime: 2023/6/1 0001 17:28
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @package addons\DoubleCopy\common\logic
- */
- class ChangePosLogic
- {
- use ErrorTrait;
- public $config;
- public $order;
- public $order_status;
- public static function handle($params)
- {
- // 读取数据
- $change = DoubleCopyChangePos::findOne(['id' => $params['id'], 'change_status' => StatusEnum::DISABLED, 'status' => StatusEnum::ENABLED]);
- if (empty($change)) return true;
- $mallId = $change['mall_id'];
- $change_arr = json_decode($change['content'], true);
- $trans = Yii::$app->db->beginTransaction();
- try {
- foreach ($change_arr as $item) {
- $user = DoubleCopyUser::find()->where(['user_id' => $item['user_id'], 'status' => StatusEnum::ENABLED])->one();// 用户1
- $user->pos = $item['now_pos'];
- if (!$user->save()) throw new Exception('用户ID='.$item['user_id'].'位置修改失败:' . $user->getErrorMessage());
- }
- $boss_level = DoubleCopyLevel::find()->select('upgrade_type_condition, checked_condition_values')->where(['mall_id' => $mallId, 'level' => DoubleCopyEnum::LEVEL_BOSS, 'status' => StatusEnum::ENABLED])->asArray()->one();
- $upgrade_num = 0;// 需要直推的升级数量
- if ($boss_level['upgrade_type_condition'] == 1) {
- // json解析升级条件数量
- $json = Json::decode($boss_level['checked_condition_values'], true);
- $upgrade_num = $json[0]['value']['val0'] ?? 0;
- }
- // topid修改
- foreach ($change_arr as $item) {
- $copy_user = DoubleCopyUser::findOne(['user_id' => $item['user_id'], 'status' => StatusEnum::ENABLED]);
- self::batchGetUsers($copy_user, $upgrade_num, $change->id);// 用户下级批量修改
- }
- // 修改完成
- $change->change_status = StatusEnum::ENABLED;
- if (!$change->save()) throw new Exception($change->getErrorMessage());
- $trans->commit();
- return true;
- } catch (\Exception $e) {
- $trans->rollBack();
- $reason = $e->getFile().',第'.$e->getLine().'行,原因:' . $e->getMessage();
- Yii::error('二二复制位置修改失败:' . $e->getFile().',第'.$e->getLine().'行,原因:' . $e->getMessage());
- }
- $change->change_status = StatusEnum::DELETE;// 失败
- $change->reason = $reason;
- $change->save();
- return true;
- }
- /**
- * 批量修改用户位置
- * @Author: lun
- * @DateTime: 2023/6/1 0001 18:44
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param DoubleCopyUser $changeUser
- * @param $upgrade_num
- * @param $change_pos_id
- */
- public static function batchGetUsers(DoubleCopyUser $changeUser, $upgrade_num, $change_pos_id)
- {
- $i = 1;
- $page_size = 1000;
- list($tree, $parent_deep, $all_tree, $all_tree_arr) = UserPartitionRelationship::getTree($changeUser->user_id);
- while ($child_list = UserPartitionRelationship::find()->where(['like', 'tree', $tree . '%', false])
- ->select('user_id')
- ->offset(($i - 1) * $page_size)->groupBy('user_id,deep')->limit($page_size)->all()) {
- foreach ($child_list as $item) {
- if ($item['user_id'] == $changeUser->user_id) {
- $user = $changeUser;
- } else {
- $user = DoubleCopyUser::findOne(['user_id' => $item['user_id'], 'status' => StatusEnum::ENABLED]);
- }
- if ($user) {
- self::updateTopId($user, $upgrade_num, $change_pos_id);
- }
- }
- $i++;
- }
- }
- /**
- *
- * @Author: lun
- * @DateTime: 2023/6/1 0001 18:22
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param DoubleCopyUser $user
- * @param $upgrade_num
- * @param $change_pos_id
- */
- public static function updateTopId(DoubleCopyUser $user, $upgrade_num, $change_pos_id)
- {
- $parent_ids = UserPartitionRelationship::getParentIdArr($user->user_id);
- $parent_ids = array_reverse($parent_ids);// 倒序数组
- array_unshift($parent_ids, $user->user_id);
- foreach ($parent_ids as $key => $pid) {
- // 查询上级是否有身份
- $pdc_user = DoubleCopyUser::find()->select('user_id,pos,pid')->where(['user_id' => $pid, 'status' => StatusEnum::ENABLED])->asArray()->one();
- if (empty($pdc_user)) {
- // 获取当前用户的上级uid
- $ppuid = $parent_ids[$key + 1] ?? 0;
- if ($ppuid) {
- // 统计跟此用户同级人数,并且判断当前用户的平级数量是否大于或等于2号位
- $equal_num = DoubleCopyUser::find()->where(['pid' => $ppuid, 'status' => StatusEnum::ENABLED])->count();
- if ($equal_num >= $upgrade_num) {// 符合位置则表示当前用户的上级必定是拿平台补贴用户(拿平台补贴用户可以没有身份)
- $topid = $ppuid;
- break;
- }
- }
- } else {
- // 如果当前位置是大于或等于3号位则表示此用户上级必定是老板
- if ($pdc_user['pos'] > $upgrade_num) {
- $topid = $pdc_user['pid'];
- break;
- }
- }
- $topid = $pid;
- }
- // 临时检测的平台补贴用户id跟之前不同则需要修改平台补贴用户id
- if ($user->topid != $topid) {
- $old_topid = $user->topid;
- $user->topid = $topid;
- $user->save();
- // 保存topid修改记录
- $res = DoubleCopyChangeTopid::setData([
- 'change_pos_id' => $change_pos_id,
- 'mall_id' => $user->mall_id,
- 'user_id' => $user->user_id,
- 'old_topid' => $old_topid,
- 'now_topid' => $topid,
- ]);
- if ($res == false) throw new \Exception(DoubleCopyChangeTopid::getStaticError());
- }
- }
- }
|