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; } }