jh-admin/addon/fenxiao/model/Fenxiao.php

1009 lines
42 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\fenxiao\model;
use addon\fenxiao\model\Config as ConfigModel;
use app\job\RelationshipChainChangesJob;
use app\model\BaseModel;
use app\model\member\Member;
use app\model\order\OrderCommon;
use app\model\system\Stat;
use think\facade\Db;
use think\facade\Queue;
/**
* 分销
*/
class Fenxiao extends BaseModel
{
public $fenxiao_status_zh = [
1 => '正常',
-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);
$data['fenxiao_id'] = $res;
$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 = '';
switch ($level) {
// 一级分销
case 1:
// 直属会员 + 直属下级分销商
$condition = "f.parent = {$fenxiao_id}";
break;
// 二级分销
case 2:
// 下级分销商id集合
$one_level_fenxiao = model('fenxiao')->getColumn([['parent', '=', $fenxiao_id]], 'fenxiao_id');
// 直属下级分销商的下级分销商 + 直属下级分销商的会员
if (!empty($one_level_fenxiao)) {
$condition = "f.parent in (" . implode(',',$one_level_fenxiao) . ")";
}
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.grand_parent in (" . implode(',',$one_level_fenxiao) . ") ) ";
$condition = "( (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([ [ 'grand_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.parent', '=' , $fenxiao_id ],
['f.status','=',1],
['f.is_delete','=',0],
['fl.level_num','>=',$fenxiao_info['level_num']],
['f.fenxiao_id', '<>' ,$fenxiao_id]
];
//查询用户下线中是否有相同等级或更高的
$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;
}
}