252 lines
10 KiB
PHP
252 lines
10 KiB
PHP
<?php
|
|
/**
|
|
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
|
|
* =========================================================
|
|
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
|
|
* ----------------------------------------------
|
|
* 官方网址: https://www.gobuysaas.com
|
|
* =========================================================
|
|
*/
|
|
|
|
namespace addon\team\model;
|
|
|
|
use app\model\BaseModel;
|
|
use app\model\NewBaseModel;
|
|
use think\facade\Db;
|
|
|
|
class Member extends BaseModel{
|
|
|
|
/**
|
|
* Common: 关系链 - 获取指定用户全部上级(仅返回用户id)
|
|
* Author: wu-hui
|
|
* Time: 2024/08/08 14:16
|
|
* @param $memberId
|
|
* @param array $parentList
|
|
* @return array|false|mixed|string[]
|
|
*/
|
|
public function getAllParent($memberId, $parentList = []){
|
|
$join = [
|
|
['fenxiao fx', 'a.fenxiao_id = fx.fenxiao_id', 'LEFT'],
|
|
];
|
|
$field = 'a.member_id,a.site_id,a.fenxiao_id,a.is_fenxiao,a.source_member,a.nickname,fx.member_id as fenxiao_member_id,fx.parent';
|
|
$userInfo = model('member')->getInfo([
|
|
['a.member_id', '=', $memberId]
|
|
],$field,'a',$join);
|
|
// 判断:当前用户是否为分销 获取对应的上级分销商用户id
|
|
if($userInfo['is_fenxiao'] == 1) $parentMemberId = model('fenxiao')->getValue(['fenxiao_id'=>$userInfo['parent']], 'member_id');// 当前用户是分销商 使用parent查询上级用户id
|
|
else $parentMemberId = $userInfo['fenxiao_member_id'];// 当前用户不是分销商 直接为fenxiao_member_id
|
|
// 不存在上级
|
|
if((int)$parentMemberId <= 0) return $parentList;
|
|
// 存在上级 进行记录
|
|
$parentList[] = $parentMemberId;
|
|
// 判断:是否存在关系链信息 存在直接返回相关关系链信息,不存在则递归查询
|
|
$relationship = model('member_relationship')->getValue([
|
|
'member_id' => $parentMemberId
|
|
],'relationship_chain');
|
|
if($relationship){
|
|
$relationshipArr = explode(",", $relationship);// 将数字分割成数组
|
|
|
|
return array_merge($parentList,$relationshipArr);
|
|
}else{
|
|
// 递归获取下一个
|
|
return $this->getAllParent($parentMemberId, $parentList);
|
|
}
|
|
}
|
|
/**
|
|
* Common: 关系链 - 某个用户关系链改变,同步所有相关的关系链信息
|
|
* Author: wu-hui
|
|
* Time: 2024/08/08 14:19
|
|
* @param $memberId
|
|
* @throws \Exception
|
|
*/
|
|
public function RelationshipChainChangesInit($memberId){
|
|
// 判断:是否存在当前用户作为上级的关系链
|
|
$parentList = model('member_relationship')->getList([
|
|
[ "", 'exp', Db::raw("FIND_IN_SET({$memberId}, relationship_chain)") ]
|
|
],'id,relationship_chain');
|
|
if(count($parentList) > 0){
|
|
$currentMemberRelationshipChain = model('member_relationship')->getValue([
|
|
'member_id' => $memberId
|
|
],'relationship_chain');
|
|
// 循环处理修改内容
|
|
$updateData = [];
|
|
foreach($parentList as $value){
|
|
$relationshipChainArray = explode(",", $value['relationship_chain']);// 将数字分割成数组
|
|
$key = array_search($memberId, $relationshipChainArray);// 查找需要替换的数字的位置
|
|
// 如果找到了指定的数字,则用空字符串替换之后的所有数字
|
|
if ($key !== false) {
|
|
$relationshipChainArray = array_slice($relationshipChainArray, 0, $key + 1 );
|
|
$newRelationshipChain = implode(",", $relationshipChainArray);
|
|
$newRelationshipChain .= ',' . $currentMemberRelationshipChain;
|
|
$updateData[] = [
|
|
'id' => $value['id'],
|
|
'relationship_chain' => $newRelationshipChain
|
|
];
|
|
}
|
|
}
|
|
// 修改变更的关系链
|
|
if(count($updateData) > 0){
|
|
$goodsSkuModel = (new NewBaseModel(['table_name' => 'member_relationship', 'pk' => 'id']));
|
|
$goodsSkuModel->saveAll($updateData);
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Common: 获取指定用户全部上级详细信息(分页返回基本信息)
|
|
* Author: wu-hui
|
|
* Time: 2024/08/08 15:06
|
|
* @param $page
|
|
* @param $page_size
|
|
* @param $memberId
|
|
* @return array
|
|
*/
|
|
public function getAllParentInfo($page, $page_size, $memberId){
|
|
// 获取全部上级id
|
|
$parentIds = $this->getAllParent($memberId);
|
|
// 由于上级列表id 顺序不一致,必须截取指定页内容进行查询
|
|
$start = ($page - 1) * $page_size;
|
|
$end = $start + $page_size;
|
|
$useParentIds = array_slice($parentIds, $start, $end - $start);
|
|
// 列表获取
|
|
$where = [
|
|
['member_id', 'in', $useParentIds]
|
|
];
|
|
$field = 'member_id,username,nickname,headimg';
|
|
$list = model('member')->getList($where,$field);
|
|
$list = array_column($list, null, 'member_id');
|
|
$newList = [];
|
|
// 循环:处理顺序问题
|
|
foreach($useParentIds as $parentIndex => $parentId){
|
|
$currentInfo = $list[$parentId];
|
|
$currentInfo['distance_level'] = $parentIndex;
|
|
$newList[] = $currentInfo;
|
|
}
|
|
|
|
return $this->success([
|
|
'page_count' => ceil(count($parentIds) / $page_size),
|
|
'count' => count($parentIds),
|
|
'list' => $newList,
|
|
]);
|
|
}
|
|
/**
|
|
* Common: 获取团队人数(支持区分直推人数和团队人数)
|
|
* Author: wu-hui
|
|
* Time: 2024/08/08 17:23
|
|
* @param $memberId
|
|
* @param $siteId
|
|
* @param string $type
|
|
* @return int
|
|
*/
|
|
public function getPeopleNum($memberId,$siteId,string $type = 'one'){
|
|
// 生成查询条件
|
|
$where = [
|
|
['site_id', '=', $siteId]
|
|
];
|
|
if($type == 'one') $where[] = [ '', 'exp', Db::raw("(relationship_chain like '{$memberId}%' OR relationship_chain = {$memberId})") ];
|
|
else $where[] = [ "", 'exp', Db::raw("FIND_IN_SET({$memberId}, relationship_chain)") ];
|
|
// 获取列表
|
|
|
|
return (int)model('member_relationship')->getCount($where);
|
|
}
|
|
/**
|
|
* Common: 获取团队业绩(区分直推业绩和团队业绩)
|
|
* Author: wu-hui
|
|
* Time: 2024/08/08 17:55
|
|
* @param $memberId
|
|
* @param $siteId
|
|
* @param string $type
|
|
* @return int|mixed
|
|
*/
|
|
public function getMoneyNum($memberId,$siteId,string $type = 'one'){
|
|
// 获取相关用户id
|
|
$where = [
|
|
['site_id', '=', $siteId]
|
|
];
|
|
if($type == 'one') $where[] = [ '', 'exp', Db::raw("(relationship_chain like '{$memberId}%' OR relationship_chain = {$memberId})") ];
|
|
else $where[] = [ "", 'exp', Db::raw("FIND_IN_SET({$memberId}, relationship_chain)") ];
|
|
$memberIds = model('member_relationship')->getColumn($where, 'member_id');
|
|
// 获取基本设置
|
|
$set = (new Setting())->getConfig((int)$siteId);
|
|
// 业绩获取
|
|
$orderWhere = [
|
|
[ 'a.member_id', 'in', $memberIds],
|
|
[ 'og.refund_status', 'in', [0, 3] ],// 订单商品未退款
|
|
];
|
|
// 收银台订单不参与
|
|
if($set['online_payment_switch'] != 1) $orderWhere[] = ['a.order_from', '<>', 'cashier'];
|
|
// 升级业绩金额计算类型:0=已支付订单金额,1=已完成订单金额
|
|
if($set['money_type'] == 0) $orderWhere[] = ['a.order_status','in',[1,3,4,10,11,12]];//待发货、已发货、已收货、已完成、待使用、已使用
|
|
else $orderWhere[] = ['a.order_status','=',10];//已完成
|
|
// 关联订单商品表
|
|
$join = [
|
|
[ 'order_goods og', 'og.order_id = a.order_id', 'right' ]
|
|
];
|
|
$field = '(sum(og.real_goods_money) + sum(og.legumes_integral_money)) as sum_money';
|
|
$orderInfo = model('order')->getInfo($orderWhere,$field,'a',$join);
|
|
|
|
return $orderInfo['sum_money'] ?? 0;
|
|
}
|
|
/**
|
|
* Common: 是否购买指定商品
|
|
* Author: wu-hui
|
|
* Time: 2024/08/09 9:55
|
|
* @param int $memberId
|
|
* @param array $buyGoodsIds
|
|
* @param int $buyGoodsType
|
|
* @return int|mixed
|
|
*/
|
|
public function isBuyDesignatedGoods(int $memberId,array $buyGoodsIds,int $buyGoodsType){
|
|
// 基本条件
|
|
$where = [
|
|
[ 'a.member_id', '=', $memberId],
|
|
[ 'og.order_goods_id', 'in', $buyGoodsIds],
|
|
[ 'og.refund_status', 'in', [0, 3] ],// 订单商品未退款
|
|
];
|
|
// 升级购买商品有效类型:0=已支付订单商品,1=已完成订单商品
|
|
if($buyGoodsType == 0) $where[] = ['a.order_status','in',[1,3,4,10,11,12]];//待发货、已发货、已收货、已完成、待使用、已使用
|
|
else $where[] = ['a.order_status','=',10];//已完成
|
|
// 关联订单商品表
|
|
$join = [
|
|
[ 'order_goods og', 'og.order_id = a.order_id', 'right' ]
|
|
];
|
|
|
|
return model('order')->getCount($where,'og.order_goods_id','a',$join);
|
|
}
|
|
/**
|
|
* Common: 获取全部上级及上级团队身份信息
|
|
* Author: wu-hui
|
|
* Time: 2024/08/12 9:51
|
|
* @param $memberId
|
|
* @return array
|
|
*/
|
|
public function getAllParentTeamInfo($memberId){
|
|
// 获取全部上级id
|
|
$parentIds = $this->getAllParent($memberId);
|
|
// 列表获取
|
|
$where = [
|
|
['a.member_id', 'in', $parentIds],
|
|
];
|
|
$join = [
|
|
['team t', 't.member_id = a.member_id', 'left']
|
|
];
|
|
$field = 'a.member_id,a.site_id,t.level_id';
|
|
$list = model('member')->getList($where,$field,'','a',$join);
|
|
$list = array_column($list, null, 'member_id');
|
|
$newList = [];
|
|
// 循环:处理顺序问题
|
|
foreach($parentIds as $parentIndex => $parentId){
|
|
$currentInfo = $list[$parentId];
|
|
$currentInfo['distance_level'] = $parentIndex;
|
|
$newList[] = $currentInfo;
|
|
}
|
|
|
|
return $newList;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|