| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | <?phpnamespace App\Service;use App\Model\CalendarYear;use App\Model\CalendarYearDays;use Illuminate\Support\Facades\DB;class CalendarService extends Service{    public function createCalendar($year = 0){        if(empty($year)) $year = date("Y");        try {            DB::beginTransaction();            $year_model = CalendarYear::where('year',$year)->first();            if(empty($year_model)){                $year_model = new CalendarYear();                list($status, $msg) = $this->getHoliday($year);                $days_stamp = $this->generateTimestampsForYear($year,$msg);                if(! empty($days_stamp)){                    //子表更新                    CalendarYearDays::insert($days_stamp);                    $year_model->is_update_holidays = 1;                }                //主表更新                $year_model->year = $year;                $year_model->save();            }else{                if($year_model->is_update_holidays > 0) return [false, '已更新' . $year . '年的节假日信息'];                list($status, $msg) = $this->getHoliday($year);                if(empty($msg)) return [false, '未获取到'. $year . '年的节假日信息'];                CalendarYearDays::whereIn('time_stamp', array_keys($msg))->delete();                CalendarYearDays::insert(array_values($msg));            }            DB::commit();        }catch (\Throwable $exception){dd($exception->getMessage(),$exception->getLine());            DB::rollBack();            return [false, $exception->getMessage()];        }        return [true, ''];    }   function generateTimestampsForYear($year, $holidays){        // 创建一个 DateTime 对象,设置为当年的第一天        $date = new \DateTime("$year-01-01");        //设置时间到午夜        $date->setTime(0, 0, 0);        // 获取当年最后一天        $endOfYear = new \DateTime("$year-12-31");        // 创建一个空数组来保存时间戳        $timestamps = []; // 循环直到到达当年的最后一天        while ($date <= $endOfYear){           if(isset($holidays[$date->getTimestamp()])){               $t = $holidays[$date->getTimestamp()] ?? [];               $timestamps[] = [                   'time_stamp' => $date->getTimestamp(),                   'is_holiday' => $t['is_holiday'],                   'holiday_title' => $t['holiday_title']               ];           }else{               $timestamps[] = [                   'time_stamp' => $date->getTimestamp(),                   'is_holiday' => 0,                   'holiday_title' => ''               ];           }           $date->modify('+1 day');        }        return $timestamps;    }   function getHoliday($year){        $return = [];        $url = 'http://api.jiejiariapi.com/v1/holidays/' . $year;        list($status, $msg) = $this->get_helper($url);        if(! $status) return [false, $return];        if(! is_array($msg) || $msg == 'Year not found') return [false, $return];        foreach ($msg as $value){            $time =  strtotime($value['date'] . "00:00:00");            $return[$time] = [                'time_stamp' => strtotime($value['date'] . "00:00:00"),                'is_holiday' => $value['isOffDay'] ? 1 : 0,                'holiday_title' => $value['name']            ];        }        return [true, $return];   }    public function get_helper($url, $header=[], $timeout = 20){        $ch = curl_init();        curl_setopt_array($ch, array(            CURLOPT_URL => $url,            CURLOPT_RETURNTRANSFER => true,            CURLOPT_ENCODING => '',            CURLOPT_MAXREDIRS => 10,            CURLOPT_TIMEOUT => $timeout,            CURLOPT_FOLLOWLOCATION => true,            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,            CURLOPT_CUSTOMREQUEST => 'GET',            CURLOPT_SSL_VERIFYPEER => false,            CURLOPT_HTTPHEADER => $header,        ));        $r = curl_exec($ch);        if ($r === false) {            // 获取错误号            $errorNumber = curl_errno($ch);            // 获取错误信息            $errorMessage = curl_error($ch);            $message = "cURL Error #{$errorNumber}: {$errorMessage}";            return [false, $message];        }        curl_close($ch);        $return = json_decode($r, true);        return [true, $return];    }}
 |