Project.php 7.4 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){

        $planModel = new Plan();
        $planList = collection($planModel
            ->alias("plan")
            ->field("plan.id as plan_id,plan.route_id,staff_id,plan.num,plan.time,plan.circle_type,plan.circle_value,plan.begintime,plan.endtime")
            ->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['staff_id'] = $v['staff_id'];
                $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)]));
                $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)]));
                }
                
                
                $data['endtime'] = empty($data['endtime'])?$endtime:($data['endtime']>$endtime?$endtime:$data['endtime']);

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


    }

    private function refresh_area($data){
        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();

            if(empty($project)){
                Db::startTrans();
                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'],
                        'staff_id'=>$data['staff_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){

            print_r($e->getMessage());
            Db::rollback();
        }
    }

    /**
     * 获取下几个月的当天的日期
     * @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);
    }
}