From 01708f1372116efb1c0fdbe86c4a939c80e37ca1 Mon Sep 17 00:00:00 2001 From: uralm1 Date: Mon, 18 Apr 2022 11:35:21 +0500 Subject: [PATCH] Fix #6 - transliterate yo to e everywhere --- CHANGELOG.md | 5 +- MANIFEST.SKIP | 1 + lib/Adup/Task/Preprocess.pm | 13 +++++ lib/Adup/Ural/FlatGroupNamingAI.pm | 4 +- lib/Adup/Ural/ZupLoader.pm | 18 ++++++- t2/preprocess.pl | 76 +++++++++++++++++------------- 6 files changed, 81 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4f9b03..7bfb469 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,11 @@ All notable changes to this project will be documented in this file. ## [Unreleased] + +## [1.22] - 2022-04-18 +- Исправление проблем с буквами 'Ёё' в именах сотрудников и наименованиях подразделений. - Исправление ошибки с дедубликацией сотрудников. -- Более подробные ошибки при загрузке из 1С ЗУП для диагностики проблем на стороне 1С. +- Более подробные ошибки в логе при загрузке из 1С ЗУП для диагностики проблем на стороне 1С. ## [1.21] - 2022-01-28 - Значение аттрибута организация сделано настраиваемым через конфигурационный файл. diff --git a/MANIFEST.SKIP b/MANIFEST.SKIP index 759be11..b3ea3a6 100644 --- a/MANIFEST.SKIP +++ b/MANIFEST.SKIP @@ -1,6 +1,7 @@ \badup.conf$ \btest.conf$ \.pem$ +\bodata.epf$ #!start included /usr/share/perl/5.30/ExtUtils/MANIFEST.SKIP # Avoid version control files. diff --git a/lib/Adup/Task/Preprocess.pm b/lib/Adup/Task/Preprocess.pm index 686aae3..d5902af 100644 --- a/lib/Adup/Task/Preprocess.pm +++ b/lib/Adup/Task/Preprocess.pm @@ -76,6 +76,9 @@ sub _process_dbf { # split fio $fio = decode('cp866', $fio); + # fix ё in fio + _fix_eE($fio); + my ($fio_f, $fio_i, $fio_o); if ($fio =~ m/^\s*(\S+)\s*(\S*)\s*\b(.*)\b\s*$/) { # we have to do it to reset $N vars $fio_f = "\u\L$1"; @@ -95,6 +98,10 @@ sub _process_dbf { $otdel = decode('cp866', $otdel); + # fix ё in otdel, dolj + _fix_eE($otdel); + _fix_eE($dolj); + # flatdept dedup unless (exists $flatdept_dedup_h{$otdel}) { $flatdept_dedup_h{$otdel} = $flatdept_id_gen_val; @@ -265,5 +272,11 @@ sub process_dept_a { } +# internal +sub _fix_eE { + $_[0] =~ tr/ёЁ/еЕ/; +} + + 1; __END__ diff --git a/lib/Adup/Ural/FlatGroupNamingAI.pm b/lib/Adup/Ural/FlatGroupNamingAI.pm index f722504..dc23725 100644 --- a/lib/Adup/Ural/FlatGroupNamingAI.pm +++ b/lib/Adup/Ural/FlatGroupNamingAI.pm @@ -43,7 +43,7 @@ sub flatgroup_ai { s/^Служба Северного комплекса водопроводных сооружений-Ремонтно-механический участок/Служба СКВС-РМУ/ || s/^Служба Северного комплекса водопроводных сооружений-Участок Шакшинского водопровода/Служба СКВС-Участок ШВ/ || s/^Служба Северного комплекса водопроводных сооружений-Химико-бактериологическая лаборатория/Служба СКВС-ХБЛ/ || - s/^Служба Северного комплекса водопроводных сооружений-Участок 2-го подъёма инфильтрационного водозабора/Служба СКВС-Участок 2ПИВ/ || + s/^Служба Северного комплекса водопроводных сооружений-Участок 2-го подъ[ёе]ма инфильтрационного водозабора/Служба СКВС-Участок 2ПИВ/ || s/^Служба Северного комплекса водопроводных сооружений-Цех Изякского водопровода/Служба СКВС-Цех ИВ/ || s/^Служба Северного комплекса водопроводных сооружений-Цех очистных сооружений водопровода/Служба СКВС-Цех ОСВ/ || s/^Служба Северного комплекса водопроводных сооружений/Служба СКВС/ || @@ -59,7 +59,7 @@ sub flatgroup_ai { s/^Управление Южных канализационных сетей/УЮКС/ || s/^Управление по эксплуатации систем водоотведения и водоснабжения/Управление по эксплуатации систем ВО и ВС/ || - s/^Служба Южного комплекса водопроводных сооружений-Участок Демского водопровода/Служба ЮВС-Участок ДВ/ || + s/^Служба Южного комплекса водопроводных сооружений-Участок Д[ёе]мского водопровода/Служба ЮВС-Участок ДВ/ || s/^Служба Южного комплекса водопроводных сооружений-Цех Южного водопровода/Служба ЮВС-Цех ЮВ/ || s/^Служба Южного комплекса водопроводных сооружений/Служба ЮВС/ || diff --git a/lib/Adup/Ural/ZupLoader.pm b/lib/Adup/Ural/ZupLoader.pm index 1bd4a6e..6a7e2b1 100644 --- a/lib/Adup/Ural/ZupLoader.pm +++ b/lib/Adup/Ural/ZupLoader.pm @@ -236,6 +236,11 @@ sub process_data { my $otdel_hierarhy = _unwind_hierarhy($pod_key, $_pod); # this also mark depts as used my $otdel = join('\\', @$otdel_hierarhy) // ''; + # fix ё in fio, dolj, otdel + _fix_eE($fio); + _fix_eE($dolj); + _fix_eE($otdel); + # split fio my ($fio_f, $fio_i, $fio_o); if ($fio =~ m/^\s*(\S+)\s*(\S*)\s*\b(.*)\b\s*$/) { # we have to do it to reset $N vars @@ -333,11 +338,16 @@ sub process_data { $level++; } until _zero_key($pk); } + + # fix ё in departments names + my $dept_name = $_->{Description}; + _fix_eE($dept_name); + $e = eval { $self->get_db->query("INSERT INTO depts (id, name, level, parent) \ VALUES(?, ?, ?, ?)", $_->{_id}, - $_->{Description}, + $dept_name, $level, $parent ); @@ -507,4 +517,10 @@ sub _fix_pluses_in_url { } +# internal, not a method +sub _fix_eE { + $_[0] =~ tr/ёЁ/еЕ/; +} + + 1; diff --git a/t2/preprocess.pl b/t2/preprocess.pl index 78deab2..40be6ae 100755 --- a/t2/preprocess.pl +++ b/t2/preprocess.pl @@ -30,10 +30,12 @@ my $dbf = eval { new XBase($cfg->{galdb_temporary_file}); }; if (defined $dbf) { - my $e = eval { + my $e = eval { $db_adup->query("DELETE FROM persons"); $db_adup->query("DELETE FROM depts"); $db_adup->query("DELETE FROM flatdepts"); + $db_adup->query("TRUNCATE _fio_dedup"); + $db_adup->query("TRUNCATE _fio_otd_dedup"); }; unless (defined $e) { _setstate($db_adup, 0); @@ -43,8 +45,6 @@ my $loaded_cnt = 0; my %path_id_h; my %id_dept_h; - my %fio_dedup_h; - my %fio_otd_dedup_h; my $id_gen_val = 1; my %flatdept_dedup_h; my $flatdept_id_gen_val = 1; @@ -57,12 +57,15 @@ ### 1.begin of persons loop ### # for (0 .. $last_record) { - my ($deleted, $id, $fio, $otdel, $dolj, $tabn) = + my ($deleted, $id, $fio, $otdel, $dolj, $tabn) = $dbf->get_record($_, 'ID', 'FIO', 'OTDEL', 'DOLJ', 'TABN'); unless ($deleted) { # split fio $fio = decode('cp866', $fio); + # fix ё in fio + _fix_eE($fio); + my ($fio_f, $fio_i, $fio_o); if ($fio =~ m/^\s*(\S+)\s*(\S*)\s*\b(.*)\b\s*$/) { # we have to do it to reset $N vars $fio_f = "\u\L$1"; @@ -82,20 +85,9 @@ $otdel = decode('cp866', $otdel); - # fio dedup (and then dedup by fio+otdel) - if (exists $fio_dedup_h{$fio}) { - # fio+otdel - my $fio_otd = join('', $fio, $otdel); - if (exists $fio_otd_dedup_h{$fio_otd}) { - #$fio_otd_dedup_h{$fio_otd} = 1; # not needed - $fio_dedup_h{$fio} = 2; - } else { - $fio_otd_dedup_h{$fio_otd} = 0; - $fio_dedup_h{$fio} = 1; - } - } else { - $fio_dedup_h{$fio} = 0; - } + # fix ё in otdel, dolj + _fix_eE($otdel); + _fix_eE($dolj); # flatdept dedup unless (exists $flatdept_dedup_h{$otdel}) { @@ -109,7 +101,7 @@ $e = eval { $db_adup->query("INSERT INTO persons (gal_id, fio, dup, f, i, o, dept_id, flatdept_id, otdel, dolj, tabn) \ VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", - $id, + $id, $fio, 0, #1.7 will update later $fio_f, $fio_i, $fio_o, @@ -140,18 +132,32 @@ # ### 2.update duplicates ### # - for my $fio (keys %fio_dedup_h) { - if ($fio_dedup_h{$fio} > 0) { - $e = eval { - $db_adup->query("UPDATE persons SET dup = ? WHERE fio = ?", $fio_dedup_h{$fio}, $fio); - }; - unless (defined $e) { - $log->l(state => 1, info => "Произошла ошибка обновления дубликатов в таблице persons, $loaded_cnt сотрудников обработано"); - _setstate($db_adup, 0); - die('Mysql update dublicates in table persons error'); - } - } + $e = eval { + $db_adup->query("INSERT INTO _fio_dedup (fio) \ + SELECT fio FROM persons GROUP BY fio HAVING COUNT(*) > 1"); + + $db_adup->query("INSERT INTO _fio_otd_dedup (fio, otdel) \ + SELECT fio, otdel FROM persons GROUP BY fio, otdel HAVING COUNT(*) > 1"); + }; + unless (defined $e) { + $log->l(state => 1, info => "Произошла ошибка расчета дубликатов в таблице persons, $loaded_cnt сотрудников обработано"); + _setstate($db_adup, 0); + die('Mysql duplicates calculation in table persons error'); + } + + $e = eval { + $db_adup->query("UPDATE persons SET dup = 1 \ + WHERE fio IN (SELECT fio FROM _fio_dedup)"); + + $db_adup->query("UPDATE persons SET dup = 2 \ + WHERE (fio, otdel) IN (SELECT fio, otdel FROM _fio_otd_dedup)"); + }; + unless (defined $e) { + $log->l(state => 1, info => "Произошла ошибка обновления дубликатов в таблице persons, $loaded_cnt сотрудников обработано"); + _setstate($db_adup, 0); + die('Mysql update dublicates in table persons error'); } + # ### done ### # @@ -165,7 +171,7 @@ $e = eval { $db_adup->query("INSERT INTO depts (id, name, level, parent) \ VALUES(?, ?, ?, ?)", - $_, + $_, $id_dept_h{$_}->{name}, $id_dept_h{$_}->{level}, $id_dept_h{$_}->{parent} @@ -208,7 +214,7 @@ # ### end of saving flat depts hash ### # - + $log->l(info => "Загружен шаблон с информацией по $loaded_cnt сотрудникам и выполнен разбор оргструктуры по $dept_loaded_cnt/$flatdept_loaded_cnt подразделениям"); } else { @@ -265,3 +271,9 @@ sub process_dept_a { } +# internal, not a method +sub _fix_eE { + $_[0] =~ tr/ёЁ/еЕ/; +} + +