소스 검색

初始化项目

Working 8 달 전
커밋
e20dbd3998
100개의 변경된 파일12372개의 추가작업 그리고 0개의 파일을 삭제
  1. 18 0
      .editorconfig
  2. 69 0
      .env
  3. 52 0
      .env.example
  4. 10 0
      .gitattributes
  5. 34 0
      .gitignore
  6. 12 0
      .styleci.yml
  7. 1 0
      .well-known/acme-challenge/RFQo-uJgNIjtMaNrs12NxvynHH4l4U8dFtWKA8_BAUg
  8. 64 0
      README.md
  9. 57 0
      app/Admin/Controllers/AdminRoleUserController.php
  10. 108 0
      app/Admin/Controllers/AnchorController.php
  11. 9 0
      app/Admin/Controllers/AuthController.php
  12. 30 0
      app/Admin/Controllers/HomeController.php
  13. 36 0
      app/Admin/Http/Controllers/TestController.php
  14. 107 0
      app/Admin/Http/Logics/AppUserLogic.php
  15. 46 0
      app/Admin/Http/Logics/SmsLogic.php
  16. 127 0
      app/Admin/Metrics/Charts/Orders.php
  17. 115 0
      app/Admin/Metrics/Charts/Test.php
  18. 100 0
      app/Admin/Metrics/Examples/NewDevices.php
  19. 108 0
      app/Admin/Metrics/Examples/NewUsers.php
  20. 114 0
      app/Admin/Metrics/Examples/ProductOrders.php
  21. 117 0
      app/Admin/Metrics/Examples/Sessions.php
  22. 116 0
      app/Admin/Metrics/Examples/Tickets.php
  23. 129 0
      app/Admin/Metrics/Examples/TotalUsers.php
  24. 26 0
      app/Admin/bootstrap.php
  25. 73 0
      app/Admin/routes.php
  26. 222 0
      app/Console/Commands/BroadbandOrder.php
  27. 46 0
      app/Console/Commands/CleanExpiredTokens.php
  28. 33 0
      app/Console/Commands/LandingOrderChoosePut.php
  29. 33 0
      app/Console/Commands/LandingOrderPut.php
  30. 33 0
      app/Console/Commands/LandingOrderSelect.php
  31. 33 0
      app/Console/Commands/LandingOrderSelectActive.php
  32. 33 0
      app/Console/Commands/LandingOrderSelectFirstCharge.php
  33. 33 0
      app/Console/Commands/LandingOrderSelnumPut.php
  34. 33 0
      app/Console/Commands/PackageDelistUpload.php
  35. 33 0
      app/Console/Commands/SelectGetpayRemit.php
  36. 32 0
      app/Console/Commands/VisitCountToDb.php
  37. 91 0
      app/Console/Commands/WorkermanCommand.php
  38. 44 0
      app/Console/Commands/payOrderClean.php
  39. 35 0
      app/Console/Commands/saveOnlineUserCount.php
  40. 42 0
      app/Console/Commands/sendIotPackageOrder.php
  41. 35 0
      app/Console/Commands/syncPackageInfo.php
  42. 35 0
      app/Console/Commands/syncRefundApplyStatus.php
  43. 32 0
      app/Console/Kernel.php
  44. 67 0
      app/DataApiNew/Api/ActivityLogApi.php
  45. 196 0
      app/DataApiNew/Api/AdminUsersApi.php
  46. 67 0
      app/DataApiNew/Api/AdminUsersMemberLevelApi.php
  47. 73 0
      app/DataApiNew/Api/AgentApiApi.php
  48. 133 0
      app/DataApiNew/Api/AgentPackageApi.php
  49. 115 0
      app/DataApiNew/Api/AgentPackageKdApi.php
  50. 67 0
      app/DataApiNew/Api/BlackListApi.php
  51. 79 0
      app/DataApiNew/Api/DyLiveApplyApi.php
  52. 38 0
      app/DataApiNew/Api/FileUploadApi.php
  53. 79 0
      app/DataApiNew/Api/GetPaysApi.php
  54. 67 0
      app/DataApiNew/Api/HkOrderYjrecordApi.php
  55. 79 0
      app/DataApiNew/Api/HotRefreshApi.php
  56. 67 0
      app/DataApiNew/Api/JkcCollegeApi.php
  57. 73 0
      app/DataApiNew/Api/LayerMangerApi.php
  58. 67 0
      app/DataApiNew/Api/LbsApi.php
  59. 73 0
      app/DataApiNew/Api/OrderSettRecordApi.php
  60. 93 0
      app/DataApiNew/Api/OrdersApi.php
  61. 92 0
      app/DataApiNew/Api/OrdersKdApi.php
  62. 67 0
      app/DataApiNew/Api/PackageMemberLevelRoyaltyApi.php
  63. 67 0
      app/DataApiNew/Api/PackagesApi.php
  64. 67 0
      app/DataApiNew/Api/PackagesKdApi.php
  65. 73 0
      app/DataApiNew/Api/PermissionsApi.php
  66. 43 0
      app/DataApiNew/Api/PlatformApiApi.php
  67. 85 0
      app/DataApiNew/Api/PostersApi.php
  68. 36 0
      app/DataApiNew/Api/PostersKdApi.php
  69. 78 0
      app/DataApiNew/Api/PostersQrcodeApi.php
  70. 79 0
      app/DataApiNew/Api/ProgramLiveApplyApi.php
  71. 67 0
      app/DataApiNew/Api/ProgramLivePackageApi.php
  72. 85 0
      app/DataApiNew/Api/RolesApi.php
  73. 67 0
      app/DataApiNew/Api/SuppliersApi.php
  74. 79 0
      app/DataApiNew/Api/SystemMsgApi.php
  75. 67 0
      app/DataApiNew/Api/SystemSettingApi.php
  76. 37 0
      app/DataApiNew/Api/TencentSmsApi.php
  77. 79 0
      app/DataApiNew/Api/UserShopSettingApi.php
  78. 67 0
      app/DataApiNew/Api/UserYjrecordApi.php
  79. 85 0
      app/DataApiNew/Api/WorkOrderApi.php
  80. 136 0
      app/DataApiNew/Helper/ActivityLogHelper.php
  81. 1027 0
      app/DataApiNew/Helper/AdminUsersHelper.php
  82. 153 0
      app/DataApiNew/Helper/AdminUsersMemberLevelHelper.php
  83. 258 0
      app/DataApiNew/Helper/AgentApiHelper.php
  84. 722 0
      app/DataApiNew/Helper/AgentPackageHelper.php
  85. 601 0
      app/DataApiNew/Helper/AgentPackageKdHelper.php
  86. 156 0
      app/DataApiNew/Helper/BlackListHelper.php
  87. 202 0
      app/DataApiNew/Helper/DyLiveApplyHelper.php
  88. 209 0
      app/DataApiNew/Helper/FileUploadHelper.php
  89. 355 0
      app/DataApiNew/Helper/GetPaysHelper.php
  90. 157 0
      app/DataApiNew/Helper/HkOrderYjrecordHelper.php
  91. 183 0
      app/DataApiNew/Helper/HotRefreshHelper.php
  92. 165 0
      app/DataApiNew/Helper/JkcCollegeHelper.php
  93. 169 0
      app/DataApiNew/Helper/LayerMangerHelper.php
  94. 162 0
      app/DataApiNew/Helper/LbsHelper.php
  95. 185 0
      app/DataApiNew/Helper/OrderSettRecordHelper.php
  96. 751 0
      app/DataApiNew/Helper/OrdersHelper.php
  97. 744 0
      app/DataApiNew/Helper/OrdersKdHelper.php
  98. 146 0
      app/DataApiNew/Helper/PackageMemberLevelRoyaltyHelper.php
  99. 299 0
      app/DataApiNew/Helper/PackagesHelper.php
  100. 283 0
      app/DataApiNew/Helper/PackagesKdHelper.php

+ 18 - 0
.editorconfig

@@ -0,0 +1,18 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+indent_style = space
+indent_size = 4
+trim_trailing_whitespace = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.{yml,yaml}]
+indent_size = 2
+
+[docker-compose.yml]
+indent_size = 4

+ 69 - 0
.env

@@ -0,0 +1,69 @@
+APP_NAME=Laravel
+APP_ENV=local
+APP_KEY=base64:hZPJKX6t6Kgldm+OB6reghb3T6BUr3U7IQsdM2cpXnY=
+APP_DEBUG=0
+APP_URL=http://saler.test
+ADMIN_HTTPS=0
+
+LOG_CHANNEL=stack
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=debug
+
+DB_CONNECTION=mysql
+DB_HOST=127.0.0.1
+DB_PORT=3306
+DB_DATABASE=saler_test
+DB_USERNAME=saler_test
+DB_PASSWORD=4Xp2tJnmPMSR
+
+
+BROADCAST_DRIVER=redis
+CACHE_DRIVER=file
+FILESYSTEM_DISK=local
+QUEUE_CONNECTION=redis
+REDIS_QUEUE=saler_queue
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+
+MEMCACHED_HOST=127.0.0.1
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=
+REDIS_PORT=6379
+
+MAIL_MAILER=smtp
+MAIL_HOST=mailhog
+MAIL_PORT=1025
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+MAIL_FROM_ADDRESS="hello@example.com"
+MAIL_FROM_NAME="${APP_NAME}"
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+AWS_USE_PATH_STYLE_ENDPOINT=false
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_APP_CLUSTER=mt1
+
+MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
+
+SYSTEM_OPERATION_PASSWORD=qwe333.3
+
+RSA_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----
+MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDyVLJUOya7ZbMQhAyWOnaQMYExkRoFxUNMkX6xgw5VZU1ldIQPuBDSzE67SnGTyfAIPSLNguHe6IOdKfGSBoM26Kx6Mn+DIhhkTKM7x1YZQV69+LQoywVxXzODqKo9ghmqRF5Voqp4hSQBCLqrAt+kUtH2n324iS5Ln/ZA/uqYivt5WLb5nVAybYimPD/vorNC7f9ccl0baMlK1+IX3aAkcBE5DRlsuSokoO/uu67STQW1YxxRZJQhi/lGGyEjZnKPyIWPA8rLaE2m6iWM5lANhu4U3DqyG+oqKhuuqHSPJ4u8QtIr2c67t3s/n7vjxC2XC4Ep1TzcEnxzA9wr8C7FAgMBAAECggEBAIpn036GVkXb/RzmvqWi+Iq8q5Ra0qkPFLQLuXe7aZlehYj3tmGf+IPdSu5vw1TsllquSE1mfoko9dry1NVZQOJAnBoi8287LwFCQEzpOgSssGcCQCu4YQBypmKBF9KPlwcHi3WPtZumN30btjnsJz2cS+13BIA8YaOx1h0jO2wpgJL45JMWWa1d8Sl6/YuYSg5sU6IVwvZneCX7INBoca9bJOuhY5SsXh+UWfJHWi+0PqiDLnNCuP8U4SK7OwJQrKcVnynd3w+XCrdi6xYoDJ94nyRY7VbrYsS58D36UtWBf3w96UQoVocmUuzDPmbSENFiJxlG7/3PTlcapUo2aoECgYEA/IAhseYr2akUm3IumgnsSvpWAuQtsPIjKDHva/64rHG9XO6BqtNrkKsYDA5GzPw0/Xkw2chkKLnOuAzhVQkZ16VLc7hjnvjibLQiqSOzrVaZucMWjWlnyuIQLxxTYLf5l1rE1NUmVUKIm3TG9wHFjmA0irigXV/aoIlZMYzwVWECgYEA9bB7rqKB1nq9yAk0USXtaTc2aQUCr+Tx5j7yMen/5zC/Itlmm6mIc+E26wo+CriQ3ZZU+CfAzlDZYhT7aVHXzDxG+7JGWg8zOWlAUZHA7X+KaD5EIwQS11M7ETzGugPWaYn6UR54sXvGtH4TM9ekxTQD6exm1rZSi3W4j6enL+UCgYEAhLWfgA32rB62ywCXR7TBcaLjQ//DmAWbvsuIB93IGDJrkYV1t2AJX+7c47E5OxGvlC13JG+zXMhTwt5aLERtRa8F2htmmK486189/GHcVNV4VG8Z0lc9CyAH24rqs6HeV9OIMkiZLiSbAgG9dSOEPtGHrAVfm9P+Z3Po4icuReECgYEA7VNfBeBAXzgNXs9VVBW48Wu+CVAnulUDPhAL0B9jbKVv3G/4Z+EpyBYDAKPSLnT+qq1uwo9T9XevpMjz2laOh+CqCLO6tX/9UTXURXbvz/rlbbDIDLMAqDLj2dDFfiX61dPMktNGbttLpEosrmVd6ohGR45uAHX54nECqPGf0+kCgYEAg8N44QksFOjC8zCf7No0qMecOX4ySCLIBV5IrwGd5icLw1xgvFJ2moW2v5a8GpTJf+g97zNp/m11xW3ags75Pud+nLPHu5wf6DzXMSn02B8oOycLm0S/XnN2j8JdgHgRXj4zwW3vjgzef67+XWPSLlHxBBemXunWt58hEQjt1hA=
+-----END PRIVATE KEY-----"
+
+RSA_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8lSyVDsmu2WzEIQMljp2kDGBMZEaBcVDTJF+sYMOVWVNZXSED7gQ0sxOu0pxk8nwCD0izYLh3uiDnSnxkgaDNuisejJ/gyIYZEyjO8dWGUFevfi0KMsFcV8zg6iqPYIZqkReVaKqeIUkAQi6qwLfpFLR9p99uIkuS5/2QP7qmIr7eVi2+Z1QMm2Ipjw/76KzQu3/XHJdG2jJStfiF92gJHAROQ0ZbLkqJKDv7ruu0k0FtWMcUWSUIYv5RhshI2Zyj8iFjwPKy2hNpuoljOZQDYbuFNw6shvqKiobrqh0jyeLvELSK9nOu7d7P5+748QtlwuBKdU83BJ8cwPcK/AuxQIDAQAB
+-----END PUBLIC KEY-----"
+
+SUP_USER_ROLENAME=超级管理员
+
+GETPAY_TAX=6

+ 52 - 0
.env.example

@@ -0,0 +1,52 @@
+APP_NAME=Laravel
+APP_ENV=local
+APP_KEY=
+APP_DEBUG=true
+APP_URL=http://localhost
+
+LOG_CHANNEL=stack
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=debug
+
+DB_CONNECTION=mysql
+DB_HOST=127.0.0.1
+DB_PORT=3306
+DB_DATABASE=laravel
+DB_USERNAME=root
+DB_PASSWORD=
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+FILESYSTEM_DISK=local
+QUEUE_CONNECTION=sync
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+
+MEMCACHED_HOST=127.0.0.1
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_MAILER=smtp
+MAIL_HOST=mailhog
+MAIL_PORT=1025
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+MAIL_FROM_ADDRESS="hello@example.com"
+MAIL_FROM_NAME="${APP_NAME}"
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+AWS_USE_PATH_STYLE_ENDPOINT=false
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_APP_CLUSTER=mt1
+
+MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

+ 10 - 0
.gitattributes

@@ -0,0 +1,10 @@
+* text=auto
+
+*.blade.php diff=html
+*.css diff=css
+*.html diff=html
+*.md diff=markdown
+*.php diff=php
+
+/.github export-ignore
+CHANGELOG.md export-ignore

+ 34 - 0
.gitignore

@@ -0,0 +1,34 @@
+/node_modules
+/public/hot
+/public/storage
+/storage/*.key
+/storage/logs
+/vendor
+.env.backup
+.phpunit.result.cache
+Homestead.json
+Homestead.yaml
+npm-debug.log
+yarn-error.log
+/.idea
+/.vscode
+
+/public/admin
+/public/alipay_aop
+/public/api_doc
+/public/appDownload
+/public/cos_file
+/public/css
+/public/csv
+/public/download_app
+/public/exports
+/public/img
+/public/js
+/public/phpqrcode
+/public/poster
+/public/recruitmentInvitation
+/public/share
+/public/shareStore
+/public/static
+
+/app/DataApiNew/Helper/TestHelper.php

+ 12 - 0
.styleci.yml

@@ -0,0 +1,12 @@
+php:
+  preset: laravel
+  disabled:
+    - no_unused_imports
+  finder:
+    not-name:
+      - index.php
+js:
+  finder:
+    not-name:
+      - webpack.mix.js
+css: true

+ 1 - 0
.well-known/acme-challenge/RFQo-uJgNIjtMaNrs12NxvynHH4l4U8dFtWKA8_BAUg

@@ -0,0 +1 @@
+RFQo-uJgNIjtMaNrs12NxvynHH4l4U8dFtWKA8_BAUg.TCzLg5LWuYB52f2DjdKrfjjyeMXN_0WjJE9PYdQfNVA

+ 64 - 0
README.md

@@ -0,0 +1,64 @@
+<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400"></a></p>
+
+<p align="center">
+<a href="https://travis-ci.org/laravel/framework"><img src="https://travis-ci.org/laravel/framework.svg" alt="Build Status"></a>
+<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
+<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
+<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
+</p>
+
+## About Laravel
+
+Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
+
+- [Simple, fast routing engine](https://laravel.com/docs/routing).
+- [Powerful dependency injection container](https://laravel.com/docs/container).
+- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
+- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
+- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
+- [Robust background job processing](https://laravel.com/docs/queues).
+- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
+
+Laravel is accessible, powerful, and provides tools required for large, robust applications.
+
+## Learning Laravel
+
+Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
+
+If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains over 2000 video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
+
+## Laravel Sponsors
+
+We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the Laravel [Patreon page](https://patreon.com/taylorotwell).
+
+### Premium Partners
+
+- **[Vehikl](https://vehikl.com/)**
+- **[Tighten Co.](https://tighten.co)**
+- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
+- **[64 Robots](https://64robots.com)**
+- **[Cubet Techno Labs](https://cubettech.com)**
+- **[Cyber-Duck](https://cyber-duck.co.uk)**
+- **[Many](https://www.many.co.uk)**
+- **[Webdock, Fast VPS Hosting](https://www.webdock.io/en)**
+- **[DevSquad](https://devsquad.com)**
+- **[Curotec](https://www.curotec.com/services/technologies/laravel/)**
+- **[OP.GG](https://op.gg)**
+- **[WebReinvent](https://webreinvent.com/?utm_source=laravel&utm_medium=github&utm_campaign=patreon-sponsors)**
+- **[Lendio](https://lendio.com)**
+
+## Contributing
+
+Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
+
+## Code of Conduct
+
+In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
+
+## Security Vulnerabilities
+
+If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
+
+## License
+
+The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).

+ 57 - 0
app/Admin/Controllers/AdminRoleUserController.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace App\Admin\Controllers;
+
+use App\Admin\Repositories\AdminRoleUser;
+use Dcat\Admin\Form;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Show;
+use Dcat\Admin\Http\Controllers\AdminController;
+
+class AdminRoleUserController extends AdminController
+{
+    /**
+     * Make a grid builder.
+     *
+     * @return Grid
+     */
+    protected function grid()
+    {
+        return Grid::make(new AdminRoleUser(), function (Grid $grid) {
+            $grid->column('role_id')->sortable();
+
+            $grid->filter(function (Grid\Filter $filter) {
+                $filter->equal('role_id');
+            });
+        });
+    }
+
+    /**
+     * Make a show builder.
+     *
+     * @param mixed $id
+     *
+     * @return Show
+     */
+    protected function detail($id)
+    {
+        return Show::make($id, new AdminRoleUser(), function (Show $show) {
+
+        });
+    }
+
+    /**
+     * Make a form builder.
+     *
+     * @return Form
+     */
+    protected function form()
+    {
+        return Form::make(new AdminRoleUser(), function (Form $form) {
+            $form->display('role_id');
+
+            $form->display('created_at');
+            $form->display('updated_at');
+        });
+    }
+}

+ 108 - 0
app/Admin/Controllers/AnchorController.php

@@ -0,0 +1,108 @@
+<?php
+
+namespace App\Admin\Controllers;
+
+use App\Admin\Repositories\Anchor;
+use Dcat\Admin\Form;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Show;
+use Dcat\Admin\Admin;
+use Dcat\Admin\Http\Controllers\AdminController;
+use Illuminate\Support\Facades\Log;
+
+use function PHPSTORM_META\type;
+
+class AnchorController extends AdminController
+{
+    /**
+     * Make a grid builder.
+     *
+     * @return Grid
+     */
+    protected function grid()
+    {
+        return Grid::make(new Anchor(), function (Grid $grid) {
+            $grid->column('id')->sortable();
+            $grid->column('name');
+            $grid->column('status')->using([
+                1 => '正常',
+                2 => '封禁',
+                9 => '删除',
+            ])->label([
+                1 => Admin::color()->success(80),
+                2 => Admin::color()->danger(60),
+                9 => Admin::color()->warning(60),
+            ]);
+            // $grid->column('live_room_id');
+            // $grid->column('admin_users_id');
+            // $grid->column('created_at');
+            // $grid->column('updated_at')->sortable();
+
+            $grid->fixColumns(0, -1); //设置固定栏目
+            $grid->disableViewButton(); //禁用详情
+            $grid->disableBatchDelete(); //禁用批量删除
+            $grid->disableDeleteButton(); //禁用删除
+
+            $grid->filter(function (Grid\Filter $filter) {
+                $filter->equal('id');
+            });
+        });
+    }
+
+    /**
+     * Make a show builder.
+     *
+     * @param mixed $id
+     *
+     * @return Show
+     */
+    protected function detail($id)
+    {
+        return Show::make($id, new Anchor(), function (Show $show) {
+            $show->field('id');
+            $show->field('status');
+            $show->field('live_room_id');
+            $show->field('name');
+            $show->field('admin_users_id');
+            $show->field('created_at');
+            $show->field('updated_at');
+        });
+    }
+
+    /**
+     * Make a form builder.
+     *
+     * @return Form
+     */
+    protected function form()
+    {
+        return Form::make(new Anchor(), function (Form $form) {
+            // $form->display('id');
+            // $form->divider('目前只支持管理员修改,无权限请勿修改');
+            // $form->text('password', '密码')->required();
+            $form->text('name');
+            $form->select('status', '状态')->options([
+                1 => '正常',
+                2 => '封禁',
+                // 9 => '删除',
+            ])->required();
+            $form->text('app_id')->help('请勿随意修改,否则会导致无法提单');
+            $form->text('app_secret')->help('请勿随意修改,否则会导致无法提单');
+            
+            // $form->saving(function (Form $form) {
+            //     if($form->password == "123"){
+            //         // return 1;
+            //     }
+            // });
+
+            $form->saved(function (Form $form) {
+                Log::info('修改主播:' . $form->name);
+                Log::info(json_encode($form->model(), JSON_UNESCAPED_UNICODE));
+            });
+            // $form->text('live_room_id');
+            // $form->text('admin_users_id');
+            // $form->display('created_at');
+            // $form->display('updated_at');
+        });
+    }
+}

+ 9 - 0
app/Admin/Controllers/AuthController.php

@@ -0,0 +1,9 @@
+<?php
+
+namespace App\Admin\Controllers;
+
+use Dcat\Admin\Http\Controllers\AuthController as BaseAuthController;
+
+class AuthController extends BaseAuthController
+{
+}

+ 30 - 0
app/Admin/Controllers/HomeController.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Admin\Controllers;
+
+use App\Admin\Metrics\Examples;
+use App\Http\Controllers\Controller;
+use Dcat\Admin\Http\Controllers\Dashboard;
+use Dcat\Admin\Layout\Column;
+use Dcat\Admin\Layout\Content;
+use Dcat\Admin\Layout\Row;
+use Dcat\Admin\Widgets\Card;
+use App\Admin\Metrics\Charts\Orders;
+use App\Admin\Metrics\Charts\Test;
+
+class HomeController extends Controller
+{
+    public function index(Content $content)
+    {
+        return $content
+            ->header('数据')
+            ->description()
+            ->body(function (Row $row) {
+                $row->column(12, function (Column $column) {
+                    $column->row(new Card('30日成交曲线图', new Orders()));
+
+                });
+
+            });
+    }
+}

+ 36 - 0
app/Admin/Http/Controllers/TestController.php

@@ -0,0 +1,36 @@
+<?php
+/*
+ * @Description: 只因你太美
+ * @Version: *
+ * @Autor: code
+ * @Date: 2023-09-13 15:03:42
+ * @LastEditors: code
+ * @LastEditTime: 2023-09-14 16:29:31
+ */
+
+namespace App\Admin\Http\Controllers;
+
+use App\Models\AppUser;
+use Illuminate\Support\Facades\Cache;
+
+use function App\Http\success;
+
+class TestController
+{
+
+    public function index()
+    {
+        return now();
+    }
+
+
+    /**
+     * 清空缓存
+     *
+     * @return int
+     */
+    public function flush()
+    {
+        return Cache::flush();
+    }
+}

+ 107 - 0
app/Admin/Http/Logics/AppUserLogic.php

@@ -0,0 +1,107 @@
+<?php
+
+namespace App\Admin\Http\Logics;
+
+
+use Illuminate\Support\Arr;
+use Illuminate\Support\Facades\Cache;
+use function App\Http\_header;
+use function App\Http\_microtime;
+use function App\Http\success;
+use Illuminate\Support\Facades\Log;
+
+class AppUserLogic
+{
+
+    const CACHE_PREFIX       = "TM_USER_CACHE_";
+    const TOKEN_CACHE_PREFIX = "TM_USER_TOKEN_";
+
+
+
+    public static function token($id, $user)
+    {
+        $token    = uniqid(_microtime(13), true);
+        $user = $user->toArray();
+
+        $user = Arr::except($user, 'created_at');
+        $user = Arr::except($user, 'updated_at');
+        $user = Arr::except($user, 'deleted_at');
+        $user = Arr::except($user, 'status');
+        $prefix = "USER_CACHE_" . $id;
+
+        Cache::put($token, $user, 8640000 * 1); //1天
+        if (Cache::has($prefix)) {
+            $oldToken = Cache::get($prefix);
+            Cache::forget($oldToken);
+        }
+        Cache::put($prefix, $token, 86400 * 8);
+        return success(['token' => $token, 'user' => $user], "登录成功");
+    }
+
+    public static function updateToekn($user)
+    {
+
+        $user = $user->toArray();
+
+        $user = Arr::except($user, 'created_at');
+        $user = Arr::except($user, 'updated_at');
+        $user = Arr::except($user, 'deleted_at');
+        $user = Arr::except($user, 'status');
+
+        $token = _header('authorization');
+
+        Cache::put($token, $user, 8640000 * 1); //1天
+    }
+
+
+    /**
+     * 校验token
+     *
+     * @param $token
+     *
+     * @return mixed
+     */
+    public static function validToken($token = null,$platform = null): mixed
+    {
+        $token = $token ?: _header('authorization');
+        if (empty($token)) {
+            return false;
+        }
+        
+        $user = Cache::get($token);
+        if (empty($user)) {
+            return false;
+        }
+    
+        $userId = $user['id'];
+        $platform = $platform ?: _header('platform');
+        if (empty($platform)) {
+            return false;
+        }
+
+        if($platform == 1){
+            $cacheKeyPrefix = "ADMIN_CACHE_";
+        }
+        if($platform == 2 || $platform == 3){
+            $cacheKeyPrefix = "FONT_CACHE_";
+        }
+        $cacheKey = $cacheKeyPrefix . $userId;
+    
+        if (Cache::get($cacheKey) != $token) {
+            return false;
+        }
+    
+        return $user;
+    }
+
+
+    public static function delToken($id)
+    {
+        $prefix = "USER_CACHE_" . $id;
+        if (Cache::has($prefix)) {
+            $oldToken = Cache::get($prefix);
+            Cache::forget($oldToken);
+        }
+        return success([], "退出成功");
+    }
+}

+ 46 - 0
app/Admin/Http/Logics/SmsLogic.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace App\Admin\Http\Logics;
+
+use App\DataApi\Helper\TencentSmsHelper;
+use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\Redis;
+use function App\Http\_header;
+use function App\Http\error;
+use function App\Http\success;
+
+class SmsLogic
+{
+
+    /**
+     * 发送验证码
+     *
+     * @param [type] $phone
+     * @return array
+     */
+    public static function sendSms($phone)
+    {
+        if (Redis::exists('CODE_' . $phone)) return error("该手机号已发送短信,请稍后再试");
+
+        $tencentMessage = new TencentSmsHelper();
+        $code = (string)rand(1111, 9999);
+        $res = $tencentMessage->send('86' . $phone, '1734411', [$code, '5']);
+
+        if (!empty($res['code']) and $res['code'] == 1) {
+            Redis::setex('CODE_' . $phone, 60 * 5, $code);
+            return success([], "发送成功,验证码5分钟内有效");
+        } else {
+            return error($res['msg']);
+        }
+    }
+    /**
+     * 验证验证码
+     *
+     * @param [type] $phone
+     * @return bool
+     */
+    public static function validSms($phone, $code)
+    {
+        return ($code == Redis::get('CODE_' . $phone));
+    }
+}

+ 127 - 0
app/Admin/Metrics/Charts/Orders.php

@@ -0,0 +1,127 @@
+<?php
+
+namespace App\Admin\Metrics\Charts;
+
+
+use Dcat\Admin\Admin;
+use Dcat\Admin\Widgets\ApexCharts\Chart;
+use Dcat\Admin\Widgets\Metrics\Bar;
+use Dcat\Admin\Widgets\Metrics\Line;
+use Illuminate\Http\Request;
+use Illuminate\Support\Arr;
+use Illuminate\Support\Facades\DB;
+
+class Orders extends Chart
+{
+    public function __construct($containerSelector = null, $options = [])
+    {
+        parent::__construct($containerSelector, $options);
+
+        $this->setUpOptions();
+    }
+
+    /**
+     * 初始化图表配置
+     */
+    protected function setUpOptions()
+    {
+        $color = Admin::color();
+
+        $colors = [$color->primary(), $color->primaryDarker()];
+
+        $this->options([
+            'colors' => $colors,
+            'chart' => [
+                'type' => 'area',
+                'height' => 430
+            ],
+            'plotOptions' => [
+                'bar' => [
+                    'horizontal' => true,
+                    'dataLabels' => [
+                        'position' => 'top',
+                    ],
+                ]
+            ],
+            'dataLabels' => [
+                'enabled' => true,
+                'offsetX' => -6,
+                'style' => [
+                    'fontSize' => '12px',
+                    'colors' => ['#ddd']
+                ]
+            ],
+            'stroke' => [
+                'show' => true,
+                'width' => 1,
+                'colors' => ['#fff']
+            ],
+            'xaxis' => [
+                'categories' => [],
+            ],
+        ]);
+        $this->dropdown([
+            '7' => 'Last 7 Days',
+            '28' => 'Last 28 Days',
+            '30' => 'Last Month',
+            '365' => 'Last Year',
+        ]);
+    }
+
+    /**
+     * 处理图表数据
+     */
+    protected function buildData()
+    {
+        $count = DB::table('orders')->whereBetween('created_at', [date('Y-m-d', strtotime("-30 day")), date('Y-m-d')])
+            ->selectRaw('DATE(created_at) as date,COUNT(*) as value')
+            ->groupBy('date')->get()->toArray();
+
+        $data = [
+            [
+                'data' => Arr::pluck($count, 'value')
+            ]
+
+        ];
+        $categories = Arr::pluck($count, 'date');
+
+        $this->withData($data);
+        $this->withCategories($categories);
+    }
+
+    /**
+     * 设置图表数据
+     *
+     * @param array $data
+     *
+     * @return $this
+     */
+    public function withData(array $data)
+    {
+        return $this->option('series', $data);
+    }
+
+    /**
+     * 设置图表类别.
+     *
+     * @param array $data
+     *
+     * @return $this
+     */
+    public function withCategories(array $data)
+    {
+        return $this->option('xaxis.categories', $data);
+    }
+
+    /**
+     * 渲染图表
+     *
+     * @return string
+     */
+    public function render()
+    {
+        $this->buildData();
+
+        return parent::render();
+    }
+}

+ 115 - 0
app/Admin/Metrics/Charts/Test.php

@@ -0,0 +1,115 @@
+<?php
+
+namespace App\Admin\Metrics\Charts;
+
+use App\Models\Package;
+use Dcat\Admin\Admin;
+use Dcat\Admin\Widgets\Metrics\Bar;
+use Illuminate\Http\Request;
+
+class Test extends Bar
+{
+    /**
+     * 初始化卡片内容
+     */
+    public function init()
+    {
+        parent::init();
+
+        $color = Admin::color();
+
+        $dark35 = $color->dark35();
+
+        // 卡片内容宽度
+        $this->contentWidth(5, 7);
+        // 标题
+        $this->title('Avg Sessions');
+        // 设置下拉选项
+
+        // $this->dropdown(Package::pluck('name', 'id'));
+        // 设置图表颜色
+        $this->chartColors([
+            $dark35,
+            $dark35,
+            $color->primary(),
+            $dark35,
+            $dark35,
+            $color->info(),
+            $dark35
+        ]);
+    }
+
+    /**
+     * 处理请求
+     *
+     * @param Request $request
+     *
+     * @return mixed|void
+     */
+    public function handle(Request $request)
+    {
+        switch ($request->get('option')) {
+            case '7':
+            default:
+                // 卡片内容
+                $this->withContent('2.7k', '+5.2%');
+
+                // 图表数据
+                $this->withChart([
+                    [
+                        'name' => 'Sessions',
+                        'data' => [75, 125, 225, 175, 125, 75, 25],
+                    ],
+                ]);
+        }
+    }
+
+    /**
+     * 设置图表数据.
+     *
+     * @param array $data
+     *
+     * @return $this
+     */
+    public function withChart(array $data)
+    {
+        return $this->chart([
+            'series' => $data,
+        ]);
+    }
+
+    /**
+     * 设置卡片内容.
+     *
+     * @param string $title
+     * @param string $value
+     * @param string $style
+     *
+     * @return $this
+     */
+    public function withContent($title, $value, $style = 'success')
+    {
+        // 根据选项显示
+        $label = strtolower(
+            $this->dropdown[request()->option] ?? 'last 7 days'
+        );
+
+        $minHeight = '183px';
+
+        return $this->content(
+            <<<HTML
+<div class="d-flex p-1 flex-column justify-content-between" style="padding-top: 0;width: 100%;height: 100%;min-height: {$minHeight}">
+    <div class="text-left">
+        <h1 class="font-large-2 mt-2 mb-0">{$title}</h1>
+        <h5 class="font-medium-2" style="margin-top: 10px;">
+            <span class="text-{$style}">{$value} </span>
+            <span>vs {$label}</span>
+        </h5>
+    </div>
+
+    <a href="#" class="btn btn-primary shadow waves-effect waves-light">View Details <i class="feather icon-chevrons-right"></i></a>
+</div>
+HTML
+        );
+    }
+}

+ 100 - 0
app/Admin/Metrics/Examples/NewDevices.php

@@ -0,0 +1,100 @@
+<?php
+
+namespace App\Admin\Metrics\Examples;
+
+use Dcat\Admin\Admin;
+use Dcat\Admin\Widgets\Metrics\Donut;
+
+class NewDevices extends Donut
+{
+    protected $labels = ['Desktop', 'Mobile'];
+
+    /**
+     * 初始化卡片内容
+     */
+    protected function init()
+    {
+        parent::init();
+
+        $color = Admin::color();
+        $colors = [$color->primary(), $color->alpha('blue2', 0.5)];
+
+        $this->title('New Devices');
+        $this->subTitle('Last 30 days');
+        $this->chartLabels($this->labels);
+        // 设置图表颜色
+        $this->chartColors($colors);
+    }
+
+    /**
+     * 渲染模板
+     *
+     * @return string
+     */
+    public function render()
+    {
+        $this->fill();
+
+        return parent::render();
+    }
+
+    /**
+     * 写入数据.
+     *
+     * @return void
+     */
+    public function fill()
+    {
+        $this->withContent(44.9, 28.6);
+
+        // 图表数据
+        $this->withChart([44.9, 28.6]);
+    }
+
+    /**
+     * 设置图表数据.
+     *
+     * @param array $data
+     *
+     * @return $this
+     */
+    public function withChart(array $data)
+    {
+        return $this->chart([
+            'series' => $data
+        ]);
+    }
+
+    /**
+     * 设置卡片头部内容.
+     *
+     * @param mixed $desktop
+     * @param mixed $mobile
+     *
+     * @return $this
+     */
+    protected function withContent($desktop, $mobile)
+    {
+        $blue = Admin::color()->alpha('blue2', 0.5);
+
+        $style = 'margin-bottom: 8px';
+        $labelWidth = 120;
+
+        return $this->content(
+            <<<HTML
+<div class="d-flex pl-1 pr-1 pt-1" style="{$style}">
+    <div style="width: {$labelWidth}px">
+        <i class="fa fa-circle text-primary"></i> {$this->labels[0]}
+    </div>
+    <div>{$desktop}</div>
+</div>
+<div class="d-flex pl-1 pr-1" style="{$style}">
+    <div style="width: {$labelWidth}px">
+        <i class="fa fa-circle" style="color: $blue"></i> {$this->labels[1]}
+    </div>
+    <div>{$mobile}</div>
+</div>
+HTML
+        );
+    }
+}

+ 108 - 0
app/Admin/Metrics/Examples/NewUsers.php

@@ -0,0 +1,108 @@
+<?php
+
+namespace App\Admin\Metrics\Examples;
+
+use Dcat\Admin\Widgets\Metrics\Line;
+use Illuminate\Http\Request;
+
+class NewUsers extends Line
+{
+    /**
+     * 初始化卡片内容
+     *
+     * @return void
+     */
+    protected function init()
+    {
+        parent::init();
+
+        $this->title('New Users');
+        $this->dropdown([
+            '7' => 'Last 7 Days',
+            '28' => 'Last 28 Days',
+            '30' => 'Last Month',
+            '365' => 'Last Year',
+        ]);
+    }
+
+    /**
+     * 处理请求
+     *
+     * @param Request $request
+     *
+     * @return mixed|void
+     */
+    public function handle(Request $request)
+    {
+        $generator = function ($len, $min = 10, $max = 300) {
+            for ($i = 0; $i <= $len; $i++) {
+                yield mt_rand($min, $max);
+            }
+        };
+
+        switch ($request->get('option')) {
+            case '365':
+                // 卡片内容
+                $this->withContent(mt_rand(1000, 5000).'k');
+                // 图表数据
+                $this->withChart(collect($generator(30))->toArray());
+                break;
+            case '30':
+                // 卡片内容
+                $this->withContent(mt_rand(400, 1000).'k');
+                // 图表数据
+                $this->withChart(collect($generator(30))->toArray());
+                break;
+            case '28':
+                // 卡片内容
+                $this->withContent(mt_rand(400, 1000).'k');
+                // 图表数据
+                $this->withChart(collect($generator(28))->toArray());
+                break;
+            case '7':
+            default:
+                // 卡片内容
+                $this->withContent('89.2k');
+                // 图表数据
+                $this->withChart([28, 40, 36, 52, 38, 60, 55,]);
+        }
+    }
+
+    /**
+     * 设置图表数据.
+     *
+     * @param array $data
+     *
+     * @return $this
+     */
+    public function withChart(array $data)
+    {
+        return $this->chart([
+            'series' => [
+                [
+                    'name' => $this->title,
+                    'data' => $data,
+                ],
+            ],
+        ]);
+    }
+
+    /**
+     * 设置卡片内容.
+     *
+     * @param string $content
+     *
+     * @return $this
+     */
+    public function withContent($content)
+    {
+        return $this->content(
+            <<<HTML
+<div class="d-flex justify-content-between align-items-center mt-1" style="margin-bottom: 2px">
+    <h2 class="ml-1 font-lg-1">{$content}</h2>
+    <span class="mb-0 mr-1 text-80">{$this->title}</span>
+</div>
+HTML
+        );
+    }
+}

+ 114 - 0
app/Admin/Metrics/Examples/ProductOrders.php

@@ -0,0 +1,114 @@
+<?php
+
+namespace App\Admin\Metrics\Examples;
+
+use Dcat\Admin\Widgets\Metrics\Round;
+use Illuminate\Http\Request;
+
+class ProductOrders extends Round
+{
+    /**
+     * 初始化卡片内容
+     */
+    protected function init()
+    {
+        parent::init();
+
+        $this->title('Product Orders');
+        $this->chartLabels(['Finished', 'Pending', 'Rejected']);
+        $this->dropdown([
+            '7' => 'Last 7 Days',
+            '28' => 'Last 28 Days',
+            '30' => 'Last Month',
+            '365' => 'Last Year',
+        ]);
+    }
+
+    /**
+     * 处理请求
+     *
+     * @param Request $request
+     *
+     * @return mixed|void
+     */
+    public function handle(Request $request)
+    {
+        switch ($request->get('option')) {
+            case '365':
+            case '30':
+            case '28':
+            case '7':
+            default:
+                // 卡片内容
+                $this->withContent(23043, 14658, 4758);
+
+                // 图表数据
+                $this->withChart([70, 52, 26]);
+
+                // 总数
+                $this->chartTotal('Total', 344);
+        }
+    }
+
+    /**
+     * 设置图表数据.
+     *
+     * @param array $data
+     *
+     * @return $this
+     */
+    public function withChart(array $data)
+    {
+        return $this->chart([
+            'series' => $data,
+        ]);
+    }
+
+    /**
+     * 卡片内容.
+     *
+     * @param int $finished
+     * @param int $pending
+     * @param int $rejected
+     *
+     * @return $this
+     */
+    public function withContent($finished, $pending, $rejected)
+    {
+        return $this->content(
+            <<<HTML
+<div class="col-12 d-flex flex-column flex-wrap text-center" style="max-width: 220px">
+    <div class="chart-info d-flex justify-content-between mb-1 mt-2" >
+          <div class="series-info d-flex align-items-center">
+              <i class="fa fa-circle-o text-bold-700 text-primary"></i>
+              <span class="text-bold-600 ml-50">Finished</span>
+          </div>
+          <div class="product-result">
+              <span>{$finished}</span>
+          </div>
+    </div>
+
+    <div class="chart-info d-flex justify-content-between mb-1">
+          <div class="series-info d-flex align-items-center">
+              <i class="fa fa-circle-o text-bold-700 text-warning"></i>
+              <span class="text-bold-600 ml-50">Pending</span>
+          </div>
+          <div class="product-result">
+              <span>{$pending}</span>
+          </div>
+    </div>
+
+     <div class="chart-info d-flex justify-content-between mb-1">
+          <div class="series-info d-flex align-items-center">
+              <i class="fa fa-circle-o text-bold-700 text-danger"></i>
+              <span class="text-bold-600 ml-50">Rejected</span>
+          </div>
+          <div class="product-result">
+              <span>{$rejected}</span>
+          </div>
+    </div>
+</div>
+HTML
+        );
+    }
+}

+ 117 - 0
app/Admin/Metrics/Examples/Sessions.php

@@ -0,0 +1,117 @@
+<?php
+
+namespace App\Admin\Metrics\Examples;
+
+use Dcat\Admin\Admin;
+use Dcat\Admin\Widgets\Metrics\Bar;
+use Illuminate\Http\Request;
+
+class Sessions extends Bar
+{
+    /**
+     * 初始化卡片内容
+     */
+    protected function init()
+    {
+        parent::init();
+
+        $color = Admin::color();
+
+        $dark35 = $color->dark35();
+
+        // 卡片内容宽度
+        $this->contentWidth(5, 7);
+        // 标题
+        $this->title('Avg Sessions');
+        // 设置下拉选项
+        $this->dropdown([
+            '7' => 'Last 7 Days',
+            '28' => 'Last 28 Days',
+            '30' => 'Last Month',
+            '365' => 'Last Year',
+        ]);
+        // 设置图表颜色
+        $this->chartColors([
+            $dark35,
+            $dark35,
+            $color->primary(),
+            $dark35,
+            $dark35,
+            $dark35
+        ]);
+    }
+
+    /**
+     * 处理请求
+     *
+     * @param Request $request
+     *
+     * @return mixed|void
+     */
+    public function handle(Request $request)
+    {
+        switch ($request->get('option')) {
+            case '7':
+            default:
+                // 卡片内容
+                $this->withContent('2.7k', '+5.2%');
+
+                // 图表数据
+                $this->withChart([
+                    [
+                        'name' => 'Sessions',
+                        'data' => [75, 125, 225, 175, 125, 75, 25],
+                    ],
+                ]);
+        }
+    }
+
+    /**
+     * 设置图表数据.
+     *
+     * @param array $data
+     *
+     * @return $this
+     */
+    public function withChart(array $data)
+    {
+        return $this->chart([
+            'series' => $data,
+        ]);
+    }
+
+    /**
+     * 设置卡片内容.
+     *
+     * @param string $title
+     * @param string $value
+     * @param string $style
+     *
+     * @return $this
+     */
+    public function withContent($title, $value, $style = 'success')
+    {
+        // 根据选项显示
+        $label = strtolower(
+            $this->dropdown[request()->option] ?? 'last 7 days'
+        );
+
+        $minHeight = '183px';
+
+        return $this->content(
+            <<<HTML
+<div class="d-flex p-1 flex-column justify-content-between" style="padding-top: 0;width: 100%;height: 100%;min-height: {$minHeight}">
+    <div class="text-left">
+        <h1 class="font-lg-2 mt-2 mb-0">{$title}</h1>
+        <h5 class="font-medium-2" style="margin-top: 10px;">
+            <span class="text-{$style}">{$value} </span>
+            <span>vs {$label}</span>
+        </h5>
+    </div>
+
+    <a href="#" class="btn btn-primary shadow waves-effect waves-light">View Details <i class="feather icon-chevrons-right"></i></a>
+</div>
+HTML
+        );
+    }
+}

+ 116 - 0
app/Admin/Metrics/Examples/Tickets.php

@@ -0,0 +1,116 @@
+<?php
+
+namespace App\Admin\Metrics\Examples;
+
+use Dcat\Admin\Widgets\Metrics\RadialBar;
+use Illuminate\Http\Request;
+
+class Tickets extends RadialBar
+{
+    /**
+     * 初始化卡片内容
+     */
+    protected function init()
+    {
+        parent::init();
+
+        $this->title('Tickets');
+        $this->height(400);
+        $this->chartHeight(300);
+        $this->chartLabels('Completed Tickets');
+        $this->dropdown([
+            '7' => 'Last 7 Days',
+            '28' => 'Last 28 Days',
+            '30' => 'Last Month',
+            '365' => 'Last Year',
+        ]);
+    }
+
+    /**
+     * 处理请求
+     *
+     * @param Request $request
+     *
+     * @return mixed|void
+     */
+    public function handle(Request $request)
+    {
+        switch ($request->get('option')) {
+            case '365':
+            case '30':
+            case '28':
+            case '7':
+            default:
+                // 卡片内容
+                $this->withContent(162);
+                // 卡片底部
+                $this->withFooter(29, 63, '1d');
+                // 图表数据
+                $this->withChart(83);
+        }
+    }
+
+    /**
+     * 设置图表数据.
+     *
+     * @param int $data
+     *
+     * @return $this
+     */
+    public function withChart(int $data)
+    {
+        return $this->chart([
+            'series' => [$data],
+        ]);
+    }
+
+    /**
+     * 卡片内容
+     *
+     * @param string $content
+     *
+     * @return $this
+     */
+    public function withContent($content)
+    {
+        return $this->content(
+            <<<HTML
+<div class="d-flex flex-column flex-wrap text-center">
+    <h1 class="font-lg-2 mt-2 mb-0">{$content}</h1>
+    <small>Tickets</small>
+</div>
+HTML
+        );
+    }
+
+    /**
+     * 卡片底部内容.
+     *
+     * @param string $new
+     * @param string $open
+     * @param string $response
+     *
+     * @return $this
+     */
+    public function withFooter($new, $open, $response)
+    {
+        return $this->footer(
+            <<<HTML
+<div class="d-flex justify-content-between p-1" style="padding-top: 0!important;">
+    <div class="text-center">
+        <p>New Tickets</p>
+        <span class="font-lg-1">{$new}</span>
+    </div>
+    <div class="text-center">
+        <p>Open Tickets</p>
+        <span class="font-lg-1">{$open}</span>
+    </div>
+    <div class="text-center">
+        <p>Response Time</p>
+        <span class="font-lg-1">{$response}</span>
+    </div>
+</div>
+HTML
+        );
+    }
+}

+ 129 - 0
app/Admin/Metrics/Examples/TotalUsers.php

@@ -0,0 +1,129 @@
+<?php
+
+namespace App\Admin\Metrics\Examples;
+
+use Dcat\Admin\Widgets\Metrics\Card;
+use Illuminate\Contracts\Support\Renderable;
+use Illuminate\Http\Request;
+
+class TotalUsers extends Card
+{
+    /**
+     * 卡片底部内容.
+     *
+     * @var string|Renderable|\Closure
+     */
+    protected $footer;
+
+    /**
+     * 初始化卡片.
+     */
+    protected function init()
+    {
+        parent::init();
+
+        $this->title('Total Users');
+        $this->dropdown([
+            '7' => 'Last 7 Days',
+            '28' => 'Last 28 Days',
+            '30' => 'Last Month',
+            '365' => 'Last Year',
+        ]);
+    }
+
+    /**
+     * 处理请求.
+     *
+     * @param Request $request
+     *
+     * @return void
+     */
+    public function handle(Request $request)
+    {
+        switch ($request->get('option')) {
+            case '365':
+                $this->content(mt_rand(600, 1500));
+                $this->down(mt_rand(1, 30));
+                break;
+            case '30':
+                $this->content(mt_rand(170, 250));
+                $this->up(mt_rand(12, 50));
+                break;
+            case '28':
+                $this->content(mt_rand(155, 200));
+                $this->up(mt_rand(5, 50));
+                break;
+            case '7':
+            default:
+                $this->content(143);
+                $this->up(15);
+        }
+    }
+
+    /**
+     * @param int $percent
+     *
+     * @return $this
+     */
+    public function up($percent)
+    {
+        return $this->footer(
+            "<i class=\"feather icon-trending-up text-success\"></i> {$percent}% Increase"
+        );
+    }
+
+    /**
+     * @param int $percent
+     *
+     * @return $this
+     */
+    public function down($percent)
+    {
+        return $this->footer(
+            "<i class=\"feather icon-trending-down text-danger\"></i> {$percent}% Decrease"
+        );
+    }
+
+    /**
+     * 设置卡片底部内容.
+     *
+     * @param string|Renderable|\Closure $footer
+     *
+     * @return $this
+     */
+    public function footer($footer)
+    {
+        $this->footer = $footer;
+
+        return $this;
+    }
+
+    /**
+     * 渲染卡片内容.
+     *
+     * @return string
+     */
+    public function renderContent()
+    {
+        $content = parent::renderContent();
+
+        return <<<HTML
+<div class="d-flex justify-content-between align-items-center mt-1" style="margin-bottom: 2px">
+    <h2 class="ml-1 font-lg-1">{$content}</h2>
+</div>
+<div class="ml-1 mt-1 font-weight-bold text-80">
+    {$this->renderFooter()}
+</div>
+HTML;
+    }
+
+    /**
+     * 渲染卡片底部内容.
+     *
+     * @return string
+     */
+    public function renderFooter()
+    {
+        return $this->toString($this->footer);
+    }
+}

+ 26 - 0
app/Admin/bootstrap.php

@@ -0,0 +1,26 @@
+<?php
+
+use Dcat\Admin\Admin;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Form;
+use Dcat\Admin\Grid\Filter;
+use Dcat\Admin\Show;
+
+/**
+ * Dcat-admin - admin builder based on Laravel.
+ * @author jqh <https://github.com/jqhph>
+ *
+ * Bootstraper for Admin.
+ *
+ * Here you can remove builtin form field:
+ *
+ * extend custom field:
+ * Dcat\Admin\Form::extend('php', PHPEditor::class);
+ * Dcat\Admin\Grid\Column::extend('php', PHPEditor::class);
+ * Dcat\Admin\Grid\Filter::extend('php', PHPEditor::class);
+ *
+ * Or require js and css assets:
+ * Admin::css('/packages/prettydocs/css/styles.css');
+ * Admin::js('/packages/prettydocs/js/main.js');
+ *
+ */

+ 73 - 0
app/Admin/routes.php

@@ -0,0 +1,73 @@
+<?php
+/*
+ * @Description: 只因你太美
+ * @Version: *
+ * @Autor: code
+ * @Date: 2023-09-13 15:32:18
+ * @LastEditors: code
+ * @LastEditTime: 2023-09-14 16:31:23
+ */
+
+use Illuminate\Routing\Router;
+use Illuminate\Support\Facades\Route;
+use Dcat\Admin\Admin;
+
+Admin::routes();
+
+Route::group([
+    'prefix'     => config('admin.route.prefix'),
+    'namespace'  => config('admin.route.namespace'),
+    'middleware' => config('admin.route.middleware'),
+], function (Router $router) {
+    $router->get('/', 'HomeController@index');
+});
+
+Route::group([
+    'prefix'     => config('admin.route.prefixd'),
+    'namespace'  => config('admin.route.namespaced'),
+], function (Router $router) {
+
+    $router->get('index', 'TestController@index');
+
+    $router->get('flush', 'TestController@flush');
+    $router->get('delUser', 'TestController@delUser');
+
+
+    /**
+     * 后台管理端
+     */
+    $router->any('passwordLogin', 'AdminLoginController@passwordLogin'); //密码登录接口
+
+
+
+    /**
+     * APP用户登录注册相关
+     */
+    $router->any('register', 'AppUserLoginController@register'); //注册接口
+    $router->any('getSms', 'AppUserLoginController@getSms'); //发送验证码接口
+    $router->any('passwordLogin', 'AppUserLoginController@passwordLogin'); //密码登录接口
+    $router->any('wechatLogin', 'AppUserLoginController@wechatLogin'); //微信登录接口
+    $router->any('editPassword', 'AppUserLoginController@editPassword'); //忘记密码接口
+
+    $router->group(['middleware' => config('admin.route.middlewared'),], function ($api) {
+
+        //登录相关
+        $api->any('bindWechat', 'AppUserLoginController@bindWechat'); //绑定微信接口
+        $api->any('logout', 'AppUserLoginController@logout'); //登出
+
+
+        //用户相关
+        $api->any('uploadAvatar', 'AppUserController@uploadAvatar'); //上传头像
+        $api->any('perfectInfo', 'AppUserController@perfectInfo'); //完善个人信息接口
+        $api->any('userSignOut', 'AppUserController@userSignOut'); //用户注销接口
+
+
+        //收货地址相关
+        $api->any('addAddress', 'AppUserAddressController@addAddress'); //添加地址
+        $api->any('editAddress', 'AppUserAddressController@editAddress'); //修改地址
+        $api->any('delAddress', 'AppUserAddressController@delAddress'); //删除地址
+        $api->any('selectAddress', 'AppUserAddressController@selectAddress'); //查询地址
+        $api->any('setDefault', 'AppUserAddressController@setDefault'); //设置默认
+
+    });
+});

+ 222 - 0
app/Console/Commands/BroadbandOrder.php

@@ -0,0 +1,222 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Models\Anchor;
+use App\Models\Order;
+use App\Models\Package;
+use App\Models\Channe;
+use Illuminate\Support\Facades\Log;
+
+
+class BroadbandOrder extends \Illuminate\Console\Command
+{
+    protected $signature = "broadband:order";
+
+    protected $description = 'broadband order';
+
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+
+
+// 0未支付,1已支付,2申请退款,3已退款,4不同意,5退款失败 6退款中 pay_status
+
+        $packages = Package::where('is_upload', 1)
+            // ->where('operator_id', 6)
+            ->where('product_type',1)
+            ->get();
+            
+            
+        $ids = [];
+        foreach ($packages as $p) {
+            array_push($ids, $p->id);
+        }
+        
+        // $orderss = [
+        //     '20240927161554995579'
+        // ];
+        
+        $today = date('Y-m-d', strtotime("-10 day"));
+        $orders = Order::where('open_status', 0)
+            // ->where('pay_status', 0)
+            ->whereIn('package_id', $ids)
+            ->whereDate('created_at', ">", $today)
+            ->where('order_type', 1)
+            // ->whereIn('order_no', $orderss)
+            ->get();
+
+        foreach ($orders as $order) {
+            if ($order['agent_pro_id'] == 107 || $order['agent_id'] == 107) {
+                continue;
+            }
+            $this->send($order);
+        }
+        
+        
+        $orders = Order::where('open_status', 1)
+            ->whereIn('package_id', $ids)
+            ->whereDate('created_at', ">", $today)
+            ->where('order_type', 1)
+            // ->whereIn('order_no', $orderss)
+            ->get();
+
+        foreach ($orders as $order) {
+            if ($order['agent_pro_id'] == 107 || $order['agent_id'] == 107) {
+                continue;
+            }
+            $this->check($order);
+        }
+
+
+        Log::info('宽带订单同步完成,等待下次同步');
+        $i = 0;
+        while ($i < 120) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+
+    public function send($order)
+    {
+        // $package = Package::where('id', $order->package_id)->first();
+        // if(empty($package->out_package_id)) return;
+        
+        $url = "";
+        $data = [
+            'business_order_no' => $order->order_no,  //订单号
+            'iden_card_name' => $order->id_card_name,  //身份证姓名
+            'iden_card_id' => $order->id_card,  //身份证号
+            'contact' => $order->contact,  //联系人姓名
+            'mobile' => $order->mobile,  //联系人电话
+            'address' => $order->express_address,  //收货地址
+            'package_id' => $order->out_package_id,  //商品编码(对应的集客仓的商品编码)
+            'remark' => $order->remark,
+        ];
+        Log::info($order->order_no.'分销宽带订单同步提交:'.json_encode($data,JSON_UNESCAPED_UNICODE));
+        $res = $this->req($url, $data);
+        Log::info($order->order_no.'分销宽带订单同步返回:'.json_encode($res,JSON_UNESCAPED_UNICODE));
+        
+        if(empty($res)) return ["code" => 2, "msg" => "服务器请求超时"];
+        
+        if(!empty($res["data"]["order_no"])){
+            $updata = [
+                'open_status' => 1,
+                'api_order_no' => $res["data"]["order_no"]
+            ];
+        }else{
+            $updata = [
+                'open_status' => 3,
+                'open_message' => $res["error"]
+            ];
+        }
+        
+        if (!empty($updata)) {
+            $order->update($updata);
+        }
+        
+    }
+    
+    
+    
+    
+    public function check($order)
+    {
+        
+        $url = "";
+        $data = [
+            "business_order_no" => $order->order_no
+        ];
+        $res = $this->reqGet($url, $data);
+        // Log::info('宽带订单查询返回:'.json_encode($res,JSON_UNESCAPED_UNICODE));
+        if(empty($res)) return false;
+        
+        $updata = [];
+        
+        if(empty($res["data"])) return;
+        
+        $resData = $res["data"][count($res["data"]) - 1];
+        
+        if($resData["open_status"] == 3){
+            $updata = [
+                'open_status' => 2,
+                'phonenum' => $resData["phonenum"],
+            ];
+        }
+        
+        if($resData["open_status"] == 4){
+            $updata = [
+                'open_status' => 3,
+                'open_message' => $resData["open_message"],
+            ];
+        }
+        
+        // $orderInfo = Order::where('order_no', $order->order_no)->first();
+        if (!empty($updata)) {
+            $order->update($updata);
+        }
+    }
+    
+    
+
+    public function reqGet($url, $data)
+    {
+      
+        $headers = array(
+            "Content-Type:application/json;charset=utf-8",
+            "Authorization:Bearer 980|vOkaPQixrLHNh97344ON0tlpY7YPDLl4vUnqp8KV5e33b43a"
+        );
+
+        $url = $url .'?'. http_build_query($data);
+     
+        $curl = curl_init();// 初始化
+        curl_setopt($curl, CURLOPT_URL, $url);// 设置url路径
+        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true) ;// 将 curl_exec()获取的信息以文件流的形式返回,而不是直接输出
+        curl_setopt($curl, CURLOPT_BINARYTRANSFER, true) ;// 在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回
+        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);// 添加头信息
+        curl_setopt($curl, CURLINFO_HEADER_OUT, true); // CURLINFO_HEADER_OUT选项可以拿到请求头信息
+        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);// 不验证SSL
+        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);// 不验证SSL
+        curl_setopt($curl, CURLOPT_TIMEOUT, 10);// 请求超时
+        
+        $data = curl_exec($curl);// 执行
+        curl_close($curl);// 关闭连接
+        return json_decode($data, true);// 返回数据
+    }
+    
+  
+  
+ 
+ 
+    public function req($url, $data)
+    {
+      
+      
+        $data = json_encode($data, JSON_UNESCAPED_UNICODE);
+        $headers = array(
+            "Content-Type:application/json;charset=utf-8",
+            "Authorization:Bearer 980|vOkaPQixrLHNh97344ON0tlpY7YPDLl4vUnqp8KV5e33b43a"
+        );
+
+        $curl = curl_init(); //初始化
+        curl_setopt($curl, CURLOPT_URL, $url); //设置抓取的url
+        curl_setopt($curl, CURLOPT_HEADER, false); //设置头文件的信息作为数据流输出
+        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //设置获取的信息以文件流的形式返回,而不是直接输出。
+        curl_setopt($curl, CURLOPT_POST, true); //设置post方式提交
+        curl_setopt($curl, CURLOPT_POSTFIELDS,  $data); // 设置post请求参数
+        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); // 添加头信息
+        curl_setopt($curl, CURLINFO_HEADER_OUT, true); // CURLINFO_HEADER_OUT选项可以拿到请求头信息
+        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); // 不验证SSL
+        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); // 不验证SSL
+
+        $data = curl_exec($curl);
+        curl_close($curl);
+        return json_decode($data,true);
+    }
+}

+ 46 - 0
app/Console/Commands/CleanExpiredTokens.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\Log;
+use Laravel\Sanctum\PersonalAccessToken;
+
+class CleanExpiredTokens extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'sanctum:clean-expired-tokens';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '定时清理过期的token';
+
+    /**
+     * Execute the console command.
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        try {
+            while (true) {
+                // 过期时间
+                $expirationTime = now()->subMinutes(config('sanctum.expiration'));
+                // 删除所有过期的 token
+                PersonalAccessToken::where('created_at', '<', $expirationTime)->delete();
+                // 等待24小时
+                sleep(86400);
+            }
+        } catch (\Exception $e) {
+            Log::error($this->description . ' 程序异常: ' . $e->getMessage());
+            throw $e;
+        }
+    }
+}

+ 33 - 0
app/Console/Commands/LandingOrderChoosePut.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\DataApi\Helper\OrderPutHelper;
+use Illuminate\Support\Facades\Log;
+
+
+class LandingOrderChoosePut extends \Illuminate\Console\Command
+{
+    protected $signature = "saler_order:choose_put";
+
+    protected $description = 'saler_order choose_put';
+
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        $OrderPut = new OrderPutHelper();
+        $OrderPut->choosenum_put();
+        Log::info('定时任务:执行完成落地页选号后提单,等待下次执行');
+        $i = 0;
+        while ($i < 120) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+}

+ 33 - 0
app/Console/Commands/LandingOrderPut.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\DataApi\Helper\OrderPutHelper;
+use Illuminate\Support\Facades\Log;
+
+
+class LandingOrderPut extends \Illuminate\Console\Command
+{
+    protected $signature = "saler_order:put";
+
+    protected $description = 'saler_order put';
+
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        $OrderPut = new OrderPutHelper();
+        $OrderPut->put();
+        Log::info('定时任务:执行完成落地页提单,等待下次执行');
+        $i = 0;
+        while ($i < 120) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+}

+ 33 - 0
app/Console/Commands/LandingOrderSelect.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\DataApi\Helper\OrderPutHelper;
+use Illuminate\Support\Facades\Log;
+
+
+class LandingOrderSelect extends \Illuminate\Console\Command
+{
+    protected $signature = "saler_order:select";
+
+    protected $description = 'saler_order select';
+
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        $OrderPut = new OrderPutHelper();
+        $OrderPut->select();
+        Log::info('定时任务:执行完成落地页查单,等待下次执行');
+        $i = 0;
+        while ($i < 120) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+}

+ 33 - 0
app/Console/Commands/LandingOrderSelectActive.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\DataApi\Helper\OrderPutHelper;
+use Illuminate\Support\Facades\Log;
+
+
+class LandingOrderSelectActive extends \Illuminate\Console\Command
+{
+    protected $signature = "saler_order:select_active";
+
+    protected $description = 'saler_order select_active';
+
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        $OrderPut = new OrderPutHelper();
+        $OrderPut->select_active();
+        Log::info('定时任务:执行完成落地页查单激活,等待下次执行');
+        $i = 0;
+        while ($i < 120) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+}

+ 33 - 0
app/Console/Commands/LandingOrderSelectFirstCharge.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\DataApi\Helper\OrderPutHelper;
+use Illuminate\Support\Facades\Log;
+
+
+class LandingOrderSelectFirstCharge extends \Illuminate\Console\Command
+{
+    protected $signature = "saler_order:select_first_charge";
+
+    protected $description = 'saler_order select_first_charge';
+
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        $OrderPut = new OrderPutHelper();
+        $OrderPut->select_first_charge();
+        Log::info('定时任务:执行完成落地页查单首冲,等待下次执行');
+        $i = 0;
+        while ($i < 120) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+}

+ 33 - 0
app/Console/Commands/LandingOrderSelnumPut.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\DataApi\Helper\OrderPutHelper;
+use Illuminate\Support\Facades\Log;
+
+
+class LandingOrderSelnumPut extends \Illuminate\Console\Command
+{
+    protected $signature = "saler_selnum_order:put";
+
+    protected $description = 'saler_selnum_order put';
+
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        $OrderPut = new OrderPutHelper();
+        $OrderPut->selnum_put();
+        Log::info('定时任务:执行完成落地页选号提单,等待下次执行');
+        $i = 0;
+        while ($i < 120) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+}

+ 33 - 0
app/Console/Commands/PackageDelistUpload.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\DataApi\Helper\PackageHelper;
+use Illuminate\Support\Facades\Log;
+
+
+class PackageDelistUpload extends \Illuminate\Console\Command
+{
+    protected $signature = "saler_package:delist_upload";
+
+    protected $description = 'saler_package delist_upload';
+
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        $packageHelper = new PackageHelper();
+        $packageHelper->timingUpload();
+        Log::info('定时任务:执行完成套餐自动下架,等待下次执行');
+        $i = 0;
+        while ($i < 300) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+}

+ 33 - 0
app/Console/Commands/SelectGetpayRemit.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\DataApi\Helper\GetpayHelper;
+use Illuminate\Support\Facades\Log;
+
+
+class SelectGetpayRemit extends \Illuminate\Console\Command
+{
+    protected $signature = "getpay_remit:select";
+
+    protected $description = 'getpay_remit select';
+
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        $GetpayHelper = new GetpayHelper();
+        $GetpayHelper->selectGetpayRemit();
+        Log::info('定时任务:执行完成打款状态查询,等待下次执行');
+        $i = 0;
+        while ($i < 30) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+}

+ 32 - 0
app/Console/Commands/VisitCountToDb.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\DataApi\Helper\VisitCountHelper;
+use Illuminate\Support\Facades\Log;
+
+
+class VisitCountToDb extends \Illuminate\Console\Command
+{
+    protected $signature = "visit_count:todb";
+
+    protected $description = 'visit_count todb';
+
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        (new VisitCountHelper())->visitCountToDb();
+        Log::info('定时任务:执行完成访问点击入库,等待下次执行');
+        $i = 0;
+        while ($i < 300) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+}

+ 91 - 0
app/Console/Commands/WorkermanCommand.php

@@ -0,0 +1,91 @@
+<?php
+namespace App\Console\Commands;
+
+// require_once(public_path()."/saler_vendor/vendor/autoload.php");
+
+use GatewayWorker\BusinessWorker;
+use GatewayWorker\Gateway;
+use GatewayWorker\Register;
+use Illuminate\Console\Command;
+use Workerman\Worker;
+
+class WorkermanCommand extends Command
+{
+
+    protected $signature = 'workman {action} {--d}';
+
+    protected $description = 'Start a Workerman server.';
+
+    public function handle()
+    {
+        global $argv;
+        $action = $this->argument('action');
+
+        $argv[0] = 'wk';
+        $argv[1] = $action;
+        $argv[2] = $this->option('d') ? '-d' : '';
+
+        $this->start();
+    }
+
+    private function start()
+    {
+        $this->startGateWay();
+        $this->startBusinessWorker();
+        $this->startRegister();
+        Worker::runAll();
+    }
+
+    private function startBusinessWorker()
+    {
+        $worker                  = new BusinessWorker();
+        //work名称
+        $worker->name            = 'BusinessWorker';
+        //businessWork进程数
+        $worker->count           = 2;
+        //服务注册地址
+        $worker->registerAddress = '127.0.0.1:1236';
+        //设置\App\Workerman\Events类来处理业务
+        $worker->eventHandler    = \App\DataApi\Helper\WorkmanServerHelper::class;
+    }
+
+    private function startGateWay()
+    {  
+        //gateway进程
+        $context = [
+            'ssl' => [
+                'local_cert'  => public_path().'/saler_ssl_key/fullchain.pem', // 你的SSL证书路径
+                'local_pk'    => public_path().'/saler_ssl_key/privkey.key', // 你的SSL证书私钥路径
+                'verify_peer' => false, // 禁用对等验证
+                'verify_peer_name' => false, // 禁用对等验证
+                'allow_self_signed' => true // 允许自签名证书
+            ]
+        ];
+        $gateway = new Gateway("websocket://0.0.0.0:2346",$context);
+        // 开启SSL,websocket+SSL 即wss
+        $gateway->transport = 'ssl';
+        //gateway名称 status方便查看
+        $gateway->name                 = 'Gateway';
+        //gateway进程
+        $gateway->count                = 2;
+        //本机ip
+        $gateway->lanIp                = '127.0.0.1';
+        //内部通讯起始端口,如果$gateway->count = 4 起始端口为2300
+        //则一般会使用 2300,2301 2个端口作为内部通讯端口
+        $gateway->startPort            = 2300;
+        //心跳间隔
+        $gateway->pingInterval         = 30;
+        //客户端连续$pingNotResponseLimit次$pingInterval时间内不发送任何数据则断开链接,并触发onClose。
+        //我们这里使用的是服务端主动发送心跳所以设置为0 
+        $gateway->pingNotResponseLimit = 0;
+        //心跳数据
+        $gateway->pingData             = '{"type":"@heart@"}';
+        //服务注册地址
+        $gateway->registerAddress      = '127.0.0.1:1236';
+    }
+
+    private function startRegister()
+    {
+        new Register('text://0.0.0.0:1236');
+    }
+}

+ 44 - 0
app/Console/Commands/payOrderClean.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\DataApi\Helper\IotGoodsOrderHelper;
+use App\DataApi\Helper\IotPackageHelper;
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\Log;
+
+class payOrderClean extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'pay_order:clean';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'pay_order clean';
+
+    /**
+     * Execute the console command.
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        (new IotGoodsOrderHelper())->clearIotGoodsOrder();
+        (new IotPackageHelper())->clearIotPackageOrder();
+        Log::info('定时任务:执行完成清除待支付订单,等待下次执行');
+
+        $i = 0;
+        while ($i < 600) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+}

+ 35 - 0
app/Console/Commands/saveOnlineUserCount.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\DataApi\Helper\AppUserHelper;
+use Illuminate\Support\Facades\Log;
+
+//保存在线人数数据
+class saveOnlineUserCount extends \Illuminate\Console\Command
+{
+    protected $signature = "save_online_user_count:sync";
+
+    protected $description = 'save_online_user_count sync';
+
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        $AppUserHelper = new AppUserHelper;
+        $AppUserHelper->getOnlineUserCount(1);
+        Log::info('同步保存在线人数数据成功,请等待下次更新');
+        $i = 0;
+        //五分钟同步一次
+        while ($i < 300) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+
+}

+ 42 - 0
app/Console/Commands/sendIotPackageOrder.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\DataApi\Helper\IotPackageHelper;
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\Log;
+
+class sendIotPackageOrder extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'iot_package_order:send';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'iot_package_order send';
+
+    /**
+     * Execute the console command.
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        (new IotPackageHelper())->autoSendIotPackage();
+        Log::info('定时任务:执行完成设备套餐订单发货,等待下次执行');
+
+        $i = 0;
+        while ($i < 600) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+}

+ 35 - 0
app/Console/Commands/syncPackageInfo.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\DataApi\Helper\PackageHelper;
+use Illuminate\Support\Facades\Log;
+
+
+class syncPackageInfo extends \Illuminate\Console\Command
+{
+    protected $signature = "saler_package_info:sync";
+
+    protected $description = 'saler_package_info sync';
+
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        $PackageHelper = new PackageHelper();
+        $PackageHelper->syncPackageInfo();
+        Log::info('更新套餐标签信息成功,请等待下次更新');
+        $i = 0;
+        //10分钟同步一次
+        while ($i < 600) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+
+}

+ 35 - 0
app/Console/Commands/syncRefundApplyStatus.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\DataApi\Helper\RefundApplyHelper;
+use Illuminate\Support\Facades\Log;
+
+
+class syncRefundApplyStatus extends \Illuminate\Console\Command
+{
+    protected $signature = "refund_apply_status:sync";
+
+    protected $description = 'refund_apply_status sync';
+
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        $RefundApplyHelper = new RefundApplyHelper;
+        $RefundApplyHelper->syncRefundApplyStatus();
+        Log::info('同步返费申请状态成功,请等待下次更新');
+        $i = 0;
+        //半小时同步一次
+        while ($i < 600) {
+            sleep(1);
+            $i++;
+        }
+        $this->handle();
+    }
+
+}

+ 32 - 0
app/Console/Kernel.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Console;
+
+use Illuminate\Console\Scheduling\Schedule;
+use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
+
+class Kernel extends ConsoleKernel
+{
+    /**
+     * Define the application's command schedule.
+     *
+     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
+     * @return void
+     */
+    protected function schedule(Schedule $schedule)
+    {
+        // $schedule->command('inspire')->hourly();
+    }
+
+    /**
+     * Register the commands for the application.
+     *
+     * @return void
+     */
+    protected function commands()
+    {
+        $this->load(__DIR__.'/Commands');
+
+        require base_path('routes/console.php');
+    }
+}

+ 67 - 0
app/DataApiNew/Api/ActivityLogApi.php

@@ -0,0 +1,67 @@
+<?php
+/*
+ * @Description: 无表注释
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-03 13:12:48
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-03 13:12:48
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\ActivityLogHelper;
+use Illuminate\Support\Facades\Log;
+
+class ActivityLogApi
+{
+    protected $helper;
+
+    public function __construct(ActivityLogHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+    
+    // 查询一条
+    public function getActivityLogInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+    
+    // 查询列表
+    public function getActivityLogList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportActivityLogList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+    
+    // 导入
+    public function importActivityLogList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+    
+    // 添加
+    public function addActivityLog(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+    
+    // 修改
+    public function updateActivityLog(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+    
+    // 删除
+    public function deleteActivityLog(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+}

+ 196 - 0
app/DataApiNew/Api/AdminUsersApi.php

@@ -0,0 +1,196 @@
+<?php
+/*
+ * @Description: 用户管理
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-23 16:33:47
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-23 16:33:47
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\AdminUsersHelper;
+use Illuminate\Validation\ValidationException;
+use Illuminate\Support\Facades\Log;
+
+class AdminUsersApi
+{
+    protected $helper;
+
+    public function __construct(AdminUsersHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getAdminUsersInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getAdminUsersList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportAdminUsersList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importAdminUsersList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addAdminUsers(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateAdminUsers(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteAdminUsers(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 密码登录
+    public function userLogin(Request $request)
+    {
+        try {
+            return $this->helper->userLogin($request);
+        } catch (ValidationException $th) {
+            return response()->json([
+                'code' => 0,
+                'msg' => $th->validator->errors()->first(),
+            ], 422);
+        }
+    }
+
+    // 获取登录用户信息
+    public function getUserLoginInfo(Request $request)
+    {
+        return $this->helper->getUserLoginInfo($request);
+    }
+
+    // 验证码登录
+    public function userLoginByCode(Request $request)
+    {
+        try {
+            return $this->helper->userLoginByCode($request);
+        } catch (ValidationException $th) {
+            return response()->json([
+                'code' => 0,
+                'msg' => $th->validator->errors()->first(),
+            ], 422);
+        }
+    }
+
+    // 退出登录
+    public function userLogout(Request $request)
+    {
+        return $this->helper->userLogout($request);
+    }
+
+    // 设置用户分享码
+    public function setUserShareCode(Request $request)
+    {
+        return $this->helper->setUserShareCode($request);
+    }
+
+    // 自定义邀请码
+    public function setUserShareCodeCustomization(Request $request)
+    {
+        return $this->helper->setUserShareCodeCustomization($request);
+    }
+
+    // 海报秘钥获取邀请码
+    public function getPosterShareCode(Request $request)
+    {
+        return $this->helper->getPosterShareCode($request);
+    }
+
+    // 邀请码注册
+    public function userRegister(Request $request)
+    {
+        return $this->helper->userRegister($request);
+    }
+
+    // 用户注销
+    public function userCancel(Request $request)
+    {
+        return $this->helper->userCancel($request);
+    }
+
+    // 修改密码
+    public function updatePassword(Request $request)
+    {
+        return $this->helper->updatePassword($request);
+    }
+
+    // 重置密码
+    public function resetPassword(Request $request)
+    {
+        return $this->helper->resetPassword($request);
+    }
+
+    // 忘记密码
+    public function forgetPassword(Request $request)
+    {
+        return $this->helper->forgetPassword($request);
+    }
+
+    // 设置下级用户抽成
+    public function setUserYjType(Request $request)
+    {
+        return $this->helper->setUserYjType($request);
+    }
+
+    // 用户设置默认抽成
+    public function setDefaultYjType(Request $request)
+    {
+        return $this->helper->setDefaultYjType($request);
+    }
+
+    // 批量设置下级用户抽成
+    public function batchSetUserYjType(Request $request)
+    {
+        return $this->helper->batchSetUserYjType($request);
+    }
+
+    // 用户充值或扣除余额
+    public function userChangeBalance(Request $request)
+    {
+        return $this->helper->userChangeBalance($request);
+    }
+
+    // 实名认证
+    public function realNameAuth(Request $request)
+    {
+        return $this->helper->realNameAuth($request);
+    }
+
+    // 用户加入黑名单
+    public function joinBlackList(Request $request)
+    {
+        return $this->helper->joinBlackList($request);
+    }
+
+    // 用户移除黑名单
+    public function removeBlackList(Request $request)
+    {
+        return $this->helper->removeBlackList($request);
+    }
+}

+ 67 - 0
app/DataApiNew/Api/AdminUsersMemberLevelApi.php

@@ -0,0 +1,67 @@
+<?php
+/*
+ * @Description: 用户头衔
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-25 09:42:18
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-25 09:42:18
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\AdminUsersMemberLevelHelper;
+use Illuminate\Support\Facades\Log;
+
+class AdminUsersMemberLevelApi
+{
+    protected $helper;
+
+    public function __construct(AdminUsersMemberLevelHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+    
+    // 查询一条
+    public function getAdminUsersMemberLevelInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+    
+    // 查询列表
+    public function getAdminUsersMemberLevelList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportAdminUsersMemberLevelList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+    
+    // 导入
+    public function importAdminUsersMemberLevelList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+    
+    // 添加
+    public function addAdminUsersMemberLevel(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+    
+    // 修改
+    public function updateAdminUsersMemberLevel(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+    
+    // 删除
+    public function deleteAdminUsersMemberLevel(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+}

+ 73 - 0
app/DataApiNew/Api/AgentApiApi.php

@@ -0,0 +1,73 @@
+<?php
+/*
+ * @Description: 用户接口配置
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-06 08:43:11
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-06 08:43:11
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\AgentApiHelper;
+use Illuminate\Support\Facades\Log;
+
+class AgentApiApi
+{
+    protected $helper;
+
+    public function __construct(AgentApiHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getAgentApiInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getAgentApiList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportAgentApiList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importAgentApiList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addAgentApi(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateAgentApi(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteAgentApi(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 生成对接文档
+    public function generateDoc(Request $request)
+    {
+        return $this->helper->generateDoc($request);
+    }
+}

+ 133 - 0
app/DataApiNew/Api/AgentPackageApi.php

@@ -0,0 +1,133 @@
+<?php
+/*
+ * @Description: 合伙人套餐表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-26 09:24:11
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-26 09:24:11
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\AgentPackageHelper;
+use Illuminate\Support\Facades\Log;
+
+class AgentPackageApi
+{
+    protected $helper;
+
+    public function __construct(AgentPackageHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getAgentPackageInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getAgentPackageList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportAgentPackageList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importAgentPackageList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addAgentPackage(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateAgentPackage(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteAgentPackage(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 产品中心
+    public function productCenter(Request $request)
+    {
+        return $this->helper->productCenter($request);
+    }
+
+    // 产品中心导出
+    public function productCenterExport(Request $request)
+    {
+        return $this->helper->productCenterExport($request);
+    }
+
+    // 套餐详情
+    public function productDetail(Request $request)
+    {
+        return $this->helper->productDetail($request);
+    }
+
+    // 产品上下架
+    public function packageUpload(Request $request)
+    {
+        return $this->helper->packageUpload($request);
+    }
+
+    // 获取用户小店套餐
+    public function getShopPackage(Request $request)
+    {
+        return $this->helper->getShopPackage($request);
+    }
+
+    // 设置权重
+    public function setWeight(Request $request)
+    {
+        return $this->helper->setWeight($request);
+    }
+
+    // 设置是否允许直播(admin)
+    public function setLive(Request $request)
+    {
+        return $this->helper->setLive($request);
+    }
+
+    // 获取套餐信息
+    public function getPackageInfo(Request $request)
+    {
+        return $this->helper->getPackageInfo($request);
+    }
+
+    // 批量设置单品抽成
+    public function setUserProductYj(Request $request)
+    {
+        return $this->helper->setUserProductYj($request);
+    }
+
+    // 设置小程序直播购物车
+    public function setShopping(Request $request)
+    {
+        return $this->helper->setShopping($request);
+    }
+
+    // 获取小程序直播购物车产品
+    public function getShopping(Request $request)
+    {
+        return $this->helper->getShopping($request);
+    }
+}

+ 115 - 0
app/DataApiNew/Api/AgentPackageKdApi.php

@@ -0,0 +1,115 @@
+<?php
+/*
+ * @Description: 合伙人套餐表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-26 09:24:11
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-26 09:24:11
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\AgentPackageKdHelper;
+use Illuminate\Support\Facades\Log;
+
+class AgentPackageKdApi
+{
+    protected $helper;
+
+    public function __construct(AgentPackageKdHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getAgentPackageKdInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getAgentPackageKdList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportAgentPackageKdList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importAgentPackageKdList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addAgentPackageKd(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateAgentPackageKd(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteAgentPackageKd(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 产品中心
+    public function productCenterKd(Request $request)
+    {
+        return $this->helper->productCenter($request);
+    }
+
+    // 产品中心导出
+    public function productCenterKdExport(Request $request)
+    {
+        return $this->helper->productCenterExport($request);
+    }
+
+    // 套餐详情
+    public function productDetailKd(Request $request)
+    {
+        return $this->helper->productDetail($request);
+    }
+
+    // 产品上下架
+    public function packageUploadKd(Request $request)
+    {
+        return $this->helper->packageUpload($request);
+    }
+
+    // 获取用户小店套餐
+    public function getShopPackageKd(Request $request)
+    {
+        return $this->helper->getShopPackage($request);
+    }
+
+    // 设置权重
+    public function setWeightKd(Request $request)
+    {
+        return $this->helper->setWeight($request);
+    }
+
+    // 获取套餐信息
+    public function getPackageInfoKd(Request $request)
+    {
+        return $this->helper->getPackageInfo($request);
+    }
+
+    // 批量设置单品抽成
+    public function setUserProductYjKd(Request $request)
+    {
+        return $this->helper->setUserProductYj($request);
+    }
+}

+ 67 - 0
app/DataApiNew/Api/BlackListApi.php

@@ -0,0 +1,67 @@
+<?php
+/*
+ * @Description: 黑名单表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-02 09:12:07
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-02 09:12:07
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\BlackListHelper;
+use Illuminate\Support\Facades\Log;
+
+class BlackListApi
+{
+    protected $helper;
+
+    public function __construct(BlackListHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+    
+    // 查询一条
+    public function getBlackListInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+    
+    // 查询列表
+    public function getBlackListList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportBlackListList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+    
+    // 导入
+    public function importBlackListList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+    
+    // 添加
+    public function addBlackList(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+    
+    // 修改
+    public function updateBlackList(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+    
+    // 删除
+    public function deleteBlackList(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+}

+ 79 - 0
app/DataApiNew/Api/DyLiveApplyApi.php

@@ -0,0 +1,79 @@
+<?php
+/*
+ * @Description: 抖音直播申请表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-12 09:01:14
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-12 09:01:14
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\DyLiveApplyHelper;
+use Illuminate\Support\Facades\Log;
+
+class DyLiveApplyApi
+{
+    protected $helper;
+
+    public function __construct(DyLiveApplyHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getDyLiveApplyInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getDyLiveApplyList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportDyLiveApplyList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importDyLiveApplyList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addDyLiveApply(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateDyLiveApply(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteDyLiveApply(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 抖音直播申请
+    public function dyLiveApplySubmit(Request $request)
+    {
+        return $this->helper->dyLiveApplySubmit($request);
+    }
+
+    // 抖音直播审核
+    public function dyLiveApplyAudit(Request $request)
+    {
+        return $this->helper->dyLiveApplyAudit($request);
+    }
+}

+ 38 - 0
app/DataApiNew/Api/FileUploadApi.php

@@ -0,0 +1,38 @@
+<?php
+/*
+ * @Description: 上传文件
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-29 15:01:21
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-29 15:01:21
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\FileUploadHelper;
+use Illuminate\Support\Facades\Log;
+
+class FileUploadApi
+{
+    protected $helper;
+
+    public function __construct(FileUploadHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+    
+    // 文件上传
+    public function uploadFiles(Request $request)
+    {
+        return $this->helper->uploadFiles($request);
+    }
+
+    // 文件上传--压缩
+    public function uploadFilesCompress(Request $request)
+    {
+        return $this->helper->uploadFilesCompress($request);
+    }
+
+}

+ 79 - 0
app/DataApiNew/Api/GetPaysApi.php

@@ -0,0 +1,79 @@
+<?php
+/*
+ * @Description: 提现表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-04 13:18:11
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-04 13:18:11
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\GetPaysHelper;
+use Illuminate\Support\Facades\Log;
+
+class GetPaysApi
+{
+    protected $helper;
+
+    public function __construct(GetPaysHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getGetPaysInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getGetPaysList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportGetPaysList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importGetPaysList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addGetPays(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateGetPays(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteGetPays(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 提现申请
+    public function userGetpayApply(Request $request)
+    {
+        return $this->helper->userGetpayApply($request);
+    }
+
+    // 提现审核
+    public function userGetpayCheck(Request $request)
+    {
+        return $this->helper->userGetpayCheck($request);
+    }
+}

+ 67 - 0
app/DataApiNew/Api/HkOrderYjrecordApi.php

@@ -0,0 +1,67 @@
+<?php
+/*
+ * @Description: 号卡订单佣金记录
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-27 14:56:01
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-27 14:56:01
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\HkOrderYjrecordHelper;
+use Illuminate\Support\Facades\Log;
+
+class HkOrderYjrecordApi
+{
+    protected $helper;
+
+    public function __construct(HkOrderYjrecordHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+    
+    // 查询一条
+    public function getHkOrderYjrecordInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+    
+    // 查询列表
+    public function getHkOrderYjrecordList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportHkOrderYjrecordList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+    
+    // 导入
+    public function importHkOrderYjrecordList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+    
+    // 添加
+    public function addHkOrderYjrecord(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+    
+    // 修改
+    public function updateHkOrderYjrecord(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+    
+    // 删除
+    public function deleteHkOrderYjrecord(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+}

+ 79 - 0
app/DataApiNew/Api/HotRefreshApi.php

@@ -0,0 +1,79 @@
+<?php
+/*
+ * @Description: 热更新
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2025-01-07 10:17:19
+ * @LastEditors: lexuan
+ * @LastEditTime: 2025-01-07 10:17:19
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\HotRefreshHelper;
+use Illuminate\Support\Facades\Log;
+
+class HotRefreshApi
+{
+    protected $helper;
+
+    public function __construct(HotRefreshHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getHotRefreshInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getHotRefreshList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportHotRefreshList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importHotRefreshList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addHotRefresh(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateHotRefresh(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteHotRefresh(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 查询当前发布版本
+    public function getNowVersion(Request $request)
+    {
+        return $this->helper->getNowVersion($request);
+    }
+
+    // 设置当前发布版本
+    public function setNowVersion(Request $request)
+    {
+        return $this->helper->setNowVersion($request);
+    }
+}

+ 67 - 0
app/DataApiNew/Api/JkcCollegeApi.php

@@ -0,0 +1,67 @@
+<?php
+/*
+ * @Description: 集客仓商学院
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-02 11:40:06
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-02 11:40:06
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\JkcCollegeHelper;
+use Illuminate\Support\Facades\Log;
+
+class JkcCollegeApi
+{
+    protected $helper;
+
+    public function __construct(JkcCollegeHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+    
+    // 查询一条
+    public function getJkcCollegeInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+    
+    // 查询列表
+    public function getJkcCollegeList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportJkcCollegeList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+    
+    // 导入
+    public function importJkcCollegeList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+    
+    // 添加
+    public function addJkcCollege(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+    
+    // 修改
+    public function updateJkcCollege(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+    
+    // 删除
+    public function deleteJkcCollege(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+}

+ 73 - 0
app/DataApiNew/Api/LayerMangerApi.php

@@ -0,0 +1,73 @@
+<?php
+/*
+ * @Description: 弹窗管理表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-02 11:22:25
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-02 11:22:25
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\LayerMangerHelper;
+use Illuminate\Support\Facades\Log;
+
+class LayerMangerApi
+{
+    protected $helper;
+
+    public function __construct(LayerMangerHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getLayerMangerInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getLayerMangerList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportLayerMangerList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importLayerMangerList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addLayerManger(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateLayerManger(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteLayerManger(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 获取当前可显示弹窗
+    public function getLayerShow(Request $request)
+    {
+        return $this->helper->getLayerShow($request);
+    }
+}

+ 67 - 0
app/DataApiNew/Api/LbsApi.php

@@ -0,0 +1,67 @@
+<?php
+/*
+ * @Description: 轮播表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-29 15:01:21
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-29 15:01:21
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\LbsHelper;
+use Illuminate\Support\Facades\Log;
+
+class LbsApi
+{
+    protected $helper;
+
+    public function __construct(LbsHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getLbsInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getLbsList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportLbsList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importLbsList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addLbs(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateLbs(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteLbs(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+}

+ 73 - 0
app/DataApiNew/Api/OrderSettRecordApi.php

@@ -0,0 +1,73 @@
+<?php
+/*
+ * @Description: 结算记录表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-29 16:50:19
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-29 16:50:19
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\OrderSettRecordHelper;
+use Illuminate\Support\Facades\Log;
+
+class OrderSettRecordApi
+{
+    protected $helper;
+
+    public function __construct(OrderSettRecordHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+    
+    // 查询一条
+    public function getOrderSettRecordInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+    
+    // 查询列表
+    public function getOrderSettRecordList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportOrderSettRecordList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+    
+    // 导入
+    public function importOrderSettRecordList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+    
+    // 添加
+    public function addOrderSettRecord(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+    
+    // 修改
+    public function updateOrderSettRecord(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+    
+    // 删除
+    public function deleteOrderSettRecord(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 获取导入模版
+    public function getOrderSettImportTemplate(Request $request)
+    {
+        return $this->helper->getOrderSettImportTemplate($request);
+    }
+}

+ 93 - 0
app/DataApiNew/Api/OrdersApi.php

@@ -0,0 +1,93 @@
+<?php
+/*
+ * @Description: 无表注释
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-27 14:00:58
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-27 14:00:58
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\OrdersHelper;
+use Illuminate\Support\Facades\Log;
+
+class OrdersApi
+{
+    protected $helper;
+
+    public function __construct(OrdersHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getOrdersInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getOrdersList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportOrdersList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importOrdersList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addOrders(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateOrders(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteOrders(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 号卡订单提交
+    public function hkOrderSubmit(Request $request)
+    {
+        return $this->helper->hkOrderSubmit($request);
+    }
+
+    // 号卡订单结算
+    public function hkOrderSettlement(Request $request)
+    {
+        $request->validate([
+            'order_no' => 'required',
+        ]);
+        sys_log($request, '号卡订单结算', '号卡订单');
+        $order_no = $request->input('order_no');
+
+        list($status, $msg, $data) = $this->helper->hkOrderSettlement($order_no);
+        return response()->json(['code' => $status ? 1 : 0, 'msg' => $msg, 'data' => $data], 200);
+    }
+
+    // 手机号订单查询
+    public function hkOrderQuery(Request $request)
+    {
+        return $this->helper->hkOrderQuery($request);
+    }
+
+}

+ 92 - 0
app/DataApiNew/Api/OrdersKdApi.php

@@ -0,0 +1,92 @@
+<?php
+/*
+ * @Description: 无表注释
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-27 14:00:58
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-27 14:00:58
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\OrdersKdHelper;
+use Illuminate\Support\Facades\Log;
+
+class OrdersKdApi
+{
+    protected $helper;
+
+    public function __construct(OrdersKdHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getOrdersKdInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getOrdersKdList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportOrdersKdList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importOrdersKdList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addOrdersKd(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateOrdersKd(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteOrdersKd(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 宽带订单提交
+    public function kdOrderSubmit(Request $request)
+    {
+        return $this->helper->kdOrderSubmit($request);
+    }
+
+    // 宽带订单提交
+    public function kdOrderSettlement(Request $request)
+    {
+        $request->validate([
+            'order_no' => 'required',
+        ]);
+        sys_log($request, '宽带订单结算', '宽带订单');
+        $order_no = $request->input('order_no');
+
+        list($status, $msg, $data) = $this->helper->kdOrderSettlement($order_no);
+        return response()->json(['code' => $status ? 1 : 0, 'msg' => $msg, 'data' => $data], 200);
+    }
+
+    // 手机号订单查询
+    public function kdOrderQuery(Request $request)
+    {
+        return $this->helper->kdOrderQuery($request);
+    }
+}

+ 67 - 0
app/DataApiNew/Api/PackageMemberLevelRoyaltyApi.php

@@ -0,0 +1,67 @@
+<?php
+/*
+ * @Description: 套餐头衔奖金表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-26 13:47:54
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-26 13:47:54
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\PackageMemberLevelRoyaltyHelper;
+use Illuminate\Support\Facades\Log;
+
+class PackageMemberLevelRoyaltyApi
+{
+    protected $helper;
+
+    public function __construct(PackageMemberLevelRoyaltyHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+    
+    // 查询一条
+    public function getPackageMemberLevelRoyaltyInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+    
+    // 查询列表
+    public function getPackageMemberLevelRoyaltyList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportPackageMemberLevelRoyaltyList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+    
+    // 导入
+    public function importPackageMemberLevelRoyaltyList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+    
+    // 添加
+    public function addPackageMemberLevelRoyalty(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+    
+    // 修改
+    public function updatePackageMemberLevelRoyalty(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+    
+    // 删除
+    public function deletePackageMemberLevelRoyalty(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+}

+ 67 - 0
app/DataApiNew/Api/PackagesApi.php

@@ -0,0 +1,67 @@
+<?php
+/*
+ * @Description: 号卡套餐
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-25 16:38:13
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-25 16:38:13
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\PackagesHelper;
+use Illuminate\Support\Facades\Log;
+
+class PackagesApi
+{
+    protected $helper;
+
+    public function __construct(PackagesHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getPackagesInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getPackagesList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportPackagesList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importPackagesList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addPackages(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updatePackages(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deletePackages(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+}

+ 67 - 0
app/DataApiNew/Api/PackagesKdApi.php

@@ -0,0 +1,67 @@
+<?php
+/*
+ * @Description: 宽带套餐
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-25 16:38:13
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-25 16:38:13
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\PackagesKdHelper;
+use Illuminate\Support\Facades\Log;
+
+class PackagesKdApi
+{
+    protected $helper;
+
+    public function __construct(PackagesKdHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getPackagesKdInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getPackagesKdList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportPackagesKdList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importPackagesKdList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addPackagesKd(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updatePackagesKd(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deletePackagesKd(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+}

+ 73 - 0
app/DataApiNew/Api/PermissionsApi.php

@@ -0,0 +1,73 @@
+<?php
+/*
+ * @Description: 无表注释
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-28 13:29:06
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-28 13:29:06
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\PermissionsHelper;
+use Illuminate\Support\Facades\Log;
+
+class PermissionsApi
+{
+    protected $helper;
+
+    public function __construct(PermissionsHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getPermissionsInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getPermissionsList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportPermissionsList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importPermissionsList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addPermissions(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updatePermissions(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deletePermissions(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 获取用户权限列表
+    public function getUserPermissions(Request $request)
+    {
+        return $this->helper->getUserPermissions($request);
+    }
+}

+ 43 - 0
app/DataApiNew/Api/PlatformApiApi.php

@@ -0,0 +1,43 @@
+<?php
+/*
+ * @Description: 平台接口
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-28 13:29:06
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-28 13:29:06
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\PlatformApiHelper;
+use Illuminate\Support\Facades\Log;
+
+class PlatformApiApi
+{
+    protected $helper;
+
+    public function __construct(PlatformApiHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 获取号卡套餐列表
+    public function hkPlatPackageList(Request $request)
+    {
+        return $this->helper->hkPlatPackageList($request);
+    }
+
+    // 获取号卡套餐列表
+    public function hkPlatOrderSubmit(Request $request)
+    {
+        return $this->helper->hkPlatOrderSubmit($request);
+    }
+
+    // 获取号卡套餐列表
+    public function hkPlatOrderQuery(Request $request)
+    {
+        return $this->helper->hkPlatOrderQuery($request);
+    }
+}

+ 85 - 0
app/DataApiNew/Api/PostersApi.php

@@ -0,0 +1,85 @@
+<?php
+/*
+ * @Description: 无表注释
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-25 10:14:33
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-25 10:14:33
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\PostersHelper;
+use Illuminate\Support\Facades\Log;
+
+class PostersApi
+{
+    protected $helper;
+
+    public function __construct(PostersHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getPostersInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getPostersList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportPostersList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importPostersList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addPosters(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updatePosters(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deletePosters(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 创建代理招募海报
+    public function createUserPoster(Request $request)
+    {
+        return $this->helper->createUserPoster($request);
+    }
+
+    // 创建号卡小店海报
+    public function createShopPoster(Request $request)
+    {
+        return $this->helper->createShopPoster($request);
+    }
+
+    // 创建号卡套餐海报
+    public function createPackagePoster(Request $request)
+    {
+        return $this->helper->createPackagePoster($request);
+    }
+}

+ 36 - 0
app/DataApiNew/Api/PostersKdApi.php

@@ -0,0 +1,36 @@
+<?php
+/*
+ * @Description: 宽带海报
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-25 10:14:33
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-25 10:14:33
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\PostersKdHelper;
+use Illuminate\Support\Facades\Log;
+
+class PostersKdApi
+{
+    protected $helper;
+
+    public function __construct(PostersKdHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+    // 创建宽带小店海报
+    public function createShopPosterKd(Request $request)
+    {
+        return $this->helper->createShopPosterKd($request);
+    }
+
+    // 创建宽带套餐海报
+    public function createPackagePosterKd(Request $request)
+    {
+        return $this->helper->createPackagePosterKd($request);
+    }
+}

+ 78 - 0
app/DataApiNew/Api/PostersQrcodeApi.php

@@ -0,0 +1,78 @@
+<?php
+/*
+ * @Description: 海报二维码
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-26 17:37:37
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-26 17:37:37
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\PostersQrcodeHelper;
+use Illuminate\Support\Facades\Log;
+
+class PostersQrcodeApi
+{
+    protected $helper;
+
+    public function __construct(PostersQrcodeHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getPostersQrcodeInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getPostersQrcodeList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportPostersQrcodeList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importPostersQrcodeList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addPostersQrcode(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updatePostersQrcode(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deletePostersQrcode(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 中转链接
+    public function posterUrl(Request $request)
+    {
+        try {
+            return $this->helper->posterUrl($request);
+        } catch (\Throwable $e) {
+            Log::info($e);
+            abort(400, 'Invalid URL');
+        }
+    }
+}

+ 79 - 0
app/DataApiNew/Api/ProgramLiveApplyApi.php

@@ -0,0 +1,79 @@
+<?php
+/*
+ * @Description: 小程序直播申请表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-12 10:10:38
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-12 10:10:38
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\ProgramLiveApplyHelper;
+use Illuminate\Support\Facades\Log;
+
+class ProgramLiveApplyApi
+{
+    protected $helper;
+
+    public function __construct(ProgramLiveApplyHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+    
+    // 查询一条
+    public function getProgramLiveApplyInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+    
+    // 查询列表
+    public function getProgramLiveApplyList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportProgramLiveApplyList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+    
+    // 导入
+    public function importProgramLiveApplyList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+    
+    // 添加
+    public function addProgramLiveApply(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+    
+    // 修改
+    public function updateProgramLiveApply(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+    
+    // 删除
+    public function deleteProgramLiveApply(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 抖音直播申请
+    public function programLiveApplySubmit(Request $request)
+    {
+        return $this->helper->programLiveApplySubmit($request);
+    }
+
+    // 抖音直播审核
+    public function programLiveApplyAudit(Request $request)
+    {
+        return $this->helper->programLiveApplyAudit($request);
+    }
+}

+ 67 - 0
app/DataApiNew/Api/ProgramLivePackageApi.php

@@ -0,0 +1,67 @@
+<?php
+/*
+ * @Description: 小程序直播套餐
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-12 10:42:44
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-12 10:42:44
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\ProgramLivePackageHelper;
+use Illuminate\Support\Facades\Log;
+
+class ProgramLivePackageApi
+{
+    protected $helper;
+
+    public function __construct(ProgramLivePackageHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+    
+    // 查询一条
+    public function getProgramLivePackageInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+    
+    // 查询列表
+    public function getProgramLivePackageList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportProgramLivePackageList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+    
+    // 导入
+    public function importProgramLivePackageList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+    
+    // 添加
+    public function addProgramLivePackage(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+    
+    // 修改
+    public function updateProgramLivePackage(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+    
+    // 删除
+    public function deleteProgramLivePackage(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+}

+ 85 - 0
app/DataApiNew/Api/RolesApi.php

@@ -0,0 +1,85 @@
+<?php
+/*
+ * @Description: 无表注释
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-28 14:04:56
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-28 14:04:56
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\RolesHelper;
+use Illuminate\Support\Facades\Log;
+
+class RolesApi
+{
+    protected $helper;
+
+    public function __construct(RolesHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getRolesInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getRolesList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportRolesList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importRolesList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addRoles(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateRoles(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteRoles(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 向角色分配权限
+    public function assignPermissionsToRoles(Request $request)
+    {
+        return $this->helper->assignPermissionsToRoles($request);
+    }
+
+    // 向用户分配角色
+    public function assignRolesToUsers(Request $request)
+    {
+        return $this->helper->assignRolesToUsers($request);
+    }
+
+    // 获取用户角色列表
+    public function getUserRoles(Request $request)
+    {
+        return $this->helper->getUserRoles($request);
+    }
+}

+ 67 - 0
app/DataApiNew/Api/SuppliersApi.php

@@ -0,0 +1,67 @@
+<?php
+/*
+ * @Description: 供货商
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-04 16:57:57
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-04 16:57:57
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\SuppliersHelper;
+use Illuminate\Support\Facades\Log;
+
+class SuppliersApi
+{
+    protected $helper;
+
+    public function __construct(SuppliersHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+    
+    // 查询一条
+    public function getSuppliersInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+    
+    // 查询列表
+    public function getSuppliersList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportSuppliersList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+    
+    // 导入
+    public function importSuppliersList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+    
+    // 添加
+    public function addSuppliers(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+    
+    // 修改
+    public function updateSuppliers(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+    
+    // 删除
+    public function deleteSuppliers(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+}

+ 79 - 0
app/DataApiNew/Api/SystemMsgApi.php

@@ -0,0 +1,79 @@
+<?php
+/*
+ * @Description: 系统消息表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-02 15:25:21
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-02 15:25:21
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\SystemMsgHelper;
+use Illuminate\Support\Facades\Log;
+
+class SystemMsgApi
+{
+    protected $helper;
+
+    public function __construct(SystemMsgHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getSystemMsgInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getSystemMsgList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportSystemMsgList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importSystemMsgList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addSystemMsg(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateSystemMsg(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteSystemMsg(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 获取用户消息
+    public function selectUserMsg(Request $request)
+    {
+        return $this->helper->selectUserMsg($request);
+    }
+
+    // 获取用户最后一条消息
+    public function getLastUserMsg(Request $request)
+    {
+        return $this->helper->getLastUserMsg($request);
+    }
+}

+ 67 - 0
app/DataApiNew/Api/SystemSettingApi.php

@@ -0,0 +1,67 @@
+<?php
+/*
+ * @Description: 系统设置表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-02 14:50:21
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-02 14:50:21
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\SystemSettingHelper;
+use Illuminate\Support\Facades\Log;
+
+class SystemSettingApi
+{
+    protected $helper;
+
+    public function __construct(SystemSettingHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+    
+    // 查询一条
+    public function getSystemSettingInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+    
+    // 查询列表
+    public function getSystemSettingList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportSystemSettingList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+    
+    // 导入
+    public function importSystemSettingList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+    
+    // 添加
+    public function addSystemSetting(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+    
+    // 修改
+    public function updateSystemSetting(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+    
+    // 删除
+    public function deleteSystemSetting(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+}

+ 37 - 0
app/DataApiNew/Api/TencentSmsApi.php

@@ -0,0 +1,37 @@
+<?php
+/*
+ * @Description: 腾讯云短信
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-23 16:33:47
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-23 16:33:47
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\TencentSmsHelper;
+use Illuminate\Validation\ValidationException;
+use Illuminate\Support\Facades\Log;
+
+class TencentSmsApi
+{
+    protected $helper;
+
+    public function __construct(TencentSmsHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 获取短信验证码
+    public function getSmsCode(Request $request)
+    {
+        $request->validate([
+            'phone' => 'required',
+        ]);
+
+        $msmRes = $this->helper->getSmsCode($request);
+        return $msmRes;
+    }
+}

+ 79 - 0
app/DataApiNew/Api/UserShopSettingApi.php

@@ -0,0 +1,79 @@
+<?php
+/*
+ * @Description: 用户小店设置
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-10 13:33:43
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-10 13:33:43
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\UserShopSettingHelper;
+use Illuminate\Support\Facades\Log;
+
+class UserShopSettingApi
+{
+    protected $helper;
+
+    public function __construct(UserShopSettingHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getUserShopSettingInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getUserShopSettingList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportUserShopSettingList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importUserShopSettingList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addUserShopSetting(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateUserShopSetting(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteUserShopSetting(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 用户设置小店配置
+    public function userShopSetting(Request $request)
+    {
+        return $this->helper->userShopSetting($request);
+    }
+
+    // 获取用户设置的小店配置
+    public function getUserShopSetting(Request $request)
+    {
+        return $this->helper->getUserShopSetting($request);
+    }
+}

+ 67 - 0
app/DataApiNew/Api/UserYjrecordApi.php

@@ -0,0 +1,67 @@
+<?php
+/*
+ * @Description: 佣金记录表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-28 10:06:25
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-28 10:06:25
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\UserYjrecordHelper;
+use Illuminate\Support\Facades\Log;
+
+class UserYjrecordApi
+{
+    protected $helper;
+
+    public function __construct(UserYjrecordHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+    
+    // 查询一条
+    public function getUserYjrecordInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+    
+    // 查询列表
+    public function getUserYjrecordList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportUserYjrecordList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+    
+    // 导入
+    public function importUserYjrecordList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+    
+    // 添加
+    public function addUserYjrecord(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+    
+    // 修改
+    public function updateUserYjrecord(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+    
+    // 删除
+    public function deleteUserYjrecord(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+}

+ 85 - 0
app/DataApiNew/Api/WorkOrderApi.php

@@ -0,0 +1,85 @@
+<?php
+/*
+ * @Description: 工单表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-16 10:46:51
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-16 10:46:51
+ */
+
+namespace App\DataApiNew\Api;
+
+use Illuminate\Http\Request;
+use App\DataApiNew\Helper\WorkOrderHelper;
+use Illuminate\Support\Facades\Log;
+
+class WorkOrderApi
+{
+    protected $helper;
+
+    public function __construct(WorkOrderHelper $helper)
+    {
+        $this->helper = $helper;
+    }
+
+    // 查询一条
+    public function getWorkOrderInfo(Request $request)
+    {
+        return $this->helper->find($request);
+    }
+
+    // 查询列表
+    public function getWorkOrderList(Request $request)
+    {
+        return $this->helper->select($request);
+    }
+
+    // 导出
+    public function exportWorkOrderList(Request $request)
+    {
+        return $this->helper->export($request);
+    }
+
+    // 导入
+    public function importWorkOrderList(Request $request)
+    {
+        return $this->helper->import($request);
+    }
+
+    // 添加
+    public function addWorkOrder(Request $request)
+    {
+        return $this->helper->insert($request);
+    }
+
+    // 修改
+    public function updateWorkOrder(Request $request)
+    {
+        return $this->helper->update($request);
+    }
+
+    // 删除
+    public function deleteWorkOrder(Request $request)
+    {
+        return $this->helper->delete($request);
+    }
+
+    // 创建工单
+    public function createWorkOrder(Request $request)
+    {
+        return $this->helper->createWorkOrder($request);
+    }
+
+    // 结束工单
+    public function endWorkOrder(Request $request)
+    {
+        return $this->helper->endWorkOrder($request);
+    }
+
+    // 回复工单
+    public function replyWorkOrder(Request $request)
+    {
+        return $this->helper->replyWorkOrder($request);
+    }
+}

+ 136 - 0
app/DataApiNew/Helper/ActivityLogHelper.php

@@ -0,0 +1,136 @@
+<?php
+/*
+ * @Description: 无表注释
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-03 13:12:48
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-03 13:12:48
+ */
+ 
+namespace App\DataApiNew\Helper;
+ 
+use App\DataApiNew\Models\ActivityLog;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use Illuminate\Http\Request;
+
+class ActivityLogHelper{
+    // 查询条件
+    public function whens($query,$request)
+    {
+        return $query
+        ->when($request->filled('id'), fn($q) => $q->where('id', $request->id));
+    }
+    
+    // 查询列表
+    public function select(Request $request)
+    {
+        $page = new Pages($request,ActivityLog::query());
+
+        $page->before(function($query) use ($request) {
+            $query->select(ActivityLog::$selectFields);
+            return $this->whens($query,$request);
+        });
+
+        $result = $page->paginate();
+        
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {   
+        $query = ActivityLog::select(ActivityLog::$selectFields);
+        $query = $this->whens($query,$request);
+        $query->orderBy('created_at','desc');
+        $header = [
+          ];
+        $getEnValue = $this->getEnValue();
+        
+        $excel = new SpoutExport($header);
+        $excel->setData($query->get());
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+        
+        return $result ? success($result['url']) : error();
+    }
+    
+    // 导入
+    public function import(Request $request)
+    {   
+        $header = [
+          ];
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+        
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = ActivityLog::where(['id'=>$request->id])->select(ActivityLog::$selectFields)->first();
+        return success($result);
+    }
+    
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            // 'name' => 'required',
+        ]);
+        $result = ActivityLog::create($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+ 
+        $result = ActivityLog::where(['id'=>$request->id])->update($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",",$id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = ActivityLog::whereIn('id', $arr)->delete();
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+}

+ 1027 - 0
app/DataApiNew/Helper/AdminUsersHelper.php

@@ -0,0 +1,1027 @@
+<?php
+/*
+ * @Description: 用户表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-23 16:33:47
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-23 16:33:47
+ */
+
+namespace App\DataApiNew\Helper;
+
+use App\DataApiNew\Models\AdminUsers;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use App\DataApiNew\Models\AdminUserLevel;
+use App\DataApiNew\Models\AdminUsersMemberLevel;
+use App\DataApiNew\Models\BlackList;
+use App\DataApiNew\Models\Orders;
+use App\DataApiNew\Models\SystemSetting;
+use App\DataApiNew\Models\UserYjrecord;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Token;
+
+class AdminUsersHelper
+{
+    // 查询条件
+    public function whens($query, $request)
+    {
+        return $query
+            ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id))
+            ->when($request->filled('mobile'), fn ($q) => $q->where('mobile', $request->mobile))
+            ->when($request->filled('username'), fn ($q) => $q->where('username','like', "%$request->username%"));
+    }
+
+    // 查询列表
+    public function select(Request $request)
+    {
+        $user_id = $request->user()->id;
+
+        $page = new Pages($request, AdminUsers::query());
+
+        $page->withRelations(['member_level']);
+
+        $page->before(function ($query) use ($request, $user_id) {
+            if (!AdminUsers::isAdmin($user_id)) {
+                $directChildrens = AdminUsers::getDirectChildrens($user_id); // 获取全部下级,不包括自己
+
+                $query->whereIn('id', $directChildrens);
+            }
+            $query->select(AdminUsers::$selectFields);
+            return $this->whens($query, $request);
+        });
+
+        $page->after(function ($data) use ($user_id) {
+            if (!AdminUsers::isAdmin($user_id)) {
+                $data->makeHidden(['id']);
+            }
+        });
+
+        $result = $page->paginate();
+
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {
+        $request->validate([
+            'created_at_start' => 'required',
+            'created_at_end' => 'required',
+        ]);
+
+        $header = [
+            '用户编码' => 'user_id',
+            '用户名' => 'username',
+            '头衔' => 'member_level_id',
+            '手机号码' => 'mobile',
+            '地址' => 'address',
+            '剩余佣金' => 'yj',
+            '邀请码' => 'share_code',
+            '联系电话' => 'contact_number',
+            '号卡抽成类型' => 'yj_type',
+            '号卡抽成比例' => 'yj_p',
+            '号卡抽成金额' => 'yj_a',
+            '宽带抽成类型' => 'kd_yj_type',
+            '宽带抽成比例' => 'kd_yj_p',
+            '宽带抽成金额' => 'kd_yj_a',
+            '设备抽成类型' => 'iot_yj_type',
+            '设备抽成比例' => 'iot_yj_p',
+            '号卡默认抽成类型' => 'default_yj_type',
+            '号卡默认抽成比例' => 'default_yj_p',
+            '号卡默认抽成金额' => 'default_yj_a',
+            '宽带默认抽成类型' => 'default_kd_yj_type',
+            '宽带默认抽成比例' => 'default_kd_yj_p',
+            '宽带默认抽成金额' => 'default_kd_yj_a',
+            '设备默认抽成类型' => 'default_iot_yj_type',
+            '设备默认抽成比例' => 'default_iot_yj_p',
+        ];
+
+        sys_log($request, '用户导出', '用户管理');
+
+        $user_id = $request->user()->id;
+
+        $query = AdminUsers::select(array_values($header));
+
+        if (!AdminUsers::isAdmin($user_id)) {
+            $directChildrens = AdminUsers::getDirectChildrens($user_id); // 获取全部下级,不包括自己
+            $query->whereIn('id', $directChildrens);
+        }
+
+        $query = $this->whens($query, $request);
+        $query->orderBy('created_at', 'desc');
+
+        $getEnValue = $this->getEnValue();
+
+        $excel = new SpoutExport($header);
+        $excel->setQuery($query);
+        $result = $excel->setEnum($getEnValue)
+            ->setProcessStyle()
+            // ->setDownload()
+            ->spoutToExcel('团队列表');
+        // return $result;
+        return $result ? success($result['url']) : error();
+    }
+
+    // 导入
+    public function import(Request $request)
+    {
+        $header = [
+            '用户名' => 'username',
+            '密码' => 'password',
+            '名称' => 'name',
+            '头像' => 'avatar',
+            '真实密码' => 'real_password',
+            '联系电话' => 'mobile',
+            '地址' => 'address',
+            '剩余佣金' => 'yj',
+            '佣金比例' => 'yj_p',
+            '已提现佣金' => 'al_yj',
+            '是否是代理' => 'is_agent',
+            '邀请码' => 'share_code',
+            '角色' => 'role_ids',
+            '代理等级:0合伙人 1代理' => 'agent_level',
+            '上级id' => 'pid',
+            '客服类型 1:链接 2:图片' => 'kefu_type',
+            '客服链接' => 'kefu_url',
+            '客服图片' => 'kefu_image',
+            '小店头像图片' => 'small_shop_image',
+            '联系电话' => 'contact_number',
+            '联系二维码' => 'contact_qrcode',
+            '集客仓用户id' => 'jkc_user_id',
+            '分成类型 1:比例 2:金额' => 'yj_type',
+            '合伙人默认抽成比例' => 'default_yj_p',
+            '备注' => 'remark',
+            '删除时间' => 'deleted_at',
+            '下级分销是否强制关注' => 'is_follow',
+            '是否发送套餐短信' => 'is_package_sms',
+            '是否实名' => 'is_real',
+            '身份证姓名' => 'id_name',
+            '身份证号码' => 'id_card',
+            '身份证家庭地址' => 'id_card_address',
+            '身份证正面' => 'id_card_front',
+            '身份证反面' => 'id_card_back',
+            '合伙人运营' => 'agent_operate',
+            '合伙人客服' => 'agent_kefu',
+            '合伙人主播' => 'agent_anchor',
+            '公众号open_id' => 'gzh_open_id',
+            '小程序open_id' => 'xcx_open_id',
+            'unionid' => 'unionid',
+            '是否接口提单' => 'is_api',
+            '状态' => 'status',
+            '合伙人默认抽成类型 0不启用 1比例 2金额' => 'default_yj_type',
+            '套餐分成开关 0关 1开(默认)' => 'package_yj_status',
+            '显示首冲信息开关' => 'show_first_charge',
+            '会员等级id' => 'member_level_id',
+            '是否允许下单 0禁止下单 1可以下单' => 'is_put_order',
+            '设备抽成类型 1比例 2金额' => 'iot_yj_type',
+            '设备抽成比例' => 'iot_yj_p',
+            '默认设备抽成类型 1比例 2金额' => 'default_iot_yj_type',
+            '默认设备抽成比例' => 'default_iot_yj_p',
+            '宽带抽成类型 1比例 2金额' => 'kd_yj_type',
+            '宽带抽成比例' => 'kd_yj_p',
+            '默认宽带抽成类型 1比例 2金额' => 'default_kd_yj_type',
+            '默认宽带抽成比例' => 'default_kd_yj_p',
+            '是否快照授权 0否 1是' => 'is_snapshotuser',
+        ];
+        $getEnValue = $this->getEnValue();
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+            'yj_type' => SystemSetting::$drawType,
+            'kd_yj_type' => SystemSetting::$drawType,
+            'iot_yj_type' => SystemSetting::$drawType,
+            'default_yj_type' => SystemSetting::$drawType,
+            'default_kd_yj_type' => SystemSetting::$drawType,
+            'default_iot_yj_type' => SystemSetting::$drawType,
+            'member_level_id' => AdminUsersMemberLevel::pluck('name', 'id')
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = AdminUsers::where(['id' => $request->id])->select(AdminUsers::$selectFields)->first();
+        return success($result);
+    }
+
+    // 添加
+    public function insert(Request $request)
+    {
+        sys_log($request, '用户添加', '用户日志');
+        $request->validate([
+            'name' => 'required',
+        ]);
+        $result = AdminUsers::create($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 修改
+    public function update(Request $request)
+    {
+        sys_log($request, '用户修改', '用户日志');
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        $result = AdminUsers::where(['id' => $request->id])->update($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        sys_log($request, '用户删除', '用户日志');
+
+        $id_str = $request->ids;
+        $arr = explode(",", $id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = AdminUsers::whereIn('id', $arr)->delete();
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 密码登录
+    public function userLogin(Request $request)
+    {
+        $request->validate([
+            'mobile' => 'required',
+            'password' => 'required',
+            'login_type' => 'required',
+        ], [
+            'mobile.required' => '手机号码不能为空',
+            'password.required' => '密码不能为空',
+            'login_type.required' => '登录类型不能为空',
+        ]);
+
+        sys_log($request, '用户登录', '用户日志');
+
+        // 检查黑名单
+        if (BlackList::checkUser(null, $request->mobile)) {
+            return error("账号异常");
+        }
+
+        $password = md5($request->password);
+
+        $user = AdminUsers::where(['mobile' => $request->mobile, 'password' => $password])->select('id', 'username', 'user_id', 'mobile', 'password', 'share_code', 'member_level_id')->first();
+
+        if ($user) {
+            $data = $user->only([
+                'id',
+                'user_id',
+                'username',
+                'mobile',
+                'share_code',
+                'member_level_id',
+            ]);
+            $data['token'] = $user->createToken('BackSaler')->plainTextToken;
+            return success($data,'登录成功');
+        } else {
+            return error("密码错误");
+        }
+    }
+
+    // 获取登录用户信息
+    public function getUserLoginInfo(Request $request)
+    {
+        $user_id = $request->user()->id;
+        $user = AdminUsers::where(['id' => $user_id])->select('username', 'user_id', 'mobile', 'share_code', 'member_level_id', 'yj as balance')->first();
+
+        if ($user) {
+            $data = $user->only([
+                'user_id',
+                'username',
+                'mobile',
+                'share_code',
+                'member_level_id',
+                'balance',
+            ]);
+            return success($data);
+        }
+        return error();
+    }
+
+    // 验证码登录
+    public function userLoginByCode(Request $request)
+    {
+        $request->validate([
+            'mobile' => 'required',
+            'sms_code' => 'required',
+            'login_type' => 'required',
+        ], [
+            'mobile.required' => '手机号码不能为空',
+            'sms_code.required' => '验证码不能为空',
+            'login_type.required' => '登录类型不能为空',
+        ]);
+
+        sys_log($request, '用户验证码登录', '用户日志');
+
+        // 检查黑名单
+        if (BlackList::checkUser(null, $request->mobile)) {
+            return error("账号异常");
+        }
+
+        $notSmsMobile = AdminUsers::$notSmsMobile;
+        if (!in_array($request->mobile, $notSmsMobile)) {
+            $smsCodeHelper = new TencentSmsHelper();
+            $res = $smsCodeHelper->validSmsCode($request);
+            if ($res['code'] == 0) return $res;
+        }
+
+        $user = AdminUsers::where(['mobile' => $request->mobile])->select('id', 'username', 'user_id', 'mobile', 'password', 'share_code', 'member_level_id')->first();
+
+        if ($user) {
+            $data = $user->only([
+                'id',
+                'user_id',
+                'username',
+                'mobile',
+                'share_code',
+                'member_level_id',
+            ]);
+            $data['token'] = $user->createToken('BackSaler')->plainTextToken;
+            return success($data,'登录成功');
+        } else {
+            return error("账号未注册");
+        }
+    }
+
+    // 退出登录
+    public function userLogout(Request $request)
+    {
+        sys_log($request, '用户退出', '用户日志');
+        $user = $request->user();
+        if ($user) {
+            $request->user()->currentAccessToken()->delete(); // 删除当前token
+            // $user->tokens()->delete();// 撤销所有token
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 生成邀请码 验证用户唯一
+    public function setUserShareCode(Request $request)
+    {
+        sys_log($request, '生成邀请码', '用户日志');
+        // $user_id = $request->input('user_id', auth()->id());
+        // $share_code = $request->input('share_code', (new UtilsHelper)->generateNextCode());
+
+        $user_id = auth()->id();
+        $share_code = (new UtilsHelper)->generateNextCode();
+
+        $share_code_status = AdminUsers::where('share_code', $share_code)->exists();
+        if ($share_code_status) {
+            return error("邀请码已被使用");
+        }
+
+        $info = AdminUsers::where('user_id', $user_id)->first();
+        if (!$info || !empty($info->share_code)) {
+            return error("邀请码已存在");
+        }
+
+        $result = $info->update(['share_code' => $share_code]);
+        if ($result) {
+            return success([],'修改邀请码成功');
+        } else {
+            return error('修改邀请码失败');
+        }
+    }
+
+    // 自定义邀请码
+    public function setUserShareCodeCustomization(Request $request)
+    {
+        $request->validate([
+            'user_id' => 'required',
+            'share_code' => 'required',
+        ]);
+
+        sys_log($request, '自定义邀请码', '用户日志');
+
+        if (!AdminUsers::isAdmin($request->user()->id)) {
+            return error('权限不足');
+        }
+
+        $share_code = $request->input('share_code', (new UtilsHelper)->generateNextCode());
+
+        $share_code_status = AdminUsers::Where('share_code', $share_code)->exists();
+
+        if ($share_code_status) {
+            return error('邀请码被使用');
+        }
+
+        $result = AdminUsers::where('id', $request->user_id)->update(['share_code' => $share_code]);
+        if ($result) {
+            return success([],'修改邀请码成功');
+        } else {
+            return error('修改邀请码失败');
+        }
+    }
+
+    // 海报秘钥获取邀请码
+    public function getPosterShareCode(Request $request)
+    {
+        $request->validate([
+            'poster_key' => 'required',
+        ]);
+
+        $poster_key = decrypt($request->poster_key);
+        parse_str($poster_key, $poster_key_arr);
+
+        return success($poster_key_arr['share_code']);
+    }
+
+    // 邀请码注册
+    public function userRegister(Request $request)
+    {
+        $request->validate([
+            'mobile' => 'required',
+            'password' => 'required',
+            'sms_code' => 'required',
+        ]);
+
+        sys_log($request, '用户注册', '用户日志');
+
+        if ($request->has('share_code')){
+            $share_code = $request->share_code;
+
+            $notSmsMobile = AdminUsers::$notSmsMobile;
+            if (!in_array($request->mobile, $notSmsMobile)) {
+                $smsCodeHelper = new TencentSmsHelper();
+                $res = $smsCodeHelper->validSmsCode($request);
+                if ($res['code'] == 0) return $res;
+            }
+
+            $user = AdminUsers::where('mobile', $request->mobile)->exists();
+            if ($user) {
+                return error('该手机号已注册');
+            }
+
+            $parent_user = AdminUsers::where('share_code', $share_code)->first();
+            if ($parent_user) {
+                $yj_type = $parent_user['default_yj_type'];
+                $yj_a = $parent_user['default_yj_a'];
+                $yj_p = $parent_user['default_yj_p'];
+                $iot_yj_type = $parent_user['default_iot_yj_type'];
+                $iot_yj_p = $parent_user['default_iot_yj_p'];
+                $kd_yj_type = $parent_user['default_kd_yj_type'];
+                $kd_yj_p = $parent_user['default_kd_yj_p'];
+                $kd_yj_a = $parent_user['default_kd_yj_a'];
+            } else {
+                $parent_user = AdminUsers::where('id', AdminUsers::ADMINID)->first();
+                $defaultYjConfig = AdminUsers::$defaultYjConfig;
+                $yj_type = $defaultYjConfig['default_yj_type'];
+                $yj_a = $defaultYjConfig['default_yj_a'];
+                $yj_p = $defaultYjConfig['default_yj_p'];
+                $iot_yj_type = $defaultYjConfig['default_iot_yj_type'];
+                $iot_yj_p = $defaultYjConfig['default_iot_yj_p'];
+                $kd_yj_type = $defaultYjConfig['default_kd_yj_type'];
+                $kd_yj_p = $defaultYjConfig['default_kd_yj_p'];
+                $kd_yj_a = $defaultYjConfig['default_kd_yj_a'];
+            }
+        } else{ 
+            $request->validate([
+                'poster_key' => 'required',
+            ]);
+
+            $poster_key = decrypt($request->poster_key);
+            parse_str($poster_key, $poster_key_arr);
+
+            $notSmsMobile = AdminUsers::$notSmsMobile;
+            if (!in_array($request->mobile, $notSmsMobile)) {
+                $smsCodeHelper = new TencentSmsHelper();
+                $res = $smsCodeHelper->validSmsCode($request);
+                if ($res['code'] == 0) return $res;
+            }
+    
+            $user = AdminUsers::where('mobile', $request->mobile)->exists();
+            if ($user) {
+                return error('该手机号已注册');
+            }
+    
+            $parent_user = AdminUsers::where('share_code', $poster_key_arr['share_code'])->first();
+            if (!$parent_user) {
+                return error('邀请码不存在');
+            }
+            $defaultYjConfig = AdminUsers::$defaultYjConfig;
+    
+            if (!isset($poster_key_arr['default_yj_type']) || $poster_key_arr['default_yj_type'] == 0) {
+                $yj_type = $defaultYjConfig['default_yj_type'];
+                $yj_a = $defaultYjConfig['default_yj_a'];
+                $yj_p = $defaultYjConfig['default_yj_p'];
+            } else {
+                $yj_type = $poster_key_arr['default_yj_type'];
+                $yj_a = $poster_key_arr['default_yj_a'];
+                $yj_p =  $poster_key_arr['default_yj_p'];
+            }
+    
+            if (!isset($poster_key_arr['default_iot_yj_type']) || $poster_key_arr['default_iot_yj_type'] == 0) {
+                $iot_yj_type = $defaultYjConfig['default_iot_yj_type'];
+                $iot_yj_p = $defaultYjConfig['default_iot_yj_p'];
+            } else {
+                $iot_yj_type = $poster_key_arr['default_iot_yj_type'];
+                $iot_yj_p = $poster_key_arr['default_iot_yj_p'];
+            }
+    
+            if (!isset($poster_key_arr['default_kd_yj_type']) || $poster_key_arr['default_kd_yj_type'] == 0) {
+                $kd_yj_type = $defaultYjConfig['default_kd_yj_type'];
+                $kd_yj_p = $defaultYjConfig['default_kd_yj_p'];
+                $kd_yj_a = $defaultYjConfig['default_kd_yj_a'];
+            } else {
+                $kd_yj_type = $poster_key_arr['default_kd_yj_type'];
+                $kd_yj_p =  $poster_key_arr['default_kd_yj_p'];
+                $kd_yj_a = $poster_key_arr['default_kd_yj_a'];
+            }
+        }
+
+    
+        DB::beginTransaction();
+
+        try {
+            $userCreate = AdminUsers::create([
+                'user_id' => UtilsHelper::user_id(),
+                'mobile' => $request->mobile,
+                'username' => "用户" . substr($request->mobile, -4),
+                'password' => md5($request->password),
+                'real_password' => $request->password,
+                'share_code' => (new UtilsHelper)->generateNextCode(),
+                'yj_type' => $yj_type, // 分成类型 1:比例 2:金额
+                'yj_a' => $yj_a, // 分成金额
+                'yj_p' =>  $yj_p, // 佣金比例
+                'iot_yj_type' => $iot_yj_type, // 设备抽成类型 1比例 2金额
+                'iot_yj_p' => $iot_yj_p, // 设备抽成比例
+                'kd_yj_type' => $kd_yj_type, // 宽带抽成类型 1比例 2金额
+                'kd_yj_p' => $kd_yj_p, // 宽带抽成比例
+                'kd_yj_a' => $kd_yj_a, // 宽带抽成金额
+                'parent_id' => $parent_user->id,
+                'agent_level' => $parent_user->agent_level + 1,
+            ]);
+
+            if ($userCreate) {
+                $up_level_path = $parent_user->level_path;
+                $level_path = $up_level_path . ',' . "[$userCreate->id]";
+                $userCreate->update(['level_path' => $level_path]);
+
+                DB::commit();
+                return success([],'注册成功');
+            } else {
+                DB::rollBack();
+                return error('注册失败');
+            }
+        } catch (\Throwable $th) {
+            DB::rollBack();
+            Log::error("注册失败:" . $th);
+            return error('注册失败');
+        }
+    }
+
+    // 用户注销
+    public function userCancel(Request $request)
+    {
+        sys_log($request, '用户注销', '用户日志');
+
+        $user_id = auth()->id();
+
+        if (!AdminUsers::isAdmin($user_id)) {
+            return error('注销失败');
+        }
+
+        $userInfo = AdminUsers::where('id', $user_id)->first();
+        if (empty($userInfo)) {
+            return error('用户不存在');
+        }
+
+        $request['user_cancel_info'] = $userInfo->toArray();
+
+        $result = $userInfo->update([
+            'mobile' => null,
+            'id_name' => null, //身份证姓名
+            'id_card' => null, //身份证号码
+            'status' => 1, // 注销
+        ]);
+
+        if ($result) {
+            $userInfo->tokens()->delete();
+
+            return success([],'注销成功');
+        } else {
+            return error('注销失败');
+        }
+    }
+
+    // 修改密码
+    public function updatePassword(Request $request)
+    {
+        $request->validate([
+            'old_password' => 'required',
+            'new_password' => 'required|min:6',
+            're_password' => 'required|same:new_password',
+        ]);
+
+        sys_log($request, '修改密码', '用户日志');
+
+        $user_id = auth()->id();
+
+        $userInfo = AdminUsers::where('id', $user_id)->first();
+        if (empty($userInfo)) {
+            return error('用户不存在');
+        }
+
+        if (md5($request->old_password) != $userInfo['password']) {
+            return error('原密码错误');
+        }
+
+        $result = $userInfo->update([
+            'password' => md5($request->new_password),
+            'real_password' => $request->new_password,
+        ]);
+
+        if ($result) {
+            $userInfo->tokens()->delete();
+            return success([],'修改成功');
+        } else {
+            return error('修改失败');
+        }
+    }
+
+    // 重置密码
+    public function resetPassword(Request $request)
+    {
+        $request->validate([
+            'new_password' => 'required|min:6',
+            'user_id' => 'required',
+        ]);
+
+        sys_log($request, '重置密码', '用户日志');
+
+        if (!AdminUsers::isAdmin(auth()->id())) {
+            return error("无权操作");
+        }
+
+        $user_id = $request->user_id;
+
+        $userInfo = AdminUsers::where('id', $user_id)->first();
+        if (empty($userInfo)) {
+            return error("用户不存在");
+        }
+
+        $result = $userInfo->update([
+            'password' => md5($request->new_password),
+            'real_password' => $request->new_password,
+        ]);
+
+        if ($result) {
+            $userInfo->tokens()->delete();
+            return success($request->new_password,'重置成功');
+        } else {
+            return error('重置失败');
+        }
+    }
+
+    // 忘记密码
+    public function forgetPassword(Request $request)
+    {
+        $request->validate([
+            'mobile' => 'required|min:11',
+            'sms_code' => 'required',
+            'new_password' => 'required'
+        ]);
+
+        $smsCodeHelper = new TencentSmsHelper();
+        $res = $smsCodeHelper->validSmsCode($request);
+        if ($res['code'] == 0) return $res;
+
+        $userInfo = AdminUsers::where('mobile', $request->mobile)->first();
+        if (empty($userInfo)) {
+            return error("手机号不存在");
+        }
+
+        $result = $userInfo->update([
+            'password' => md5($request->new_password),
+            'real_password' => $request->new_password,
+        ]);
+
+        if ($result) {
+            $userInfo->tokens()->delete();
+            return success([],'重置成功');
+        } else {
+            return error('重置失败');
+        }
+    }
+
+    // 设置下级用户抽成
+    public function setUserYjType(Request $request)
+    {
+        $request->validate([
+            'user_id' => 'required|integer',
+            'yj_type' => 'in:1,2',
+            'yj_a' => 'numeric',
+            'yj_p' => 'integer',
+            'iot_yj_type' => 'in:1,2',
+            'iot_yj_p' => 'integer',
+            'kd_yj_type' => 'in:1,2',
+            'kd_yj_p' => 'integer',
+            'kd_yj_a' => 'numeric',
+        ]);
+
+        $op_user_id = auth()->id();
+
+        sys_log($request, '设置下级用户抽成', '用户日志');
+
+        $parent_id = AdminUsers::where('id', $request->user_id)->value('parent_id');
+
+        if (!(AdminUsers::isAdmin($op_user_id) || $parent_id == $op_user_id)) {
+            return ['code' => 0, 'msg' => "设置失败"];
+        }
+
+        $data = $request->only([
+            'yj_type',
+            'yj_a',
+            'yj_p',
+            'iot_yj_type',
+            'iot_yj_p',
+            'kd_yj_type',
+            'kd_yj_p',
+            'kd_yj_a',
+        ]);
+
+        $result = AdminUsers::where('id', $request->user_id)->update($data);
+
+        return $result ? ['code' => 1, 'msg' => "设置成功"] : ['code' => 0, 'msg' => "设置失败"];
+    }
+
+    // 批量设置下级用户抽成
+    public function batchSetUserYjType(Request $request)
+    {
+        $request->validate([
+            'user_ids' => 'required|String',
+            'yj_type' => 'in:1,2',
+            'yj_a' => 'numeric',
+            'yj_p' => 'integer',
+            'iot_yj_type' => 'in:1,2',
+            'iot_yj_p' => 'integer',
+            'kd_yj_type' => 'in:1,2',
+            'kd_yj_p' => 'integer',
+            'kd_yj_a' => 'numeric',
+        ]);
+
+        sys_log($request, '批量设置下级用户抽成', '用户日志');
+
+        $op_user_id = auth()->id();
+
+        $user_ids = explode(',', $request->user_ids);
+        $parent_id = AdminUsers::whereIn('id', $user_ids)->pluck('parent_id')->toArray();
+
+        if (!((in_array($op_user_id, array_unique($parent_id)) && reset($parent_id) === $op_user_id) || AdminUsers::isAdmin($op_user_id))) {
+            return ['code' => 0, 'msg' => "设置失败"];
+        }
+
+        $data = $request->only([
+            'yj_type',
+            'yj_a',
+            'yj_p',
+            'iot_yj_type',
+            'iot_yj_p',
+            'kd_yj_type',
+            'kd_yj_p',
+            'kd_yj_a',
+        ]);
+
+        $result = AdminUsers::whereIn('id', $user_ids)->update($data);
+
+        return $result ? ['code' => 1, 'msg' => "设置成功"] : ['code' => 0, 'msg' => "设置失败"];
+    }
+
+    // 用户设置默认抽成
+    public function setDefaultYjType(Request $request)
+    {
+        $request->validate([
+            'default_yj_type' => 'in:1,2',
+            'default_yj_a' => 'numeric',
+            'default_yj_p' => 'integer',
+            'default_iot_yj_type' => 'in:1,2',
+            'default_iot_yj_p' => 'integer',
+            'default_kd_yj_type' => 'in:1,2',
+            'default_kd_yj_p' => 'integer',
+            'default_kd_yj_a' => 'numeric',
+        ]);
+
+        sys_log($request, '用户设置默认抽成', '用户日志');
+
+        $result = AdminUsers::where('id', auth()->id())->update($request->only([
+            'default_yj_type',
+            'default_yj_a',
+            'default_yj_p',
+            'default_iot_yj_type',
+            'default_iot_yj_p',
+            'default_kd_yj_type',
+            'default_kd_yj_p',
+            'default_kd_yj_a',
+        ]));
+
+        return $result ? ['code' => 1, 'msg' => "设置成功"] : ['code' => 0, 'msg' => "设置失败"];
+    }
+
+    // 用户充值或扣除余额
+    public function userChangeBalance(Request $request)
+    {
+        $request->validate([
+            'user_id' => 'required',
+            'status' => 'required|in:0,1',
+            'money' => 'required|numeric',
+            'type' => 'required|in:' . implode(',', array_keys(UserYjrecord::$type)),
+        ]);
+
+        sys_log($request, '用户充值或扣除余额', '用户日志');
+
+        $user_id = $request->user_id;
+        $status = $request->status;
+        $money = $request->money;
+        $type = $request->type;
+        $remark = $request->input('remark', null);
+
+        if (!AdminUsers::isAdmin($request->user()->id)) {
+            return ['code' => 0, 'msg' => "操作失败"];
+        }
+
+        list($status, $msg, $data) = (new UserYjrecord())->recharge([
+            'user_id' => $user_id,
+            'status' => $status,
+            'yj' => $money,
+            'remark' => $remark,
+            'type' => $type,
+            'source' => '用户充值或扣除余额',
+        ]);
+
+        return $status ? ['code' => 1, 'msg' => "操作成功"] : ['code' => 0, 'msg' => $msg];
+    }
+
+    // 实名认证
+    public function realNameAuth(Request $request)
+    {
+        $request->validate([
+            'id_card_front' => 'required|string',
+            'id_card_back' => 'required|string',
+        ]);
+
+        sys_log($request, '实名认证', '用户日志');
+
+        $user_id = auth()->id();
+
+        $user = AdminUsers::where('id', $user_id)->first();
+
+        if ($user->is_real == 1) {
+            return ['code' => 0, 'msg' => "已认证"];
+        }
+
+        $id_card_front = (new TencentOcrHelper)->idCardCheck($request->id_card_front, 1);
+        if (!$id_card_front) {
+            return ['code' => 0, 'msg' => "身份证正面识别失败"];
+        }
+        $id_card_front = json_decode($id_card_front, true);
+
+        $id_card_back = (new TencentOcrHelper)->idCardCheck($request->id_card_back, 2);
+        if (!$id_card_back) {
+            return ['code' => 0, 'msg' => "身份证反面识别失败"];
+        }
+        $id_card_back = json_decode($id_card_back, true);
+
+        $exists = AdminUsers::where('id_card', $id_card_front['IdNum'])->where('is_real', AdminUsers::IS_REAL_YES)->where('id', "!=", $user_id)->exists();
+        if ($exists) {
+            return ['code' => 0, 'msg' => "信息已被使用"];
+        }
+
+        $dbData = [
+            'is_real' => 1,
+            'id_name' => $id_card_front['Name'],
+            'id_card' => $id_card_front['IdNum'],
+            'id_card_address' => $id_card_front['Address'],
+            'id_card_front' => $request->id_card_front,
+            'id_card_back' => $request->id_card_back,
+        ];
+
+        $result = $user->update($dbData);
+
+        return $result ? success() : error();
+    }
+
+    // 用户加入黑名单
+    public function joinBlackList(Request $request)
+    {
+        $request->validate([
+            'user_id' => 'required|integer',
+        ]);
+
+        sys_log($request, '用户加入黑名单', '用户日志');
+
+        $user = AdminUsers::select([
+            'id',
+            'mobile',
+        ])->where('id', $request->user_id)->first();
+
+        if (!$user) {
+            return error("用户不存在");
+        }
+
+        $blacklist = BlackList::where('user_id', $request->user_id)->first();
+        if ($blacklist) {
+            return ['code' => 0, 'msg' => "已加入黑名单"];
+        } else {
+            $result = BlackList::create([
+                'user_id' => $request->user_id,
+                'phone' => $user->mobile,
+                'remark' => $request->input('remark', null),
+            ]);
+        }
+
+        return $result ? success() : error();
+    }
+
+    // 用户移除黑名单
+    public function removeBlackList(Request $request)
+    {
+        $request->validate([
+            'user_id' => 'required|integer',
+        ]);
+
+        sys_log($request, '用户移除黑名单', '用户日志');
+
+        $result = BlackList::where('user_id', $request->user_id)->delete();
+
+        return $result ? success() : error();
+    }
+
+    // 头衔晋升
+    public function titlePromotion()
+    {
+        // 获取上个月的开始结束时间
+        $startOfLastMonth = Carbon::now()->subMonth()->startOfMonth();
+        $endOfLastMonth = Carbon::now()->subMonth()->endOfMonth();
+
+        // 获取所有会员等级信息
+        $memberLevel = AdminUsersMemberLevel::orderBy('level', 'asc')->get();
+
+        $userList = AdminUsers::select(['id', 'member_level_id'])->whereNotIn('id', [1])->get();
+        foreach ($userList as $user) {
+            Log::info('头衔校验用户', ['user_id' => $user->id]);
+            $finallyLevelId = null; // 最终等级id
+            foreach ($memberLevel as $level) {
+                $orderCount = 0; // 满足条件单数
+                $userList = AdminUsers::getChildrens($user->id);
+                // 校验提单数
+                if ($level->check_type == AdminUsersMemberLevel::check_type_put) {
+                    $orderCount = Orders::whereIn('user_id', $userList)->whereBetween('created_at', [$startOfLastMonth, $endOfLastMonth])->count();
+                    Log::info('校验提单数', ['user_id' => $user->id, 'user_list' => $userList, 'order_count' => $orderCount]);
+                }
+                // 校验激活数
+                if ($level->check_type == AdminUsersMemberLevel::check_type_active) {
+                    $orderCount = Orders::whereIn('user_id', $userList)->where('active_status', Orders::ACTIVE_STATUS_SUCCESS)->whereBetween('created_at', [$startOfLastMonth, $endOfLastMonth])->count();
+                    Log::info('校验激活数', ['user_id' => $user->id, 'user_list' => $userList, 'order_count' => $orderCount]);
+                }
+
+                if ($orderCount >= $level->check_ordernum && $level->is_promotion) {
+                    $finallyLevelId = $level->id;
+                    Log::info('获取最终等级id', ['user_id' => $user->id, 'finallyLevelId' => $finallyLevelId]);
+                }
+            }
+
+            if ($finallyLevelId) {
+                $result = $user->update(['member_level_id' => $finallyLevelId]);
+                Log::info('更新用户等级', ['user_id' => $user->id, 'finallyLevelId' => $finallyLevelId, 'result' => $result ? '成功' : '失败']);
+            }
+        }
+    }
+}

+ 153 - 0
app/DataApiNew/Helper/AdminUsersMemberLevelHelper.php

@@ -0,0 +1,153 @@
+<?php
+/*
+ * @Description: 用户头衔
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-25 09:42:18
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-25 09:42:18
+ */
+ 
+namespace App\DataApiNew\Helper;
+ 
+use App\DataApiNew\Models\AdminUsersMemberLevel;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use Illuminate\Http\Request;
+
+class AdminUsersMemberLevelHelper{
+    // 查询条件
+    public function whens($query,$request)
+    {
+        return $query
+        ->when($request->filled('id'), fn($q) => $q->where('id', $request->id));
+    }
+    
+    // 查询列表
+    public function select(Request $request)
+    {
+        $page = new Pages($request,AdminUsersMemberLevel::query());
+
+        $page->before(function($query) use ($request) {
+            $query->select(AdminUsersMemberLevel::$selectFields);
+            return $this->whens($query,$request);
+        });
+
+        $result = $page->paginate();
+        
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {   
+        $query = AdminUsersMemberLevel::select(AdminUsersMemberLevel::$selectFields);
+        $query = $this->whens($query,$request);
+        $query->orderBy('created_at','desc');
+        $header = [
+            '名称' => 'name',
+            '标识' => 'tag',
+            '状态 0下架 1上架' => 'status',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+          ];
+        $getEnValue = $this->getEnValue();
+        
+        $excel = new SpoutExport($header);
+        $excel->setData($query->get());
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+        
+        return $result ? success($result['url']) : error();
+    }
+    
+    // 导入
+    public function import(Request $request)
+    {   
+        $header = [
+            '名称' => 'name',
+            '标识' => 'tag',
+            '状态 0下架 1上架' => 'status',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+          ];
+        $getEnValue = $this->getEnValue();
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+        
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+            'open_status' =>  [
+                0 => "待开卡",
+                1 => "开卡中",
+            ]
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = AdminUsersMemberLevel::where(['id'=>$request->id])->select(AdminUsersMemberLevel::$selectFields)->first();
+        return success($result);
+    }
+    
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            'name' => 'required',
+        ]);
+        $result = AdminUsersMemberLevel::create($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+ 
+        $result = AdminUsersMemberLevel::where(['id'=>$request->id])->update($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",",$id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = AdminUsersMemberLevel::whereIn('id', $arr)->delete();
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+}

+ 258 - 0
app/DataApiNew/Helper/AgentApiHelper.php

@@ -0,0 +1,258 @@
+<?php
+/*
+ * @Description: 用户接口配置
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-06 08:43:11
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-06 08:43:11
+ */
+
+namespace App\DataApiNew\Helper;
+
+use App\DataApiNew\Models\AgentApi;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use App\DataApiNew\Models\AdminUsers;
+use Illuminate\Http\Request;
+use Vinkla\Hashids\Facades\Hashids;
+
+class AgentApiHelper
+{
+    // 查询条件
+    public function whens($query, $request)
+    {
+        return $query
+            ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id));
+    }
+
+    // 查询列表
+    public function select(Request $request)
+    {
+        $page = new Pages($request, AgentApi::query());
+
+        $page->before(function ($query) use ($request) {
+            $query->select(AgentApi::$selectFields);
+            return $this->whens($query, $request);
+        });
+
+        $result = $page->paginate();
+
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {
+        $query = AgentApi::select(AgentApi::$selectFields);
+        $query = $this->whens($query, $request);
+        $query->orderBy('created_at', 'desc');
+        $header = [
+            '用户id' => 'user_id',
+            '私钥' => 'private_key',
+            '公钥' => 'public_key',
+            '文档文件' => 'document_path',
+            '状态 0禁止 1允许' => 'status',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+            '备注' => 'remark',
+        ];
+        $getEnValue = $this->getEnValue();
+
+        $excel = new SpoutExport($header);
+        $excel->setData($query->get());
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+
+        return $result ? success($result['url']) : error();
+    }
+
+    // 导入
+    public function import(Request $request)
+    {
+        $header = [
+            '用户id' => 'user_id',
+            '私钥' => 'private_key',
+            '公钥' => 'public_key',
+            '文档文件' => 'document_path',
+            '状态 0禁止 1允许' => 'status',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+            '备注' => 'remark',
+        ];
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = AgentApi::where(['id' => $request->id])->select(AgentApi::$selectFields)->first();
+        return success($result);
+    }
+
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            'user_id' => 'required|integer',
+        ]);
+
+        sys_log($request, '用户接口配置添加', '用户接口配置');
+
+        $user = AdminUsers::find($request->user_id);
+        if (empty($user)) {
+            return error("用户不存在");
+        }
+
+        $exist = AgentApi::where(['user_id' => $request->user_id])->exists();
+        if ($exist) {
+            return ['code' => 0, 'msg' => "已存在"];
+        }
+
+        $data = $request->all();
+
+        if (empty($data['private_key']) && empty($data['public_key'])) {
+            $rsa = UtilsHelper::generateRSAKeys();
+            $data['private_key'] = $rsa['privateKey'];
+            $data['public_key'] = $rsa['publicKey'];
+        }
+
+        $data['user_key'] = Hashids::encode($data['user_id']);
+
+        $result = AgentApi::create($data);
+
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        $result = AgentApi::where(['id' => $request->id])->update($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",", $id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = AgentApi::whereIn('id', $arr)->delete();
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 生成对接文档
+    public function generateDoc(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        sys_log($request, '生成对接文档', '用户接口配置');
+
+        // 获取信息
+        $info = AgentApi::where(['id' => $request->id])->first();
+        if (!$info) {
+            return ['code' => 0, 'msg' => "生成失败"];
+        }
+
+        // 模板内容 (HTML格式)
+        $content = '
+        <!DOCTYPE html>
+        <html lang="zh-CN">
+        <head>
+            <meta charset="UTF-8">
+            <meta name="viewport" content="width=device-width, initial-scale=1.0">
+            <title>分销对接文档</title>
+            <style>
+                body { font-family: Arial, sans-serif; line-height: 1.6; margin: 0; padding: 20px; }
+                h1 { color: #333; text-align: center; }
+                .content { max-width: 800px; margin: 0 auto; padding: 20px; border: 1px solid #ddd; border-radius: 8px; background-color: #f9f9f9; }
+                .section { margin-bottom: 20px; }
+                .label { font-weight: bold; color: #555; }
+                .value { font-size: 14px; color: #333; }
+                pre { white-space: pre-wrap; word-wrap: break-word; }
+            </style>
+        </head>
+        <body>
+            <h1>分销对接文档</h1>
+            <div class="content">
+                <div class="section">
+                    <span class="label">接口文档:</span>
+                    <span class="value">
+                        <a href="%s" target="_blank" style="color: #007bff; text-decoration: none;">%s</a>
+                    </span>
+                </div>
+                <div class="section">
+                    <span class="label">用户秘钥:</span>
+                    <span class="value">%s</span>
+                </div>
+                <div class="section">
+                    <span class="label">私钥:</span>
+                    <pre class="value">%s</pre>
+                </div>
+            </div>
+        </body>
+        </html>
+        ';
+
+        // 使用 sprintf 填充模板
+        $api_document = "https://doc.apipost.net/docs/detail/376e060b3c06000?target_id=50c37c5";
+        $document = sprintf($content, $api_document, $api_document, $info->user_key, $info->private_key);
+
+        if($request->input('download',false)){
+            // 设置响应头并输出文件
+            return response($document)
+            ->header('Content-Type', 'text/html')
+            ->header('Content-Disposition', 'attachment; filename*=utf-8\'\''
+                . urlencode('分销对接文档-'.$info->user_key.'.html'));
+        }else{
+            // 定义文件路径
+            UtilsHelper::ensureDirectoryExists("api_doc");
+            $fileName = "/api_doc/" . $info->user_key . '.html';
+            $filePath = public_path() . $fileName;
+
+            // 将内容写入文件
+            file_put_contents($filePath, $document);
+
+            return ['code' => 1, 'msg' => "Document generated successfully", 'path' => config('app.url') . $fileName];
+        }
+    }
+}

+ 722 - 0
app/DataApiNew/Helper/AgentPackageHelper.php

@@ -0,0 +1,722 @@
+<?php
+/*
+ * @Description: 用户套餐表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-26 09:24:11
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-26 09:24:11
+ */
+
+namespace App\DataApiNew\Helper;
+
+use App\DataApiNew\Models\AgentPackage;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use App\DataApiNew\Models\AdminUsers;
+use App\DataApiNew\Models\Packages;
+use App\DataApiNew\Models\SystemSetting;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Vinkla\Hashids\Facades\Hashids;
+
+class AgentPackageHelper
+{
+    private $is_shop = 0; // 是否是小店查询
+    private $is_shopping = 0; // 是否是小程序直播购物车
+    public $is_platform_api = 0; // 是否是平台api
+
+    // 查询条件
+    public function whens($query, $request)
+    {
+        return $query
+            ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id));
+    }
+
+    // 查询列表
+    public function select(Request $request)
+    {
+        $page = new Pages($request, AgentPackage::query());
+
+        $page->before(function ($query) use ($request) {
+            $query->select(AgentPackage::$selectFields);
+            return $this->whens($query, $request);
+        });
+
+        $result = $page->paginate();
+
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {
+        $query = AgentPackage::select(AgentPackage::$selectFields);
+        $query = $this->whens($query, $request);
+        $query->orderBy('created_at', 'desc');
+        $header = [
+            '合伙人id' => 'agent_id',
+            '套餐id' => 'package_id',
+            '套餐佣金' => 'DEFAULT',
+            '上架状态 0:下架 1:上架' => 'is_upload',
+            '状态' => 'status',
+            '创建时间' => 'created_at',
+            '修改时间' => 'updated_at',
+            '可见用户' => 'visible_to_users',
+            '不可见用户' => 'invisible_to_users',
+            '分成类型 1:比例 2:金额' => 'yj_type',
+            '分成比例' => 'yj_p',
+            '分销员id' => 'fxuser_id',
+            '权重' => 'weight',
+            '用户id' => 'user_id',
+        ];
+        $getEnValue = $this->getEnValue();
+
+        $excel = new SpoutExport($header);
+        $excel->setData($query->get());
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+
+        return $result ? success($result['url']) : error();
+    }
+
+    // 导入
+    public function import(Request $request)
+    {
+        $header = [
+            '合伙人id' => 'agent_id',
+            '套餐id' => 'package_id',
+            '套餐佣金' => 'DEFAULT',
+            '上架状态 0:下架 1:上架' => 'is_upload',
+            '状态' => 'status',
+            '创建时间' => 'created_at',
+            '修改时间' => 'updated_at',
+            '可见用户' => 'visible_to_users',
+            '不可见用户' => 'invisible_to_users',
+            '分成类型 1:比例 2:金额' => 'yj_type',
+            '分成比例' => 'yj_p',
+            '分销员id' => 'fxuser_id',
+            '权重' => 'weight',
+            '用户id' => 'user_id',
+        ];
+        $getEnValue = $this->getEnValue();
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+            'operator_id' => SystemSetting::$operator,
+            'is_upload' => Packages::$isUpload,
+            'rebate_type' => Packages::$rebateType,
+            'is_live' => Packages::$isLive,
+            'select_status' => Packages::$selectStatus,
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = AgentPackage::where(['id' => $request->id])->select(AgentPackage::$selectFields)->first();
+        return success($result);
+    }
+
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            'name' => 'required',
+        ]);
+        $result = AgentPackage::create($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        $result = AgentPackage::where(['id' => $request->id])->update($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",", $id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = AgentPackage::whereIn('id', $arr)->delete();
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    /**
+     * 产品中心
+     *
+     * @param Request $request
+     * @param array $selectFields 展示的字段
+     * @param array $hiddenFields 隐藏的字段
+     */
+    public function productCenter(Request $request, $selectFields = [], $hiddenFields = [])
+    {
+        // 获取用户id
+        if ($request->filled('user_id')) {
+            $user_id = Hashids::decode($request->user_id);
+            if (empty($user_id)) {
+                return error("无效信息");
+            }
+            $user_id = $user_id[0];
+        } else {
+            $user_id = auth()->id();
+        }
+
+        // 获取字段
+        if (empty($selectFields)) {
+            $selectFields = Packages::$selectFields;
+        }
+
+        if (AdminUsers::isAdmin($user_id) && ($this->is_shopping == 0 && $this->is_shop == 0)) {
+            // admin 查看原始套餐
+            return (new PackagesHelper())->select($request, $selectFields);
+        } else {
+            $page = new Pages($request, Packages::query());
+
+            // 字段添加前缀
+            foreach ($selectFields as &$value) {
+                $value = 'packages.' . $value;
+            }
+
+            $page->before(function ($query) use ($request, $selectFields, $user_id) {
+                // admin 上架的产品
+                $query->select($selectFields)->where('packages.is_upload', 1)
+
+                    // 关联查询上下架状态
+                    ->leftJoin('agent_package', function ($join) use ($user_id) {
+                        $join->on('packages.id', '=', 'agent_package.package_id')
+                            ->where('agent_package.user_id', '=', $user_id);
+                    })
+
+                    // 查询条件
+                    ->when($request->filled('id'), fn ($q) => $q->where('packages.id', $request->id))
+                    ->when($request->has('is_live'), fn ($q) => $q->where('packages.is_live', $request->is_live))
+                    ->when($request->has('rebate_type'), fn ($q) => $q->where('packages.rebate_type', $request->rebate_type))
+                    ->when($request->has('is_shopping') && $request->is_shopping == 0, fn ($q) => $q->where(function ($query) {
+                        $query->where('agent_package.is_shopping', 0)->orWhereNull('agent_package.is_shopping');
+                    }))
+                    ->when($request->has('is_shopping') && $request->is_shopping == 1, fn ($q) => $q->where('agent_package.is_shopping', 1))
+                    ->when($request->has('is_upload') && $request->is_upload == 0, fn ($q) => $q->where('agent_package.is_upload', 0))
+                    ->when($request->has('is_upload') && $request->is_upload == 1, fn ($q) => $q->where(function ($query) {
+                        $query->where('agent_package.is_upload', null)->orWhere('agent_package.is_upload', 1);
+                    }))
+                    ->when($request->filled('name'), fn ($q) => $q->where('packages.name', 'like', "%$request->name%"))
+                    ->when($request->filled('operator_id'), fn ($q) => $q->where('packages.operator_id', $request->operator_id))
+                    // 判断是否是下架产品,并动态设置 is_upload
+                    ->addSelect([
+                        DB::raw('CASE 
+                            WHEN agent_package.is_upload = 0 THEN 0 
+                            ELSE packages.is_upload 
+                            END AS is_upload')
+                    ])
+                    ->orderByRaw("IFNULL(agent_package.is_upload, 1) DESC")
+                    ->orderByRaw('CASE WHEN agent_package.weight IS NULL OR agent_package.weight = 0 THEN packages.weight ELSE agent_package.weight END DESC')
+                    ->orderBy(DB::raw('CAST(packages.yj AS UNSIGNED)'), 'desc')
+                    ->orderBy('packages.created_at', 'desc');;
+
+                return $query;
+            });
+
+            if ($this->is_shop == 1) {
+                // 小店
+                $hiddenFields = ['yj','id'];
+                $page->after(function ($data) use ($hiddenFields) {
+                    $data->each(function ($item) {
+                        $item->package_key = Hashids::encode($item->id);
+                    });
+                    // 隐藏字段
+                    $data->makeHidden($hiddenFields);
+                });
+            } elseif ($this->is_shopping == 1) {
+                // 购物车
+                $hiddenFields = ['yj'];
+                $page->after(function ($data) use ($hiddenFields) {
+                    // 隐藏字段
+                    $data->makeHidden($hiddenFields);
+                });
+            } elseif ($this->is_platform_api == 1) {
+                // 平台api
+                $page->after(function ($data) use ($user_id, $hiddenFields) {
+                    $data = $this->setYjShow($user_id, $data);
+                    // 隐藏字段
+                    $data->makeHidden($hiddenFields);
+                    // 替换字段名称
+                    $data->each(function ($item) {
+                        if (!empty($item->id)) {
+                            $item->package_key = Hashids::encode($item->id);
+                        }
+
+                        if (!empty($item->yj)) {
+                            $item->commission = $item->yj;
+                            unset($item->yj);
+                        }
+                        if (!empty($item->yjzc)) {
+                            $item->commission_rate = $item->yjzc;
+                            unset($item->yjzc);
+                        }
+                    });
+                });
+            } else {
+                // 产品中心
+                $page->after(function ($data) use ($user_id, $hiddenFields) {
+                    $data = $this->setYjShow($user_id, $data);
+                    // 隐藏字段
+                    $data->makeHidden($hiddenFields);
+                });
+            }
+
+            $packageList = $page->paginate();
+            return $packageList;
+        }
+    }
+
+    // 产品中心导出
+    public function productCenterExport(Request $request)
+    {
+        sys_log($request, '产品中心导出', '号卡产品中心');
+        $request->merge(['page_not' => 1]);
+        $selectFields = [
+            'id',
+            'name', // 名称
+            'mini_text', // 简介
+            'operator_id', // 运营商
+            'yj',
+            'yjzc', // 佣金政策
+            'weight', // 权重
+            'is_upload', // 是否上架
+            'created_at',
+            'out_package_id', // 外部产品编码
+            'belonging_place', // 归属地
+            'data_quota', // 流量额度
+            'call_duration', // 通话时长
+            'first_recharge_amount', // 首充金额
+            'attention', // 注意事项
+            'rebate_type', // 返佣类型 1:次月返 2:秒返
+            'select_status', // 是否选号
+            'is_live', // 是否允许直播 0:不允许 1:允许
+            'commission_terms', // 结佣条件
+        ];
+        $dataList = $this->productCenter($request, $selectFields);
+
+        $header = [
+            '名称' => 'name',
+            '简介' => 'mini_text',
+            '佣金' => 'yj',
+            '运营商' => 'operator_id',
+            '佣金政策' => 'yjzc',
+            '是否上架' => 'is_upload',
+            '外部产品编码' => 'out_package_id',
+            '归属地' => 'belonging_place',
+            '流量额度' => 'data_quota',
+            '通话时长' => 'call_duration',
+            '首充金额' => 'first_recharge_amount',
+            '注意事项' => 'attention',
+            '返佣类型' => 'rebate_type',
+            '是否选号' => 'select_status',
+            '是否允许直播' => 'is_live',
+            '创建时间' => 'created_at',
+            '结佣条件' => 'commission_terms',
+        ];
+        $getEnValue = $this->getEnValue();
+        $dataList = json_decode($dataList->getContent(),true);
+        $excel = new SpoutExport($header);
+        $excel->setData($dataList['data']);
+        $result = $excel->setEnum($getEnValue)->setProcessStyle(30)->spoutToExcel('产品中心导出数据');
+        return $result;
+    }
+
+    // 获取产品详情
+    public function productDetail(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        $user_id = auth()->id();
+
+        if (AdminUsers::isAdmin($user_id)) {
+            $package = Packages::with(['package_member_level_royalty'])->select(Packages::$selectFields)->where('id', $request->id)->first();
+            return success($package);
+        }
+
+        $package = Packages::select(Packages::$selectFields)->where('id', $request->id)->first();
+        if (empty($package)) {
+            return error('产品不存在');
+        }
+
+        $package = $this->setYjShow($user_id, $package, false);
+
+        return success($package);
+    }
+
+    // 产品上下架
+    public function packageUpload(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required|string',
+            'is_upload' => 'required|integer|in:0,1',
+        ]);
+
+        sys_log($request, '产品上下架', '号卡产品中心');
+
+        $ids = explode(',', $request->ids);
+
+        $user_id =  auth()->id();
+        if (AdminUsers::isAdmin($user_id)) {
+            Packages::whereIn('id', $ids)->update(['is_upload' => $request->is_upload]);
+        } else {
+            foreach ($ids as $id) {
+                $agentPackage = AgentPackage::where('user_id', $user_id)->where('package_id', $id)->first();
+                if ($agentPackage) {
+                    $agentPackage->update(['is_upload' => $request->is_upload]);
+                } else {
+                    AgentPackage::create(['user_id' => $user_id, 'package_id' => $id, 'is_upload' => $request->is_upload]);
+                }
+            }
+        }
+
+        return success();
+    }
+
+    /**
+     * 佣金展示计算
+     *
+     * @param $user_id 用户id
+     * @param $packageList 产品列表
+     * @param $is_list 是否是列表
+     */
+    public function setYjShow($user_id, $packageList, $is_list = true)
+    {
+        // 获取父用户的佣金信息
+        $parentList = AdminUsers::getParents($user_id);
+        $parentYjType = AdminUsers::with(['agent_package'])
+            ->select(['id', 'yj_type', 'yj_a', 'yj_p'])
+            ->whereIn('id', $parentList)
+            ->orderBy('agent_level', 'ASC')
+            ->get()
+            ->keyBy('id'); // 重置索引为用户id
+
+        if ($is_list) {
+            // 遍历产品列表
+            foreach ($packageList as &$package) {
+                $package = $this->computation($parentYjType, $package);
+            }
+
+            return $packageList;
+        } else {
+            return $this->computation($parentYjType, $packageList);
+        }
+    }
+
+    // 计算佣金
+    private function computation($parentYjType, $package)
+    {
+        $yj = (string)$package->yj;  // 原始佣金
+        $package_id = $package->id;
+
+        // 遍历所有上级用户
+        foreach ($parentYjType as $user) {
+            $yj_type = $user->yj_type;  // 佣金类型
+            $yj_p = (string)$user->yj_p;  // 百分比
+            $yj_a = (string)$user->yj_a;  // 固定金额
+
+            $agent_package = $user->agent_package->keyBy('package_id');  // 提前获取代理包裹数据并按package_id索引
+
+            // 根据代理包裹设置佣金类型
+            if (isset($agent_package[$package_id]) && $agent_package[$package_id]['yj_type'] != 0) {
+                $package_info = $agent_package[$package_id];
+                $yj_type = $package_info['yj_type'];  // 佣金类型
+                $yj_p = (string)$package_info['yj_p'];  // 百分比
+                $yj_a = (string)$package_info['yj_a'];  // 固定金额
+            }
+
+            // 根据佣金类型进行计算
+            if ($yj_type == 1) {  // 百分比计算
+                $yj_p = bcdiv($yj_p, 100, 2);  // 百分比转化为小数
+                $yj = bcsub($yj, bcmul($yj, $yj_p, 2), 2);  // 计算佣金
+            } elseif ($yj_type == 2) {  // 固定金额计算
+                $yj = bcsub($yj, $yj_a, 2);  // 计算佣金
+            }
+
+            // 如果佣金小于0,则设置为0
+            if (bccomp($yj, '0', 2) < 0) {
+                $yj = '0';  // 设置为 0
+                break;
+            }
+        }
+
+        // 更新包裹佣金
+        $package->yj = $yj;
+
+        return $package;
+    }
+
+
+    // 获取用户小店套餐
+    public function getShopPackage(Request $request)
+    {
+        $request->validate([
+            'user_key' => 'required', // 用户id加密
+        ]);
+
+        $user_id = $request->user_key;
+
+        $request->merge([
+            'is_upload' => 1,
+            'user_id' => $user_id,
+        ]);
+
+        $this->is_shop = 1; // 小店不计算展示佣金
+        return $this->productCenter($request, Packages::$selectFieldsByShop);
+    }
+
+    // 设置权重
+    public function setWeight(Request $request)
+    {
+        $request->validate([
+            'package_id' => 'required|integer',
+            'weight' => 'required|integer',
+        ]);
+
+        sys_log($request, '设置权重', '号卡产品中心');
+
+        $user_id = auth()->id();
+
+        if (AdminUsers::isAdmin($user_id)) {
+            $result = Packages::where('id', $request->package_id)->update(['weight' => $request->weight]);
+        } else {
+            $agent_package = AgentPackage::where('user_id', $user_id)->where('package_id', $request->package_id)->first();
+            if ($agent_package) {
+                $result = $agent_package->update(['weight' => $request->weight]);
+            } else {
+                $result = AgentPackage::create(['user_id' => $user_id, 'package_id' => $request->package_id, 'weight' => $request->weight, 'is_upload' => 1]);
+            }
+        }
+
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 设置是否允许直播(admin)
+    public function setLive(Request $request)
+    {
+        $request->validate([
+            'package_id' => 'required|integer',
+            'is_live' => 'required|in:0,1', // 是否允许直播
+        ]);
+
+        sys_log($request, '设置是否允许直播', '号卡产品中心');
+
+        $user_id = auth()->id();
+
+        if (AdminUsers::isAdmin($user_id)) {
+            $result = Packages::where('id', $request->package_id)->update(['is_live' => $request->is_live]);
+        } else {
+            return error();
+        }
+
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 获取套餐信息
+    public function getPackageInfo(Request $request)
+    {
+        $request->validate([
+            'package_key' => 'required', // 套餐id加密
+            'user_key' => 'required', // 用户id加密
+        ]);
+
+        $package_id = Hashids::decode($request->package_key);
+        if (empty($package_id)) {
+            return error("无效操作");
+        }
+
+        $user_id = Hashids::decode($request->user_key);
+        if (empty($user_id)) {
+            return error("无效操作");
+        }
+
+        $package_id = $package_id[0];
+        $user_id = $user_id[0];
+
+        $package = Packages::select([
+            'id',
+            'name',
+            'mini_text',
+            'image',
+            'details',
+            'is_upload',
+        ])
+            ->where('id', $package_id)->first();
+
+        if (!$package || $package->is_upload == 0) {
+            return error("套餐已下架");
+        }
+
+        $agent_package = AgentPackage::select([
+            'id',
+            'is_upload',
+        ])
+            ->where('user_id', $user_id)->where('package_id', $package_id)->first();
+        if ($agent_package && $agent_package->is_upload == 0) {
+            return error("套餐已下架");
+        }
+
+        return ['code' => 1, 'msg' => "success", 'data' => $package];
+    }
+
+    // 批量设置单品抽成
+    public function setUserProductYj(Request $request)
+    {
+        $request->validate([
+            'user_ids' => 'required|string', // 用户id
+            'package_id' => 'required|integer', // 套餐id
+            'yj_type' => 'required|integer|in:1,2', // 佣金类型
+            'yj_p' => 'integer', // 百分比
+            'yj_a' => 'numeric', // 金额
+        ]);
+
+        sys_log($request, '批量设置单品抽成', '号卡产品中心');
+
+        $package = Packages::where('id', $request->package_id)->exists();
+        if (!$package) {
+            return error("套餐不存在");
+        }
+
+        $user_ids = explode(',', $request->user_ids);
+
+        foreach ($user_ids as $user_id) {
+            $agent_package = AgentPackage::where('user_id', $user_id)->where('package_id', $request->package_id)->first();
+            if ($agent_package) {
+                $updateData = [
+                    'yj_type' => $request->yj_type,
+                    'yj_p' => $request->input('yj_p', $agent_package->yj_p),
+                    'yj_a' => $request->input('yj_a', $agent_package->yj_a),
+                ];
+                $agent_package->update($updateData);
+            } else {
+                AgentPackage::create([
+                    'user_id' => $user_id,
+                    'package_id' => $request->package_id,
+                    'yj_type' => $request->yj_type,
+                    'yj_p' => $request->yj_p ?? 0,
+                    'yj_a' => $request->yj_a ?? 0,
+                    'is_upload' => 1
+                ]);
+            }
+        }
+
+        return success();
+    }
+
+    // 设置小程序直播购物车
+    public function setShopping(Request $request)
+    {
+        $request->validate([
+            'package_id' => 'required|integer',
+            'is_shopping' => 'required|in:0,1', // 是否允许直播
+        ]);
+
+        sys_log($request, '设置小程序直播购物车', '号卡产品中心');
+
+        $package = Packages::select([
+            'id',
+            'is_live',
+            'is_upload',
+        ])->where('id', $request->package_id)->first();
+
+        if (!$package || $package->is_upload == 0) {
+            return error("套餐已下架");
+        }
+
+        if ($package->is_live == 0) {
+            return error("该套餐未开启直播");
+        }
+
+        $user_id = $request->user()->id;
+
+        $agent_package = AgentPackage::where('package_id', $request->package_id)->first();
+        if ($agent_package->is_upload == 0) {
+            return error("该套餐已下架");
+        }
+
+        if ($agent_package) {
+            $agent_package->update(['is_shopping' => $request->is_shopping]);
+        } else {
+            AgentPackage::create([
+                'user_id' => $user_id,
+                'package_id' => $request->package_id,
+                'is_shopping' => $request->is_shopping,
+                'is_upload' => 1
+            ]);
+        }
+
+        return success();
+    }
+
+    // 获取小程序直播购物车产品
+    public function getShopping(Request $request)
+    {
+        $this->is_shopping = 1;
+
+        $params = [
+            'is_upload' => 1,
+            'is_live' => 1,
+        ];
+
+        if ($request->has('is_shopping')) {
+            $params['is_shopping'] = $request->input('is_shopping');
+        }
+
+        if ($request->has('id')) {
+            $params['id'] = $request->input('id');
+        }
+
+        $result = $this->productCenter(new Request($params), Packages::$selectFieldsByShop);
+
+        return $result;
+    }
+}

+ 601 - 0
app/DataApiNew/Helper/AgentPackageKdHelper.php

@@ -0,0 +1,601 @@
+<?php
+/*
+ * @Description: 用户套餐表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-26 09:24:11
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-26 09:24:11
+ */
+
+namespace App\DataApiNew\Helper;
+
+use App\DataApiNew\Models\AgentPackageKd as AgentPackage;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use App\DataApiNew\Models\AdminUsers;
+use App\DataApiNew\Models\PackagesKd as Packages;
+use App\DataApiNew\Models\SystemSetting;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Vinkla\Hashids\Facades\Hashids;
+
+class AgentPackageKdHelper
+{
+    private $is_shop = 0; // 是否是小店查询
+    public $is_platform_api = 0; // 是否是平台api
+
+    // 查询条件
+    public function whens($query, $request)
+    {
+        return $query
+            ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id));
+    }
+
+    // 查询列表
+    public function select(Request $request)
+    {
+        $page = new Pages($request, AgentPackage::query());
+
+        $page->before(function ($query) use ($request) {
+            $query->select(AgentPackage::$selectFields);
+            return $this->whens($query, $request);
+        });
+
+        $result = $page->paginate();
+
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {
+        $query = AgentPackage::select(AgentPackage::$selectFields);
+        $query = $this->whens($query, $request);
+        $query->orderBy('created_at', 'desc');
+        $header = [
+            '合伙人id' => 'agent_id',
+            '套餐id' => 'package_id',
+            '上架状态 0:下架 1:上架' => 'is_upload',
+            '状态' => 'status',
+            '创建时间' => 'created_at',
+            '修改时间' => 'updated_at',
+            '可见用户' => 'visible_to_users',
+            '不可见用户' => 'invisible_to_users',
+            '分成类型 1:比例 2:金额' => 'yj_type',
+            '分成比例' => 'yj_p',
+            '分销员id' => 'fxuser_id',
+            '权重' => 'weight',
+            '用户id' => 'user_id',
+        ];
+        $getEnValue = $this->getEnValue();
+
+        $excel = new SpoutExport($header);
+        $excel->setData($query->get());
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+
+        return $result ? success($result['url']) : error();
+    }
+
+    // 导入
+    public function import(Request $request)
+    {
+        $header = [
+            '合伙人id' => 'agent_id',
+            '套餐id' => 'package_id',
+            '上架状态 0:下架 1:上架' => 'is_upload',
+            '状态' => 'status',
+            '创建时间' => 'created_at',
+            '修改时间' => 'updated_at',
+            '可见用户' => 'visible_to_users',
+            '不可见用户' => 'invisible_to_users',
+            '分成类型 1:比例 2:金额' => 'yj_type',
+            '分成比例' => 'yj_p',
+            '分销员id' => 'fxuser_id',
+            '权重' => 'weight',
+            '用户id' => 'user_id',
+        ];
+        $getEnValue = $this->getEnValue();
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+            'operator_id' => SystemSetting::$operator,
+            'is_upload' => Packages::$isUpload,
+            'rebate_type' => Packages::$rebateType,
+            'is_live' => Packages::$isLive,
+            'select_status' => Packages::$selectStatus,
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = AgentPackage::where(['id' => $request->id])->select(AgentPackage::$selectFields)->first();
+        return success($result);
+    }
+
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            'name' => 'required',
+        ]);
+        $result = AgentPackage::create($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        $result = AgentPackage::where(['id' => $request->id])->update($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",", $id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = AgentPackage::whereIn('id', $arr)->delete();
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    /**
+     * 产品中心
+     *
+     * @param Request $request
+     * @param array $selectFields 展示的字段
+     * @param array $hiddenFields 隐藏的字段
+     */
+    public function productCenter(Request $request, $selectFields = [], $hiddenFields = [])
+    {
+        // 获取用户id
+        if ($request->filled('user_id')) {
+            $user_id = Hashids::decode($request->user_id);
+            if (empty($user_id)) {
+                return error("无效信息");
+            }
+            $user_id = $user_id[0];
+
+        } else {
+            $user_id = auth()->id();
+        }
+
+        // 获取字段
+        if(empty($selectFields)){
+            $selectFields = Packages::$selectFields;
+        }
+
+        if (AdminUsers::isAdmin($user_id) && ($this->is_shop == 0)) {
+            return (new PackagesKdHelper())->select($request, $selectFields);
+        } else {
+            $page = new Pages($request, Packages::query());
+
+            // 字段添加前缀
+            foreach ($selectFields as &$value) {
+                $value = 'packages_kd.' . $value;
+            }
+
+            $page->before(function ($query) use ($request, $selectFields, $user_id) {
+                // admin 上架的产品
+                $query->select($selectFields)->where('packages_kd.is_upload', 1)
+
+                    // 关联查询上下架状态
+                    ->leftJoin('agent_package_kd', function ($join) use ($user_id) {
+                        $join->on('packages_kd.id', '=', 'agent_package_kd.package_id')
+                            ->where('agent_package_kd.user_id', '=', $user_id);
+                    })
+
+                    // 查询条件
+                    ->when($request->filled('id'), fn ($q) => $q->where('packages_kd.id', $request->id))
+                    ->when($request->filled('operator_id'), fn ($q) => $q->where('packages_kd.operator_id', $request->operator_id))
+                    ->when($request->filled('rebate_type'), fn ($q) => $q->where('packages_kd.rebate_type', $request->rebate_type))
+                    ->when($request->filled('is_upload') && $request->is_upload == 0, fn ($q) => $q->where('agent_package_kd.is_upload', 0))
+                    ->when($request->filled('is_upload') && $request->is_upload == 1, fn ($q) => $q->where(function ($query) {
+                        $query->where('agent_package_kd.is_upload', null)->orWhere('agent_package_kd.is_upload', 1);
+                    }))
+
+                    // 判断是否是下架产品,并动态设置 is_upload
+                    ->addSelect([
+                        DB::raw('CASE 
+                            WHEN agent_package_kd.is_upload = 0 THEN 0 
+                            ELSE packages_kd.is_upload 
+                            END AS is_upload')
+                    ])
+                    ->orderByRaw("IFNULL(agent_package_kd.is_upload, 1) DESC")
+                    ->orderByRaw('CASE WHEN agent_package_kd.weight IS NULL OR agent_package_kd.weight = 0 THEN packages_kd.weight ELSE agent_package_kd.weight END DESC')
+                    ->orderBy(DB::raw('CAST(packages_kd.yj AS UNSIGNED)'), 'desc')
+                    ->orderBy('packages_kd.created_at', 'desc');;
+
+                return $query;
+            });
+
+            if ($this->is_shop == 1) {
+                // 小店
+                $hiddenFields = ['yj','id'];
+                $page->after(function ($data) use ($hiddenFields) {
+                    $data->each(function ($item) {
+                        $item->package_key = Hashids::encode($item->id);
+                    });
+                    // 隐藏字段
+                    $data->makeHidden($hiddenFields);
+                });
+            } elseif ($this->is_platform_api == 1) {
+                // 平台api
+                $page->after(function ($data) use ($user_id, $hiddenFields) {
+                    $data = $this->setYjShow($user_id, $data);
+                    // 隐藏字段
+                    $data->makeHidden($hiddenFields);
+                    // 替换字段名称
+                    $data->each(function ($item) {
+                        if (!empty($item->yj)) {
+                            $item->commission = $item->yj;
+                            unset($item->yj);
+                        }
+                        if (!empty($item->yjzc)) {
+                            $item->commission_rate = $item->yjzc;
+                            unset($item->yjzc);
+                        }
+                    });
+                });
+            } else {
+                // 产品中心
+                $page->after(function ($data) use ($user_id, $hiddenFields) {
+                    $data = $this->setYjShow($user_id, $data);
+                    // 隐藏字段
+                    $data->makeHidden($hiddenFields);
+                });
+            }
+
+            $packageList = $page->paginate();
+            return $packageList;
+        }
+    }
+
+    // 产品中心导出
+    public function productCenterExport(Request $request)
+    {
+        $request->merge(['page_not' => 1]);
+        $selectFields = [
+            'id',
+            'name', // 名称
+            'mini_text', // 简介
+            'operator_id', // 运营商
+            'yj',
+            'yjzc', // 佣金政策
+            'weight', // 权重
+            'is_upload', // 是否上架
+            'created_at',
+            'out_package_id', // 外部产品编码
+            'belonging_place', // 归属地
+            'data_quota', // 流量额度
+            'call_duration', // 通话时长
+            'first_recharge_amount', // 首充金额
+            'attention', // 注意事项
+            'rebate_type', // 返佣类型 1:次月返 2:秒返
+            'select_status', // 是否选号
+            'is_live', // 是否允许直播 0:不允许 1:允许
+            'commission_terms', // 结佣条件
+        ];
+        $dataList = $this->productCenter($request, $selectFields);
+
+        $header = [
+            '名称' => 'name',
+            '简介' => 'mini_text',
+            '佣金' => 'yj',
+            '运营商' => 'operator_id',
+            '佣金政策' => 'yjzc',
+            '是否上架' => 'is_upload',
+            '外部产品编码' => 'out_package_id',
+            '归属地' => 'belonging_place',
+            '流量额度' => 'data_quota',
+            '通话时长' => 'call_duration',
+            '首充金额' => 'first_recharge_amount',
+            '注意事项' => 'attention',
+            '返佣类型' => 'rebate_type',
+            '是否选号' => 'select_status',
+            '是否允许直播' => 'is_live',
+            '创建时间' => 'created_at',
+            '结佣条件' => 'commission_terms',
+        ];
+        $getEnValue = $this->getEnValue();
+        $dataList = json_decode($dataList->getContent(),true);
+        $excel = new SpoutExport($header);
+        $excel->setData($dataList['data']);
+        $result = $excel->setEnum($getEnValue)->setProcessStyle(30)->spoutToExcel('产品中心导出数据');
+        return $result;
+    }
+
+    // 获取产品详情
+    public function productDetail(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        $user_id = auth()->id();
+
+        $package = Packages::select(Packages::$selectFields)->where('id', $request->id)->first();
+        if (empty($package)) {
+            return ['code' => 0, 'msg' => "产品不存在"];
+        }
+
+        if (AdminUsers::isAdmin($user_id)) {
+            return ['code' => 1, 'msg' => "success", 'data' => $package];
+        }
+
+        $package = $this->setYjShow($user_id, $package, false);
+
+        return ['code' => 1, 'msg' => "success", 'data' => $package];
+    }
+
+    // 产品上下架
+    public function packageUpload(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required|string',
+            'is_upload' => 'required|integer|in:0,1',
+        ]);
+
+        $ids = explode(',', $request->ids);
+
+        $user_id = auth()->id();
+        if (AdminUsers::isAdmin($user_id)) {
+            Packages::whereIn('id', $ids)->update(['is_upload' => $request->is_upload]);
+        } else {
+            foreach ($ids as $id) {
+                $agentPackage = AgentPackage::where('user_id', $user_id)->where('package_id', $id)->first();
+                if ($agentPackage) {
+                    $agentPackage->update(['is_upload' => $request->is_upload]);
+                } else {
+                    AgentPackage::create(['user_id' => $user_id, 'package_id' => $id, 'is_upload' => $request->is_upload]);
+                }
+            }
+        }
+
+        return success();
+    }
+
+    /**
+     * 佣金展示计算
+     *
+     * @param $user_id 用户id
+     * @param $packageList 产品列表
+     * @param $is_list 是否是列表
+     */
+    public function setYjShow($user_id, $packageList, $is_list = true)
+    {
+        // 获取父用户的佣金信息
+        $parentList = AdminUsers::getParents($user_id);
+        $parentYjType = AdminUsers::with(['agent_package'])
+            ->select(['id', 'yj_type', 'yj_a', 'yj_p'])
+            ->whereIn('id', $parentList)
+            ->orderBy('agent_level', 'ASC')
+            ->get()
+            ->keyBy('id'); // 重置索引为用户id
+
+        if ($is_list) {
+            // 遍历产品列表
+            foreach ($packageList as &$package) {
+                $package = $this->computation($parentYjType, $package);
+            }
+
+            return $packageList;
+        } else {
+            return $this->computation($parentYjType, $packageList);
+        }
+    }
+
+    // 计算佣金
+    private function computation($parentYjType, $package)
+    {
+        $yj = (string)$package->yj;  // 原始佣金
+        $package_id = $package->id;
+
+        // 遍历所有上级用户
+        foreach ($parentYjType as $user) {
+            $yj_type = $user->yj_type;  // 佣金类型
+            $yj_p = (string)$user->yj_p;  // 百分比
+            $yj_a = (string)$user->yj_a;  // 固定金额
+
+            $agent_package = $user->agent_package->keyBy('package_id');  // 提前获取代理包裹数据并按package_id索引
+
+            // 根据代理包裹设置佣金类型
+            if (isset($agent_package[$package_id]) && $agent_package[$package_id]['yj_type'] != 0) {
+                $package_info = $agent_package[$package_id];
+                $yj_type = $package_info['yj_type'];  // 佣金类型
+                $yj_p = (string)$package_info['yj_p'];  // 百分比
+                $yj_a = (string)$package_info['yj_a'];  // 固定金额
+            }
+
+            // 根据佣金类型进行计算
+            if ($yj_type == 1) {  // 百分比计算
+                $yj_p = bcdiv($yj_p, 100, 2);  // 百分比转化为小数
+                $yj = bcsub($yj, bcmul($yj, $yj_p, 2), 2);  // 计算佣金
+            } elseif ($yj_type == 2) {  // 固定金额计算
+                $yj = bcsub($yj, $yj_a, 2);  // 计算佣金
+            }
+
+            // 如果佣金小于0,则设置为0
+            if (bccomp($yj, '0', 2) < 0) {
+                $yj = '0';  // 设置为 0
+                break;
+            }
+        }
+
+        // 更新包裹佣金
+        $package->yj = $yj;
+
+        return $package;
+    }
+
+    // 获取用户小店套餐
+    public function getShopPackage(Request $request)
+    {
+        $request->validate([
+            'user_key' => 'required', // 用户id加密
+        ]);
+
+        $user_id = $request->user_key;
+
+        $request->merge([
+            'is_upload' => 1,
+            'user_id' => $user_id,
+        ]);
+
+        $this->is_shop = 1; // 小店不计算展示佣金
+        return $this->productCenter($request,Packages::$selectFieldsByShop);
+    }
+
+    // 设置权重
+    public function setWeight(Request $request)
+    {
+        $request->validate([
+            'package_id' => 'required|integer',
+            'weight' => 'required|integer',
+        ]);
+
+        $user_id =  auth()->id();
+
+        if (AdminUsers::isAdmin($user_id)) {
+            $result = Packages::where('id', $request->package_id)->update(['weight' => $request->weight]);
+        } else {
+            $agent_package = AgentPackage::where('user_id', $user_id)->where('package_id', $request->package_id)->first();
+            if ($agent_package) {
+                $result = $agent_package->update(['weight' => $request->weight]);
+            } else {
+                $result = AgentPackage::create(['user_id' => $user_id, 'package_id' => $request->package_id, 'weight' => $request->weight, 'is_upload' => 1]);
+            }
+        }
+
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 获取套餐信息
+    public function getPackageInfo(Request $request)
+    {
+        $request->validate([
+            'package_key' => 'required', // 套餐id加密
+            'user_key' => 'required', // 用户id加密
+        ]);
+
+        $package_id = Hashids::decode($request->package_key);
+        if (empty($package_id)) {
+            return error("无效操作");
+        }
+
+        $user_id = Hashids::decode($request->user_key);
+        if (empty($user_id)) {
+            return error("无效操作");
+        }
+
+        $package_id = $package_id[0];
+        $user_id = $user_id[0];
+
+        $package = Packages::select([
+            'id',
+            'name',
+            'mini_text',
+            'image',
+            'details',
+            'is_upload',
+        ])
+            ->where('id', $package_id)->first();
+
+        if (!$package || $package->is_upload == 0) {
+            return error("套餐已下架");
+        }
+
+        $agent_package = AgentPackage::select([
+            'id',
+            'is_upload',
+        ])
+            ->where('user_id', $user_id)->where('package_id', $package_id)->first();
+        if ($agent_package && $agent_package->is_upload == 0) {
+            return error("套餐已下架");
+        }
+
+        return ['code' => 1, 'msg' => "success", 'data' => $package];
+    }
+
+    // 批量设置单品抽成
+    public function setUserProductYj(Request $request)
+    {
+        $request->validate([
+            'user_ids' => 'required|string', // 用户id
+            'package_id' => 'required|integer', // 套餐id
+            'yj_type' => 'required|integer|in:1,2', // 佣金类型
+            'yj_p' => 'integer', // 百分比
+            'yj_a' => 'numeric', // 金额
+        ]);
+
+        $package = Packages::where('id', $request->package_id)->exists();
+        if (!$package) {
+            return error("套餐不存在");
+        }
+
+        $user_ids = explode(',', $request->user_ids);
+
+        foreach ($user_ids as $user_id) {
+            $agent_package = AgentPackage::where('user_id', $user_id)->where('package_id', $request->package_id)->first();
+            if ($agent_package) {
+                $updateData = [
+                    'yj_type' => $request->yj_type,
+                    'yj_p' => $request->input('yj_p', $agent_package->yj_p),
+                    'yj_a' => $request->input('yj_a', $agent_package->yj_a),
+                ];
+                $agent_package->update($updateData);
+            } else {
+                AgentPackage::create([
+                    'user_id' => $user_id,
+                    'package_id' => $request->package_id,
+                    'yj_type' => $request->yj_type,
+                    'yj_p' => $request->yj_p ?? 0,
+                    'yj_a' => $request->yj_a ?? 0,
+                    'is_upload' => 1
+                ]);
+            }
+        }
+
+        return success();
+    }
+}

+ 156 - 0
app/DataApiNew/Helper/BlackListHelper.php

@@ -0,0 +1,156 @@
+<?php
+/*
+ * @Description: 黑名单表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-02 09:12:07
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-02 09:12:07
+ */
+ 
+namespace App\DataApiNew\Helper;
+ 
+use App\DataApiNew\Models\BlackList;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use Illuminate\Http\Request;
+
+class BlackListHelper{
+    // 查询条件
+    public function whens($query,$request)
+    {
+        return $query
+        ->when($request->filled('id'), fn($q) => $q->where('id', $request->id));
+    }
+    
+    // 查询列表
+    public function select(Request $request)
+    {
+        $page = new Pages($request,BlackList::query());
+
+        $page->before(function($query) use ($request) {
+            $query->select(BlackList::$selectFields);
+            return $this->whens($query,$request);
+        });
+
+        $result = $page->paginate();
+        
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {   
+        $query = BlackList::select(BlackList::$selectFields);
+        $query = $this->whens($query,$request);
+        $query->orderBy('created_at','desc');
+        $header = [
+            '类型 1拉黑' => 'type',
+            '手机号' => 'phone',
+            '用户id' => 'user_id',
+            '状态' => 'status',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+            '备注' => 'remark',
+          ];
+        $getEnValue = $this->getEnValue();
+        
+        $excel = new SpoutExport($header);
+        $excel->setData($query->get());
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+        
+        return $result ? success($result['url']) : error();
+    }
+    
+    // 导入
+    public function import(Request $request)
+    {   
+        $header = [
+            '类型 1拉黑' => 'type',
+            '手机号' => 'phone',
+            '用户id' => 'user_id',
+            '状态' => 'status',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+            '备注' => 'remark',
+          ];
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+        
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+            'open_status' =>  [
+                0 => "待开卡",
+                1 => "开卡中",
+            ]
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = BlackList::where(['id'=>$request->id])->select(BlackList::$selectFields)->first();
+        return success($result);
+    }
+    
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            'name' => 'required',
+        ]);
+        $result = BlackList::create($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+ 
+        $result = BlackList::where(['id'=>$request->id])->update($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",",$id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = BlackList::whereIn('id', $arr)->delete();
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+}

+ 202 - 0
app/DataApiNew/Helper/DyLiveApplyHelper.php

@@ -0,0 +1,202 @@
+<?php
+/*
+ * @Description: 抖音直播申请表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-12 09:01:14
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-12 09:01:14
+ */
+
+namespace App\DataApiNew\Helper;
+
+use App\DataApiNew\Models\DyLiveApply;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use Illuminate\Http\Request;
+
+class DyLiveApplyHelper
+{
+    // 查询条件
+    public function whens($query, $request)
+    {
+        return $query
+            ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id));
+    }
+
+    // 查询列表
+    public function select(Request $request)
+    {
+        $page = new Pages($request, DyLiveApply::query());
+
+        $page->before(function ($query) use ($request) {
+            $query->select(DyLiveApply::$selectFields);
+            return $this->whens($query, $request);
+        });
+
+        $result = $page->paginate();
+
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {
+        $query = DyLiveApply::select(DyLiveApply::$selectFields);
+        $query = $this->whens($query, $request);
+        $query->orderBy('created_at', 'desc');
+        $header = [
+            '用户id' => 'user_id',
+            '抖音uid' => 'dy_uid',
+            '不通过原因' => 'reason',
+            '状态 0:待审核 1:审核通过 2:审核不通过' => 'status',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '抖音号' => 'dy_code',
+            '删除时间' => 'deleted_at',
+        ];
+        $getEnValue = $this->getEnValue();
+
+        $excel = new SpoutExport($header);
+        $excel->setQuery($query);
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+
+        return $result ? success($result['url']) : error();
+    }
+
+    // 导入
+    public function import(Request $request)
+    {
+        $header = [
+            '用户id' => 'user_id',
+            '抖音uid' => 'dy_uid',
+            '不通过原因' => 'reason',
+            '状态 0:待审核 1:审核通过 2:审核不通过' => 'status',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '抖音号' => 'dy_code',
+            '删除时间' => 'deleted_at',
+        ];
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = DyLiveApply::where(['id' => $request->id])->select(DyLiveApply::$selectFields)->first();
+        return success($result);
+    }
+
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            'dy_uid' => 'required', // 抖音uid
+            'dy_code' => 'required', // 抖音号
+        ]);
+        $result = DyLiveApply::create($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        $result = DyLiveApply::where(['id' => $request->id])->update($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",", $id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = DyLiveApply::whereIn('id', $arr)->delete();
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 抖音直播申请
+    public function dyLiveApplySubmit(Request $request)
+    {
+        $request->validate([
+            'dy_uid' => 'required', // 抖音uid
+            'dy_code' => 'required', // 抖音号
+        ]);
+
+        $user_id = $request->user()->id;
+
+        $count = DyLiveApply::where(['user_id' => $user_id])->whereIn('status', [0, 1])->count();
+        if ($count >= 6) {
+            return ['code' => 0, 'msg' => "请勿重复申请"];
+        }
+
+        $result = DyLiveApply::create([
+            'user_id' => $user_id,
+            'dy_uid' => $request->dy_uid,
+            'dy_code' => $request->dy_code,
+        ]);
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 抖音直播审核
+    public function dyLiveApplyAudit(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+            'status' => 'required|integer|in:1,2',
+            // 'reason' => 'string|max:200',  //曹孟影注释掉的,前端传空字符串的时候报错:参数校验失败 reason - validation.string
+        ]);
+
+        $result = DyLiveApply::where(['id' => $request->id])
+            ->update([
+                'status' => $request->status,
+                'reason' => $request->input('reason', null),
+            ]);
+            
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+}

+ 209 - 0
app/DataApiNew/Helper/FileUploadHelper.php

@@ -0,0 +1,209 @@
+<?php
+
+namespace App\DataApiNew\Helper;
+
+
+use App\DataApiNew\Helper\TencentCosHelper;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Validator;
+
+class FileUploadHelper
+{
+    //上传文件类型对应的存储目录
+    public $upload_file_type = [
+        0 => "package_main", //套餐主图
+        1 => "package_type_image", //套餐类型的图片
+        2 => "lunbo_image", //轮播图
+        3 => "poster", //海报
+        4 => "admin_logo", //后台logo
+        5 => "h5_logo", //h5logo
+        6 => "menu_logo", //菜单logo
+        7 => "package_cover_img", //套餐封面图
+        8 => "kefu_image", //客服二维码
+        9 => "xcx_static", //小程序静态文件
+        10 => "agent_kefu_image", //合伙人客服二维码
+        11 => "small_shop_image", //小店头像图片
+        12 => "contact_qrcode", //联系二维码
+        13 => "system_tutorial_video", //系统教程视频
+        14 => "id_card_image", // 实名认证身份证照片
+        15 => "ident_image", //运营商标识图
+        16 => "jkc_college_cover", //集客仓商学院封面图
+        17 => "jkc_college_image", //集客仓商学院内容图
+        18 => "small_shop_bgimg", //小店背景图
+        19 => "order_idcard", //订单身份证
+        20 => "hot_refresh", //热更新
+        21 => "iot_cover_img", //设备封面图
+        22 => "iot_image", //设备主图
+        23 => "saler_apk", //app安装包
+        24 => "iot_package_introduce", //设备套餐介绍
+        31 => "broad_cover_img", //宽带封面图
+        32 => "broad_image", //宽带主图
+        33 => "pretty_image", //靓号订单默认封面图
+        34 => "work_order_image", //工单图片
+        999 => "wechat_xcx", //微信小程序
+    ];
+
+    //文件上传
+    public function uploadFiles($request)
+    {
+        if (!in_array($request->file('file')->getClientOriginalExtension(), ['jpeg', 'png', 'jpg', 'wgt'])) {
+            return error('文件格式不正确');
+        }
+
+        // 验证上传文件是否合法
+        $validate = Validator::make($request->all(), [
+            'file' => 'required|file|max:102400',
+            'type' => 'required|integer',
+        ], [
+            'file.required' => '请上传文件',
+            'type.required' => '请选择上传类型',
+        ]);
+
+        if ($validate->fails()) {
+            return error($validate->errors()->first());
+        }
+
+        try {
+            // 获取上传文件保存的目录 
+            $upload_file_type = $this->upload_file_type[$request->type];
+            // 获取上传的文件
+            $file = $request->file('file');
+            // 生成唯一的文件名
+            $filename = uniqid() . '_' . time() . '.' . $file->getClientOriginalExtension();
+            // 将文件保存到指定目录 public/cos_file/
+            $file->storeAs($upload_file_type, $filename, 'cos_file');
+            // 获取文件相对路径
+            $file_path = "cos_file/" . $upload_file_type . "/" . $filename;
+            // 上传到腾讯云cos
+            $cos = new TencentCosHelper();
+            $result = $cos->uploadFiles($file_path);
+            //删除文件
+            unlink($file_path);
+            return $result;
+        } catch (\Exception $e) {
+            Log::error($e);
+            return ['code' => 0, 'msg' => '上传失败'];
+        }
+    }
+
+    //文件上传 压缩版
+    public function uploadFilesCompress($request)
+    {
+        if (!in_array($request->file('file')->getClientOriginalExtension(), ['jpeg', 'png', 'jpg', 'wgt'])) {
+            return error('文件格式不正确');
+        }
+
+        // 验证上传文件是否合法
+        $validate = Validator::make($request->all(), [
+            'file' => 'required|file|max:102400',
+            'type' => 'required|integer',
+        ], [
+            'file.required' => '请上传文件',
+            'type.required' => '请选择上传类型',
+        ]);
+
+        if ($validate->fails()) {
+            return error($validate->errors()->first());
+        }
+
+        try {
+            // 获取上传文件保存的目录 
+            $upload_file_type = $this->upload_file_type[$request->type];
+            $maxFileSize = 2;
+            if ($request->type == 19) {
+                $maxFileSize = 1.4;
+            }
+            // 获取上传的文件
+            $file = $request->file('file');
+            // 生成唯一的文件名
+            $filename = uniqid() . '_' . time() . '.' . $file->getClientOriginalExtension();
+            // 获取文件相对路径
+            $file_path = "cos_file/" . $upload_file_type . "/" . $filename;
+            // 压缩
+            // Log::info("上传文件:开始压缩");
+            $yasuo = (new UtilsHelper)->compressImage($file, $file_path, 800, 600, $maxFileSize * 1024 * 1024);
+            // Log::info("上传文件:开始压缩完成".$yasuo);
+            if ($yasuo == 0) {
+                // 将文件保存到指定目录 public/cos_file/
+                $file->storeAs($upload_file_type, $filename, 'cos_file');
+            } elseif ($yasuo == 2) {
+                $fileMimeType = $request->file('file')->getClientMimeType();
+                $fileSize = $request->file('file')->getSize();
+                Log::error("压缩文件格式不正确: 类型 - {$fileMimeType}, 大小 - {$fileSize} 字节");
+                return  ['code' => 0, 'msg' => '文件格式不正确'];
+            }
+            // 上传到腾讯云cos
+            // Log::info("上传文件:开始上云");
+            $cos = new TencentCosHelper();
+            $result = $cos->uploadFiles($file_path);
+            Log::info("上传文件:上云完成" . json_encode($result));
+            //删除文件
+            unlink($file_path);
+            return $result;
+        } catch (\Exception $e) {
+            Log::error($e);
+            return ['code' => 0, 'msg' => '上传失败:' . $e->getMessage()];
+        }
+    }
+
+    //生成二维码并上传腾讯云
+    public function createQrcode($type, $filename, $url)
+    {
+        try {
+            require 'phpqrcode/qrlib.php';
+            $public_path = public_path();
+            // 获取上传文件保存的目录 
+            $upload_file_type = $this->upload_file_type[$type];
+
+            // 获取文件相对路径
+            $file_path = "cos_file/" . $upload_file_type . "/" . $filename;
+            self::ensureDirectoryExists($public_path . "/cos_file/" . $upload_file_type);
+            // 创建二维码图片
+            \QRcode::png($url, $public_path . "/" . $file_path, 'L', 5);
+            // 上传到腾讯云cos
+            $cos = new TencentCosHelper();
+            $result = $cos->uploadFiles($file_path);
+            //删除文件
+            unlink($file_path);
+            return $result;
+        } catch (\Exception $e) {
+            return ['code' => 0, 'msg' => '上传失败:' . $e->getMessage()];
+        }
+    }
+
+    //把二维码和海报背景合并后的图片上传到腾讯云
+    public function upPosterCos($type, $filename)
+    {
+        try {
+            $public_path = public_path();
+            // 获取上传文件保存的目录 
+            $upload_file_type = $this->upload_file_type[$type];
+
+            // 获取文件相对路径
+            $file_path = "cos_file/" . $upload_file_type . "/" . $filename;
+            self::ensureDirectoryExists($public_path . "/cos_file/" . $upload_file_type);
+
+            // 上传到腾讯云cos
+            $cos = new TencentCosHelper();
+            $result = $cos->uploadFiles($file_path);
+            //删除文件
+            unlink($file_path);
+            return $result;
+        } catch (\Exception $e) {
+            return ['code' => 0, 'msg' => '上传失败:' . $e->getMessage()];
+        }
+    }
+
+    //检测文件夹是否存在,不存在则创建
+    public static function ensureDirectoryExists($directoryPath)
+    {
+        if (!is_dir($directoryPath)) {
+            // 如果文件夹不存在,尝试创建它
+            if (!mkdir($directoryPath, 0777, true)) {
+                // 创建失败,可以根据需要进行错误处理
+                return false;
+            }
+        }
+        return true;
+    }
+}

+ 355 - 0
app/DataApiNew/Helper/GetPaysHelper.php

@@ -0,0 +1,355 @@
+<?php
+/*
+ * @Description: 提现表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-04 13:18:11
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-04 13:18:11
+ */
+
+namespace App\DataApiNew\Helper;
+
+use App\DataApiNew\Models\GetPays;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use App\DataApiNew\Models\AdminUsers;
+use App\DataApiNew\Models\UserYjrecord;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Redis;
+
+class GetPaysHelper
+{
+    // 查询条件
+    public function whens($query, $request)
+    {
+        return $query
+            ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id))
+            ->when($request->filled('user_id'), fn ($q) => $q->where('user_id', $request->user_id))
+            ->when($request->filled('type'), fn ($q) => $q->where('type', $request->type))
+            ->when($request->filled('status'), fn ($q) => $q->where('status', $request->status));
+    }
+
+    // 查询列表
+    public function select(Request $request)
+    {
+        $user_id = $request->user()->id;
+
+        $page = new Pages($request, GetPays::query());
+
+        $page->before(function ($query) use ($request, $user_id) {
+            
+            if(AdminUsers::isAdmin($user_id)){
+                $query->select(GetPays::$selectFields);
+            }else{
+                $query->select([
+                    'open_id', // 微信openid
+                    'unionid', // 微信平台唯一码
+                    'status', // 状态 0:待审核 1:审核通过 2:审核不通过
+                    'amount',
+                    'errmsg', // 失败原因
+                    'order_no', // 提现订单号
+                    'bankcard', // 银行卡号
+                    'openbank', // 开户行
+                    'username', // 姓名
+                    'alipay', // 支付宝账号
+                    'alipay_name', // 支付宝姓名
+                    'wechat_no', // 微信号
+                    'created_at', // 创建时间
+                    'type', // 提现方式 1:支付宝 2:银行卡 3:微信
+                    'remit_amount',
+                    'charge_amount',
+                    'tax_point', // 税点
+                ])->where('user_id', $user_id);
+            }
+
+            return $this->whens($query, $request);
+        });
+
+        $result = $page->paginate();
+
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {
+        $query = GetPays::select(GetPays::$selectFields);
+        $query = $this->whens($query, $request);
+        $query->orderBy('created_at', 'desc');
+        $header = [
+            '主键' => 'id',
+            '用户id' => 'user_id',
+            '微信openid' => 'open_id',
+            '微信平台唯一码' => 'unionid',
+            '状态 0:待审核 1:审核通过 2:审核不通过' => 'status',
+            '失败原因' => 'errmsg',
+            '提现订单号' => 'order_no',
+            '银行卡号' => 'bankcard',
+            '开户行' => 'openbank',
+            '姓名' => 'username',
+            '支付宝账号' => 'alipay',
+            '支付宝姓名' => 'alipay_name',
+            '微信号' => 'wechat_no',
+            '创建时间' => 'created_at',
+            '修改时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+            '提现方式 1:支付宝 2:银行卡 3:微信' => 'type',
+            '打款信息id' => 'remit_id',
+            '税点' => 'tax_point',
+        ];
+        $getEnValue = $this->getEnValue();
+
+        $excel = new SpoutExport($header);
+        $excel->setData($query->get());
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+
+        return $result ? success($result['url']) : error();
+    }
+
+    // 导入
+    public function import(Request $request)
+    {
+        $header = [
+            '主键' => 'id',
+            '用户id' => 'user_id',
+            '微信openid' => 'open_id',
+            '微信平台唯一码' => 'unionid',
+            '状态 0:待审核 1:审核通过 2:审核不通过' => 'status',
+            '失败原因' => 'errmsg',
+            '提现订单号' => 'order_no',
+            '银行卡号' => 'bankcard',
+            '开户行' => 'openbank',
+            '姓名' => 'username',
+            '支付宝账号' => 'alipay',
+            '支付宝姓名' => 'alipay_name',
+            '微信号' => 'wechat_no',
+            '创建时间' => 'created_at',
+            '修改时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+            '提现方式 1:支付宝 2:银行卡 3:微信' => 'type',
+            '打款信息id' => 'remit_id',
+            '税点' => 'tax_point',
+        ];
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = GetPays::where(['id' => $request->id])->select(GetPays::$selectFields)->first();
+        return success($result);
+    }
+
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            // 'name' => 'required',
+        ]);
+        $result = GetPays::create($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        $result = GetPays::where(['id' => $request->id])->update($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",", $id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = GetPays::whereIn('id', $arr)->delete();
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    //提现申请
+    public function userGetpayApply(Request $request)
+    {
+        $request->validate([
+            'amount' => 'required|numeric',
+            'type' => 'required|integer|in:1,2,3', // 提现方式 1:支付宝 2:银行卡 3:微信
+        ]);
+
+        if ($request->type == 1) {
+            $request->validate([
+                'alipay' => 'required|string|max:30',
+                'alipayname' => 'required|string|max:30',
+            ]);
+        } elseif ($request->type == 2) {
+            $request->validate([
+                'username' => 'required|string|max:20',
+                'bankcard' => 'required|string|max:30',
+                'openbank' => 'required|string|max:100',
+            ]);
+        } elseif ($request->type == 3) {
+            $request->validate([
+                'wechat_no' => 'required|string|max:50',
+            ]);
+        }
+
+        sys_log($request, '提现申请', '提现记录');
+
+        $user_id = $request->user()->id;
+
+        $cacheKey = "getpay_apply_" . $user_id;
+        if (!Cache::add($cacheKey, 1, 5)) {
+            return ['code' => 0, 'msg' => "请勿频繁请求"];
+        }
+
+        if (empty($request->amount) || $request->amount < 1)  return ['code' => 0, 'msg' => '提现金额不能为空或小于1元'];
+
+        // 查询实名
+        $is_real = AdminUsers::where('id', $user_id)->value('is_real');
+        if ($is_real != 1) {
+            return ['code' => 0, 'msg' => "未进行实名认证"];
+        }
+
+        $amount = $request->amount;
+        $type = $request->type;
+        $username = $request->input('username', null);
+        $bankcard = $request->input('bankcard', null);
+        $openbank = $request->input('openbank', null);
+        $alipay = $request->input('alipay', null);
+        $alipayname = $request->input('alipayname', null);
+        $wechat_no = $request->input('wechat_no', null);
+
+        $user = AdminUsers::where('id', $user_id)->select(['id', 'parent_id', 'username', 'yj'])->first();
+        if (empty($user)) {
+            return ['code' => 0, 'msg' => '无效的用户信息'];
+        }
+
+        if ($user->yj < $amount)  return ['code' => 0, 'msg' => '账户余额不足,无法申请提现'];
+
+        //0:待审核 1:审核成功 2:审核失败 3:打款中
+        $exists = GetPays::where(['user_id' => $user_id])->whereIn('status', [0])->exists();
+        if ($exists) {
+            return ['code' => 0, 'msg' => '当前有在提现的金额,请审核通过后再申请提现'];
+        }
+
+        $order_no = UtilsHelper::order_id();
+
+        // 处理银行卡号空格 
+        if (!empty($bankcard)) {
+            $bankcard = str_replace(' ', '', $bankcard);
+        }
+
+        $tax_point = env('GETPAY_TAX'); //税点比例
+
+        if ($tax_point == 0) {
+            $charge_amount = 0;
+            $remit_amount = $amount;
+        } else {
+            $charge_amount = bcmul($amount, bcdiv($tax_point, '100', 2), 2); //扣税金额
+            $remit_amount = bcsub($amount, $charge_amount, 2); //打款金额
+        }
+
+        $data = [
+            'order_no' => $order_no,
+            'amount' => $amount,
+            'charge_amount' => $charge_amount,
+            'remit_amount' => $remit_amount,
+            'tax_point' => $tax_point,
+            'user_id' => $user_id,
+            'bankcard' => $bankcard,
+            'openbank' => $openbank,
+            'username' => $username,
+            'alipay' => $alipay,
+            'type' => $type,
+            'alipay_name' => $alipayname,
+            'wechat_no' => $wechat_no,
+        ];
+
+        if (GetPays::create($data)) {
+            sys_log($request, '用户申请提现', '提现记录');
+            return ['code' => 1, 'msg' => '提现申请提交成功'];
+        } else {
+            return ['code' => 0, 'msg' => '提现申请提交失败'];
+        }
+    }
+
+    // 提现审核
+    public function userGetpayCheck(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+            'status' => 'required|integer|in:1,2', // 提现状态 1:审核通过 2:审核失败
+        ]);
+
+        sys_log($request, '用户提现审核', '提现记录');
+
+        $getPays = GetPays::find($request->id);
+        if (empty($getPays)) {
+            return ['code' => 0, 'msg' => "无效的提现记录"];
+        }
+
+        DB::beginTransaction();
+
+        try {
+            if ($request->status == 1) {
+                (new UserYjrecord())->recharge([
+                    'user_id' => $getPays->user_id,
+                    'yj' => $getPays->remit_amount,
+                    'type' => UserYjrecord::TYPE_WITHDRAW,
+                    'status' => UserYjrecord::STATUS_SUB,
+                    'order_no' => $getPays->order_no,
+                    'source' => '余额提现',
+                ]);
+            }
+
+            $getPays->update(['status' => $request->status]);
+
+            DB::commit();
+
+            return ['code' => 1, 'msg' => "操作成功"];
+        } catch (\Throwable $th) {
+            Log::error('提现审核失败:' . $th->getMessage());
+            DB::rollBack();
+            return ['code' => 0, 'msg' => "操作失败"];
+        }
+    }
+}

+ 157 - 0
app/DataApiNew/Helper/HkOrderYjrecordHelper.php

@@ -0,0 +1,157 @@
+<?php
+/*
+ * @Description: 号卡订单佣金记录
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-27 14:56:01
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-27 14:56:01
+ */
+ 
+namespace App\DataApiNew\Helper;
+ 
+use App\DataApiNew\Models\HkOrderYjrecord;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use Illuminate\Http\Request;
+
+class HkOrderYjrecordHelper{
+    // 查询条件
+    public function whens($query,$request)
+    {
+        return $query
+        ->when($request->filled('id'), fn($q) => $q->where('id', $request->id));
+    }
+    
+    // 查询列表
+    public function select(Request $request)
+    {
+        $page = new Pages($request,HkOrderYjrecord::query());
+
+        $page->before(function($query) use ($request) {
+            $query->select(HkOrderYjrecord::$selectFields);
+            return $this->whens($query,$request);
+        });
+
+        $result = $page->paginate();
+        
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {   
+        $query = HkOrderYjrecord::select(HkOrderYjrecord::$selectFields);
+        $query = $this->whens($query,$request);
+        $query->orderBy('created_at','desc');
+        $header = [
+            '订单号' => 'order_no',
+            '用户id' => 'user_id',
+            '订单来源用户id' => 'from_user_id',
+            '上级用户id' => 'parent_id',
+            '层级差' => 'level_diff',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+          ];
+        $getEnValue = $this->getEnValue();
+        
+        $excel = new SpoutExport($header);
+        $excel->setData($query->get());
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+        
+        return $result ? success($result['url']) : error();
+    }
+    
+    // 导入
+    public function import(Request $request)
+    {   
+        $header = [
+            '订单号' => 'order_no',
+            '用户id' => 'user_id',
+            '订单来源用户id' => 'from_user_id',
+            '上级用户id' => 'parent_id',
+            '层级差' => 'level_diff',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+          ];
+        $getEnValue = $this->getEnValue();
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+        
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+            'open_status' =>  [
+                0 => "待开卡",
+                1 => "开卡中",
+            ]
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = HkOrderYjrecord::where(['id'=>$request->id])->select(HkOrderYjrecord::$selectFields)->first();
+        return success($result);
+    }
+    
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            'name' => 'required',
+        ]);
+        $result = HkOrderYjrecord::create($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+ 
+        $result = HkOrderYjrecord::where(['id'=>$request->id])->update($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",",$id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = HkOrderYjrecord::whereIn('id', $arr)->delete();
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+}

+ 183 - 0
app/DataApiNew/Helper/HotRefreshHelper.php

@@ -0,0 +1,183 @@
+<?php
+/*
+ * @Description: 热更新
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2025-01-07 10:17:19
+ * @LastEditors: lexuan
+ * @LastEditTime: 2025-01-07 10:17:19
+ */
+ 
+namespace App\DataApiNew\Helper;
+ 
+use App\DataApiNew\Models\HotRefresh;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+
+class HotRefreshHelper{
+    // 查询条件
+    public function whens($query,$request)
+    {
+        return $query
+        ->when($request->filled('id'), fn($q) => $q->where('id', $request->id));
+    }
+    
+    // 查询列表
+    public function select(Request $request)
+    {
+        $page = new Pages($request,HotRefresh::query());
+
+        $page->before(function($query) use ($request) {
+            $query->select(HotRefresh::$selectFields);
+            return $this->whens($query,$request);
+        });
+
+        $result = $page->paginate();
+        
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {   
+        $query = HotRefresh::select(HotRefresh::$selectFields);
+        $query = $this->whens($query,$request);
+        $query->orderBy('created_at','desc');
+        $header = [
+            '热更新包路径' => 'wgt_path',
+            '版本号' => 'version',
+            '描述' => 'desc',
+            '发布状态 0未发布 1发布' => 'status',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+            '是否强制更新 0不强制 1强制' => 'is_force',
+          ];
+        $getEnValue = $this->getEnValue();
+        
+        $excel = new SpoutExport($header);
+        $excel->setQuery($query);
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+        
+        return $result ? success($result['url']) : error();
+    }
+    
+    // 导入
+    public function import(Request $request)
+    {   
+        $header = [
+            '热更新包路径' => 'wgt_path',
+            '版本号' => 'version',
+            '描述' => 'desc',
+            '发布状态 0未发布 1发布' => 'status',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+            '是否强制更新 0不强制 1强制' => 'is_force',
+          ];
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+        
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = HotRefresh::where(['id'=>$request->id])->select(HotRefresh::$selectFields)->first();
+        return success($result);
+    }
+    
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            // 'name' => 'required',
+        ]);
+        $result = HotRefresh::create($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+ 
+        $result = HotRefresh::where(['id'=>$request->id])->update($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",",$id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return error('存在子数据,无法删除');
+        // }
+        $result = HotRefresh::whereIn('id', $arr)->delete();
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+
+    // 查询当前发布版本
+    public function getNowVersion()
+    {
+        return success(HotRefresh::where(['status'=>1])->first());
+    }
+
+    // 设置当前发布版本
+    public function setNowVersion(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        sys_log($request, '设置当前发布版本', '热更新');
+
+        $result = DB::transaction(function () use ($request){
+            try {
+                HotRefresh::where('id','!=',$request->id)->update(['status'=>0]);
+                HotRefresh::where('id', $request->id)->update(['status' => 1]);
+                return true;
+            } catch (\Exception $e) {
+                DB::rollBack();
+                Log::error("设置当前发布版本失败",[$e]);
+                return false;
+            }
+        });
+        return $result ? success() : error();
+    }
+}

+ 165 - 0
app/DataApiNew/Helper/JkcCollegeHelper.php

@@ -0,0 +1,165 @@
+<?php
+/*
+ * @Description: 集客仓商学院
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-02 11:40:06
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-02 11:40:06
+ */
+ 
+namespace App\DataApiNew\Helper;
+ 
+use App\DataApiNew\Models\JkcCollege;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use Illuminate\Http\Request;
+
+class JkcCollegeHelper{
+    // 查询条件
+    public function whens($query,$request)
+    {
+        return $query
+        ->when($request->filled('id'), fn($q) => $q->where('id', $request->id))
+        ->when($request->filled('type'), fn($q) => $q->where('type', $request->type))
+        ->when($request->filled('channel'), fn($q) => $q->where('channel', $request->channel))
+        ->when($request->filled('title'), fn($q) => $q->where('title', $request->title));
+    }
+    
+    // 查询列表
+    public function select(Request $request)
+    {
+        $page = new Pages($request,JkcCollege::query());
+
+        $page->before(function($query) use ($request) {
+            $query->select(JkcCollege::$selectFields);
+            return $this->whens($query,$request);
+        });
+
+        $result = $page->paginate();
+        
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {   
+        $query = JkcCollege::select(JkcCollege::$selectFields);
+        $query = $this->whens($query,$request);
+        $query->orderBy('created_at','desc');
+        $header = [
+            '渠道 0:其他 1:抖音 2:知乎 3:小红书' => 'channel',
+            '类型 1:推卡 2:招募' => 'type',
+            '标题' => 'title',
+            '副标题' => 'min_text',
+            '内容' => 'content',
+            '状态' => 'status',
+            '查看次数' => 'view_num',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+            '封面图片' => 'cover_image',
+          ];
+        $getEnValue = $this->getEnValue();
+        
+        $excel = new SpoutExport($header);
+        $excel->setData($query->get());
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+        
+        return $result ? success($result['url']) : error();
+    }
+    
+    // 导入
+    public function import(Request $request)
+    {   
+        $header = [
+            '渠道 0:其他 1:抖音 2:知乎 3:小红书' => 'channel',
+            '类型 1:推卡 2:招募' => 'type',
+            '标题' => 'title',
+            '副标题' => 'min_text',
+            '内容' => 'content',
+            '状态' => 'status',
+            '查看次数' => 'view_num',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+            '封面图片' => 'cover_image',
+          ];
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+        
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+            'open_status' =>  [
+                0 => "待开卡",
+                1 => "开卡中",
+            ]
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = JkcCollege::where(['id'=>$request->id])->select(JkcCollege::$selectFields)->first();
+        return success($result);
+    }
+    
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            'name' => 'required',
+        ]);
+        $result = JkcCollege::create($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+ 
+        $result = JkcCollege::where(['id'=>$request->id])->update($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",",$id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = JkcCollege::whereIn('id', $arr)->delete();
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+}

+ 169 - 0
app/DataApiNew/Helper/LayerMangerHelper.php

@@ -0,0 +1,169 @@
+<?php
+/*
+ * @Description: 弹窗管理表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-02 11:22:25
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-02 11:22:25
+ */
+ 
+namespace App\DataApiNew\Helper;
+ 
+use App\DataApiNew\Models\LayerManger;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+
+class LayerMangerHelper{
+    // 查询条件
+    public function whens($query,$request)
+    {
+        return $query
+        ->when($request->filled('id'), fn($q) => $q->where('id', $request->id));
+    }
+    
+    // 查询列表
+    public function select(Request $request)
+    {
+        $page = new Pages($request,LayerManger::query());
+
+        $page->before(function($query) use ($request) {
+            $query->select(LayerManger::$selectFields);
+            return $this->whens($query,$request);
+        });
+
+        $result = $page->paginate();
+        
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {   
+        $query = LayerManger::select(LayerManger::$selectFields);
+        $query = $this->whens($query,$request);
+        $query->orderBy('created_at','desc');
+        $header = [
+            '弹出层标题' => 'title',
+            '内容' => 'content',
+            '类型 1:首页' => 'type',
+            '开始时间' => 'start_time',
+            '结束时间' => 'end_time',
+            '状态' => 'status',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+          ];
+        $getEnValue = $this->getEnValue();
+        
+        $excel = new SpoutExport($header);
+        $excel->setData($query->get());
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+        
+        return $result ? success($result['url']) : error();
+    }
+    
+    // 导入
+    public function import(Request $request)
+    {   
+        $header = [
+            '弹出层标题' => 'title',
+            '内容' => 'content',
+            '类型 1:首页' => 'type',
+            '开始时间' => 'start_time',
+            '结束时间' => 'end_time',
+            '状态' => 'status',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+          ];
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+        
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+            'open_status' =>  [
+                0 => "待开卡",
+                1 => "开卡中",
+            ]
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = LayerManger::where(['id'=>$request->id])->select(LayerManger::$selectFields)->first();
+        return success($result);
+    }
+    
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            'name' => 'required',
+        ]);
+        $result = LayerManger::create($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+ 
+        $result = LayerManger::where(['id'=>$request->id])->update($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",",$id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = LayerManger::whereIn('id', $arr)->delete();
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+
+    // 获取当前可显示弹窗
+    public function getLayerShow()
+    {
+        $date = Carbon::now()->format('Y-m-d H:i:s');
+        $result = LayerManger::where('status',1)
+        ->where('start_time', '<=', $date)
+        ->where('end_time', '>=', $date)
+        ->get();
+        
+        return success($result);
+    }
+}

+ 162 - 0
app/DataApiNew/Helper/LbsHelper.php

@@ -0,0 +1,162 @@
+<?php
+/*
+ * @Description: 轮播表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-29 15:01:21
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-29 15:01:21
+ */
+ 
+namespace App\DataApiNew\Helper;
+ 
+use App\DataApiNew\Models\Lbs;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use Illuminate\Http\Request;
+
+class LbsHelper{
+    // 查询条件
+    public function whens($query,$request)
+    {
+        return $query
+        ->when($request->filled('id'), fn($q) => $q->where('id', $request->id));
+    }
+    
+    // 查询列表
+    public function select(Request $request)
+    {
+        $page = new Pages($request,Lbs::query());
+
+        $page->before(function($query) use ($request) {
+            $query->select(Lbs::$selectFields);
+            return $this->whens($query,$request);
+        });
+
+        $result = $page->paginate();
+        
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {   
+        $query = Lbs::select(Lbs::$selectFields);
+        $query = $this->whens($query,$request);
+        $query->orderBy('created_at','desc');
+        $header = [
+            '图片' => 'img',
+            '状态 0禁用 1启用' => 'status',
+            '链接产品id' => 'package_id',
+            '创建时间' => 'created_at',
+            '修改时间' => 'updated_at',
+            '权重' => 'weight',
+            '跳转链接' => 'url',
+            '类型:1:H5 2:微信小程序' => 'type',
+          ];
+        $getEnValue = $this->getEnValue();
+        
+        $excel = new SpoutExport($header);
+        $excel->setData($query->get());
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+        
+        return $result ? success($result['url']) : error();
+    }
+    
+    // 导入
+    public function import(Request $request)
+    {   
+        $header = [
+            '图片' => 'img',
+            '状态 0禁用 1启用' => 'status',
+            '链接产品id' => 'package_id',
+            '创建时间' => 'created_at',
+            '修改时间' => 'updated_at',
+            '权重' => 'weight',
+            '跳转链接' => 'url',
+            '类型:1:H5 2:微信小程序' => 'type',
+          ];
+        $getEnValue = $this->getEnValue();
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+        
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+            'open_status' =>  [
+                0 => "待开卡",
+                1 => "开卡中",
+            ]
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = Lbs::where(['id'=>$request->id])->select(Lbs::$selectFields)->first();
+        return success($result);
+    }
+    
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            // 'name' => 'required',
+        ]);
+        sys_log($request, '添加轮播', '轮播管理');
+        $result = Lbs::create($request->all());
+
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+ 
+        sys_log($request, '修改轮播', '轮播管理');
+
+        $result = Lbs::where(['id'=>$request->id])->update($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        sys_log($request, '删除轮播', '轮播管理');
+        $id_str = $request->ids;
+        $arr = explode(",",$id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = Lbs::whereIn('id', $arr)->delete();
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+}

+ 185 - 0
app/DataApiNew/Helper/OrderSettRecordHelper.php

@@ -0,0 +1,185 @@
+<?php
+/*
+ * @Description: 结算记录表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-29 16:50:19
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-29 16:50:19
+ */
+
+namespace App\DataApiNew\Helper;
+
+use App\DataApiNew\Models\OrderSettRecord;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use App\Jobs\AutoSettleJob;
+use Illuminate\Http\Request;
+
+class OrderSettRecordHelper
+{
+    // 查询条件
+    public function whens($query, $request)
+    {
+        return $query
+            ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id));
+    }
+
+    // 查询列表
+    public function select(Request $request)
+    {
+        $page = new Pages($request, OrderSettRecord::query());
+
+        $page->before(function ($query) use ($request) {
+            $query->select(OrderSettRecord::$selectFields);
+            return $this->whens($query, $request);
+        });
+
+        $result = $page->paginate();
+
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {
+        $query = OrderSettRecord::select(OrderSettRecord::$selectFields);
+        $query = $this->whens($query, $request);
+        $query->orderBy('created_at', 'desc');
+        $header = [
+            '导入文件路径' => 'put_file',
+            '结算结果文件路径' => 'out_file',
+            '状态 0待执行 1执行中 2执行成功 3执行失败 4停止执行' => 'status',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+            '备注' => 'remark',
+            '标题' => 'title',
+            '1号卡 2设备 3靓号 4宽带' => 'type',
+        ];
+        $getEnValue = $this->getEnValue();
+
+        $excel = new SpoutExport($header);
+        $excel->setData($query->get());
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+
+        return $result ? success($result['url']) : error();
+    }
+
+    // 导入
+    public function import(Request $request)
+    {
+        $header = [
+            '导入文件路径' => 'put_file',
+            '结算结果文件路径' => 'out_file',
+            '状态 0待执行 1执行中 2执行成功 3执行失败 4停止执行' => 'status',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+            '删除时间' => 'deleted_at',
+            '备注' => 'remark',
+            '标题' => 'title',
+            '1号卡 2设备 3靓号 4宽带' => 'type',
+        ];
+        $getEnValue = $this->getEnValue();
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+            'open_status' =>  [
+                0 => "待开卡",
+                1 => "开卡中",
+            ]
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = OrderSettRecord::where(['id' => $request->id])->select(OrderSettRecord::$selectFields)->first();
+        return success($result);
+    }
+
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            'file' => 'required|mimes:csv,xls,xlsx',
+            'type' => 'required|integer|in:1,2,3,4',
+        ]);
+
+        $title = $request->input('title', null);
+        // 获取上传的文件
+        $file = $request->file('file');
+        $type = $request->type;
+        // 生成唯一的文件名
+        $filename = "sttle_put_" . uniqid() . '_' . time() . '.' . $file->getClientOriginalExtension();
+        // 将文件保存到指定目录 public/csv/
+        $file->storeAs("/batch_order_settle/put", $filename, 'csv');
+        $file_path = "csv/batch_order_settle/put/" . $filename;
+
+        $result = OrderSettRecord::create([
+            'put_file' => $file_path,
+            'title' => $title,
+            'type' => $type,
+        ]);
+        if ($result) {
+            AutoSettleJob::dispatch($result->id, $type);
+            return ['code' => 1, 'msg' => "success", 'data' => config('app.url') . "/" . $file_path];
+        } else {
+            return error();
+        }
+    }
+
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        $result = OrderSettRecord::where(['id' => $request->id])->update($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",", $id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = OrderSettRecord::whereIn('id', $arr)->delete();
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 获取导入模版
+    public function getOrderSettImportTemplate()
+    {
+        $headers = ['订单号', '结算状态 [ 结算成功 结算失败 ]', '原因'];
+        return (new SpoutImport([]))->generateImportTemplat($headers,[30,50,20]);
+    }
+}

+ 751 - 0
app/DataApiNew/Helper/OrdersHelper.php

@@ -0,0 +1,751 @@
+<?php
+/*
+ * @Description: 号卡订单管理
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-27 14:00:58
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-27 14:00:58
+ */
+
+namespace App\DataApiNew\Helper;
+
+use App\DataApiNew\Models\Orders;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use App\DataApiNew\Models\AdminUsers;
+use App\DataApiNew\Models\HkOrderYjrecord;
+use App\DataApiNew\Models\OrderSettRecord;
+use App\DataApiNew\Models\PackageMemberLevelRoyalty;
+use App\DataApiNew\Models\UserYjrecord;
+use App\DataApiNew\Models\Packages;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Redis;
+use Illuminate\Support\Facades\Validator;
+use Vinkla\Hashids\Facades\Hashids;
+
+
+
+class OrdersHelper
+{
+    // 查询条件
+    public function whens($query, $request)
+    {
+        return $query
+            ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id))
+            ->when($request->filled('order_no'), fn ($q) => $q->where('order_no', $request->order_no))
+            ->when($request->filled('bus_order_id'), fn ($q) => $q->where('bus_order_id', $request->bus_order_id))
+            ->when($request->filled('package_name'), fn ($q) => $q->where('package_name', 'like', "%$request->package_name%"))
+            ->when($request->has('open_status'), fn ($q) => $q->where('open_status', $request->open_status))
+            ->when($request->filled('operator_id'), fn ($q) => $q->where('operator_id', $request->operator_id))
+            ->when($request->filled('id_card_name'), fn ($q) => $q->where('id_card_name', 'like', "%$request->id_card_name%"))
+            ->when($request->filled('id_card'), fn ($q) => $q->where('id_card', $request->id_card))
+            ->when($request->filled('mobile'), fn ($q) => $q->where('mobile', $request->mobile))
+            ->when($request->filled('user_id'), fn ($q) => $q->where('user_id', $request->user_id))
+            ->when($request->filled('express_no'), fn ($q) => $q->where('express_no', $request->express_no))
+            ->when($request->filled('open_message'), fn ($q) => $q->where('open_message', $request->open_message))
+            ->when($request->filled('created_at_start'), fn ($q) => $q->where('created_at', '>=', $request->created_at_start))
+            ->when($request->filled('created_at_end'), fn ($q) => $q->where('created_at', '<=', $request->created_at_end))
+            ->when($request->filled('sett_time_start'), fn ($q) => $q->where('sett_time', '>=', $request->sett_time_start))
+            ->when($request->filled('sett_time_end'), fn ($q) => $q->where('sett_time', '<=', $request->sett_time_end));
+    }
+
+    // 查询列表
+    public function select(Request $request)
+    {
+        $user_id = $request->user()->id;
+
+        $page = new Pages($request, Orders::query());
+
+        if (AdminUsers::isAdmin($user_id)) {
+            // admin 查看全部
+            $page->withRelations(['order_yjrecord']);
+
+            $page->before(function ($query) use ($request) {
+                $query->select(Orders::$selectFields);
+                return $this->whens($query, $request);
+            });
+        } else {
+            $request->validate([
+                'type' => 'required|in:all,direct,saler',
+            ]);
+
+            // 按照type获取用户列表
+            if ($request->type == 'all') {
+                $user_list = AdminUsers::getChildrens($user_id);
+            } elseif ($request->type == 'direct') {
+                $user_list = [$user_id];
+            } elseif ($request->type == 'saler') {
+                $user_list = AdminUsers::getChildrensNotSelf($user_id);
+            }
+
+            // 只查看该用户的佣金记录
+            $page->withRelations(['order_yjrecord' => function ($model) use ($user_id) {
+                $model->where('user_id', $user_id)->select([
+                    'order_no',
+                    'user_id',
+                    'user_yj'
+                ]);
+            }]);
+
+            $page->before(function ($query) use ($request, $user_list, $user_id) {
+                $query->select(Orders::$selectFields)
+                    ->whereHas('order_yjrecord', function ($query) use ($user_id) {
+                        $query->where('user_id', $user_id);
+                    })
+                    ->whereIn('user_id', $user_list);
+                return $this->whens($query, $request);
+            });
+        }
+
+        $result = $page->paginate();
+
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {
+        $request->validate([
+            'created_at_start' => 'required',
+            'created_at_end' => 'required',
+        ]);
+
+        sys_log($request, '订单导出', '号卡订单管理');
+        $user_id = $request->user()->id;
+        $query = Orders::select(Orders::$selectFields);
+        
+        if (AdminUsers::isAdmin($user_id)) {
+            $query->with(['order_yjrecord']);
+            $query = $this->whens($query, $request);
+        } else {
+            $request->validate([
+                'type' => 'required|in:all,direct,saler',
+            ]);
+
+            // 按照type获取用户列表
+            if ($request->type == 'all') {
+                $user_list = AdminUsers::getChildrens($user_id);
+            } elseif ($request->type == 'direct') {
+                $user_list = [$user_id];
+            } elseif ($request->type == 'saler') {
+                $user_list = AdminUsers::getChildrensNotSelf($user_id);
+            }
+
+            // 只查看该用户的佣金记录
+            $query->with(['order_yjrecord' => function ($model) use ($user_id) {
+                $model->where('user_id', $user_id)->select([
+                    'order_no',
+                    'user_id',
+                    'user_yj'
+                ]);
+            }])->whereHas('order_yjrecord', function ($query) use ($user_id) {
+                $query->where('user_id', $user_id);
+            })
+            ->whereIn('user_id', $user_list);
+        }
+
+        $query->orderBy('created_at', 'desc');
+        $header = [
+            '订单号' => 'order_no',
+            '订单状态' => 'open_status',
+            '开卡回文' => 'open_message',
+            '身份证姓名' => 'id_card_name',
+            '身份证号' => 'id_card',
+            '开卡号码' => 'phonenum',
+            '收件人' => 'contact',
+            '收件电话' => 'mobile',
+            '收件地址' => 'express_address',
+            '物流单号' => 'express_no',
+            '物流公司' => 'express_name',
+            '身份证正面图' => 'idcard_front',
+            '身份证反面图' => 'idcard_back',
+            '手持身份证图' => 'user_with_idcard',
+            '套餐id' => 'package_id',
+            '外部订单号' => 'bus_order_id',
+            '外部产品id' => 'out_package_id',
+            '套餐名称' => 'package_name',
+            '激活状态' => 'active_status',
+            '激活时间' => 'active_time',
+            '来源' => 'src',
+            '结算状态' => 'sett_status',
+            '结算时间' => 'sett_time',
+            '套餐封面图' => 'package_cover_img',
+            '运营商id' => 'operator_id',
+            '分销者等级' => 'level',
+            '运营商单号' => 'api_order_no',
+            '首冲状态' => 'first_charge_status',
+            '首充时间' => 'first_charge_time',
+            '首充金额' => 'first_charge_amount',
+            '供货商id' => 'supplier_id',
+            '用户id' => 'user_id',
+            '佣金' => 'order_yjrecord.0.user_yj',
+        ];
+        $getEnValue = $this->getEnValue();
+
+        $excel = new SpoutExport($header);
+        $excel->setQuery($query);
+        $result = $excel->setEnum($getEnValue)
+            ->setProcessStyle()
+            ->spoutToExcel('号卡订单');
+        return $result ? success($result['url']) : error();
+    }
+
+    // 导入
+    public function import(Request $request)
+    {
+        $header = [
+            '订单号' => 'order_no',
+            '订单状态 0待开卡 1开卡中 2开卡成功 3开卡失败' => 'open_status',
+            '开卡回文' => 'open_message',
+            '身份证姓名' => 'id_card_name',
+            '身份证号' => 'id_card',
+            '开卡号码' => 'phonenum',
+            '收件人' => 'contact',
+            '收件电话' => 'mobile',
+            '收件地址' => 'express_address',
+            '物流单号' => 'express_no',
+            '物流公司' => 'express_name',
+            '身份证正面图' => 'idcard_front',
+            '身份证反面图' => 'idcard_back',
+            '手持身份证图' => 'user_with_idcard',
+            '套餐id' => 'package_id',
+            '外部订单号' => 'bus_order_id',
+            '外部产品id' => 'out_package_id',
+            '套餐名称' => 'package_name',
+            '激活状态' => 'active_status',
+            '激活时间' => 'active_time',
+            '来源,0落地页,1小程序' => 'src',
+            '祖级' => 'ppid',
+            '结算状态' => 'sett_status',
+            '结算时间' => 'sett_time',
+            '套餐封面图' => 'package_cover_img',
+            '分享方式 1:落地页 2:小店' => 'share_type',
+            '运营商id' => 'operator_id',
+            '代理ID' => 'agent_pro_id',
+            '分销者等级 0:合伙人 1:一级代理 2:二级代理 3:三级代理' => 'level',
+            '抖音Uid' => 'dy_uid',
+            '运营商单号' => 'api_order_no',
+            '是否选号' => 'select_status',
+            '是否直接提交给局方' => 'direct_send_status',
+            '是否校验' => 'is_valid',
+            '前置校验编码' => 'valid_req_code',
+            '首冲状态' => 'first_charge_status',
+            '首充时间' => 'first_charge_time',
+            '首充金额' => 'first_charge_amount',
+            '是否接口佣金 0否 1是' => 'is_api_yj',
+            '同步局方状态 0:未同步 1:已同步' => 'api_sync',
+            '同步集客仓状态 0:未同步 1:已同步' => 'jkc_sync',
+            '订单类型  0号卡,1宽带   整型' => 'order_type',
+            '供货商id' => 'supplier_id',
+            '校验' => 'api_valid',
+            '意向单token' => 'intercept_msg',
+            '用户id' => 'user_id',
+        ];
+        $getEnValue = $this->getEnValue();
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+            'open_status' =>  Orders::$openStatus,
+            'sett_status' =>  Orders::$settStatus,
+            'first_charge_status' =>  Orders::$firstChargeStatus,
+            'active_status' =>  Orders::$activeStatus,
+            'src' =>  Orders::$src,
+            'operator_id' =>  Orders::$operatorId,
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $result = [];
+        if($request->has('id')){
+            $result = Orders::with(['order_yjrecord'])->where(['id' => $request->id])->select(Orders::$selectFields)->first();
+        }
+
+        if($request->has('order_no')){
+            $result = Orders::with(['order_yjrecord'])->where(['order_no' => $request->order_no])->select(Orders::$selectFields)->first();
+        }
+        
+        return success($result);
+    }
+
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            'name' => 'required',
+        ]);
+        $result = Orders::create($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        $result = Orders::where(['id' => $request->id])->update($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",", $id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = Orders::whereIn('id', $arr)->delete();
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 号卡订单提交
+    public function hkOrderSubmit(Request $request)
+    {
+        $request->validate([
+            'encrypted_data' => 'required',
+            'encrypted_key' => 'required',
+            'iv' => 'required',
+        ]);
+
+        $encrypted_data = $request['encrypted_data'];
+        $encrypted_key = $request['encrypted_key'];
+        $iv = $request['iv'];
+
+        $request = UtilsHelper::aesRsaDecrypt($encrypted_data, $encrypted_key, $iv);
+        if ($request) {
+            Log::info("号卡提单解密", [$request]);
+        } else {
+            Log::error("号卡提单解密失败:" . $iv);
+            return ['code' => 0, 'msg' => "解密失败"];
+        }
+
+        $request['src'] = Orders::SRC_LODDING;
+        return $this->orderSubmit($request);
+    }
+
+    // 提单逻辑
+    public function orderSubmit(array $request)
+    {
+        $validate = Validator::make($request, [
+            'user_key' => 'required',
+            'package_key' => 'required',
+            'id_card_name' => 'required',
+            'id_card' => 'required',
+            'express_address' => 'required|max:200',
+            'mobile' => 'required',
+            'contact' => 'required|max:15',
+        ]);
+
+        if ($validate->fails()) {
+            return response()->json(['code' => 0, 'msg' => '信息异常'], 400);
+        }
+
+        $user_key = Hashids::decode($request['user_key']);
+        if (empty($user_key)) {
+            return response()->json(['code' => 0, 'msg' => '用户信息异常'], 400);
+        }
+
+        $package_key = Hashids::decode($request['package_key']);
+        if (empty($package_key)) {
+            return response()->json(['code' => 0, 'msg' => '套餐信息异常'], 400);
+        }
+
+        $request['user_id'] = $user_key[0];
+        $request['package_id'] = $package_key[0];
+
+        $request['order_no'] = UtilsHelper::order_id();
+
+        $order_no = UtilsHelper::order_id();
+        $user_id = $request['user_id'];
+        $id_card_name = $request['id_card_name'];
+        $id_card = $request['id_card'];
+        $express_address = $request['express_address'];
+        $mobile = $request['mobile'];
+        $contact = $request['contact'];
+        $package_id = $request['package_id'];
+        $idcard_front = $request['idcard_front'] ?? null; //身份证正面
+        $idcard_back = $request['idcard_back'] ?? null; //身份证反面
+        $user_with_idcard = $request['user_with_idcard'] ?? null; //手持身份证照
+        $src = $request['src'] ?? Orders::SRC_LODDING;;
+        $bus_order_id = $request['bus_order_id'] ?? null;
+
+        $cacheKey = "order_put_" . $mobile;
+        if (!Cache::add($cacheKey, 1, 5)) {
+            return response()->json(['code' => 0, 'msg' => '请勿频繁请求'], 400);
+        }
+
+        // 检查订单
+        $orders = Orders::where([
+            'package_id' => $package_id,
+            'id_card_name' => $id_card_name,
+            'id_card' => $id_card,
+            'mobile' => $mobile,
+        ])->where('open_status', "!=", Orders::OPEN_STATUS_FAIL)->exists();
+        if ($orders) return response()->json(['code' => 0, 'msg' => "该身份证已下过该套餐"], 400);
+
+        list($status, $msg, $userYjRecord) = $this->orderCommission($user_id, $package_id, $order_no);
+        if (!$status) return response()->json(['code' => 0, 'msg' => $msg], 400);
+
+        $packageInfo = Packages::select(['id', 'name', 'yj', 'out_package_id','cover_img'])->where('id', $package_id)->first();
+        $userInfo = AdminUsers::select(['id', 'name', 'mobile', 'agent_level'])->where('id', $user_id)->first();
+        DB::beginTransaction();
+        try {
+            // 创建订单
+            $orderData = [
+                'user_id' => $user_id,
+                'package_id' => $package_id,
+                'order_no' => $order_no,
+                'express_address' => $express_address,
+                'mobile' => $mobile,
+                'contact' => $contact,
+                'id_card_name' => $id_card_name,
+                'id_card' => $id_card,
+                'idcard_front' => $idcard_front ?? null,
+                'idcard_back' => $idcard_back,
+                'user_with_idcard' => $user_with_idcard,
+                'open_status' => Orders::OPEN_STATUS_WAIT,
+                'original_yj' => $packageInfo->yj,
+                'package_name' => $packageInfo->name,
+                'out_package_id' => $packageInfo->out_package_id,
+                'src' => $src,
+                'bus_order_id' => $bus_order_id,
+                'level' => $userInfo->agent_level,
+                'package_cover_img' => $packageInfo->cover_img,
+            ];
+            Orders::create($orderData);
+
+            // 记录佣金记录
+            HkOrderYjrecord::insert($userYjRecord);
+
+            DB::commit();
+
+            return response()->json(['code' => 1, 'msg' => "下单成功"], 200);
+        } catch (\Throwable $th) {
+            DB::rollBack();
+            Log::error("下单失败 $mobile :" . $th);
+            return response()->json(['code' => 0, 'msg' => "下单失败"], 400);
+        }
+    }
+
+    // 查单逻辑
+    public function orderQuery($orderInfo, array $selectFields = [])
+    {
+        $order_no = $orderInfo['order_no'] ?? null;
+        $bus_order_id = $orderInfo['distributor_order_no'] ?? null;
+        $user_id = Hashids::decode($orderInfo['user_key'])[0] ?? null;
+
+        if (empty($order_no) && empty($bus_order_id)) return response()->json(['code' => 0, 'msg' => "订单号和平台单号不能同时为空"], 400);
+        if (empty($user_id)) return response()->json(['code' => 0, 'msg' => "用户信息异常"], 400);
+
+        if ($order_no) {
+            $result = Orders::select(empty($selectFields) ? Orders::$selectFields : $selectFields)->where('order_no', $order_no)->where('user_id', $user_id)->first();
+            return response()->json(['code' => 1, 'msg' => "查单成功", 'data' => $result], 200);
+        }
+
+        if ($bus_order_id) {
+            $result = Orders::select(empty($selectFields) ? Orders::$selectFields : $selectFields)->where('bus_order_id', $bus_order_id)->where('user_id', $user_id)->first();
+            return response()->json(['code' => 1, 'msg' => "查单成功", 'data' => $result], 200);
+        }
+
+        return response()->json(['code' => 0, 'msg' => "未查询到订单信息"], 400);
+    }
+
+    // 计算订单佣金
+    public function orderCommission($user_id, $package_id, $order_no)
+    {
+        $yj = (string)Packages::where('id', $package_id)->where('is_upload', 1)->value('yj');
+        if (empty($yj)) return [false, '套餐已下架 ' . $package_id, []];
+        $original_yj = $yj; // 原始佣金
+        $created_at = now(); // 下单时间
+
+        $userInfo = AdminUsers::select(['id', 'yj_type', 'yj_a', 'yj_p', 'parent_id', 'agent_level', 'member_level_id'])->with(['member_level'])->where('id', $user_id)->first();
+        // 获取父用户的佣金信息
+        $parentList = AdminUsers::getParents($user_id);
+        $parentYjType = AdminUsers::with(['agent_package'])
+            ->select(['id', 'yj_type', 'yj_a', 'yj_p', 'parent_id', 'agent_level'])
+            ->whereIn('id', $parentList)
+            ->orderBy('agent_level', 'ASC')
+            ->get()
+            ->keyBy('agent_level'); // 重置索引为用户id
+
+        $orderYjRecord = []; // 订单佣金记录
+
+        // 遍历所有上级用户
+        foreach ($parentYjType as $user) {
+            $now_user = $parentYjType[$user->agent_level]; // 当前用户
+            $next_user = $parentYjType[$now_user->agent_level + 1] ?? 0;  // 下级用户
+
+            $level_diff = $parentYjType[$userInfo->agent_level]->agent_level - ($now_user->agent_level ?? 0);  // 计算层级差值
+
+            if (empty($next_user) && $now_user->id == end($parentList)) {
+                // 订单所属用户
+                if (empty($userInfo->member_level)) {
+                    $royalty_yj = 0;
+                } else {
+                    // $royalty_yj = $userInfo->member_level->royalty_yj ?? 0; //头衔提成
+                    $royalty_yj = PackageMemberLevelRoyalty::where('package_id',$package_id)->where('member_level_id', $userInfo->member_level_id)->value('royalty_yj') ?? 0; //头衔提成
+                }
+
+                $record = [
+                    'order_no' => $order_no,
+                    'user_id' => $now_user->id,
+                    'from_user_id' => $user_id,
+                    'original_yj' => $original_yj,
+                    'parent_id' => $now_user->parent_id ?? 0,
+                    'user_yj' => $yj,
+                    'level_diff' => $level_diff,
+                    'yj_type' => 0,
+                    'yj_p' => 0,
+                    'yj_a' => 0,
+                    'created_at' => $created_at,
+                    'royalty_yj' => $royalty_yj, //头衔提成
+                ];
+                $orderYjRecord[] = $record;
+                break;
+            }
+
+            $yj_type = $next_user->yj_type ?? 0;  // 佣金类型
+            $yj_p = (string)($next_user->yj_p ?? 0);  // 百分比
+            $yj_a = (string)($next_user->yj_a ?? 0);  // 固定金额
+
+            $agent_package = $next_user->agent_package->keyBy('package_id');  // 提前获取代理包裹数据并按package_id索引
+
+            // 获取单品抽成
+            if (isset($agent_package[$package_id]) && $agent_package[$package_id]['yj_type'] != 0) {
+                $package_info = $agent_package[$package_id];
+                $yj_type = $package_info['yj_type'];  // 佣金类型
+                $yj_p = (string)$package_info['yj_p'];  // 百分比
+                $yj_a = (string)$package_info['yj_a'];  // 固定金额
+            }
+
+            // 根据佣金类型进行计算
+            if ($yj_type == 1) {  // 百分比计算
+                $yj_p = bcdiv($yj_p, 100, 2);  // 百分比转化为小数
+                $parent_yj = bcmul($yj, $yj_p, 2);  // 计算父级佣金
+                $yj = bcsub($yj, $parent_yj, 2);  // 计算佣金
+            } elseif ($yj_type == 2) {  // 固定金额计算
+                $parent_yj = $yj_a;  // 父级佣金
+                $yj = bcsub($yj, $parent_yj, 2);  // 计算佣金
+            }
+
+            // 如果佣金小于0,则设置为0
+            if (bccomp($yj, '0', 2) < 0) {
+                $yj = '0';  // 设置为 0
+            }
+
+            $record = [
+                'order_no' => $order_no,
+                'user_id' => $now_user->id,
+                'from_user_id' => $user_id,
+                'original_yj' => $original_yj,
+                'parent_id' => $now_user->parent_id ?? 0,
+                'user_yj' => $parent_yj,
+                'level_diff' => $level_diff,
+                'yj_type' => $yj_type,
+                'yj_p' => $yj_p,
+                'yj_a' => $yj_a,
+                'created_at' => $created_at,
+                'royalty_yj' => 0, //头衔提成
+            ];
+
+            $orderYjRecord[] = $record; // 记录佣金记录
+        }
+
+        return [true, 'success', $orderYjRecord];
+    }
+
+    // 订单结算逻辑
+    public function hkOrderSettlement($order_no)
+    {
+        if (empty($order_no)) return [false, '订单号不能为空', []];
+
+        $order = Orders::select([
+            'id',
+            'user_id',
+            'order_no',
+            'sett_status',
+            'package_id',
+        ])
+            ->with(['order_yjrecord'])
+            ->where('order_no', $order_no)->first();
+
+        if (empty($order)) return [false, '订单不存在', []];
+
+        // if ($order->sett_status == 1) return [false, '订单已结算', []];
+
+        if (empty($order->order_yjrecord)) return [false, '订单佣金记录不存在', []];
+
+        DB::beginTransaction();
+        try {
+            foreach ($order->order_yjrecord as $value) {
+                // 计算佣金
+                if($value['user_id'] == $value['from_user_id']){
+                    $type = UserYjrecord::TYPE_DIRECT;
+                }else{
+                    $type = UserYjrecord::TYPE_DISTRIBUTION;
+                }
+                list($status, $msg, $data) = (new UserYjrecord())->recharge([
+                    'user_id' => $value['user_id'],
+                    'order_no' => $value['order_no'],
+                    'status' => UserYjrecord::STATUS_ADD,
+                    'type' => $type,
+                    'source' => '号卡订单结算',
+                    'yj' => $value['user_yj'],
+                    'order_yj' => $value['original_yj'],
+                ]);
+                if (!$status) {
+                    DB::rollBack();
+                    return [false, $msg, []];
+                }
+
+                // 计算头衔提成
+                if ($value['royalty_yj'] > 0) {
+                    list($status, $msg, $data) = (new UserYjrecord())->recharge([
+                        'user_id' => $value['user_id'],
+                        'order_no' => $value['order_no'],
+                        'status' => UserYjrecord::STATUS_ADD,
+                        'type' => UserYjrecord::TYPE_ROYALTY,
+                        'source' => '号卡订单结算',
+                        'yj' => $value['royalty_yj'],
+                        'order_yj' => $value['original_yj'],
+                    ]);
+                    if (!$status) {
+                        DB::rollBack();
+                        return [false, $msg, []];
+                    }
+                }
+            }
+
+            Orders::where('order_no', $order_no)->update(['sett_status' => 1, 'sett_time' => now()]);
+            DB::commit();
+            return [true, 'success', []];
+        } catch (\Throwable $th) {
+            DB::rollBack();
+            return [false, $th->getMessage(), []];
+        }
+    }
+
+    // 批量结算
+    public function batchOrderSettle($id)
+    {
+        $OrderSettRecordInfo = OrderSettRecord::find($id);
+        $OrderSettRecordInfo->update(['status' => 1]);
+
+        if (empty($OrderSettRecordInfo)) {
+            $OrderSettRecordInfo->update(['status' => 3]);
+            return [false, '结算记录不存在', []];
+        }
+
+        if (empty($OrderSettRecordInfo->put_file)) {
+            $OrderSettRecordInfo->update(['status' => 3]);
+            return [false, '结算文件不存在', []];
+        }
+
+        $put_file = public_path($OrderSettRecordInfo->put_file);
+        if (!file_exists($put_file)) {
+            $OrderSettRecordInfo->update(['status' => 3]);
+            return [false, '结算文件不存在', []];
+        }
+
+        // 读取表格信息
+        $SpoutImport = new SpoutImport([]);
+        $dataList = $SpoutImport->setFilePath($put_file)->getExcelData();
+        if (empty($dataList)) {
+            $OrderSettRecordInfo->update(['status' => 3]);
+            return [false, '结算文件内容为空', []];
+        }
+
+        try {
+            $header = $SpoutImport->getFirstRowContent();
+            $header[] = "执行结果";
+
+            foreach ($dataList as &$value) {
+                list($status, $msg, $data) = $this->hkOrderSettlement($value[0]);
+                if ($status) {
+                    $value[] = "执行成功";
+                } else {
+                    $value[] = "执行失败:" . $msg;
+                }
+            }
+
+            // 导出执行结果
+            $SpoutImport = new SpoutExport($header);
+            list($status, $msg, $result) = $SpoutImport
+                ->setData($dataList)
+                ->setProcessStyle()
+                ->arrayToExcel("sttle_out_" . uniqid() . '_' . time(), public_path('csv/batch_order_settle/out/'));
+
+            if ($status) {
+                $OrderSettRecordInfo->update(['out_file' => $result['path'], 'status' => 2]);
+            } else {
+                $OrderSettRecordInfo->update(['status' => 3, 'remark' => $msg]);
+            }
+        } catch (\Throwable $th) {
+            $OrderSettRecordInfo->update(['status' => 3, 'remark' => $th->getMessage()]);
+        }
+    }
+
+    // 手机号订单查询
+    public function hkOrderQuery(Request $request)
+    {
+        $request->validate([
+            'mobile' => 'required',
+        ]);
+        $mobile = $request->input('mobile'); 
+        $order = Orders::select([
+            'order_no',
+            'open_status',
+            'id_card_name',
+            'id_card',
+            'phonenum',
+            'contact',
+            'mobile',
+            'express_address',
+            'created_at',
+            'package_name',
+            'active_status',
+            'open_status',
+            'package_cover_img',
+        ])
+        ->when($request->filled('open_status'), fn ($q) => $q->where('open_status', $request->open_status))
+        ->where('mobile', $mobile);
+
+        $pages = new Pages($request, $order);
+
+        return $pages->paginate();
+    }
+
+}

+ 744 - 0
app/DataApiNew/Helper/OrdersKdHelper.php

@@ -0,0 +1,744 @@
+<?php
+/*
+ * @Description: 宽带订单管理
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-27 14:00:58
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-27 14:00:58
+ */
+
+namespace App\DataApiNew\Helper;
+
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use App\DataApiNew\Models\OrdersKd as Orders;
+use App\DataApiNew\Models\AdminUsers;
+use App\DataApiNew\Models\KdOrderYjrecord;
+use App\DataApiNew\Models\OrderSettRecord;
+use App\DataApiNew\Models\UserYjrecord;
+use App\DataApiNew\Models\PackagesKd as Packages;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Redis;
+use Illuminate\Support\Facades\Validator;
+use Vinkla\Hashids\Facades\Hashids;
+
+class OrdersKdHelper
+{
+    // 查询条件
+    public function whens($query, $request)
+    {
+        return $query
+            ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id))
+            ->when($request->filled('order_no'), fn ($q) => $q->where('order_no', $request->order_no))
+            ->when($request->filled('bus_order_id'), fn ($q) => $q->where('bus_order_id', $request->bus_order_id))
+            ->when($request->filled('package_name'), fn ($q) => $q->where('package_name', 'like', "%$request->package_name%"))
+            ->when($request->has('open_status'), fn ($q) => $q->where('open_status', $request->open_status))
+            ->when($request->filled('operator_id'), fn ($q) => $q->where('operator_id', $request->operator_id))
+            ->when($request->filled('id_card_name'), fn ($q) => $q->where('id_card_name', 'like', "%$request->id_card_name%"))
+            ->when($request->filled('id_card'), fn ($q) => $q->where('id_card', $request->id_card))
+            ->when($request->filled('mobile'), fn ($q) => $q->where('mobile', $request->mobile))
+            ->when($request->filled('express_no'), fn ($q) => $q->where('express_no', $request->express_no))
+            ->when($request->filled('open_message'), fn ($q) => $q->where('open_message', $request->open_message))
+            ->when($request->filled('created_at_start'), fn ($q) => $q->where('created_at', '>=', $request->created_at_start))
+            ->when($request->filled('created_at_end'), fn ($q) => $q->where('created_at', '<=', $request->created_at_end))
+            ->when($request->filled('sett_time_start'), fn ($q) => $q->where('sett_time', '>=', $request->sett_time_start))
+            ->when($request->filled('sett_time_end'), fn ($q) => $q->where('sett_time', '<=', $request->sett_time_end));
+    }
+
+    // 查询列表
+    public function select(Request $request)
+    {
+        $user_id = $request->user()->id;
+
+        $page = new Pages($request, Orders::query());
+
+        if (AdminUsers::isAdmin($user_id)) {
+            // admin 查看全部
+            $page->withRelations(['order_yjrecord']);
+
+            $page->before(function ($query) use ($request) {
+                $query->select(Orders::$selectFields);
+                return $this->whens($query, $request);
+            });
+        } else {
+            $request->validate([
+                'type' => 'required|in:all,direct,saler',
+            ]);
+
+            // 按照type获取用户列表
+            if ($request->type == 'all') {
+                $user_list = AdminUsers::getChildrens($user_id);
+            } elseif ($request->type == 'direct') {
+                $user_list = [$user_id];
+            } elseif ($request->type == 'saler') {
+                $user_list = AdminUsers::getChildrensNotSelf($user_id);
+            }
+
+            // 只查看该用户的佣金记录
+            $page->withRelations(['order_yjrecord' => function ($model) use ($user_id) {
+                $model->where('user_id', $user_id)->select([
+                    'order_no',
+                    'user_id',
+                    'user_yj'
+                ]);
+            }]);
+
+            $page->before(function ($query) use ($request, $user_list, $user_id) {
+                $query->select(Orders::$selectFields)
+                    ->whereHas('order_yjrecord', function ($query) use ($user_id) {
+                        $query->where('user_id', $user_id);
+                    })
+                    ->whereIn('user_id', $user_list);
+                return $this->whens($query, $request);
+            });
+        }
+
+        $result = $page->paginate();
+
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {
+        $request->validate([
+            'created_at_start' => 'required',
+            'created_at_end' => 'required',
+        ]);
+
+        sys_log($request, '订单导出', '宽带订单管理');
+        $user_id = $request->user()->id;
+        $query = Orders::select(Orders::$selectFields);
+        
+        if (AdminUsers::isAdmin($user_id)) {
+            $query->with(['order_yjrecord']);
+            $query = $this->whens($query, $request);
+        } else {
+            $request->validate([
+                'type' => 'required|in:all,direct,saler',
+            ]);
+
+            // 按照type获取用户列表
+            if ($request->type == 'all') {
+                $user_list = AdminUsers::getChildrens($user_id);
+            } elseif ($request->type == 'direct') {
+                $user_list = [$user_id];
+            } elseif ($request->type == 'saler') {
+                $user_list = AdminUsers::getChildrensNotSelf($user_id);
+            }
+
+            // 只查看该用户的佣金记录
+            $query->with(['order_yjrecord' => function ($model) use ($user_id) {
+                $model->where('user_id', $user_id)->select([
+                    'order_no',
+                    'user_id',
+                    'user_yj'
+                ]);
+            }])->whereHas('order_yjrecord', function ($query) use ($user_id) {
+                $query->where('user_id', $user_id);
+            })
+            ->whereIn('user_id', $user_list);
+        }
+
+        $query->orderBy('created_at', 'desc');
+        $header = [
+            '订单号' => 'order_no',
+            '订单状态' => 'open_status',
+            '开卡回文' => 'open_message',
+            '身份证姓名' => 'id_card_name',
+            '身份证号' => 'id_card',
+            '开卡号码' => 'phonenum',
+            '收件人' => 'contact',
+            '收件电话' => 'mobile',
+            '收件地址' => 'express_address',
+            '物流单号' => 'express_no',
+            '物流公司' => 'express_name',
+            '身份证正面图' => 'idcard_front',
+            '身份证反面图' => 'idcard_back',
+            '手持身份证图' => 'user_with_idcard',
+            '套餐id' => 'package_id',
+            '外部订单号' => 'bus_order_id',
+            '外部产品id' => 'out_package_id',
+            '套餐名称' => 'package_name',
+            '激活状态' => 'active_status',
+            '激活时间' => 'active_time',
+            '来源' => 'src',
+            '结算状态' => 'sett_status',
+            '结算时间' => 'sett_time',
+            '套餐封面图' => 'package_cover_img',
+            '运营商id' => 'operator_id',
+            '分销者等级' => 'level',
+            '运营商单号' => 'api_order_no',
+            '首冲状态' => 'first_charge_status',
+            '首充时间' => 'first_charge_time',
+            '首充金额' => 'first_charge_amount',
+            '供货商id' => 'supplier_id',
+            '用户id' => 'user_id',
+            '佣金' => 'order_yjrecord.0.user_yj',
+        ];
+        $getEnValue = $this->getEnValue();
+
+        $excel = new SpoutExport($header);
+        $excel->setQuery($query);
+        $result = $excel->setEnum($getEnValue)
+            ->setProcessStyle()
+            ->spoutToExcel('宽带订单');
+        return $result ? success($result['url']) : error();
+    }
+
+    // 导入
+    public function import(Request $request)
+    {
+        $header = [
+            '订单号' => 'order_no',
+            '订单状态 0待开卡 1开卡中 2开卡成功 3开卡失败' => 'open_status',
+            '开卡回文' => 'open_message',
+            '身份证姓名' => 'id_card_name',
+            '身份证号' => 'id_card',
+            '开卡号码' => 'phonenum',
+            '收件人' => 'contact',
+            '收件电话' => 'mobile',
+            '收件地址' => 'express_address',
+            '物流单号' => 'express_no',
+            '物流公司' => 'express_name',
+            '身份证正面图' => 'idcard_front',
+            '身份证反面图' => 'idcard_back',
+            '手持身份证图' => 'user_with_idcard',
+            '套餐id' => 'package_id',
+            '外部订单号' => 'bus_order_id',
+            '外部产品id' => 'out_package_id',
+            '套餐名称' => 'package_name',
+            '激活状态' => 'active_status',
+            '激活时间' => 'active_time',
+            '来源,0落地页,1小程序' => 'src',
+            '祖级' => 'ppid',
+            '结算状态' => 'sett_status',
+            '结算时间' => 'sett_time',
+            '套餐封面图' => 'package_cover_img',
+            '分享方式 1:落地页 2:小店' => 'share_type',
+            '运营商id' => 'operator_id',
+            '代理ID' => 'agent_pro_id',
+            '分销者等级 0:合伙人 1:一级代理 2:二级代理 3:三级代理' => 'level',
+            '抖音Uid' => 'dy_uid',
+            '运营商单号' => 'api_order_no',
+            '是否选号' => 'select_status',
+            '是否直接提交给局方' => 'direct_send_status',
+            '是否校验' => 'is_valid',
+            '前置校验编码' => 'valid_req_code',
+            '首冲状态' => 'first_charge_status',
+            '首充时间' => 'first_charge_time',
+            '首充金额' => 'first_charge_amount',
+            '是否接口佣金 0否 1是' => 'is_api_yj',
+            '同步局方状态 0:未同步 1:已同步' => 'api_sync',
+            '同步集客仓状态 0:未同步 1:已同步' => 'jkc_sync',
+            '订单类型  0号卡,1宽带   整型' => 'order_type',
+            '供货商id' => 'supplier_id',
+            '校验' => 'api_valid',
+            '意向单token' => 'intercept_msg',
+            '用户id' => 'user_id',
+        ];
+        $getEnValue = $this->getEnValue();
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+            'open_status' =>  Orders::$openStatus,
+            'sett_status' =>  Orders::$settStatus,
+            'first_charge_status' =>  Orders::$firstChargeStatus,
+            'active_status' =>  Orders::$activeStatus,
+            'src' =>  Orders::$src,
+            'operator_id' =>  Orders::$operatorId,
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = Orders::where(['id' => $request->id])->select(Orders::$selectFields)->first();
+        return success($result);
+    }
+
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            'id_card_name' => 'required',
+            'id_card' => 'required|max:18',
+            'mobile' => 'required|max:11',
+        ]);
+        
+        $result = Orders::create($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        $result = Orders::where(['id' => $request->id])->update($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",", $id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = Orders::whereIn('id', $arr)->delete();
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 宽带订单提交
+    public function kdOrderSubmit(Request $request)
+    {
+        $request->validate([
+            'encrypted_data' => 'required',
+            'encrypted_key' => 'required',
+            'iv' => 'required',
+        ]);
+
+        $encrypted_data = $request['encrypted_data'];
+        $encrypted_key = $request['encrypted_key'];
+        $iv = $request['iv'];
+
+        $request = UtilsHelper::aesRsaDecrypt($encrypted_data, $encrypted_key, $iv);
+        if ($request) {
+            Log::info("号卡提单解密", [$request]);
+        } else {
+            Log::error("号卡提单解密失败:" . $iv);
+            return ['code' => 0, 'msg' => "解密失败"];
+        }
+
+        $request['src'] = Orders::SRC_LODDING;
+        return $this->orderSubmit($request);
+    }
+
+    // 提单逻辑
+    public function orderSubmit(array $request)
+    {
+        $validate = Validator::make($request, [
+            'user_key' => 'required',
+            'package_key' => 'required',
+            'id_card_name' => 'required',
+            'id_card' => 'required',
+            'express_address' => 'required|max:200',
+            'mobile' => 'required',
+            'contact' => 'required|max:15',
+        ]);
+
+        if ($validate->fails()) {
+            return response()->json(['code' => 0, 'msg' => '信息异常'], 400);
+        }
+
+        $user_key = Hashids::decode($request['user_key']);
+        if (empty($user_key)) {
+            return response()->json(['code' => 0, 'msg' => '用户信息异常'], 400);
+        }
+
+        $package_key = Hashids::decode($request['package_key']);
+        if (empty($package_key)) {
+            return response()->json(['code' => 0, 'msg' => '套餐信息异常'], 400);
+        }
+
+        $request['user_id'] = $user_key[0];
+        $request['package_id'] = $package_key[0];
+
+        $request['order_no'] = UtilsHelper::order_id();
+
+        $order_no = UtilsHelper::order_id();
+        $user_id = $request['user_id'];
+        $id_card_name = $request['id_card_name'];
+        $id_card = $request['id_card'];
+        $express_address = $request['express_address'];
+        $mobile = $request['mobile'];
+        $contact = $request['contact'];
+        $package_id = $request['package_id'];
+        $idcard_front = $request['idcard_front'] ?? null; //身份证正面
+        $idcard_back = $request['idcard_back'] ?? null; //身份证反面
+        $user_with_idcard = $request['user_with_idcard'] ?? null; //手持身份证照
+        $src = $request['src'] ?? Orders::SRC_LODDING;;
+        $bus_order_id = $request['bus_order_id'] ?? null;
+
+        $cacheKey = "order_put_" . $mobile;
+        if (!Cache::add($cacheKey, 1, 5)) {
+            return response()->json(['code' => 0, 'msg' => '请勿频繁请求'], 400);
+        }
+
+        // 检查订单
+        $orders = Orders::where([
+            'package_id' => $package_id,
+            'id_card_name' => $id_card_name,
+            'id_card' => $id_card,
+            'mobile' => $mobile,
+        ])->where('open_status', "!=", 3)->exists();
+        if ($orders) return response()->json(['code' => 0, 'msg' => "该身份证已下过该套餐"], 400);
+
+        list($status, $msg, $userYjRecord) = $this->orderCommission($user_id, $package_id, $order_no);
+        if (!$status) return response()->json(['code' => 0, 'msg' => $msg], 400);
+
+        $packageInfo = Packages::select(['id', 'name', 'yj', 'out_package_id','cover_img'])->where('id', $package_id)->first();
+        $userInfo = AdminUsers::select(['id', 'name', 'mobile', 'agent_level'])->where('id', $user_id)->first();
+        DB::beginTransaction();
+        try {
+            // 创建订单
+            $orderData = [
+                'user_id' => $user_id,
+                'package_id' => $package_id,
+                'order_no' => $order_no,
+                'express_address' => $express_address,
+                'mobile' => $mobile,
+                'contact' => $contact,
+                'id_card_name' => $id_card_name,
+                'id_card' => $id_card,
+                'idcard_front' => $idcard_front ?? null,
+                'idcard_back' => $idcard_back,
+                'user_with_idcard' => $user_with_idcard,
+                'open_status' => Orders::OPEN_STATUS_WAIT,
+                'original_yj' => $packageInfo->yj,
+                'package_name' => $packageInfo->name,
+                'out_package_id' => $packageInfo->out_package_id,
+                'src' => $src,
+                'bus_order_id' => $bus_order_id,
+                'level' => $userInfo->agent_level,
+                'package_cover_img' => $packageInfo->cover_img,
+            ];
+            Orders::create($orderData);
+
+            // 记录佣金记录
+            KdOrderYjrecord::insert($userYjRecord);
+
+            DB::commit();
+
+            return response()->json(['code' => 1, 'msg' => "下单成功"], 200);
+        } catch (\Throwable $th) {
+            DB::rollBack();
+            Log::error("下单失败 $mobile :" . $th);
+            return response()->json(['code' => 0, 'msg' => "下单失败"], 400);
+        }
+    }
+
+    // 查单逻辑
+    public function orderQuery($orderInfo, array $selectFields = [])
+    {
+        $order_no = $orderInfo['order_no'] ?? null;
+        $bus_order_id = $orderInfo['distributor_order_no'] ?? null;
+        $user_id = Hashids::decode($orderInfo['user_key'])[0] ?? null;
+
+        if (empty($order_no) && empty($bus_order_id)) return response()->json(['code' => 0, 'msg' => "订单号和平台单号不能同时为空"], 400);
+        if (empty($user_id)) return response()->json(['code' => 0, 'msg' => "用户信息异常"], 400);
+
+        if ($order_no) {
+            $result = Orders::select(empty($selectFields) ? Orders::$selectFields : $selectFields)->where('order_no', $order_no)->where('user_id', $user_id)->first();
+            return response()->json(['code' => 1, 'msg' => "查单成功", 'data' => $result], 200);
+        }
+
+        if ($bus_order_id) {
+            $result = Orders::select(empty($selectFields) ? Orders::$selectFields : $selectFields)->where('bus_order_id', $bus_order_id)->where('user_id', $user_id)->first();
+            return response()->json(['code' => 1, 'msg' => "查单成功", 'data' => $result], 200);
+        }
+
+        return response()->json(['code' => 0, 'msg' => "未查询到订单信息"], 400);
+    }
+
+
+    // 计算订单佣金
+    public function orderCommission($user_id, $package_id, $order_no)
+    {
+        $yj = (string)Packages::where('id', $package_id)->where('is_upload', 1)->value('yj');
+        if (empty($yj)) return [false, '套餐已下架 ' . $package_id, []];
+        $original_yj = $yj; // 原始佣金
+        $created_at = now(); // 下单时间
+
+        $userInfo = AdminUsers::select(['id', 'yj_type', 'yj_a', 'yj_p', 'parent_id', 'agent_level', 'member_level_id'])->with(['member_level'])->where('id', $user_id)->first();
+        // 获取父用户的佣金信息
+        $parentList = AdminUsers::getParents($user_id);
+        $parentYjType = AdminUsers::with(['agent_package'])
+            ->select(['id', 'yj_type', 'yj_a', 'yj_p', 'parent_id', 'agent_level'])
+            ->whereIn('id', $parentList)
+            ->orderBy('agent_level', 'ASC')
+            ->get()
+            ->keyBy('agent_level'); // 重置索引为用户id
+
+        $orderYjRecord = []; // 订单佣金记录
+
+        // 遍历所有上级用户
+        foreach ($parentYjType as $user) {
+            $now_user = $parentYjType[$user->agent_level]; // 当前用户
+            $next_user = $parentYjType[$now_user->agent_level + 1] ?? 0;  // 下级用户
+
+            $level_diff = $parentYjType[$userInfo->agent_level]->agent_level - ($now_user->agent_level ?? 0);  // 计算层级差值
+
+            if (empty($next_user) && $now_user->id == end($parentList)) {
+                // 订单所属用户
+                if (empty($userInfo->member_level)) {
+                    $royalty_yj = 0;
+                } else {
+                    $royalty_yj = $userInfo->member_level->royalty_yj ?? 0; //头衔提成
+                }
+
+                $record = [
+                    'order_no' => $order_no,
+                    'user_id' => $now_user->id,
+                    'from_user_id' => $user_id,
+                    'original_yj' => $original_yj,
+                    'parent_id' => $now_user->parent_id ?? 0,
+                    'user_yj' => $yj,
+                    'level_diff' => $level_diff,
+                    'yj_type' => 0,
+                    'yj_p' => 0,
+                    'yj_a' => 0,
+                    'created_at' => $created_at,
+                    'royalty_yj' => $royalty_yj, //头衔提成
+                ];
+                $orderYjRecord[] = $record;
+                break;
+            }
+
+            $yj_type = $next_user->yj_type ?? 0;  // 佣金类型
+            $yj_p = (string)($next_user->yj_p ?? 0);  // 百分比
+            $yj_a = (string)($next_user->yj_a ?? 0);  // 固定金额
+
+            $agent_package = $next_user->agent_package->keyBy('package_id');  // 提前获取代理包裹数据并按package_id索引
+
+            // 获取单品抽成
+            if (isset($agent_package[$package_id]) && $agent_package[$package_id]['yj_type'] != 0) {
+                $package_info = $agent_package[$package_id];
+                $yj_type = $package_info['yj_type'];  // 佣金类型
+                $yj_p = (string)$package_info['yj_p'];  // 百分比
+                $yj_a = (string)$package_info['yj_a'];  // 固定金额
+            }
+
+            // 根据佣金类型进行计算
+            if ($yj_type == 1) {  // 百分比计算
+                $yj_p = bcdiv($yj_p, 100, 2);  // 百分比转化为小数
+                $parent_yj = bcmul($yj, $yj_p, 2);  // 计算父级佣金
+                $yj = bcsub($yj, $parent_yj, 2);  // 计算佣金
+            } elseif ($yj_type == 2) {  // 固定金额计算
+                $parent_yj = $yj_a;  // 父级佣金
+                $yj = bcsub($yj, $parent_yj, 2);  // 计算佣金
+            }
+
+            // 如果佣金小于0,则设置为0
+            if (bccomp($yj, '0', 2) < 0) {
+                $yj = '0';  // 设置为 0
+            }
+
+            $record = [
+                'order_no' => $order_no,
+                'user_id' => $now_user->id,
+                'from_user_id' => $user_id,
+                'original_yj' => $original_yj,
+                'parent_id' => $now_user->parent_id ?? 0,
+                'user_yj' => $parent_yj,
+                'level_diff' => $level_diff,
+                'yj_type' => $yj_type,
+                'yj_p' => $yj_p,
+                'yj_a' => $yj_a,
+                'created_at' => $created_at,
+                'royalty_yj' => 0, //头衔提成
+            ];
+
+            $orderYjRecord[] = $record; // 记录佣金记录
+        }
+
+        return [true, 'success', $orderYjRecord];
+    }
+
+    // 订单结算逻辑
+    public function kdOrderSettlement($order_no)
+    {
+        if (empty($order_no)) return [false, '订单号不能为空', []];
+
+        $order = Orders::select([
+            'id',
+            'user_id',
+            'order_no',
+            'sett_status',
+        ])
+            ->with(['order_yjrecord'])
+            ->where('order_no', $order_no)->first();
+
+        if (empty($order)) return [false, '订单不存在', []];
+
+        if ($order->sett_status == 1) return [false, '订单已结算', []];
+
+        if (empty($order->order_yjrecord)) return [false, '订单佣金记录不存在', []];
+
+        DB::beginTransaction();
+
+        try {
+            foreach ($order->order_yjrecord as $value) {
+                // 计算佣金
+                if($value['user_id'] == $value['from_user_id']){
+                    $type = UserYjrecord::TYPE_DIRECT;
+                }else{
+                    $type = UserYjrecord::TYPE_DISTRIBUTION;
+                }
+                list($status, $msg, $data) = (new UserYjrecord())->recharge([
+                    'user_id' => $value['user_id'],
+                    'order_no' => $value['order_no'],
+                    'status' => UserYjrecord::STATUS_ADD,
+                    'type' => $type,
+                    'source' => '宽带订单结算',
+                    'yj' => $value['user_yj'],
+                    'order_yj' => $value['original_yj'],
+                ]);
+                if (!$status) {
+                    DB::rollBack();
+                    return [false, $msg, []];
+                }
+
+                // 计算头衔提成
+                if ($value['royalty_yj'] > 0) {
+                    list($status, $msg, $data) = (new UserYjrecord())->recharge([
+                        'user_id' => $value['user_id'],
+                        'order_no' => $value['order_no'],
+                        'status' => UserYjrecord::STATUS_ADD,
+                        'type' => UserYjrecord::TYPE_ROYALTY,
+                        'source' => '宽带订单结算',
+                        'yj' => $value['royalty_yj'],
+                        'order_yj' => $value['original_yj'],
+                    ]);
+                    if (!$status) {
+                        DB::rollBack();
+                        return [false, $msg, []];
+                    }
+                }
+            }
+
+            Orders::where('order_no', $order_no)->update(['sett_status' => 1, 'sett_time' => now()]);
+            DB::commit();
+            return [true, 'success', []];
+        } catch (\Throwable $th) {
+            DB::rollBack();
+            return [false, $th->getMessage(), []];
+        }
+    }
+
+    // 批量结算
+    public function batchOrderSettle($id)
+    {
+        $OrderSettRecordInfo = OrderSettRecord::find($id);
+        $OrderSettRecordInfo->update(['status' => 1]);
+
+        if (empty($OrderSettRecordInfo)) {
+            $OrderSettRecordInfo->update(['status' => 3]);
+            return [false, '结算记录不存在', []];
+        }
+
+        if (empty($OrderSettRecordInfo->put_file)) {
+            $OrderSettRecordInfo->update(['status' => 3]);
+            return [false, '结算文件不存在', []];
+        }
+
+        $put_file = public_path($OrderSettRecordInfo->put_file);
+        if (!file_exists($put_file)) {
+            $OrderSettRecordInfo->update(['status' => 3]);
+            return [false, '结算文件不存在', []];
+        }
+
+        // 读取表格信息
+        $SpoutImport = new SpoutImport([]);
+        $dataList = $SpoutImport->setFilePath($put_file)->getExcelData();
+        if (empty($dataList)) {
+            $OrderSettRecordInfo->update(['status' => 3]);
+            return [false, '结算文件内容为空', []];
+        }
+
+        try {
+            $header = $SpoutImport->getFirstRowContent();
+            $header[] = "执行结果";
+
+            foreach ($dataList as &$value) {
+                list($status, $msg, $data) = $this->kdOrderSettlement($value[0]);
+                if ($status) {
+                    $value[] = "执行成功";
+                } else {
+                    $value[] = "执行失败:" . $msg;
+                }
+            }
+
+            // 导出执行结果
+            $SpoutImport = new SpoutExport($header);
+            list($status, $msg, $result) = $SpoutImport
+                ->setData($dataList)
+                ->setProcessStyle()
+                ->arrayToExcel("sttle_out_" . uniqid() . '_' . time(), 'csv/batch_order_settle/out/');
+
+            if ($status) {
+                $OrderSettRecordInfo->update(['out_file' => $result['path'], 'status' => 2]);
+            } else {
+                $OrderSettRecordInfo->update(['status' => 3, 'remark' => $msg]);
+            }
+        } catch (\Throwable $th) {
+            $OrderSettRecordInfo->update(['status' => 3, 'remark' => $th->getMessage()]);
+        }
+    }
+
+    // 手机号订单查询
+    public function kdOrderQuery(Request $request)
+    {
+        $request->validate([
+            'mobile' => 'required',
+        ]);
+        $mobile = $request->input('mobile'); 
+        $order = Orders::select([
+            'order_no',
+            'open_status',
+            'id_card_name',
+            'id_card',
+            'phonenum',
+            'contact',
+            'mobile',
+            'express_address',
+            'created_at',
+            'package_name',
+            'active_status',
+            'open_status',
+            'package_cover_img',
+        ])
+        ->when($request->filled('open_status'), fn ($q) => $q->where('open_status', $request->open_status))
+        ->where('mobile', $mobile);
+
+        $pages = new Pages($request, $order);
+
+        return $pages->paginate();
+    }
+}

+ 146 - 0
app/DataApiNew/Helper/PackageMemberLevelRoyaltyHelper.php

@@ -0,0 +1,146 @@
+<?php
+/*
+ * @Description: 套餐头衔奖金表
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-12-26 13:47:54
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-12-26 13:47:54
+ */
+ 
+namespace App\DataApiNew\Helper;
+ 
+use App\DataApiNew\Models\PackageMemberLevelRoyalty;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use Illuminate\Http\Request;
+
+class PackageMemberLevelRoyaltyHelper{
+    // 查询条件
+    public function whens($query,$request)
+    {
+        return $query
+        ->when($request->filled('id'), fn($q) => $q->where('id', $request->id));
+    }
+    
+    // 查询列表
+    public function select(Request $request)
+    {
+        $page = new Pages($request,PackageMemberLevelRoyalty::query());
+
+        $page->before(function($query) use ($request) {
+            $query->select(PackageMemberLevelRoyalty::$selectFields);
+            return $this->whens($query,$request);
+        });
+
+        $result = $page->paginate();
+        
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {   
+        $query = PackageMemberLevelRoyalty::select(PackageMemberLevelRoyalty::$selectFields);
+        $query = $this->whens($query,$request);
+        $query->orderBy('created_at','desc');
+        $header = [
+            '套餐id' => 'package_id',
+            '头衔id' => 'member_level_id',
+            '头衔提成佣金' => 'royalty_yj',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+          ];
+        $getEnValue = $this->getEnValue();
+        
+        $excel = new SpoutExport($header);
+        $excel->setQuery($query);
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+        
+        return $result ? success($result['url']) : error();
+    }
+    
+    // 导入
+    public function import(Request $request)
+    {   
+        $header = [
+            '套餐id' => 'package_id',
+            '头衔id' => 'member_level_id',
+            '头衔提成佣金' => 'royalty_yj',
+            '创建时间' => 'created_at',
+            '更新时间' => 'updated_at',
+          ];
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+        
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = PackageMemberLevelRoyalty::where(['id'=>$request->id])->select(PackageMemberLevelRoyalty::$selectFields)->first();
+        return success($result);
+    }
+    
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            // 'name' => 'required',
+        ]);
+        $result = PackageMemberLevelRoyalty::create($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+ 
+        $result = PackageMemberLevelRoyalty::where(['id'=>$request->id])->update($request->all());
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+    
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        $id_str = $request->ids;
+        $arr = explode(",",$id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = PackageMemberLevelRoyalty::whereIn('id', $arr)->delete();
+        if($result){
+            return success();
+        }else{
+            return error();
+        }
+    }
+}

+ 299 - 0
app/DataApiNew/Helper/PackagesHelper.php

@@ -0,0 +1,299 @@
+<?php
+/*
+ * @Description: 号卡套餐
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-25 16:38:13
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-25 16:38:13
+ */
+
+namespace App\DataApiNew\Helper;
+
+use App\DataApiNew\Models\Packages;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use App\DataApiNew\Models\AdminUsersMemberLevel;
+use App\DataApiNew\Models\PackageMemberLevelRoyalty;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Vinkla\Hashids\Facades\Hashids;
+
+class PackagesHelper
+{
+    // 查询条件
+    public function whens($query, $request)
+    {
+        return $query
+            ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id))
+            ->when($request->filled('name'), fn ($q) => $q->where('name', 'like', "%$request->name%"))
+            ->when($request->has('rebate_type'), fn ($q) => $q->where('rebate_type', $request->rebate_type))
+            ->when($request->has('is_upload'), fn ($q) => $q->where('is_upload', $request->is_upload))
+            ->when($request->filled('operator_id'), fn ($q) => $q->where('operator_id', $request->operator_id));
+    }
+
+    // 查询列表
+    public function select(Request $request,$selectFields = [])
+    {
+        if(empty($selectFields)){
+            $selectFields = Packages::$selectFields;
+        }
+
+        $page = new Pages($request, Packages::query());
+
+        $page->withRelations(['suppliers','package_member_level_royalty']);
+
+        $page->before(function ($query) use ($request, $selectFields) {
+            $query->select($selectFields);
+
+            return $this->whens($query, $request)
+                ->orderBy('is_upload', 'desc')
+                ->orderby("weight", "desc")
+                ->orderBy(DB::raw('CAST(yj AS UNSIGNED)'), 'desc')
+                ->orderBy('created_at', 'desc');
+        });
+
+        $result = $page->paginate();
+
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {
+        $query = Packages::select(Packages::$selectFields);
+        $query = $this->whens($query, $request);
+        $query->orderBy('created_at', 'desc');
+        $header = [
+            '名称' => 'name',
+            '简介' => 'mini_text',
+            '主图' => 'image',
+            '详情' => 'details',
+            '运营商' => 'operator_id',
+            '佣金政策' => 'yjzc',
+            '套餐类型' => 'type_id',
+            '月租' => 'monthly_rent',
+            '权重' => 'weight',
+            '上游套餐编码' => 'upstream_code',
+            '生产方式' => 'production_type_id',
+            '是否上架' => 'is_upload',
+            '是否需要身份证号' => 'need_idcard',
+            '是否需要上传身份证照片' => 'is_upload_idcard',
+            '状态' => 'status',
+            '外部产品编码' => 'out_package_id',
+            '归属地' => 'belonging_place',
+            '流量额度' => 'data_quota',
+            '通话时长' => 'call_duration',
+            '是否可选号' => 'is_choose_number',
+            '首充金额' => 'first_recharge_amount',
+            '直接提交局方,0表示不提,1表示提' => 'direct_send_status',
+            '线上或本地号库切换,默认为0:无号库,1:本地号库,2:线上号库' => 'uporlocal',
+            '颜色' => 'color',
+            '最小年龄' => 'min_age',
+            '最大年龄' => 'max_age',
+            '亲情号' => 'family_number',
+            '靓号' => 'beautiful_number',
+            '可否自选归属地' => 'ownership_change',
+            '优惠有效期,单位月' => 'discount_month',
+            '套餐月租' => 'month_rent',
+            '通用流量' => 'general_traffic',
+            '定向流量' => 'directional_traffic',
+            '长期资费/短期资费' => 'long_short_tariff',
+            '附带权益' => 'interest',
+            '原月租' => 'original_month_rent',
+            '封面图' => 'cover_img',
+            '注意事项' => 'attention',
+            '只发货地区' => 'noly_delivery_area',
+            '亮点' => 'bright',
+            '返佣类型 1:次月返 2:秒返' => 'rebate_type',
+            '知识库' => 'knowledge_base',
+            '是否选号' => 'select_status',
+            '是否校验' => 'is_valid',
+            '前置校验编码' => 'valid_req_code',
+            '套餐标签' => 'tag_ids',
+            '小店套餐标签' => 'shop_tag_ids',
+            '定向流量' => 'data_orientation',
+            '通用流量' => 'data_usual',
+            '是否允许直播 0:不允许 1:允许' => 'is_live',
+            '删除时间' => 'deleted_at',
+            '运营商标识图' => 'ident_image',
+            '下架时间' => 'delist_time',
+            '产品类型 0号卡 1宽带' => 'product_type',
+            '网速' => 'internet_speed',
+            '供货商id' => 'supplier_id',
+            '结佣条件' => 'commission_terms',
+        ];
+        $getEnValue = $this->getEnValue();
+
+        $excel = new SpoutExport($header);
+        $excel->setData($query->get());
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+
+        return $result ? success($result['url']) : error();
+    }
+
+    // 导入
+    public function import(Request $request)
+    {
+        $header = [
+            '名称' => 'name',
+            '简介' => 'mini_text',
+            '主图' => 'image',
+            '详情' => 'details',
+            '运营商' => 'operator_id',
+            '佣金政策' => 'yjzc',
+            '套餐类型' => 'type_id',
+            '月租' => 'monthly_rent',
+            '权重' => 'weight',
+            '上游套餐编码' => 'upstream_code',
+            '生产方式' => 'production_type_id',
+            '是否上架' => 'is_upload',
+            '是否需要身份证号' => 'need_idcard',
+            '是否需要上传身份证照片' => 'is_upload_idcard',
+            '状态' => 'status',
+            '外部产品编码' => 'out_package_id',
+            '归属地' => 'belonging_place',
+            '流量额度' => 'data_quota',
+            '通话时长' => 'call_duration',
+            '是否可选号' => 'is_choose_number',
+            '首充金额' => 'first_recharge_amount',
+            '直接提交局方,0表示不提,1表示提' => 'direct_send_status',
+            '线上或本地号库切换,默认为0:无号库,1:本地号库,2:线上号库' => 'uporlocal',
+            '颜色' => 'color',
+            '最小年龄' => 'min_age',
+            '最大年龄' => 'max_age',
+            '亲情号' => 'family_number',
+            '靓号' => 'beautiful_number',
+            '可否自选归属地' => 'ownership_change',
+            '优惠有效期,单位月' => 'discount_month',
+            '套餐月租' => 'month_rent',
+            '通用流量' => 'general_traffic',
+            '定向流量' => 'directional_traffic',
+            '长期资费/短期资费' => 'long_short_tariff',
+            '附带权益' => 'interest',
+            '原月租' => 'original_month_rent',
+            '封面图' => 'cover_img',
+            '注意事项' => 'attention',
+            '只发货地区' => 'noly_delivery_area',
+            '亮点' => 'bright',
+            '返佣类型 1:次月返 2:秒返' => 'rebate_type',
+            '知识库' => 'knowledge_base',
+            '是否选号' => 'select_status',
+            '是否校验' => 'is_valid',
+            '前置校验编码' => 'valid_req_code',
+            '套餐标签' => 'tag_ids',
+            '小店套餐标签' => 'shop_tag_ids',
+            '定向流量' => 'data_orientation',
+            '通用流量' => 'data_usual',
+            '是否允许直播 0:不允许 1:允许' => 'is_live',
+            '删除时间' => 'deleted_at',
+            '运营商标识图' => 'ident_image',
+            '下架时间' => 'delist_time',
+            '产品类型 0号卡 1宽带' => 'product_type',
+            '网速' => 'internet_speed',
+            '供货商id' => 'supplier_id',
+            '结佣条件' => 'commission_terms',
+        ];
+        $getEnValue = $this->getEnValue();
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+            'open_status' =>  [
+                0 => "待开卡",
+                1 => "开卡中",
+            ]
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = Packages::where(['id' => $request->id])->select(Packages::$selectFields)->first();
+        return success($result);
+    }
+
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            'name' => 'required',
+            'cover_img' => 'required',
+            'out_package_id' => 'required',
+            'yj' => 'required',
+        ]);
+
+        sys_log($request, '添加套餐', '号卡套餐');
+
+        $result = Packages::create($request->all());
+
+        if ($result) {
+            // 生成套餐秘钥
+            Packages::where('id',$result->id)->update(['package_key'=>Hashids::encode($result->id)]);
+
+            // 重置套餐提成
+            $package_member_level_royalty = json_decode($request->input('package_member_level_royalty','{}'), true);
+            PackageMemberLevelRoyalty::resetRoyalty($result->id, $package_member_level_royalty);
+
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        sys_log($request, '修改套餐', '号卡套餐');
+
+        $result = Packages::where(['id' => $request->id])->update($request->except(['package_member_level_royalty']));
+        if ($result) {
+            // 重置套餐提成
+            $package_member_level_royalty = json_decode($request->input('package_member_level_royalty','{}'), true);
+            PackageMemberLevelRoyalty::resetRoyalty($request->id, $package_member_level_royalty);
+
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+
+        sys_log($request, '删除套餐', '号卡套餐');
+
+        $id_str = $request->ids;
+        $arr = explode(",", $id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = Packages::whereIn('id', $arr)->delete();
+        if ($result) {
+            PackageMemberLevelRoyalty::whereIn('package_id', $arr)->delete();
+            return success();
+        } else {
+            return error();
+        }
+    }
+}

+ 283 - 0
app/DataApiNew/Helper/PackagesKdHelper.php

@@ -0,0 +1,283 @@
+<?php
+/*
+ * @Description: 宽带套餐
+ * @Version: *
+ * @Autor: lexuan
+ * @Date: 2024-11-25 16:38:13
+ * @LastEditors: lexuan
+ * @LastEditTime: 2024-11-25 16:38:13
+ */
+
+namespace App\DataApiNew\Helper;
+
+use App\DataApiNew\Models\PackagesKd;
+use App\Models\Pages;
+use App\Models\SpoutExport;
+use App\Models\SpoutImport;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Vinkla\Hashids\Facades\Hashids;
+
+class PackagesKdHelper
+{
+    // 查询条件
+    public function whens($query, $request)
+    {
+        return $query
+            ->when($request->filled('id'), fn ($q) => $q->where('id', $request->id))
+            ->when($request->filled('name'), fn ($q) => $q->where('name', 'like', "%$request->name%"))
+            ->when($request->has('rebate_type'), fn ($q) => $q->where('rebate_type', $request->rebate_type))
+            ->when($request->has('is_upload'), fn ($q) => $q->where('is_upload', $request->is_upload))
+            ->when($request->filled('operator_id'), fn ($q) => $q->where('operator_id', $request->operator_id));
+    }
+
+    // 查询列表
+    public function select(Request $request, $selectFields = [])
+    {
+        if (empty($selectFields)) {
+            $selectFields = PackagesKd::$selectFields;
+        }
+
+        $page = new Pages($request, PackagesKd::query());
+
+        $page->withRelations(['suppliers']);
+
+        $page->before(function ($query) use ($request, $selectFields) {
+            $query->select($selectFields);
+            return $this->whens($query, $request)
+                ->orderBy('is_upload', 'desc')
+                ->orderBy(DB::raw('CAST(yj AS UNSIGNED)'), 'desc')
+                ->orderby("weight", "desc")
+                ->orderBy('created_at', 'desc');;
+        });
+
+        $result = $page->paginate();
+
+        return $result;
+    }
+
+    // 导出
+    public function export(Request $request)
+    {
+        $query = PackagesKd::select(PackagesKd::$selectFields);
+        $query = $this->whens($query, $request);
+        $query->orderBy('created_at', 'desc');
+        $header = [
+            '名称' => 'name',
+            '简介' => 'mini_text',
+            '主图' => 'image',
+            '详情' => 'details',
+            '运营商' => 'operator_id',
+            '佣金政策' => 'yjzc',
+            '套餐类型' => 'type_id',
+            '月租' => 'monthly_rent',
+            '权重' => 'weight',
+            '上游套餐编码' => 'upstream_code',
+            '生产方式' => 'production_type_id',
+            '是否上架' => 'is_upload',
+            '是否需要身份证号' => 'need_idcard',
+            '是否需要上传身份证照片' => 'is_upload_idcard',
+            '状态' => 'status',
+            '外部产品编码' => 'out_package_id',
+            '归属地' => 'belonging_place',
+            '流量额度' => 'data_quota',
+            '通话时长' => 'call_duration',
+            '是否可选号' => 'is_choose_number',
+            '首充金额' => 'first_recharge_amount',
+            '直接提交局方,0表示不提,1表示提' => 'direct_send_status',
+            '线上或本地号库切换,默认为0:无号库,1:本地号库,2:线上号库' => 'uporlocal',
+            '颜色' => 'color',
+            '最小年龄' => 'min_age',
+            '最大年龄' => 'max_age',
+            '亲情号' => 'family_number',
+            '靓号' => 'beautiful_number',
+            '可否自选归属地' => 'ownership_change',
+            '优惠有效期,单位月' => 'discount_month',
+            '套餐月租' => 'month_rent',
+            '通用流量' => 'general_traffic',
+            '定向流量' => 'directional_traffic',
+            '长期资费/短期资费' => 'long_short_tariff',
+            '附带权益' => 'interest',
+            '原月租' => 'original_month_rent',
+            '封面图' => 'cover_img',
+            '注意事项' => 'attention',
+            '只发货地区' => 'noly_delivery_area',
+            '亮点' => 'bright',
+            '返佣类型 1:次月返 2:秒返' => 'rebate_type',
+            '知识库' => 'knowledge_base',
+            '是否选号' => 'select_status',
+            '是否校验' => 'is_valid',
+            '前置校验编码' => 'valid_req_code',
+            '套餐标签' => 'tag_ids',
+            '小店套餐标签' => 'shop_tag_ids',
+            '定向流量' => 'data_orientation',
+            '通用流量' => 'data_usual',
+            '是否允许直播 0:不允许 1:允许' => 'is_live',
+            '删除时间' => 'deleted_at',
+            '运营商标识图' => 'ident_image',
+            '下架时间' => 'delist_time',
+            '产品类型 0号卡 1宽带' => 'product_type',
+            '网速' => 'internet_speed',
+            '供货商id' => 'supplier_id',
+            '结佣条件' => 'commission_terms',
+        ];
+        $getEnValue = $this->getEnValue();
+
+        $excel = new SpoutExport($header);
+        $excel->setData($query->get());
+        $result = $excel->setEnum($getEnValue)->spoutToExcel('excel_out');
+
+        return $result ? success($result['url']) : error();
+    }
+
+    // 导入
+    public function import(Request $request)
+    {
+        $header = [
+            '名称' => 'name',
+            '简介' => 'mini_text',
+            '主图' => 'image',
+            '详情' => 'details',
+            '运营商' => 'operator_id',
+            '佣金政策' => 'yjzc',
+            '套餐类型' => 'type_id',
+            '月租' => 'monthly_rent',
+            '权重' => 'weight',
+            '上游套餐编码' => 'upstream_code',
+            '生产方式' => 'production_type_id',
+            '是否上架' => 'is_upload',
+            '是否需要身份证号' => 'need_idcard',
+            '是否需要上传身份证照片' => 'is_upload_idcard',
+            '状态' => 'status',
+            '外部产品编码' => 'out_package_id',
+            '归属地' => 'belonging_place',
+            '流量额度' => 'data_quota',
+            '通话时长' => 'call_duration',
+            '是否可选号' => 'is_choose_number',
+            '首充金额' => 'first_recharge_amount',
+            '直接提交局方,0表示不提,1表示提' => 'direct_send_status',
+            '线上或本地号库切换,默认为0:无号库,1:本地号库,2:线上号库' => 'uporlocal',
+            '颜色' => 'color',
+            '最小年龄' => 'min_age',
+            '最大年龄' => 'max_age',
+            '亲情号' => 'family_number',
+            '靓号' => 'beautiful_number',
+            '可否自选归属地' => 'ownership_change',
+            '优惠有效期,单位月' => 'discount_month',
+            '套餐月租' => 'month_rent',
+            '通用流量' => 'general_traffic',
+            '定向流量' => 'directional_traffic',
+            '长期资费/短期资费' => 'long_short_tariff',
+            '附带权益' => 'interest',
+            '原月租' => 'original_month_rent',
+            '封面图' => 'cover_img',
+            '注意事项' => 'attention',
+            '只发货地区' => 'noly_delivery_area',
+            '亮点' => 'bright',
+            '返佣类型 1:次月返 2:秒返' => 'rebate_type',
+            '知识库' => 'knowledge_base',
+            '是否选号' => 'select_status',
+            '是否校验' => 'is_valid',
+            '前置校验编码' => 'valid_req_code',
+            '套餐标签' => 'tag_ids',
+            '小店套餐标签' => 'shop_tag_ids',
+            '定向流量' => 'data_orientation',
+            '通用流量' => 'data_usual',
+            '是否允许直播 0:不允许 1:允许' => 'is_live',
+            '删除时间' => 'deleted_at',
+            '运营商标识图' => 'ident_image',
+            '下架时间' => 'delist_time',
+            '产品类型 0号卡 1宽带' => 'product_type',
+            '网速' => 'internet_speed',
+            '供货商id' => 'supplier_id',
+            '结佣条件' => 'commission_terms',
+        ];
+        $getEnValue = $this->getEnValue();
+        $SpoutImport = new SpoutImport($header);
+        $dataList = $SpoutImport->setRequest($request)->getExcelData();
+        return $dataList;
+    }
+
+    // 获取枚举值
+    public function getEnValue()
+    {
+        $data = [
+            'open_status' =>  [
+                0 => "待开卡",
+                1 => "开卡中",
+            ]
+        ];
+        return $data;
+    }
+
+    // 查询一条
+    public function find(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+        $result = PackagesKd::where(['id' => $request->id])->select(PackagesKd::$selectFields)->first();
+        return success($result);
+    }
+
+    // 添加
+    public function insert(Request $request)
+    {
+        $request->validate([
+            'name' => 'required',
+        ]);
+
+        sys_log($request, '添加套餐', '宽带套餐');
+
+        $result = PackagesKd::create($request->all());
+        if ($result) {
+            // 生成套餐秘钥
+            PackagesKd::where('id', $result->id)->update(['package_key' => Hashids::encode($result->id)]);
+
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 修改
+    public function update(Request $request)
+    {
+        $request->validate([
+            'id' => 'required|integer',
+        ]);
+
+        sys_log($request, '修改套餐', '宽带套餐');
+
+        $result = PackagesKd::where(['id' => $request->id])->update($request->all());
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+
+    // 删除
+    public function delete(Request $request)
+    {
+        $request->validate([
+            'ids' => 'required',
+        ]);
+        
+        sys_log($request, '删除套餐', '宽带套餐');
+
+        $id_str = $request->ids;
+        $arr = explode(",", $id_str);
+        // 查询是否存在子数据
+        // $count = Shop::whereIn('tm_id',$arr)->count();
+        // if($count > 0){
+        //     return ['code'=>0,'msg'=>"存在子数据,禁止删除"];
+        // }
+        $result = PackagesKd::whereIn('id', $arr)->delete();
+        if ($result) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+}

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.