Тарификация в Базу Данных
Материал из М-200 WIKI
- Сторона АТС (кроме УК серии СС)
- ПО узла коммутации серии СС
- Сторона оператора
- Тарификация
Ниже описаная процедура расскажет о том как сделать Web интерфейс для поиска по базе данных тарификации.
Для разработки и проверки использовались:
- Debian Linux 5.03
Программное обеспечение
- apache2
- mysql-server-5.0
- libapache2-mod-php5
- php5
- php5-cli
- php5-mysql
Скрипты написанные на PHP:
- db_connector.php
- text_db.php
- echo_db.php
Для начала нужно создать таблицу в базе данных со структурой указанной ниже:
CREATE DATABASE IF NOT EXISTS lab_db;
USE lab_db;
CREATE TABLE `lab_db`.`kungur` (
`id` double NOT NULL auto_increment,
`numer_a` char(8) character set utf8 default NULL,
`aon_a` char(20) character set utf8 default NULL,
`soed` char(8) character set utf8 default NULL,
`numer_b` char(20) character set utf8 default NULL,
`date` char(9) character set utf8 default NULL,
`time` char(9) character set utf8 default NULL,
`prodol` char(8) character set utf8 default NULL,
`prichina` char(3) character set utf8 default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Здесь lab_db - имя базы данных, kungur - имя таблицы
затем правим файл db_connector.php, и сохраняем его в web директорию вашего сервера:
db_connector.php
<?
//Соединение с БД
$host='localhost'; // адрес сервера БД MySQL
$user='root'; // имя пользователя базы данных
$password='lab'; // пароль к базе данных
mysql_connect($host, $user, $password);
mysql_select_db('lab_db'); // имя базы данных
?>
IP базы данных, имя и пароль пользователя БД, имя самой БД правьте под свои нужды.
далее сохраняем нижний текст в файл text_db.php в директорию доступную вашему демону Cron
<?
include './db_connector.php';
//в имя файла включена вчерашняя дата
$filename='cdr_log_'.date("d_m_Y", time()-3600*24).'.log';
//проверяем наличие файла, иначе вообще ничего не делаем
//чтоб в бд не попали пустые строки
if (file_exists($filename)) {
$file = fopen("/home/ftp/tarif/$argv[1]/$filename", "r");
while (!feof($file)) {
//каждую итерацию строка из файла в переменную $string
$string = fgets($file);
$num_prob = substr_count($string,' ');//кол-во пробелов
//начало подцикла перебора пробелов внутри строки
//массив $str_pos хранит позицию пробелов в строке
if (!feof($file)) {
for ($i=1;$i<=$num_prob+1;$i++) {
if ($i==1) {$str_pos[$i] = strpos ( $string , ' ' , 1);
$numer_a=substr($string, 1, $str_pos[$i]-1);
}
else
{
$str_pos[$i] = strpos ( $string , " " , $str_pos[$i-1]+1);
$next=substr($string , $str_pos[$i-1]+1, $str_pos[$i]-$str_pos[$i-1]-1 );
switch($i) {
case 2: $aon_a=$next;;
case 3: $soed=$next;
case 4: $numer_b=$next;
case 5: $date=$next;
case 6: $time=$next;
case 7: $prodol=$next;
case 8: $prichina=(substr($string , $str_pos[$i-1]+1,strlen($string)-$str_pos[$i-1]+1))-"\n";
}
}
}
// конец вычисления позиций пробелов
}
//сюда по результатам вычислений SQL запрос
if (!feof($file))
mysql_query("INSERT INTO $argv[1] (numer_a,aon_a,soed,numer_b,date,time,prodol,prichina) VALUES ('$numer_a','$aon_a','$soed','$numer_b','$date','$time','$prodol','$prichina')" );
//конец основного цикла
} fclose($file); }//конец проверки наличия файла
?>
Запускать такой скрипт нужно с параметром следующим через пробел сразу за именем скрипта:
php text_db.php kungur
,где kungur имя таблицы в базе данных lab_db.
На практике этот сценарий обычно запускает демон Cron в 8 часов утра.
Скрипт вычисляет вчерашнюю дату, читает файл и переписывает его в таблицу базы данных MySQL.
Если формат названия тарификационного файла отличается от cdr_log_01_03_2010.log, то строку $filename='cdr_log_'.date("d_m_Y", time()-3600*24).'.log';
нужно откоректировать согласно вашим требованиям.
Строка
$file = fopen("/home/ftp/tarif/$argv[1]/$filename", "r");
Содержит путь к вашему файлу тарификации, где $argv[1] - первый параметр передаваемый скрипту.
т.е /home/ftp/tarif/kungur/имя файла
Учтите что скрипт расчитан на обработку файла формата Тариф 2004
Альтернатиная программа записывающая тарификацию в Базу данных DBWriter
далее сохраняем нижний текст в файл echo_db.php в Web директорию вашего сервера
<?
echo '<meta http-equiv="content-type" content="text/html;charset=utf-8">';
//перехват значений из $_GET
//инициализация переменных
$page=$_GET["page"];
$ip = $_SERVER["REMOTE_ADDR"];
$numer_a=$_GET["numer_a"];//номер абонента а
$aon_a=$_GET["aon_a"]; //аон абонента а
$soed=$_GET["soed"]; //с кем соединен
$numer_b=$_GET["numer_b"];//номер абонента b
$date=$_GET["date"]; // Дата
$time=$_GET["time"]; // Время
$ili=$_GET["ili"]; //радиокнопка
$currdate=date("d-m-y"); //сегодняшняя дата
$currtime=date("H:i:s"); //текущее время
$instruction=0; //печатать ли инструкцию по пользованию БД
$count_numer_a=0;
$ip_massive=Array('10.91.128.249'=>'kungur','10.91.128.230'=>'kungur','10.91.128.250'=>'kungur'
, '10.91.128.252'=>'kungur','127.0.0.1'=>'kungur', '10.91.128.174'=>'orda'
, '10.91.128.175'=>'orda' , '10.91.128.176'=>'orda' , '10.86.32.147'=>'kishert');
if ($page=="") foreach ($ip_massive as $k=>$v) if ($k==$ip) $page=$v;
if ($page=="") $page="kungur"; //если нет определения по ip, то Кунгурскую базу отобразить
//Описание Направлений
#########################################
# Из идентификатора направлений читается только 6 символов
# Например: С01051, где 01 - первый модуль (МЦК),
# 5 - указатель того что используется цифровой поток,
# 1 - номер потока в модуле
# Другой пример: C08013, где 08 - восьмой модуль,
# 13 - номер платы (в данном случае С68)
#
# Номера каналов не читаем
# Следующий ниже массив составить нужно исходя их этих условий.
if ($page=="kungur") {
$table="kungur"; //указатель с какой таблицей БД работать
$header="Кунгур"; //Указатель какой город встаривать в заголовок страницы
$route_name = Array('C01051'=>'Кунгур','C01052'=>'Кунгур','C02053'=>'Кунгур', 'C05051'=>'Кунгур','C08012'=>'Шадейка','C08013'=>'Шадейка','C09013'=>'Насадка','C10013'=>'Кинделино', 'C12013'=>'Бым','C13013'=>'Ергач','C14013'=>'Голдыревский','C15013'=>'Семсовхоз', 'C16013'=>'Кыласово','C17013'=>'Троельга','C05052'=>'Калинино','C05056'=>'Бырма','C05057'=>'Серга');
}
if ($page=="orda") {
$table="orda"; //указатель с какой таблицей БД работать
$header="Орда"; //Указатель какой город встаривать в заголовок страницы
$route_name = Array('C01051'=>'Межгород','C01052'=>'Межгород','C01056'=>'Межгород','C02051'=>'Шляпники','C02052'=>'Медянка', 'C02055'=>'Налоговая','C17013'=>'Кр.Ясыл','C18013'=>'М.Ашап');
}
if ($page=="kishert") {$table="kishert";//указатель с какой таблицей БД работать
$header="Кишерть"; //Указатель какой город встаривать в заголовок страницы
$route_name = Array('C01052'=>'Черный Яр', 'C01054'=>'Посад', 'C01057'=>'2ВСК Шлюз', 'C02051'=>'Межгород', 'C02052'=>'Межгород', 'C02053'=>'Шлюз', 'C02054'=>'Шлюз', 'C02055'=>'Шлюз', 'C02056'=>'Шлюз', 'C02057'=>'2ВСК Шлюз', 'C05051'=>'Шлюз', 'C05053'=>'Межгород', 'C07013'=>'Спасо-Барда', 'C08013'=>'Шумково', 'C08052'=>'Медведево', 'C09013'=>'Осинцево', 'C10013'=>'Кордон');
}
echo "<head><title> Тарификация М200 - $header </title></head>";include "./db_connector.php";
//Проверяем содержимое заполненных полей
//Если в поле ввода есть названия направления из массива $route_name
//значит в переменную запроса надо подставить номер направлени из того же массива
foreach ($route_name as $k=>$v){ if ($numer_a == $v) {$numer_a=$k; $count_numer_a++;
}
if ($soed == $v) {$soed=$k;$count_soed++;}
##############################################
//Отладка
//echo $count_numer_a;
//echo $numer_a;
##############################################
}
//Если : условия выше не исполнены то счетчики равны нулю.
// : поля $numer или $soed заполнены
// ==> Следовательно ищем номер, для запроса в БД нужно подставить
//иденитификатор "A"
if ($count_numer_a<1 and $numer_a<>) $numer_a='A'.$numer_a;
if ($count_soed<1 and $soed<>) $soed='A'.$soed;
//формирование запроса согласно заполенным полям//Прогоняем массив полей для составления запроса
//с учетом заполненности полейif ($ili<>) {
$count=0;
$massivepolei = Array('numer_a'=>$numer_a,'aon_a'=>$aon_a,'soed'=>$soed,'numer_b'=>$numer_b,'date'=>$date,'time'=>$time);
foreach ($massivepolei as $k=>$v){
if ($v<>and $count>=1) {$query.=" $ili "; #встраивание в запрос OR или AND
}
if ($v!==) {$query.="$k LIKE '$v%'"; $count++; }
}}
################################################################
#Отладка
#echo "$query</br>";// для просмотра запроса раскоментировать
##############################################################//
//Посылка запроса в БД, если он не пустой т.е сформирован
if ($query<>'') {
$result = mysql_query("select * from $table where $query");
$numrow = mysql_num_rows($result);
}
//таблица вывода данных
//включает в себя форму с радиокнопками, кнопкой запроса и полями ввода
echo "<table border='0' width=100%>
<form action='echo_db.php' method='get' target='_self' style='margin:1'>
<tr bgcolor='c6d4dc'><td colspan=7>
<INPUT TYPE=RADIO NAME=ili VALUE='and' CHECKED>И
<INPUT TYPE=RADIO NAME=ili VALUE='or' >ИЛИ<input type='submit' name='Поиск' value='Запрос'></td>
</tr>
<tr bgcolor='c6d4dc'>
<td><input type='text' name='numer_a' size='9'></td>
<td><input type='text' name='aon_a' size='9'></td>
<td><input type='text' name='soed' size='9'></td>
<td><input type='text' name='numer_b' size='9'></td>
<td><input type='text' name='date' size='9'></td>
<td><input type='text' name='time' size='9'></td>
<input type='hidden' name='page' value=$page>
<td></td>
</tr>
</form>
<tr bgcolor='c6d4dc'><td>Абонент А</td>
<td>АОН</td>
<td>Соединен</td>
<td>Абонент Б</td>
<td>Дата</td>
<td>Время</td>
<td>Длит</td>
</tr>";//цикл вывода
for ($i=0;$i<$numrow;$i++) {
$row=mysql_fetch_array($result);//резултат запроса БД в ассоциативный массив
//проверяем есть ли в "numer_a" и "soed" признак "А"-абонента,
// если есть вырезаем для коректногоотображения
if (substr($row["numer_a"],0,1)=='A') $row["numer_a"]=substr($row["numer_a"],1,strlen($row["numer_a"]));
if (substr($row["soed"],0,1)=='A') $row["soed"]=substr($row["soed"],1,strlen($row["soed"]));
//проверяем есть ли в "numer_a" и "soed" признак "C"- канала,
// если есть то нужно изменить на название направления
if (substr($row["numer_a"],0,1)=='C') foreach ($route_name as $k=>$v){
if (substr($row["numer_a"],0,6)==$k) $row["numer_a"]=$v;
}
if (substr($row["soed"],0,1)=='C') foreach ($route_name as $k=>$v){
if (substr($row["soed"],0,6)==$k) $row["soed"]=$v;
}
//четность $i для раскраски полей
$chetnechet=$i%2;
if ($chetnechet==0) $color='f0f2f8'; else $color='f0f9f1';
//$row возврат запроса в массив
echo "<tr bgcolor=$color>
<td>";echo$row["numer_a"];echo"</td>
<td>";echo$row["aon_a"] ;echo"</td>
<td>";echo$row["soed"] ;echo"</td>
<td>";echo$row["numer_b"];echo"</td>
<td>";echo$row["date"] ;echo"</td>
<td>";echo$row["time"] ;echo"</td>
<td>";echo$row["prodol"];echo"</td>";
echo" </tr>";}
// если запрос пустой распечатать инструкцию по пользованию БД
if ($page=="kungur") $begindate="14 декабря 2009";
if ($page=="orda") $begindate="14 декабря 2009";
if ($page=="kishert") $begindate="24 февраля 2010";
if ($query=='') echo "<tr bgcolor='f0f2f8'><td colspan='7' ></br>Запросы допускаются не полные, например:</br>
если ввести в поле Абонент Ацифры 21, то поиск в базе данных будет происходить,</br>
по диапазону номеров 21000-21999</br>
Дата вводится в формате : $currdate - (число-месяц-год)</br>
Время вводится в формате: $currtime - (час:минуты:секунды)</br>
Дату и время так же можно вводить не полностью</br>
Рекомендуется для сокращения времени ответа на запрос указывать день месяца.</br></br>
<center><b>Запись ведется с $begindate года.</b></center>
</td></tr>";
echo "</table>";
//конец таблицы вывода
?>
Скрипт читает информацию о тарификации с трех таблиц базы данных. Анализирует IP - адрес компьютера
оператора АТС , который просматривает базу, на ту и переключает присваивая переменной $page одно из иначений.
$ip_massive хранит список IP адресов операторов трех АТС, смените их на свои значения.
В комментариях скрипта описано каким образом составлять массив $route_name перепишите его согласно названию направлений в вашей АТС М-200
Зайдите на сервер http://localhost/echo_db.php
Будет выведена страница с полями ввода для запроса.
