From 4b23b90fe932571d2b7436a843d2663062fa5f62 Mon Sep 17 00:00:00 2001 From: wuhui_zzw <1760308791@qq.com> Date: Wed, 27 Sep 2023 15:05:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E8=82=A1=E4=B8=9C?= =?UTF-8?q?=E5=88=86=E7=BA=A2=20-=20=E7=94=B1=E5=9D=87=E5=88=86=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E6=A0=B9=E6=8D=AE=E7=BB=8F=E9=94=80=E5=95=86?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E6=9D=83=E9=87=8D=E5=80=BC=E5=9C=A8=E6=89=80?= =?UTF-8?q?=E6=9C=89=E6=9D=83=E9=87=8D=E5=80=BC=E4=B8=AD=E7=9A=84=E6=AF=94?= =?UTF-8?q?=E4=BE=8B=E6=9D=A5=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/admin/SetController.php | 5 + .../src/services/TimedTaskService.php | 161 +++++++++++++++++- 2 files changed, 159 insertions(+), 7 deletions(-) diff --git a/plugins/shareholder-dividend/src/admin/SetController.php b/plugins/shareholder-dividend/src/admin/SetController.php index 5276c57c..0a9fc208 100644 --- a/plugins/shareholder-dividend/src/admin/SetController.php +++ b/plugins/shareholder-dividend/src/admin/SetController.php @@ -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); diff --git a/plugins/shareholder-dividend/src/services/TimedTaskService.php b/plugins/shareholder-dividend/src/services/TimedTaskService.php index 49ae8778..eac73f2f 100644 --- a/plugins/shareholder-dividend/src/services/TimedTaskService.php +++ b/plugins/shareholder-dividend/src/services/TimedTaskService.php @@ -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'] + ])); + } + } + } + } + } + + + /**