bztang-admin/plugins/team-dividend/src/admin/TeamAgencyController.php

425 lines
18 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Yunshop\TeamDividend\admin;
use app\common\components\BaseController;
use app\common\exceptions\AppException;
use app\common\exceptions\ShopException;
use app\common\helpers\PaginationHelper;
use app\common\helpers\Url;
use app\common\models\Member;
use app\common\models\Order;
use Illuminate\Support\Facades\DB;
use Yunshop\TeamDividend\admin\models\TeamDividendAgencyModel;
use Yunshop\TeamDividend\jobs\NewUpgrateJob;
use Yunshop\TeamDividend\models\CodeRecordModel;
use Yunshop\TeamDividend\models\Log;
use Yunshop\TeamDividend\models\OrderModel;
use Yunshop\TeamDividend\models\TeamDividendLevelModel;
use Yunshop\TeamDividend\models\TeamDividendLevelUpgrade;
use Yunshop\TeamDividend\models\Uplog;
use Yunshop\TeamDividend\services\GetAgentsService;
use Yunshop\TeamDividend\services\ReturnConfig;
use Yunshop\TeamDividend\services\UpgradeService;
use Yunshop\TeamDividend\services\FundPoolAwardService;
use app\common\services\ExportService;
use Yunshop\TeamDividend\services\upgrate\UplogService;
class TeamAgencyController extends BaseController
{
private $pageSize = 20;
public function setBlack()
{
$this->validate(['id' => 'required|integer|min:1'], null, [], ['id' => '经销商ID']);
if (!$agent = TeamDividendAgencyModel::uniacid()->find(request()->id)) {
return $this->errorJson('经销商不存在');
}
if (!TeamDividendAgencyModel::setBlack($agent, request()->is_black ? 1 : 0)) {
return $this->message('修改失败','','error');
}
return $this->message('修改成功');
}
public function index()
{
$parames = \YunShop::request();
$uid = $parames->get('uid');
$title = '经销商';
if (strpos($parames['searchtime'], '×') !== FALSE) {
$search_time = explode('×', $parames['searchtime']);
if (!empty($search_time)) {
$parames['searchtime'] = $search_time[0];
$start_time = explode('=', $search_time[1]);
$end_time = explode('=', $search_time[2]);
$parames->times = [
'start' => $start_time[1],
'end' => $end_time[1]
];
}
}
$list = TeamDividendAgencyModel::searchAgency($parames);
$list->with(['hasManyMemberChildren'=>function ($query) {
return $query->select('yz_member.member_id','yz_member.parent_id')->join('yz_team_dividend_agency',function ($join) {
$join->on('yz_team_dividend_agency.uid','=','yz_member.member_id')->whereNull('yz_team_dividend_agency.deleted_at');
});
}]);
if($uid){
$list = $list->where('yz_member.parent_id',$uid);
$title = '下级经销商';
}
$list = $list->paginate($this->pageSize);
$list = $list->toArray();
$pager = PaginationHelper::show($list['total'], $list['current_page'], $this->pageSize);
$starttime = $endtime = time();
if (isset($parames['searchtime']) && ($parames['searchtime'] == 1 || $parames['searchtime'] == 2)) {
if ($parames['times']['start'] != '请选择' && $parames['times']['end'] != '请选择') {
$starttime = strtotime($parames['times']['start']);
$endtime = strtotime($parames['times']['end']);
}
}
$level = TeamDividendLevelModel::getList()->get();
// 获取所有经销商的排名信息
$rankList = TeamDividendLevelModel::getRanking();
// 获取每个经销商的赠送名额
$uidS = array_column($list['data'],'uid');
$quotaInfo = Uplog::uniacid()
->select([DB::raw("sum(give_limit) as total_quota"),'uid'])
->whereIn('uid',$uidS)
->orderBy('created_at','ASC')
->groupBy('uid')
->get()
->toArray();
$quotaInfo = array_column($quotaInfo,'total_quota','uid');
// 已使用
$useQuota = TeamDividendAgencyModel::uniacid()
->select([DB::raw("count(id) as total_use_quota"),'give_uid'])
->whereIn('give_uid',$uidS)
->groupBy('uid')
->get()
->toArray();
$useQuota = array_column($useQuota,'total_use_quota','give_uid');
foreach ($list['data'] as $key => $item) {
$list['data'][$key]['total'] = count($item['has_many_member_children']);
// 剩余名额处理
$list['data'][$key]['total_quota'] = (int)$quotaInfo[$item['uid']];
$list['data'][$key]['surplus_quota'] = (int)$quotaInfo[$item['uid']] - (int)$useQuota[$item['uid']];
$list['data'][$key]['use_quota'] = (int)$useQuota[$item['uid']];
// 排名处理
$list['data'][$key]['rank_list'] = array_filter(array_map(function($rankInfo) use ($item){
$rankSort = (string)$rankInfo['up_log'][$item['uid']];
if($rankSort === '0' || $rankSort) {
return [
'id' => $rankInfo['id'],
'level_name' => $rankInfo['level_name'],
'ranking' => ((int)$rankInfo['up_log'][$item['uid']] + 1),
];
}
return [];
},$rankList));
}
return view('Yunshop\TeamDividend::admin.team-agency', [
'list' => $list,
'endtime' => $endtime,
'starttime' => $starttime,
'total' => $list['total'],
'pager' => $pager,
'title' => $title,
'level' => $level,
'request' => \YunShop::request(),
])->render();
}
/**
* @return mixed|string
* @throws AppException
* @throws \Throwable
*/
public function add()
{
$level_list = TeamDividendLevelModel::getList()->get();
if (\Request::getMethod() == 'POST') {
$agentData = \YunShop::request()->team;
$agentData['uniacid'] = \YunShop::app()->uniacid;
$agentData['upgrade_at'] = time();
if((int)$agentData['level'] <= 0) return $this->message('添加失败,请选择代理等级!', '', 'error');
// 其他验证
$agency_model = new TeamDividendAgencyModel();
$agency_model->fill($agentData);
$validator = $agency_model->validator();
if ($validator->fails()) {
$this->error($validator->messages());
} else {
if ($agency_model->save()) {
// 升级后等级
$c_level = TeamDividendLevelModel::with(['hasOneUpgradeSet'])->find($agentData['level']);
// 升级前等级
$o_level = NULL;
// 升级日志
Uplog::addLog($agency_model, $o_level, $c_level);
//签合同
$data=[
'member_id'=>$agentData['uid'],
'created_at' => time(),
];
event(new \app\common\events\plugin\TeamDividendEvent($data));
//激活码
$upgrade_set = (new UpgradeService())->getUpgradeById($agentData['level']);
if ($upgrade_set) {
$set = \Setting::get('plugin.team_dividend');
if ($set['is_activation_code'] && $upgrade_set[0]->code_num) {
$level_list = TeamDividendLevelModel::getList()->get();
$code_num = unserialize($upgrade_set[0]->code_num);
foreach($level_list as $key => $level) {
if($code_num['level_'.$level->id]) {
(new UpgradeService())->senCode($agentData['uid'], $code_num['level_'.$level->id], $level->id, $level->level_name);
}
}
\Log::debug('激活码');
}
}
(new UpgradeService())->becomeAgencyNotify($agentData['uid']);
//直推奖 todo 直推奖不用了
// (new UpgradeService())->sendBonus($agentData['uid']);
// \Log::debug('直推奖');
return $this->message('经销商操作成功', yzWebUrl('plugin.team-dividend.admin.team-agency'));
}
}
}
return view('Yunshop\TeamDividend::admin.team-agency-add', [
'level' => $level_list
])->render();
}
public function searchAgency()
{
$keyword = \YunShop::request()->keyword;
$member = Member::getMemberInfoByNickName($keyword);
return view('Yunshop\TeamDividend::admin.query', [
'members' => $member
])->render();
}
public function export()
{
$file_name = date('Ymdhis', time()) . '';
$parames = \YunShop::request();
if (strpos($parames['searchtime'], '×') !== FALSE) {
$search_time = explode('×', $parames['searchtime']);
if (!empty($search_time)) {
$parames['searchtime'] = $search_time[0];
$start_time = explode('=', $search_time[1]);
$end_time = explode('=', $search_time[2]);
$parames->times = [
'start' => $start_time[1],
'end' => $end_time[1]
];
}
}
// $list = TeamDividendAgencyModel::searchAgency($parames)->get()->toArray();
$list = TeamDividendAgencyModel::searchAgency($parames);
$uid = $parames->get('uid');
if($uid){
$list = $list->where('yz_team_dividend_agency.parent_id',$uid);
}
$export_page = request()->export_page ? request()->export_page : 1;
$export_model = new ExportService($list, $export_page);
$list = $list->get()->toArray();
$childe = TeamDividendAgencyModel::getChildNumByPrantId();
foreach ($list as $key => $item) {
foreach ($childe as $c_item ) {
if ($c_item['parent_id'] == $item['uid']) {
$list[$key]['total'] = $c_item['total'];
}
}
}
$export_data[0] = ['ID', '会员', '推荐人会员ID', '成为代理时间', '推荐人姓名', '推荐人手机号', '经销商', '手机号','等级', '一级(直系)总经销商人数', '分红比例', '已结算分红', '未结算分红', '累计结算分红','团队业绩','团队商品销量'];
foreach ($list as $key => $item) {
if (!empty($item['status'])) {
$status = '已使用';
} else {
$status = '未使用';
}
if($item['has_many_team_dividend'][0]['status'] == 1)
$item['dividend_final'] = $item['has_many_team_dividend'][0]['total_amount'];
elseif($item['has_many_team_dividend'][1]['status'] == 1)
$item['dividend_final'] = $item['has_many_team_dividend'][1]['total_amount'];
elseif($item['has_many_team_dividend'][2]['status'] == 1)
$item['dividend_final'] = $item['has_many_team_dividend'][2]['total_amount'];
else
$item['dividend_final'] = 0;
if($item['has_many_team_dividend'][0]['status'] === 0)
$item['dividend_open'] = $item['has_many_team_dividend'][0]['total_amount'];
elseif($item['has_many_team_dividend'][1]['status'] === 0)
$item['dividend_open'] = $item['has_many_team_dividend'][1]['total_amount'];
elseif($item['has_many_team_dividend'][2]['status'] === 0)
$item['dividend_open'] = $item['has_many_team_dividend'][2]['total_amount'];
else
$item['dividend_open'] = 0;
$item['dividend_total'] = $item['has_many_team_dividend'][2]['total_amount'] + $item['has_many_team_dividend'][1]['total_amount'] + $item['has_many_team_dividend'][0]['total_amount']?:0;
$export_data[$key + 1] = [
$item['id'],
$item['has_one_member']['uid'],
$item['to_parent']['uid'] ?? 0,
$item['created_at'],
$item['to_parent']['realname'] ?? '',
$item['to_parent']['mobile'] ?? 0,
$item['has_one_member']['username'],
$item['has_one_member']['mobile'],
$item['has_one_level']['level_name'],
$item['total'],
$item['has_one_level']['dividend_ratio'],
$item['dividend_final'],
$item['dividend_open'],
$item['dividend_total'],
$item['team_order_price'],
$item['team_goods_total']];
}
$export_model->export($file_name, $export_data, 'plugin.team-dividend.admin.team-agency.index', 'direct_export');
// \Excel::create($file_name, function ($excel) use ($export_data) {
// // Set the title
// $excel->setTitle('Office 2005 XLSX Document');
//
// // Chain the setters
// $excel->setCreator('')
// ->setLastModifiedBy("")
// ->setSubject("Office 2005 XLSX Test Document")
// ->setDescription("Test document for Office 2005 XLSX, generated using PHP classes.")
// ->setKeywords("office 2005 openxml php")
// ->setCategory("report file");
//
// $excel->sheet('info', function ($sheet) use ($export_data) {
// $sheet->rows($export_data);
// });
//
//
// })->export('xls');
}
public function daletedAgency()
{
$id = \YunShop::request()->id;
$agency = TeamDividendAgencyModel::find($id);
if(!$agency) {
return $this->message('无此经销商或已经删除','','error');
}
$uid= TeamDividendAgencyModel::getuid($id);
$result = TeamDividendAgencyModel::daletedAgency($id);
$code_id=CodeRecordModel::daletedCode($uid['uid']);
return $this->message('删除成功',Url::absoluteWeb('plugin.team-dividend.admin.team-agency'));
}
public function change()
{
$id = \YunShop::request()->id;
$levelId = \YunShop::request()->value;
$agency = TeamDividendAgencyModel::find($id);
$levelInfo = TeamDividendLevelModel::find($levelId);
// 等级类型0=普通等级1=文创等级
if((int)$levelInfo->level_type == 1){
$level = $agency->cultural_level_id;
$agency->cultural_level_id = $levelId;
$agency->cultural_upgrade_at = time();
}else{
$level = $agency->level;
$agency->level = \YunShop::request()->value;
$agency->upgrade_at = time();
}
if ($agency->save()) {
// 升级后等级
$c_level = TeamDividendLevelModel::with(['hasOneUpgradeSet'])->find($agency->level);
// 升级前等级
$o_level = TeamDividendLevelModel::with(['hasOneUpgradeSet'])->find($level);
// 升级日志
Uplog::addLog($agency, $o_level, $c_level);
if ($c_level->level_weight > $o_level->level_weight) {
//激活码
$upgrade_set = (new UpgradeService())->getUpgradeById($agency->level);
if ($upgrade_set) {
$set = \Setting::get('plugin.team_dividend');
if ($set['is_activation_code'] && $upgrade_set[0]->code_num) {
$level_list = TeamDividendLevelModel::getList()->get();
$code_num = (is_array($upgrade_set[0]->code_num) ? $upgrade_set[0]->code_num : unserialize($upgrade_set[0]->code_num)) ?: [];
foreach($level_list as $key => $level) {
if($code_num['level_'.$level->id]) {
(new UpgradeService())->senCode($agency->uid, $code_num['level_'.$level->id], $level->id, $level->level_name);
}
}
\Log::debug('激活码');
}
}
//代理商升级通知
(new UpgradeService())->agencyUpgradeNotify($agency->uid, $o_level->level_name, $o_level->dividend_ratio_name, $agency->level);
}
}
}
public function test(){
//因为model偶尔会出现status异常的问题所以重新查询一遍
// $model = Order::with('hasManyOrderGoods')->find(84);
// $set = \Setting::get('plugin.team_dividend');
// (new NewUpgrateJob($model->uid, $set, $model->uniacid, TeamDividendLevelUpgrade::ORDER_PAY, $model))->handle();
// $order = Order::find(87);
// $TeamReturnService = ReturnConfig::getClass();
// if (app('plugins')->isEnabled('team-sideways')) debug('经销商订单创建终止:team-sideways');
// $set = $order->getSetting('plugin.team_dividend');
// if (!$set['is_team_dividend']) debug('是否开启经销商插件');
// $buyMember = $order->belongsToMember;
// $agents = GetAgentsService::index($set, $order->uid, $order->create_time);
// foreach ($order->hasManyOrderGoods as $order_goods) {
// // 普通经销商提成处理
// $TeamReturnService->setData($order, $set, $buyMember, $order_goods, $agents);
// $TeamReturnService->handle();
// $this->totalDividend += $TeamReturnService->totalDividend;
// // 文创津贴(补贴)处理
// $TeamReturnService->setData($order, $set, $buyMember, $order_goods, $agents,1);
// $TeamReturnService->handle();
// $this->totalDividend += $TeamReturnService->totalDividend;
// }
// debug(['总分红金额(包括津贴和补贴)'=>$this->totalDividend]);
debug("结束");
}
}