| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399 |
- <?php
- namespace addons\DoubleCopy\service;
- use common\traits\ErrorTrait;
- use addons\DoubleCopy\common\models\DoubleCopyUser;
- use addons\DoubleCopy\common\models\DoubleCopySpread;
- use addons\DoubleCopy\common\models\DoubleCopyLevel;
- use addons\DoubleCopy\common\enums\DoubleCopyEnum;
- use common\enums\StatusEnum;
- use yii\db\Exception;
- use Yii;
- use yii\helpers\Json;
- use common\helpers\LockHelper;
- use common\models\user\UserPartitionRelationship;
- class SpreadService
- {
- use ErrorTrait;
- public static $mallId = 0;
- public static $admin;
- /**
- * 绑定上下级关系处理
- *
- * @param int $pullUserId 选择下级用户ID
- * @param int $pushUserId 绑定上级用户ID
- * @param int $mallId 商城ID
- * @return bool
- */
- public static function bindingHandle($pullUserId,$pushUserId,$mallId,$admin)
- {
- self::$mallId = $mallId;
- self::$admin = $admin;
- $pullUser = DoubleCopyUser::find()->select('id,user_id,pos,pid,mall_id,help_num,team_num')->where(['mall_id'=>$mallId,'user_id'=>$pullUserId,'status' => StatusEnum::ENABLED])->asArray()->one();
- $pushUser = DoubleCopyUser::find()->select('id,user_id,pos,pid,mall_id,help_num,team_num')->where(['mall_id'=>$mallId,'user_id'=>$pushUserId,'status' => StatusEnum::ENABLED])->asArray()->one();
- //修改助力用户 团队数量 修改PID 等
- self::editHelpTeamNum($pullUser,$pushUser);
- //添加数据
- self::addSpread($pullUserId,$pushUserId,$pullUser['pid']);
- }
- /**
- * 绑定上级为平台
- *
- * @param int $pullUserId 选择下级用户ID
- * @param int $pushUserId 绑定上级用户ID
- * @param int $mallId 商城ID
- * @return bool
- */
- public static function bindingHandlePlatform($pullUserId,$mallId,$admin)
- {
- self::$mallId = $mallId;
- self::$admin = $admin;
- $pullUser = DoubleCopyUser::find()->select('id,user_id,pos,pid,mall_id,help_num,team_num')->where(['mall_id'=>$mallId,'user_id'=>$pullUserId,'status' => StatusEnum::ENABLED])->asArray()->one();
- $pushUser = DoubleCopyUser::find()->select('id,user_id,pos,pid,mall_id,help_num,team_num')->where(['mall_id'=>$mallId,'user_id'=>$pullUser['pid'],'status' => StatusEnum::ENABLED])->asArray()->one();
- //修改助力用户 团队数量 修改PID 等
- self::editHelpTeamNumPlatform($pullUser,$pushUser);
- //添加数据
- self::addSpread($pullUserId,0,$pullUser['pid']);
- }
- /**
- * 绑定上级为平台,修改助力用户 团队数量 修改PID
- *
- * @param [type] $pullUser 拉取下级用户
- * @param [type] $pushUser 绑定上级用户
- * @return void
- */
- public static function editHelpTeamNumPlatform($pullUser,$pushUser)
- {
- //修改该用户上级的团队数量(team_num)、助力用户数量(help_num)
- $userPidAllAttrs = self::recursionGetAllPidUser($pullUser);
- if($userPidAllAttrs) self::calculateTeamNum($userPidAllAttrs,'-',$pullUser['team_num']);
- if($pullUser['pid']) self::calculateHelpNum($pullUser['pid'],'-');
-
- //修改该用户的兄弟用户,pos都要-1个位置
- self::editPullPos($pullUser);
- //修改该用户的pid、topid、pos为0
- $editPid = DoubleCopyUser::findOne($pullUser['id']);
- $editPid->pid = 0;
- $editPid->topid = 0;
- $editPid->pos = 0;
- if(!$editPid->save()) throw new Exception('修改该用户的pid、topid、pos为0,失败');
- // 根据用户id,递归找出所有下级中,pos=1 || pos=2的下级,把这些用户的topid改为0
- if($pullUser['pid']) {
- $result = [];
- self::findDescendants($pullUser['user_id'], $result);
- DoubleCopyUser::updateAll(['topid' => 0, 'updated_at' => time()], ['id' => $result]);
- }
- }
- // 根据用户id,递归找出所有下级中,pos=1 || pos=2的下级
- public static function findDescendants($userId, &$result = [])
- {
- $children = DoubleCopyUser::find()
- ->select(['id', 'user_id', 'pid', 'topid', 'pos'])
- ->where(['pid' => $userId, 'status' => StatusEnum::ENABLED])
- ->asArray()->all();
- foreach ($children as $child) {
- // 如果 pos 为 1 或 2,加入结果
- if ($child['pos'] == 1 || $child['pos'] == 2) {
- $result[] = $child['id'];
- }
- // 递归查找下级
- self::findDescendants($child['user_id'], $result);
- }
- }
- /**
- * 修改助力用户 团队数量 修改PID
- *
- * @param [type] $pullUser 拉取下级用户
- * @param [type] $pushUser 绑定上级用户
- * @return void
- */
- public static function editHelpTeamNum($pullUser,$pushUser)
- {
- //修改拉取上级用户数量 团队 助力用户数量
- $userPidAllAttrs = self::recursionGetAllPidUser($pullUser);
- if($userPidAllAttrs) self::calculateTeamNum($userPidAllAttrs,'-',$pullUser['team_num']);
- if($pullUser['pid']) self::calculateHelpNum($pullUser['pid'],'-');
- //修改拉取POS位置
- self::editPullPos($pullUser);
- //修改绑定上级用户 团队 助力用户数量
- $userPushAllAttrs = self::recursionGetAllPidUser($pushUser);
- $userPushAllAttrs[] = $pushUser;
- self::calculateTeamNum($userPushAllAttrs,'+',$pullUser['team_num']);
- if($pushUser['user_id']) self::calculateHelpNum($pushUser['user_id'],'+');
- //修改推送Pos位置
- self::editPushPos($pullUser,$pushUser);
- //修改 Pid
- $editPid = DoubleCopyUser::findOne($pullUser['id']);
- $editPid->pid = $pushUser['user_id'];
- if(!$editPid->save()) throw new Exception("修改Pid失败");
- if($pullUser['pid']) self::editTopId($pullUser['pid']);
- if($pushUser['user_id']) self::editTopId($pushUser['user_id']);
- }
- /**
- * 获取PID上级所有用户
- *
- * @param array $user 用户
- * @return array
- */
- public static function recursionGetAllPidUser($userData,&$users = [])
- {
- $userData = DoubleCopyUser::find()
- ->select('id,user_id,pid,help_num,team_num,mall_id')
- ->where(['mall_id'=>self::$mallId,'user_id'=>$userData['pid'],'status' => StatusEnum::ENABLED])
- ->asArray()
- ->one();
- if($userData){
- $users[] = $userData;
- self::recursionGetAllPidUser($userData, $users);
- }
- return $users;
- }
- /**
- * 处理团队数量
- *
- * @param array $aggregate 数组循环
- * @param string $rule +或者-
- * @param integer $step 增加数量
- * @return void
- */
- public static function calculateTeamNum($aggregate,$rule='+',$step=0)
- {
- $num = $step + 1;//修改的数量
- foreach ($aggregate as $k=>$v){
- $spread = DoubleCopyUser::findOne($v['id']);
- if($rule == '+'){
- $spread->team_num = bcadd($v['team_num'],$num);
- }else if ($rule == '-') {
- $spread->team_num = bcsub($v['team_num'],$num);
- }
- if(!$spread->save()) throw new Exception("处理团队数量修改失败");
- }
- }
- /**
- * 处理助力用户数量
- *
- * @param [type] 要处理的上级ID
- * @param string $rule
- * @return void
- */
- public static function calculateHelpNum($pid,$rule='+')
- {
- $spread = DoubleCopyUser::find()->where(['user_id'=>$pid,'mall_id'=>self::$mallId,'status' => StatusEnum::ENABLED])->one();
- if(!$spread) return false;
- if($rule == '+'){
- $spread->help_num = bcadd($spread['help_num'],1);
- }else if ($rule == '-') {
- $spread->help_num = bcsub($spread['help_num'],1);
- }
- if(!$spread->save()) throw new Exception('修改处理助力用户数量失败');
- }
- /**
- * 修改拉取用户链的Pos
- *
- * @param [type] $pullUser 拉取用户
- * @return bool
- */
- public static function editPullPos($pullUser)
- {
- $users = DoubleCopyUser::find()
- ->select('id,user_id,pos')
- ->where(['status' => StatusEnum::ENABLED,'pid'=>$pullUser['pid'],'mall_id'=>self::$mallId])
- ->andWhere(['>','pos',$pullUser['pos']])
- ->asArray()
- ->all();
- if(empty($users)) return true;
- foreach ($users as $user) {
- $editUserPos = DoubleCopyUser::findOne($user['id']);
- $editUserPos->pos = bcsub($user['pos'],1);
- if(!$editUserPos->save()) throw new Exception('修改用户链的POS失败');
- }
- }
- /**
- * 修改推送用户链的Pos
- *
- * @param [type] $pullUser 拉取用户
- * @param [type] $pushUser 推送用户
- * @return bool
- */
- public static function editPushPos($pullUser,$pushUser)
- {
- $user = DoubleCopyUser::find()
- ->select('id,user_id,pos')
- ->where(['status' => StatusEnum::ENABLED,'pid'=>$pushUser['user_id'],'mall_id'=>self::$mallId])
- ->orderBy(['pos' => SORT_DESC])
- ->asArray()
- ->one();
- $num = empty($user['pos'])? 1 :$user['pos']+1;
- $editUserPos = DoubleCopyUser::findOne($pullUser['id']);
- $editUserPos->pos = $num;
- if(!$editUserPos->save()) throw new Exception('修改推送用户链的POS失败');
- }
- /**
- * 批量修改TOPID
- *
- * @param int 输入关系链的上一级的USERID
- * @return void
- */
- public static function editTopId($userId)
- {
- $boss_level = DoubleCopyLevel::find()->select('upgrade_type_condition, checked_condition_values')->where(['mall_id' => self::$mallId, 'level' => DoubleCopyEnum::LEVEL_BOSS, 'status' => StatusEnum::ENABLED])->asArray()->one();
- $upgrade_num = 0;// 需要直推的升级数量
- // json解析升级条件数量
- $json = Json::decode($boss_level['checked_condition_values'], true);
- $upgrade_num = $json[0]['value']['val0'] ?? 0;
- $copy_user = DoubleCopyUser::findOne(['user_id' => $userId, 'status' => StatusEnum::ENABLED]);
- if (!empty($copy_user)) self::batchGetUsers($copy_user,$upgrade_num);// 非空处理,避免原上级并非二二复制用户情况
- }
- /**
- * 添加推广变更列表
- *
- * @param int $pullUserId 拉取用户
- * @param int $pushUserId 推送用户
- * @return void
- */
- public static function addSpread($pullUserId,$pushUserId,$originalUserid)
- {
- $add = new DoubleCopySpread();
- $add->pull_user_id = $pullUserId;
- $add->push_user_id = $pushUserId;
- $add->mall_id = self::$mallId;
- $add->original_pid = $originalUserid;
- $add->admin_id = self::$admin->id;
- if(!$add->save()) throw new Exception('推广变更列表失败');
- }
- /**
- * 批量修改用户位置
- * @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)
- {
-
- $child_list = self::getAllUserIDs($changeUser->user_id);
- foreach ($child_list as $item) {
- if ($item == $changeUser->user_id) {
- $user = $changeUser;
- } else {
- $user = DoubleCopyUser::findOne(['user_id' => $item, 'status' => StatusEnum::ENABLED]);
- }
- if ($user) {
- self::updateTopId($user, $upgrade_num);
- }
- }
- }
- /**
- *
- * @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)
- {
- $parent_ids = self::recursionGetAllPidUser($user);
- $parent_ids = array_column($parent_ids,'user_id');// 倒序数组
- 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 && $user->pid != 0) {
- $user->topid = $topid;
- $user->save();
- }
- }
- /**
- * 获取用户的所有下级 包括自己
- *
- * @param [type] $topUserId 顶级用户ID
- * @return array
- */
- public static function getAllUserIDs($topUserId)
- {
- $result = [$topUserId];
- $subUsers = DoubleCopyUser::find()->where(['pid' => $topUserId])->all();
- foreach ($subUsers as $user) {
- $result[] = $user->user_id;
- $result = array_merge($result, self::getAllUserIDs($user->user_id));
- }
- $result = array_unique($result);
- return $result;
- }
- /**
- * 判断是否是主商城关系链
- *
- * @param [type] $pullUserId 下级用户ID
- * @param [type] $pushUserId 上级用户ID
- * @return bool
- */
- public static function valPidIsMall($pullUserId,$pushUserId)
- {
- $pullTree = UserPartitionRelationship::getTree($pullUserId);
- $deep = $pullTree[1] - 1;
- $pullstrTree = $pullTree[0];
- $lastCommaPos = strrpos($pullstrTree, ',');
- if ($lastCommaPos !== false) {
- $str = substr($pullstrTree, 0, $lastCommaPos);
- } else {
- $str = $pullstrTree;
- }
- $treeUser = UserPartitionRelationship::find()->where(['deep'=>$deep,'tree'=>$str])->asArray()->one();
- if($pushUserId == $treeUser['user_id']){
- return true;
- }else{
- return false;
- }
- }
- }
|