RoutesController.php 8.5 KB
<?php
/**
+-----------------------------------------------------------------------------------------------------------------------
 * 管理端控制层: Route 控制类
+-----------------------------------------------------------------------------------------------------------------------
 *
 * PHP version 7
 *
 * @category  App\Admin\Controllers
 * @package   App\Admin\Controllers
 * @author    Richer <yangzi1028@163.com>
 * @date      2023年2月28日14:35:45
 * @copyright 2020-2022 Richer (http://www.Richer.com/)
 * @license   http://www.Richer.com/ License
 * @link      http://www.Richer.com/
 */
namespace App\Admin\Controllers;

use App\Admin\Forms\RouteForm;
use App\Admin\Grids\RouteGrid;
use App\Models\Route;
use App\Models\RouteSite;
use App\Models\Site;
use App\Models\Traits\RouteTrait;
use App\Models\User\User;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\DB;

/**
 * Class RoutesController
 * @package App\Admin\Controllers
 */
class RoutesController extends BaseController
{
    use RouteGrid, RouteForm, RouteTrait;

    /**
     * RoutesController constructor.
     *
     * @param Route $model 注入model
     */
    public function __construct(Route $model)
    {
        // 资源显示的中名称
        $this->title            = $model::OBJ_NAME_ZH;
        // 是否可查看
        $this->can_view         = true;
        // 是否可新增
        $this->can_create       = true;
        // 是否可编辑
        $this->can_edit         = true;
        // 是否可删除
        $this->can_delete       = true;
        // 是否开启下拉菜单
        $this->dropdownActions  = false;

        // 执行父类构造方法
        parent::__construct($model);
    }

    /**
     * 添加站点界面
     *
     * @param  $id
     */
    public function sites($id)
    {
        $sites = RouteSite::with(['site'])->where('route_id', $id)->orderBy('sort')->get();
        // 获取数据,如果没有获取到抛出异常
        return view('admin::route.sites', compact('id', 'sites')) ;
    }

    /**
     * 添加站点界面
     *
     * @param  $id
     */
    public function sitePage($id)
    {
        // 获取数据,如果没有获取到抛出异常
        return view('admin::route.site', compact('id')) ;
    }

    /**
     * 获取 未添加的线路
     *
     * @return JsonResponse
     */
    public function searchSites($id)
    {
        try {
            // 获取
            $list = Site::whereDoesntHave('route', function ($query) use ($id) {
                $query->where('routes.id', $id);
            })
            ->when($q = request('name'), function ($query) use ($q) {
                $query->where('name', 'LIKE', "%$q%");
            })
            ->when($q = request('address'), function ($query) use ($q) {
                $query->where('address', 'LIKE', "%$q%");
            })
            ->get()->map(function ($item) {
                return [
                    'id'    => $item->id,
                    'name'  => (string)$item->name,
                    'description' => (string)$item->description,
                    'address' => (string)$item->address,
                    'created_at' => format_date($item->created_at),
                ];
            });
            return response()->json(
                [
                    'code'    => 0,
                    'message' =>__('operate_succeeded'),
                    'list' => $list,
                    'total' => $list->count(),
                ]
            );
        } catch (ModelNotFoundException $e) {
            return response()->json(
                [
                    'code'    => 1,
                    'status'  => 0,
                    'message' => __('no_data'),
                ]
            );
        }
    }

    /**
     * 添加站点
     *
     * @param integer $id 主键id
     *
     * @return JsonResponse
     */
    public function addSite($id)
    {
        DB::beginTransaction();
        try {
            // 获取数据,如果没有获取到抛出异常
            $model = $this->model->findOrFail($id);

            // 获取IDS
            $ids = request('ids');
            $ids = explode(',', $ids);
            if (!$ids || !is_array($ids)) {
                return response()->json(
                    [
                        'code'      => 1,
                        'message'   => __('请选择需要添加的站点。'),
                    ]
                );
            }

            // 获取最大的顺序
            $sort = $model->sites()->max('sort');
            $items = [];
            foreach ($ids as $id) {
                $sort++;
                $items[] = [
                    'site_id' => $id,
                    'sort' => $sort,
                ];
            }

            $model->sites()->createMany($items);

            //  设置站点间距离
            $this->setRouteSiteDistance($id);

            DB::commit();
            return response()->json(
                [
                    'code'    => 0,
                    'status'  => 1,
                    'message' =>__('operate_succeeded'),
                ]
            );
        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json(
                [
                    'code'    => 1,
                    'status'  => 0,
                    'message' => $e->getMessage(),
                ]
            );
        }
    }

    /**
     * 线路更新站点的顺序
     *
     * @param integer $id 主键id
     *
     * @return JsonResponse
     */
    public function updateSites($id)
    {
        DB::beginTransaction();
        try {
            // 获取数据,如果没有获取到抛出异常
            $model = $this->model->findOrFail($id);

            // 获取IDS
            $ids = request('ids');
            $ids = explode(',', $ids);
            if (!$ids || !is_array($ids)) {
                return response()->json(
                    [
                        'code'      => 1,
                        'message'   => __('请选择需要更新的站点。'),
                    ]
                );
            }

            $items = [];
            $sort = 0;
            foreach ($ids as $site_id) {
                $sort++;
                $items[] = [
                    'id' => $site_id,
                    'sort' => $sort,
                ];
            }

            $items = array_filter($items);
            if ($items) {
                app(RouteSite::class)->updateBatch($items);

                //  设置站点间距离
                $this->setRouteSiteDistance($id);
            }

            DB::commit();
            return response()->json(
                [
                    'code'    => 0,
                    'status'  => 1,
                    'message' =>__('operate_succeeded'),
                ]
            );
        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json(
                [
                    'code'    => 1,
                    'status'  => 0,
                    'message' => $e->getMessage(),
                ]
            );
        }
    }

    /**
     * 线路更新站点的顺序
     *
     * @param integer $id 主键id
     *
     * @return JsonResponse
     */
    public function deleteSite($id, $site_id)
    {
        DB::beginTransaction();
        try {
            // 获取数据,如果没有获取到抛出异常

            $model = $this->model->findOrFail($id);

            $model->sites()->where('id', $site_id)->delete();

            // 更新排序
            $sites = $model->sites()->orderBy('sort')->get()->map(function ($site, $index) {
                return [
                    'id' => $site->id,
                    'sort' => $index+1,
                ];
            })->toArray();

            $sites = array_filter($sites);
            if ($sites) {
                app(RouteSite::class)->updateBatch($sites);

                //  设置站点间距离
                $this->setRouteSiteDistance($id);
            }

            DB::commit();
            return response()->json(
                [
                    'code'    => 0,
                    'status'  => 1,
                    'message' =>__('operate_succeeded'),
                ]
            );
        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json(
                [
                    'code'    => 1,
                    'status'  => 0,
                    'message' => $e->getMessage(),
                ]
            );
        }
    }
}