添加:经销商等级分为普通经销商和文创经销商

添加:普通经销商提成和文创经销商补贴分开计算,如果同时存在两种身份则可以同时领取提成和补贴
添加:经销商提成修改为普通添加和文创补贴。文创补贴只能在下个月才能申请提现
This commit is contained in:
wuhui_zzw 2023-11-04 17:01:17 +08:00
parent a38500fedf
commit 2a992b56c7
17 changed files with 686 additions and 332 deletions

View File

@ -95,15 +95,10 @@ class IncomeWithdrawController extends ApiController
$all_withdraw_income = 0; $all_withdraw_income = 0;
foreach ($income_config as $key => $income) { foreach ($income_config as $key => $income) {
//余额不计算 拍卖预付款不计算 //余额不计算 拍卖预付款不计算
if ($income['type'] == 'balance' || $income['type'] == 'auction_prepayment') { if ($income['type'] == 'balance' || $income['type'] == 'auction_prepayment') continue;
continue;
}
//获取收入独立设置 //获取收入独立设置
$this->setIncomeSet($income['type']); $this->setIncomeSet($income['type']);
//附值手续费、劳务税(收银台不计算手续费、劳务税) //附值手续费、劳务税(收银台不计算手续费、劳务税)
if ($income['type'] == 'kingtimes_provider' || $income['type'] == 'kingtimes_distributor') { if ($income['type'] == 'kingtimes_provider' || $income['type'] == 'kingtimes_distributor') {
$this->poundage_rate = 0; $this->poundage_rate = 0;
@ -123,7 +118,7 @@ class IncomeWithdrawController extends ApiController
$all_withdraw_income += $data['income']; $all_withdraw_income += $data['income'];
$income_data[] = $data; $income_data[] = $data;
} }
//dd($income_data);
//增加经销商提现显示口爱心值 //增加经销商提现显示口爱心值
if ($income['type'] == 'teamDividend') { if ($income['type'] == 'teamDividend') {
@ -134,6 +129,7 @@ class IncomeWithdrawController extends ApiController
$deductionLove['deduction_value'] = $teamDividendWithdraw->deductionAmount($this->withdraw_amounts); $deductionLove['deduction_value'] = $teamDividendWithdraw->deductionAmount($this->withdraw_amounts);
} }
} }
$withdraw_rich_text = WithdrawRichText::uniacid()->first() ?: []; $withdraw_rich_text = WithdrawRichText::uniacid()->first() ?: [];
$data = [ $data = [
'data' => $income_data, 'data' => $income_data,
@ -468,9 +464,31 @@ class IncomeWithdrawController extends ApiController
* 可提现数据 item * 可提现数据 item
* @return array * @return array
*/ */
private function getItemData($key, $income) private function getItemData($key, $income){
{ if($income['type'] == 'teamDividend'){
$this->withdraw_amounts = $this->getIncomeModel()->where('incometable_type', $income['class'])->sum('amount'); // 普通经销商佣金
$this->withdraw_amounts = Income::uniacid()
->leftJoin('yz_team_dividend','yz_team_dividend.id','yz_member_income.incometable_id')
->where('yz_member_income.incometable_type', $income['class'])
->where('yz_member_income.status', Income::STATUS_INITIAL)
->where('yz_member_income.member_id', \YunShop::app()->getMemberId())
->whereNotIn('yz_team_dividend.type', [4,5])
->sum('yz_member_income.amount');
}else if($income['type'] == 'teamDividendCultural'){
// 文创经销商补贴 仅查询一个月前的未提现金额
$startTime = strtotime(date("Y-m-1"));// 本月1号0点
$this->withdraw_amounts = Income::uniacid()
->leftJoin('yz_team_dividend','yz_team_dividend.id','yz_member_income.incometable_id')
->where('yz_member_income.incometable_type', $income['class'])
->where('yz_member_income.status', Income::STATUS_INITIAL)
->where('yz_member_income.member_id', \YunShop::app()->getMemberId())
->where('yz_member_income.created_at', '<',$startTime)
->whereIn('yz_team_dividend.type', [4,5])
->sum('yz_member_income.amount');
}else{
$this->withdraw_amounts = $this->getIncomeModel()->where('incometable_type', $income['class'])->sum('amount');
}
$can = $this->incomeIsCanWithdraw(); $can = $this->incomeIsCanWithdraw();
if ($income['type'] == 'commission') { if ($income['type'] == 'commission') {
@ -552,6 +570,7 @@ class IncomeWithdrawController extends ApiController
$data['allow_withdrawal_date'] = implode(',',$withdrawDate); $data['allow_withdrawal_date'] = implode(',',$withdrawDate);
} }
return $data; return $data;
} }

View File

@ -90,10 +90,14 @@ class OrderCreatedListener
$agents = GetAgentsService::index($set, $order->uid, $order->create_time); $agents = GetAgentsService::index($set, $order->uid, $order->create_time);
\Log::debug('经销商-获取经销商',$agents); \Log::debug('经销商-获取经销商',$agents);
foreach ($order->hasManyOrderGoods as $order_goods) { foreach ($order->hasManyOrderGoods as $order_goods) {
// 普通经销商提成处理
$TeamReturnService->setData($order, $set, $buyMember, $order_goods, $agents); $TeamReturnService->setData($order, $set, $buyMember, $order_goods, $agents);
$TeamReturnService->handle(); $TeamReturnService->handle();
$this->totalDividend += $TeamReturnService->totalDividend; $this->totalDividend += $TeamReturnService->totalDividend;
// 文创津贴(补贴)处理
$TeamReturnService->setData($order, $set, $buyMember, $order_goods, $agents,1);
$TeamReturnService->handle();
$this->totalDividend += $TeamReturnService->totalDividend;
} }
// 订单插件分红记录 // 订单插件分红记录

View File

@ -13,6 +13,7 @@ use Yunshop\TeamDividend\Listener\OrderPaidListener;
use Yunshop\TeamDividend\Listener\OrderReceiveListener; use Yunshop\TeamDividend\Listener\OrderReceiveListener;
use Yunshop\TeamDividend\Listener\RegisterByAgentListener; use Yunshop\TeamDividend\Listener\RegisterByAgentListener;
use Yunshop\TeamDividend\models\TeamDividendAgencyModel; use Yunshop\TeamDividend\models\TeamDividendAgencyModel;
use Yunshop\TeamDividend\models\TeamDividendLevelModel;
use Yunshop\TeamDividend\services\GoodsDetailService; use Yunshop\TeamDividend\services\GoodsDetailService;
class PluginApplication extends \app\common\services\PluginApplication class PluginApplication extends \app\common\services\PluginApplication
@ -634,11 +635,16 @@ class PluginApplication extends \app\common\services\PluginApplication
]); ]);
} }
public function getIncomeItems() public function getIncomeItems(){
{
$lang = \Setting::get('shop.lang', ['lang' => 'zh_cn'])['zh_cn']['team_dividend']; $lang = \Setting::get('shop.lang', ['lang' => 'zh_cn'])['zh_cn']['team_dividend'];
$title = $lang['title'] ?: trans('Yunshop\TeamDividend::index.name'); $title = $lang['title'] ?: trans('Yunshop\TeamDividend::index.name');
$dividend = $lang['dividend'] ?: trans('Yunshop\TeamDividend::index.dividend'); $dividend = $lang['dividend'] ?: trans('Yunshop\TeamDividend::index.dividend');
$teamDividendCulturalName = '服务津贴';
$uid = \YunShop::app()->getMemberId();
if($uid > 0){
$culturalLevelId = TeamDividendAgencyModel::uniacid()->where('uid',$uid)->value('cultural_level_id');
$teamDividendCulturalName = TeamDividendLevelModel::uniacid()->where('id',$culturalLevelId)->value('cultural_level_name');
}
return [ return [
'teamDividend' => [ 'teamDividend' => [
'title' => $lang['title'] ?: trans('Yunshop\TeamDividend::index.title'), 'title' => $lang['title'] ?: trans('Yunshop\TeamDividend::index.title'),
@ -651,7 +657,13 @@ class PluginApplication extends \app\common\services\PluginApplication
'type' => 'storeManager', 'type' => 'storeManager',
'type_name' => '店长店补', 'type_name' => '店长店补',
'class' => 'Yunshop\TeamDividend\Common\models\StoreManagerRecordModel', 'class' => 'Yunshop\TeamDividend\Common\models\StoreManagerRecordModel',
] ],
'teamDividendCultural' => [
'title' => $teamDividendCulturalName,
'type' => 'teamDividendCultural',
'type_name' => $teamDividendCulturalName,
'class' => 'Yunshop\TeamDividend\models\TeamDividendModel',
],
]; ];
} }
@ -706,27 +718,12 @@ class PluginApplication extends \app\common\services\PluginApplication
*/ */
$events->subscribe(\Yunshop\TeamDividend\Listener\AreaDividendListener::class); $events->subscribe(\Yunshop\TeamDividend\Listener\AreaDividendListener::class);
// 店长相关
\Event::listen('cron.collectJobs', function () {
// 每天0点30 执行一次店长信息统计
\Cron::add('Team-dividend-store-manager', '30 0 * * *', function () {
\Log::debug('--- 经销商 - 店长统计 - 开始 ----');
(new StoreManagerModel())->infoStatistics();
return;
});
// 每天1点30 执行一次店长信息统计
\Cron::add('Team-dividend-store-manager-settlement', '30 1 * * *', function () {
\Log::debug('--- 经销商 - 店长结算 - 开始 ----');
(new StoreManagerModel())->settlement();
return;
});
});
} }
public function cronConfig() public function cronConfig(){
{
\Event::listen('cron.collectJobs', function () { \Event::listen('cron.collectJobs', function () {
// 经销商佣金结算 由10分钟执行一次修改为1分钟执行一次 2023-9-25 // 经销商佣金结算 由10分钟执行一次修改为1分钟执行一次 2023-9-25
\Cron::add('Team-dividend', '*/1 * * * *', function () { \Cron::add('Team-dividend', '*/1 * * * *', function () {
@ -758,6 +755,20 @@ class PluginApplication extends \app\common\services\PluginApplication
return; return;
}); });
}); });
// 店长相关
\Event::listen('cron.collectJobs', function () {
// 每天0点30 执行一次店长信息统计
\Cron::add('Team-dividend-store-manager', '30 0 * * *', function () {
\Log::debug('--- 经销商 - 店长统计 - 开始 ----');
(new StoreManagerModel())->infoStatistics();
return;
});
// 每天1点30 执行一次店长信息统计
\Cron::add('Team-dividend-store-manager-settlement', '30 1 * * *', function () {
\Log::debug('--- 经销商 - 店长结算 - 开始 ----');
(new StoreManagerModel())->settlement();
return;
});
});
} }
} }

View File

@ -10,14 +10,19 @@ use app\common\exceptions\ShopException;
use app\common\helpers\PaginationHelper; use app\common\helpers\PaginationHelper;
use app\common\helpers\Url; use app\common\helpers\Url;
use app\common\models\Member; use app\common\models\Member;
use app\common\models\Order;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Yunshop\TeamDividend\admin\models\TeamDividendAgencyModel; use Yunshop\TeamDividend\admin\models\TeamDividendAgencyModel;
use Yunshop\TeamDividend\jobs\NewUpgrateJob;
use Yunshop\TeamDividend\models\CodeRecordModel; use Yunshop\TeamDividend\models\CodeRecordModel;
use Yunshop\TeamDividend\models\Log; use Yunshop\TeamDividend\models\Log;
use Yunshop\TeamDividend\models\OrderModel; use Yunshop\TeamDividend\models\OrderModel;
use Yunshop\TeamDividend\models\TeamDividendLevelModel; use Yunshop\TeamDividend\models\TeamDividendLevelModel;
use Yunshop\TeamDividend\models\TeamDividendLevelUpgrade;
use Yunshop\TeamDividend\models\Uplog; use Yunshop\TeamDividend\models\Uplog;
use Yunshop\TeamDividend\services\GetAgentsService;
use Yunshop\TeamDividend\services\ReturnConfig;
use Yunshop\TeamDividend\services\UpgradeService; use Yunshop\TeamDividend\services\UpgradeService;
use Yunshop\TeamDividend\services\FundPoolAwardService; use Yunshop\TeamDividend\services\FundPoolAwardService;
use app\common\services\ExportService; use app\common\services\ExportService;
@ -146,35 +151,23 @@ class TeamAgencyController extends BaseController
$level_list = TeamDividendLevelModel::getList()->get(); $level_list = TeamDividendLevelModel::getList()->get();
if (\Request::getMethod() == 'POST') { if (\Request::getMethod() == 'POST') {
$agentData = \YunShop::request()->team; $agentData = \YunShop::request()->team;
// $agent = TeamDividendAgencyModel::getAgencyInfoByUid($agentData['uid']);
// if($agent){
// return $this->message('添加失败,此会员已是代理商', '', 'error');
// }
$agentData['uniacid'] = \YunShop::app()->uniacid; $agentData['uniacid'] = \YunShop::app()->uniacid;
$agentData['upgrade_at'] = time(); $agentData['upgrade_at'] = time();
if((int)$agentData['level'] <= 0) return $this->message('添加失败,请选择代理等级!', '', 'error');
// 其他验证
$agency_model = new TeamDividendAgencyModel(); $agency_model = new TeamDividendAgencyModel();
$agency_model->fill($agentData); $agency_model->fill($agentData);
$validator = $agency_model->validator(); $validator = $agency_model->validator();
if ($validator->fails()) { if ($validator->fails()) {
$this->error($validator->messages()); $this->error($validator->messages());
} else { } else {
// $agency_model->uniacid = \YunShop::app()->uniacid;
// $agency_model->uid = $agentData['uid'];
// $agency_model->level = $agentData['level'];
// $agency_model->parent_id = floatval($agentData['parent_id']);
// $agency_model->relation = $agentData['relation'];
if ($agency_model->save()) { if ($agency_model->save()) {
// 升级后等级 // 升级后等级
$c_level = TeamDividendLevelModel::with(['hasOneUpgradeSet'])->find($agentData['level']); $c_level = TeamDividendLevelModel::with(['hasOneUpgradeSet'])->find($agentData['level']);
// 升级前等级 // 升级前等级
$o_level = NULL; $o_level = NULL;
// 升级日志 // 升级日志
Uplog::addLog($agency_model, $o_level, $c_level); Uplog::addLog($agency_model, $o_level, $c_level);
//签合同 //签合同
$data=[ $data=[
'member_id'=>$agentData['uid'], 'member_id'=>$agentData['uid'],
@ -186,14 +179,6 @@ class TeamAgencyController extends BaseController
if ($upgrade_set) { if ($upgrade_set) {
$set = \Setting::get('plugin.team_dividend'); $set = \Setting::get('plugin.team_dividend');
// if ($set['is_activation_code'] && isset($set['code_level'])) {
// $level_set = TeamDividendLevelModel::getLevelById($set['code_level']);
//
// (new UpgradeService())->senCode($agentData['uid'], $upgrade_set[0]->code_num, $set['code_level'], $level_set->level_name);
// \Log::debug('激活码');
// }
if ($set['is_activation_code'] && $upgrade_set[0]->code_num) { if ($set['is_activation_code'] && $upgrade_set[0]->code_num) {
$level_list = TeamDividendLevelModel::getList()->get(); $level_list = TeamDividendLevelModel::getList()->get();
$code_num = unserialize($upgrade_set[0]->code_num); $code_num = unserialize($upgrade_set[0]->code_num);
@ -355,25 +340,22 @@ class TeamAgencyController extends BaseController
public function change() public function change()
{ {
$id = \YunShop::request()->id; $id = \YunShop::request()->id;
$levelId = \YunShop::request()->value;
$agency = TeamDividendAgencyModel::find($id); $agency = TeamDividendAgencyModel::find($id);
$level = $agency->level; $levelInfo = TeamDividendLevelModel::find($levelId);
$agency->level = \YunShop::request()->value; // 等级类型0=普通等级1=文创等级
$agency->upgrade_at = time(); 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()) { if ($agency->save()) {
// 经销商等级变动记录
/*Log::create([
'uid' => $agency->uid,
'befor_level_id' => $level,
'up_code' => '无',
'after_level_id' => $agency->level,
'remark' => '后台修改',
'level_ups' => []
]);*/
// 升级后等级 // 升级后等级
$c_level = TeamDividendLevelModel::with(['hasOneUpgradeSet'])->find($agency->level); $c_level = TeamDividendLevelModel::with(['hasOneUpgradeSet'])->find($agency->level);
// 升级前等级 // 升级前等级
@ -390,7 +372,7 @@ class TeamAgencyController extends BaseController
$set = \Setting::get('plugin.team_dividend'); $set = \Setting::get('plugin.team_dividend');
if ($set['is_activation_code'] && $upgrade_set[0]->code_num) { if ($set['is_activation_code'] && $upgrade_set[0]->code_num) {
$level_list = TeamDividendLevelModel::getList()->get(); $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) ? : []; $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) { foreach($level_list as $key => $level) {
if($code_num['level_'.$level->id]) { if($code_num['level_'.$level->id]) {
(new UpgradeService())->senCode($agency->uid, $code_num['level_'.$level->id], $level->id, $level->level_name); (new UpgradeService())->senCode($agency->uid, $code_num['level_'.$level->id], $level->id, $level->level_name);
@ -406,4 +388,38 @@ class TeamAgencyController extends BaseController
} }
} }
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("结束");
}
} }

View File

@ -61,7 +61,7 @@ class TeamDividendLevelSetController extends BaseController
$validator = $team_dividend_level_model->validator(); $validator = $team_dividend_level_model->validator();
if ($validator->fails()) { if ($validator->fails()) {
$this->error($validator->messages()); return $this->message(reset(array_values($validator->messages()->getMessages())[0]),'', 'error');
} else { } else {
if ($team_dividend_level_model->save()) { if ($team_dividend_level_model->save()) {

View File

@ -67,46 +67,28 @@ class NewUpgrateJob implements ShouldQueue
$agents = $agentService->getAgents(); $agents = $agentService->getAgents();
// 循环上级 // 循环上级
foreach ($agents as $agent) { foreach ($agents as $agent) {
// 循环等级 // 黑名单不升级
$this->eachLevelHandle($agent); if ($agent['teamDividend']->is_black) continue;
// 升级处理
$this->eachLevelHandle($agent);// 普通等级升级处理
$this->eachCulturalLevelHandle($agent);// 文创等级升级处理
} }
// 订单支付成功 处理权重值相关内容(因为需要兼容 用户不是经销商,但是成为经销商后当前订单如果存在赠送权重值,则需要同步赠送。因此只能在这里调用赠送操作 // 订单支付成功 处理权重值相关内容(因为需要兼容 用户不是经销商,但是成为经销商后当前订单如果存在赠送权重值,则需要同步赠送。因此只能在这里调用赠送操作
if($this->order_status == TeamDividendLevelUpgrade::ORDER_PAY && $this->order){ if($this->order_status == TeamDividendLevelUpgrade::ORDER_PAY && $this->order){
(new WeightValue())->giveInit($this->order); (new WeightValue())->giveInit($this->order);
} }
} }
/** // 普通等级升级处理
* @name 查询等级权重比当前大的等级集合 public function eachLevelHandle($agent){
* @param $agent
* @return mixed
* @author
*/
public function eachLevelHandle($agent)
{
if ($agent['teamDividend']->is_black){ //黑名单不升级
return;
}
// $up_code = $this->setting['upgrate_type'] == 1 ? '或' : '与';
// 升级日志 // 升级日志
$this->uplogService = new UplogService($agent['uid'], \YunShop::app()->uniacid, $agent['teamDividend']->level, $this->setting['upgrate_type']); $this->uplogService = new UplogService($agent['uid'], \YunShop::app()->uniacid, $agent['teamDividend']->level, $this->setting['upgrate_type']);
$this->uplogService->setUpCode(1); $this->uplogService->setUpCode(1);
// 原 升级 类 // 原 升级 类
$oldUpgrade = new UpgradeService(); $oldUpgrade = new UpgradeService();
$upgradeLevels = $this->getUpgrateLevelsByWeight($agent); $upgradeLevels = $this->getUpgrateLevelsByWeight($agent);
// 经销商等级变动记录
/*$logModel = Log::create([
'uid' => $agent['uid'],
'befor_level_id' => $agent['teamDividend']->level,
'up_code' => $up_code,
'after_level_id' => '-1',
'remark' => '升级预备',
'level_ups' => []
]);*/
if ($upgradeLevels->isEmpty()) { if ($upgradeLevels->isEmpty()) {
/*$logModel->remark = '没有更高的等级可以升级'; /*$logModel->remark = '没有更高的等级可以升级';
$logModel->save();*/ $logModel->save();*/
@ -347,6 +329,216 @@ class NewUpgrateJob implements ShouldQueue
$this->uplogService->resetCondition(); $this->uplogService->resetCondition();
} }
} }
// 文创等级升级处理
public function eachCulturalLevelHandle($agent){
// 升级日志
$this->uplogService = new UplogService($agent['uid'], \YunShop::app()->uniacid, $agent['teamDividend']->cultural_level_id, $this->setting['upgrate_type']);
$this->uplogService->setUpCode(1);
// 原 升级 类
$oldUpgrade = new UpgradeService();
$upgradeLevels = $this->getUpgrateLevelsByWeight($agent,1);
if ($upgradeLevels->isEmpty()) return;
\Log::debug('经销商升级 - 文创等级 - 开始处理:');
// 默认可以升级
$upgradeRet = false;
foreach ($upgradeLevels as $level) {
// 判断:如果当前等级人数已经达到限制 则不升级(上限小于等于已存在数量 不能升级到该等级)
$hasNum = (int)Uplog::uniacid()->where('after_level_id',$level->id)->count(DB::raw('DISTINCT(uid)'));
if((int)$level->number_limit <= $hasNum && (int)$level->number_limit > 0) continue;
// 没有升级条件
if (!$level->hasOneUpgradeSet || !$level->hasOneUpgradeSet->parase) {
continue;
}
// 升级条件
$parase = unserialize($level->hasOneUpgradeSet->parase);
// 升级后的等级设置
$afterLevelSetting = $level->toArray();
$afterLevelSetting['has_one_upgrade_set']['parase'] = unserialize($afterLevelSetting['has_one_upgrade_set']['parase']);
$this->uplogService->setAfterLevelSetting($afterLevelSetting);
// 升级后的等级id
$this->uplogService->setAfterLevelId($level['id']);
// 升级条件 组
$upgradeGroup = $parase[0]['group'];
if ($this->order) {
if ($parase[0]['become'] != $this->order_status) {
continue;
}
}
if ($parase[0]['become'] == TeamDividendLevelUpgrade::ORDER_PAY) $order_status = Order::WAIT_SEND;
else $order_status = Order::COMPLETE;
if ($upgradeGroup) {
// 升级条件编号
$upgradeGroupSerialNumber = TeamDividendLevelUpgrade::getUpgradeIsSerialNumber();
foreach ($upgradeGroup as $group_item) {
// $group_item = 1001,1002,1003
if (!$group_item) continue;
$groupArr = explode(',', $group_item);
//todo 2019/7/4 改为false 不明白为什么要先赋值true
$upgradeGroupRet = false;
foreach ($groupArr as $value) {
// order_money_2
$typeName = $upgradeGroupSerialNumber[$value];
// 指定经销商等级
if ($value > 2000) {
$level_id = $value - 2000;
$typeName = 'level_' . $level_id . '_' . $parase[1]['level'][$level_id];
}
// 升级类
$upgrateService = new UpgrateConditionService($agent['uid'], $this->setting, $parase[1], $this->uniacid, $typeName, $order_status, $this->order, $this->uplogService);
// 升级方法
\Log::debug('===123分组方法名:' . $typeName);
$func = $this->getFunctionName($typeName);
if (!method_exists($upgrateService, $func)) {
continue;
}
$upgradeGroupRet = $upgrateService->$func();
// 条件组, 必须满足全部条件,不论设置的是或还是与
if (!$upgradeGroupRet) {
break;
}
}
$upgradeRet = $upgradeGroupRet;
// 条件 或
if ($this->setting['upgrate_type'] == 1) {
// 假 继续循环
if (!$upgradeGroupRet) continue;
// 真 跳出循环
break;
}
// 条件 与
if (!$upgradeGroupRet) {
$upgradeRet = $upgradeGroupRet;
break;
}
}
}
// 是否继续进行
$next = true;
if ($this->setting['upgrate_type'] == 1) {
// 如果升级方式为 或 $upgradeRet 为真 不继续
if ($upgradeRet) $next = false;
} else {
// 如果升级方式为 与 $upgradeRet 为假 不继续
if (!$upgradeRet && $upgradeGroup) $next = false;
}
// 升级条件 单个 与 升级结果为false
if ($next) {
$upgradeOnly = $parase[0];
$upgradeToLevel = $upgradeOnly['level'];
$upgradeToGroupLevel = $upgradeOnly['group_level'];
$upgradeToFirstChildLevel = $upgradeOnly['first_child_level'];
unset($upgradeOnly['become']);
unset($upgradeOnly['group']);
unset($upgradeOnly['level']);
unset($upgradeOnly['group_level']);
unset($upgradeOnly['first_child_level']);
foreach ($upgradeToLevel as $levelId => $ret) {
$upgradeOnly['level_' . $levelId . '_' . $parase[1]['level'][$levelId]] = '1';
}
foreach ($upgradeToGroupLevel as $levelId => $ret) {
$upgradeOnly['group_level_' . $levelId . '_' . $parase[1]['group_level'][$levelId]] = '1';
}
foreach ($upgradeToFirstChildLevel as $levelId => $ret) {
$upgradeOnly['first_child_level_' . $levelId . '_' . $parase[1]['first_child_level'][$levelId]] = '1';
}
// \Log::debug('经销商升级 - 继续 - 循环体:',$upgradeOnly);
foreach ($upgradeOnly as $upgrade => $only_item) {
// 升级类
$upgrateService = new UpgrateConditionService($agent['uid'], $this->setting, $parase[1], $this->uniacid, $upgrade, $order_status, $this->order, $this->uplogService);
// 升级方法
\Log::debug('===123单个方法名:' . $upgrade);
$func = $this->getFunctionName($upgrade);
// 升级条件 结果
if (!method_exists($upgrateService, $func)) {
continue;
}
$upgrateOnlyRet = $upgrateService->$func();
$upgradeRet = $upgrateOnlyRet;
// 升级 或
if ($this->setting['upgrate_type'] == 1) {
// 假 继续循环
if (!$upgrateOnlyRet) continue;
// 真 跳出循环
break;
}
// 升级 与
if (!$upgrateOnlyRet) break;
}
}
// 升级 退出
if ($upgradeRet) {
if (Redis::setnx('team_dividend_up' . $agent['uid'], 1)) {
Redis::expire('team_dividend_up' . $agent['uid'], 2);
} else {
sleep(2);
}
$agency = TeamDividendAgencyModel::getAgencyInfoByUid($agent['uid']);
if ($agency) {
$o_level = $agency->hasOneLevel->level_name;
$o_dividend_ratio = $agency->hasOneLevel->dividend_ratio;
//升级
$agency->cultural_level_id = $level->id;
$agency->cultural_upgrade_at = time();
$agency->save();
//升级通知
$oldUpgrade->agencyUpgradeNotify($agent['uid'], $o_level, $o_dividend_ratio, $level->id);
} else {
if (Member::find($agent['uid'])){
//会员升级为团队代理
$this->memberUpgradeToAgency($agent['uid'], $level->id,1);
//更新上级代理团队的下级代理总人数
$oldUpgrade->updateChildAgencyNumForParent($agent['uid']);
//团队代理人数升级
$oldUpgrade->upgradeForAgency($agent['uid']);
//成为团队代理通知
$oldUpgrade->becomeAgencyNotify($agent['uid']);
//新增下级团队代理通知
$member_model = Member::getUserInfos($agent['uid'])->first();
//新增下级团队代理通知
if ($member_model && !empty($member_model->yzMember->parent_id)) {
$oldUpgrade->newChileAgencyNotify($member_model->yzMember->parent_id, $agent['uid']);
}
}
}
// 升级日志
$this->uplogService->store();
// 记录
$agentData = [
'member_id' => $agent['uid'],
'created_at' => time(),
];
//监听经销商签合同
event(new \app\common\events\plugin\TeamDividendEvent($agentData));
//监听会员同步等级
$pluginLevel = [
'member_id' => $agent['uid'],
'level_id' => $level->id,
'plugin_type' => 3,
'self_up' => 1,
];
event(new \app\common\events\PluginLevelEvent($pluginLevel));
// 升级奖励
$this->upgradeAward($agent['uid'], $level);
// 奖励激活码
$this->awardCode($agent['uid'], $level);
// 升级后退出
break;
}
$this->uplogService->resetCondition();
}
}
/** /**
* @name 升级奖励激活码 * @name 升级奖励激活码
@ -371,15 +563,8 @@ class NewUpgrateJob implements ShouldQueue
} }
} }
/** // 升级奖励
* @name 升级奖励积分爱心值 public function upgradeAward($uid, $level){
* @param $uid
* @param $level
* @throws \app\common\exceptions\ShopException
* @author
*/
public function upgradeAward($uid, $level)
{
$isPluginGold = \YunShop::plugin()->get('love');//爱心值插件 $isPluginGold = \YunShop::plugin()->get('love');//爱心值插件
$upgradeRewardPoint = $level->upgrade_reward_point; $upgradeRewardPoint = $level->upgrade_reward_point;
$upgradeRewardGold = $level->upgrade_reward_gold; $upgradeRewardGold = $level->upgrade_reward_gold;
@ -445,70 +630,60 @@ class NewUpgrateJob implements ShouldQueue
return Str::camel(preg_replace("/\\d+/", '', $str)); return Str::camel(preg_replace("/\\d+/", '', $str));
} }
/**
* @name 获取当前会员的等级权重 // 查询等级权重比当前大的等级集合 - 根据等级类型查询
* @param $agent private function getUpgrateLevelsByWeight($agent,$levelType = 0)
* @return int
* @author
*/
private function getLevelWeight($agent)
{ {
$levelWeight = 0; $levelWeight = $this->getLevelWeight($agent,$levelType);
if ($agent['teamDividend']) {
// 等级升级设置关联查询
$agentLevel = TeamDividendLevelModel::with([
'hasOneUpgradeSet',
])
->where('id', $agent['teamDividend']->level)
->first();
if ($agentLevel) {
$levelWeight = $agentLevel->level_weight;
// 升级前的等级设置
$agentLevel = $agentLevel->toArray();
$agentLevel['has_one_upgrade_set']['parase'] = unserialize($agentLevel['has_one_upgrade_set']['parase']);
$this->uplogService->setBeforeLevelSetting($agentLevel);
}
}
return $levelWeight;
}
/**
* @name 查询等级权重比当前大的等级集合
* @param $agent
* @return mixed
* @author
*/
private function getUpgrateLevelsByWeight($agent)
{
$levelWeight = $this->getLevelWeight($agent);
$upgradeLevels = TeamDividendLevelModel::select() $upgradeLevels = TeamDividendLevelModel::select()
->with(['hasOneUpgradeSet']) ->with(['hasOneUpgradeSet'])
->where('uniacid', $this->uniacid) ->where('uniacid', $this->uniacid)
->where('level_weight', '>', $levelWeight) ->where('level_weight', '>', $levelWeight)
->where('level_type','=',(int)$levelType)
->orderBy('level_weight', 'desc') ->orderBy('level_weight', 'desc')
->get(); ->get();
return $upgradeLevels; return $upgradeLevels;
} }
// 获取当前会员的等级权重 - 根据等级类型查询
/** private function getLevelWeight($agent,$levelType){
* @name 会员成为经销商 $levelWeight = 0;
* @param $uid if($agent['teamDividend']){
* @param $levelId // 等级升级设置关联查询
* @author $agentLevel = TeamDividendLevelModel::with(['hasOneUpgradeSet'])
*/ ->when($levelType == 1,function($query) use ($agent){
private function memberUpgradeToAgency($uid, $levelId) // 文创等级
{ $query->where('id',$agent['teamDividend']->cultural_level_id);
},function($query) use ($agent){
// 普通等级
$query->where('id',$agent['teamDividend']->level);
})
->first();
if($agentLevel){
$levelWeight = $agentLevel->level_weight;
// 升级前的等级设置
$agentLevel = $agentLevel->toArray();
$agentLevel['has_one_upgrade_set']['parase'] = unserialize($agentLevel['has_one_upgrade_set']['parase']);
$this->uplogService->setBeforeLevelSetting($agentLevel);
}
}
return $levelWeight;
}
// 会员成为经销商
private function memberUpgradeToAgency($uid, $levelId,$levelType = 0){
$member = Member::getUserInfos($uid)->first(); $member = Member::getUserInfos($uid)->first();
$data = [
TeamDividendAgencyModel::replace([
'uniacid' => \YunShop::app()->uniacid, 'uniacid' => \YunShop::app()->uniacid,
'uid' => $member->uid, 'uid' => $member->uid,
'parent_id' => floatval($member->yzMember->parent_id), 'parent_id' => floatval($member->yzMember->parent_id),
'level' => $levelId,
'relation' => $member->yzMember->relation, 'relation' => $member->yzMember->relation,
'upgrade_at' => time(), ];
]); if($levelType == 1){
$data['cultural_level_id'] = $levelId;
$data['cultural_upgrade_at'] = time();
}else{
$data['level'] = $levelId;
$data['upgrade_at'] = time();
}
TeamDividendAgencyModel::replace($data);
} }
} }

View File

@ -135,26 +135,43 @@ class TeamDividendAgencyModel extends BackendModel
$result = $result->whereBetween('yz_team_dividend_agency.created_at', $range); $result = $result->whereBetween('yz_team_dividend_agency.created_at', $range);
} }
} }
$result = $result->with([
$result = $result->with( 'hasOneLevel' => function($query){
['hasOneLevel' => function($query){ return $query->select(['*']);
return $query->select(['*']); },
},'hasOneMember' => function($query){ 'culturalLevel' => function($query){
return $query->select(['*']); return $query->select(['id','level_name','level_weight','level_type','dividend_ratio','award_ratio','culate_model']);
},'toParent' => function($query){ },
return $query->select('uid', 'realname', 'mobile'); 'hasOneMember' => function($query){
},'hasManyTeamDividend' => function($query){ return $query->select(['*']);
return $query->selectRaw('member_id, status, sum(dividend_amount) as total_amount')->groupBy('member_id','status'); },
}])->orderBy('id', 'desc'); 'toParent' => function($query){
return $query->select('uid','realname','mobile');
},
'hasManyTeamDividend' => function($query){
return $query->selectRaw('member_id, status, sum(dividend_amount) as total_amount')
->groupBy('member_id','status');
}
])
->orderBy('id','desc');
return $result; return $result;
} }
public function culturalLevel(){
return $this->hasOne(TeamDividendLevelModel::class, 'id', 'cultural_level_id');
}
public static function getAgencyInfoByUid($uid) public static function getAgencyInfoByUid($uid)
{ {
return self::uniacid() return self::uniacid()
->with('hasOneLevel') ->with(['hasOneLevel'=>function($query){
$query->select(['id','award_gratitude','award_ratio','dividend_ratio','level_weight']);
},'culturalLevel'=>function($query){
$query->select(['id','award_gratitude','award_ratio','dividend_ratio','level_weight']);
}])
->where('uid', $uid) ->where('uid', $uid)
->first(); ->first();
} }

View File

@ -198,7 +198,7 @@ class TeamDividendLevelModel extends BackendModel
'level_weight' => [ 'level_weight' => [
'required', 'required',
'integer', 'integer',
Rule::unique($this->table)->ignore($this->id)->where('uniacid', $this->uniacid)->whereNull('deleted_at'), Rule::unique($this->table)->ignore($this->id)->where('uniacid', $this->uniacid)->where('level_type', $this->level_type)->whereNull('deleted_at'),
'min:1' 'min:1'
], ],
'upgrade_reward_point' => 'required', 'upgrade_reward_point' => 'required',

View File

@ -200,6 +200,12 @@ class TeamDividendModel extends BaseModel
case 3: case 3:
$this->TypeService = '额外分红'; $this->TypeService = '额外分红';
break; break;
case 4:
$this->TypeService = '津贴(补贴)';
break;
case 5:
$this->TypeService = '津贴(补贴)平级奖';
break;
} }
} }
return $this->TypeService; return $this->TypeService;

View File

@ -28,7 +28,11 @@ class GetAgentsService
// 所有上级 // 所有上级
$parents = MemberParent::with([ $parents = MemberParent::with([
'hasOneTeam' => function ($team) { 'hasOneTeam' => function ($team) {
$team->with(['hasOneLevel']); $team->with(['hasOneLevel'=>function($query){
$query->select(['id','award_gratitude','award_ratio','dividend_ratio','level_weight']);
},'culturalLevel'=>function($query){
$query->select(['id','award_gratitude','award_ratio','dividend_ratio','level_weight']);
}]);
} }
])->whereHas('hasOneParentMember') ])->whereHas('hasOneParentMember')
->where('member_id', $uid) ->where('member_id', $uid)

View File

@ -24,6 +24,7 @@ class GetAmountService
public $amount; public $amount;
public $fixed; public $fixed;
public $ratio; public $ratio;
private $dividendType = 0;
/** /**
* GetAmountService constructor. * GetAmountService constructor.
@ -34,9 +35,11 @@ class GetAmountService
* @param $team_goods * @param $team_goods
* @param $finish_ratio * @param $finish_ratio
* @param $finish_price * @param $finish_price
* @param $dividendType
*/ */
public function __construct($agent, $order, $order_goods, $set, $team_goods, $finish_ratio, $finish_price) public function __construct($agent, $order, $order_goods, $set, $team_goods, $finish_ratio, $finish_price, $dividendType = 0)
{ {
$this->dividendType = $dividendType;
$this->agent = $agent; $this->agent = $agent;
$this->order = $order; $this->order = $order;
$this->order_goods = $order_goods; $this->order_goods = $order_goods;
@ -154,7 +157,7 @@ class GetAmountService
*/ */
public function getAwardHierarchy() public function getAwardHierarchy()
{ {
$award_hierarchy = $this->agent['has_one_level']['award_hierarchy']; $award_hierarchy = $this->dividendType == 1 ? $this->agent['cultural_level']['award_hierarchy'] : $this->agent['has_one_level']['award_hierarchy'];
if ($this->hasPeers()) { if ($this->hasPeers()) {
$hierarchys = $this->getHierarchys(); $hierarchys = $this->getHierarchys();
$hierarchy_level = $hierarchys[$this->agent['level']]; $hierarchy_level = $hierarchys[$this->agent['level']];
@ -172,7 +175,7 @@ class GetAmountService
*/ */
public function getAwardHierarchyRatio() public function getAwardHierarchyRatio()
{ {
$ratio = $this->agent['has_one_level']['award_ratio']; $ratio = $this->dividendType == 1 ? $this->agent['cultural_level']['award_ratio'] : $this->agent['has_one_level']['award_ratio'];
if ($this->hasPeers()) { if ($this->hasPeers()) {
$hierarchys = $this->getHierarchys(); $hierarchys = $this->getHierarchys();
$hierarchy_level = $hierarchys[$this->agent['level']]; $hierarchy_level = $hierarchys[$this->agent['level']];
@ -293,8 +296,14 @@ class GetAmountService
// 收银台商品 与 存在独立奖励设置 else 商城 // 收银台商品 与 存在独立奖励设置 else 商城
if ($this->hasDividendRate()) { if ($this->hasDividendRate()) {
// 经销商奖励比例 - 下级经销商奖励比例 = 奖励比例 // 经销商奖励比例 - 下级经销商奖励比例 = 奖励比例
$ratio = bcsub($this->agent['has_one_level']['dividend_ratio'], $this->finish_ratio,2); if($this->dividendType == 1){
$this->finish_ratio = $this->agent['has_one_level']['dividend_ratio']; $ratio = bcsub($this->agent['cultural_level']['dividend_ratio'], $this->finish_ratio,2);
$this->finish_ratio = $this->agent['cultural_level']['dividend_ratio'];
}else{
$ratio = bcsub($this->agent['has_one_level']['dividend_ratio'], $this->finish_ratio,2);
$this->finish_ratio = $this->agent['has_one_level']['dividend_ratio'];
}
return $ratio; return $ratio;
} else { } else {
// 商城商品设置奖励比例 else 商城商品设置奖励固定金额 // 商城商品设置奖励比例 else 商城商品设置奖励固定金额
@ -306,8 +315,13 @@ class GetAmountService
} }
} }
} else { } else {
$ratio = bcsub($this->agent['has_one_level']['dividend_ratio'], $this->finish_ratio,2); if($this->dividendType == 1){
$this->finish_ratio = $this->agent['has_one_level']['dividend_ratio']; $ratio = bcsub($this->agent['cultural_level']['dividend_ratio'], $this->finish_ratio,2);
$this->finish_ratio = $this->agent['cultural_level']['dividend_ratio'];
}else{
$ratio = bcsub($this->agent['has_one_level']['dividend_ratio'], $this->finish_ratio,2);
$this->finish_ratio = $this->agent['has_one_level']['dividend_ratio'];
}
return $ratio; return $ratio;
} }
} }

View File

@ -59,20 +59,12 @@ class TeamReturnService
protected $flat_prize_limit; protected $flat_prize_limit;
// public function __construct($order, $set, $buyMember, $order_goods, $agents) private $dividendType = 0;// 分红类型0=普通经销商提成1=文创经销商津贴(补贴)
// {
// $this->order = $order;
// $this->set = $set;
// $this->buyMember = $buyMember;
// $this->order_goods = $order_goods;
// $this->agents = $agents;
// $this->team_goods = GoodsTeamDividend::getGoodsByGoodsId($this->order_goods->goods_id)->first();
// $this->levels = TeamDividendLevelModel::uniacid()->orderBy('level_weight','asc')->get()->toArray();
//
// }
public function setData($order, $set, $buyMember, $order_goods, $agents)
{
public function setData($order, $set, $buyMember, $order_goods, $agents, $dividendType = 0){
$this->dividendType = $dividendType;
$this->order = $order; $this->order = $order;
$this->set = $set; $this->set = $set;
$this->buyMember = $buyMember; $this->buyMember = $buyMember;
@ -93,12 +85,9 @@ class TeamReturnService
$this->running(); $this->running();
} }
private function running() private function running(){
{
foreach ($this->agents as $agent) { foreach ($this->agents as $agent) {
$this->amount_service = new GetAmountService($agent, $this->order, $this->order_goods, $this->set, $this->team_goods, $this->finish_ratio, $this->finish_price, $this->dividendType);
$this->amount_service = new GetAmountService($agent, $this->order, $this->order_goods, $this->set, $this->team_goods, $this->finish_ratio, $this->finish_price);
//商品分红限制 不计入平级奖层级 不算感恩奖 //商品分红限制 不计入平级奖层级 不算感恩奖
if ($agent['is_black'] || $this->getIsRestrict($agent)) { if ($agent['is_black'] || $this->getIsRestrict($agent)) {
continue; continue;
@ -109,10 +98,8 @@ class TeamReturnService
$this->order_goods->payment_amount = $this->order_goods->goods_price; $this->order_goods->payment_amount = $this->order_goods->goods_price;
} }
} }
// 感恩奖 // 感恩奖
$this->gratitudeAward($agent); $this->gratitudeAward($agent);
// 经销商奖励 // 经销商奖励
$this->dividendAward($agent); $this->dividendAward($agent);
// 平级奖 // 平级奖
@ -146,17 +133,18 @@ class TeamReturnService
return; return;
} }
// 如果 已完成经销商奖励金额 * 经销商等级设置的感恩奖比例 <= 0 // 如果 已完成经销商奖励金额 * 经销商等级设置的感恩奖比例 <= 0
$amount = proportionMath($this->finish_team_award_amount,$agent['has_one_level']['award_gratitude']); if($this->dividendType == 1) $amount = proportionMath($this->finish_team_award_amount,$agent['cultural_level']['award_gratitude']);
else $amount = proportionMath($this->finish_team_award_amount,$agent['has_one_level']['award_gratitude']);
if ($amount <= 0) { if ($amount <= 0) {
return; return;
} }
$dividendData = [ $dividendData = [
'amount' => $this->finish_team_award_amount, 'amount' => $this->finish_team_award_amount,
'dividend_rate' => $agent['has_one_level']['award_gratitude'], 'dividend_rate' => $this->dividendType == 1 ? $agent['cultural_level']['award_gratitude'] : $agent['has_one_level']['award_gratitude'],
'lower_level_rate' => 0, 'lower_level_rate' => 0,
'dividend_amount' => $amount, 'dividend_amount' => $amount,
'type' => 2 'type' => 2
]; ];
//添加到明细 //添加到明细
$dividend_model = $this->addDividend($agent, $dividendData); $dividend_model = $this->addDividend($agent, $dividendData);
@ -165,12 +153,12 @@ class TeamReturnService
$member = Member::getMemberByUid($agent['uid'])->with('hasOneFans')->first(); $member = Member::getMemberByUid($agent['uid'])->with('hasOneFans')->first();
$notice = [ $notice = [
'lower_level_name' => $this->buyMember->nickname, 'lower_level_name' => $this->buyMember->nickname,
'order_amount' => $this->order->price, 'order_amount' => $this->order->price,
'amount' => $this->finish_team_award_amount, 'amount' => $this->finish_team_award_amount,
'dividendRate' => $agent['has_one_level']['award_gratitude'], 'dividendRate' => $this->dividendType == 1 ? $agent['cultural_level']['award_gratitude'] : $agent['has_one_level']['award_gratitude'],
'rate' => $this->lower_ratio, 'rate' => $this->lower_ratio,
'dividend_amount' => $amount, 'dividend_amount' => $amount,
'dividend_id' => $dividend_model ? $dividend_model->id : 0, 'dividend_id' => $dividend_model ? $dividend_model->id : 0,
]; ];
if ($this->set['notice_event'] == 1) { if ($this->set['notice_event'] == 1) {
NoticeLog::create([ NoticeLog::create([
@ -332,11 +320,21 @@ class TeamReturnService
return; return;
} }
if ($last_agent['has_one_level']['id'] != $agent['has_one_level']['id']){
\Log::debug('经销商平级奖限制,下级经销商等级与当前会员不相等',$this->order->id.'_'.$this->order_goods->id.'_'.$agent['uid']); if($this->dividendType == 1){
return; if ($last_agent['cultural_level']['id'] != $agent['cultural_level']['id']){
\Log::debug('经销商平级奖限制,下级经销商等级与当前会员不相等',$this->order->id.'_'.$this->order_goods->id.'_'.$agent['uid']);
return;
}
}else{
if ($last_agent['has_one_level']['id'] != $agent['has_one_level']['id']){
\Log::debug('经销商平级奖限制,下级经销商等级与当前会员不相等',$this->order->id.'_'.$this->order_goods->id.'_'.$agent['uid']);
return;
}
} }
$yz_member = MemberShopInfo::where('member_id',$last_agent['uid'])->first(); $yz_member = MemberShopInfo::where('member_id',$last_agent['uid'])->first();
if (!$yz_member || $yz_member->parent_id != $agent['uid']){ if (!$yz_member || $yz_member->parent_id != $agent['uid']){
\Log::debug('经销商平级奖限制,下级经销商非当前会员直属下级',$this->order->id.'_'.$this->order_goods->id.'_'.$agent['uid']); \Log::debug('经销商平级奖限制,下级经销商非当前会员直属下级',$this->order->id.'_'.$this->order_goods->id.'_'.$agent['uid']);
@ -350,11 +348,11 @@ class TeamReturnService
$member = Member::getMemberByUid($agent['uid'])->with('hasOneFans')->first(); $member = Member::getMemberByUid($agent['uid'])->with('hasOneFans')->first();
$notice = [ $notice = [
'lower_level_name' => $this->buyMember->nickname, 'lower_level_name' => $this->buyMember->nickname,
'order_amount' => $this->order->price, 'order_amount' => $this->order->price,
'amount' => $dividendData['amount'], 'amount' => $dividendData['amount'],
'dividendRate' => $agent['has_one_level']['award_ratio'], 'dividendRate' => $this->dividendType == 1 ? $agent['cultural_level']['award_ratio'] : $agent['has_one_level']['award_ratio'],
'dividend_amount' => $dividendData['dividend_amount'], 'dividend_amount' => $dividendData['dividend_amount'],
'dividend_id' => $dividend_model ? $dividend_model->id : 0, 'dividend_id' => $dividend_model ? $dividend_model->id : 0,
]; ];
if ($this->set['notice_event'] == 1) { if ($this->set['notice_event'] == 1) {
NoticeLog::create([ NoticeLog::create([
@ -391,20 +389,37 @@ class TeamReturnService
//计算总获得分红 //计算总获得分红
$dividendData['amount'] = $this->order_goods->total * $dividend_extra['level_' . $agent['level']]; $dividendData['amount'] = $this->order_goods->total * $dividend_extra['level_' . $agent['level']];
$agent['has_one_level']['dividend_ratio'] = 1; if($this->dividendType == 1) {
$agent['cultural_level']['dividend_ratio'] = 1;
if (!isset($this->extraHierarchy['first_weight'])) { $agent['cultural_level']['dividend_ratio'] = 1;
$this->extraHierarchy['first_weight'] = $agent['has_one_level']['level_weight']; if (!isset($this->extraHierarchy['first_weight'])) {
} $this->extraHierarchy['first_weight'] = $agent['cultural_level']['level_weight'];
if (!empty($this->extraHierarchy['weight'])) {
if ($agent['has_one_level']['level_weight'] <= $this->extraHierarchy['weight']) {
return;
} }
if (!empty($this->extraHierarchy['weight'])) {
if ($agent['cultural_level']['level_weight'] <= $this->extraHierarchy['weight']) {
return;
}
}
$this->extraHierarchy['weight'] = $agent['cultural_level']['level_weight'];
//查看等级是否小于或等于第一级
$this->extraHierarchy['finish_weight'] = $agent['cultural_level']['level_weight'] - $this->extraHierarchy['first_weight'];
}
else {
$agent['has_one_level']['dividend_ratio'] = 1;
if (!isset($this->extraHierarchy['first_weight'])) {
$this->extraHierarchy['first_weight'] = $agent['has_one_level']['level_weight'];
}
if (!empty($this->extraHierarchy['weight'])) {
if ($agent['has_one_level']['level_weight'] <= $this->extraHierarchy['weight']) {
return;
}
}
$this->extraHierarchy['weight'] = $agent['has_one_level']['level_weight'];
//查看等级是否小于或等于第一级
$this->extraHierarchy['finish_weight'] = $agent['has_one_level']['level_weight'] - $this->extraHierarchy['first_weight'];
} }
$this->extraHierarchy['weight'] = $agent['has_one_level']['level_weight'];
//查看等级是否小于或等于第一级
$this->extraHierarchy['finish_weight'] = $agent['has_one_level']['level_weight'] - $this->extraHierarchy['first_weight'];
if ($this->extraHierarchy['finish_weight'] < 0) { if ($this->extraHierarchy['finish_weight'] < 0) {
return; return;
} }
@ -451,41 +466,26 @@ class TeamReturnService
$this->extraCount++; $this->extraCount++;
} }
private function addDividend($agent, $dividendData) private function addDividend($agent, $dividendData){
{
$dividendData += [ $dividendData += [
'uniacid' => $this->order->uniacid, 'uniacid' => $this->order->uniacid,
'member_id' => $agent['uid'], 'member_id' => $agent['uid'],
'order_sn' => $this->order->order_sn, 'order_sn' => $this->order->order_sn,
'order_amount' => $this->order->price, 'order_amount' => $this->order->price,
'agent_level' => $agent['level'], 'agent_level' => $agent['level'],
'status' => 0, 'status' => 0,
'create_month' => date('Y-m'), 'create_month' => date('Y-m'),
'settle_days' => $this->set['settle_days'] ?: 0, 'settle_days' => $this->set['settle_days'] ?: 0,
'culate_method'=>intval($this->set['culate_method']) ? : 0, 'culate_method' => intval($this->set['culate_method']) ?: 0,
'created_at' => time() 'created_at' => time(),
]; ];
// 判断:如果当前是 文创津贴(补贴) 修改对应的类型值
if($this->dividendType == 1) $dividendData['type'] = $dividendData['type'] == 1 ? 5 : 4;
//如果存在对应记录 todo 由于商品不同规格的数据相同会重复
// $exist = TeamDividendModel::where([
// 'member_id' => $agent['uid'],
// 'agent_level' => $agent['level'],
// 'order_sn' => $dividendData['order_sn'],
// 'type' => $dividendData['type'],
// ])->count();
// if ($exist) {
// \Log::info("订单{$dividendData['order_sn']}:", "经销商{$agent['uid']}的{$dividendData['type']}分红记录已存在");
// return;
// }
//取小数点后两位数四舍五入 例如设置独立金额0.003元 //取小数点后两位数四舍五入 例如设置独立金额0.003元
if (round($dividendData['dividend_amount'], 2) <= 0) { if (round($dividendData['dividend_amount'], 2) <= 0) return;
return; if (empty($dividendData['lower_level_rate'])) $dividendData['lower_level_rate'] = 0;
}
if (empty($dividendData['lower_level_rate'])){
$dividendData['lower_level_rate'] = 0;
}
//todo 防止多队列支付先走 //todo 防止多队列支付先走
$order = \app\common\models\Order::find($this->order->id); $order = \app\common\models\Order::find($this->order->id);

View File

@ -28,29 +28,31 @@ class AgentsService
{ {
return $this->agents; return $this->agents;
} }
private function _init(){
private function _init()
{
// 开启内购 // 开启内购
//if ($this->setting['buy_self'] == 1) { //if ($this->setting['buy_self'] == 1) {
$teamDividend = TeamDividendAgencyModel::select(['uid', 'level']) $teamDividend = TeamDividendAgencyModel::select(['uid','level','cultural_level_id'])
->where('uid', $this->uid) ->where('uid',$this->uid)
->first(); ->first();
$this->agents[] = [ $this->agents[] = [
'uid' => $this->uid, 'uid' => $this->uid,
'teamDividend' => $teamDividend 'teamDividend' => $teamDividend
]; ];
//} //}
// 上级 // 上级
$agents = MemberParent::with(['hasOneTeamDividendAgency']) $agents = MemberParent::with([
->where('member_id', $this->uid) 'hasOneTeamDividendAgency' => function($query){
->orderBy('level', 'asc') $query->select(['uid','level','cultural_level_id']);
}
])
->where('member_id',$this->uid)
->orderBy('level','asc')
->get(); ->get();
if (!$agents->isEmpty()) { if(!$agents->isEmpty()){
foreach ($agents as $agent) { foreach($agents as $agent){
$this->agents[] = [ $this->agents[] = [
'uid' => $agent->parent_id, 'uid' => $agent->parent_id,
'teamDividend' => $agent->hasOneTeamDividendAgency 'teamDividend' => $agent->hasOneTeamDividendAgency
]; ];
} }
} }

View File

@ -65,6 +65,8 @@
<option value='1' @if($search['type'] == '1') selected @endif>平级奖励</option> <option value='1' @if($search['type'] == '1') selected @endif>平级奖励</option>
<option value='2' @if($search['type'] == '2') selected @endif>感恩奖励</option> <option value='2' @if($search['type'] == '2') selected @endif>感恩奖励</option>
<option value='3' @if($search['type'] == '3') selected @endif>额外分红</option> <option value='3' @if($search['type'] == '3') selected @endif>额外分红</option>
<option value='4' @if($search['type'] == '4') selected @endif>津贴(补贴)</option>
<option value='5' @if($search['type'] == '5') selected @endif>津贴(补贴)平级奖</option>
</select> </select>
</div> </div>

View File

@ -82,6 +82,20 @@
<span class="help-block">等级权重,数字越大级别越高。</span> <span class="help-block">等级权重,数字越大级别越高。</span>
</div> </div>
</div> </div>
<div class="form-group">
<label class="col-xs-12 col-sm-3 col-md-2 control-label">等级类型</label>
<div class="col-sm-6 col-xs-6">
<div class="input-group">
<label class="radio-inline">
<input type="radio" name="dividend[level_type]" value="0" @if (empty($dividend->level_type)) checked @endif> 普通等级
</label>
<label class="radio-inline">
<input type="radio" name="dividend[level_type]" value="1" @if (1 == $dividend->level_type) checked @endif style="margin: 4px 0 0; position:inherit"> 文创等级
</label>
</div>
<span class="help-block">用户升级到普通等级会改变经销商等级不会改变文创等级,升级到文创等级则不会改变经销商等级只会改变文创等级</span>
</div>
</div>
<div class="form-group"> <div class="form-group">
<label class="col-xs-12 col-sm-3 col-md-2 control-label"><span <label class="col-xs-12 col-sm-3 col-md-2 control-label"><span
style="color:red">*</span> 等级名称</label> style="color:red">*</span> 等级名称</label>
@ -90,6 +104,14 @@
value="{{$dividend->level_name}}"/> value="{{$dividend->level_name}}"/>
</div> </div>
</div> </div>
<div class="form-group">
<label class="col-xs-12 col-sm-3 col-md-2 control-label">
<span style="color:red">*</span> 文创补贴名称
</label>
<div class="col-sm-6 col-xs-6">
<input type='text' name='dividend[cultural_level_name]' class="form-control" value="{{$dividend->cultural_level_name}}"/>
</div>
</div>
<div class="form-group"> <div class="form-group">
<label class="col-xs-12 col-sm-3 col-md-2 control-label">身份类型</label> <label class="col-xs-12 col-sm-3 col-md-2 control-label">身份类型</label>
<div class="col-sm-6 col-xs-6"> <div class="col-sm-6 col-xs-6">
@ -141,7 +163,9 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-xs-12 col-sm-3 col-md-2 control-label">提成比例</label> <label class="col-xs-12 col-sm-3 col-md-2 control-label">
<span id="dividend_ratio_text">{{ $dividend->level_type == 1 ? '补贴(津贴)比例' : '提成比例' }}</span>
</label>
<div class="col-sm-6 col-xs-6"> <div class="col-sm-6 col-xs-6">
<div class='input-group'> <div class='input-group'>
<input type='text' name='dividend[dividend_ratio]' <input type='text' name='dividend[dividend_ratio]'
@ -1226,6 +1250,17 @@
}) })
}) })
// 等级类型改变
$(document).on('change',"[name='dividend[level_type]']",function(){
let val = $(this).val();
val = parseInt(val) && !isNaN(parseInt(val)) ? parseInt(val) : parseInt(0);
// 0=普通等级 1=文创等级
$("#dividend_ratio_text").html(val === parseInt(1) ? '补贴(津贴)比例' : '提成比例');
});
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
let ladder = JSON.parse(`{!! $wv['ladder'] ?? json_encode([]) !!}`) || {}; let ladder = JSON.parse(`{!! $wv['ladder'] ?? json_encode([]) !!}`) || {};

View File

@ -1,6 +1,11 @@
@extends('layouts.base') @extends('layouts.base')
@section('title', trans('经销商等级')) @section('title', trans('经销商等级'))
@section('content') @section('content')
<style>
.panel-body .label{
font-size: 14px!important;
}
</style>
<div class="w1200 "> <div class="w1200 ">
<script type="text/javascript" src="./resource/js/lib/jquery-ui-1.10.3.min.js"></script> <script type="text/javascript" src="./resource/js/lib/jquery-ui-1.10.3.min.js"></script>
<link rel="stylesheet" type="text/css" href="{{static_url('css/font-awesome.min.css')}}"> <link rel="stylesheet" type="text/css" href="{{static_url('css/font-awesome.min.css')}}">
@ -19,29 +24,49 @@
<table class="table table-hover"> <table class="table table-hover">
<thead class="navbar-inner"> <thead class="navbar-inner">
<tr> <tr>
<th width="6%">等级权重</th> <th style="width: 100px;text-align: center;">等级权重</th>
<th width="16%">等级名称</th> <th style="text-align: center;">等级名称</th>
<th width="16%">提成比例</th> <th style="text-align: center;">等级类型</th>
<th width="15%">激活码发放</th> <th style="width: 150px;text-align: center;">提成比例(%)</th>
<th width="15%">平级奖励层级</th> <th style="width: 150px;text-align: center;">补贴(津贴)比例(%)</th>
<th width="16%">平级奖励比例</th> {{--<th style="width: 245px;text-align: center;">激活码发放</th>--}}
<th width="16%">操作</th> <th style="width: 150px;text-align: center;">平级奖励层级</th>
<th style="width: 150px;text-align: center;">平级奖励比例</th>
<th style="text-align: center;">操作</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach($list['data'] as $item) @foreach($list['data'] as $item)
<tr> <tr>
<td> <td style="text-align: center;">
<input type="text" class="form-control" <input type="text" class="form-control" name="display_order[{{$item['id']}}]" value="{{$item['level_weight']}}">
name="display_order[{{$item['id']}}]"
value="{{$item['level_weight']}}">
</td> </td>
<td>{{$item['level_name']}}</td> <td style="text-align: center;">{{$item['level_name']}}</td>
<td>{{$item['dividend_ratio']}}</td> <td style="text-align: center;">
<td>{{array_sum(unserialize($item['code_num']))}}</td> @if($item['level_type'] == 1)
<td>{{$item['award_hierarchy']}}</td> <span class="label label-warning">文创等级</span>
<td>{{$item['award_ratio']}}</td> @else
<td> <span class="label label-default">普通等级</span>
@endif
</td>
<td style="text-align: center;">
@if($item['level_type'] == 1)
-
@else
{{$item['dividend_ratio']}}
@endif
</td>
<td style="text-align: center;">
@if($item['level_type'] == 1)
{{$item['dividend_ratio']}}
@else
-
@endif
</td>
{{--<td style="text-align: center;">{{array_sum(unserialize($item['code_num']))}}</td>--}}
<td style="text-align: center;">{{$item['award_hierarchy']}}</td>
<td style="text-align: center;">{{$item['award_ratio']}}</td>
<td style="text-align: center;">
<a class="btn btn-default" href="{!! yzWebUrl('plugin.team-dividend.admin.team-dividend-level-set.edit', ['id'=>$item['id']]) !!}">编辑</a> <a class="btn btn-default" href="{!! yzWebUrl('plugin.team-dividend.admin.team-dividend-level-set.edit', ['id'=>$item['id']]) !!}">编辑</a>
<a class="btn btn-default" href="{!! yzWebUrl('plugin.team-dividend.admin.team-dividend-level-set.deleted', ['id'=>$item['id']]) !!}" onclick="return confirm('{{$delete_msg}}');return false;">删除</a> <a class="btn btn-default" href="{!! yzWebUrl('plugin.team-dividend.admin.team-dividend-level-set.deleted', ['id'=>$item['id']]) !!}" onclick="return confirm('{{$delete_msg}}');return false;">删除</a>
</td> </td>

View File

@ -14,6 +14,9 @@
padding-bottom: 80px; padding-bottom: 80px;
overflow: hidden !important; overflow: hidden !important;
} }
.panel-body .label{
font-size: 13px!important;
}
</style> </style>
<div class="w1200 "> <div class="w1200 ">
<div class=" rightlist "> <div class=" rightlist ">
@ -107,15 +110,22 @@
<table class="table table-hover" > <table class="table table-hover" >
<thead class="navbar-inner"> <thead class="navbar-inner">
<tr> <tr>
<th style="width: 50px;">ID</th> <th style="width: 80px;text-align: center;">
<th style="width: 50px;">UID</th> <span class="label label-default">ID</span>
<th style="width: 160px;">成为经销商时间<br>升级时间</th> <br>
<span class="label label-warning">UID</span>
</th>
<th style="width: 160px;">成为经销商时间<br>普通等级升级时间<br>文创等级升级时间</th>
<th style="width: 120px;">经销商</th> <th style="width: 120px;">经销商</th>
<th style="width: 120px;">等级</th> <th style="width: 120px;">等级</th>
<th style="width: 100px;">排名</th> <th style="width: 100px;">排名</th>
<th style="width: 150px;">名额(剩余/已使用)</th> <th style="width: 150px;">名额(剩余/已使用)</th>
<th width="8.5%">直属总经销商人数</th> <th width="8.5%">直属总经销商人数</th>
<th width="8.5%">经销商比例<br>累计提成</th> <th width="8.5%">
提成比例<br>累计提成
<hr style="margin: 5px 0!important;"/>
补贴(津贴)比例<br>累计补贴(津贴)
</th>
<th width="8.5%">已结算提成<br>未结算提成</th> <th width="8.5%">已结算提成<br>未结算提成</th>
<th width="13%">黑名单<br>变动时间</th> <th width="13%">黑名单<br>变动时间</th>
<th width="8.5%">团队业绩<br>团队商品销量</th> <th width="8.5%">团队业绩<br>团队商品销量</th>
@ -125,67 +135,81 @@
<tbody> <tbody>
@foreach($list['data'] as $item) @foreach($list['data'] as $item)
<tr> <tr>
<td>{{$item['id']}}</td> <td style="text-align: center;">
<td>{{$item['has_one_member']['uid']}}</td> <span class="label label-default">{{$item['id']}}</span>
<br>
<span class="label label-warning">{{$item['has_one_member']['uid']}}</span>
</td>
<td> <td>
{{$item['created_at']}} {{$item['created_at']}}
<br> <br>
{{$item['upgrade_at'] ? date('Y-m-d H:i:s',$item['upgrade_at']) : '/'}} {{$item['upgrade_at'] ? date('Y-m-d H:i:s',$item['upgrade_at']) : '/'}}
<br>
{{$item['cultural_upgrade_at'] ? date('Y-m-d H:i:s',$item['cultural_upgrade_at']) : '/'}}
</td> </td>
@if ($item['has_one_member'])
<td> <td>
<a href="{!! yzWebUrl('member.member.detail', ['id'=>$item['has_one_member']['uid']]) !!}"><img src="{{$item['has_one_member']['avatar']}}" style="width:30px;height:30px;padding:1px;border:1px solid #ccc"><BR>{{$item['has_one_member']['nickname']}}</a> @if ($item['has_one_member'])
</td> <a href="{!! yzWebUrl('member.member.detail', ['id'=>$item['has_one_member']['uid']]) !!}">
@else <img src="{{$item['has_one_member']['avatar']}}" style="width:30px;height:30px;padding:1px;border:1px solid #ccc">
<td style="height: 59px"> <br>
{{$item['has_one_member']['nickname']}}
</a>
@else
未更新 未更新
@endif
</td> </td>
@endif <td title="{{$item['has_one_level']['level_name']}}" class='tdedit'>
<td title="{{$item['has_one_level']['level_name']}}" class='tdedit' width="26%">
<span class=' fa-edit-item' style='cursor:pointer'> <span class=' fa-edit-item' style='cursor:pointer'>
<span class="title">{{$item['has_one_level']['level_name']}}</span> <span class="title">{{$item['has_one_level']['level_name'] ?? '/'}}</span>
<i class='fa fa-pencil' style="display:none"></i> <i class='fa fa-pencil' style="display:none"></i>
</span> </span>
<div class="input-group level" style="display:none"> <div class="input-group level" style="display:none">
<select class="form-control tpl-agent-level" name="level_id" data-agencyid="{{$item['id']}}"> <select class="form-control tpl-agent-level" name="level_id" data-agencyid="{{$item['id']}}">
<option>请选择等级</option> <option>请选择等级</option>
@foreach($level as $value) @foreach($level as $value)
<option value="{{$value->id}}" @if($value->level_type == 0)
@if($item['level']==$value->id) <option value="{{$value->id}}" @if($item['level']==$value->id) selected @endif>{{$value->level_name}}</option>
selected @endif
@endif @endforeach
>{{$value->level_name}}</option> </select>
</div>
<br />
<span class=' fa-edit-item' style='cursor:pointer'>
<span class="title">{{$item['cultural_level']['level_name'] ?? '/'}}</span>
<i class='fa fa-pencil' style="display:none"></i>
</span>
<div class="input-group level" style="display:none">
<select class="form-control tpl-agent-level" name="level_id" data-agencyid="{{$item['id']}}">
<option>请选择等级</option>
@foreach($level as $value)
@if($value->level_type == 1)
<option value="{{$value->id}}" @if($item['cultural_level_id']==$value->id) selected @endif>{{$value->level_name}}</option>
@endif
@endforeach @endforeach
</select> </select>
</div> </div>
</td> </td>
<td> <td>
@foreach($item['rank_list'] as $rankItem) @foreach($item['rank_list'] as $rankItem)
<p>{{$rankItem['level_name']}}{{$rankItem['ranking']}}</p> <p>{{$rankItem['level_name']}}{{$rankItem['ranking']}}</p>
@endforeach @endforeach
</td> </td>
<td>{{$item['surplus_quota']}} / {{$item['use_quota']}}</td>
<td>
{{$item['surplus_quota']}} / {{$item['use_quota']}}
</td>
<td> <td>
{{$item['total'] ?? 0}} {{$item['total'] ?? 0}}
<a href="{{yzWebUrl('plugin.team-dividend.admin.team-agency',['uid'=>$item['uid']])}}"> <a href="{{yzWebUrl('plugin.team-dividend.admin.team-agency',['uid'=>$item['uid']])}}">
查看 查看
</a> </a>
</td> </td>
<td> <td>
{{$item['has_one_level']['dividend_ratio']}}% {{$item['has_one_level']['dividend_ratio']}}%
<br> <br>
{{$item['has_many_team_dividend'][2]['total_amount'] + $item['has_many_team_dividend'][1]['total_amount'] + $item['has_many_team_dividend'][0]['total_amount']}} {{$item['has_many_team_dividend'][2]['total_amount'] + $item['has_many_team_dividend'][1]['total_amount'] + $item['has_many_team_dividend'][0]['total_amount']}}
<hr style="margin: 5px 0!important;"/>
{{$item['cultural_level']['dividend_ratio'] ?? 0}}%
<br>
0
</td> </td>
{{--<td>{{$item['dividend_final']}}</td>--}}
{{--<td>{{$item['dividend_open']}}</td>--}}
{{--<td>{{$item['dividend_total']}}</td>--}}
<td> <td>
@if($item['has_many_team_dividend'][0]['status'] == 1) @if($item['has_many_team_dividend'][0]['status'] == 1)
{{$item['has_many_team_dividend'][0]['total_amount']}} {{$item['has_many_team_dividend'][0]['total_amount']}}
@ -197,15 +221,15 @@
0 0
@endif @endif
<br> <br>
@if($item['has_many_team_dividend'][0]['status'] === 0) @if($item['has_many_team_dividend'][0]['status'] === 0)
{{$item['has_many_team_dividend'][0]['total_amount']}} {{$item['has_many_team_dividend'][0]['total_amount']}}
@elseif($item['has_many_team_dividend'][1]['status'] === 0) @elseif($item['has_many_team_dividend'][1]['status'] === 0)
{{$item['has_many_team_dividend'][1]['total_amount']}} {{$item['has_many_team_dividend'][1]['total_amount']}}
@elseif($item['has_many_team_dividend'][2]['status'] === 0) @elseif($item['has_many_team_dividend'][2]['status'] === 0)
{{$item['has_many_team_dividend'][2]['total_amount']}} {{$item['has_many_team_dividend'][2]['total_amount']}}
@else @else
0 0
@endif @endif
</td> </td>
<td> <td>
@if($item['is_black']) @if($item['is_black'])