Bladeren bron

完成URS推广模块后台管理和API接口开发

新增功能:
- 后台管理控制器:UrsUserReferralController、UrsUserTalentController、UrsProfitController、UrsTalentConfigController
- Helper辅助类:Grid、Show、Form、Filter四套完整辅助类
- API控制器:UrsPromotionApiController,提供7个核心API接口
- 路由配置:admin.php和api.php路由文件
- 事件系统:3个事件类和3个监听器类
- 服务提供者:UrsPromotionServiceProvider,注册命令和路由
- 集成测试:UrsPromotionIntegrationTestCommand,全面测试各项功能
- 后台菜单:创建URS推广管理菜单,包含4个子菜单
- 修复User模型引用路径问题

测试验证:
- 集成测试通过,三代推广关系正常
- 收益分成功能正常:推广收益5%,种植收益0.5%
- 达人等级计算正确:3直推+2间推+2三推=7人团队,升级为初级达人
- 统计功能完整:按收益类型和推荐层级分类统计
notfff 7 maanden geleden
bovenliggende
commit
7e97254979
38 gewijzigde bestanden met toevoegingen van 2162 en 5 verwijderingen
  1. 4 1
      AiWork/记忆习惯.md
  2. 47 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsProfitFilterHelper.php
  3. 13 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsProfitFormHelper.php
  4. 13 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsProfitGridHelper.php
  5. 13 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsProfitShowHelper.php
  6. 29 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsTalentConfigFilterHelper.php
  7. 13 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsTalentConfigFormHelper.php
  8. 13 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsTalentConfigGridHelper.php
  9. 13 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsTalentConfigShowHelper.php
  10. 29 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsUserReferralFilterHelper.php
  11. 13 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsUserReferralFormHelper.php
  12. 13 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsUserReferralGridHelper.php
  13. 13 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsUserReferralShowHelper.php
  14. 34 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsUserTalentFilterHelper.php
  15. 13 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsUserTalentFormHelper.php
  16. 13 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsUserTalentGridHelper.php
  17. 13 0
      app/Module/UrsPromotion/AdminControllers/Helper/UrsUserTalentShowHelper.php
  18. 211 0
      app/Module/UrsPromotion/AdminControllers/UrsProfitController.php
  19. 230 0
      app/Module/UrsPromotion/AdminControllers/UrsTalentConfigController.php
  20. 106 0
      app/Module/UrsPromotion/AdminControllers/UrsUserReferralController.php
  21. 214 0
      app/Module/UrsPromotion/AdminControllers/UrsUserTalentController.php
  22. 127 0
      app/Module/UrsPromotion/Commands/InsertUrsPromotionAdminMenuCommand.php
  23. 3 1
      app/Module/UrsPromotion/Commands/TestUrsProfitCommand.php
  24. 219 0
      app/Module/UrsPromotion/Commands/UrsPromotionIntegrationTestCommand.php
  25. 359 0
      app/Module/UrsPromotion/Controllers/UrsPromotionApiController.php
  26. 28 0
      app/Module/UrsPromotion/Events/UrsProfitGeneratedEvent.php
  27. 39 0
      app/Module/UrsPromotion/Events/UrsReferralCreatedEvent.php
  28. 51 0
      app/Module/UrsPromotion/Events/UrsTalentLevelUpEvent.php
  29. 48 0
      app/Module/UrsPromotion/Listeners/UrsProfitGeneratedListener.php
  30. 42 0
      app/Module/UrsPromotion/Listeners/UrsReferralCreatedListener.php
  31. 44 0
      app/Module/UrsPromotion/Listeners/UrsTalentLevelUpListener.php
  32. 1 1
      app/Module/UrsPromotion/Models/UrsProfit.php
  33. 1 1
      app/Module/UrsPromotion/Models/UrsUserReferral.php
  34. 1 1
      app/Module/UrsPromotion/Models/UrsUserTalent.php
  35. 64 0
      app/Module/UrsPromotion/Providers/UrsPromotionServiceProvider.php
  36. 34 0
      app/Module/UrsPromotion/Routes/admin.php
  37. 38 0
      app/Module/UrsPromotion/Routes/api.php
  38. 3 0
      config/app.php

+ 4 - 1
AiWork/记忆习惯.md

@@ -117,7 +117,10 @@
 - UrsPromotion模块是专门为URS业务场景设计的推广系统,与Promotion模块完全独立
 - UrsPromotion模块使用独立的命名空间App\Module\UrsPromotion和数据库表前缀urs_promotion_
 - UrsPromotion模块包含完整的目录结构、文档体系和数据库设计,支持URS专用的达人等级和收益分成机制
-- UrsPromotion模块已完成基础架构搭建:目录结构、README文档、设计概述、数据库设计和SQL脚本
+- UrsPromotion模块已升级为三代推广系统:支持直推、间推、三推三代推广关系,新增推广收益和种植收益两种类型
+- UrsPromotion模块完整实现:枚举类型、模型层、逻辑层、服务层、仓库层、测试命令,数据库表创建和初始化数据完成
+- UrsPromotion模块达人等级配置:6个等级(非达人到顶级达人),不同等级享有不同的推广收益和种植收益分成比例
+- UrsPromotion模块收益分成机制:推广收益(下级进入农场)和种植收益(下级收获作物),根据达人等级和推荐层级确定分成比例
 - OpenAPI模块已扩展钻石充值/提取功能,每个开发者应用分配专用账户:充值账户=100000+应用ID,提取账户=200000+应用ID
 - OpenAPI模块钻石操作使用FUND_TYPE::FUND2类型,支持10位小数精度,包含完整的验证、事务处理和操作日志记录机制
 - ThirdParty模块已实现标准化基础架构:BaseRequest请求基类、BaseWebhook基类、WebhookDispatchService分发服务、路由规则/thirdParty/webhook/{包名}/{Handler路由}

+ 47 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsProfitFilterHelper.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\FilterHelper;
+use App\Module\UrsPromotion\Models\UrsProfit;
+use Dcat\Admin\Grid;
+
+/**
+ * URS团队收益记录筛选辅助类
+ */
+class UrsProfitFilterHelper extends FilterHelper
+{
+    /**
+     * 配置筛选器
+     */
+    public static function make(Grid\Filter $filter): void
+    {
+        $filter->equal('user_id', '获得收益用户');
+        $filter->equal('promotion_member_id', '产生收益用户');
+        $filter->like('source_type', '收益来源类型');
+        $filter->equal('source_id', '收益来源ID');
+        $filter->equal('profit_type', '收益类型')->select([
+            'promotion_reward' => '推广收益',
+            'planting_reward' => '种植收益',
+        ]);
+        $filter->equal('relation_level', '推荐层级')->select([
+            1 => '直推',
+            2 => '间推',
+            3 => '三推',
+        ]);
+        $filter->between('profit_amount', '分成金额');
+        $filter->equal('talent_level', '达人等级')->select([
+            0 => '非达人',
+            1 => '初级达人',
+            2 => '中级达人',
+            3 => '高级达人',
+            4 => '资深达人',
+            5 => '顶级达人',
+        ]);
+        $filter->equal('status', '状态')->select([
+            UrsProfit::STATUS_CANCELLED => '取消',
+            UrsProfit::STATUS_NORMAL => '正常',
+        ]);
+        $filter->between('created_at', '创建时间')->datetime();
+    }
+}

+ 13 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsProfitFormHelper.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\FormHelper;
+
+/**
+ * URS团队收益记录表单辅助类
+ */
+class UrsProfitFormHelper extends FormHelper
+{
+    // 此类继承自FormHelper,提供标准的Form辅助功能
+}

+ 13 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsProfitGridHelper.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\GridHelper;
+
+/**
+ * URS团队收益记录列表辅助类
+ */
+class UrsProfitGridHelper extends GridHelper
+{
+    // 此类继承自GridHelper,提供标准的Grid辅助功能
+}

+ 13 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsProfitShowHelper.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\ShowHelper;
+
+/**
+ * URS团队收益记录详情辅助类
+ */
+class UrsProfitShowHelper extends ShowHelper
+{
+    // 此类继承自ShowHelper,提供标准的Show辅助功能
+}

+ 29 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsTalentConfigFilterHelper.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\FilterHelper;
+use App\Module\UrsPromotion\Models\UrsTalentConfig;
+use Dcat\Admin\Grid;
+
+/**
+ * URS达人等级配置筛选辅助类
+ */
+class UrsTalentConfigFilterHelper extends FilterHelper
+{
+    /**
+     * 配置筛选器
+     */
+    public static function make(Grid\Filter $filter): void
+    {
+        $filter->equal('level', '等级');
+        $filter->like('name', '等级名称');
+        $filter->between('direct_count_required', '所需直推人数');
+        $filter->between('promotion_count_required', '所需团队总人数');
+        $filter->equal('status', '状态')->select([
+            UrsTalentConfig::STATUS_DISABLED => '禁用',
+            UrsTalentConfig::STATUS_ENABLED => '启用',
+        ]);
+        $filter->between('created_at', '创建时间')->datetime();
+    }
+}

+ 13 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsTalentConfigFormHelper.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\FormHelper;
+
+/**
+ * URS达人等级配置表单辅助类
+ */
+class UrsTalentConfigFormHelper extends FormHelper
+{
+    // 此类继承自FormHelper,提供标准的Form辅助功能
+}

+ 13 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsTalentConfigGridHelper.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\GridHelper;
+
+/**
+ * URS达人等级配置列表辅助类
+ */
+class UrsTalentConfigGridHelper extends GridHelper
+{
+    // 此类继承自GridHelper,提供标准的Grid辅助功能
+}

+ 13 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsTalentConfigShowHelper.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\ShowHelper;
+
+/**
+ * URS达人等级配置详情辅助类
+ */
+class UrsTalentConfigShowHelper extends ShowHelper
+{
+    // 此类继承自ShowHelper,提供标准的Show辅助功能
+}

+ 29 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsUserReferralFilterHelper.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\FilterHelper;
+use App\Module\UrsPromotion\Models\UrsUserReferral;
+use Dcat\Admin\Grid;
+
+/**
+ * URS用户推荐关系筛选辅助类
+ */
+class UrsUserReferralFilterHelper extends FilterHelper
+{
+    /**
+     * 配置筛选器
+     */
+    public static function make(Grid\Filter $filter): void
+    {
+        $filter->equal('user_id', '用户ID');
+        $filter->equal('referrer_id', '推荐人ID');
+        $filter->like('referral_code', '推荐码');
+        $filter->equal('status', '状态')->select([
+            UrsUserReferral::STATUS_INVALID => '无效',
+            UrsUserReferral::STATUS_VALID => '有效',
+        ]);
+        $filter->between('referral_time', '推荐时间')->datetime();
+        $filter->between('created_at', '创建时间')->datetime();
+    }
+}

+ 13 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsUserReferralFormHelper.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\FormHelper;
+
+/**
+ * URS用户推荐关系表单辅助类
+ */
+class UrsUserReferralFormHelper extends FormHelper
+{
+    // 此类继承自FormHelper,提供标准的Form辅助功能
+}

+ 13 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsUserReferralGridHelper.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\GridHelper;
+
+/**
+ * URS用户推荐关系列表辅助类
+ */
+class UrsUserReferralGridHelper extends GridHelper
+{
+    // 此类继承自GridHelper,提供标准的Grid辅助功能
+}

+ 13 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsUserReferralShowHelper.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\ShowHelper;
+
+/**
+ * URS用户推荐关系详情辅助类
+ */
+class UrsUserReferralShowHelper extends ShowHelper
+{
+    // 此类继承自ShowHelper,提供标准的Show辅助功能
+}

+ 34 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsUserTalentFilterHelper.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\FilterHelper;
+use Dcat\Admin\Grid;
+
+/**
+ * URS用户达人等级筛选辅助类
+ */
+class UrsUserTalentFilterHelper extends FilterHelper
+{
+    /**
+     * 配置筛选器
+     */
+    public static function make(Grid\Filter $filter): void
+    {
+        $filter->equal('user_id', '用户ID');
+        $filter->equal('talent_level', '达人等级')->select([
+            0 => '非达人',
+            1 => 'URS初级达人',
+            2 => 'URS中级达人',
+            3 => 'URS高级达人',
+            4 => 'URS资深达人',
+            5 => 'URS顶级达人',
+        ]);
+        $filter->between('direct_count', '直推人数');
+        $filter->between('indirect_count', '间推人数');
+        $filter->between('third_count', '三推人数');
+        $filter->between('promotion_count', '团队总人数');
+        $filter->between('last_level_update_time', '最后升级时间')->datetime();
+        $filter->between('created_at', '创建时间')->datetime();
+    }
+}

+ 13 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsUserTalentFormHelper.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\FormHelper;
+
+/**
+ * URS用户达人等级表单辅助类
+ */
+class UrsUserTalentFormHelper extends FormHelper
+{
+    // 此类继承自FormHelper,提供标准的Form辅助功能
+}

+ 13 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsUserTalentGridHelper.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\GridHelper;
+
+/**
+ * URS用户达人等级列表辅助类
+ */
+class UrsUserTalentGridHelper extends GridHelper
+{
+    // 此类继承自GridHelper,提供标准的Grid辅助功能
+}

+ 13 - 0
app/Module/UrsPromotion/AdminControllers/Helper/UrsUserTalentShowHelper.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers\Helper;
+
+use UCore\DcatAdmin\ShowHelper;
+
+/**
+ * URS用户达人等级详情辅助类
+ */
+class UrsUserTalentShowHelper extends ShowHelper
+{
+    // 此类继承自ShowHelper,提供标准的Show辅助功能
+}

+ 211 - 0
app/Module/UrsPromotion/AdminControllers/UrsProfitController.php

@@ -0,0 +1,211 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers;
+
+use UCore\DcatAdmin\AdminController;
+use App\Module\UrsPromotion\Models\UrsProfit;
+use App\Module\UrsPromotion\Repositorys\UrsProfitRepository;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsProfitGridHelper;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsProfitShowHelper;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsProfitFormHelper;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsProfitFilterHelper;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Show;
+use Dcat\Admin\Form;
+
+/**
+ * URS团队收益记录管理控制器
+ * 
+ * @route /admin/urs-promotion/profits
+ */
+class UrsProfitController extends AdminController
+{
+    /**
+     * 页面标题
+     */
+    protected $title = 'URS团队收益记录';
+
+    /**
+     * 模型类
+     */
+    protected $model = UrsProfit::class;
+
+    /**
+     * 仓库类
+     */
+    protected $repository = UrsProfitRepository::class;
+
+    /**
+     * 列表页面
+     */
+    protected function grid(): Grid
+    {
+        return UrsProfitGridHelper::make($this->repository(), function (Grid $grid) {
+            $grid->column('id', 'ID')->sortable();
+            $grid->column('user_id', '获得收益用户')->sortable();
+            $grid->column('promotion_member_id', '产生收益用户')->sortable();
+            $grid->column('source_type', '收益来源类型');
+            $grid->column('source_id', '收益来源ID');
+            $grid->column('profit_type', '收益类型')->using([
+                'promotion_reward' => '推广收益',
+                'planting_reward' => '种植收益',
+            ])->label([
+                'promotion_reward' => 'primary',
+                'planting_reward' => 'success',
+            ]);
+            $grid->column('relation_level', '推荐层级')->using([
+                1 => '直推',
+                2 => '间推',
+                3 => '三推',
+            ])->label([
+                1 => 'success',
+                2 => 'info',
+                3 => 'warning',
+            ]);
+            $grid->column('original_amount', '原始金额')->display(function ($value) {
+                return number_format($value, 4);
+            });
+            $grid->column('profit_amount', '分成金额')->display(function ($value) {
+                return number_format($value, 4);
+            });
+            $grid->column('profit_rate', '分成比例')->display(function ($value) {
+                return ($value * 100) . '%';
+            });
+            $grid->column('talent_level', '达人等级')->using([
+                0 => '非达人',
+                1 => '初级达人',
+                2 => '中级达人',
+                3 => '高级达人',
+                4 => '资深达人',
+                5 => '顶级达人',
+            ]);
+            $grid->column('status', '状态')->using([
+                UrsProfit::STATUS_CANCELLED => '取消',
+                UrsProfit::STATUS_NORMAL => '正常',
+            ])->label([
+                UrsProfit::STATUS_CANCELLED => 'danger',
+                UrsProfit::STATUS_NORMAL => 'success',
+            ]);
+            $grid->column('created_at', '创建时间')->sortable();
+
+            // 禁用创建和编辑(收益记录由系统自动生成)
+            $grid->disableCreateButton();
+            $grid->actions(function (Grid\Displayers\Actions $actions) {
+                $actions->disableEdit();
+                $actions->disableDelete();
+            });
+
+            // 添加统计信息
+            $grid->tools(function (Grid\Tools $tools) {
+                $tools->append($this->renderStats());
+            });
+
+            $grid->filter(function (Grid\Filter $filter) {
+                UrsProfitFilterHelper::make($filter);
+            });
+        });
+    }
+
+    /**
+     * 详情页面
+     */
+    protected function detail($id): Show
+    {
+        return UrsProfitShowHelper::make($this->repository(), $id, function (Show $show) {
+            $show->field('id', 'ID');
+            $show->field('user_id', '获得收益用户');
+            $show->field('promotion_member_id', '产生收益用户');
+            $show->field('source_type', '收益来源类型');
+            $show->field('source_id', '收益来源ID');
+            $show->field('profit_type', '收益类型')->using([
+                'promotion_reward' => '推广收益',
+                'planting_reward' => '种植收益',
+            ]);
+            $show->field('relation_level', '推荐层级')->using([
+                1 => '直推',
+                2 => '间推',
+                3 => '三推',
+            ]);
+            $show->field('original_amount', '原始金额');
+            $show->field('profit_amount', '分成金额');
+            $show->field('profit_rate', '分成比例')->as(function ($value) {
+                return ($value * 100) . '%';
+            });
+            $show->field('talent_level', '达人等级')->using([
+                0 => '非达人',
+                1 => '初级达人',
+                2 => '中级达人',
+                3 => '高级达人',
+                4 => '资深达人',
+                5 => '顶级达人',
+            ]);
+            $show->field('status', '状态')->using([
+                UrsProfit::STATUS_CANCELLED => '取消',
+                UrsProfit::STATUS_NORMAL => '正常',
+            ]);
+            $show->field('created_at', '创建时间');
+            $show->field('updated_at', '更新时间');
+        });
+    }
+
+    /**
+     * 表单页面(禁用)
+     */
+    protected function form(): Form
+    {
+        return UrsProfitFormHelper::make($this->repository(), function (Form $form) {
+            // 收益记录由系统自动生成,不提供手动创建表单
+            $form->display('message', '提示')->default('收益记录由系统自动生成,不支持手动添加或编辑');
+        });
+    }
+
+    /**
+     * 渲染统计信息
+     */
+    private function renderStats(): string
+    {
+        $totalCount = UrsProfit::where('status', UrsProfit::STATUS_NORMAL)->count();
+        $totalAmount = UrsProfit::where('status', UrsProfit::STATUS_NORMAL)->sum('profit_amount');
+        
+        $promotionCount = UrsProfit::where('status', UrsProfit::STATUS_NORMAL)
+            ->where('profit_type', 'promotion_reward')->count();
+        $promotionAmount = UrsProfit::where('status', UrsProfit::STATUS_NORMAL)
+            ->where('profit_type', 'promotion_reward')->sum('profit_amount');
+            
+        $plantingCount = UrsProfit::where('status', UrsProfit::STATUS_NORMAL)
+            ->where('profit_type', 'planting_reward')->count();
+        $plantingAmount = UrsProfit::where('status', UrsProfit::STATUS_NORMAL)
+            ->where('profit_type', 'planting_reward')->sum('profit_amount');
+
+        return '
+        <div class="row mb-3">
+            <div class="col-md-3">
+                <div class="card">
+                    <div class="card-body text-center">
+                        <h5 class="card-title">总收益记录</h5>
+                        <p class="card-text">' . $totalCount . ' 条</p>
+                        <small class="text-muted">总金额: ' . number_format($totalAmount, 4) . '</small>
+                    </div>
+                </div>
+            </div>
+            <div class="col-md-3">
+                <div class="card">
+                    <div class="card-body text-center">
+                        <h5 class="card-title">推广收益</h5>
+                        <p class="card-text">' . $promotionCount . ' 条</p>
+                        <small class="text-muted">金额: ' . number_format($promotionAmount, 4) . '</small>
+                    </div>
+                </div>
+            </div>
+            <div class="col-md-3">
+                <div class="card">
+                    <div class="card-body text-center">
+                        <h5 class="card-title">种植收益</h5>
+                        <p class="card-text">' . $plantingCount . ' 条</p>
+                        <small class="text-muted">金额: ' . number_format($plantingAmount, 4) . '</small>
+                    </div>
+                </div>
+            </div>
+        </div>';
+    }
+}

+ 230 - 0
app/Module/UrsPromotion/AdminControllers/UrsTalentConfigController.php

@@ -0,0 +1,230 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers;
+
+use UCore\DcatAdmin\AdminController;
+use App\Module\UrsPromotion\Models\UrsTalentConfig;
+use App\Module\UrsPromotion\Repositorys\UrsTalentConfigRepository;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsTalentConfigGridHelper;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsTalentConfigShowHelper;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsTalentConfigFormHelper;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsTalentConfigFilterHelper;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Show;
+use Dcat\Admin\Form;
+
+/**
+ * URS达人等级配置管理控制器
+ * 
+ * @route /admin/urs-promotion/talent-configs
+ */
+class UrsTalentConfigController extends AdminController
+{
+    /**
+     * 页面标题
+     */
+    protected $title = 'URS达人等级配置';
+
+    /**
+     * 模型类
+     */
+    protected $model = UrsTalentConfig::class;
+
+    /**
+     * 仓库类
+     */
+    protected $repository = UrsTalentConfigRepository::class;
+
+    /**
+     * 列表页面
+     */
+    protected function grid(): Grid
+    {
+        return UrsTalentConfigGridHelper::make($this->repository(), function (Grid $grid) {
+            $grid->column('id', 'ID')->sortable();
+            $grid->column('level', '等级')->sortable()->label([
+                0 => 'default',
+                1 => 'primary',
+                2 => 'info',
+                3 => 'success',
+                4 => 'warning',
+                5 => 'danger',
+            ]);
+            $grid->column('name', '等级名称');
+            $grid->column('direct_count_required', '所需直推人数')->sortable();
+            $grid->column('promotion_count_required', '所需团队总人数')->sortable();
+            
+            $grid->column('promotion_reward_rates', '推广收益分成')->display(function ($value) {
+                if (is_string($value)) {
+                    $value = json_decode($value, true);
+                }
+                if (is_array($value)) {
+                    return "直推:{$value['1']}% 间推:{$value['2']}% 三推:{$value['3']}%";
+                }
+                return '-';
+            });
+            
+            $grid->column('planting_reward_rates', '种植收益分成')->display(function ($value) {
+                if (is_string($value)) {
+                    $value = json_decode($value, true);
+                }
+                if (is_array($value)) {
+                    return "直推:{$value['1']}% 间推:{$value['2']}% 三推:{$value['3']}%";
+                }
+                return '-';
+            });
+            
+            $grid->column('sort_order', '排序')->sortable();
+            $grid->column('status', '状态')->using([
+                UrsTalentConfig::STATUS_DISABLED => '禁用',
+                UrsTalentConfig::STATUS_ENABLED => '启用',
+            ])->label([
+                UrsTalentConfig::STATUS_DISABLED => 'danger',
+                UrsTalentConfig::STATUS_ENABLED => 'success',
+            ]);
+            $grid->column('created_at', '创建时间')->sortable();
+
+            $grid->filter(function (Grid\Filter $filter) {
+                UrsTalentConfigFilterHelper::make($filter);
+            });
+        });
+    }
+
+    /**
+     * 详情页面
+     */
+    protected function detail($id): Show
+    {
+        return UrsTalentConfigShowHelper::make($this->repository(), $id, function (Show $show) {
+            $show->field('id', 'ID');
+            $show->field('level', '等级');
+            $show->field('name', '等级名称');
+            $show->field('direct_count_required', '所需直推人数');
+            $show->field('promotion_count_required', '所需团队总人数');
+            
+            $show->field('promotion_reward_rates', '推广收益分成比例')->unescape()->as(function ($value) {
+                if (is_string($value)) {
+                    $value = json_decode($value, true);
+                }
+                if (is_array($value)) {
+                    return "
+                    <table class='table table-sm'>
+                        <tr><td>直推</td><td>{$value['1']}%</td></tr>
+                        <tr><td>间推</td><td>{$value['2']}%</td></tr>
+                        <tr><td>三推</td><td>{$value['3']}%</td></tr>
+                    </table>";
+                }
+                return '-';
+            });
+            
+            $show->field('planting_reward_rates', '种植收益分成比例')->unescape()->as(function ($value) {
+                if (is_string($value)) {
+                    $value = json_decode($value, true);
+                }
+                if (is_array($value)) {
+                    return "
+                    <table class='table table-sm'>
+                        <tr><td>直推</td><td>{$value['1']}%</td></tr>
+                        <tr><td>间推</td><td>{$value['2']}%</td></tr>
+                        <tr><td>三推</td><td>{$value['3']}%</td></tr>
+                    </table>";
+                }
+                return '-';
+            });
+            
+            $show->field('icon', '等级图标');
+            $show->field('description', '等级描述');
+            $show->field('sort_order', '排序权重');
+            $show->field('status', '状态')->using([
+                UrsTalentConfig::STATUS_DISABLED => '禁用',
+                UrsTalentConfig::STATUS_ENABLED => '启用',
+            ]);
+            $show->field('created_at', '创建时间');
+            $show->field('updated_at', '更新时间');
+        });
+    }
+
+    /**
+     * 表单页面
+     */
+    protected function form(): Form
+    {
+        return UrsTalentConfigFormHelper::make($this->repository(), function (Form $form) {
+            $form->display('id', 'ID');
+            $form->number('level', '等级')->required()->min(0)->max(10);
+            $form->text('name', '等级名称')->required();
+            $form->number('direct_count_required', '所需直推人数')->default(0)->min(0);
+            $form->number('promotion_count_required', '所需团队总人数')->default(0)->min(0);
+            
+            // 推广收益分成比例配置
+            $form->fieldset('推广收益分成比例', function (Form $form) {
+                $form->decimal('promotion_direct_rate', '直推分成比例(%)')->default(0)->min(0)->max(100);
+                $form->decimal('promotion_indirect_rate', '间推分成比例(%)')->default(0)->min(0)->max(100);
+                $form->decimal('promotion_third_rate', '三推分成比例(%)')->default(0)->min(0)->max(100);
+            });
+            
+            // 种植收益分成比例配置
+            $form->fieldset('种植收益分成比例', function (Form $form) {
+                $form->decimal('planting_direct_rate', '直推分成比例(%)')->default(0)->min(0)->max(100);
+                $form->decimal('planting_indirect_rate', '间推分成比例(%)')->default(0)->min(0)->max(100);
+                $form->decimal('planting_third_rate', '三推分成比例(%)')->default(0)->min(0)->max(100);
+            });
+            
+            $form->text('icon', '等级图标');
+            $form->textarea('description', '等级描述');
+            $form->number('sort_order', '排序权重')->default(0);
+            $form->switch('status', '状态')->default(UrsTalentConfig::STATUS_ENABLED);
+            
+            $form->display('created_at', '创建时间');
+            $form->display('updated_at', '更新时间');
+
+            // 保存前处理分成比例数据
+            $form->saving(function (Form $form) {
+                $promotionRates = [
+                    '1' => $form->promotion_direct_rate / 100,
+                    '2' => $form->promotion_indirect_rate / 100,
+                    '3' => $form->promotion_third_rate / 100,
+                ];
+                $form->promotion_reward_rates = json_encode($promotionRates);
+                
+                $plantingRates = [
+                    '1' => $form->planting_direct_rate / 100,
+                    '2' => $form->planting_indirect_rate / 100,
+                    '3' => $form->planting_third_rate / 100,
+                ];
+                $form->planting_reward_rates = json_encode($plantingRates);
+                
+                // 移除临时字段
+                unset($form->promotion_direct_rate);
+                unset($form->promotion_indirect_rate);
+                unset($form->promotion_third_rate);
+                unset($form->planting_direct_rate);
+                unset($form->planting_indirect_rate);
+                unset($form->planting_third_rate);
+            });
+
+            // 编辑时填充分成比例数据
+            $form->editing(function (Form $form) {
+                $model = $form->model();
+                
+                if ($model->promotion_reward_rates) {
+                    $rates = is_string($model->promotion_reward_rates) 
+                        ? json_decode($model->promotion_reward_rates, true) 
+                        : $model->promotion_reward_rates;
+                    $form->promotion_direct_rate = ($rates['1'] ?? 0) * 100;
+                    $form->promotion_indirect_rate = ($rates['2'] ?? 0) * 100;
+                    $form->promotion_third_rate = ($rates['3'] ?? 0) * 100;
+                }
+                
+                if ($model->planting_reward_rates) {
+                    $rates = is_string($model->planting_reward_rates) 
+                        ? json_decode($model->planting_reward_rates, true) 
+                        : $model->planting_reward_rates;
+                    $form->planting_direct_rate = ($rates['1'] ?? 0) * 100;
+                    $form->planting_indirect_rate = ($rates['2'] ?? 0) * 100;
+                    $form->planting_third_rate = ($rates['3'] ?? 0) * 100;
+                }
+            });
+        });
+    }
+}

+ 106 - 0
app/Module/UrsPromotion/AdminControllers/UrsUserReferralController.php

@@ -0,0 +1,106 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers;
+
+use UCore\DcatAdmin\AdminController;
+use App\Module\UrsPromotion\Models\UrsUserReferral;
+use App\Module\UrsPromotion\Repositorys\UrsUserReferralRepository;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsUserReferralGridHelper;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsUserReferralShowHelper;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsUserReferralFormHelper;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsUserReferralFilterHelper;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Show;
+use Dcat\Admin\Form;
+
+/**
+ * URS用户推荐关系管理控制器
+ * 
+ * @route /admin/urs-promotion/user-referrals
+ */
+class UrsUserReferralController extends AdminController
+{
+    /**
+     * 页面标题
+     */
+    protected $title = 'URS用户推荐关系';
+
+    /**
+     * 模型类
+     */
+    protected $model = UrsUserReferral::class;
+
+    /**
+     * 仓库类
+     */
+    protected $repository = UrsUserReferralRepository::class;
+
+    /**
+     * 列表页面
+     */
+    protected function grid(): Grid
+    {
+        return UrsUserReferralGridHelper::make($this->repository(), function (Grid $grid) {
+            $grid->column('id', 'ID')->sortable();
+            $grid->column('user_id', '用户ID')->sortable();
+            $grid->column('referrer_id', '推荐人ID')->sortable();
+            $grid->column('referral_code', '推荐码');
+            $grid->column('referral_time', '推荐时间')->sortable();
+            $grid->column('status', '状态')->using([
+                UrsUserReferral::STATUS_INVALID => '无效',
+                UrsUserReferral::STATUS_VALID => '有效',
+            ])->label([
+                UrsUserReferral::STATUS_INVALID => 'danger',
+                UrsUserReferral::STATUS_VALID => 'success',
+            ]);
+            $grid->column('created_at', '创建时间')->sortable();
+
+            // 禁用创建按钮(推荐关系由系统自动创建)
+            $grid->disableCreateButton();
+            
+            // 禁用编辑(推荐关系不允许修改)
+            $grid->disableActions();
+            
+            // 只允许查看详情
+            $grid->actions(function (Grid\Displayers\Actions $actions) {
+                $actions->disableEdit();
+                $actions->disableDelete();
+            });
+
+            $grid->filter(function (Grid\Filter $filter) {
+                UrsUserReferralFilterHelper::make($filter);
+            });
+        });
+    }
+
+    /**
+     * 详情页面
+     */
+    protected function detail($id): Show
+    {
+        return UrsUserReferralShowHelper::make($this->repository(), $id, function (Show $show) {
+            $show->field('id', 'ID');
+            $show->field('user_id', '用户ID');
+            $show->field('referrer_id', '推荐人ID');
+            $show->field('referral_code', '推荐码');
+            $show->field('referral_time', '推荐时间');
+            $show->field('status', '状态')->using([
+                UrsUserReferral::STATUS_INVALID => '无效',
+                UrsUserReferral::STATUS_VALID => '有效',
+            ]);
+            $show->field('created_at', '创建时间');
+            $show->field('updated_at', '更新时间');
+        });
+    }
+
+    /**
+     * 表单页面(禁用)
+     */
+    protected function form(): Form
+    {
+        return UrsUserReferralFormHelper::make($this->repository(), function (Form $form) {
+            // 推荐关系由系统自动创建,不提供手动创建表单
+            $form->display('message', '提示')->default('推荐关系由系统自动创建,不支持手动添加或编辑');
+        });
+    }
+}

+ 214 - 0
app/Module/UrsPromotion/AdminControllers/UrsUserTalentController.php

@@ -0,0 +1,214 @@
+<?php
+
+namespace App\Module\UrsPromotion\AdminControllers;
+
+use UCore\DcatAdmin\AdminController;
+use App\Module\UrsPromotion\Models\UrsUserTalent;
+use App\Module\UrsPromotion\Repositorys\UrsUserTalentRepository;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsUserTalentGridHelper;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsUserTalentShowHelper;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsUserTalentFormHelper;
+use App\Module\UrsPromotion\AdminControllers\Helper\UrsUserTalentFilterHelper;
+use App\Module\UrsPromotion\Services\UrsTalentService;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Show;
+use Dcat\Admin\Form;
+
+/**
+ * URS用户达人等级管理控制器
+ * 
+ * @route /admin/urs-promotion/user-talents
+ */
+class UrsUserTalentController extends AdminController
+{
+    /**
+     * 页面标题
+     */
+    protected $title = 'URS用户达人等级';
+
+    /**
+     * 模型类
+     */
+    protected $model = UrsUserTalent::class;
+
+    /**
+     * 仓库类
+     */
+    protected $repository = UrsUserTalentRepository::class;
+
+    /**
+     * 列表页面
+     */
+    protected function grid(): Grid
+    {
+        return UrsUserTalentGridHelper::make($this->repository(), function (Grid $grid) {
+            $grid->column('id', 'ID')->sortable();
+            $grid->column('user_id', '用户ID')->sortable();
+            $grid->column('talent_level', '达人等级')->display(function ($value) {
+                $levels = [
+                    0 => '非达人',
+                    1 => 'URS初级达人',
+                    2 => 'URS中级达人', 
+                    3 => 'URS高级达人',
+                    4 => 'URS资深达人',
+                    5 => 'URS顶级达人',
+                ];
+                return $levels[$value] ?? '未知';
+            })->label([
+                0 => 'default',
+                1 => 'primary',
+                2 => 'info',
+                3 => 'success',
+                4 => 'warning',
+                5 => 'danger',
+            ])->sortable();
+            
+            $grid->column('direct_count', '直推人数')->sortable();
+            $grid->column('indirect_count', '间推人数')->sortable();
+            $grid->column('third_count', '三推人数')->sortable();
+            $grid->column('promotion_count', '团队总人数')->sortable();
+            $grid->column('last_level_update_time', '最后升级时间')->sortable();
+            $grid->column('created_at', '创建时间')->sortable();
+
+            // 添加批量更新达人等级功能
+            $grid->tools(function (Grid\Tools $tools) {
+                $tools->append('<a href="javascript:void(0)" class="btn btn-primary btn-sm" onclick="updateAllTalents()">批量更新达人等级</a>');
+            });
+
+            // 添加单个更新功能
+            $grid->actions(function (Grid\Displayers\Actions $actions) {
+                $actions->append('<a href="javascript:void(0)" class="btn btn-xs btn-info" onclick="updateTalent('.$actions->getKey().')">更新等级</a>');
+            });
+
+            $grid->filter(function (Grid\Filter $filter) {
+                UrsUserTalentFilterHelper::make($filter);
+            });
+        });
+    }
+
+    /**
+     * 详情页面
+     */
+    protected function detail($id): Show
+    {
+        return UrsUserTalentShowHelper::make($this->repository(), $id, function (Show $show) {
+            $show->field('id', 'ID');
+            $show->field('user_id', '用户ID');
+            $show->field('talent_level', '达人等级')->using([
+                0 => '非达人',
+                1 => 'URS初级达人',
+                2 => 'URS中级达人',
+                3 => 'URS高级达人',
+                4 => 'URS资深达人',
+                5 => 'URS顶级达人',
+            ]);
+            $show->field('direct_count', '直推人数');
+            $show->field('indirect_count', '间推人数');
+            $show->field('third_count', '三推人数');
+            $show->field('promotion_count', '团队总人数');
+            $show->field('last_level_update_time', '最后升级时间');
+            $show->field('created_at', '创建时间');
+            $show->field('updated_at', '更新时间');
+
+            // 显示推荐关系树
+            $show->divider();
+            $show->field('referral_tree', '推荐关系树')->unescape()->as(function () {
+                $tree = UrsTalentService::getUserReferralTree($this->user_id);
+                $html = '<div class="referral-tree">';
+                
+                if (!empty($tree['direct'])) {
+                    $html .= '<h5>直推用户 (' . count($tree['direct']) . '人)</h5>';
+                    $html .= '<ul>';
+                    foreach ($tree['direct'] as $user) {
+                        $html .= '<li>用户' . $user['user_id'] . ' (推荐时间: ' . $user['referral_time'] . ')</li>';
+                    }
+                    $html .= '</ul>';
+                }
+                
+                if (!empty($tree['indirect'])) {
+                    $html .= '<h5>间推用户 (' . count($tree['indirect']) . '人)</h5>';
+                    $html .= '<ul>';
+                    foreach ($tree['indirect'] as $user) {
+                        $html .= '<li>用户' . $user['user_id'] . ' (通过用户' . $user['referrer_id'] . ')</li>';
+                    }
+                    $html .= '</ul>';
+                }
+                
+                if (!empty($tree['third'])) {
+                    $html .= '<h5>三推用户 (' . count($tree['third']) . '人)</h5>';
+                    $html .= '<ul>';
+                    foreach ($tree['third'] as $user) {
+                        $html .= '<li>用户' . $user['user_id'] . ' (通过用户' . $user['referrer_id'] . ')</li>';
+                    }
+                    $html .= '</ul>';
+                }
+                
+                if (empty($tree['direct']) && empty($tree['indirect']) && empty($tree['third'])) {
+                    $html .= '<p>暂无团队成员</p>';
+                }
+                
+                $html .= '</div>';
+                return $html;
+            });
+        });
+    }
+
+    /**
+     * 表单页面
+     */
+    protected function form(): Form
+    {
+        return UrsUserTalentFormHelper::make($this->repository(), function (Form $form) {
+            $form->display('id', 'ID');
+            $form->number('user_id', '用户ID')->required();
+            $form->select('talent_level', '达人等级')->options([
+                0 => '非达人',
+                1 => 'URS初级达人',
+                2 => 'URS中级达人',
+                3 => 'URS高级达人',
+                4 => 'URS资深达人',
+                5 => 'URS顶级达人',
+            ])->required();
+            $form->number('direct_count', '直推人数')->default(0);
+            $form->number('indirect_count', '间推人数')->default(0);
+            $form->number('third_count', '三推人数')->default(0);
+            $form->number('promotion_count', '团队总人数')->default(0);
+            $form->datetime('last_level_update_time', '最后升级时间');
+            
+            $form->display('created_at', '创建时间');
+            $form->display('updated_at', '更新时间');
+        });
+    }
+
+    /**
+     * 更新单个用户达人等级
+     */
+    public function updateTalent($id)
+    {
+        $talent = UrsUserTalent::find($id);
+        if (!$talent) {
+            return response()->json(['status' => false, 'message' => '用户不存在']);
+        }
+
+        $result = UrsTalentService::updateUserTalent($talent->user_id);
+        if ($result) {
+            return response()->json(['status' => true, 'message' => '达人等级更新成功']);
+        } else {
+            return response()->json(['status' => false, 'message' => '达人等级更新失败']);
+        }
+    }
+
+    /**
+     * 批量更新所有用户达人等级
+     */
+    public function updateAllTalents()
+    {
+        $userIds = UrsUserTalent::pluck('user_id')->toArray();
+        $result = UrsTalentService::batchUpdateTalents($userIds);
+        
+        return response()->json([
+            'status' => true,
+            'message' => "批量更新完成,成功: {$result['success']},失败: {$result['failed']},升级: " . count($result['upgraded'])
+        ]);
+    }
+}

+ 127 - 0
app/Module/UrsPromotion/Commands/InsertUrsPromotionAdminMenuCommand.php

@@ -0,0 +1,127 @@
+<?php
+
+namespace App\Module\UrsPromotion\Commands;
+
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\DB;
+
+/**
+ * URS推广模块后台菜单配置命令
+ * 
+ * 用于配置URS推广模块的后台管理菜单
+ */
+class InsertUrsPromotionAdminMenuCommand extends Command
+{
+    /**
+     * 命令签名
+     */
+    protected $signature = 'urs:insert-admin-menu {--force : 强制重新创建菜单}';
+
+    /**
+     * 命令描述
+     */
+    protected $description = '配置URS推广模块后台管理菜单';
+
+    /**
+     * 执行命令
+     */
+    public function handle()
+    {
+        $this->info('开始配置URS推广模块后台管理菜单...');
+        
+        // 检查是否强制重新创建
+        $force = $this->option('force');
+        
+        // 检查菜单是否已存在
+        $existingMenu = DB::table('admin_menu')->where('title', 'URS推广管理')->first();
+        if ($existingMenu && !$force) {
+            $this->warn('URS推广管理菜单已存在,使用 --force 参数强制重新创建');
+            return;
+        }
+        
+        if ($existingMenu && $force) {
+            $this->info('删除现有菜单...');
+            $this->deleteExistingMenus();
+        }
+        
+        // 创建菜单
+        $this->createMenus();
+        
+        $this->info('URS推广模块后台管理菜单配置完成!');
+    }
+    
+    /**
+     * 删除现有菜单
+     */
+    private function deleteExistingMenus(): void
+    {
+        // 删除URS推广相关的所有菜单
+        DB::table('admin_menu')->where('title', 'like', '%URS%')->delete();
+    }
+    
+    /**
+     * 创建菜单
+     */
+    private function createMenus(): void
+    {
+        // 获取下一个可用的order值
+        $maxOrder = DB::table('admin_menu')->max('order') ?? 0;
+        
+        // 1. 创建一级菜单:URS推广管理
+        $parentId = DB::table('admin_menu')->insertGetId([
+            'parent_id' => 0,
+            'order' => $maxOrder + 1,
+            'title' => 'URS推广管理',
+            'icon' => 'fa-users',
+            'uri' => '',
+            'permission' => '',
+            'created_at' => now(),
+            'updated_at' => now(),
+        ]);
+        
+        $this->info("创建一级菜单:URS推广管理 (ID: {$parentId})");
+        
+        // 2. 创建二级菜单
+        $menus = [
+            [
+                'title' => 'URS推荐关系',
+                'icon' => 'fa-link',
+                'uri' => 'urs-promotion/user-referrals',
+                'permission' => '',
+            ],
+            [
+                'title' => 'URS达人等级',
+                'icon' => 'fa-star',
+                'uri' => 'urs-promotion/user-talents',
+                'permission' => '',
+            ],
+            [
+                'title' => 'URS收益记录',
+                'icon' => 'fa-money',
+                'uri' => 'urs-promotion/profits',
+                'permission' => '',
+            ],
+            [
+                'title' => 'URS等级配置',
+                'icon' => 'fa-cog',
+                'uri' => 'urs-promotion/talent-configs',
+                'permission' => '',
+            ],
+        ];
+        
+        foreach ($menus as $index => $menu) {
+            $menuId = DB::table('admin_menu')->insertGetId([
+                'parent_id' => $parentId,
+                'order' => $maxOrder + 2 + $index,
+                'title' => $menu['title'],
+                'icon' => $menu['icon'],
+                'uri' => $menu['uri'],
+                'permission' => $menu['permission'],
+                'created_at' => now(),
+                'updated_at' => now(),
+            ]);
+            
+            $this->info("创建二级菜单:{$menu['title']} (ID: {$menuId})");
+        }
+    }
+}

+ 3 - 1
app/Module/UrsPromotion/Commands/TestUrsProfitCommand.php

@@ -69,7 +69,9 @@ class TestUrsProfitCommand extends Command
         } else {
             $this->info("成功分成给 " . count($profits) . " 个用户:");
             foreach ($profits as $profit) {
-                $this->line("- 用户{$profit->user_id}: {$profit->profit_amount} ({$profit->profit_rate * 100}%, {$profit->getRelationLevelName()})");
+                $rate = round($profit->profit_rate * 100, 2);
+                $levelName = $profit->getRelationLevelName();
+                $this->line("- 用户{$profit->user_id}: {$profit->profit_amount} ({$rate}%, {$levelName})");
             }
         }
         

+ 219 - 0
app/Module/UrsPromotion/Commands/UrsPromotionIntegrationTestCommand.php

@@ -0,0 +1,219 @@
+<?php
+
+namespace App\Module\UrsPromotion\Commands;
+
+use Illuminate\Console\Command;
+use App\Module\UrsPromotion\Services\UrsProfitService;
+use App\Module\UrsPromotion\Services\UrsTalentService;
+use App\Module\UrsPromotion\Models\UrsUserReferral;
+use App\Module\UrsPromotion\Models\UrsUserTalent;
+use App\Module\UrsPromotion\Models\UrsProfit;
+use App\Module\UrsPromotion\Models\UrsTalentConfig;
+use Illuminate\Support\Facades\DB;
+
+/**
+ * URS推广模块集成测试命令
+ * 
+ * 用于全面测试URS推广系统的各项功能
+ */
+class UrsPromotionIntegrationTestCommand extends Command
+{
+    /**
+     * 命令签名
+     */
+    protected $signature = 'urs:integration-test {--reset : 重置测试数据}';
+
+    /**
+     * 命令描述
+     */
+    protected $description = 'URS推广模块集成测试';
+
+    /**
+     * 执行命令
+     */
+    public function handle()
+    {
+        $this->info('开始URS推广模块集成测试...');
+        $this->line('');
+        
+        // 检查是否重置数据
+        if ($this->option('reset')) {
+            $this->resetTestData();
+        }
+        
+        // 1. 测试达人等级配置
+        $this->testTalentConfigs();
+        
+        // 2. 测试推荐关系
+        $this->testReferralRelations();
+        
+        // 3. 测试达人等级计算
+        $this->testTalentLevelCalculation();
+        
+        // 4. 测试收益分成
+        $this->testProfitDistribution();
+        
+        // 5. 测试统计功能
+        $this->testStatistics();
+        
+        $this->line('');
+        $this->info('URS推广模块集成测试完成!');
+    }
+    
+    /**
+     * 重置测试数据
+     */
+    private function resetTestData(): void
+    {
+        $this->warn('重置测试数据...');
+        
+        // 清空测试数据(保留配置)
+        UrsProfit::where('source_type', 'like', 'test_%')->delete();
+        UrsUserTalent::whereIn('user_id', [2001, 2002, 2003, 2004, 2005])->delete();
+        UrsUserReferral::whereIn('user_id', [2001, 2002, 2003, 2004, 2005])->delete();
+        
+        $this->info('测试数据重置完成');
+        $this->line('');
+    }
+    
+    /**
+     * 测试达人等级配置
+     */
+    private function testTalentConfigs(): void
+    {
+        $this->info('=== 测试达人等级配置 ===');
+        
+        $configs = UrsTalentService::getTalentConfigs();
+        $this->line('达人等级配置数量: ' . count($configs));
+        
+        foreach ($configs as $config) {
+            $this->line("等级{$config['level']}: {$config['name']} (直推{$config['direct_count_required']}人, 团队{$config['promotion_count_required']}人)");
+        }
+        
+        $this->line('');
+    }
+    
+    /**
+     * 测试推荐关系
+     */
+    private function testReferralRelations(): void
+    {
+        $this->info('=== 测试推荐关系 ===');
+        
+        // 创建测试推荐关系: 2001 -> 2002 -> 2003 -> 2004
+        $referrals = [
+            ['user_id' => 2002, 'referrer_id' => 2001, 'referral_code' => 'TEST2001'],
+            ['user_id' => 2003, 'referrer_id' => 2002, 'referral_code' => 'TEST2002'],
+            ['user_id' => 2004, 'referrer_id' => 2003, 'referral_code' => 'TEST2003'],
+            ['user_id' => 2005, 'referrer_id' => 2001, 'referral_code' => 'TEST2001'], // 2001的另一个直推
+        ];
+        
+        foreach ($referrals as $referral) {
+            UrsUserReferral::updateOrCreate(
+                ['user_id' => $referral['user_id']],
+                array_merge($referral, [
+                    'referral_time' => now(),
+                    'status' => UrsUserReferral::STATUS_VALID,
+                ])
+            );
+            $this->line("创建推荐关系: 用户{$referral['user_id']} <- 用户{$referral['referrer_id']}");
+        }
+        
+        $this->line('');
+    }
+    
+    /**
+     * 测试达人等级计算
+     */
+    private function testTalentLevelCalculation(): void
+    {
+        $this->info('=== 测试达人等级计算 ===');
+        
+        // 更新用户2001的达人等级
+        $talent = UrsTalentService::updateUserTalent(2001);
+        if ($talent) {
+            $this->line("用户2001达人等级: {$talent->getTalentLevelName()}");
+            $this->line("直推: {$talent->direct_count}, 间推: {$talent->indirect_count}, 三推: {$talent->third_count}, 总计: {$talent->promotion_count}");
+        }
+        
+        // 显示推荐关系树
+        $tree = UrsTalentService::getUserReferralTree(2001);
+        $this->line('推荐关系树:');
+        $this->line("  直推: " . count($tree['direct']) . "人");
+        $this->line("  间推: " . count($tree['indirect']) . "人");
+        $this->line("  三推: " . count($tree['third']) . "人");
+        
+        $this->line('');
+    }
+    
+    /**
+     * 测试收益分成
+     */
+    private function testProfitDistribution(): void
+    {
+        $this->info('=== 测试收益分成 ===');
+        
+        // 测试推广收益分成
+        $this->line('测试推广收益分成 (用户2005进入农场, 奖励500金币):');
+        $profits = UrsProfitService::distributePromotionReward(2005, 'test_farm_enter', 12345, '500');
+        $this->displayProfits($profits);
+        
+        // 测试种植收益分成
+        $this->line('测试种植收益分成 (用户2004收获作物, 奖励1000金币):');
+        $profits = UrsProfitService::distributePlantingReward(2004, 'test_farm_harvest', 67890, '1000');
+        $this->displayProfits($profits);
+        
+        $this->line('');
+    }
+    
+    /**
+     * 测试统计功能
+     */
+    private function testStatistics(): void
+    {
+        $this->info('=== 测试统计功能 ===');
+        
+        // 获取用户2001的收益统计
+        $stats = UrsProfitService::getUserProfitStats(2001);
+        $this->line("用户2001总收益: {$stats['total_amount']} (共{$stats['total_count']}笔)");
+        
+        if (!empty($stats['by_type'])) {
+            foreach ($stats['by_type'] as $type => $data) {
+                $typeName = $type === 'promotion_reward' ? '推广收益' : '种植收益';
+                $this->line("  {$typeName}: {$data['amount']} (共{$data['count']}笔)");
+            }
+        }
+        
+        if (!empty($stats['by_level'])) {
+            foreach ($stats['by_level'] as $level => $data) {
+                $levelName = match($level) {
+                    1 => '直推',
+                    2 => '间推',
+                    3 => '三推',
+                    default => "层级{$level}",
+                };
+                $this->line("  {$levelName}: {$data['amount']} (共{$data['count']}笔)");
+            }
+        }
+        
+        $this->line('');
+    }
+    
+    /**
+     * 显示收益分成结果
+     */
+    private function displayProfits(array $profits): void
+    {
+        if (empty($profits)) {
+            $this->line('  无收益分成');
+            return;
+        }
+        
+        foreach ($profits as $profit) {
+            $rate = round($profit->profit_rate * 100, 2);
+            $levelName = $profit->getRelationLevelName();
+            $typeName = $profit->getProfitTypeName();
+            $this->line("  用户{$profit->user_id}: {$profit->profit_amount} ({$rate}%, {$levelName}, {$typeName})");
+        }
+    }
+}

+ 359 - 0
app/Module/UrsPromotion/Controllers/UrsPromotionApiController.php

@@ -0,0 +1,359 @@
+<?php
+
+namespace App\Module\UrsPromotion\Controllers;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\JsonResponse;
+use App\Module\UrsPromotion\Services\UrsProfitService;
+use App\Module\UrsPromotion\Services\UrsTalentService;
+use App\Module\UrsPromotion\Models\UrsUserReferral;
+use App\Module\UrsPromotion\Models\UrsUserTalent;
+use App\Module\UrsPromotion\Models\UrsTalentConfig;
+use Illuminate\Support\Facades\Validator;
+use Illuminate\Support\Facades\Log;
+
+/**
+ * URS推广模块API控制器
+ * 
+ * 提供URS推广系统的对外API接口
+ */
+class UrsPromotionApiController
+{
+    /**
+     * 获取用户的达人信息
+     * 
+     * @param Request $request
+     * @return JsonResponse
+     */
+    public function getUserTalent(Request $request): JsonResponse
+    {
+        $validator = Validator::make($request->all(), [
+            'user_id' => 'required|integer|min:1',
+        ]);
+
+        if ($validator->fails()) {
+            return response()->json([
+                'code' => 400,
+                'message' => '参数错误',
+                'errors' => $validator->errors(),
+            ], 400);
+        }
+
+        try {
+            $userId = $request->input('user_id');
+            $stats = UrsTalentService::getUserTeamStats($userId);
+            
+            return response()->json([
+                'code' => 200,
+                'message' => '获取成功',
+                'data' => $stats,
+            ]);
+            
+        } catch (\Exception $e) {
+            Log::error('获取用户达人信息失败', [
+                'user_id' => $request->input('user_id'),
+                'error' => $e->getMessage(),
+            ]);
+            
+            return response()->json([
+                'code' => 500,
+                'message' => '服务器内部错误',
+            ], 500);
+        }
+    }
+
+    /**
+     * 获取用户的推荐关系树
+     * 
+     * @param Request $request
+     * @return JsonResponse
+     */
+    public function getUserReferralTree(Request $request): JsonResponse
+    {
+        $validator = Validator::make($request->all(), [
+            'user_id' => 'required|integer|min:1',
+        ]);
+
+        if ($validator->fails()) {
+            return response()->json([
+                'code' => 400,
+                'message' => '参数错误',
+                'errors' => $validator->errors(),
+            ], 400);
+        }
+
+        try {
+            $userId = $request->input('user_id');
+            $tree = UrsTalentService::getUserReferralTree($userId);
+            
+            return response()->json([
+                'code' => 200,
+                'message' => '获取成功',
+                'data' => $tree,
+            ]);
+            
+        } catch (\Exception $e) {
+            Log::error('获取用户推荐关系树失败', [
+                'user_id' => $request->input('user_id'),
+                'error' => $e->getMessage(),
+            ]);
+            
+            return response()->json([
+                'code' => 500,
+                'message' => '服务器内部错误',
+            ], 500);
+        }
+    }
+
+    /**
+     * 获取用户的收益统计
+     * 
+     * @param Request $request
+     * @return JsonResponse
+     */
+    public function getUserProfitStats(Request $request): JsonResponse
+    {
+        $validator = Validator::make($request->all(), [
+            'user_id' => 'required|integer|min:1',
+            'profit_type' => 'nullable|string|in:promotion_reward,planting_reward',
+            'start_date' => 'nullable|date',
+            'end_date' => 'nullable|date|after_or_equal:start_date',
+        ]);
+
+        if ($validator->fails()) {
+            return response()->json([
+                'code' => 400,
+                'message' => '参数错误',
+                'errors' => $validator->errors(),
+            ], 400);
+        }
+
+        try {
+            $userId = $request->input('user_id');
+            $profitType = $request->input('profit_type');
+            $startDate = $request->input('start_date');
+            $endDate = $request->input('end_date');
+            
+            $stats = UrsProfitService::getUserProfitStats($userId, $profitType, $startDate, $endDate);
+            
+            return response()->json([
+                'code' => 200,
+                'message' => '获取成功',
+                'data' => $stats,
+            ]);
+            
+        } catch (\Exception $e) {
+            Log::error('获取用户收益统计失败', [
+                'user_id' => $request->input('user_id'),
+                'error' => $e->getMessage(),
+            ]);
+            
+            return response()->json([
+                'code' => 500,
+                'message' => '服务器内部错误',
+            ], 500);
+        }
+    }
+
+    /**
+     * 分发推广收益
+     * 
+     * @param Request $request
+     * @return JsonResponse
+     */
+    public function distributePromotionReward(Request $request): JsonResponse
+    {
+        $validator = Validator::make($request->all(), [
+            'user_id' => 'required|integer|min:1',
+            'source_type' => 'required|string|max:32',
+            'source_id' => 'required|integer|min:1',
+            'original_amount' => 'required|numeric|min:0',
+        ]);
+
+        if ($validator->fails()) {
+            return response()->json([
+                'code' => 400,
+                'message' => '参数错误',
+                'errors' => $validator->errors(),
+            ], 400);
+        }
+
+        try {
+            $userId = $request->input('user_id');
+            $sourceType = $request->input('source_type');
+            $sourceId = $request->input('source_id');
+            $originalAmount = $request->input('original_amount');
+            
+            $profits = UrsProfitService::distributePromotionReward(
+                $userId,
+                $sourceType,
+                $sourceId,
+                (string)$originalAmount
+            );
+            
+            return response()->json([
+                'code' => 200,
+                'message' => '分发成功',
+                'data' => [
+                    'profit_count' => count($profits),
+                    'profits' => $profits,
+                ],
+            ]);
+            
+        } catch (\Exception $e) {
+            Log::error('分发推广收益失败', [
+                'user_id' => $request->input('user_id'),
+                'error' => $e->getMessage(),
+            ]);
+            
+            return response()->json([
+                'code' => 500,
+                'message' => '服务器内部错误',
+            ], 500);
+        }
+    }
+
+    /**
+     * 分发种植收益
+     * 
+     * @param Request $request
+     * @return JsonResponse
+     */
+    public function distributePlantingReward(Request $request): JsonResponse
+    {
+        $validator = Validator::make($request->all(), [
+            'user_id' => 'required|integer|min:1',
+            'source_type' => 'required|string|max:32',
+            'source_id' => 'required|integer|min:1',
+            'original_amount' => 'required|numeric|min:0',
+        ]);
+
+        if ($validator->fails()) {
+            return response()->json([
+                'code' => 400,
+                'message' => '参数错误',
+                'errors' => $validator->errors(),
+            ], 400);
+        }
+
+        try {
+            $userId = $request->input('user_id');
+            $sourceType = $request->input('source_type');
+            $sourceId = $request->input('source_id');
+            $originalAmount = $request->input('original_amount');
+            
+            $profits = UrsProfitService::distributePlantingReward(
+                $userId,
+                $sourceType,
+                $sourceId,
+                (string)$originalAmount
+            );
+            
+            return response()->json([
+                'code' => 200,
+                'message' => '分发成功',
+                'data' => [
+                    'profit_count' => count($profits),
+                    'profits' => $profits,
+                ],
+            ]);
+            
+        } catch (\Exception $e) {
+            Log::error('分发种植收益失败', [
+                'user_id' => $request->input('user_id'),
+                'error' => $e->getMessage(),
+            ]);
+            
+            return response()->json([
+                'code' => 500,
+                'message' => '服务器内部错误',
+            ], 500);
+        }
+    }
+
+    /**
+     * 更新用户达人等级
+     * 
+     * @param Request $request
+     * @return JsonResponse
+     */
+    public function updateUserTalent(Request $request): JsonResponse
+    {
+        $validator = Validator::make($request->all(), [
+            'user_id' => 'required|integer|min:1',
+        ]);
+
+        if ($validator->fails()) {
+            return response()->json([
+                'code' => 400,
+                'message' => '参数错误',
+                'errors' => $validator->errors(),
+            ], 400);
+        }
+
+        try {
+            $userId = $request->input('user_id');
+            $talent = UrsTalentService::updateUserTalent($userId);
+            
+            if ($talent) {
+                return response()->json([
+                    'code' => 200,
+                    'message' => '更新成功',
+                    'data' => [
+                        'user_id' => $talent->user_id,
+                        'talent_level' => $talent->talent_level,
+                        'talent_level_name' => $talent->getTalentLevelName(),
+                        'direct_count' => $talent->direct_count,
+                        'indirect_count' => $talent->indirect_count,
+                        'third_count' => $talent->third_count,
+                        'promotion_count' => $talent->promotion_count,
+                    ],
+                ]);
+            } else {
+                return response()->json([
+                    'code' => 500,
+                    'message' => '更新失败',
+                ], 500);
+            }
+            
+        } catch (\Exception $e) {
+            Log::error('更新用户达人等级失败', [
+                'user_id' => $request->input('user_id'),
+                'error' => $e->getMessage(),
+            ]);
+            
+            return response()->json([
+                'code' => 500,
+                'message' => '服务器内部错误',
+            ], 500);
+        }
+    }
+
+    /**
+     * 获取达人等级配置列表
+     * 
+     * @return JsonResponse
+     */
+    public function getTalentConfigs(): JsonResponse
+    {
+        try {
+            $configs = UrsTalentService::getTalentConfigs();
+            
+            return response()->json([
+                'code' => 200,
+                'message' => '获取成功',
+                'data' => $configs,
+            ]);
+            
+        } catch (\Exception $e) {
+            Log::error('获取达人等级配置失败', [
+                'error' => $e->getMessage(),
+            ]);
+            
+            return response()->json([
+                'code' => 500,
+                'message' => '服务器内部错误',
+            ], 500);
+        }
+    }
+}

+ 28 - 0
app/Module/UrsPromotion/Events/UrsProfitGeneratedEvent.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Module\UrsPromotion\Events;
+
+use Illuminate\Foundation\Events\Dispatchable;
+use Illuminate\Queue\SerializesModels;
+use App\Module\UrsPromotion\Models\UrsProfit;
+
+/**
+ * URS团队收益生成事件
+ */
+class UrsProfitGeneratedEvent
+{
+    use Dispatchable, SerializesModels;
+
+    /**
+     * 收益记录
+     */
+    public UrsProfit $profit;
+
+    /**
+     * 创建事件实例
+     */
+    public function __construct(UrsProfit $profit)
+    {
+        $this->profit = $profit;
+    }
+}

+ 39 - 0
app/Module/UrsPromotion/Events/UrsReferralCreatedEvent.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Module\UrsPromotion\Events;
+
+use Illuminate\Foundation\Events\Dispatchable;
+use Illuminate\Queue\SerializesModels;
+
+/**
+ * URS推荐关系创建事件
+ */
+class UrsReferralCreatedEvent
+{
+    use Dispatchable, SerializesModels;
+
+    /**
+     * 用户ID
+     */
+    public int $userId;
+
+    /**
+     * 推荐人ID
+     */
+    public int $referrerId;
+
+    /**
+     * 推荐码
+     */
+    public ?string $referralCode;
+
+    /**
+     * 创建事件实例
+     */
+    public function __construct(int $userId, int $referrerId, ?string $referralCode = null)
+    {
+        $this->userId = $userId;
+        $this->referrerId = $referrerId;
+        $this->referralCode = $referralCode;
+    }
+}

+ 51 - 0
app/Module/UrsPromotion/Events/UrsTalentLevelUpEvent.php

@@ -0,0 +1,51 @@
+<?php
+
+namespace App\Module\UrsPromotion\Events;
+
+use Illuminate\Foundation\Events\Dispatchable;
+use Illuminate\Queue\SerializesModels;
+
+/**
+ * URS达人等级提升事件
+ */
+class UrsTalentLevelUpEvent
+{
+    use Dispatchable, SerializesModels;
+
+    /**
+     * 用户ID
+     */
+    public int $userId;
+
+    /**
+     * 旧等级
+     */
+    public int $oldLevel;
+
+    /**
+     * 新等级
+     */
+    public int $newLevel;
+
+    /**
+     * 直推人数
+     */
+    public int $directCount;
+
+    /**
+     * 团队总人数
+     */
+    public int $promotionCount;
+
+    /**
+     * 创建事件实例
+     */
+    public function __construct(int $userId, int $oldLevel, int $newLevel, int $directCount, int $promotionCount)
+    {
+        $this->userId = $userId;
+        $this->oldLevel = $oldLevel;
+        $this->newLevel = $newLevel;
+        $this->directCount = $directCount;
+        $this->promotionCount = $promotionCount;
+    }
+}

+ 48 - 0
app/Module/UrsPromotion/Listeners/UrsProfitGeneratedListener.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace App\Module\UrsPromotion\Listeners;
+
+use App\Module\UrsPromotion\Events\UrsProfitGeneratedEvent;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Support\Facades\Log;
+
+/**
+ * URS团队收益生成监听器
+ */
+class UrsProfitGeneratedListener implements ShouldQueue
+{
+    use InteractsWithQueue;
+
+    /**
+     * 处理事件
+     */
+    public function handle(UrsProfitGeneratedEvent $event): void
+    {
+        try {
+            $profit = $event->profit;
+            
+            // 记录收益生成日志
+            Log::info('URS团队收益生成', [
+                'profit_id' => $profit->id,
+                'user_id' => $profit->user_id,
+                'promotion_member_id' => $profit->promotion_member_id,
+                'profit_type' => $profit->profit_type,
+                'relation_level' => $profit->relation_level,
+                'profit_amount' => $profit->profit_amount,
+                'talent_level' => $profit->talent_level,
+            ]);
+            
+            // 这里可以添加其他业务逻辑,比如:
+            // - 发送收益通知给用户
+            // - 更新用户总收益统计
+            // - 触发其他相关业务
+            
+        } catch (\Exception $e) {
+            Log::error('URS团队收益生成监听器处理失败', [
+                'profit_id' => $event->profit->id ?? null,
+                'error' => $e->getMessage(),
+            ]);
+        }
+    }
+}

+ 42 - 0
app/Module/UrsPromotion/Listeners/UrsReferralCreatedListener.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Module\UrsPromotion\Listeners;
+
+use App\Module\UrsPromotion\Events\UrsReferralCreatedEvent;
+use App\Module\UrsPromotion\Services\UrsTalentService;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Support\Facades\Log;
+
+/**
+ * URS推荐关系创建监听器
+ */
+class UrsReferralCreatedListener implements ShouldQueue
+{
+    use InteractsWithQueue;
+
+    /**
+     * 处理事件
+     */
+    public function handle(UrsReferralCreatedEvent $event): void
+    {
+        try {
+            // 更新推荐人的达人等级
+            UrsTalentService::updateUserTalent($event->referrerId);
+            
+            // 记录日志
+            Log::info('URS推荐关系创建,更新推荐人达人等级', [
+                'user_id' => $event->userId,
+                'referrer_id' => $event->referrerId,
+                'referral_code' => $event->referralCode,
+            ]);
+            
+        } catch (\Exception $e) {
+            Log::error('URS推荐关系创建监听器处理失败', [
+                'user_id' => $event->userId,
+                'referrer_id' => $event->referrerId,
+                'error' => $e->getMessage(),
+            ]);
+        }
+    }
+}

+ 44 - 0
app/Module/UrsPromotion/Listeners/UrsTalentLevelUpListener.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Module\UrsPromotion\Listeners;
+
+use App\Module\UrsPromotion\Events\UrsTalentLevelUpEvent;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Support\Facades\Log;
+
+/**
+ * URS达人等级提升监听器
+ */
+class UrsTalentLevelUpListener implements ShouldQueue
+{
+    use InteractsWithQueue;
+
+    /**
+     * 处理事件
+     */
+    public function handle(UrsTalentLevelUpEvent $event): void
+    {
+        try {
+            // 记录达人等级提升日志
+            Log::info('URS达人等级提升', [
+                'user_id' => $event->userId,
+                'old_level' => $event->oldLevel,
+                'new_level' => $event->newLevel,
+                'direct_count' => $event->directCount,
+                'promotion_count' => $event->promotionCount,
+            ]);
+            
+            // 这里可以添加其他业务逻辑,比如:
+            // - 发送通知给用户
+            // - 发放升级奖励
+            // - 更新用户权益
+            
+        } catch (\Exception $e) {
+            Log::error('URS达人等级提升监听器处理失败', [
+                'user_id' => $event->userId,
+                'error' => $e->getMessage(),
+            ]);
+        }
+    }
+}

+ 1 - 1
app/Module/UrsPromotion/Models/UrsProfit.php

@@ -4,7 +4,7 @@ namespace App\Module\UrsPromotion\Models;
 
 use UCore\ModelCore;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
-use App\Models\User;
+use App\Module\User\Models\User;
 use App\Module\UrsPromotion\Enums\UrsProfitType;
 use App\Module\UrsPromotion\Enums\UrsPromotionRelationLevel;
 use App\Module\UrsPromotion\Enums\UrsTalentLevel;

+ 1 - 1
app/Module/UrsPromotion/Models/UrsUserReferral.php

@@ -4,7 +4,7 @@ namespace App\Module\UrsPromotion\Models;
 
 use UCore\ModelCore;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
-use App\Models\User;
+use App\Module\User\Models\User;
 
 /**
  * URS用户推荐关系模型

+ 1 - 1
app/Module/UrsPromotion/Models/UrsUserTalent.php

@@ -4,7 +4,7 @@ namespace App\Module\UrsPromotion\Models;
 
 use UCore\ModelCore;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
-use App\Models\User;
+use App\Module\User\Models\User;
 use App\Module\UrsPromotion\Enums\UrsTalentLevel;
 
 /**

+ 64 - 0
app/Module/UrsPromotion/Providers/UrsPromotionServiceProvider.php

@@ -0,0 +1,64 @@
+<?php
+
+namespace App\Module\UrsPromotion\Providers;
+
+use Illuminate\Support\ServiceProvider;
+use Illuminate\Console\Scheduling\Schedule;
+
+/**
+ * URS推广模块服务提供者
+ */
+class UrsPromotionServiceProvider extends ServiceProvider
+{
+    /**
+     * 注册服务
+     */
+    public function register(): void
+    {
+        // 注册命令
+        if ($this->app->runningInConsole()) {
+            $this->commands([
+                \App\Module\UrsPromotion\Commands\TestUrsProfitCommand::class,
+                \App\Module\UrsPromotion\Commands\TestUrsTalentCommand::class,
+                \App\Module\UrsPromotion\Commands\InsertUrsPromotionAdminMenuCommand::class,
+                \App\Module\UrsPromotion\Commands\UrsPromotionIntegrationTestCommand::class,
+            ]);
+        }
+    }
+
+    /**
+     * 启动服务
+     */
+    public function boot(): void
+    {
+        // 注册路由
+        $this->loadRoutes();
+
+        // 注册定时任务
+        $this->app->booted(function () {
+            $schedule = $this->app->make(Schedule::class);
+
+            // 每小时更新一次达人等级
+            $schedule->command('urs:update-talents')->hourly();
+
+            // 每天清理过期数据
+            $schedule->command('urs:clean-data')->daily();
+        });
+    }
+
+    /**
+     * 加载路由
+     */
+    private function loadRoutes(): void
+    {
+        // 加载API路由
+        if (file_exists(__DIR__ . '/../Routes/api.php')) {
+            require __DIR__ . '/../Routes/api.php';
+        }
+
+        // 加载后台管理路由
+        if (file_exists(__DIR__ . '/../Routes/admin.php')) {
+            require __DIR__ . '/../Routes/admin.php';
+        }
+    }
+}

+ 34 - 0
app/Module/UrsPromotion/Routes/admin.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Support\Facades\Route;
+use App\Module\UrsPromotion\AdminControllers\UrsUserReferralController;
+use App\Module\UrsPromotion\AdminControllers\UrsUserTalentController;
+use App\Module\UrsPromotion\AdminControllers\UrsProfitController;
+use App\Module\UrsPromotion\AdminControllers\UrsTalentConfigController;
+
+/*
+|--------------------------------------------------------------------------
+| URS推广模块后台管理路由
+|--------------------------------------------------------------------------
+|
+| 这里定义URS推广模块的后台管理路由
+|
+*/
+
+Route::prefix('admin')->middleware(['admin'])->group(function () {
+    
+    // URS用户推荐关系管理
+    Route::resource('urs-promotion/user-referrals', UrsUserReferralController::class);
+    
+    // URS用户达人等级管理
+    Route::resource('urs-promotion/user-talents', UrsUserTalentController::class);
+    Route::post('urs-promotion/user-talents/{id}/update-talent', [UrsUserTalentController::class, 'updateTalent']);
+    Route::post('urs-promotion/user-talents/update-all', [UrsUserTalentController::class, 'updateAllTalents']);
+    
+    // URS团队收益记录管理
+    Route::resource('urs-promotion/profits', UrsProfitController::class);
+    
+    // URS达人等级配置管理
+    Route::resource('urs-promotion/talent-configs', UrsTalentConfigController::class);
+    
+});

+ 38 - 0
app/Module/UrsPromotion/Routes/api.php

@@ -0,0 +1,38 @@
+<?php
+
+use Illuminate\Support\Facades\Route;
+use App\Module\UrsPromotion\Controllers\UrsPromotionApiController;
+
+/*
+|--------------------------------------------------------------------------
+| URS推广模块API路由
+|--------------------------------------------------------------------------
+|
+| 这里定义URS推广模块的API路由
+|
+*/
+
+Route::prefix('api/urs-promotion')->group(function () {
+    
+    // 获取用户达人信息
+    Route::get('/user/talent', [UrsPromotionApiController::class, 'getUserTalent']);
+    
+    // 获取用户推荐关系树
+    Route::get('/user/referral-tree', [UrsPromotionApiController::class, 'getUserReferralTree']);
+    
+    // 获取用户收益统计
+    Route::get('/user/profit-stats', [UrsPromotionApiController::class, 'getUserProfitStats']);
+    
+    // 分发推广收益
+    Route::post('/profit/promotion-reward', [UrsPromotionApiController::class, 'distributePromotionReward']);
+    
+    // 分发种植收益
+    Route::post('/profit/planting-reward', [UrsPromotionApiController::class, 'distributePlantingReward']);
+    
+    // 更新用户达人等级
+    Route::post('/user/update-talent', [UrsPromotionApiController::class, 'updateUserTalent']);
+    
+    // 获取达人等级配置
+    Route::get('/talent-configs', [UrsPromotionApiController::class, 'getTalentConfigs']);
+    
+});

+ 3 - 0
config/app.php

@@ -223,6 +223,9 @@ return [
         // ThirdParty 模块
         \App\Module\ThirdParty\Providers\ThirdPartyServiceProvider::class,
 
+        // UrsPromotion 模块
+        \App\Module\UrsPromotion\Providers\UrsPromotionServiceProvider::class,
+
         // ThirdParty 包
         \ThirdParty\Urs\UrsServiceProvider::class,