getMemberId(); $userInfo = Member::select(['uid','nickname','avatar']) ->where('uid',$uid) ->with(['hasOneTeamDividend'=>function($query){ $query->select(['uid','id','level']); }]) ->first(); if($userInfo) $userInfo = $userInfo->toArray(); // 经销商等级 $userInfo['level_info'] = TeamDividendLevelModel::select(['id','level_name'])->where('id',$userInfo['has_one_team_dividend']['level'])->first(); if($userInfo['level_info']) $userInfo['level_info'] = $userInfo['level_info']->toArray(); // 今日收益 $startTime = strtotime(date("Y-m-d 00:00:00", time())); $endTime = strtotime(date("Y-m-d 23:59:59",time())); // $toDayIncome = TeamDividendModel::where('created_at','>=',$startTime) // ->where('created_at','<=',$endTime) // ->where('member_id',$uid) // ->sum('dividend_amount'); $toDayIncome = (float)Income::uniacid() ->where('member_id', $uid) ->where('created_at','>=',$startTime) ->where('created_at','<=',$endTime) ->sum('amount'); // 全部收益 // $allIncome = TeamDividendModel:: where('member_id',$uid)->sum('dividend_amount'); $allIncome = (float)Income::uniacid()->where('member_id', $uid)->sum('amount'); // 可提现 $withdrawal = (float)Income::uniacid()->where('member_id', $uid)->where('status', 0)->sum('amount'); // 养殖收益 统计已结算收益 $rebate = Rebate::where('uid',$uid)->where('status',2)->sum('money'); // 合作养殖补助 $recommend = TeamDividendModel::uniacid()->where('member_id',$uid)->whereIn('type',[7,8])->sum('dividend_amount'); // 平级奖 $levelGive = TeamDividendModel::uniacid()->where('member_id',$uid)->where('type',1)->sum('dividend_amount'); // 下级总数 $subCount = TeamDividendAgencyModel::where('parent_id', $uid)->count(); // 复购商品 是否存在推广佣金信息 存在继续下一个步骤 $goods = []; $rebateGroupMax = Rebate::selectRaw('max(id) as max_id,max(reality_thaw_time) as max_reality_thaw_time,order_id,goods_id,max(status) as status') ->where('uid',$uid) ->groupBy('order_id','goods_id') ->get() ->toArray(); // 获取最新返利信息 if($rebateGroupMax){ foreach($rebateGroupMax as $rebateInfo){ // 判断:是否失效 未失效则获取最后一次结算时间,已失效则无操作 if(!in_array($rebateInfo['status'], [3,4])){ // 未失效:最后一次结算时间是否需要复购 需要则判断是否在复购时间内(解冻时间N天内); 在时间内则获取商品信息,不在时间内则失效 $lastSettlement = Rebate::where([ 'order_id' => $rebateInfo['order_id'], 'goods_id' => $rebateInfo['goods_id'], 'reality_thaw_time' => $rebateInfo['max_reality_thaw_time'], ])->first(); $isRepurchase = $lastSettlement->is_repurchase ?? 0; if($isRepurchase == 1){ $set = Setting::get('plugin.rebate'); $repurchaseDay = $set['repurchase_day'] ?? 0; $startTime = strtotime(date("Y-m-d H:i:s",time())." -{$repurchaseDay} day"); $isRepurchase = (int)Db::table('yz_order_goods') ->join('yz_order','yz_order.id','=','yz_order_goods.order_id') ->where('yz_order_goods.is_rebate',1) ->where('yz_order.pay_time','>',$startTime) ->where('yz_order.uid',$uid) ->value('yz_order_goods.id'); if($isRepurchase <= 0){ $good = Goods::where('id',$rebateInfo['goods_id']) ->select(['id','title','thumb']) ->first(); if($good) { $good->price = $lastSettlement['repurchase_money']; $goods[] = $good->toArray(); } } } } } } // 海报 $set = Setting::get('plugin.rebate'); $poster_id = $set['poster_id'] ?? 0; $data = compact('userInfo','toDayIncome','allIncome','withdrawal','rebate','recommend','levelGive','subCount','goods','poster_id'); return $this->successJson('success', $data); } /** * Common: 获取返利明细 * Author: wu-hui * Time: 2024/03/18 11:33 * @return \Illuminate\Http\JsonResponse */ public function rebateInfo(){ $uid = \YunShop::app()->getMemberId(); $statistics = []; $quarterList = []; $realityThawTime = 0; // 获取最新一期内容 存在且未失效 $lastRebateMaxId = Rebate::where('uid',$uid)->max('id'); $lastRebateInfo = Rebate::where('id',$lastRebateMaxId)->first(); if($lastRebateInfo && !in_array($lastRebateInfo->status,[3,4])){ $lastRebateInfo = $lastRebateInfo->toArray(); // 获取最后结算时间 $realityThawTime = Rebate::where([ 'uid' => $uid, 'order_id' => $lastRebateInfo['order_id'], 'goods_id' => $lastRebateInfo['goods_id'], ])->max('reality_thaw_time'); // 统计 $statistics['all_balance'] = Rebate::where( 'uid',$uid)->sum('money');// 所有期全部返利金额 $statistics['recorded'] = Rebate::where( 'uid',$uid)->where('status', 2)->sum('money');// 所有期 已入账(已结算)金额 $statistics['credited'] = Rebate::where( 'uid',$uid)->where('status', 0)->sum('money');// 所有期 待入账(冻结中)金额 // 可提现 $statistics['withdrawal'] = (float)Income::uniacid() ->leftjoin('yz_rebate','yz_rebate.id','=','yz_member_income.incometable_id') ->where('yz_member_income.dividend_code', 203) ->where('yz_member_income.member_id', $uid) ->where('yz_member_income.status', 0) ->sum('yz_member_income.amount'); // 获取全部返利信息 并且循环处理 $set = Setting::get('plugin.rebate'); $repurchaseDay = $set['repurchase_day'] ?? 0; $monthList = Rebate::select(['id','quarter','month','expect_thaw_time','money','status','is_repurchase','repurchase_money','reality_thaw_time','goods_id']) ->where([ 'uid' => $uid, 'order_id' => $lastRebateInfo['order_id'], 'goods_id' => $lastRebateInfo['goods_id'], ]) ->get() ->toArray(); // 循环每月信息 生成季度信息 foreach($monthList as $monthInfo){ // 时间 $monthInfo['expect_thaw_time'] = strtotime($monthInfo['expect_thaw_time']); $monthInfo['reality_thaw_time'] = strtotime($monthInfo['reality_thaw_time']); // 信息赋值及处理 $quarterList[$monthInfo['quarter']]['quarter'] = (int)$monthInfo['quarter']; $quarterList[$monthInfo['quarter']]['list'][$monthInfo['month']] = $monthInfo; // 返利时间 开始 ~ 结束 if($monthInfo['month'] == 1) $quarterList[$monthInfo['quarter']]['start_time'] = date("Y.m", $monthInfo['expect_thaw_time']); $quarterList[$monthInfo['quarter']]['end_time'] = date("Y.m", $monthInfo['expect_thaw_time']); // 本季度总金额 $quarterList[$monthInfo['quarter']]['total_money'] += (float)$monthInfo['money']; } // 循环处理季度信息 $upQuarter = []; foreach($quarterList as &$quarterInfo){ $quarterInfo['goods_id'] = max(array_column($quarterInfo['list'], 'goods_id')); // 获取本季度状态 状态值最高则为本季度最高状态 $quarterInfo['status'] = max(array_column($quarterInfo['list'], 'status')); // 获取本季度最后预计结算时间 $quarterInfo['last_expect_thaw_time'] = (int)max(array_column($quarterInfo['list'], 'expect_thaw_time')); // 获取本季度最后已结算时间 $quarterInfo['last_reality_thaw_time'] = (int)max(array_column($quarterInfo['list'], 'reality_thaw_time')); // 复购信息:当前季度复购信息 = 上一个季度复购信息 $quarterInfo['is_repurchase'] = (int)max(array_column($upQuarter['list'], 'is_repurchase')); $quarterInfo['repurchase_money'] = (float)max(array_column($upQuarter['list'], 'repurchase_money')); // 判断:本季度最后结算时间=0;且上一个季度结束需要复购;进入复购判断流程 $quarterInfo['repurchase_type'] = $quarterInfo['status'] == 0;// 0=无复购;1=有复购,未到复购时间;2=有复购,未复购;3=有复购,已复购 if($quarterInfo['last_reality_thaw_time'] == 0 && $quarterInfo['is_repurchase'] == 1){ // 且上一个季最后结算时间大于等于上一个季度最后预计结算时间 已到复购时间内 if($upQuarter['last_reality_thaw_time'] >= $upQuarter['last_expect_thaw_time']){ $quarterInfo['repurchase_type'] = 2;// 有复购 未复购 $quarterInfo['repurchase_end_time'] = (int)strtotime(date("Y-m-d H:i:s",$realityThawTime)." +{$repurchaseDay} day");; // 判断:N天内是否存在 该商品和用户的复购订单 存在则已复购 $startTime = strtotime(date("Y-m-d H:i:s",time())." -{$repurchaseDay} day"); $isRepurchase = (int)Db::table('yz_order_goods') ->join('yz_order','yz_order.id','=','yz_order_goods.order_id') ->where('yz_order_goods.is_rebate',1) ->where('yz_order.pay_time','>',$startTime) ->where('yz_order.uid',$uid) ->value('yz_order_goods.id'); if($isRepurchase > 0) $quarterInfo['repurchase_type'] = 3;// 有复购 已复购 }else{ $quarterInfo['repurchase_type'] = 1;// 有复购 未到复购时间 } } // 判断:当前季度最大状态为0或者1 复购状态为0、3时 强制修改为1 if(in_array($quarterInfo['status'],[0,1]) && in_array($quarterInfo['repurchase_type'],[0,3])) $quarterInfo['repurchase_type'] = 1; // 刷新上一个季度信息 $upQuarter = $quarterInfo; } } return $this->successJson('success',compact('statistics', 'quarterList', 'realityThawTime')); } /** * Common: 推荐奖励 - 统计 * Author: wu-hui * Time: 2024/03/16 18:01 * @return \Illuminate\Http\JsonResponse */ public function recommendStatistics(){ $uid = \YunShop::app()->getMemberId(); // 获取统计信息 $data = [ 'all_income' => TeamDividendModel::uniacid()->where('member_id',$uid)->where('status', '<>', -1)->sum('dividend_amount'),// 全部收益 'credited' => TeamDividendModel::uniacid()->where('member_id',$uid)->where('status',2)->sum('dividend_amount'),// 待入账收益 'recorded' => TeamDividendModel::uniacid()->where('member_id',$uid)->whereIn('status',[0,1])->sum('dividend_amount'),// 已入账收益 // 可提现 'withdrawable' => (float)Income::uniacid() ->leftjoin('yz_team_dividend','yz_team_dividend.id','=','yz_member_income.incometable_id') ->where('yz_member_income.dividend_code', 2) ->where('yz_member_income.member_id', $uid) ->where('yz_member_income.status', 0) ->sum('yz_member_income.amount'), ]; return $this->successJson('success',$data); } /** * Common: 推荐奖励 - 等级统计 * Author: wu-hui * Time: 2024/03/18 9:14 * @return \Illuminate\Http\JsonResponse */ public function recommendLvStatistics(){ $uid = \YunShop::app()->getMemberId(); $levelId = (int)request()->input('level_id'); // 获取全部等级 $level_list = TeamDividendLevelModel::uniacid()->select(['id','level_name'])->orderBy('level_weight','ASC')->get()->toArray(); // 获取登记统计 不存在则使用默认第一个等级 $levelId = $levelId <= 0 ? TeamDividendAgencyModel::where('uid', $uid)->value('level') : $levelId; $list = TeamDividendModel::where('member_id', $uid) ->select(['id','expect_thaw_time','dividend_amount','status','type']) ->where('agent_level',$levelId) ->where('status',1) ->orderBy('expect_thaw_time','ASC') ->get()->each(function($item){ $item['expect_thaw_time'] = date("m月d日",$item['expect_thaw_time']); return $item; })->toArray(); // 统计 $all_income = TeamDividendModel::where('member_id', $uid)->where('agent_level',$levelId)->where('status', '<>', -1)->sum('dividend_amount'); $credited = TeamDividendModel::where('member_id', $uid)->where('agent_level',$levelId)->where('status', 2)->sum('dividend_amount'); // 当前等级 $levelInfo = TeamDividendLevelModel::select(['id','level_name'])->where('id',$levelId)->first(); return $this->successJson('success',compact('level_list','list','all_income','credited','levelInfo')); } /** * Common: 奖励明细 * Author: wu-hui * Time: 2024/03/19 10:45 * @return \Illuminate\Http\JsonResponse */ public function incomeRecord(){ // 基本参数 $uid = \YunShop::app()->getMemberId(); $typeName = request()->input('type_name'); // 根据类型获取对应的记录 switch($typeName){ // 总收益 case 'all_income': $result = Income::uniacid() ->leftJoin('yz_team_dividend', 'yz_team_dividend.id', 'yz_member_income.incometable_id') ->select([ 'yz_member_income.id', 'yz_member_income.member_id', 'yz_member_income.dividend_code', 'yz_member_income.amount', 'yz_member_income.status', 'yz_member_income.created_at', 'yz_member_income.type_name', 'yz_team_dividend.type' ]) ->where('yz_member_income.member_id', $uid) ->orderBy('yz_member_income.created_at','DESC') ->paginate(20) ->toArray(); foreach($result['data'] as &$item){ switch ($item['type']) { case 0: $item['type_name'] = '分红佣金'; break; case 1: $item['type_name'] = '区县奖励'; break; case 2: $item['type_name'] = '感恩奖励'; break; case 3: $item['type_name'] = '额外分红'; break; case 7: $item['type_name'] = '合作养殖补助';// 月月返 break; case 8: $item['type_name'] = '拓新奖';// 分红奖 break; } } break; // 今日收益 case 'today': $startTime = strtotime(date("Y-m-d 00:00:00", time())); $endTime = strtotime(date("Y-m-d 23:59:59",time())); $result = Income::uniacid() ->select(['id','member_id','dividend_code','amount','status','created_at','type_name']) ->where('created_at','>=',$startTime) ->where('created_at','<=',$endTime) ->where('member_id', $uid) ->orderBy('created_at','DESC') ->paginate(20) ->toArray(); break; // 可提现金额 case 'withdrawal': $result = Income::uniacid() ->select(['id','member_id','dividend_code','amount','status','created_at','type_name']) ->where('member_id', $uid) ->where('status', 0) ->orderBy('created_at','DESC') ->paginate(20) ->toArray(); break; // 养殖收益 统计已结算收益 case 'rebate': $result = Rebate::where('uid',$uid) ->selectRaw('id,uid as member_id,money as amount,status,created_at') ->where('status', 2) ->orderBy('created_at','DESC') ->paginate(20) ->toArray(); break; // 合作养殖补助 case 'recommend': $result = TeamDividendModel::uniacid() ->select(['id','member_id','dividend_amount','status','created_at','type']) ->where('member_id',$uid) ->whereIn('type',[7,8]) ->orderBy('created_at','DESC') ->paginate(20) ->toArray(); break; // 平级奖收益 case 'level_give': $result = TeamDividendModel::uniacid() ->select(['id','member_id','dividend_amount','status','created_at','type']) ->where('member_id',$uid) ->where('type',1) ->orderBy('created_at','DESC') ->paginate(20) ->toArray(); break; } return $this->successJson('success',[ 'current_page' => (int)$result['current_page'], 'data' => (array)$result['data'], 'last_page' => (int)$result['last_page'], ]); } }