386 lines
19 KiB
PHP
386 lines
19 KiB
PHP
<?php
|
||
|
||
namespace Yunshop\Rebate\Api;
|
||
|
||
use app\common\components\ApiController;
|
||
use app\common\facades\Setting;
|
||
use app\common\models\Goods;
|
||
use app\common\models\Income;
|
||
use app\common\models\Member;
|
||
use Illuminate\Support\Facades\DB;
|
||
use Yunshop\Rebate\models\Rebate;
|
||
use Yunshop\TeamDividend\models\TeamDividendAgencyModel;
|
||
use Yunshop\TeamDividend\models\TeamDividendLevelModel;
|
||
use Yunshop\TeamDividend\models\TeamDividendModel;
|
||
|
||
class IndexController extends ApiController{
|
||
/**
|
||
* Common: 我的收入
|
||
* Author: wu-hui
|
||
* Time: 2024/03/18 10:58
|
||
* @return \Illuminate\Http\JsonResponse
|
||
*/
|
||
public function myIncomeStatistics(){
|
||
$uid = \YunShop::app()->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'],
|
||
]);
|
||
}
|
||
|
||
|
||
|
||
} |