Project.php 9.8 KB
<?php

namespace addons\inspection\library;


use app\admin\model\inspection\Plan;
use app\admin\model\inspection\Routesite;
use think\Db;
use think\Exception;

class Project
{
    public function init(&$request){

        //在生成任务之前,把昨天以前的数据状态status改为漏检-1
        $projectModel = new \app\admin\model\inspection\Project();
        //当天0点时间
        $datetime = strtotime(date('Y-m-d'));
        $projectModel
            ->save([
                'status' => -1
            ],[
                'status' => 0,
                'state' => 0,
                'begintime' => ['lt', $datetime]
            ]);

        $planModel = new Plan();
        $planList = collection($planModel
            ->alias("plan")
            ->field("plan.id as plan_id,plan.route_id,plan.num,plan.time,plan.circle_type,plan.circle_value,plan.begintime,plan.endtime,plan.exetimes,plan.staff_id")
            ->join("inspection_route route","plan.route_id=route.id")
            ->join("inspection_staff staff","plan.staff_id=staff.id")
            ->where([
                'plan.begintime'=>['elt',time()],
                'plan.endtime'=>[['gt',time()],['EXP',Db::raw('is null')],'or'],
            ])
            ->select())->toArray();

        foreach($planList as $k=>$v){

            //获取计划中路线的巡检点
            $routesiteModel = new Routesite();
            $routsiteList = collection($routesiteModel
                ->alias("routesite")
                ->field("routesite.area_site_id,site.area_id")
                ->join("inspection_area_site site","routesite.area_site_id=site.id")
                ->where(['routesite.route_id'=>$v['route_id']])
                ->select())->toArray();


            foreach ($routsiteList as $vv){
                $data = $v;
                $data['area_site_id'] = $vv['area_site_id'];
                $data['area_id'] = $vv['area_id'];

                switch($v['circle_type']){
                    case "1":   //日计划
                        $this->circle_day($data);
                        break;
                    case "2":   //周计划
                        $this->circle_week($data);
                        break;
                    case "3":   //月计划

                        $this->circle_month($data);
                        break;
                }
            }

        }

    }


    private function circle_day($data){

        //获取巡检点信息
        $begin_time = strtotime(date("Y-m-d",time()));
        $data['begintime'] = $data['begintime']>$begin_time?$data['begintime']:$begin_time;
        $endtime = strtotime("+1 days -1 second",$begin_time);
        $data['endtime'] = empty($data['endtime'])?$endtime:($data['endtime']>$endtime?$endtime:$data['endtime']);
        $this->refresh_area($data);
    }

    private function circle_week($data){
        $week_days = $this->get_week();
        $circle_value_arr = explode(",",$data['circle_value']);
        for ($i=0;$i<count($circle_value_arr);$i++){
            if(date("Y-m-d") == $week_days[$circle_value_arr[$i]]){
                //获取巡检点信息
//                $begin_time = strtotime(date("Y-m-d",strtotime($week_days[$circle_value_arr[0]])));
//                $data['begintime'] = $data['begintime']>$begin_time?$data['begintime']:$begin_time;
//                $endtime = strtotime("+1 days -1 second",strtotime($week_days[end($circle_value_arr)]));

                //开始时间应该为当天的0点,结束时间应该为当天最后一秒
                $data['begintime'] = strtotime(date("Y-m-d"));
                $endtime = $data['begintime'] + 24*3600 - 1;

                $data['endtime'] = empty($data['endtime'])?$endtime:($data['endtime']>$endtime?$endtime:$data['endtime']);

                $this->refresh_area($data);
                break;
            }
        }

    }

    /**
     * 获取本周所有日期
     */
    private function get_week($time = '', $format='Y-m-d'){
        $time = $time != '' ? $time : time();

        //获取当前周几
        $week = date('w', $time);
        $week = $week == 0?7:$week;
        $date = [];
        for ($i=1; $i<=7; $i++){
            $date[$i] = date($format ,strtotime( '+' . $i-$week .' days', $time));
        }
        return $date;
    }

    /**
     * 获取本月日期
     * @param $date
     * @return array
     */
    private function  get_month($time="",$format='Y-m-d'){
        $time = $time != '' ? $time : time();
        //获取当前周几
        $week = date('d', $time);
        $date = [];
        for ($i=1; $i<=date('t'); $i++){
            $date[$i] = date($format ,strtotime( '+' . $i-$week .' days', $time));
        }
        return $date;
    }


    private function circle_month($data){
        $month_days = $this->get_month();

        $circle_value_arr = explode(",",$data['circle_value']);

        for ($i=0;$i<count($circle_value_arr);$i++){

            if(empty($month_days[$circle_value_arr[$i]])){
                continue;
            }
            if(date("Y-m-d") == $month_days[$circle_value_arr[$i]]){
                
                //获取巡检点信息
//                $begin_time = strtotime(date("Y-m-d",strtotime($month_days[$circle_value_arr[0]])));
//                $data['begintime'] = $data['begintime']>$begin_time?$data['begintime']:$begin_time;
//                if(empty($month_days[end($circle_value_arr)])){
//                    $endtime = strtotime("+1 days -1 second",strtotime(end($month_days)));
//                }else{
//                    $endtime = strtotime("+1 days -1 second",strtotime($month_days[end($circle_value_arr)]));
//                }

                //开始时间应该为当天的0点,结束时间应该为当天最后一秒
                $data['begintime'] = strtotime(date("Y-m-d"));
                $endtime = $data['begintime'] + 24*3600 - 1;
                
                $data['endtime'] = empty($data['endtime'])?$endtime:($data['endtime']>$endtime?$endtime:$data['endtime']);

                $this->refresh_area($data);
                break;
            }
        }


    }

    private function refresh_area($data){
        Db::startTrans();
        try{
//            $projectModel  = new \app\admin\model\inspection\Project();
//            $project = $projectModel->where(['plan_id'=>$data['plan_id'],'route_id'=>$data['route_id'],'area_id'=>$data['area_id'],'area_site_id'=>$data['area_site_id'],'endtime'=>['egt',$data['endtime']]])->find();
//            $project = $projectModel
//                ->where([
//                    'plan_id'=>$data['plan_id'],
//                    'route_id'=>$data['route_id'],
//                    'area_id'=>$data['area_id'],
//                    'area_site_id'=>$data['area_site_id'],
//                    'staff_id'=>$data['staff_id'],
//                    'endtime'=>['egt',$data['endtime']]
//                ])
//                ->find();
            if (!empty($data['exetimes'])){
                $timeArr = explode(',', $data['exetimes']);
                foreach ($timeArr as $time) {
                    $newData = [
                        'plan_id'=>$data['plan_id'],
                        'route_id'=>$data['route_id'],
                        'area_id'=>$data['area_id'],
                        'area_site_id'=>$data['area_site_id'],
                        'staff_id'=>$data['staff_id'],
                        'begintime'=>strtotime(date('Y-m-d',$data['begintime']) . ' ' . $time),
                    ];
                    //检查该任务是否存在
                    $find = Db::name('inspection_project')->field('id')->where($newData)->find();
                    if ($find){
                        continue;
                    }
                    $newData['endtime'] = $data['endtime'];
                    $newData['createtime'] = time();
                    $result = Db::name('inspection_project')->insert($newData);
                    if(empty($result)){
                        throw new Exception("巡检记录生成失败");
                    }
                }
            }
//                for($i=1;$i<=$data['num'];$i++){
//                    $projectModel  = new \app\admin\model\inspection\Project();
//                    $result = $projectModel->save([
//                        'plan_id'=>$data['plan_id'],
//                        'route_id'=>$data['route_id'],
//                        'area_id'=>$data['area_id'],
//                        'area_site_id'=>$data['area_site_id'],
//                        'begintime'=>$data['begintime'],
//                        'endtime'=>$data['endtime']]);
//                    if(empty($result)){
//                        throw new Exception("巡检记录生成失败");
//                    }
//                }
            Db::commit();
        }catch (Exception $e){
            Db::rollback();
            print_r($e->getMessage());
        }
    }

    /**
     * 获取下几个月的当天的日期
     * @param $begin_time
     * @param $month
     * @return false|int
     */
    private function getNextMonthDays($begin_time,$month)
    {
        $firstday = date('Y-m-01', $begin_time);
        $lastday = strtotime("$firstday +".($month+1)." month -1 day");
        $day_lastday = date('d', $lastday); //获取下个月份的最后一天
        $day_benlastday = date('d', strtotime("$firstday +1 month -1 day")); //获取本月份的最后一天

        //获取当天日期
        $Same_day = date('d', $begin_time);
        //判断当天是否是最后一天   或 下月最后一天 等于 本月的最后一天
        if ($Same_day == $day_benlastday || $day_lastday == $Same_day) {
            $day = $day_lastday;
        } else {
            $day = $Same_day;
        }

        $day = date('Y', $lastday) . '-' . date('m', $lastday) . '-' . $day." ".date("H:i:s",$begin_time);
        return strtotime($day);
    }
}