forum.bitel.ru http://forum.bitel.ru/ |
|
Предлагаю модифицировать модуль bill http://forum.bitel.ru/viewtopic.php?f=14&t=2311 |
Страница 1 из 1 |
Автор: | lda [ 14 май 2009, 12:50 ] |
Заголовок сообщения: | Предлагаю модифицировать модуль bill |
При работе с модулем bill возникают некоторые сложности, предлагаю внести некоторые изменения: 1. При создании счетов и счет-фактур из сторонних программ, например из 1с, возникают проблемы из-за того что документ в биллинге создается асинхронно. Напрмер отправляю запрос: Код: module=bill&m=3&date=30.4.2009&action=GenerateBills&y=2009&
bills= <?xml version="1.0" encoding="windows-1251"?> <bills> <bill id="140" type="2" cid="36080" summ="95.94" account_id="1"> <pos name="Местные телефонные соединения за апрель" summ="95.94" position_id="2" quantity="1" unit="шт."> </pos> </bill> </bills>& И получаю ответ еще до того момента как счет создастся в базе. Вобщемто при решении стандартной задачи "создать счет и определить его id" возникают проблемы. Конечто перед определением id счета можно поставить задержку, но это прохой вариант. Такие проблемы не наблюдалисть с вер. 4.4 Предлагаю сделать создание счета синхронным, т.е. сервер не отвечает на запрос создания счета до тех пор пока счет не создаться в базе. 2. Почему поле "Количество" в позиции документа должно быть целым числом? Это наклатывает определенные ограничения, что неудобно. Проше сделать возможным указывать количество дробным числом. 3. Нумерация документов, это вообще беда... Зачем такие сложности с нумерацией? Почему бы не ввести просто поле номер документа? Пусть это поле генерируется автоматически по вашей логике, но необходимо дать возможность указать произвольный номер. У нас нумерация документов происходит в 1с-ке и потом приходится лесть в базу биллинга и править номер документа. Все это очень сложно и не удобно. Прошу разработчиков прислушаться к моим замечаниям, и сделать модуль bill более удобным в использовании. Спасибо. |
Автор: | Администратор [ 15 май 2009, 16:00 ] |
Заголовок сообщения: | |
1. Такого не должно быть. Нужен контрольный пример какой-нибудь, что вы делаете подробнее и как определяете, что счета нет. 2. В 4.6 оно может быть дробным. http://www.bgbilling.ru/v4.6/doc/ch10s0 ... l#d0e15327 Цитата: bill.pos.<код позиции>.qtynums=<число знаков после запятой для количества>
3. Беда, согласен. Просто редактировать номер дать не можем сейчас, т.к. номер генерируется из 3х других последовательных номеров. Будем что-нибудь придумывать с нумерацией. |
Автор: | lda [ 15 май 2009, 17:49 ] |
Заголовок сообщения: | |
Цитата: 2. В 4.6 оно может быть дробным. http://www.bgbilling.ru/v4.6/doc/ch10s0 ... l#d0e15327 3. Беда, согласен. Просто редактировать номер дать не можем сейчас, т.к. номер генерируется из 3х других последовательных номеров. Будем что-нибудь придумывать с нумерацией. Ок. Цитата: 1. Такого не должно быть. Нужен контрольный пример какой-нибудь, что вы делаете подробнее и как определяете, что счета нет.
С 1с-ой, насколько я понимаю, вы не дружите, сделал тестовый скрипт на перле: Код: #!/usr/bin/perl -w use strict; use LWP::UserAgent; use XML::Simple; use LWP::Simple; use Data::Dumper; use Encode; my $BGBURL = 'http://127.0.0.1:8080/bgbilling/executer?'; my $BGBUsername = '1c'; my $BGBPassword = 'password'; my $cid = '36080'; my $mid = '8'; my $mm = '4'; my $yy = '2009'; my $doc_type = '2'; my %h_new; $h_new{'module'} = 'bill'; $h_new{'action'} = 'GenerateBills'; $h_new{'mid'} = $mid; $h_new{'m'} = $mm-1; $h_new{'y'} = $yy; $h_new{'date'} = '1.'.$mm.'.'.$yy; $h_new{'bills'} = '<?xml version="1.0" encoding="windows-1251"?> <bills> <bill id="140" type="'.$doc_type.'" cid="'.$cid.'" summ="95.94" account_id="1"> <pos name="Местные телефонные соединения за апрель" summ="95.94" position_id="2" quantity="1" unit="шт."> </pos> </bill> </bills>'; my %h_get; $h_get{'module'} = 'admin'; $h_get{'action'} = 'SQLEditor'; $h_get{'page'} = '1'; $h_get{'pageSize'} = '1000000'; $h_get{'sql'} = "SELECT id FROM bill_data_$mid WHERE cid='$cid' AND type='$doc_type' AND mm='".($mm-1)."' AND yy='$yy'"; print "Ищем счет\n"; print Dumper(BGBPost(\%h_get)); print "Создаем счет\n"; print Dumper(BGBPost(\%h_new)); print "Ищем счет\n"; print Dumper(BGBPost(\%h_get)); ######################################################################## sub BGBPost{ my %data = %{$_[0]}; $data{'user'} = $BGBUsername; $data{'pswd'} = $BGBPassword; my $browser = LWP::UserAgent->new; my $response = $browser->post( $BGBURL , \%data); if ($response->content !~ /\<\?xml version\=\"1\.0\" encoding\=\"windows\-1251\"\?\>/){ #ошибка exit; }; my $xsimple = XML::Simple->new(); my $h = $xsimple->XMLin($response->content ,KeyAttr => { xml_id => 'id', xml_name => 'name', xml_key =>'key' }); if (defined($h) && exists($h->{'status'})){ $h = HashDecoder($h); }else{ }; return $h; } ######################################################################## sub Get{ my %data = %{$_[0]}; my $url = $BGBURL.'user='.$BGBUsername.'&pswd='.$BGBPassword.'&'; foreach (keys %data){ $url .= $_.'='.$data{$_}.'&'; }; my $xml_doc = get($url); my $xsimple = XML::Simple->new(); my $h = $xsimple->XMLin($xml_doc,KeyAttr => { xml_id => 'id', xml_name => 'name', xml_key =>'key' }); if (defined($h) && exists($h->{'status'})){ $h = HashDecoder($h); }else{ }; return $h; } ######################################################################## sub HashDecoder{ my $h = $_[0]; if (ref($h) eq "HASH"){ foreach (keys %$h){ $h->{$_} = HashDecoder($h->{$_}); }; return $h; }elsif (ref($h) eq "ARRAY"){ foreach (@$h){ $_ = HashDecoder($_); }; return $h; }else{ $h = Encode::encode('cp1251',$h); return $h; } } ######################################################################## Запускаю его не тестовом сервере. Вывод: Код: root@bgbilling:~/lda/test_bill# ./bill.pl Ищем счет $VAR1 = { 'status' => 'ok', 'table' => { 'head' => { 'record_count' => '0', 'column_count' => '1', 'row0' => { 'title' => 'id' }, 'pageCount' => '0' }, 'data' => {} } }; Создаем счет $VAR1 = { 'status' => 'ok' }; Ищем счет $VAR1 = { 'status' => 'ok', 'table' => { 'head' => { 'record_count' => '1', 'column_count' => '1', 'row0' => { 'title' => 'id' }, 'pageCount' => '1' }, 'data' => { 'row' => { 'row0' => '2154' } } } }; Как видно счет создался и я смог определить его id. Запускаю архивирование большого файла, что бы сервер работал под нагрузкой и запускаю скрипт. Получаю: Код: root@bgbilling:~/lda/test_bill# ./bill.pl
Ищем счет $VAR1 = { 'status' => 'ok', 'table' => { 'head' => { 'record_count' => '0', 'column_count' => '1', 'row0' => { 'title' => 'id' }, 'pageCount' => '0' }, 'data' => {} } }; Создаем счет $VAR1 = { 'status' => 'ok' }; Ищем счет $VAR1 = { 'status' => 'ok', 'table' => { 'head' => { 'record_count' => '0', 'column_count' => '1', 'row0' => { 'title' => 'id' }, 'pageCount' => '0' }, 'data' => {} } }; В этом случае я не смог определить id. |
Автор: | Администратор [ 19 май 2009, 12:37 ] |
Заголовок сообщения: | |
У вас случаем Slave база не подключена? |
Автор: | lda [ 19 май 2009, 12:39 ] |
Заголовок сообщения: | |
Нет. У нас версия биллинга 4.5. |
Автор: | Администратор [ 19 май 2009, 13:31 ] |
Заголовок сообщения: | |
http://bgbilling.ru/patch/bill.jar - положите в BGBillingServer/lib вместо существующего и прогоните снова ваш тест. |
Автор: | Администратор [ 19 май 2009, 13:45 ] |
Заголовок сообщения: | |
Перевыложил файл, по ошибке для 4.6 выложил. |
Автор: | lda [ 19 май 2009, 14:44 ] |
Заголовок сообщения: | |
Подменил библиотеку, заново прогнал тест несколько раз. Ничего не изменилось, время от времени я не могу получить id счета. Заметил такую особенность, если запустить тест после перезапуска сервера биллинга, то я всегда не могу определить id счета. |
Автор: | Администратор [ 19 май 2009, 15:09 ] |
Заголовок сообщения: | |
А попробуйте сделать запрос напрямую в БД, не через SQL Редактор. Вы перед каждым тестом удаляете счета договора? |
Автор: | Администратор [ 19 май 2009, 15:10 ] |
Заголовок сообщения: | |
Можно сделать еще, чтобы давало несколько запросов в БД? Какая задержка перед появлением записи? |
Автор: | lda [ 19 май 2009, 15:45 ] |
Заголовок сообщения: | |
Цитата: А попробуйте сделать запрос напрямую в БД, не через SQL Редактор. Переписал скрипт: Код: #!/usr/bin/perl -w use strict; use LWP::UserAgent; use XML::Simple; use LWP::Simple; use Data::Dumper; use Encode; use DBI; my $BGBURL = 'http://127.0.0.1:8080/bgbilling/executer?'; my $BGBUsername = '1c'; my $BGBPassword = 'Password'; my $DBUsername = 'root'; my $DBPassword = 'Password'; my $cid = '36080'; my $mid = '8'; my $mm = '4'; my $yy = '2009'; my $doc_type = '2'; my $db = DBI->connect('dbi:mysql:database=bgbilling;host=localhost;port=3306',$DBUsername,$DBPassword); if ($db){ $db->do('SET CHARACTER SET cp1251'); $db->do('SET NAMES cp1251'); }; my %h_new; $h_new{'module'} = 'bill'; $h_new{'action'} = 'GenerateBills'; $h_new{'mid'} = $mid; $h_new{'m'} = $mm-1; $h_new{'y'} = $yy; $h_new{'date'} = '1.'.$mm.'.'.$yy; $h_new{'bills'} = '<?xml version="1.0" encoding="windows-1251"?> <bills> <bill id="140" type="'.$doc_type.'" cid="'.$cid.'" summ="95.94" account_id="1"> <pos name="Местные телефонные соединения за апрель" summ="95.94" position_id="2" quantity="1" unit="шт."> </pos> </bill> </bills>'; my %h_get; $h_get{'module'} = 'admin'; $h_get{'action'} = 'SQLEditor'; $h_get{'page'} = '1'; $h_get{'pageSize'} = '1000000'; $h_get{'sql'} = "SELECT id FROM bill_data_$mid WHERE cid='$cid' AND type='$doc_type' AND mm='".($mm-1)."' AND yy='$yy'"; #print "Ищем счет\n"; #print Dumper(BGBPost(\%h_get)); my $res = Select( "Get bill", ">=0", "SELECT id FROM bill_data_$mid WHERE cid='$cid' AND type='$doc_type' AND mm='".($mm-1)."' AND yy='$yy'" ); print "Кол-во найденых счетов: ".$res->rows."\n"; print "Создаем счет\n"; print Dumper(BGBPost(\%h_new)); #print "Ищем счет\n"; #print Dumper(BGBPost(\%h_get)); $res = Select( "Get bill", ">=0", "SELECT id FROM bill_data_$mid WHERE cid='$cid' AND type='$doc_type' AND mm='".($mm-1)."' AND yy='$yy'" ); print "Кол-во найденых счетов: ".$res->rows."\n"; ######################################################################## sub Select{ my ($header, $condition, $SQL_QUERY) = @_; if (!$header) {return -1}; if (!$condition) {return -1}; if (!$SQL_QUERY) {return -1}; my $res = $db->prepare($SQL_QUERY); if (!$res->execute){ print("Error. Can't $SQL_QUERY"); print(DBI::errstr); }else{ my $ntuples = $res->rows; my $op = '$ntuples'."$condition"; my $condition_stat = eval $op; if (!$condition_stat){ print("Error result (ntuples: $ntuples, condition: $condition) for $SQL_QUERY"); }; }; return $res; } ######################################################################## sub BGBPost{ my %data = %{$_[0]}; $data{'user'} = $BGBUsername; $data{'pswd'} = $BGBPassword; my $browser = LWP::UserAgent->new; my $response = $browser->post( $BGBURL , \%data); if ($response->content !~ /\<\?xml version\=\"1\.0\" encoding\=\"windows\-1251\"\?\>/){ #ошибка exit; }; my $xsimple = XML::Simple->new(); my $h = $xsimple->XMLin($response->content ,KeyAttr => { xml_id => 'id', xml_name => 'name', xml_key =>'key' }); if (defined($h) && exists($h->{'status'})){ $h = HashDecoder($h); }else{ }; return $h; } ######################################################################## sub Get{ my %data = %{$_[0]}; my $url = $BGBURL.'user='.$BGBUsername.'&pswd='.$BGBPassword.'&'; foreach (keys %data){ $url .= $_.'='.$data{$_}.'&'; }; my $xml_doc = get($url); my $xsimple = XML::Simple->new(); my $h = $xsimple->XMLin($xml_doc,KeyAttr => { xml_id => 'id', xml_name => 'name', xml_key =>'key' }); if (defined($h) && exists($h->{'status'})){ $h = HashDecoder($h); }else{ }; return $h; } ######################################################################## sub HashDecoder{ my $h = $_[0]; if (ref($h) eq "HASH"){ foreach (keys %$h){ $h->{$_} = HashDecoder($h->{$_}); }; return $h; }elsif (ref($h) eq "ARRAY"){ foreach (@$h){ $_ = HashDecoder($_); }; return $h; }else{ $h = Encode::encode('cp1251',$h); return $h; } } ######################################################################## Результат: Код: root@bgbilling:~/lda/test_bill# ./bill2.pl Кол-во найденых счетов: 0 Создаем счет $VAR1 = { 'status' => 'ok' }; Кол-во найденых счетов: 0 Вобщем при обращении напрямую в базу практически всегда счет не успевает создаться. Цитата: Вы перед каждым тестом удаляете счета договора?
Удаляю когда накопится много счетов. Иначе неудобно смотреть. |
Автор: | Администратор [ 19 май 2009, 15:51 ] |
Заголовок сообщения: | |
Цитата: Вобщем при обращении напрямую в базу практически всегда счет не успевает создаться.
А через сколько появляется? У вас движок таблиц какой, ОС и файловая система? |
Автор: | lda [ 19 май 2009, 16:09 ] |
Заголовок сообщения: | |
Цитата: А через сколько появляется? Дописал скрипт: Код: #!/usr/bin/perl -w use strict; use LWP::UserAgent; use XML::Simple; use LWP::Simple; use Data::Dumper; use Encode; use DBI; my $BGBURL = 'http://127.0.0.1:8080/bgbilling/executer?'; my $BGBUsername = '1c'; my $BGBPassword = 'Password'; my $DBUsername = 'root'; my $DBPassword = 'Password'; my $cid = '36080'; my $mid = '8'; my $mm = '4'; my $yy = '2009'; my $doc_type = '2'; my $db = DBI->connect('dbi:mysql:database=bgbilling;host=localhost;port=3306',$DBUsername,$DBPassword); if ($db){ $db->do('SET CHARACTER SET cp1251'); $db->do('SET NAMES cp1251'); }; my %h_new; $h_new{'module'} = 'bill'; $h_new{'action'} = 'GenerateBills'; $h_new{'mid'} = $mid; $h_new{'m'} = $mm-1; $h_new{'y'} = $yy; $h_new{'date'} = '1.'.$mm.'.'.$yy; $h_new{'bills'} = '<?xml version="1.0" encoding="windows-1251"?> <bills> <bill id="140" type="'.$doc_type.'" cid="'.$cid.'" summ="95.94" account_id="1"> <pos name="Местные телефонные соединения за апрель" summ="95.94" position_id="2" quantity="1" unit="шт."> </pos> </bill> </bills>'; my %h_get; $h_get{'module'} = 'admin'; $h_get{'action'} = 'SQLEditor'; $h_get{'page'} = '1'; $h_get{'pageSize'} = '1000000'; $h_get{'sql'} = "SELECT id FROM bill_data_$mid WHERE cid='$cid' AND type='$doc_type' AND mm='".($mm-1)."' AND yy='$yy'"; #print "Ищем счет\n"; #print Dumper(BGBPost(\%h_get)); my $res = Select( "Get bill", ">=0", "SELECT id FROM bill_data_$mid WHERE cid='$cid' AND type='$doc_type' AND mm='".($mm-1)."' AND yy='$yy'" ); my $begin_count = $res->rows; print "Кол-во найденых счетов: $begin_count\n"; print "Создаем счет\n"; print Dumper(BGBPost(\%h_new)); my $begin_time = time; foreach my $i (1..1000000){ #print "Ищем счет\n"; #print Dumper(BGBPost(\%h_get)); $res = Select( "Get bill", ">=0", "SELECT id FROM bill_data_$mid WHERE cid='$cid' AND type='$doc_type' AND mm='".($mm-1)."' AND yy='$yy'" ); my $end_count = $res->rows; print "Шаг: $i Кол-во найденых счетов: $end_count\n"; if ($end_count != $begin_count){ my $end_time = time; print "Время поиска (сек.): ".($end_time-$begin_time)."\n"; last; }; }; ######################################################################## sub Select{ my ($header, $condition, $SQL_QUERY) = @_; if (!$header) {return -1}; if (!$condition) {return -1}; if (!$SQL_QUERY) {return -1}; my $res = $db->prepare($SQL_QUERY); if (!$res->execute){ print("Error. Can't $SQL_QUERY"); print(DBI::errstr); }else{ my $ntuples = $res->rows; my $op = '$ntuples'."$condition"; my $condition_stat = eval $op; if (!$condition_stat){ print("Error result (ntuples: $ntuples, condition: $condition) for $SQL_QUERY"); }; }; return $res; } ######################################################################## sub BGBPost{ my %data = %{$_[0]}; $data{'user'} = $BGBUsername; $data{'pswd'} = $BGBPassword; my $browser = LWP::UserAgent->new; my $response = $browser->post( $BGBURL , \%data); if ($response->content !~ /\<\?xml version\=\"1\.0\" encoding\=\"windows\-1251\"\?\>/){ #ошибка exit; }; my $xsimple = XML::Simple->new(); my $h = $xsimple->XMLin($response->content ,KeyAttr => { xml_id => 'id', xml_name => 'name', xml_key =>'key' }); if (defined($h) && exists($h->{'status'})){ $h = HashDecoder($h); }else{ }; return $h; } ######################################################################## sub Get{ my %data = %{$_[0]}; my $url = $BGBURL.'user='.$BGBUsername.'&pswd='.$BGBPassword.'&'; foreach (keys %data){ $url .= $_.'='.$data{$_}.'&'; }; my $xml_doc = get($url); my $xsimple = XML::Simple->new(); my $h = $xsimple->XMLin($xml_doc,KeyAttr => { xml_id => 'id', xml_name => 'name', xml_key =>'key' }); if (defined($h) && exists($h->{'status'})){ $h = HashDecoder($h); }else{ }; return $h; } ######################################################################## sub HashDecoder{ my $h = $_[0]; if (ref($h) eq "HASH"){ foreach (keys %$h){ $h->{$_} = HashDecoder($h->{$_}); }; return $h; }elsif (ref($h) eq "ARRAY"){ foreach (@$h){ $_ = HashDecoder($_); }; return $h; }else{ $h = Encode::encode('cp1251',$h); return $h; } } ######################################################################## Вывод: Код: Кол-во найденых счетов: 0 Создаем счет $VAR1 = { 'status' => 'ok' }; Шаг: 1 Кол-во найденых счетов: 0 Шаг: 2 Кол-во найденых счетов: 0 Шаг: 3 Кол-во найденых счетов: 0 Шаг: 4 Кол-во найденых счетов: 0 Шаг: 5 Кол-во найденых счетов: 0 ... Шаг: 21441 Кол-во найденых счетов: 0 Шаг: 21442 Кол-во найденых счетов: 0 Шаг: 21443 Кол-во найденых счетов: 0 Шаг: 21444 Кол-во найденых счетов: 0 Шаг: 21445 Кол-во найденых счетов: 1 Время поиска (сек.): 3 Иногда время поиска счета доходит до 5 сек. Цитата: У вас движок таблиц какой, ОС и файловая система?
Движек: MyISAM ОС: Slackware 12 FS: ext3 |
Автор: | lda [ 01 июн 2009, 16:04 ] |
Заголовок сообщения: | |
up |
Автор: | Администратор [ 10 июн 2009, 11:32 ] |
Заголовок сообщения: | |
Доступ ССШ организуете? Будем смотреть на месте что и как.. По коду понять не могу, в чем дело. |
Автор: | lda [ 10 июн 2009, 11:55 ] |
Заголовок сообщения: | |
да, организуем, но только на следующей неделе. Все данные пришлю в личку. |
Автор: | Администратор [ 10 июн 2009, 13:01 ] |
Заголовок сообщения: | |
Ок, жду. Там же скрипт ваш положите, плз.. |
Автор: | Администратор [ 16 июн 2009, 11:40 ] |
Заголовок сообщения: | |
Обновление выложено. Тема закрыта. |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |