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(); } }