<?php
namespace app\api\controller\ue;

use app\common\model\EnergyParam;
use app\hander\HelpHander;
use think\Controller;
use think\Db;

class Energy extends Base {

    // 首页统计
    public function sytj(){
        $deviceCount = Db::name('energy_device')->where('org_id',$this->orgId)->where('del',0)->count(); // 设备总数
        $deviceCount1 = Db::name('energy_device')->where('org_id',$this->orgId)->where('del',0)->where('status',1)->count(); // 在线数

        // 今日消耗
        $day = date('Y-m-d');
        $degree = (new EnergyParam())->getDegreeByDay($this->orgId,$day);

        // 昨日消耗
        $yday = date('Y-m-d',time() - 24*60*60);
        $ydegree = (new EnergyParam())->getDegreeByDay($this->orgId,$yday);

        // 实时功率
        $power = (new EnergyParam())->getPower($this->orgId);

        $data = [
            'deviceCount' => $deviceCount,
            'deviceCount1' => $deviceCount1,
            'degree' => round($degree,2),
            'ydegree' => round($ydegree,2),
            'power' => round($power,2),
        ];
        HelpHander::success($data);
    }

    // 配电房数据
    public function room(){
        $rooms = Db::name('energy_room')->where('org_id',$this->orgId)->where('del',0)->field('id,title,ueid')->select();
        foreach ($rooms as $k=>$v){
            $temp = '';
            $humi = '';
            // 温湿度设备
            $wsddevice = Db::name('energy_device')->where('org_id',$this->orgId)->where('del',0)->where('cate',3)->find();
            if($wsddevice){
                $wsdparam = Db::name('energy_param')->where('device_sn',$wsddevice['sn'])->order('report_time desc')->find();
                if($wsdparam){ // {"Temp":"23.500000","Humi":"49.000000"}
                    $content = json_decode($wsdparam['content'],true);
                    if(isset($content['Temp'])){
                        $temp = $content['Temp'];
                    }
                    if(isset($content['Temp'])){
                        $humi = $content['Humi'];
                    }
                }
            }
            $rooms[$k]['temp'] = $temp;
            $rooms[$k]['humi'] = $humi;

            // 开关量设备
            $door = "";
            $smoke = '';
            $water1 = '';
            $water2 = '';
            $dalarms = [];
            $kgdevice = Db::name('energy_device')->where('org_id',$this->orgId)->where('del',0)->where('cate',4)->find();
            if($kgdevice){
                $kgparam = Db::name('energy_param')->where('device_sn',$kgdevice['sn'])->order('report_time desc')->select();
                if($kgparam){ //{"遥信3":"0","遥信2":"1","遥信1":"1","遥信8":"1","遥信7":"1","遥信6":"1","遥信5":"1","遥信4":"1"}
                    $content = json_decode($wsdparam['content'],true);
                    if(isset($content['遥信1'])){
                        $water1 = $content['遥信1'] == 1?"有":"无";
                    }
                    if(isset($content['遥信2'])){
                        $water2 = $content['遥信2'] == 1?"有":"无";
                    }
                    if(isset($content['遥信3'])){
                        $smoke = $content['遥信3'] == 1?"有":"无";
                    }
                    if(isset($content['遥信4'])){
                        $door = $content['遥信4'] == 1?"打开":"关闭";
                    }
                }

                $dalarms = Db::name('energy_alarm')->where('alarm_type',"状态变化")->field('id,alarm_time as report_time,current_value')->order('alarm_time desc')->limit(7)->select();
                foreach ($dalarms as $kk=>$vv){
                    $dalarms[$kk]['current_value'] = "关闭";
                    if($vv['current_value'] == 1){
                        $dalarms[$kk]['current_value'] = "打开";
                    }
                }
            }
            $rooms[$k]['dalarms'] = $dalarms;
            $rooms[$k]['door'] = $door;
            $rooms[$k]['smoke'] = $smoke;
            $rooms[$k]['water1'] = $water1;
            $rooms[$k]['water2'] = $water2;
        }

        HelpHander::success($rooms);
    }

    // 楼栋日能耗分析
    public function addrs(){
        $addrs = Db::name('energy_address')
            ->where('org_id',$this->orgId)
            ->where('pid',0)
            ->where('enable',1)
            ->where('del',0)
            ->select();
        $day = date('Y-m-d');
        $x = [];
        $y = [];
        foreach ($addrs as $k=>$v){
            $x[] = $v['title'];

            $degree = 0;
            // 获取所有子级
            $cids = Db::name('energy_address')
                ->where('pid',$v['id'])
                ->where('enable',1)
                ->where('del',0)
                ->column('id');
            if($cids){
                $cids2 = Db::name('energy_address')
                    ->where('pid','in',$cids)
                    ->where('enable',1)
                    ->where('del',0)
                    ->column('id');
                if($cids2){
                    $cids = array_merge($cids,$cids2);
                }
            }

            $cids[] = $v['id'];
            // 获取子级所有电表设备
            $devices = Db::name('energy_device')
                ->where('del',0)
                ->where('cate',1)
                ->where('address_id','in',$cids)
                ->column('sn');
            if($devices){
                $degree = (new EnergyParam())->getDegreeByDay($this->orgId,$day,$devices);
            }

            $y[] = round($degree,2);
        }

        HelpHander::success(['x'=>$x,'y'=>$y]);
    }

    // 总能耗逐时分析
    public function hours(){
        $x = [];
        $y1 = [];
        $y2 = [];
        $hours = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];
        $day = date('Y-m-d');
        $yday = date('Y-m-d',time()-24*60*60);
        foreach ($hours as $k=>$v){
            $x[] = $v;
            $degree1 = (new EnergyParam())->getDegreeByHour($this->orgId,$day,$v,[]);
            $y1[] = round($degree1,2);
            $degree2 = (new EnergyParam())->getDegreeByHour($this->orgId,$yday,$v,[]);
            $y2[] = round($degree2,2);
        }
        HelpHander::success(['x'=>$x,'y1'=>$y1,'y2'=>$y2]);
    }

    // 待处理报警记录
    public function alarms(){
        $lists = Db::name('energy_alarm_event')
            ->alias('a')
            ->join('energy_alarm b','a.alarm_id = b.id')
            ->where('b.org_id',$this->orgId)
            ->where('a.status','in',[0,1])
            ->field('a.id,a.status,a.alarm_id,b.device_sn,b.alarm_time,b.point_label,b.alarm_type,b.current_value,b.setting_value')
            ->order('a.id desc')
            ->select();
        $rooms = [];
        $roomIds = [];
        foreach ($lists as $k=>$v){
            $lists[$k]['room_id'] = 0;
            $lists[$k]['content'] = "";
            $lists[$k]['cate_title'] = "";
            $lists[$k]['room_title'] = "";
            $room = Db::name('energy_device')
                ->alias('a')
                ->join('energy_room c','c.id = a.room_id')
                ->join('energy_device_cate d','d.id = a.cate','left')
                ->where('a.sn',$v['device_sn'])
                ->field('c.id,c.title,c.ueid,a.title as device_title,d.title as cate_title')
                ->find();
            if($room){
                $lists[$k]['room_id'] = $room['id'];
                $lists[$k]['content'] = $room['device_title']."-".$v['point_label']."-当前值:".$v['current_value'];
                $lists[$k]['cate_title'] = $room['cate_title'];
                $lists[$k]['room_title'] = $room['title'];
                if(!in_array($room['id'],$roomIds)){
                    $roomIds[] = $room['id'];
                    $rooms[] = [
                        'id' => $room['id'],
                        'title' => $room['title'],
                        'ueid' => $room['ueid']
                    ];
                }
            }
        }

        $nrooms = [];
        foreach ($rooms as $k=>$v){
            $garr = [
                'alarm_type' => "高限报警",
                'count' => 0,
                'records' => []
            ];
            $darr = [
                'alarm_type' => "低限报警",
                'count' => 0,
                'records' => []
            ];

            $grecords = [];
            $drecords = [];
            foreach ($lists as $kk=>$vv){
                if($vv['room_id'] == $v['id']){
                    if($vv['alarm_type'] == $garr['alarm_type']){
                        $grecords[] = [
                            "id" => $vv['id'],
                            "status" => $vv['status'],
                            "alarm_type" => $vv['alarm_type'],
                            "room_title" => $vv['room_title'],
                            "cate_title" => $vv['cate_title'],
                            "content" => $vv['content'],
                            "alarm_time" => $vv['alarm_time']
                        ];
                    }
                    if($vv['alarm_type'] == $darr['alarm_type']){
                        $drecords[] = [
                            "id" => $vv['id'],
                            "status" => $vv['status'],
                            "alarm_type" => $vv['alarm_type'],
                            "room_title" => $vv['room_title'],
                            "cate_title" => $vv['cate_title'],
                            "content" => $vv['content'],
                            "alarm_time" => $vv['alarm_time']
                        ];
                    }
                }
            }

            $garr['count'] = count($grecords);
            $garr['records'] = $grecords;
            $v['garr'] = $garr;

            $darr['count'] = count($drecords);
            $darr['records'] = $drecords;
            $v['darr'] = $darr;

            $v['count'] = $garr['count'] + $darr['count'];
            if($v['count'] > 0){
                $nrooms[] = $v;
            }
        }

        HelpHander::success($nrooms);
    }

    // 处理报警
    public function dealAlarm(){
        $id = input('id/d',0);
        $status = input('status/d',0);
        $reason = input('reason','','trim');
        if($status != 1 && $status != 2 && $id <= 0){
            HelpHander::error("参数错误");
        }
        $info = Db::name('energy_alarm_event')
            ->alias('a')
            ->join('energy_alarm b','a.alarm_id = b.id')
            ->where('b.org_id',$this->orgId)
            ->where('a.id',$id)
            ->field('a.*')
            ->find();
        if(!$info){
            HelpHander::error("报警记录不存在");
        }
        if($status == 1 && $info['status'] != 0){
            HelpHander::error("无权限操作");
        }
        if($status == 2 && $info['status'] != 1){
            HelpHander::error("无权限操作");
        }

        if($status == 1){
            $sc = time() - strtotime($info['create_time']);
            $res = Db::name($this->table)->where('id',$id)->update([
                "xytime" => $sc,
                "deal_time" => date('Y-m-d H:i:s'),
                'update_time' => date('Y-m-d H:i:s'),
                'deal_user' => $this->userId,
                'status' => 1
            ]);
        }else{
            $sc = time() - strtotime($info['create_time']);
            $res = Db::name($this->table)->where('id',$id)->update([
                "hftime" => $sc,
                "finish_time" => date('Y-m-d H:i:s'),
                'update_time' => date('Y-m-d H:i:s'),
                "reason" => $reason,
                'status' => 2
            ]);
        }
        if($res){
            HelpHander::success([],'操作成功');
        }else{
            HelpHander::error("操作失败");
        }

    }

    // 监控
    public function monitor(){
        $lists = Db::name('energy_monitor')->where('org_id',$this->orgId)->where('del',0)->field('id,title,ueid')->select();
        foreach ($lists as $k=>$v){
            $lists[$k]['url'] = url('h5/Index/monitor',['id'=>think_encrypt($v['id'])],false,true);
        }
        HelpHander::success($lists);
    }

    // 楼层统计
    public function floor(){
        $address = Db::name('energy_address')
            ->where('org_id',$this->orgId)
            ->where('del',0)
            ->where('enable',1)
            ->field('id,title,ueid,pid')
            ->select();
        $pids = [];
        foreach ($address as $k=>$v){
            if($v['pid'] == 0){
                $pids[] = $v['id'];
            }
        }

        $lists = [];
        if($pids){
            foreach ($address as $k=>$v){
                if(in_array($v['pid'],$pids) && !empty($v['ueid'])){
                    $lists[] = $v;
                }
            }
        }

        $devices = Db::name('energy_device')
            ->where('del',0)
            ->field('id,sn,address_id')
            ->select();

        $day = date('Y-m-d');
        foreach($lists as $k=>$v){
            $cids = [];
            foreach ($address as $kk=>$vv){
                if($vv['pid'] == $v['id']){
                    $cids[] = $vv['id'];
                }
            }
            $cids[] = $v['id'];
            $deviceSns = [];
            foreach ($devices as $dk=>$dv){
                if(in_array($dv['address_id'],$cids)){
                    $deviceSns[] = $dv['sn'];
                }
            }
            $degree = 0;
            if($deviceSns){
                $degree = (new EnergyParam())->getDegreeByDay($this->orgId,$day,$deviceSns);
            }
            $lists[$k]['degree'] = round($degree,2);
        }

        HelpHander::success($lists);

    }


}