168 lines
5.1 KiB
PHP
168 lines
5.1 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\AccountLog;
|
|
use App\Setting;
|
|
use App\Users;
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Support\Facades\DB;
|
|
class BonusAlgorithm extends Command
|
|
{
|
|
protected $signature = "bonus_algorithm";
|
|
protected $description = "奖金算法";
|
|
protected $user_bonus = array();
|
|
protected $ecology_bonus = array();
|
|
public function handle()
|
|
{
|
|
$user_bonus = Setting::getValueByKey("user_bonus");
|
|
$ecology_bonus = Setting::getValueByKey("ecology_bonus");
|
|
if (empty($user_bonus) || empty($ecology_bonus)) {
|
|
$this->comment("后台奖金设置错误");
|
|
exit;
|
|
}
|
|
$this->user_bonus = @json_decode($user_bonus, true);
|
|
$this->ecology_bonus = @json_decode($ecology_bonus, true);
|
|
$users = Users::get();
|
|
$this->comment("奖金算法start");
|
|
foreach ($users as $u) {
|
|
if ($u->balance > 0) {
|
|
$this->setUserBonus($u);
|
|
}
|
|
}
|
|
foreach ($users as $s) {
|
|
if ($s->level == Users::USER_LEVEL_ORDINARY) {
|
|
$this->setEcologyBonus($s);
|
|
}
|
|
}
|
|
foreach ($users as $a) {
|
|
if ($a->level > Users::USER_LEVEL_ORDINARY) {
|
|
$this->setAgentReward($a);
|
|
}
|
|
}
|
|
$this->comment("奖金算法end");
|
|
}
|
|
public function setAgentReward($user)
|
|
{
|
|
if (empty($user)) {
|
|
return false;
|
|
}
|
|
DB::beginTransaction();
|
|
try {
|
|
$son = Users::where("parent_id", $user->id)->get();
|
|
$money = 0;
|
|
if (!empty($son)) {
|
|
foreach ($son as $s) {
|
|
$money_g = $this->getSonBonus($s) * $this->getProportion($user->level, $s->level);
|
|
$money = $money + $money_g;
|
|
}
|
|
}
|
|
if (!empty($money)) {
|
|
$user->sub_balance = $user->sub_balance + $money;
|
|
$user->save();
|
|
AccountLog::insertLog(array("user_id" => $user->id, "value" => $money, "type" => AccountLog::AGENT_REWARD, "info" => "代理商管理奖励"));
|
|
$this->comment($user->id . ":代理商管理奖励" . $money);
|
|
}
|
|
DB::commit();
|
|
} catch (\Exception $ex) {
|
|
DB::rollback();
|
|
$this->comment($ex->getMessage());
|
|
}
|
|
}
|
|
public function getProportion($self_level, $level)
|
|
{
|
|
if (empty($self_level) || empty($level)) {
|
|
return 0.05;
|
|
}
|
|
$difference = $self_level - $level;
|
|
if ($difference <= 0 || $difference > 5) {
|
|
return 0.05;
|
|
} else {
|
|
return $difference * 0.05;
|
|
}
|
|
}
|
|
public function getSonBonus($user)
|
|
{
|
|
if (empty($user)) {
|
|
return 0;
|
|
}
|
|
$son = Users::getSon($user->id);
|
|
$time = time();
|
|
$start_time = $time - 3600;
|
|
$user_arr = array();
|
|
array_push($user_arr, $user->id);
|
|
if (!empty($son)) {
|
|
foreach ($son as $s) {
|
|
array_push($user_arr, $s["user_id"]);
|
|
}
|
|
}
|
|
$user_bonus = AccountLog::where("type", AccountLog::USER_BONUS)->whereIn("user_id", $user_arr)->where("created_time", ">", $start_time)->sum("value");
|
|
$ecology_bonus = AccountLog::where("type", AccountLog::ECOLOGY_BONUS)->whereIn("user_id", $user_arr)->where("created_time", ">", $start_time)->sum("value");
|
|
return $user_bonus + $ecology_bonus;
|
|
}
|
|
public function setEcologyBonus($user)
|
|
{
|
|
if (empty($user)) {
|
|
return false;
|
|
}
|
|
DB::beginTransaction();
|
|
$son = Users::getSonId($user->id);
|
|
$time = time();
|
|
$start_time = $time - 3600;
|
|
$money = 0;
|
|
try {
|
|
if (!empty($son)) {
|
|
foreach ($son as $s) {
|
|
$log = AccountLog::where("type", AccountLog::USER_BONUS)->where("user_id", $s["user_id"])->where("created_time", ">", $start_time)->first();
|
|
if (!empty($log)) {
|
|
foreach ($this->ecology_bonus as $eb) {
|
|
if (!empty($eb["one"]) && !empty($eb["two"]) && !empty($eb["three"]) && !empty($eb["four"])) {
|
|
if ($eb["one"] <= $user->balance && $user->balance < $eb["two"]) {
|
|
$interest_rate = $s["level"] == 1 ? $eb["three"] : $eb["four"];
|
|
$interest_rate = $interest_rate / 100;
|
|
$money = $money + $log->value * $interest_rate;
|
|
break 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ($money > 0) {
|
|
$user->sub_balance = $user->sub_balance + $money;
|
|
$user->save();
|
|
AccountLog::insertLog(array("user_id" => $user->id, "value" => $money, "type" => AccountLog::ECOLOGY_BONUS, "info" => "生态推广奖励增加"));
|
|
$this->comment($user->id . ":生态推广奖励增加" . $money);
|
|
}
|
|
DB::commit();
|
|
} catch (\Exception $ex) {
|
|
DB::rollback();
|
|
$this->comment($ex->getMessage());
|
|
}
|
|
}
|
|
public function setUserBonus($user)
|
|
{
|
|
if (empty($user)) {
|
|
return false;
|
|
}
|
|
DB::beginTransaction();
|
|
try {
|
|
foreach ($this->user_bonus as $ub) {
|
|
if (!empty($ub["one"]) && !empty($ub["two"]) && !empty($ub["three"])) {
|
|
if ($ub["one"] <= $user->balance && $user->balance < $ub["two"]) {
|
|
$money = $user->balance * ($ub["three"] / 100);
|
|
$user->sub_balance = $user->sub_balance + $money;
|
|
$user->save();
|
|
AccountLog::insertLog(array("user_id" => $user->id, "value" => $money, "type" => AccountLog::USER_BONUS, "info" => "日均收益增加"));
|
|
$this->comment($user->id . ":日均收益增加" . $money);
|
|
break 1;
|
|
}
|
|
}
|
|
}
|
|
DB::commit();
|
|
} catch (\Exception $ex) {
|
|
DB::rollback();
|
|
$this->comment($ex->getMessage());
|
|
}
|
|
}
|
|
} |