修改:股东分红 - 由均分修改为根据经销商当前权重值在所有权重值中的比例来计算

This commit is contained in:
wuhui_zzw 2023-09-27 15:05:22 +08:00
parent e5210815ca
commit 4b23b90fe9
2 changed files with 159 additions and 7 deletions

View File

@ -23,6 +23,11 @@ class SetController extends BaseController
public function fix()
{
// 手动触发全网分红处理流程
(new \Yunshop\ShareholderDividend\services\TimedTaskService)->handle();
dd("全网分红处理完成");
$teamLevels = TeamDividendLevelModel::getList()->get();
foreach ($teamLevels as $teamLevel) {
$teamAgents = TeamAgentModel::getTeamAgentByLevelId($teamLevel['id'])->where('uid', 30971);

View File

@ -58,13 +58,14 @@ class TimedTaskService
Setting::$uniqueAccountId = \YunShop::app()->uniacid = $u->uniacid;
$this->set = Setting::get('plugin.shareholder');
$this->setLog = Setting::get('plugin.shareholder_log');
$is_execute = $this->isExecute();
$is_execute = true;//$this->isExecute();
if ($is_execute) {
\Log::info('========股东分红UNIACID:' . $u->uniacid . '执行========');
$this->setLog['current_d'] = date('d');
$this->setLog['current_m'] = date('m');
Setting::set('plugin.shareholder_log', $this->setLog);
$this->shareholderDividend();
// $this->shareholderDividend();
$this->shareholderDividendV2();
} else {
\Log::info('========股东分红UNIACID:' . $u->uniacid . '不满足条件========');
}
@ -151,11 +152,7 @@ class TimedTaskService
return true;
}
/**
* 分红处理
*
* todo 需要进一步优化
*/
//分红处理 2023-9-27 修改使用V2分红金额由均分修改为根据权重值比例分配
private function shareholderDividend()
{
//判断平台是否有开启 股东分红条件
@ -287,6 +284,156 @@ class TimedTaskService
}
}
}
private function shareholderDividendV2(){
//判断平台是否有开启 股东分红条件
$condition_dividend = $this->set['condition_dividend'];//1-开启
$condition_level_dividend = $this->set['condition_level_dividend'];//1-开启
$condition_black_list = BlacklistModel::uniacid()->get();//1-开启
$orderAmount = CycleAmounyService::getCycleAmount($this->set['culate_cycle'], $this->set['culate_method']); // 上一个周期金额
if ($orderAmount <= 0) {
\Log::info('========shareholderDividend():没有返现总金额');
ExceptionLog::create([
'uniacid' => \YunShop::app()->uniacid,
'comment' => '没有返现总金额',
'time' => date('Y-m-d H:i:s', time())
]);
return;
}
$teamLevels = TeamDividendLevelModel::getList()->get(); // 团队等级
$typeName = $this->set['custom_name'] ?: '股东分红';
foreach ($teamLevels as $teamLevel) {
if ($this->set['level_rate']['level_' . $teamLevel['id']]) {
$teamAgents = TeamAgentModel::getTeamAgentByLevelId($teamLevel['id']); // 等级下团队代理
$teamAgentCount = $teamAgents->count(); // 同等级代理人数
$teamAgentsList = $teamAgents->with([
'hasOneMember' => function($query){
$query->select(['uid','weight_value']);
}
])->get();
$rate = $this->set['level_rate']['level_' . $teamLevel['id']]; // 等级分红比例
$lvCountOrderAmount = sprintf("%.2f", $orderAmount / 100 * $rate);// 当前等级共分红金额
$totalWeightValue = sprintf("%.2f", array_sum(array_column(array_column($teamAgentsList->toArray(),'has_one_member'),'weight_value')));
foreach ($teamAgentsList as $item) {
/********* 权重值相关操作 START ***************************************************/
// 获取当前经销商的权重值
$currentWeightValue = (float)$item->hasOneMember->weight_value;
if($currentWeightValue <= 0){
\Log::debug("---- 固定分红 - 当前经销商没有权重值 -----:",['uid'=>$item->uid,'weight_value'=>$currentWeightValue]);
continue;
}
// 存在权重值 查看当前用户比例
$weightValueRate = $currentWeightValue / $totalWeightValue;// 权重值占比率
$amount = sprintf("%.2f", $lvCountOrderAmount * $weightValueRate);// 当前经销商实际可得金额
if($amount <= 0){
\Log::debug("---- 固定分红 - 当前经销商没有分红佣金 -----:",['uid'=>$item->uid,'weightValueRate'=>$weightValueRate,'weight_value'=>$currentWeightValue,'amount'=>$amount]);
continue;
}
/********* 权重值相关操作 END ***************************************************/
//开启了股东分红条件进行验证
if ($condition_dividend) {
$condition_sign = $this->checkConditionDividend($item['uid'], $this->set['consume_amount']);//条件标记
//false
if (!$condition_sign) {
continue;//此用户没有股东分红
}
}
//开启了股东等级分红设置
if ($condition_level_dividend) {
$checkGoodsCondition = $this->checkGoodsConditionDividend($item);
//false
if (!$checkGoodsCondition) {
continue;//此用户没有股东分红
}
}
//有黑名单
if (!$condition_black_list->isEmpty()) {
$checkGoodsCondition = $condition_black_list->where('member_id',$item['uid'])->first();
//false
if ($checkGoodsCondition) {
continue;//此用户没有股东分红
}
}
$check_amount = $amount;
if ($this->set['level_capping']['level_' . $teamLevel['id']] > 0 && $this->set['capping'] == 1) {
//验证数据
$check_amount = $this->checkCopping($this->set, $teamLevel, $item['uid'], $amount);
if ($check_amount <= 0) {
\Log::info("股东分红封顶", [$item['uid'], $amount, $this->set]);
ExceptionLog::create([
'uniacid' => \YunShop::app()->uniacid,
'comment' => '会员' . $item['uid'] . '已经达到封顶金额',
'time' => date('Y-m-d H:i:s', time())
]);
continue;
}
}
// 股东分红数据
$shareData = [
'uniacid' => \YunShop::app()->uniacid,
'member_id' => $item['uid'],
'order_amount' => $orderAmount,
'rate' => $rate,
'team_level' => $teamLevel['id'],
'team_level_name' => $teamLevel['level_name'],
'level_num' => $teamAgentCount,
'amount' => $check_amount,
'created_at' => time(),
'updated_at' => time(),
];
$shareholderDividendModel = new ShareholderDividendModel();
$shareholderDividendModel->fill($shareData);
/**
* 股东分红申请事件,《股东分红额度》插件验证数据,额度不足时,修改分红金额
*
* todo 有改变模型数据,不应该用事件(加速开发速度,暂时用事件处理)
*/
event(new ShareholderDividendApplyingEvent($shareholderDividendModel));
$shareholderDividendModel->save();
/**
* 股东分红申请后事件,《股东分红额度》根据分红额度扣除'会员分红额度'
*/
event(new ShareholderDividendAppliedEvent($shareholderDividendModel));
$incomeData = [
'uniacid' => $shareData['uniacid'],
'member_id' => $shareData['member_id'],
'incometable_type' => ShareholderDividendModel::class,
'dividend_code' => IncomeService::SHAREHOLDER_DIVIDEND,
'dividend_table_id' => $shareholderDividendModel->id,
'type_name' => $typeName,
'amount' => $shareData['amount'],
'status' => 0,
'pay_status' => 0,
'create_month' => date('Y-m'),
'created_at' => time()
];
$this->addIncome($incomeData);
// $this->dispatch((new addShareholderDividendJob($shareData))); // 添加分红数据
$member = Member::getMemberByUid($item->uid)->with('hasOneFans')->first();
MessageService::shareholderDividend($shareData, $member, \YunShop::app()->uniacid); // 发送分红通知
if (app('plugins')->isEnabled('instation-message')) {
//开启了站内消息插件
event(new \Yunshop\InstationMessage\event\ShareholderSettlementEvent([
'changeTime' => date('Y-m-d H:i:s', time()),
'order_amount' => $orderAmount,
'dividend_amount' => $shareData['amount'],
'member_id' => $shareData['member_id'],
'uniacid' => $shareData['uniacid']
]));
}
}
}
}
}
/**