480 lines
20 KiB
PHP
480 lines
20 KiB
PHP
<?php
|
||
/**
|
||
* Created by PhpStorm.
|
||
*
|
||
*
|
||
*
|
||
* Date: 2021/7/20
|
||
* Time: 9:32
|
||
*/
|
||
|
||
namespace app\frontend\modules\member\services;
|
||
|
||
|
||
use app\backend\modules\member\models\MemberParent;
|
||
use app\common\exceptions\AppException;
|
||
use app\common\facades\Setting;
|
||
use app\common\helpers\ImageHelper;
|
||
use app\common\helpers\Url;
|
||
use app\common\models\member\ChildrenOfMember;
|
||
use app\common\models\member\MemberChildren;
|
||
use app\common\models\MemberShopInfo;
|
||
use app\common\models\Order;
|
||
use app\frontend\modules\member\models\MemberModel;
|
||
use Illuminate\Support\Facades\DB;
|
||
use Yunshop\AgentListSet\admin\SetController;
|
||
|
||
class MemberReferralService
|
||
{
|
||
public $mc_member;
|
||
public $yz_member;
|
||
public $member_id;
|
||
public $member_child;
|
||
|
||
/**
|
||
* MemberReferralService constructor.
|
||
* @throws AppException
|
||
*/
|
||
public function __construct()
|
||
{
|
||
$this->member_id = \app\frontend\models\Member::current()->uid;
|
||
$this->mc_member = MemberModel::getMyReferrerInfo($this->member_id)->first();
|
||
$this->yz_member = $this->mc_member->yzMember;
|
||
// $this->member_child = MemberChildren::where('member_id', $this->member_id)
|
||
// ->get();
|
||
if (!$this->mc_member) {
|
||
throw new AppException('会员ID有误');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 我推荐的人 一二级数据v2
|
||
* @return array
|
||
* @throws AppException
|
||
*/
|
||
public function getMyAgentData_v2()
|
||
{
|
||
$relationLevel = request()->input('relationLevel', 1);
|
||
$pageSize = 10;
|
||
$keyword = request()->input('keyword');
|
||
$page = request()->page;
|
||
|
||
//获取一级下级会员ID
|
||
$teamMembersIds = MemberChildren::where('member_id', $this->member_id)
|
||
->when($relationLevel > 0,function($query) use ($relationLevel){
|
||
$query->where('level', $relationLevel);
|
||
})
|
||
->pluck('child_id')
|
||
->toArray();
|
||
|
||
//todo 原先是模糊搜索,后期优化
|
||
if (!empty($keyword)) {
|
||
$key_uid = MemberModel::uniacid()->where('nickname', 'like', '%' . $keyword . '%')
|
||
->orWhere('mobile', 'like', '%' . $keyword . '%')
|
||
->orWhere('realname', 'like', '%' . $keyword . '%')
|
||
->pluck('uid')
|
||
->toArray();
|
||
|
||
//获取交集
|
||
$teamMembersIds = array_intersect($teamMembersIds, $key_uid);
|
||
}
|
||
//自定义分页
|
||
// $page_start = ($page-1) * $pageSize;
|
||
// $teamMembersIds = array_slice($teamMembersIds,$page_start,$pageSize);
|
||
|
||
// 总订单数,总订单金额
|
||
// todo yz_member 中的wechat 拿到外层 uid as id withSum
|
||
if (app('plugins')->isEnabled('agent-list-set') && \Setting::get('plugin.agent-liset-set.pay_order')) {
|
||
$teamMembers = SetController::getTeamMember($pageSize, $teamMembersIds); //统计已完成+已支付订单
|
||
} else {
|
||
$orderStatus = Setting::get('shop.relation_base.member_order_status') == 1 ? [1, 2, 3] : [3];
|
||
$teamMembers = MemberModel::select(['mobile', 'createtime', 'avatar', 'nickname', 'uid', 'realname'])
|
||
->whereIn('uid', $teamMembersIds)
|
||
->with([
|
||
'yzMember' => function ($builder) {
|
||
$builder->select(['member_id', 'is_agent', 'status', 'wechat', 'deleted_at', 'inviter','yz_openid']);
|
||
},
|
||
'orders' => function ($order) use ($orderStatus){
|
||
$order->select(['id', 'uid', 'price', 'status'])->whereIn('status', $orderStatus);
|
||
},
|
||
'memberChildren' => function ($member) use ($orderStatus){
|
||
$member->select(['id', 'child_id', 'level', 'member_id'])->where('level', 1)
|
||
->with([
|
||
'orders' => function ($order) use ($orderStatus){
|
||
$order->select(['id', 'uid', 'price', 'status'])->whereIn('status', $orderStatus);
|
||
}
|
||
]);
|
||
}
|
||
])
|
||
->orderBy('uid', 'desc')
|
||
->simplePaginate($pageSize)
|
||
->toArray();
|
||
}
|
||
$teamMembers['total'] = count($teamMembersIds);
|
||
$teamMembers['last_page'] = ceil($teamMembers['total'] / $pageSize);
|
||
foreach ($teamMembers['data'] as &$v) {
|
||
$v['team_order_money'] = round(
|
||
collect($v['member_children'])->sum(function ($member_children) {
|
||
return collect($member_children['orders'])->sum('price');
|
||
}),
|
||
2
|
||
);
|
||
$v['team_total'] = collect($v['member_children'])->count();
|
||
|
||
//会员自己
|
||
$v['child_order_money'] = round(collect($v['orders'])->sum('price'), 2);
|
||
$v['child_order_total'] = collect($v['orders'])->count();
|
||
|
||
$v['avatar'] = $v['avatar_image'];
|
||
unset($v['avatar_image']);
|
||
$v['createtime'] = date('Y-m-d H:i:s', $v['createtime']);
|
||
|
||
$v['id'] = $v['uid'];
|
||
unset($v['uid']);
|
||
$v['wechat'] = $v['yz_member']['wechat'] ?: 0;
|
||
$v['mobile'] = $v['mobile'] ?: 0;
|
||
$v['realname'] = $v['realname'] ?: 0;
|
||
$v['inviter'] = empty($v['yz_member']['inviter']) ? 1 : 0;
|
||
$v['avatar']=$v['avatar']?:yz_tomedia(Setting::get('shop.shop')['logo']);
|
||
if (!is_null($v['yz_member'])) {
|
||
if (1 == $v['yz_member']['is_agent'] && 2 == $v['yz_member']['status']) {
|
||
$v['is_agent'] = 1;
|
||
}
|
||
$v['nickname']=$v['nickname']?:$v['yz_member']['yz_openid'];
|
||
}
|
||
unset($v['yz_member']);
|
||
unset($v['member_children']);
|
||
unset($v['orders']);
|
||
}
|
||
$data = $teamMembers;
|
||
|
||
return show_json(1, $data);
|
||
}
|
||
|
||
/**
|
||
* 我推荐的人 v2 基本信息
|
||
*
|
||
* @return \Illuminate\Http\JsonResponse
|
||
*/
|
||
public function getMyAgent_v2()
|
||
{
|
||
set_time_limit(0);
|
||
$total = 0;
|
||
$relation_base = \Setting::get('relation_base');
|
||
|
||
//如果没有设置则显示
|
||
if (empty($relation_base)) {
|
||
$relation_base['relation_level'][0] = true;
|
||
$relation_base['relation_level'][1] = true;
|
||
}
|
||
|
||
for ($i = 1; $i <= 2; $i++) {
|
||
$agent_count = MemberChildren::where('member_id', $this->member_id)
|
||
->where('level', $i)
|
||
->count();
|
||
|
||
$total += $agent_count;
|
||
$data['level' . $i] = [
|
||
'level' => $relation_base['relation_level']['name' . $i] ?: $i . '级',
|
||
'total' => $agent_count,
|
||
'is_show' => $relation_base['relation_level'][$i - 1] ? true : false,
|
||
'level_p' => 2,
|
||
];
|
||
}
|
||
// todo:2024-4-22 蚂蟥项目修改 增加显示全部
|
||
$data['level0'] = [
|
||
'level' => '全部客户',
|
||
'total' => MemberChildren::where('member_id', $this->member_id)->count(),
|
||
'is_show' => true,
|
||
'level_p' => 2,
|
||
];
|
||
|
||
$data['total'] = $total;
|
||
|
||
return show_json(1, $data);
|
||
}
|
||
|
||
/**
|
||
* 我的推荐人v2
|
||
*
|
||
* @return \Illuminate\Http\JsonResponse
|
||
*/
|
||
public function getMyReferral_v2()
|
||
{
|
||
ini_set('memory_limit', -1);
|
||
|
||
$member_id = \YunShop::app()->getMemberId();
|
||
$member_info = $this->mc_member->toArray();
|
||
$unicid = \YunShop::app()->uniacid;
|
||
$set = \Setting::get('shop.member');
|
||
$member_set = \Setting::get('relation_base');
|
||
|
||
if (isset($set) && $set['headimg']) {
|
||
$avatar = replace_yunshop(yz_tomedia($set['headimg']));
|
||
} else {
|
||
$avatar = Url::shopUrl('static/images/photo-mr.jpg');
|
||
}
|
||
//IOS时,把微信头像url改为https前缀
|
||
$avatar = ImageHelper::iosWechatAvatar(yz_tomedia($avatar));;
|
||
|
||
$member_info['avatar'] = yz_tomedia($member_info['avatar']);;
|
||
//查询上级
|
||
$referrer_info = MemberModel::getMyReferrerInfo($member_info['yz_member']['parent_id'])->first();
|
||
|
||
if ($member_info['yz_member']['inviter'] == 1) {
|
||
if (!empty($referrer_info)) {
|
||
$info = $referrer_info->toArray();
|
||
$data = [
|
||
'uid' => $info['uid'],
|
||
'avatar' => $info['avatar'],
|
||
'nickname' => $info['nickname'],
|
||
'level' => $info['yz_member']['level']['level_name'],
|
||
'is_show' => $member_set['is_referrer'] ?: 0,
|
||
'referrer_phone' => $info['mobile'],
|
||
'referrer_wechat' => $info['yz_member']['wechat'],
|
||
];
|
||
} else {
|
||
$data = [
|
||
'uid' => '',
|
||
'avatar' => $avatar,
|
||
'nickname' => '总店',
|
||
'level' => '',
|
||
'is_show' => $member_set['is_referrer'] ?: 0,
|
||
];
|
||
}
|
||
} else {
|
||
$data = [
|
||
'uid' => '',
|
||
'avatar' => $avatar,
|
||
'nickname' => '暂无',
|
||
'level' => '',
|
||
'is_show' => $member_set['is_referrer'] ?: 0,
|
||
];
|
||
}
|
||
|
||
//---------------------new-----------------------
|
||
//团队1级会员 防止会员删除
|
||
$data['child_total'] = DB::table('yz_member_children')
|
||
->join('yz_member', function ($join) {
|
||
$join->on('yz_member.member_id', '=', 'yz_member_children.child_id')
|
||
->whereNull('deleted_at');
|
||
})
|
||
->where('yz_member_children.uniacid', $unicid)
|
||
->where('yz_member_children.member_id', $member_id)
|
||
->where('level', 1)
|
||
->count();
|
||
|
||
$level_childs = MemberChildren::where('member_id', $this->member_id)->where("level", 1)->pluck("child_id");
|
||
$team_order_money = 0;
|
||
if (!empty($level_childs)) {
|
||
if (app('plugins')->isEnabled('agent-list-set') && \Setting::get('plugin.agent-liset-set.pay_order')) {
|
||
$team_order_money = SetController::getChildOrderMoney($member_id, $unicid); //统计已完成+已支付订单+自己的订单
|
||
} else {
|
||
$orderStatus = Setting::get('shop.relation_base.member_order_status') == 1 ? [1, 2, 3] : [3];
|
||
$team_order_money = MemberChildren::select(
|
||
['yz_member_children.child_id', 'yz_member_children.member_id']
|
||
)
|
||
->join('yz_order', 'yz_member_children.child_id', '=', 'yz_order.uid')
|
||
->whereIn('yz_order.status', $orderStatus)
|
||
->where('yz_member_children.level', 1)
|
||
->where('yz_member_children.member_id', $member_id)
|
||
->sum('yz_order.price');
|
||
}
|
||
}
|
||
$data['child_order_money'] = round($team_order_money, 2);
|
||
|
||
//团队会员
|
||
$data['team_total'] = DB::table('yz_member_children')
|
||
->join('yz_member', function ($join) {
|
||
$join->on('yz_member.member_id', '=', 'yz_member_children.child_id')
|
||
->whereNull('deleted_at');
|
||
})
|
||
->where('yz_member_children.uniacid', $unicid)
|
||
->where('yz_member_children.member_id', $member_id)
|
||
->count();
|
||
|
||
$childs = MemberChildren::where('member_id', $this->member_id)->pluck("child_id");
|
||
$team_all = 0;
|
||
if (!empty($childs)) {
|
||
if (app('plugins')->isEnabled('agent-list-set') && \Setting::get('plugin.agent-liset-set.pay_order')) {
|
||
$team_all = SetController::getAllOrderMoney($member_id, $unicid); //统计已完成+已支付订单+自己的订单
|
||
} else {
|
||
$orderStatus = Setting::get('shop.relation_base.member_order_status') == 1 ? [1, 2, 3] : [3];
|
||
$team_all = MemberChildren::select(['yz_member_children.child_id', 'yz_member_children.member_id'])
|
||
->join('yz_order', 'yz_member_children.child_id', '=', 'yz_order.uid')
|
||
->whereIn('yz_order.status', $orderStatus)
|
||
->where('yz_member_children.member_id', $member_id)
|
||
->sum('yz_order.price');
|
||
}
|
||
}
|
||
$data['team_order_money'] = round($team_all, 2);
|
||
|
||
$team_goods_total = 0;
|
||
if (!empty($childs)) {
|
||
$team_goods_total = MemberChildren::select(['yz_member_children.child_id', 'yz_member_children.member_id'])
|
||
->join('yz_order', 'yz_member_children.child_id', '=', 'yz_order.uid')
|
||
->where('yz_order.status', '>=', 1)
|
||
->where('yz_member_children.member_id', $member_id)
|
||
->sum('yz_order.goods_total');
|
||
}
|
||
|
||
$data['team_goods_total'] = intval($team_goods_total);
|
||
//---------------------new-----------------------
|
||
|
||
|
||
$data['self'] = $member_info;
|
||
$data['is_recommend_wechat'] = $member_set['is_recommend_wechat'] ?: 0;
|
||
$data['wechat'] = $member_set['relation_level']['wechat'] ?: 0;
|
||
$data['phone'] = $member_set['relation_level']['phone'] ?: 0;
|
||
$data['realname'] = $member_set['relation_level']['realname'] ?: 0;
|
||
$data['name1'] = $member_set['relation_level']['name1'] ?: '';
|
||
$data['name2'] = $member_set['relation_level']['name2'] ?: '';
|
||
$data['name3'] = $member_set['relation_level']['name3'] ?: '';
|
||
|
||
//如果开启统计商品
|
||
$data['statistical_goods'] = [];
|
||
if (Setting::get('shop.relation_base.is_statistical_goods')) {
|
||
$statisticalGoods = Setting::get('shop.relation_base.statistical_goods');
|
||
foreach ($statisticalGoods as &$goods) {
|
||
$goods['team_bought_total'] = $this->teamBuyGoodsTotal(\YunShop::app()->getMemberId(), $goods['id']);
|
||
}
|
||
$data['statistical_goods'] = $statisticalGoods ? : [];
|
||
}
|
||
if (!empty($data)) {
|
||
return show_json(1, $data);
|
||
}
|
||
return show_json(0, '会员不存在');
|
||
}
|
||
|
||
private function teamBuyGoodsTotal($uid, $goodsId)
|
||
{
|
||
$teamTotal = ChildrenOfMember::select(['yz_member_children.child_id', 'yz_member_children.member_id'])
|
||
->join('yz_order', 'yz_member_children.child_id', '=', 'yz_order.uid')
|
||
->join('yz_order_goods', function ($join) {
|
||
$join->on('yz_order_goods.order_id', '=', 'yz_order.id');
|
||
})
|
||
->where('yz_order.status', Order::COMPLETE)
|
||
->where('yz_member_children.member_id', $uid)
|
||
->where('yz_order_goods.goods_id', $goodsId)
|
||
->sum('yz_order_goods.total');
|
||
//自购数量
|
||
$selfTotal = Order::where('uid', $uid)
|
||
->where('status', Order::COMPLETE)
|
||
->whereHas('orderGoods', function ($query) use ($goodsId) {
|
||
$query->where('goods_id', $goodsId);
|
||
})->sum('goods_total');
|
||
return $teamTotal + $selfTotal;
|
||
}
|
||
|
||
/**
|
||
* 会员推荐人上级
|
||
* @return array|\Illuminate\Http\JsonResponse
|
||
*/
|
||
public function getMyReferralParents()
|
||
{
|
||
if ($this->yz_member['inviter'] == 1 && !empty(
|
||
MemberShopInfo::getMemberShopInfo(
|
||
$this->yz_member['parent_id']
|
||
)
|
||
)) {
|
||
$data = MemberParent::getAgentParentByMemberId($this->yz_member['parent_id']);
|
||
return show_json(1, $data);
|
||
} else {
|
||
return show_json(1, ['is_show' => 0]); //没有推荐人上级
|
||
}
|
||
}
|
||
|
||
// 获取指定的团队信息
|
||
public function getAgentData($uid){
|
||
$orderStatus = Setting::get('shop.relation_base.member_order_status') == 1 ? [1, 2, 3] : [3];
|
||
$model = MemberModel::select(['mobile','createtime','avatar','nickname','uid','realname'])
|
||
->when(is_array($uid),function($query) use ($uid){
|
||
$query->whereIn('uid',$uid);
|
||
},function($query) use ($uid){
|
||
$query->where('uid',$uid);
|
||
})
|
||
->with([
|
||
'yzMember' => function($builder){
|
||
$builder->select(['member_id','is_agent','status','wechat','deleted_at','inviter','yz_openid']);
|
||
},
|
||
'orders' => function($order) use ($orderStatus){
|
||
$order->select(['id','uid','price','status','order_sn'])
|
||
->whereIn('status',$orderStatus)
|
||
->with(['hasManyOrderGoods'=>function($orderGoods){
|
||
$orderGoods->select(['id','goods_id','order_id','total','title','thumb','price']);
|
||
}]);
|
||
},
|
||
'memberChildren' => function($member) use ($orderStatus){
|
||
$member->select(['id','child_id','level','member_id'])
|
||
->where('level',1)
|
||
->with([
|
||
'orders' => function($order) use ($orderStatus){
|
||
$order->select(['id','uid','price','status'])
|
||
->whereIn('status',$orderStatus);
|
||
}
|
||
]);
|
||
}
|
||
])
|
||
->orderBy('uid','desc');
|
||
// 根据查询类型 进行对应的处理
|
||
if(is_array($uid)){
|
||
// 多个
|
||
$list = $model->get()->toArray();
|
||
foreach($list as &$itemInfo){
|
||
// 当前用户信息
|
||
$itemInfo['child_order_total'] = collect($itemInfo['orders'])->count();// 订单数
|
||
$itemInfo['team_total'] = collect($itemInfo['member_children'])->count();// 直推下级总数
|
||
$itemInfo['child_order_money'] = round(collect($itemInfo['orders'])->sum('price'),2);// 订单总额
|
||
// 客户订单总额
|
||
$itemInfo['team_order_money'] = round(collect($itemInfo['member_children'])->sum(function($memberChildren){
|
||
return collect($memberChildren['orders'])->sum('price');
|
||
}),2);
|
||
|
||
$itemInfo['createtime'] = date('Y-m-d H:i:s', $itemInfo['createtime']);
|
||
unset($itemInfo['member_children']);
|
||
unset($itemInfo['yz_member']);
|
||
}
|
||
|
||
return $list;
|
||
}
|
||
else{
|
||
// 单个
|
||
$info = $model->first();
|
||
$info = $info ? $info->toArray() : [];
|
||
// 当前用户信息
|
||
$info['child_order_total'] = collect($info['orders'])->count();// 订单数
|
||
$info['team_total'] = collect($info['member_children'])->count();// 直推下级总数
|
||
$info['child_order_money'] = round(collect($info['orders'])->sum('price'),2);// 订单总额
|
||
// 客户订单总额
|
||
$info['team_order_money'] = round(collect($info['member_children'])->sum(function($memberChildren){
|
||
return collect($memberChildren['orders'])->sum('price');
|
||
}),2);
|
||
$info['member_children_ids'] = $info['member_children'] ? array_column($info['member_children'], 'child_id') : [];// 直推下级ids
|
||
unset($info['member_children']);
|
||
unset($info['yz_member']);
|
||
// 订单处理
|
||
$info['orders'] = array_map(function($orderItem){
|
||
$orderItem['has_many_order_goods'] = array_map(function($orderGoods){
|
||
unset($orderGoods['buttons']);
|
||
unset($orderGoods['after_sales']);
|
||
unset($orderGoods['order']);
|
||
|
||
return $orderGoods;
|
||
}, $orderItem['has_many_order_goods']);
|
||
|
||
return $orderItem;
|
||
},$info['orders']);
|
||
|
||
|
||
return $info;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
} |