'正常', -1 => '冻结', ]; /** * 添加分销商 * @param $data * @return mixed */ public function addFenxiao($data) { $fenxiao_info = model('fenxiao')->getInfo( [[ 'member_id', '=', $data[ 'member_id' ] ], [ 'is_delete', '=', 0 ] ], 'fenxiao_id' ); if (!empty($fenxiao_info)) return $this->error('', '已经是分销商了'); $data[ 'fenxiao_no' ] = date('YmdHi') . rand(1000, 9999); $data[ 'create_time' ] = time(); $data[ 'audit_time' ] = time(); model('fenxiao')->startTrans(); try { if (!empty($data[ 'parent' ])) { //添加上级分销商一级下线人数 model('fenxiao')->setInc([ [ 'fenxiao_id', '=', $data[ 'parent' ] ], [ 'is_delete', '=', 0 ] ], 'one_child_fenxiao_num'); //获取上上级分销商id $grand_parent_id = model('fenxiao')->getInfo([ [ 'fenxiao_id', '=', $data[ 'parent' ] ], [ 'is_delete', '=', 0 ] ], 'parent'); if (!empty($grand_parent_id) && $grand_parent_id[ 'parent' ] != 0) { //添加上上级分销商二级下线人数 model('fenxiao')->setInc([ [ 'fenxiao_id', '=', $grand_parent_id[ 'parent' ] ] ], 'two_child_fenxiao_num'); $data[ 'grand_parent' ] = $grand_parent_id[ 'parent' ]; } // 分销商检测升级 event('FenxiaoUpgrade', [ 'fenxiao_id' => $data[ 'parent' ] ]); } $res = model('fenxiao')->add($data); $nodeInfo = event('NodeParent', $data, true); if ($nodeInfo) { model('fenxiao')->update($nodeInfo, [['fenxiao_id', '=', $res]]); } //修改会员信息 model('member')->update([ 'fenxiao_id' => $res, 'is_fenxiao' => 1 ], [ [ 'member_id', '=', $data[ 'member_id' ] ] ]); $stat_model = new Stat(); $stat_model->switchStat([ 'type' => 'add_fenxiao_member', 'data' => [ 'site_id' => $data[ 'site_id' ] ] ]); model('fenxiao')->commit(); return $this->success($res); } catch (\Exception $e) { model('fenxiao')->rollback(); return $this->error('', $e->getMessage()); } } /** * 冻结 * @param $fenxiao_id * @return array */ public function frozen($fenxiao_id) { $data = [ 'status' => -1, 'lock_time' => time() ]; $res = model('fenxiao')->update($data, [ [ 'fenxiao_id', '=', $fenxiao_id ] ]); return $this->success($res); } /** * 解冻 * @param $fenxiao_id * @return array */ public function unfrozen($fenxiao_id) { $data = [ 'status' => 1, 'lock_time' => time() ]; $res = model('fenxiao')->update($data, [ [ 'fenxiao_id', '=', $fenxiao_id ] ]); return $this->success($res); } /** * 获取分销商详细信息 * @param array $condition * @param string $field * @return array */ public function getFenxiaoInfo($condition = [], $field = '*') { $condition[] = [ 'is_delete', '=', 0 ]; $res = model('fenxiao')->getInfo($condition, $field); return $this->success($res); } /** * 获取分销商详细信息 * @param array $condition * @param string $field * @return array */ public function getFenxiaoDetailInfo($condition = []) { $condition[] = [ 'f.is_delete', '=', 0 ]; $field = 'f.*,pf.fenxiao_name as parent_name,nm.username,nm.nickname,nm.headimg,nm.order_num,nm.order_money,fl.level_num'; $alias = 'f'; $join = [ [ 'fenxiao pf', 'pf.fenxiao_id = f.parent', 'left' ], [ 'member nm', 'nm.member_id = f.member_id', 'left' ], [ 'fenxiao_level fl', 'f.level_id = fl.level_id', 'left' ] ]; $res = model('fenxiao')->getInfo($condition, $field, $alias, $join); return $this->success($res); } /** * 获取分销列表 * @param array $condition * @param string $field * @param string $order * @param string $limit */ public function getFenxiaoList($condition = [], $field = '*', $order = '', $limit = null) { $condition[] = [ 'is_delete', '=', 0 ]; $list = model('fenxiao')->getList($condition, $field, $order, '', '', '', $limit); return $this->success($list); } /** * 获取分销分页列表 * @param array $condition * @param number $page * @param string $page_size * @param string $order * @param string $field */ public function getFenxiaoPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '') { $condition[] = [ 'f.is_delete', '=', 0 ]; $field = 'f.*,pf.fenxiao_name as parent_name,pf.mobile as parent_mobile,m.username,m.nickname,m.mobile as member_mobile,m.headimg'; $alias = 'f'; $join = [ [ 'fenxiao pf', 'pf.fenxiao_id = f.parent', 'left' ], [ 'member m', 'm.member_id = f.member_id', 'left' ] ]; $list = model('fenxiao')->pageList($condition, $field, $order, $page, $page_size, $alias, $join); if (!empty($list[ 'list' ])) { foreach ($list[ 'list' ] as $k => $v) { $team_num = $this->getFenxiaoTeamNum($v[ 'fenxiao_id' ], $v[ 'site_id' ]); $list[ 'list' ][ $k ][ 'team_num' ] = $team_num[ 'data' ][ 'num' ]; // if (empty($v['username'])) $list['list'][$k]['username'] = '--'; // if (empty($v['nickname'])) $list['list'][$k]['nickname'] = '--'; // if (empty($v['member_mobile'])) $list['list'][$k]['member_mobile'] = '--'; } } return $this->success($list); } /** * 获取分销分页列表2 * @param array $condition * @param int $page * @param int $page_size * @param string $order * @param string $field * @return array */ public function getFenxiaoPageLists($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*', $alias = 'a', $join = null) { $list = model('fenxiao')->pageList($condition, $field, $order, $page, $page_size, $alias, $join, ''); return $this->success($list); } /** * 获取分销商团队 * @param $level * @param $fenxiao_id * @param int $page * @param int $page_size * @param int $is_pay * @return array */ public function getFenxiaoTeam($level, $fenxiao_id, $page = 1, $page_size = PAGE_LIST_ROWS, $is_pay = 0) { $condition = ''; // 下级分销商id集合 $one_level_fenxiao = model('fenxiao')->getColumn([ [ 'parent', '=', $fenxiao_id ] ], 'fenxiao_id'); switch ( $level ) { // 一级分销 case 1: // 直属会员 + 直属下级分销商 $or = " OR (f.parent = {$fenxiao_id}) "; $condition = "( (m.fenxiao_id = {$fenxiao_id} AND m.is_fenxiao = 0) " . $or . ") AND m.is_delete = 0"; break; // 二级分销 case 2: // 直属下级分销商的下级分销商 + 直属下级分销商的会员 if (!empty($one_level_fenxiao)) { $or = " OR (f.parent in (" . implode($one_level_fenxiao) . ") ) "; $condition = "( (m.is_fenxiao = 0 AND m.fenxiao_id in (" . implode(',', $one_level_fenxiao) . ") )" . $or . ") AND m.is_delete = 0"; } break; } if (empty($condition)) return $this->success([ 'page_count' => 1, 'count' => 0, 'list' => [] ]); if ($is_pay) $condition .= ' AND m.order_num > 0'; $condition .= ''; $field = 'm.member_id,m.nickname,m.headimg,m.is_fenxiao,m.reg_time,m.order_money,m.order_complete_money,m.order_num,m.order_complete_num,m.bind_fenxiao_time,f.fenxiao_id,f.fenxiao_no,f.fenxiao_name,f.audit_time,f.level_name,f.one_child_num,f.one_child_fenxiao_num'; $alias = 'm'; $join = [ [ 'fenxiao f', 'm.member_id = f.member_id', 'left' ] ]; $list = model('member')->pageList($condition, $field, 'm.bind_fenxiao_time desc', $page, $page_size, $alias, $join); return $this->success($list); } public function getFenxiaoTeamCount($level, $fenxiao_id, $is_pay = 0){ $condition = ''; // 下级分销商id集合 $one_level_fenxiao = model('fenxiao')->getColumn([ [ 'parent', '=', $fenxiao_id ] ], 'fenxiao_id'); switch ( $level ) { // 一级分销 case 1: // 直属会员 + 直属下级分销商 $or = " OR (f.parent = {$fenxiao_id}) "; $condition = "( (m.fenxiao_id = {$fenxiao_id} AND m.is_fenxiao = 0) " . $or . ") AND m.is_delete = 0"; break; // 二级分销 case 2: // 直属下级分销商的下级分销商 + 直属下级分销商的会员 if (!empty($one_level_fenxiao)) { $or = " OR (f.parent in (" . implode($one_level_fenxiao) . ") ) "; $condition = "( (m.is_fenxiao = 0 AND m.fenxiao_id in (" . implode(',', $one_level_fenxiao) . ") )" . $or . ") AND m.is_delete = 0"; } break; } if (empty($condition)) return 0; if ($is_pay) $condition .= ' AND m.order_num > 0'; $condition .= ''; $alias = 'm'; $join = [ [ 'fenxiao f', 'm.member_id = f.member_id', 'left' ] ]; return model('member')->getCount($condition,'m.member_id',$alias,$join); } /** * 查询我的团队的数量 * @param unknown $fenxiao_id * @return array */ public function getFenxiaoTeamNum($fenxiao_id, $site_id) { // 查询分销基础配置 $config_model = new Config(); $fenxiao_basic_config = $config_model->getFenxiaoBasicsConfig($site_id)[ 'data' ][ 'value' ]; $level = $fenxiao_basic_config[ 'level' ]; $num = model('member')->getCount([ [ 'fenxiao_id', '=', $fenxiao_id ], [ 'is_fenxiao', '=', 0 ], [ 'is_delete', '=', 0 ] ]); // 下级分销商id集合 $one_level_fenxiao = model('fenxiao')->getColumn([ [ 'parent', '=', $fenxiao_id ], [ 'is_delete', '=', 0 ] ], 'fenxiao_id'); $return = [ 'num' => $num, // 总人数 'member_num' => $num, // 会员人数 'fenxiao_num' => 0 // 分销商人数 ]; switch ( $level ) { case 1: $return[ 'num' ] += count($one_level_fenxiao); $return[ 'fenxiao_num' ] += count($one_level_fenxiao); break; case 2: if (!empty($one_level_fenxiao)) { $return[ 'num' ] += count($one_level_fenxiao); $return[ 'fenxiao_num' ] += count($one_level_fenxiao); $num = model('member')->getCount([ [ 'fenxiao_id', 'in', $one_level_fenxiao ], [ 'is_fenxiao', '=', 0 ], [ 'is_delete', '=', 0 ] ]); $return[ 'num' ] += $num; $return[ 'member_num' ] += $num; $num = model('fenxiao')->getCount([ [ 'parent', 'in', $one_level_fenxiao ], [ 'is_delete', '=', 0 ] ], 'fenxiao_id'); $return[ 'num' ] += $num; $return[ 'fenxiao_num' ] += $num; } break; } return $this->success($return); } /** * 会员注册之后 * @param unknown $member_id */ public function memberRegister($member_id, $site_id) { //如果有推荐人则要修改分享关系 $member_model = new Member(); $member_info = $member_model->getMemberInfo([ [ 'member_id', '=', $member_id ] ], 'source_member')[ 'data' ]; if (!empty($member_info[ 'source_member' ])) { $member_model->alterShareRelation($member_id, $member_info[ 'source_member' ], $site_id); } $this->autoBecomeFenxiao($member_id, $site_id); } /** * 自动成为分销商 * @param unknown $member_id */ public function autoBecomeFenxiao($member_id, $site_id) { $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ], [ 'site_id', '=', $site_id ], [ 'is_delete', '=', 0 ] ], 'order_num,order_complete_num,order_money,order_complete_money,is_fenxiao'); if (empty($member_info)) return $this->error('', '未查询到会员信息'); $fenxiao_info = $this->getFenxiaoDetailInfo([ [ 'f.member_id', '=', $member_id ] ])[ 'data' ]; if (!empty($fenxiao_info) && $member_info[ 'is_fenxiao' ]) return $this->error('', '已经是分销商'); try { $config = new Config(); // 分销商基础设置 $basics_config = $config->getFenxiaoBasicsConfig($site_id); $basics_config = $basics_config[ 'data' ][ 'value' ]; if (!$basics_config[ 'level' ]) return $this->error('', '未开启分销'); if ($basics_config[ 'is_apply' ] != 0) return $this->error('', '成为分销商需进行申请'); // 成为分销商的资格 $fenxiao_config = $config->getFenxiaoConfig($site_id); $fenxiao_config = $fenxiao_config[ 'data' ][ 'value' ]; switch ( $fenxiao_config[ 'fenxiao_condition' ] ) { case 2: // 消费次数 if ($fenxiao_config[ 'consume_condition' ] == 1 && $member_info[ 'order_num' ] < $fenxiao_config[ 'consume_count' ]) return $this->error('', '未满足成为分销商的条件'); if ($fenxiao_config[ 'consume_condition' ] == 2 && $member_info[ 'order_complete_num' ] < $fenxiao_config[ 'consume_count' ]) return $this->error('', '未满足成为分销商的条件'); break; case 3: // 消费金额 if ($fenxiao_config[ 'consume_condition' ] == 1 && bccomp($member_info[ 'order_money' ], $fenxiao_config[ 'consume_money' ], 2) == -1) return $this->error('', '未满足成为分销商的条件'); if ($fenxiao_config[ 'consume_condition' ] == 2 && bccomp($member_info[ 'order_complete_money' ], $fenxiao_config[ 'consume_money' ], 2) == -1) return $this->error('', '未满足成为分销商的条件'); break; case 4: // 购买指定商品 $condition = [ [ 'goods_id', 'in', $fenxiao_config[ 'goods_ids' ] ], ]; if ($fenxiao_config[ 'consume_condition' ] == 1) $condition[] = [ 'pay_status', '=', 1 ]; if ($fenxiao_config[ 'consume_condition' ] == 2) $condition[] = [ 'order_status', '=', OrderCommon::ORDER_COMPLETE ]; $count = model('order_goods')->getCount($condition, 'order_goods_id', 'og', [ [ 'order o', 'o.order_id = og.order_id', 'inner' ] ]); if (!$count) return $this->error('', '未满足成为分销商的条件'); break; } return $this->directlyBecomeFenxiao($member_id); } catch (\Exception $e) { return $this->error(); } } /** * 会员直接成为分销商 */ public function directlyBecomeFenxiao($member_id) { //获取用户信息 $member_field = 'member_id,site_id,source_member,fenxiao_id,nickname,headimg,mobile,reg_time,order_money,order_complete_money,order_num,order_complete_num'; $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ] ], $member_field); if (!empty($member_info)) { $parent = 0; if (!empty($member_info[ 'source_member' ])) { $fenxiao_info = model('fenxiao')->getInfo([ [ 'member_id', '=', $member_info[ 'source_member' ] ], [ 'is_delete', '=', 0 ] ], 'fenxiao_id'); if (!empty($fenxiao_info)) $parent = $fenxiao_info[ 'fenxiao_id' ]; } //获取分销等级信息 $level_model = new FenxiaoLevel(); $level_info = $level_model->getLevelInfo([ [ 'site_id', '=', $member_info[ 'site_id' ] ], [ 'is_default', '=', 1 ] ], 'level_id,level_name'); $data = [ 'site_id' => $member_info[ 'site_id' ], 'fenxiao_name' => $member_info[ 'nickname' ], 'mobile' => $member_info[ 'mobile' ], 'member_id' => $member_info[ 'member_id' ], 'parent' => $parent, 'level_id' => $level_info[ 'data' ][ 'level_id' ], 'level_name' => $level_info[ 'data' ][ 'level_name' ] ]; $res = $this->addFenxiao($data); return $res; } } /** * 绑定上下线关系 * TODO 订单创建对返回结果进行检测 不可返回失败 * @param $param * @return array|void */ public function bindRelation($param) { $site_id = $param[ 'site_id' ] ?? 0; $member_id = $param[ 'member_id' ] ?? 0; $action = $param[ 'action' ] ?? ''; $config = [ 'alter_share_relation' => 1,//对应 首次点击链接后绑定 'order_create' => 2,//对应 首次下单后绑定 'order_pay' => 3,//对应 首次付款后绑定 ]; if (!isset($config[ $action ])) return; //检测触发场景和设置是否匹配 $config_model = new ConfigModel(); $child_condition = $config_model->getFenxiaoRelationConfig($site_id)[ 'data' ][ 'value' ][ 'child_condition' ]; if ($child_condition != $config[ $action ]) return; //检测用户 $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ], ], 'share_member,fenxiao_id'); if (empty($member_info)) return; //如果已经是分销商 不可以再修改关系 if (!empty($member_info['fenxiao_id'])) return; // 查询推荐人是否是分销商 $fenxiao_info = model('fenxiao')->getInfo([ [ 'member_id', '=', $member_info[ 'share_member' ] ], [ 'is_delete', '=', 0 ], ], 'fenxiao_id'); if (empty($fenxiao_info)) return; model('member')->startTrans(); try { $member_data = [ 'fenxiao_id' => $fenxiao_info[ 'fenxiao_id' ], 'bind_fenxiao_time' => time() ]; model('member')->update($member_data, [ [ 'member_id', '=', $member_id ] ]); model('fenxiao')->setInc([ [ 'fenxiao_id', '=', $fenxiao_info[ 'fenxiao_id' ] ] ], 'one_child_num'); // 分销商检测升级 event('FenxiaoUpgrade', [ 'fenxiao_id' => $fenxiao_info[ 'fenxiao_id' ] ]); // 关系链改变 Queue::push(RelationshipChainChangesJob::class,[ 'member_id' => $member_id ]); model('member')->commit(); return $this->success(); } catch (\Exception $e) { model('member')->rollback(); return; } } /** * 分销商检测升级 * @param unknown $fenxiao_id */ public function fenxiaoUpgrade($fenxiao_id, $orderId = 0){ $where = [ ['f.fenxiao_id','=',$fenxiao_id], ['f.status','=',1], ['f.is_delete','=',0], [ 'f.is_delete', '=', 0 ] ]; $join = [ [ 'member m', 'f.member_id = m.member_id', 'inner' ], [ 'fenxiao_level fl', 'f.level_id = fl.level_id', 'inner' ] ]; $field = [ 'f.level_id', 'm.order_num', 'm.order_money', 'f.one_fenxiao_order_num', 'f.one_fenxiao_order_money', 'f.one_fenxiao_total_order', 'f.one_child_num', 'f.one_child_fenxiao_num', 'fl.one_rate', 'fl.level_num', 'f.site_id' ]; $fenxiao_info = model('fenxiao')->getInfo($where, $field, 'f', $join); if (!empty($fenxiao_info)) { $level_list = model('fenxiao_level')->getList([ ['site_id','=',$fenxiao_info['site_id']], ['level_num','>',$fenxiao_info['level_num']] ],'*','level_num asc,one_rate asc'); if (!empty($level_list)) { $upgrade_level = null; foreach ($level_list as $item) { // 判断:是否需要判断购买指定商品之一升级 $goodsReach = true;// 默认条件达成 $goodsIds = $item['goods_ids'] ?? ''; $goodsIdsArr = $goodsIds && $orderId > 0 ? explode(',', $goodsIds) : []; if($orderId > 0 && count($goodsIdsArr) > 0){ $isBuy = (int)model('order_goods')->getValue([ ['order_id', '=', $orderId], ['goods_id', 'in', $goodsIdsArr], ],'order_goods_id'); $goodsReach = $isBuy > 0; } if($item['one_child_fenxiao_equal']){ $equal_where = [ ['f.chain', 'like', '%' . $fenxiao_id . ',' . '%' ], ['f.status','=',1], ['f.is_delete','=',0], ['fl.level_num','>=',$fenxiao_info['level_num']], ]; //查询用户下线中是否有相同等级或更高的 $one_child_fenxiao_equal_num = model('fenxiao')->getCount($equal_where, '*', 'f', $join); }else{ $one_child_fenxiao_equal_num = 0; } // 判断:是否升级 if ($item[ 'upgrade_type' ] == 2) { // 需要满足全部条件 if ($fenxiao_info[ 'order_num' ] >= $item[ 'order_num' ] && $fenxiao_info[ 'order_money' ] >= $item[ 'order_money' ] && $fenxiao_info[ 'one_fenxiao_order_num' ] >= $item[ 'one_fenxiao_order_num' ] && $fenxiao_info[ 'one_fenxiao_total_order' ] >= $item[ 'one_fenxiao_total_order' ] && $fenxiao_info[ 'one_fenxiao_order_money' ] >= $item[ 'one_fenxiao_order_money' ] && $fenxiao_info[ 'one_child_num' ] >= $item[ 'one_child_num' ] && (($fenxiao_info[ 'one_child_fenxiao_num' ] >= $item[ 'one_child_fenxiao_num' ] && $item['one_child_fenxiao_equal'] == 0) || ($item['one_child_fenxiao_equal'] == 1 && $one_child_fenxiao_equal_num >= $item[ 'one_child_fenxiao_num' ])) && $goodsReach ) { $upgrade_level = $item; break; } } else { // 满足条件之一即可 if (($fenxiao_info[ 'order_num' ] >= $item[ 'order_num' ] && $item[ 'order_num' ] > 0 ) || ( $fenxiao_info[ 'order_money' ] >= $item[ 'order_money' ] && $item[ 'order_money' ] > 0 ) || ( $fenxiao_info[ 'one_fenxiao_order_num' ] >= $item[ 'one_fenxiao_order_num' ] && $item[ 'one_fenxiao_order_num' ] > 0 ) || ( $fenxiao_info[ 'one_fenxiao_order_money' ] >= $item[ 'one_fenxiao_order_money' ] && $item[ 'one_fenxiao_order_money' ] > 0 ) || ( $fenxiao_info[ 'one_fenxiao_total_order' ] >= $item[ 'one_fenxiao_total_order' ] && $item[ 'one_fenxiao_total_order' ] > 0 ) || ( $fenxiao_info[ 'one_child_num' ] >= $item[ 'one_child_num' ] && $item[ 'one_child_num' ] > 0 ) || ( $fenxiao_info[ 'one_child_fenxiao_num' ] >= $item[ 'one_child_fenxiao_num' ] && $item[ 'one_child_fenxiao_num' ] > 0 && $item['one_child_fenxiao_equal'] == 0 ) || ( $fenxiao_info[ 'one_child_fenxiao_num' ] >= $item[ 'one_child_fenxiao_num' ] && $item[ 'one_child_fenxiao_num' ] > 0 && $item['one_child_fenxiao_equal'] == 1 && $one_child_fenxiao_equal_num >= $item[ 'one_child_fenxiao_num' ]) || ( $goodsReach && count($goodsIdsArr) > 0) ) { $upgrade_level = $item; break; } } } if ($upgrade_level) { model('fenxiao')->update([ 'level_id' => $upgrade_level[ 'level_id' ], 'level_name' => $upgrade_level[ 'level_name' ] ], [ [ 'fenxiao_id', '=', $fenxiao_id ] ]); } } } } /** * 获取下一个可升级的分销商等级 及当前分销商已达成的条件 * @param $member_id * @param $site_id */ public function geFenxiaoNextLevel($member_id, $site_id) { $array = []; $join = [ [ 'member m', 'f.member_id = m.member_id', 'inner' ], [ 'fenxiao_level fl', 'f.level_id = fl.level_id', 'inner' ] ]; $fenxiao_info = model('fenxiao')->getInfo( [ [ 'f.member_id', '=', $member_id ], [ 'f.site_id', '=', $site_id ], [ 'f.status', '=', 1 ], [ 'f.is_delete', '=', 0 ] ], 'f.level_id,m.order_num,m.order_money,f.one_fenxiao_order_num,f.one_fenxiao_order_money,f.one_child_num,f.one_child_fenxiao_num,fl.one_rate,fl.level_num', 'f', $join ); $array[ 'fenxiao' ] = $fenxiao_info; $last_level = []; if (!empty($fenxiao_info)) { $last_level = model('fenxiao_level')->getFirstData([ [ 'site_id', '=', $site_id ], [ 'level_num', '>=', $fenxiao_info[ 'level_num' ] ], [ 'level_id', '<>', $fenxiao_info[ 'level_id' ] ] ], '*', 'level_num asc,one_rate asc'); } $array[ 'last_level' ] = $last_level; return $this->success($array); } /** * 变更上下级关系 * @param $member_id * @param $parent */ public function changeParentFenxiao($member_id, $parent) { if ($member_id == '' || $member_id == 0) { return $this->error('', '参数member_id不能为空'); } if ($parent == '' || $parent == 0) { return $this->error('', '上级分销商不能为空'); } //获取上级分销商id $parent_info = model('fenxiao')->getInfo([ [ 'fenxiao_id', '=', $parent ], [ 'is_delete', '=', 0 ] ]); if (empty($parent_info)) { return $this->error('', '上级分销商不存在'); } //用户信息 $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ] ], 'fenxiao_id,is_fenxiao'); if (empty($member_info)) { return $this->error('', '用户不存在'); } model('fenxiao')->startTrans(); try { $fenxiao_info = model('fenxiao')->getInfo([ [ 'fenxiao_id', '=', $member_info[ 'fenxiao_id' ] ], [ 'is_delete', '=', 0 ] ], 'parent'); if ($member_info[ 'is_fenxiao' ] == 1 && $fenxiao_info) {//是分销商 $fenxiao_info = model('fenxiao')->getInfo([['fenxiao_id', '=', $member_info['fenxiao_id']], ['is_delete', '=', 0]], 'parent,chain'); //修改原有上级分销商团队人数 if ($fenxiao_info['parent'] > 0) { //获取原有上级分销商信息 model('fenxiao')->setDec([['fenxiao_id', '=', $fenxiao_info['parent']]], 'one_child_fenxiao_num'); $like = '%' . $fenxiao_info['chain'] . '%'; //修改下级的上上级id model('fenxiao')->update( ['grand_parent' => $parent], [['parent', '=', $member_info['fenxiao_id']], ['parent', '=', $fenxiao_info['parent']]] ); } else { $like = '%' . $member_info['fenxiao_id'] . ',%'; } $old_chain = str_replace('%', '', $like); $old_count = $this->getExplodeArrFilterCount($old_chain); //修改变更后的上级分销商团队人数 model('fenxiao')->setInc([ [ 'fenxiao_id', '=', $parent ] ], 'one_child_fenxiao_num'); //修改上级分销商 $chain = $parent_info['chain'] ? $parent_info['chain'] . ',' . $member_info['fenxiao_id'] . ',' : $parent . ',' . $member_info['fenxiao_id'] . ','; $count = $this->getExplodeArrFilterCount($chain); model('fenxiao')->update( ['parent' => $parent, 'grand_parent' => $parent_info['parent'], 'chain' => $chain, 'depth_level' => $parent_info['depth_level'] + 1, ], [['fenxiao_id', '=', $member_info['fenxiao_id']]] ); $member_info_id = $member_info['fenxiao_id']; //先修改下级节点深度 if ($old_count > $count) { //如果旧的节点深度 > 新的节点深度,那么下级的节点深度统统减少 $sub = $old_count - $count; model('fenxiao')->setDec([['chain', 'like', $like], ['fenxiao_id', '<>', $member_info_id]], 'depth_level', $sub); } else if ($old_count < $count) { //如果旧节点深度 < 新的节点深度,那么下级的节点深度都要增加 $add = $count - $old_count; model('fenxiao')->setInc([['chain', 'like', $like], ['fenxiao_id', '<>', $member_info_id]], 'depth_level', $add); } //节点深度相同不作处理 //修改下级路由节点 $table = 'tk_fenxiao'; // $old_chain = $old_chain.','; //修改fenxiao表,匹配chain字段是否有$old_chain字段中的值,替换成$chain,查询条件变换 $sql = "UPDATE `{$table}` SET chain = REPLACE(chain,'$old_chain','$chain') WHERE chain LIKE '$like' AND fenxiao_id <> '$member_info_id'"; Db::query($sql); } else {//不是分销商 //修改上级分销商 model('member')->update([ 'fenxiao_id' => $parent ], [ [ 'member_id', '=', $member_id ] ]); //修改变更后的上级分销商团队人数 model('fenxiao')->update([ 'one_child_num' => $parent_info[ 'one_child_num' ] + 1 ], [ [ 'fenxiao_id', '=', $parent ] ]); } // 关系链改变 Queue::push(RelationshipChainChangesJob::class,[ 'member_id' => $member_id ]); model('fenxiao')->commit(); return $this->success(); } catch (\Exception $e) { model('fenxiao')->rollback(); return $this->error('', $e->getMessage()); } } /** * 取消上级分销商 * @param $member_id * @param $parent */ public function cancelParentFenxiao($member_id) { if ($member_id == '' || $member_id == 0) { return $this->error('', '参数member_id不能为空'); } //用户信息 $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ] ], 'fenxiao_id,is_fenxiao'); if (empty($member_info)) { return $this->error('', '用户不存在'); } model('fenxiao')->startTrans(); try { if ($member_info['is_fenxiao'] == 1) {//是分销商 $fenxiao_info = model('fenxiao')->getInfo( [['fenxiao_id', '=', $member_info['fenxiao_id']], ['is_delete', '=', 0]], ); //修改原有上级分销商团队人数 if ($fenxiao_info['parent'] > 0) { //获取原有上级分销商信息 model('fenxiao')->setDec([['fenxiao_id', '=', $fenxiao_info['parent']]], 'one_child_fenxiao_num'); $like = '%' . $fenxiao_info['chain'] . '%'; } else { $like = '%,' . $member_info['fenxiao_id'] . ',%'; } $old_chain = str_replace('%', '', $like); $old_count = $this->getExplodeArrFilterCount($old_chain); $chain = ''; //修改上级分销商和路由节点 model('fenxiao')->update(['parent' => '0', 'grand_parent' => '0', 'chain' => $chain, 'depth_level' => 1], [['fenxiao_id', '=', $member_info['fenxiao_id']]]); //先修改下级节点深度 $member_info_id = $member_info['fenxiao_id']; //下级的节点深度统统减少 $sub = $old_count - 1; model('fenxiao')->setDec([['chain', 'like', $like], ['fenxiao_id', '<>', $member_info_id]], 'depth_level', $sub); //修改下级路由节点 $chain = ',' . $member_info_id . ','; $table = 'tk_fenxiao'; //修改fenxiao表,匹配chain字段是否有$old_chain字段中的值,替换成$chain,查询条件变换 $sql = "UPDATE `{$table}` SET chain = REPLACE(chain,'$old_chain','$chain') WHERE chain LIKE '$like' AND fenxiao_id <> '$member_info_id'"; Db::query($sql); } model('fenxiao')->commit(); return $this->success(); } catch (\Exception $e) { model('fenxiao')->rollback(); return $this->error('', $e->getMessage()); } } /** * 获取上级分销商名称 * @param $fenxiao_id * @param int $type 1-上级 * @return mixed|string */ public function getParentFenxiaoName($fenxiao_id, $type = 1) { if ($fenxiao_id == 0) { return ''; } if ($type == 1) { $fenxiao_name = model('fenxiao')->getValue([ [ 'fenxiao_id', '=', $fenxiao_id ] ], 'fenxiao_name'); return $fenxiao_name; } else { $parent = model('fenxiao')->getValue([ [ 'fenxiao_id', '=', $fenxiao_id ] ], 'parent'); if ($parent == 0) { return ''; } else { $fenxiao_name = model('fenxiao')->getValue([ [ 'fenxiao_id', '=', $parent ] ], 'fenxiao_name'); return $fenxiao_name; } } } /** * 会员注销删除分销商 * @param $member_id * @param $site_id * @return array */ public function CronMemberCancel($member_id, $site_id) { $info = model('fenxiao')->getInfo([ [ 'member_id', '=', $member_id ], [ 'site_id', '=', $site_id ] ]); if (empty($info)) { return $this->success(); } //冻结账户并删除 $data = [ 'status' => -1, 'lock_time' => time(), 'is_delete' => 1 ]; $res = model('fenxiao')->update($data, [ [ 'fenxiao_id', '=', $info[ 'fenxiao_id' ] ] ]); return $this->success($res); } /** * 变更分销商等级 * @param array $condition * @param string $field * @param string $order * @param string $limit */ public function changeFenxiaoLevel($data, $condition) { $result = model('fenxiao')->update($data, $condition); return $this->success($result); } /** * 获取分销等级分销商数量 */ public function getFenxiaoMemberCount($condition) { $condition[] = [ 'is_delete', '=', 0 ]; $count = model('fenxiao')->getCount($condition); return $count; } /** * 获取分销商排名 * @param $site_id * @param $fenxiao_id * @param $order * @return array */ public function getFenxiaoRanking($site_id, $fenxiao_id, $order) { $prefix = config('database.connections.mysql.prefix'); $version = model('fenxiao')->query('SELECT VERSION() as version')[ 0 ][ 'version' ]; if (substr($version, 0, 1) == 8) { $query = "SELECT * FROM (select *,row_number() OVER(order by {$order} DESC) as rownum from {$prefix}fenxiao nf) AS f WHERE f.fenxiao_id = {$fenxiao_id}"; } else { $query = "SELECT b.rownum FROM (SELECT t.*, @rownum := @rownum + 1 AS rownum FROM (SELECT @rownum := 0) r,(SELECT * FROM {$prefix}fenxiao WHERE site_id = {$site_id} ORDER BY {$order} DESC,fenxiao_id ASC) AS t) AS b WHERE b.fenxiao_id = {$fenxiao_id};"; } $data = model('fenxiao')->query($query); $data = empty($data) ? 0 : $data[ 0 ][ 'rownum' ]; return $this->success($data); } /** * Common: 获取某个用户全部上级 * Author: wu-hui * Time: 2024/05/04 10:55 * @param $fenXiaoId * @param array $superiorList * @param int $level * @return array */ public function getAllSuperior($fenXiaoId,array $superiorList = [],int $level = 1){ // 获取用户上级列表 $info = model('fenxiao')->getInfo(['fenxiao_id'=>$fenXiaoId],'member_id,level_id,parent,fenxiao_id'); // 判断:当前分销商是否已经存在数组中 如果已经存在则代理关系链进入循环中 直接返回 if(!empty($superiorList[$info['member_id']])) return $superiorList; $superiorList[$info['member_id']] = [ 'level' => $level, 'member_id' => $info['member_id'], 'parent' => $info['parent'], 'level_id' => $info['level_id'], 'fenxiao_id' => $info['fenxiao_id'] ]; if(empty($info) || (int)$info['parent'] <= 0) return $superiorList; return $this->getAllSuperior($info['parent'], $superiorList, ++$level); } /** * Common: 判断:当前用户是否存在上级的大区团队中 * Author: wu-hui * Time: 2024/05/04 13:34 * @param int $fenXiaoId * @param int $spreadFenXiaoId * @return bool */ public function isBigAreaPart(int $fenXiaoId,int $spreadFenXiaoId){ // 获取:当前上级的所有直推下级 $subIds = model('fenxiao')->getColumn(['parent'=>$spreadFenXiaoId],'fenxiao_id'); if(count($subIds) <= 1) return true;// 只有一条线 在大区业绩中 // 存在多条线 循环判断 $bigAreaFenXiaoIds = [];// 大区业绩所有用户的分销ID $bigAreaMoney = 0;// 大全业绩金额 foreach($subIds as $subFenXiaoId){ // 获取全部下级 $subUserList = $this->getAllSubordinate([$subFenXiaoId]); $currentLineFenXiaoId = array_merge(array_column($subUserList,'fenxiao_id'),[$subFenXiaoId]); $memberIds = model('fenxiao')->getColumn([['fenxiao_id','in',$currentLineFenXiaoId]],'member_id'); // 获取当前线的业绩数量 $currentLineMoney = model('order_goods')->getSum([['member_id','in', $memberIds]], 'real_goods_money'); // 判断:当前线业绩 大于 当前大区业绩;更新大区信息 if($bigAreaMoney < $currentLineMoney) { $bigAreaFenXiaoIds = $currentLineFenXiaoId; $bigAreaMoney = $currentLineMoney; } } return in_array($fenXiaoId,$bigAreaFenXiaoIds);// 当前用户id 存在大区用户id列表中;当前用户为大区团队成员 } /** * Common: 获取某个用户全部下级 * Author: wu-hui * Time: 2024/05/04 11:35 * @param $fenXiaoIds * @param array $subordinateList * @param int $level * @return array */ public function getAllSubordinate($fenXiaoIds,array $subordinateList = [],int $level = 1){ // 获取用户上级列表 $info = model('fenxiao')->getList([['parent','in',$fenXiaoIds]],"member_id,fenxiao_id,level_id,parent,{$level} as level"); // 判断:是否存在重复项 存在则删除 防止进入死循环 $infoFenXiaoIds = array_column($info,'fenxiao_id'); $hasFenXiaoIds = array_column($subordinateList,'fenxiao_id'); $info = array_column($info,null, 'fenxiao_id'); foreach($infoFenXiaoIds as $infoFenXiaoId){ if(in_array($infoFenXiaoId,$hasFenXiaoIds)) unset($info[$infoFenXiaoId]); } if(!empty($info)){ $subordinateList = array_merge($subordinateList,array_values($info)); return $this->getAllSubordinate(array_column($info,'fenxiao_id'), $subordinateList, ++$level); } return $subordinateList; } /** * Common: 获取分销信息 如果不存在则添加 * Author: wu-hui * Time: 2024/05/07 17:39 * @param $memberId * @param bool $field * @return mixed */ public function getAndCreateFenXiaoInfo($memberId, $field = true){ $fenXiaoInfo = model('fenxiao')->getInfo(['member_id'=>$memberId], $field); if(!$fenXiaoInfo){ $this->directlyBecomeFenxiao($memberId); return $this->getAndCreateFenXiaoInfo($memberId, $field); } return $fenXiaoInfo; } /** * @param $data * @param $explode * @return int * 获取分割后去除空白值的数组长度 */ protected function getExplodeArrFilterCount($data, $explode = ',') { $data = explode($explode, $data); $data = array_filter($data, function ($value) { return !empty($value); }); $count = count($data); return $count; } }