| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- <?php
- namespace addons\LuckyGroup\common\logic\reward;
- use addons\LuckyGroup\common\enums\LuckyGroupEnum;
- use addons\LuckyGroup\common\models\LuckyGroupBonusLog;
- use addons\LuckyGroup\common\models\LuckyGroupBonusPool;
- use addons\LuckyGroup\common\models\LuckyGroupFrozenLog;
- use addons\LuckyGroup\common\models\LuckyGroupOrder;
- use addons\LuckyGroup\common\models\LuckyGroupUser;
- use common\enums\UserWalletEnum;
- use common\helpers\DateHelper;
- use common\models\common\CapitalLog;
- use common\models\goods\Goods;
- use common\models\mall\MallAddons;
- use services\common\UserWalletService;
- use yii\db\Exception;
- class BonusPoolLogic
- {
- public static function bonusPoolDividendLog($mall_id)
- {
- if (!MallAddons::isInstall($mall_id, LuckyGroupEnum::ADDONS_NAME)) return true;
- $bonus_pool_conf = \Yii::$app->services->setting->addons->get($mall_id, LuckyGroupEnum::ADDONS_NAME, 'bonus_pool');
- $everyday_out_rate = $bonus_pool_conf['everyday_out_rate'] ?? 0; //奖金池分红比例
- $pool_win_num = $bonus_pool_conf['cond_complete_num'] ?? 0; //奖金池分红拼中次数条件
- $settle_type = $bonus_pool_conf['settle_type']; //结算周期 1 每天 2 每周一 3 每月一号
- switch ($settle_type) {
- case 1:
- $date = DateHelper::today();
- break;
- case 2:
- //今天不是周一,暂不能进行分红哦
- if (date("w") != 1) {
- return true;
- }
- $date = DateHelper::thisWeek();
- break;
- case 3:
- // 今天不是一号,暂不能进行分红哦
- if (date("d") != 1) {
- return true;
- }
- $date = DateHelper::thisMonth();
- break;
- }
- $time = time();
- $start_time = $date['start'] ?? 0;
- $end_time = $date['end'] ?? 0;
- //todo 加锁
- $t = \Yii::$app->db->beginTransaction();
- try {
- $wallet_type = 'commission';
- CapitalLog::$capitalType = "{$wallet_type}";
- $count = CapitalLog::find()->where(['mall_id' => $mall_id, 'from_type' => LuckyGroupEnum::ADDONS_NAME, 'capital_type' => UserWalletEnum::POOL_REWARD])
- ->andWhere(['>=', 'created_at', $start_time])->andWhere(['<=', 'created_at', $end_time])->count();
- if ($count != 0) throw new Exception('商城' . $mall_id . '今天已结算');
- $lucky_group_bonus_pool = LuckyGroupBonusPool::getOne([['mall_id' => $mall_id]], false);
- if (empty($lucky_group_bonus_pool)) throw new Exception("商城:{$mall_id}:暂无奖金池金额");
- $bonus_pool_sum = $lucky_group_bonus_pool['money'] ?? 0; //奖金池金额
- $pool_money = bcdiv($bonus_pool_sum * $everyday_out_rate,100,2);//本次拿出分红的金额
- var_dump("商城id:{$mall_id},本次拿出分红的金额" . $pool_money);
- $res = self::turnOffPriority($mall_id, $bonus_pool_conf, $pool_win_num, $pool_money, $lucky_group_bonus_pool, $wallet_type);
- if ($res == false) {
- \Yii::error("商城:{$mall_id}:奖金发放错误");
- var_dump("商城:{$mall_id}:奖金发放错误");
- throw new Exception("商城:{$mall_id}:奖金发放错误");
- }
- $t->commit();
- return true;
- } catch (\Exception $e) {
- var_dump($e->getMessage());
- $t->rollBack();
- return false;
- }
- }
- //默认发放规则
- public static function turnOffPriority($mall_id, $bonus_pool_conf, $pool_win_num, $money, $lucky_group_bonus_pool, $wallet_type)
- {
- try {
- $total_send_money = 0;
- $frozen_log_list = LuckyGroupFrozenLog::lists(['where' => [
- ['<>', 'is_send', 1],
- ['=', 'prize_type', UserWalletEnum::POOL_REWARD],
- ['=', 'mall_id', $mall_id],
- ],
- 'order' => 'created_at asc'
- ], false);
- $user_id_arr = array_column($frozen_log_list, 'user_id');
- $group_user_list = LuckyGroupUser::lists(['where' => [['user_id' => $user_id_arr], ['>=', 'win_num', $pool_win_num]], 'index' => 'user_id'], false);
- $new_frozen_log_list = [];
- foreach ($frozen_log_list as $k => $item) {
- if (!isset($group_user_list[$item['user_id']])){
- unset($frozen_log_list[$k]);
- continue;
- }
- $new_frozen_log_list[$item['user_id']][]=$item;
- }
- $user_num = count($group_user_list);
- $apiece_price = !empty($user_num) ? bcdiv($money , $user_num ,2) : $money;
- self::grantReward($new_frozen_log_list, $group_user_list, $apiece_price, $mall_id, $wallet_type, $bonus_pool_conf, $money,$lucky_group_bonus_pool, $total_send_money, $user_num);
- $lucky_group_bonus_pool->money += -$total_send_money;
- $res = $lucky_group_bonus_pool->save();
- if ($res === false) throw new \Exception($lucky_group_bonus_pool::getErrorMessage());
- return true;
- } catch (Exception $e) {
- echo '奖金池分红发放失败' . PHP_EOL . $e->getFile() . '(' . $e->getLine() . ')' . PHP_EOL . "message:" . $e->getMessage();
- \Yii::error('奖金池分红发放失败' . PHP_EOL . $e->getFile() . '(' . $e->getLine() . ')' . PHP_EOL . "message:" . $e->getMessage());
- return false;
- }
- }
- //发放奖金池冻结佣金
- public static function grantReward($new_frozen_log_list, $group_user_list, $apiece_price, $mall_id, $wallet_type, $bonus_pool_conf, $money,$lucky_group_bonus_pool, &$total_send_money, $user_num = 0)
- {
- $params = [
- 'mall_id'=>$mall_id,
- 'user_num'=>$user_num,
- 'money'=>$money,
- 'user_price'=>$apiece_price,
- ];
- $bonus_log_model = LuckyGroupBonusLog::setData($params);
- if ($bonus_log_model == false) throw new Exception('添加分红记录失败');
- $bonus_log_id = $bonus_log_model['id'];
- $insert_wallet = [];
- foreach ($new_frozen_log_list as $frozen_log_list){
- $remain_apiece_price = $apiece_price; //平均每人各能分的到钱
- $frozen_log_ids = array_column($frozen_log_list,'source_id');
- $lucky_group_order_list = LuckyGroupOrder::lists(['where'=>[['id'=>$frozen_log_ids]],'select'=>'id,order_no,goods_id,total_goods_price,buy_nums','index'=>'id']);
- $goods_ids = array_column($lucky_group_order_list,'goods_id');
- $goods_list = Goods::lists(['where'=>[['id'=>$goods_ids]],'select'=>'id,goods_name','index'=>'id']);
- foreach ($frozen_log_list as $key => $frozen_log) {
- $frozen_log_money = $frozen_log['money'];
- if ($frozen_log['is_send'] == 2) $frozen_log_money -= $frozen_log['has_money']; // 部分发放,减去上次已经分过的金额
- if ($frozen_log_money <= $remain_apiece_price) {
- //金额够分--修改状态为已发放
- $frozen_log->is_send = 1;
- } else {
- //不够发放全部
- if ($remain_apiece_price > 0) {
- $frozen_log_money = $remain_apiece_price;
- $frozen_log->is_send = 2;
- } else {
- break;
- }
- }
- $has_money = $frozen_log['has_money'] + $frozen_log_money; //已发放金额=之前发放的金额+本次发放的金额
- $frozen_log->has_money = $has_money;
- $frozen_log->settlement_interval = $bonus_pool_conf['settle_type'];
- $frozen_log->bonus_pool_sum = $money;
- $frozen_log->bonus_pool_ratio = $bonus_pool_conf['everyday_out_rate'];
- $frozen_log->bonus_pool_limit = $remain_apiece_price;
- $frozen_log->bonus_log_id = $bonus_log_id;
- $res = $frozen_log->save();
- if (!$res) throw new \Exception($frozen_log->getErrorMessage());
- // 修改用户表佣金值
- $Lucky_group_user = $group_user_list[$frozen_log['user_id']];
- $Lucky_group_user->commission += $frozen_log_money;
- $Lucky_group_user->frozen_commission += -$frozen_log_money;
- if (!$Lucky_group_user->save()) throw new \Exception($Lucky_group_user->getErrorMessage());
- if($frozen_log_money>0){
- $order_no = $goods_name ='';
- $contributor_id = $contributor_money = 0;
- if(!empty($lucky_group_order_list[$frozen_log['source_id']])){
- $order_no = $lucky_group_order_list[$frozen_log['source_id']]['order_no'];
- $goods_id = $lucky_group_order_list[$frozen_log['source_id']]['goods_id'];
- $contributor_id = $lucky_group_order_list[$frozen_log['source_id']]['user_id'];
- if(!empty($lucky_group_order_list[$frozen_log['source_id']]['buy_nums'])){
- $contributor_money = intval($lucky_group_order_list[$frozen_log['source_id']]['total_goods_price']/$lucky_group_order_list[$frozen_log['source_id']]['buy_nums']*100)/100;
- }else{
- $contributor_money =$lucky_group_order_list[$frozen_log['source_id']]['total_goods_price'];
- }
- if(!empty($goods_list[$goods_id])){
- $goods_name = $goods_list[$order_no]['goods_name'];
- }
- }
- $insert_wallet [] = [
- 'mall_id' => $mall_id, 'user_id' => $frozen_log['user_id'],
- 'is_frozen' => false, 'wallet_type' => $wallet_type, 'money' => $frozen_log_money,
- 'desc' => '幸运拼团,奖金池分红,佣金(' . $frozen_log_money . '元)发放',
- 'source_table' => LuckyGroupFrozenLog::tableName(),
- 'source_table_id' => $frozen_log['id'],
- 'from_type' => LuckyGroupEnum::ADDONS_NAME,
- 'capital_type' => UserWalletEnum::POOL_REWARD,
- 'order_no' =>$order_no,
- 'contributor_name' =>$goods_name,
- 'contributor_id' =>$contributor_id,
- 'contributor_money' =>$contributor_money,
- ];
- }
- $remain_apiece_price -= $frozen_log_money;
- $total_send_money += $frozen_log_money;
- if ($remain_apiece_price <= 0) break;
- }
- }
- if (!empty($insert_wallet)) {
- $res = UserWalletService::batchHandleByQueue($insert_wallet);
- if ($res == false) throw new Exception('发送资金队列失败');
- }
- $bonus_log_model->after_money = $lucky_group_bonus_pool['money'] - $total_send_money;
- $bonus_log_model->save();
- }
- }
|