Index.php 12.8 KB
<?php

namespace app\api\controller\v7\screen;

use app\admin\model\inspection\Plan;
use app\admin\model\inspection\Project;
use app\admin\model\inspection\Staff;
use app\admin\model\inspection\Warning;
use app\admin\model\inspection\Warningreply;
use app\admin\model\inspection\Workorder;
use app\admin\model\inspection\Workorderdeal;
use app\admin\model\pipes\Line;
use app\admin\model\pipes\Route;
use app\admin\model\pipes\Waterhead;
use app\admin\model\pipes\Well;
use app\common\controller\Api;
use think\Db;

/**
 * 一河五库基础信息相关接口
 * Class Network
 * @package app\api\controller\v7\pipes
 */
class Index extends Api
{
    protected $noNeedLogin = ['*'];
    protected $noNeedRight = ['*'];

    protected $workorderStatusList = [
        '0' => '待处理',
        '1' => '待审核',
        '2' => '已处理',
        '3' => '审核未通过',
        '4' => '无法处理'
    ];

    protected $warningStatusList = [
        '-1' => '审核失败',
        '0' => '待审核',
        '1' => '审核通过',
        '2' => '处理完成',
    ];

    public function _initialize()
    {
        parent::_initialize();
    }

    /**
     * 一河五库基础信息
     */
    public function info()
    {
        $pictures = config("site.yhwk_baseinfo_pictures");
        $vedio = config("site.yhwk_baseinfo_vedio");
        $data["pictures"] =full_image($pictures);
        $data["vedio"] =full_image($vedio);

        $this->success("一河五库基础信息获取成功", $data);
    }

    /**
     * 巡检统计
     */
    public function inspection(){
        $projectModel = new Project();
        $total_num = $projectModel->count();
        $finish_num = $projectModel->where(['status' => 1])->count();
        $completion_rate = round($finish_num/$total_num * 100, 2) . '%';

        //获取最近的异常上报数据30条
        $warningModel = new Warning();
        $warningList = $warningModel
            ->alias('w')
            ->field('w.id,w.title,s.staff_name,w.createtime')
            ->join('inspection_staff s', 's.id=w.staff_id', 'LEFT')
            ->order(['id' => 'desc'])
            ->page(1, 30)
            ->select();
        foreach ($warningList as $item){
            $item['createtime_text'] = date('Y-m-d H:i', $item['createtime']);
        }
        $result = [
            'completion_rate' => $completion_rate,
            'finish_num' => $finish_num,
            'total_num' => $total_num,
            'warning_list' => $warningList
        ];
        $this->success('成功', $result);
    }

    /**
     * 工单统计
     */
    public function workorder(){
        $workorderModel = new Workorder();
        //今天
        $datetime = strtotime(date('Y-m-d'));
        //近7天
        $datetime7 = strtotime(date('Y-m-d')) - 86400*6;
        $today = $workorderModel
            ->alias('w')
            ->field('w.id,w.message,s.staff_name,w.start_time,w.status')
            ->join('inspection_staff s', 's.id=w.staff_id', 'LEFT')
            ->where(['start_time' => ['egt', $datetime]])
            ->order(['start_time' => 'desc'])
            ->select();
        foreach ($today as $item){
            $item['start_time_text'] = date('Y-m-d H:i', $item['start_time']);
        }
        $seven = $workorderModel
            ->alias('w')
            ->field('w.id,w.message,s.staff_name,w.start_time,w.status')
            ->join('inspection_staff s', 's.id=w.staff_id', 'LEFT')
            ->where(['start_time' => ['egt', $datetime7]])
            ->order(['start_time' => 'desc'])
            ->select();
        foreach ($seven as $value){
            $value['start_time_text'] = date('Y-m-d H:i', $value['start_time']);
            $value['status'] = $this->workorderStatusList[$value['status']];
        }
        $result = [
            'today' => $today,
            'seven' => $seven,
        ];
        $this->success('成功', $result);
    }

    /**
     * 异常详情
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function warningDetail(){
        $params = $this->request->get();
        if (empty($params['id'])){
            $this->error('id参数必须');
        }
        $warningModel = new Warning();
        $warning = $warningModel
            ->alias('w')
            ->field([
                'w.*',
                'a.area_name',
                's.site_name',
                'i.item_name',
                'c.name as category_name',
                'c_p.name as category_pname',
            ])
            ->join('inspection_area a', 'a.id=w.area_id', 'LEFT')
            ->join('inspection_area_site s', 's.id=w.areasite_id', 'LEFT')
            ->join('inspection_area_item i', 'i.id=w.areaitem_id', 'LEFT')
            ->join('inspection_warning_category c', 'c.id=w.category_id', 'LEFT')
            ->join('inspection_warning_category c_p', 'c_p.id=c.pid', 'LEFT')
            ->where([
                'w.id' => $params['id']
            ])
            ->find();
        if ($warning){
            $warning = $warning->toArray();
            //查询员工staff_id
            $staffModel = new Staff();
            $warning['staff_info'] = $staffModel
                ->where(['id' => $warning['staff_id']])
                ->find();
            $warning['status_text'] = $this->warningStatusList[$warning['status']];
            //查询回复数据
            $warningReplyModel = new Warningreply();
            $warning['reply_record'] = $warningReplyModel->where(['wid' => $warning['id']])->order(['createtime' => 'desc'])->select();
            $this->success('成功', $warning);
        }else{
            $this->error('隐患不存在');
        }
    }

    /**
     * 工单详情
     */
    public function workorderDetail(){
        $id = $this->request->get('id');
        if (empty($id)){
            $this->error('工单id必须');
        }

        $workorder = Workorder::get($id);
        if (!$workorder){
            $this->error('工单不存在');
        }
        $workorder = $workorder->toArray();
        $workorder['status_text'] = $this->workorderStatusList[$workorder['status']];
        //查询异常报告信息
        $warningModel = new Warning();
        $warning = $warningModel
            ->alias('w')
            ->field([
                'w.*',
                'a.area_name',
                's.site_name',
                'i.item_name',
                'wc.name as category_name',
            ])
            ->join('inspection_area a','a.id=w.area_id', 'LEFT')
            ->join('inspection_area_site s','s.id=w.areasite_id', 'LEFT')
            ->join('inspection_area_item i','i.id=w.areaitem_id', 'LEFT')
            ->join('inspection_warning_category wc','wc.id=w.category_id', 'LEFT')
            ->where([
                'w.id' => $workorder['warning_id']
            ])
            ->find();
        $workorder['warning_info'] = $warning;
        //查询处理人员信息
        $staffModel = new Staff();
        $staff = $staffModel
            ->alias('s')
            ->field([
                's.*',
                'u.nickname',
                'u.avatar'
            ])
            ->join('user u','u.id=s.user_id', 'LEFT')
            ->where([
                's.id' => $workorder['staff_id']
            ])
            ->find();
        $workorder['staff_info'] = $staff;
        //获取工单处理结果
        $workorderdealModel = new Workorderdeal();
        $workorderdeal = $workorderdealModel
            ->where([
                'workorder_id' => $workorder['id']
            ])
            ->order([
                'id' => 'desc'
            ])
            ->select();
        $workorder['deal_info'] = $workorderdeal;
        $this->success('成功', $workorder);
    }

    //获取所有的放水口
    public function wellList(){
        $params = $this->request->get();
        $where = [];
        if (!empty($params['query'])) {
            $where['well.well_name|well.well_code'] = ['LIKE', "%{$params['query']}%", 'OR'];
        }

        if (!empty($params['network_id'])) {
            $where['well.network_id'] = $params['network_id'];
        } else {
            //没有管网ID参数则默认获取第一个管网的ID
            $networkModel = new \app\admin\model\pipes\Network();
            $find = $networkModel->field('id')->order(['id' => 'asc'])->find();
            if ($find) {
                $where['well.network_id'] = $find['id'];
            }
        }

        $list = (new Well())
            ->with('network')
            ->where($where)
            ->select();
        $this->success('成功', $list);
    }

    //获取最新一条工单数据
    public function firstWorkorder(){
        $workorder = (new Workorder())->order(['id' => 'desc'])->find();
        if (!$workorder){
            $this->error('暂无工单');
        }
        $workorder = $workorder->toArray();
        $workorder['status_text'] = $this->workorderStatusList[$workorder['status']];
        //查询异常报告信息
        $warningModel = new Warning();
        $warning = $warningModel
            ->alias('w')
            ->field([
                'w.*',
                'a.area_name',
                's.site_name',
                'i.item_name',
                'wc.name as category_name',
            ])
            ->join('inspection_area a','a.id=w.area_id', 'LEFT')
            ->join('inspection_area_site s','s.id=w.areasite_id', 'LEFT')
            ->join('inspection_area_item i','i.id=w.areaitem_id', 'LEFT')
            ->join('inspection_warning_category wc','wc.id=w.category_id', 'LEFT')
            ->where([
                'w.id' => $workorder['warning_id']
            ])
            ->find();
        $workorder['warning_info'] = $warning;
        //查询处理人员信息
        $staffModel = new Staff();
        $staff = $staffModel
            ->alias('s')
            ->field([
                's.*',
                'u.nickname',
                'u.avatar'
            ])
            ->join('user u','u.id=s.user_id', 'LEFT')
            ->where([
                's.id' => $workorder['staff_id']
            ])
            ->find();
        $workorder['staff_info'] = $staff;
        //获取工单处理结果
        $workorderdealModel = new Workorderdeal();
        $workorderdeal = $workorderdealModel
            ->where([
                'workorder_id' => $workorder['id']
            ])
            ->order([
                'id' => 'desc'
            ])
            ->select();
        $workorder['deal_info'] = $workorderdeal;
        $this->success('成功', $workorder);
    }

    //获取巡检员行走轨迹
    public function getTravel(){
        $params = $this->request->get();
        $page = $params['page'] ?? 1;
        $limit = $params['limit'] ?? 50;
        if (empty($params['datetime'])){
            //默认取当天0点的时间戳
            $datetime = strtotime(date('Y-m-d'));
        }else{
            $datetime = strtotime(date('Y-m-d', $params['datetime']));
        }
        if (empty($params['plan_id'])){
            $this->error('计划ID必须');
        }
        $plan = Plan::get($params['plan_id']);
        if (!$plan){
            $this->error('计划不存在');
        }

        $list = [];
        $total = Db::name('inspection_position')
            ->where([
                'plan_id' => $params['plan_id'],
                'createtime' => ['between', [$datetime, $datetime + 24*3600 - 1]]
            ])
            ->count();
        if ($total > 0){
            $list = Db::name('inspection_position')
                ->where([
                    'plan_id' => $params['plan_id'],
                    'createtime' => ['between', [$datetime, $datetime + 24*3600 - 1]]
                ])
                ->order(['createtime' => 'asc'])
                ->page($page, $limit)
                ->select();
        }
        //巡检人员详情
        $staff = Staff::get($plan['staff_id']);
        //查询巡检人员位置当前位置
        $position = Db::name('inspection_position')
            ->where([
                'plan_id' => $params['plan_id'],
                'createtime' => ['between', [$datetime, $datetime + 24*3600 - 1]]
            ])
            ->order(['createtime' => 'desc'])
            ->find();
        $result = [
            'page' => $page,
            'limit' => $limit,
            'total' => $total,
            'rows' => $list,
            'position' => $position,
            'staff_info' => $staff,
        ];
        $this->success('成功', $result);
    }

    //平台开始运行时间、安全运行天数、当前在线人数
    public function loginPage(){
        $result = [
            'start_time' => date('Y年m月d日 H:i:s'),
            'run_days' => 10,
            'online_num' => 20,
        ];
        $this->success('成功', $result);
    }
}