Package clips.directory.editors.update.updaters

Source Code of clips.directory.editors.update.updaters.UpdaterClients$Writer

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package clips.directory.editors.update.updaters;

import beans.contract.entity.Polis;
import beans.directory.simple.entities.SocialStatus;
import beans.user.client.updater.ClientChunk;
import beans.user.client.updater.ClientUniq;
import beans.user.client.updater.UpdaterClientBean;
import beans.user.client.updater.UpdaterClientBeanRemote;
import cli_fmw.delegate.SharedBean;
import cli_fmw.delegate.directory.UpdaterDirectory;
import cli_fmw.delegate.directory.complex.DirectoryKladr;
import cli_fmw.delegate.directory.complex.DirectoryKladrItem;
import cli_fmw.delegate.directory.complex.DirectoryKladrType;
import cli_fmw.delegate.directory.complex.DirectoryKladrTypeItem;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import cli_fmw.delegate.directory.simple.DirectorySimpleItem;
import cli_fmw.main.ClipsException;
import cli_fmw.utils.MessageBox;
import clips.delegate.directory.simple.appointment.DirectoryAppointment;
import clips.delegate.directory.simple.clientDocumentType.DirectoryDocumentType;
import clips.delegate.directory.complex.DirectoryDistrict;
import clips.delegate.directory.complex.DirectoryDistrictItem;
import clips.delegate.directory.simple.insurer.DirectoryInsurer;
import clips.delegate.directory.simple.insurer.DirectoryInsurerItem;
import clips.delegate.directory.simple.name.DirectoryName;
import clips.delegate.directory.simple.pathron.DirectoryPathron;
import clips.delegate.directory.simple.regionIdCode.DirectoryRegionIdCode;
import clips.delegate.directory.simple.socialStatus.DirectorySocialStatus;
import clips.delegate.directory.simple.surname.DirectorySurname;
import clips.main.ClipsConfig;
import framework.beans.directory.DirectoryItemDetails;
import framework.beans.directory.simple.entities.ClientDocumentType;
import framework.beans.directory.simple.entities.Sex;
import framework.utils.Converter;
import framework.utils.FormatChecker;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import org.xBaseJ.micro.DBF;
import org.xBaseJ.micro.fields.DateField;
import org.xBaseJ.micro.fields.Field;
import org.xBaseJ.micro.xBaseJException;

/**
*
* @author vip
*/
public class UpdaterClients extends UpdaterDirectory {

    public static final int THREAD_COUNT = 8;

    private DirectorySurname dirSurname;
    private DirectoryName dirName;
    private DirectoryPathron dirPathron;
    private DirectoryAppointment dirApp;
    private DirectoryDistrict dirDistrict;
    private DirectoryRegionIdCode dirRegionIdCode;
    private DirectoryInsurer dirInsurer;
    private DirectorySocialStatus dirSocialStatus;
    private DirectoryDocumentType dirDocumentType;
    private DirectoryKladr dirKladr;
    private DirectoryKladrType dirKladrType;
    public static DirectoryKladrTypeItem STREET;
    public static DirectoryKladrTypeItem PER;
    private static final String BIRSKIY_RAYON = "0201300000000000000";
    private static final String BIRSK = "0201300100000000000";


  private enum Col {
        LNUMBER,
        NUM_AMB_K,
        ERR_DAT,
        FAMILY,
        NAME,
        FATHER,
        SEX,
        BITHDATE,
        INSUR_AREA,
        INSUR_ORG,
        IDAREA,
        KLREGION,
        KLITEM,
        KLSTREET,
        HOUSE,
        LETTER,
        ROOM,
        UCH,
        SOCSTATUS,
        IDWORK,
        PROF,
        INN,
        POLSERIA,
        POLNUMBER,
        DOCUMENT,
        DOCSERIA,
        DOCNUMBER,
        SNILS,
        NAM_STREET,
        REG_WRACH,
        DATA,
  }

  private enum ColDop{
    LNUMBER,
        INSUR_ORG
    }

    private enum ColJob {
        ID,
        NAME
    }

    public enum ColSst {
        LNUMBER,
    }

    @Override
    public String getFilename() {
        return "KADR.DBF";
    }

    @Override
    public String getTitle() {
        return "Пациенты";
    }

    @Override
    public void updateImpl() throws ClipsException {
        SharedBean<UpdaterClientBeanRemote> bean =
            new SharedBean<UpdaterClientBeanRemote>(UpdaterClientBean.class.getSimpleName());
        ClipsConfig cfg = ClipsConfig.getInstance();

        dirInsurer = DirectoryLocator.getDirectory(DirectoryInsurer.class, true);
        //"Чтение дополнительных полисов"
        File filedop = new File(cfg.getLastDBFImportPath(), "KADR_DOP.DBF");
        DBF dbfDop = createDBF(filedop);
        System.out.println("Чтение дополнительных полисов");
        out.println("Чтение дополнительных полисов");
        //хеш Lnumber, INSUR_ORG
        HashMap<Integer, DirectoryInsurerItem> dopIns = new HashMap<Integer, DirectoryInsurerItem>();
        HashMap<ColDop, Field> fieldsDop = new HashMap<ColDop, Field>();
        try {
            for (int i = 0; i < ColDop.values().length; i++) {
                ColDop col = ColDop.values()[i];
                fieldsDop.put(col, dbfDop.getField(col.toString()));
            }
        } catch (xBaseJException ex) {
            throw new ClipsException("Ошибка при чтении данных из файла " + dbfDop.getName(), ex);
        }
        int recordCount = dbfDop.getRecordCount();
        int counter = 0;
        for (int i = 0; i < recordCount; i++) {
            try {
                dbfDop.read();
                if (dbfDop.deleted()) {
                    continue;
                }
                Integer lnumber = Integer.parseInt(fieldsDop.get(ColDop.LNUMBER).get().trim());
                String insOrg = fieldsDop.get(ColDop.INSUR_ORG).get().trim();
                DirectoryInsurerItem item = dirInsurer.getItemFromTitle(insOrg);
                if (insOrg.isEmpty()) {
                    out.println("Предупреждение : Дополнительный полис не принят " + dbfDop.getName() +
                            " строка " + counter + " причина : insOrg.isEmpty");
                    counter ++;
                    continue;
                }
                if (item == null) {
                    DirectoryItemDetails d = new DirectoryItemDetails(insOrg);
                    d.dirty = true;
                    item = new DirectoryInsurerItem(d);
                    dirInsurer.getItems().append(item);
                }
                dopIns.put(lnumber, item);
            } catch (IOException ex) {
                closeDBF(dbfDop);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbfDop.getName() + " (строка " + i + ")", ex);
            } catch (xBaseJException ex) {
                closeDBF(dbfDop);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbfDop.getName() + " (строка " + i + ")", ex);
            }
            counter ++;
        }
        closeDBF(dbfDop);
        System.out.println("Прочитано " + dopIns.size() + " дополнительных полисов");
        out.println("Прочитано " + dopIns.size() + " дополнительных полисов");





        //Чтение мест работы
        File fileJob = new File(cfg.getLastDBFImportPath(), "S_WORK.DBF");
        DBF dbfJob = createDBF(fileJob);
        System.out.println("Чтение мест работы");
        out.println("Чтение мест работы");
        //хеш ID, NAME организации
        HashMap<String, String> jobMap = new HashMap<String, String>();
        HashMap<ColJob, Field> fieldsJob = new HashMap<ColJob, Field>();
        try {
            for (int i = 0; i < ColJob.values().length; i++) {
                ColJob col = ColJob.values()[i];
                fieldsJob.put(col, dbfJob.getField(col.toString()));
            }
        } catch (xBaseJException ex) {
            throw new ClipsException("Ошибка при чтении данных из файла " + dbfJob.getName(), ex);
        }
        recordCount = dbfJob.getRecordCount();
        counter = 0;
        for (int i = 0; i < recordCount; i++) {
            try {
                dbfJob.read();
                if (dbfJob.deleted()) {
                    continue;
                }
                String id = fieldsJob.get(ColJob.ID).get().trim();
                String name = fieldsJob.get(ColJob.NAME).get().trim();
                if (name.isEmpty()) {
                    out.println("Предупреждение : место работы не принято " + dbfJob.getName() +
                            " ID " + id + " причина : NAME.isEmpty");
                    counter ++;
                    continue;
                }
                jobMap.put(id, name);
            } catch (IOException ex) {
                closeDBF(dbfJob);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbfJob.getName() + " (строка " + i + ")", ex);
            } catch (xBaseJException ex) {
                closeDBF(dbfJob);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbfJob.getName() + " (строка " + i + ")", ex);
            }
            counter ++;
        }
        closeDBF(dbfJob);
        System.out.println("Прочитано " + jobMap.size() + " мест работы");
        out.println("Прочитано " + jobMap.size() + " мест работы");


        //Чтение статталонов - составление белого списка
        System.out.println("Чтение статталонов - составление белого списка пациентов");
        out.println("Чтение статталонов - составление белого списка пациентов");
        File fileSST = new File(cfg.getLastDBFImportPath(), "stat_tal.dbf");
        DBF dbfSST = createDBF(fileSST);
        HashMap<ColSst, Field> fieldsSst = new HashMap<ColSst, Field>();
        try {
            for (int i = 0; i < ColSst.values().length; i++) {
                ColSst col = ColSst.values()[i];
                fieldsSst.put(col, dbfSST.getField(col.toString()));
            }
        } catch (xBaseJException ex) {
            throw new ClipsException("Ошибка при чтении данных из файла " + dbfSST.getName(), ex);
        }
        int counterSst = 0;
        HashSet<Integer> whiteList = new HashSet<Integer>();
        recordCount = dbfSST.getRecordCount();
        for (int i = 0; i < recordCount; i++) {
            try {
                dbfSST.read();
                if (dbfSST.deleted()) {
                    continue;
                }
                if (fieldsSst.get(ColSst.LNUMBER).get().trim().isEmpty()) {
                    counterSst ++;
                    continue;
                }
                whiteList.add(Integer.parseInt(fieldsSst.get(ColSst.LNUMBER).get().trim()));
            } catch (IOException ex) {
                closeDBF(dbfSST);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbfSST.getName() + " (строка " + counterSst + ")", ex);
            } catch (xBaseJException ex) {
                closeDBF(dbfSST);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbfSST.getName() + " (строка " + counterSst + ")", ex);
            } catch (NumberFormatException ex) {
                closeDBF(dbfSST);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbfSST.getName() + " (строка " + counterSst + ")", ex);
            }
        }
        System.out.println("Чтение статталонов - завершено");

        //Чтение основных данных
        File file = new File(cfg.getLastDBFImportPath(),getFilename());
        DBF dbf = createDBF(file);
        HashMap<Col, Field> fields = new HashMap<Col, Field>();
        try {
            for (int i = 0; i < Col.values().length; i++) {
                Col col = Col.values()[i];
                fields.put(col, dbf.getField(col.toString()));
            }
        } catch (xBaseJException ex) {
            throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
        }
        recordCount = dbf.getRecordCount();

        System.out.println("Загрузка фамилий, имен, отчеств, профессий и терапевтических участков");
        out.println("Загрузка фамилий, имен, отчеств, профессий и терапевтических участков");
        HashSet<String> famList = new HashSet<String>(recordCount);
        HashSet<String> namList = new HashSet<String>(recordCount);
        HashSet<String> patronList = new HashSet<String>(recordCount);
        HashSet<String> profList = new HashSet<String>();
        HashSet<String> districtList = new HashSet<String>();
        for (int i = 0; i < recordCount; i++) {
            try {
                dbf.read();
                famList.add(Converter.firstUpper(fields.get(Col.FAMILY).get().trim(), true));
                namList.add(Converter.firstUpper(fields.get(Col.NAME).get().trim(), true));
                patronList.add(Converter.firstUpper(fields.get(Col.FATHER).get().trim(), true));
                profList.add(Converter.firstUpper(fields.get(Col.PROF).get().trim(), false));
                String uch = fields.get(Col.UCH).get().trim();
                if (!uch.isEmpty() && !uch.equals("0")) {
                    districtList.add(fields.get(Col.UCH).get().trim());
                }
            } catch (IOException ex) {
                closeDBF(dbf);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " (строка " + i + ")", ex);
            } catch (xBaseJException ex) {
                closeDBF(dbf);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " (строка " + i + ")", ex);
            }
        }
        bean.get().updateSurnames(famList);
        dirSurname = DirectoryLocator.getDirectory(DirectorySurname.class, true);
        System.out.println("Фамилии загружены");
        out.println("Фамилии загружены");
        bean.get().updateNames(namList);
        dirName = DirectoryLocator.getDirectory(DirectoryName.class, true);
        System.out.println("Имена загружены");
        out.println("Имена загружены");
        bean.get().updatePatrons(patronList);
        dirPathron = DirectoryLocator.getDirectory(DirectoryPathron.class, true);
        System.out.println("Отчества загружены");
        out.println("Отчества загружены");
        bean.get().updateAppointments(profList);
        dirApp = DirectoryLocator.getDirectory(DirectoryAppointment.class, true);
        System.out.println("Профессии загружены");
        out.println("Профессии загружены");
        bean.get().updateDistricts(districtList);
        dirDistrict = DirectoryLocator.getDirectory(DirectoryDistrict.class, true);
        System.out.println("Терапевтические участки загружены");
        out.println("Терапевтические участки загружены");

        dirRegionIdCode = DirectoryLocator.getDirectory(DirectoryRegionIdCode.class, true);
        dirSocialStatus = DirectoryLocator.getDirectory(DirectorySocialStatus.class, true);
        dirDocumentType = DirectoryLocator.getDirectory(DirectoryDocumentType.class, true);
        dirKladr = DirectoryLocator.getDirectory(DirectoryKladr.class);
        dirKladrType= DirectoryLocator.getDirectory(DirectoryKladrType.class);
        STREET = dirKladrType.getItemFromTitle("Улица");
        PER = dirKladrType.getItemFromTitle("Переулок");

        GregorianCalendar gc1 = new GregorianCalendar();
        try {
            dbf.startTop();
        } catch (IOException ex) {
            throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
        } catch (xBaseJException ex) {
            throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
        }
        HashSet<String> setNumAmbk = new HashSet<String>();
        bean.get().setUseStaticMap(true);
        counter = 0;
        ArrayList<ClientChunk> clientChunks = new ArrayList<ClientChunk>(recordCount);
        for (int i = 0; i < recordCount; i++) {
            try {
                dbf.read();
                if ((i%1000) == 0) {
                    System.out.println("Обновление пациентов : " +  i/((float)recordCount)*100 + "% (" + i + ") запись");
                    GregorianCalendar gc2 = new GregorianCalendar();
                    long mc = gc2.getTimeInMillis() - gc1.getTimeInMillis();
                    System.out.println("Work time: " + mc + " ms");
                }
                if (dbf.deleted()) {
                    continue;
                }
                ClientChunk c = new ClientChunk();
                c.lnumber = Integer.parseInt(fields.get(Col.LNUMBER).get().trim());
                c.numambk = fields.get(Col.NUM_AMB_K).get().trim();
                //Уникальность номеров карт
                if (!c.numambk.isEmpty() && setNumAmbk.contains(c.numambk)) {
                    char ch = 'А';
                    while (setNumAmbk.contains(c.numambk + ch)) {
                        ch++;
                    }
                    c.numambk = c.numambk + ch;
                }
                /*if (!dopIns.containsKey(c.lnumber)) { всосал только некоторых для тестирования
                    continue;
                }*/
                /*if (c.lnumber != 50421) {
                    continue;
                }*/

                c.errDat = fields.get(Col.ERR_DAT).get().trim();
                c.famID = dirSurname.getItemFromTitle(Converter.firstUpper(fields.get(Col.FAMILY).get().trim(), true)).getID();
                c.nameID = dirName.getItemFromTitle(Converter.firstUpper(fields.get(Col.NAME).get().trim(), true)).getID();
                c.patronID = dirPathron.getItemFromTitle(Converter.firstUpper(fields.get(Col.FATHER).get().trim(), true)).getID();
                String sex = fields.get(Col.SEX).get().trim();
                if (sex.toUpperCase().equals("М")) {
                    c.sexID = Sex.CLIENT_SEX_MALE;
                } else if (sex.toUpperCase().equals("Ж")) {
                    c.sexID = Sex.CLIENT_SEX_FEMALE;
                } else {
                    System.out.println("У пациента неопределен пол. " + dbf.getName() + " lnum=(" + c.lnumber + ")");
                    out.println("Предупреждение : У пациента неопределен пол. " + dbf.getName() + " lnum=(" + c.lnumber + ")");
                    c.sexID = Sex.CLIENT_SEX_MALE;
                    String fam = fields.get(Col.FAMILY).get().trim();
                    if (fam.endsWith("а")) {
                        c.sexID = Sex.CLIENT_SEX_FEMALE;
                    } else {
                        String nam = fields.get(Col.FAMILY).get().trim();
                        if (nam.endsWith("а") || nam.endsWith("я")) {
                            c.sexID = Sex.CLIENT_SEX_FEMALE;
                        }
                    }
                    out.println("Пол выставлен : " + (c.sexID == Sex.CLIENT_SEX_MALE ? "Муж." : "Жен."));
                }
                c.dateBorn = null;
                try {
                    Calendar bornDate = ((DateField)fields.get(Col.BITHDATE)).getCalendar();
                    bornDate.set(Calendar.HOUR_OF_DAY, 0);
                    bornDate.set(Calendar.MINUTE, 0);
                    bornDate.set(Calendar.SECOND, 0);
                    bornDate.set(Calendar.MILLISECOND, 0);
                    c.dateBorn = bornDate.getTime();
                } catch (NumberFormatException ex) {
                    System.out.println("Предупреждение : Дата рождения пациента некорректна " + dbf.getName() + " lnum=(" + c.lnumber + ")");
                    out.println("Предупреждение : Дата рождения пациента некорректна " + dbf.getName() + " lnum=(" + c.lnumber + ")");
                }
                String insurAreaExtKey = fields.get(Col.INSUR_AREA).get().trim();
                DirectorySimpleItem area = dirRegionIdCode.getItemFromExtKey(insurAreaExtKey);
                c.insurAreaID = area == null ? 0 : area.getID();

                /* Если страховая компания местная то приоритетным полем
                 является INSUR_ORG, если не местная то приоритетной
                 является запись в KADR_DOP */
                DirectoryInsurerItem insPrior;
                DirectoryInsurerItem ins;
                if (insurAreaExtKey.equals("61")) {
                    insPrior = dirInsurer.getItemFromExtKey(fields.get(Col.INSUR_ORG).get().trim());
                    ins = dopIns.get(c.lnumber);
                } else {
                    ins = dirInsurer.getItemFromExtKey(fields.get(Col.INSUR_ORG).get().trim());
                    insPrior = dopIns.get(c.lnumber);
                }
                if (insPrior != null) {
                    c.insurOrgID = insPrior.getID();
                } else if (ins != null) {
                    c.insurOrgID = ins.getID();
                } else {
                    c.insurOrgID = 0;
                }
                String klRegion = fields.get(Col.KLREGION).get().trim();
                String klItem = fields.get(Col.KLITEM).get().trim();
                String klStreet = fields.get(Col.KLSTREET).get().trim();
                c.house = fields.get(Col.HOUSE).get().trim();
                c.letter = fields.get(Col.LETTER).get().trim().toUpperCase();
                c.room = fields.get(Col.ROOM).get().trim();
                DirectorySimpleItem status = dirSocialStatus.getItemFromExtKey(fields.get(Col.SOCSTATUS).get().trim());
                if (status != null && status.getID() == SocialStatus.STATUS_OFNA) {
                    status = dirSocialStatus.getItemFromID(SocialStatus.STATUS_NOT_WORKING);
                }
                if (status != null && status.getID() == SocialStatus.STATUS_PRESCHOOL_UNDISCIPLINED) {
                    status = dirSocialStatus.getItemFromID(SocialStatus.STATUS_PRESCHOOL_DISCIPLINED);
                }
                c.socStatusID = status == null ? 0 : status.getID();
                if (c.socStatusID == null) {
                    c.socStatusID = 0;
                }
                DirectoryDistrictItem district = dirDistrict.getItemFromTitle(fields.get(Col.UCH).get().trim());
                c.districtID = district == null ? 0 : district.getID();


                String work = fields.get(Col.IDWORK).get().trim();
                if (work.isEmpty() || work.equals("0")) {
                    c.job = "";
                } else {
                    c.job = jobMap.get(work);
                    if (c.job == null) {
                        c.job = "";
                    }
                }
                String prof = fields.get(Col.PROF).get().trim();
                if (prof.isEmpty()) {
                    c.appointmentID = 0;
                } else {
                    c.appointmentID = dirApp.getItemFromTitle(Converter.firstUpper(prof, false)).getID();
                }


                c.inn = fields.get(Col.INN).get().trim();
                c.polSeria = fields.get(Col.POLSERIA).get().trim();
                c.polNumber = fields.get(Col.POLNUMBER).get().trim();
                DirectorySimpleItem doctype = dirDocumentType.getItemFromExtKey(fields.get(Col.DOCUMENT).get().trim());
                c.docTypeID = doctype == null ? 0 : doctype.getID();
                if (c.docTypeID == null) {
                    c.docTypeID = ClientDocumentType.TYPE_PASSPORT_RF;
                }
                c.docSeria = fields.get(Col.DOCSERIA).get().trim();
                c.docNumber = fields.get(Col.DOCNUMBER).get().trim();
                c.snils = fields.get(Col.SNILS).get().trim();
                String namstreet = fields.get(Col.NAM_STREET).get().trim();

                //Для полисов с ошибками выставляем формальные параметры
                if (c.insurOrgID == 0) {
                    c.insurOrgID = dirInsurer.getItemFromExtKey("344").getID();
                    out.println("Предупреждение : Пациенту в полис формально выставлена страховая компания" + dbf.getName() + " lnum=(" + c.lnumber + ")");
                }
                if (c.insurAreaID ==0) {
                    c.insurAreaID = dirRegionIdCode.getItemFromExtKey("61").getID();
                    out.println("Предупреждение : Пациенту в полис формально выставлен регион" + dbf.getName() + " lnum=(" + c.lnumber + ")");
                }
                if (c.polNumber.isEmpty()) {
                    c.polNumber = Polis.FICTIVE_POLIS_NUMBER;
                    out.println("Предупреждение : Пациенту выставлен формальный номер полиса" + dbf.getName() + " lnum=(" + c.lnumber + ")");
                }

                /* Проверка кодов региона, населенного пункта и улицы
                 * Если указан KLITEM то руководствуемся им
                 * Далее проверяем соответствие улицы (либо KLREGION либо KLITEM)
                 * Если не соответствует ищем соответствие у детей по названию (название по KLSTREET, если нету то по NAM_STREET)
                 * Если нет соответствия то печатаемсообщение и выставляем адрес незавершенным (KLREGION либо KLITEM)
                 */
                String klRegionShort = null;
                try {
                    klRegionShort = klRegion.substring(0, 8);
                } catch (StringIndexOutOfBoundsException ex) {
                    //регион не указан
                }

                //item будет не нул только в том случае если KLSTREET не соответствует KLREGION либо KLITEM
                DirectoryKladrItem item = null;
                if (!klItem.isEmpty() && !klStreet.startsWith(klItem)) {
                    item = dirKladr.getItemByCode(klItem);
                } else if (klRegionShort != null && !klStreet.startsWith(klRegionShort)) {
                    item = dirKladr.getItemByCode(klRegionShort);
                }

                if (item != null) {
                    DirectoryKladrItem childByTitle = null;
                    String title = "";
                    //Попытка по названию KLSTREET
                    if (!klStreet.isEmpty()) {
                        DirectoryKladrItem itemByCode = dirKladr.getItemByCode(klStreet);
                        title = itemByCode.getTitle();
                        DirectoryKladrTypeItem type = itemByCode.getType();
                        childByTitle = item.getChildByTitle(title, type);
                    }
                    //попытка поиска по NAM_STREET
                    if (childByTitle == null && !namstreet.isEmpty()) {
                        //определяем  если это переулок
                        DirectoryKladrTypeItem type;
                        if (namstreet.toUpperCase().startsWith("ПЕР.") || namstreet.toUpperCase().startsWith("ПЕР ")) {
                            type = PER;
                        } else {
                            type = STREET;
                        }
                        //Если указан только бирский район и улица прописью то ищем улицу в бирске
                        if (item.getKladrCode().equals(BIRSKIY_RAYON)) {
                            item = dirKladr.getItemByCode(BIRSK);
                        }
                        String fixTitle = fixTitle(item.getKladrCode(), namstreet);
                        childByTitle = item.getChildByTitle(fixTitle, type);
                    }
                    if (childByTitle != null) {
                        klStreet = childByTitle.getKladrCode();
                    } else {
                        klStreet = "";
                        //Вывод только если была попытка поиска улицы
                        if (!klStreet.isEmpty() || !namstreet.isEmpty()) {
                            System.out.println("Неверное поле KLSTREET в файле" + dbf.getName() + " lnum=(" + c.lnumber + ")"
                                    + " title=[" + title + "] name=[" + namstreet + "]" + " punkt=[" + item.getTitle() + "]"
                                    + " kladr=[" + item.getKladrCode() + "]");
                            out.println("Предупреждение : Неверное поле KLSTREET в файле" + dbf.getName() + " lnum=(" + c.lnumber + ")"
                                    + " title=[" + title + "] name=[" + namstreet + "]" + " punkt=[" + item.getTitle() + "]"
                                    + " kladr=[" + item.getKladrCode() + "]");
                        }
                    }
                }

                c.kladrCode = "";
                if (!klStreet.isEmpty()) {
                    c.kladrCode = klStreet + "00";
                } else if (!klItem.isEmpty()) {
                    c.kladrCode = klItem + "00000000";
                } else if (!klRegion.isEmpty()) {
                    c.kladrCode = klRegion + "00000000";
                }

                //Корректировка и проверка СНИЛС
                String msg = FormatChecker.checkSNILS(c.snils);
                if (msg != null) {
                    String snils = "";

                    for (int j = 0; j < c.snils.length(); j++) {
                        char charAt = c.snils.charAt(j);
                        if ((charAt >= '0') && (charAt <= '9')) {
                            snils = snils + charAt;
                        }
                    }

                    if (snils.length() == 11) {
                        c.snils = snils.substring(0,3) + "-" + snils.substring(3, 6) + "-"
                                + snils.substring(6, 9) + " " + snils.substring(9, 11);
                        msg = FormatChecker.checkSNILS(c.snils);
                    }
                    if (msg != null) {
                        System.out.println("Неверное поле SNILS в файле" + dbf.getName() + " lnum=(" + c.lnumber + ")");
                        out.println("Предупреждение : Неверное поле SNILS в файле" + dbf.getName() + " lnum=(" + c.lnumber + ")");
                        c.snils = "";
                    }
                }

                String rw = fields.get(Col.REG_WRACH).get().trim();
                if (rw.isEmpty()) {
                    c.regWrach = 0;
                } else {
                    c.regWrach = Integer.parseInt(rw);
                }

                Calendar data = ((DateField)fields.get(Col.DATA)).getCalendar();
                data.set(Calendar.HOUR_OF_DAY, 0);
                data.set(Calendar.MINUTE, 0);
                data.set(Calendar.SECOND, 0);
                data.set(Calendar.MILLISECOND, 0);
                c.data = data.getTime();

                if (!c.isValid()) {
                    throw new ClipsException("Неполные данные пациента " + dbf.getName() + " lnum=(" + c.lnumber + ")");
                }
                clientChunks.add(c);

            } catch (IOException ex) {
                closeDBF(dbf);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " (строка " + i + ")", ex);
            } catch (xBaseJException ex) {
                closeDBF(dbf);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " (строка " + i + ")", ex);
            } catch (NumberFormatException ex) {
                closeDBF(dbf);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " (строка " + i + ")", ex);
            }
            counter ++;
        }
        closeDBF(dbf);
        clientChunks = compressChunks(clientChunks, whiteList);
        //Деление массивов
        ArrayList<ArrayList<ClientChunk>> chunkLists = new ArrayList<ArrayList<ClientChunk>>();
        for (int i = 0; i < THREAD_COUNT; i++) {
            ArrayList<ClientChunk> list = new ArrayList<ClientChunk>(clientChunks.size() / THREAD_COUNT);
            chunkLists.add(list);
        }
        for (int i = 0; i < clientChunks.size(); i++) {
            ClientChunk clientChunk = clientChunks.get(i);
            int index = i % THREAD_COUNT;
            chunkLists.get(index).add(clientChunk);
        }

        ArrayList<Writer> threadList = new ArrayList<Writer>();
        //Запись в базу
        for (int i = 0; i < THREAD_COUNT; i++) {
            Writer w = new Writer(chunkLists.get(i), i);
            threadList.add(w);
        }
        for (int i = 0; i < THREAD_COUNT; i++) {
            threadList.get(i).start();
        }
    try {
            for (int i = 0; i < THREAD_COUNT; i++) {
                threadList.get(i).join();
            }
    } catch (InterruptedException ex) {
      //DO NOTHING
    }

        bean.get().setUseStaticMap(false);
        GregorianCalendar gc2 = new GregorianCalendar();
        long mc = gc2.getTimeInMillis() - gc1.getTimeInMillis();
        System.out.println("Work time: " + mc + " ms");
        out.println("Work time: " + mc + " ms");
    }


    private String fixTitle(String parentCode, String street) {
        if (parentCode.equals("0201300100000000000")) { //Бирск
            if (street.equals("пер.Школьный")) return "Школьный";
            if (street.equals("пер.Высоковольтный")) return "Высоковольтный";
            if (street.equals("пер.Советский")) return "Советский";
            if (street.equals("пер. Гоголя")) return "Гоголя";
            if (street.equals("пер.Уральский")) return "Уральский";
            if (street.equals("пер.Коммунаров")) return "Коммунаров";
            if (street.equals("пер.Уфимский")) return "Уфимский";
            if (street.equals("Пер.речной")) return "Речной";
            if (street.equals("пер.Крестьянский")) return "Крестьянский";
            if (street.equals("пер.Рабочий")) return "Рабочий";
            if (street.equals("пер. Зеленый")) return "Зеленый";
            if (street.equals("пер.Некрасова")) return "Некрасова";
            if (street.equals("пер.Первомайский")) return "Первомайский";
            if (street.equals("пер.Больничный")) return "Больничный";
            if (street.equals("Пер.революционный")) return "Революционный";
            if (street.equals("пер.Октябрьский")) return "Октябрьский";
            if (street.equals("пер.Набережный")) return "Набережный";
            if (street.equals("Свердловская")) return "Свердлова";
            if (street.equals("пер.Курбатова")) return "Курбатова";
            if (street.equals("Красноармеская")) return "Красноармейская";
            if (street.equals("8-ое марта")) return "8 Марта";
            if (street.equals("Малокавказкая")) return "Малокавказская";
            if (street.equals("Крупская")) return "Крупской";
            if (street.equals("2-я Пятилетка")) return "2 Пятилетка";
            if (street.equals("К.Маркса")) return "Карла Маркса";
            if (street.equals("Космодемьянская")) return "Космодемьянской";
            if (street.equals("Варенцова")) return "Варенцовой";
            if (street.equals("Курчатого")) return "Курчатова";
            if (street.equals("Цюрупа")) return "Цюрупы";
            if (street.equals("М.Кузнечная")) return "Малокузнецкая";
            if (street.equals("9-ое Января")) return "9 Января";
            if (street.equals("9  Января")) return "9 Января";
            if (street.equals("М. Гончарная")) return "Малогончарная";
            if (street.equals("М.Кавказская")) return "Малокавказская";
            if (street.equals("пер.Молодогвардейски")) return "Молодогвардейский";
            if (street.equals("Давлетшина")) return "Давлетшиной";
            if (street.equals("Кузнечная")) return "";
            if (street.equals("пер.Гагарина")) return "Гагарина";
            if (street.equals("60 лет октября")) return "70 лет октября";
            if (street.equals("Пер.молодежный")) return "Молодежный";
            if (street.equals("")) return "";
        }
        if (parentCode.equals("0200100100000000000")) { //Уфа
            if (street.equals("Зорги")) return "Рихарда Зорге";
            if (street.equals("Р.Зорге")) return "Рихарда Зорге";
            if (street.equals("Цюрупа")) return "Цюрупы";
            if (street.equals("")) return "";
        }
        return street;
    }

    /**
     * Удаление невалидные данные пациентов
     * удаляются пациенты с одинаковыми ФИО и датой рождения
     * @param chunks
     * @return
     */
    private ArrayList<ClientChunk> compressChunks(ArrayList<ClientChunk> chunks, Set<Integer> whiteList) throws ClipsException {
        int size = chunks.size();
        //Collections.sort(chunks);
        HashMap<ClientUniq, ClientChunk> target = new HashMap<ClientUniq, ClientChunk>(256);
        /* Простейшее продположение (на основе 5 примеров) что в отчет идут данные
         * первого пациента.
         * Дополнение - худший чанк (по compare()) заменяется лучшим
         * ------ все это неверно
         * сначала надо составить белый список LNUMBER, участвующих в статталонах
         * затем при дублировании чанк из белого списка может вытеснить чанк не
         * из белого списка
         */
        for (ClientChunk chunk : chunks) {
            ClientUniq cu = new ClientUniq(chunk.famID, chunk.nameID, chunk.patronID, chunk.dateBorn);
            ClientChunk oldChunk = target.get(cu);
            if (oldChunk == null) {
                target.put(cu, chunk);
            } else {
                if (whiteList.contains(chunk.lnumber)) {
                    if (!whiteList.contains(oldChunk.lnumber)) {
                        target.put(cu, chunk);
                    } else {
                        throw new ClipsException("Оба пациента участвуют в статталонах " +
                                " lnumber = " + oldChunk.lnumber +
                                ", lnumber = " + chunk.lnumber);
                    }
                }
            }
        }
        System.out.println("Повторы удалены (source = " + size + " target = " + target.size() + ")");
        return new ArrayList<ClientChunk>(target.values());
    }

    private void writeChunks(ArrayList<ClientChunk> clientChunks, int streamNumber, SharedBean<UpdaterClientBeanRemote> bean ) throws ClipsException {
        int errorCount = 0;
        for (int i = 0; i < clientChunks.size(); i++) {
            if ((i%100) == 0) {
                System.out.println("Поток " + streamNumber + ": Запись пациентов в базу : " +  i/((float)clientChunks.size())*100 + "% (" + i + ") запись");
            }
            ClientChunk c = clientChunks.get(i);
            try {
                bean.get().update(c);
            } catch (Exception ex) {
                errorCount++;
                bean.clear();
                ex.printStackTrace();
                System.out.print("Ошибка : Импорт пациента не удался KADR.DBF lnum=(" + c.lnumber + ") \n" + MessageBox.parseException(ex));
                System.out.println("lnumber = " + c.lnumber);
                out.print("Ошибка : Импорт пациента не удался KADR.DBF lnum=(" + c.lnumber + ") \n" + MessageBox.parseException(ex));
                out.println("lnumber = " + c.lnumber);
                if (errorCount >= i/2 && errorCount > 10) {
                    throw new ClipsException("Обновление не удалось");
                }
            }
        }

    }

    class Writer extends Thread {

        ArrayList<ClientChunk> list;
        int number;
        private SharedBean<UpdaterClientBeanRemote> bean =
        new SharedBean<UpdaterClientBeanRemote>(UpdaterClientBean.class.getSimpleName());

        public Writer(ArrayList<ClientChunk> list, int number) {
            this.list = list;
            this.number = number;
        }

        @Override
        public void run() {
            try {
                writeChunks(list, number, bean);
            } catch (ClipsException ex) {
                //Заканчиваем выполнение потока
            }
        }

    }
}

                //Чтоб не мешалось
                /*String s = String.format("%1$10s |%2$15s |%3$12s |%4$14s |%5$3s |%6$12s",
                        numambk,
                        fam,
                        name,
                        patron,
                        sex,
                        Converter.dateToString(dateBorn)
                );

                s = s + String.format(" |%1$4s |%2$5s |%3$4s |%4$13s |%5$13s |%6$18s |%7$5s |%8$5s |%9$5s",
                        insurArea,
                        insurOrg,
                        idArea,
                        klRegion,
                        klItem,
                        klStreet,
                        house,
                        letter,
                        room
                );

                s = s + String.format(" |%1$3s |%2$12s |%3$6s |%4$17s |%5$3s |%6$4s |%7$7s |%8$15s |%8$20s",
                        socStatus,
                        inn,
                        polSeria,
                        polNumber,
                        docType,
                        docSeria,
                        docNumber,
                        snils,
                        namstreet
                );

                System.out.println(s);*/ 
TOP

Related Classes of clips.directory.editors.update.updaters.UpdaterClients$Writer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.