function range_array_unique($outage_times) { foreach ($outage_times as $key => $value) { foreach ($outage_times as $i => $v) { if ($i >= $key) { break; } if ($value[0] >= $outage_times[$i][0] && $value[0] <= $outage_times[$i][1]) { //起始點已重複 if ($value[1] > $outage_times[$i][1]) { //結束點未重複 $outage_times[$i][1] = $value[1]; unset($outage_times[$key]); return range_array_unique($outage_times); } else { //結束點亦重複 unset($outage_times[$key]); } } else { if ($value[1] >= $outage_times[$i][0] && $value[1] <= $outage_times[$i][1]) { //結束點已重複 if ($value[0] < $outage_times[$i][0]) { //起始點未重複 $outage_times[$i][0] = $value[0]; unset($outage_times[$key]); return range_array_unique($outage_times); } else { //起始點亦重複 unset($outage_times[$key]); } } } } } return $outage_times; }
/** * 更新總使用時數與到期日 * * @return */ public function update($user_ID, $facility_ID) { //先找尋上下關係的儀器 $facility_IDs = $this->facility_model->get_vertical_group_facilities($facility_ID, array("facility_only" => TRUE, "no_child" => TRUE)); //再尋找水平關係 $facility_IDs = array_merge($facility_IDs, $this->facility_model->get_horizontal_group_facilities($facility_ID)); //UNIQUE $facility_IDs = array_unique($facility_IDs); foreach ($facility_IDs as $facility_ID) { //取得此儀器權限 $privileges = $this->facility_model->get_user_privilege_list(array("user_ID" => $user_ID, "facility_ID" => $facility_ID))->result_array(); foreach ($privileges as $privilege) { $temp_facility_IDs = $this->facility_model->get_vertical_group_facilities($privilege['facility_ID'], array("facility_only" => TRUE)); $temp_facility_IDs = array_merge($temp_facility_IDs, $this->facility_model->get_horizontal_group_facilities($privilege['facility_ID'])); //(先取得過往的預約紀錄,找出最近一次的預約紀錄,加上延展時間) $old_booking = $this->facility_model->get_facility_booking_list(array("user_ID" => $privilege['user_ID'], "facility_ID" => $temp_facility_IDs))->row_array(); if (!$old_booking) { $old_booking['end_time'] = $privilege['verification_time']; } //尋找停機記錄 $outage_total_time = 0; do { //漸進式尋找真正到期日 $old_expiration_date = date("Y-m-d H:i:s", strtotime($old_booking['end_time']) + $privilege['extension_sec'] + $outage_total_time); $outages = $this->facility_model->get_outage_list(array("facility_SN" => $temp_facility_IDs, "outage_start_time" => $old_booking['end_time'], "outage_end_time" => $old_expiration_date))->result_array(); $outage_times = array(); foreach ($outages as $outage) { if (empty($outage['outage_end_time'])) { continue; } $outage_times[] = array(strtotime($outage['outage_start_time']), strtotime($outage['outage_end_time'])); } $outage_times = range_array_unique($outage_times); $outage_total_time = 0; foreach ($outage_times as $o_time) { $outage_total_time += $o_time[1] - $o_time[0]; } $expiration_date = date("Y-m-d H:i:s", strtotime($old_booking['end_time']) + $privilege['extension_sec'] + $outage_total_time); } while ($old_expiration_date != $expiration_date); //(最後更新資料) $this->facility_model->update_user_privilege(array("serial_no" => $privilege['serial_no'], "expiration_date" => $privilege['privilege'] == 'super' || $privilege['privilege'] == 'admin' || empty($privilege['extension_sec']) ? NULL : $expiration_date, "total_secs_used" => $this->get_total_secs_used($privilege['user_ID'], $privilege['facility_ID']))); } } }