6
0
Fork 0
base
panliang 2022-08-04 17:02:42 +08:00
parent 30c6576d36
commit 16ff1505f7
4 changed files with 63 additions and 22 deletions

View File

@ -9,6 +9,7 @@ use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use App\Admin\Extensions\Grid\Tools\ProfitBatchSuccess;
use App\Enums\PayWay;
use App\Models\Agent;
use Dcat\Admin\Admin;
class OrderProfitController extends AdminController
@ -44,6 +45,7 @@ class OrderProfitController extends AdminController
$filter->like('fromUser.phone')->width(3);
$filter->like('user.phone')->width(3);
$filter->equal('status')->select(OrderProfit::$statusMap)->width(3);
$filter->where('role_name', fn($q) => $q->role($this->input))->select(Agent::$typeMap)->width(3);
});
$grid->showRowSelector();

View File

@ -5,6 +5,7 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Support\Str;
class OrderProfit extends Model
{
@ -44,4 +45,14 @@ class OrderProfit extends Model
{
return $this->belongsTo(Order::class, 'order_id');
}
public function scopeRole($q, $role)
{
return $q->where('role', 'like', $role.'-%');
}
public function isRole($role)
{
return Str::startsWith($this->role, $role);
}
}

View File

@ -77,40 +77,44 @@ class DistributeService
{
$sales_value = $order->sales_value;
$user = $order->user;
$user_agent = $user->agent;
// 上级返利
$parent_ids = array_reverse($user->userInfo->parent_ids);
$parents = User::with(['userInfo', 'agent'])->whereIn('id', $parent_ids)->get();
$parentIds = array_reverse($user->userInfo->parent_ids);
// 按照推荐的顺序,第一位是直属推荐人
$parents = User::with(['userInfo', 'agent'])->whereIn('id', $parentIds)->get()->sortBy(fn($item) => array_search($item->id, $parentIds));
// 过滤掉 不是代理身份 的用户
// 过滤掉 相同等级 的 后者 用户
// 过滤掉等级 低于 下单用户等级 的用户(sort = 1 为最高)
$exists_list = [];
$filtered = $parents->filter(function ($item) use ($user_agent, &$exists_list) {
// 过滤掉等级 低于 上一个分钱 的用户(sort = 1 为最高级, slug 要相同)
$existsList = [];
$lastAgent = null;
$filtered = collect();
foreach($parents as $item) {
if (!$item->agent) {
return false;
continue;
}
if (in_array($item->agent->sort, $exists_list)) {
return false;
if (in_array($item->agent->sort, $existsList)) {
continue;
}
array_push($exists_list, $item->agent->sort);
if ($user_agent) {
return $user_agent->sort > $item->agent->sort;
if ($lastAgent && $item->agent->sort > $lastAgent->sort && $item->agent->slug === $lastAgent->slug) {
continue;
}
$lastAgent = $item->agent;
array_push($existsList, $item->agent->sort);
$filtered->push($item);
}
return true;
});
// 生成返利记录
$profit_list = [];
$money_sum = 0;
foreach($filtered->reverse() as $item) {
foreach($filtered as $item) {
$agent = $item->agent??'';
if (!$agent) {
continue;
}
$money = floor($sales_value * $agent->ratio) / 100 - $money_sum;
if ($money <= 0) {
continue;
}
array_unshift($profit_list, [
'from_user_id' => $user->id,
'user_id' => $item->id,
@ -176,8 +180,12 @@ class DistributeService
// 商户订单号
$sn = serial_number();
foreach($list as $item) {
// 待付款, 同一收款用户, 金额 > 0
if ($item->status === 4 && $item->user_id === $userId && $item->money > 0) {
// 待付款, 同一收款用户, 金额 > 0, 代理等级: Agent::TYPE_FAVOITE
if ($item->status === 4 &&
$item->user_id === $userId &&
$item->money > 0 &&
$item->isRole(Agent::TYPE_FAVOITE)
) {
$item->update([
'status' => 1,
'pay_no' => $sn

View File

@ -2,8 +2,10 @@
namespace Tests\Feature;
use App\Models\Agent;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
use Illuminate\Support\Str;
class ExampleTest extends TestCase
{
@ -14,8 +16,26 @@ class ExampleTest extends TestCase
*/
public function test_example()
{
$response = $this->get('/');
// 过滤掉 不是代理身份 的用户
// 过滤掉 相同等级 的 后者 用户
// 过滤掉等级 低于 上一个分钱 的用户
$parents = [2, 3, 1, 5, 6, null];
$filtered = [];
$last = null;
foreach($parents as $item) {
if (!$item) {
continue;
}
if (in_array($item, $filtered)) {
continue;
}
if ($last && $item < $last) {
continue;
}
$last = $item;
array_push($filtered, $item);
}
$response->assertStatus(200);
dd($filtered);
}
}