ステージ1:cdrテーブルの構造とそこに格納されているものを調査します

次の分野に興味があります。
- srcはソースです。
- dstは宛先です。
- billsec-請求可能秒数(電話を拾った後の秒数);
- channel-使用されるチャネル。
- dstchannel-チャネルの方向。
- calldate-日付と時刻。
- uniqueid-一意の識別子。
- 気質-通話に何が起こったのか:回答済み、回答なし、ビジー、失敗。
- userfieldはフリーフィールドです。
ステージ2:独自のテーブルを作成します。
price_russia-ロシアの地域と価格のコードを含むテーブル。
CREATE TABLE IF NOT EXISTS `price_russia ` ( `code` int(10) NOT NULL COMMENT ' ', `cost` varchar(10) NOT NULL COMMENT '', `region` varchar(100) NOT NULL COMMENT '', UNIQUE KEY `code` (`code`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
price_international-国コードと価格の表。
CREATE TABLE IF NOT EXISTS ` price_international` ( `code` int(10) NOT NULL COMMENT ' ', `price` varchar(10) NOT NULL COMMENT '', `country` varchar(100) NOT NULL COMMENT '', UNIQUE KEY `code` (`code`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
クライアント-クライアントを含むテーブル。
CREATE TABLE IF NOT EXISTS `clients` ( `login` varchar(32) NOT NULL COMMENT '', `password` varchar(32) NOT NULL COMMENT '', `email` varchar(40) NOT NULL COMMENT 'Email', `rate` smallint(4) NOT NULL COMMENT '', UNIQUE KEY `login` (`login`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
*料金フィールドでは、クライアントに割引またはマークアップを与えることができます(90を書く-10%の割引を与える、110をセットする-10%のマークアップを得る)。
clients_ext-クライアントと拡張機能のマッピング。
CREATE TABLE IF NOT EXISTS `clients_ext` ( `login` varchar(32) NOT NULL, `ext` int(6) NOT NULL, UNIQUE KEY `ext` (`ext`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
呼び出し-処理された呼び出しを含むテーブル。
CREATE TABLE IF NOT EXISTS `calls` ( `uniqueid` varchar(32) NOT NULL, `date` datetime NOT NULL, `login` varchar(32) NOT NULL, `rate` bigint(10) NOT NULL, `ext` bigint(10) NOT NULL, `dst` bigint(20) NOT NULL, `src` bigint(20) NOT NULL, `type` varchar(20) NOT NULL, `minutes` int(10) NOT NULL, `seconds` int(100) NOT NULL, `cost` int(10) NOT NULL, `description` varchar(100) NOT NULL, UNIQUE KEY `uniqueid` (`uniqueid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
* type-コールタイプ(着信/発信)。
ステージ3:データ処理。
このスクリプトはスケジュールに従って実行されると想定されており、何も見逃さないように、スクリプト実行の開始時に、スクリプトの実行中に表示される可能性のある行のみを処理するために生の行をマークします:
mysql_query("UPDATE cdr SET userfield=`step1` WHERE userfield=``;");
最初に行うことは、次に関する情報をロードすることです。
1.クライアント、その拡張機能、グループ、および乗数。
function get_clients(){ // , . $query=mysql_query("SELECT rate,ext,login FROM clients, clients_ext WHERE clients_ext.login = clients.login"); while($row=mysql_fetch_assoc($query)){ $clients[$row['ext']]['rate']=$row['rate']; $clients[$row['ext']]['user']=$row['login']; } return $clients; }
2.ロシアの地域コード、説明、価格。
function get_price_russia(){ // $query=mysql_query("SELECT * FROM price_russia"); while($row=mysql_fetch_assoc($query)){ $price[$row['code']]['cost']=$row['price']; $price[$row['code']]['description']=$row['region']; } return $price; }
3.世界中の国コード、説明、価格。
function get_price_international(){ // . $query=mysql_query("SELECT * FROM price_international"); while($row=mysql_fetch_assoc($query)){ $price[$row['code']]['cost']=$row['price']; $price[$row['code']]['description']=$row['country']; } return $price; }
したがって、これを行います。
$clients=get_clients(); $price['russia']=get_price_russia(); $price['international']=get_price_international();
これで、データベースからマークされた行を選択して、処理を開始できます。
$query=mysql_query("SELECT * FROM cdr WHERE userfield=`step1`"); while($row=mysql_fetch_assoc($row)){ // }
実際に処理します
( , .)
。
呼び出しの方向を決定します。
function get_call_type($dst,$src){ $dst=strlen($dst); $src=strlen($src); if($scr<7 && $dst<7)$type='internal'; // . if($src<7 && $dst>=7)$type='outcoming'; // if($src>=7 && $dst<7)$type='incoming'; // return $type; } $type=get_call_type($row['dst'],$row['src']);
ここで、クライアントを決定できる拡張子を決定する必要があります。 内線はチャネルから抽出できます。cdrテーブルでは、これらは発信コールの「チャネル」フィールドと着信コールの「dstchannel」フィールドです。
function get_ext_from_channel($channel){ // ext channel $channel=split("/",$channel); $channel=split("-",$channel[1]); return($channel[0]); } switch ($type) { case 'internal': $ext=$row['src']; break; case 'incoming': $ext=get_ext_from_channel($row['dstchannel']); break; case 'outcoming': $ext=get_ext_from_channel($row['channel']); break; }
*正規表現を使用した方がよいことはわかっていますが、...
ここで、拡張機能が属するクライアントを決定します。
$login=$clients[$ext]['login']
および乗数
$rate=$clients[$ext]['rate']
秒を分に丸めます:
$minutes=ceil($row['billsec']/60);
コールが内線または着信の場合、価格をゼロに設定し、説明を空のままにできます。 それ以外の場合は、通話がどこに行ったかを判断する必要があります。
if($type=='outcoming'){ // . }else{ $cost=0; $description=0; }
通話料金を決定します。
// 8495 7 . function check_for_moscow($num){ if(strlen($num)==7)$num='8495'.$num; return $num; } $dst=check_for_moscow($row['dst']); // , . : 10. 11 - , - . function get_country_type($number){ if(strlen($number)<=11){ $return='russia'; }else{ $return='international'; } return $return; } $country=get_country_type($dst); $cost=''; $description=''; $i=1; // - (8xxx), 4 (810xxx) if($country=='international'){$s=3;}else{$s=1;} // , 9 - . 2-3 . while($cost==''){ $code=substr($dst,$s,$i); $cost=$price[$country][$code]['cost']; $description=$price[$country][$code]['description']; $i++; }
これで、テーブルへの呼び出しに関する情報を書き込むためのすべてができました。
mysql_query("INSERT INTO calls(uniqueid, date, login, rate, ext, dst, src, type, minutes, seconds, cost, description) VALUES ('$row[uniqueid]', '$row[calldate]', '$login', '$rate', '$ext', '$dst', '$row[src]', '$type', '$minutes', '$row[billsec]', '$cost', '$description')");
そして最後に、行を完全に処理された行としてマークします。
mysql_query("UPDATE cdr SET userfield=`done` WHERE userfield=`step1`");
上記はモスクワ近郊で書かれたものですが、別の都市や国に簡単に変換できます。
ソースへのリンク: 77.108.85.102/habr/import.php.txt、77.108.85.102/habr/functions.php.txt 、