Package clips.directory.editors.update.updaters

Source Code of clips.directory.editors.update.updaters.UpdaterMedData

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

package clips.directory.editors.update.updaters;

import beans.doctor.disease.updater.EmcIdAndDateBorn;
import beans.doctor.disease.updater.EventKey;
import beans.doctor.disease.updater.FollowUpKey;
import beans.doctor.disease.updater.LNumberChunk;
import beans.doctor.disease.updater.UpdaterStattalonBean;
import beans.doctor.disease.updater.UpdaterStattalonBeanRemote;
import beans.user.collaborator.entities.CollaboratorFunctionsDetails;
import cli_fmw.delegate.SharedBean;
import cli_fmw.delegate.directory.UpdaterDirectory;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import cli_fmw.main.ClipsException;
import cli_fmw.utils.SelectorEditable;
import clips.delegate.client.CollaboratorFunctionsChunk;
import clips.delegate.client.CollaboratorLocal;
import clips.delegate.directory.ro.DirectoryCollaborator;
import clips.delegate.directory.ro.DirectoryCollaboratorItem;
import clips.delegate.directory.ro.DirectoryLpuItem;
import clips.delegate.directory.simple.disablilityType.DirectoryDisabilityType;
import clips.delegate.directory.simple.disablilityType.DirectoryDisabilityTypeItem;
import clips.delegate.directory.simple.medicalAidType.DirectoryMedicalAidType;
import clips.delegate.directory.simple.name.DirectoryName;
import clips.delegate.directory.simple.pathron.DirectoryPathron;
import clips.delegate.directory.simple.surname.DirectorySurname;
import clips.login.UserInfo;
import clips.main.ClipsConfig;
import framework.generic.ClipsServerException;
import framework.utils.Converter;
import framework.utils.DateTimeUtils;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
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 abstract class UpdaterMedData extends UpdaterDirectory {
    private ArrayList<CollaboratorLocal> collabList;
    protected SharedBean<UpdaterStattalonBeanRemote> updaterStattalonBean = new SharedBean<UpdaterStattalonBeanRemote>(UpdaterStattalonBean.class.getSimpleName());

    /**Мап <LNUMBER, массив EMC_ID>*/
    protected HashMap<Integer, ArrayList<EmcIdAndDateBorn>> clientMap;
    /**Мап <N_SYST, SstData>*/
    protected HashMap<Integer, SstData> sstMap;
    /**Мап дублей статталонов <N_SYST, Set<SstData>>*/
    protected HashMap<Integer, HashSet<SstData>> doubleSstMap;
    protected  DirectoryMedicalAidType dirVmu;
    protected  HashMap<FollowUpKey, ArrayList<EventKey>> followMap;

    /** Поля таблицы пациентов*/
  public enum ColKadr{
    LNUMBER,
        FAMILY,
        NAME,
        FATHER,
        BITHDATE
  }

    /** Поля таблицы статталонов*/
    public enum ColSst {
        N_SYST,
        LNUMBER,
        BITHDATE,
        DATA_ST,
        VMU,
        CELX,
        WRACH,
        REZULT,
        MESTO,
        BL_D_BEG,
        BL_D_END,
        BL_PRICH,
        BL_UH_LET,
        BL_UH_SEX,
        STOM1,
        STOM2,
        STOM_HARAK,
        F12,
        DATA,
    }

    /** Поля таблицы посещений*/
    public enum ColDni {
        N_SYST,
        DATA,
        MES,
        UET,
        IDWRACH
    }

    /** Поля таблицы диагнозов*/
    public enum ColDS {
        N_SYST,
        LNUMBER,
        TIP,
        DIAG_1,
        DIAG_2,
        HAR_OSN_DS,
        DISP,
        DISP_SN,
        TRAWMA,
        DAT_REG,
    }



    @Override
    public String getFilename() {
        return "KADR.DBF, stat_ds.dbf, stat_tal.dbf";
    }

    @Override
    public void updateImpl() throws ClipsException {
        collabList = null;
        ClipsConfig cfg = ClipsConfig.getInstance();
        dirVmu = DirectoryLocator.getDirectory(DirectoryMedicalAidType.class);

        //Замаппируем пациентов по lnumber
        File file = new File(cfg.getLastDBFImportPath(), "KADR.DBF");
        DBF dbf = createDBF(file);
        HashMap<ColKadr, Field> fieldsKadr = new HashMap<ColKadr, Field>();
        try {
            for (int i = 0; i < ColKadr.values().length; i++) {
                ColKadr col = ColKadr.values()[i];
                fieldsKadr.put(col, dbf.getField(col.toString()));
            }
        } catch (xBaseJException ex) {
            throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
        }
        int recordCount = dbf.getRecordCount();
        DirectorySurname dirSurname = DirectoryLocator.getDirectory(DirectorySurname.class);
        DirectoryName dirName = DirectoryLocator.getDirectory(DirectoryName.class);
        DirectoryPathron dirPathron = DirectoryLocator.getDirectory(DirectoryPathron.class);
        DirectoryDisabilityType dirDisability = DirectoryLocator.getDirectory(DirectoryDisabilityType.class);
        ArrayList<LNumberChunk> lNumberChunkList = new ArrayList<LNumberChunk>(recordCount);
        HashSet<Integer> lnumSet = new HashSet<Integer>();
        for (int i = 0; i < recordCount; i++) {
            try {
                dbf.read();
                if (dbf.deleted()) {
                    continue;
                }
                LNumberChunk c = new LNumberChunk();
                c.lnumber = Integer.parseInt(fieldsKadr.get(ColKadr.LNUMBER).get().trim());
                if (lnumSet.contains(c.lnumber)) {
                    continue;
                } else {
                    lnumSet.add(c.lnumber);
                }


                c.famID = dirSurname.getItemFromTitle(Converter.firstUpper(fieldsKadr.get(ColKadr.FAMILY).get().trim(), true)).getID();
                c.nameID = dirName.getItemFromTitle(Converter.firstUpper(fieldsKadr.get(ColKadr.NAME).get().trim(), true)).getID();
                c.patronID = dirPathron.getItemFromTitle(Converter.firstUpper(fieldsKadr.get(ColKadr.FATHER).get().trim(), true)).getID();
                c.born = null;
                try {
                    Calendar bornDate = ((DateField)fieldsKadr.get(ColKadr.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.born = bornDate.getTime();
                } catch (NumberFormatException ex) {
                    //System.out.println("Ошибка при чтении даты рождения пациента " + dbf.getName() + " (строка " + i + ")");
                }
                lNumberChunkList.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);
            }
        }
        closeDBF(dbf);
        try {
            clientMap = updaterStattalonBean.get().getClientMap(lNumberChunkList);
        } catch (ClipsServerException ex) {
            throw new ClipsException("Не удалось загрузить пациентов", ex);
        }
        lNumberChunkList = null;
        lnumSet = null;
        System.gc();
        System.out.println("Пациенты прогружены");
        out.println("Пациенты прогружены");





        //Замаппируем статталоны (наши заболевания) по N_SYST
        file = new File(cfg.getLastDBFImportPath(), "stat_tal.dbf");
        dbf = createDBF(file);
        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, dbf.getField(col.toString()));
            }
        } catch (xBaseJException ex) {
            throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
        }
        sstMap = new HashMap<Integer, SstData>();
        doubleSstMap = new HashMap<Integer, HashSet<SstData>>();
        int counterSst = 0;
        recordCount = dbf.getRecordCount();
        for (int i = 0; i < recordCount; i++) {
            try {
                dbf.read();
                if (dbf.deleted()) {
                    continue;
                }
                SstData d = new SstData();
                if (fieldsSst.get(ColSst.N_SYST).get().trim().isEmpty()) {
                    System.out.println("Ошибка : В статталоне отсутствует N_SYST " + dbf.getName());
                    out.println("Ошибка : В статталоне отсутствует N_SYST " + dbf.getName());
                    counterSst ++;
                    continue;

                }
                d.nSyst = Integer.parseInt(fieldsSst.get(ColSst.N_SYST).get().trim());
                if (fieldsSst.get(ColSst.LNUMBER).get().trim().isEmpty()) {
                    System.out.println("Ошибка : Отсутствует LNUMBER в статталоне N_SYST = " + d.nSyst + " "+ dbf.getName());
                    out.println("Ошибка : Отсутствует LNUMBER в статталоне N_SYST = " + d.nSyst + " "+ dbf.getName());
                    counterSst ++;
                    continue;
                }
                d.lnumber = Integer.parseInt(fieldsSst.get(ColSst.LNUMBER).get().trim());
                if (!clientMap.containsKey(d.lnumber)) {
                    //Возможно пофиксится потом, вызовом fixSstLnumber, там и будет вывод ошибки
                    //System.out.println("Ошибка : Неправильный LNUMBER в статталоне N_SYST = " + d.nSyst + " LNUMBER = " + d.lnumber + " "+ dbf.getName());
                    //out.println("Ошибка : Неправильный LNUMBER в статталоне N_SYST = " + d.nSyst + " LNUMBER = " + d.lnumber + " "+ dbf.getName());
                }

                d.bithdate = null;
                try {
                    Calendar cal = ((DateField)fieldsSst.get(ColSst.BITHDATE)).getCalendar();
                    d.bithdate = DateTimeUtils.getDateOnly(cal).getTime();
                } catch (NumberFormatException e) {
                    //Дата рождения в статталоне не указана
                }

                d.dataSt = null;
                try {
                    Calendar cal = ((DateField)fieldsSst.get(ColSst.DATA_ST)).getCalendar();
                    d.dataSt = DateTimeUtils.getDateOnly(cal).getTime();
                } catch (NumberFormatException ex) {
                    //оставляем нулл, потом скорректируется по посещению fixSstLnumber();
                }
                d.vmu = fieldsSst.get(ColSst.VMU).get().trim();
                d.purpose = fieldsSst.get(ColSst.CELX).get().trim();
                d.idWrach = Integer.parseInt(fieldsSst.get(ColSst.WRACH).get().trim());
                d.result = fieldsSst.get(ColSst.REZULT).get().trim();
                d.place = fieldsSst.get(ColSst.MESTO).get().trim();
                d.blBeg = null;
                try {
                    Calendar date = ((DateField)fieldsSst.get(ColSst.BL_D_BEG)).getCalendar();
                    date.set(Calendar.HOUR_OF_DAY, 0);
                    date.set(Calendar.MINUTE, 0);
                    date.set(Calendar.SECOND, 0);
                    date.set(Calendar.MILLISECOND, 0);
                    d.blBeg = date.getTime();
                } catch (NumberFormatException ex) {
                    //значение даты не удалось прочитать - оставляем нулл
                }
                d.blEnd = null;
                try {
                    Calendar date = ((DateField)fieldsSst.get(ColSst.BL_D_END)).getCalendar();
                    date.set(Calendar.HOUR_OF_DAY, 0);
                    date.set(Calendar.MINUTE, 0);
                    date.set(Calendar.SECOND, 0);
                    date.set(Calendar.MILLISECOND, 0);
                    d.blEnd = date.getTime();
                } catch (NumberFormatException ex) {
                    //значение даты не удалось прочитать - оставляем нулл
                }
                DirectoryDisabilityTypeItem disType = dirDisability.getItemFromExtKey(fieldsSst.get(ColSst.BL_PRICH).get().trim());
                d.blPrich = disType == null ? 0 : disType.getID();
                d.blAge = fieldsSst.get(ColSst.BL_UH_LET).get().trim();
                d.blSex = fieldsSst.get(ColSst.BL_UH_SEX).get().trim();
                d.stomMkb = fieldsSst.get(ColSst.STOM1).get().trim() + fieldsSst.get(ColSst.STOM2).get().trim();
                d.stomHarak = fieldsSst.get(ColSst.STOM_HARAK).get().trim();
                d.received = fieldsSst.get(ColSst.F12).get().trim().equals("9");
                d.data = null;
                try {
                    Calendar date = ((DateField)fieldsSst.get(ColSst.DATA)).getCalendar();
                    date.set(Calendar.HOUR_OF_DAY, 0);
                    date.set(Calendar.MINUTE, 0);
                    date.set(Calendar.SECOND, 0);
                    date.set(Calendar.MILLISECOND, 0);
                    d.data = date.getTime();
                } catch (NumberFormatException ex) {
                    System.out.println("Ошибка : Отсутствует дата закрытия в статталоне N_SYST = " + d.nSyst + " "+ dbf.getName());
                    out.println("Ошибка : Отсутствует дата закрытия в статталоне N_SYST = " + d.nSyst + " "+ dbf.getName());
                    counterSst ++;
                    continue;
                }

                if (sstMap.containsKey(d.nSyst)) {
                    //Дубликаты запихнем в отдельный мап дубликатов для дальнейшей корректировки
                    HashSet<SstData> set = doubleSstMap.get(d.nSyst);
                    if (set == null) {
                        set = new HashSet<SstData>();
                        doubleSstMap.put(d.nSyst, set);
                    }
                    set.add(sstMap.get(d.nSyst));
                    set.add(d);
                } else {
                    sstMap.put(d.nSyst, d);
                }
            } catch (IOException ex) {
                closeDBF(dbf);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " (строка " + counterSst + ")", ex);
            } catch (xBaseJException ex) {
                closeDBF(dbf);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " (строка " + counterSst + ")", ex);
            } catch (NumberFormatException ex) {
                closeDBF(dbf);
                throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " (строка " + counterSst + ")", ex);
            }
            counterSst ++;
        }
        closeDBF(dbf);
        System.out.println("Статталоны прогружены");
        out.println("Статталоны прогружены");



        //Прогрузка посещений
        /*Посещения прогружаются и сасовываются в статталоны по совпадению N_SYST*/
        System.out.println("Прогрузка посещений");
        out.println("Прогрузка посещений");
        file = new File(cfg.getLastDBFImportPath(), "stat_dni.dbf");
        dbf = createDBF(file);
        HashMap<ColDni, Field> fieldsDni = new HashMap<ColDni, Field>();
        try {
            for (int i = 0; i < ColDni.values().length; i++) {
                ColDni col = ColDni.values()[i];
                fieldsDni.put(col, dbf.getField(col.toString()));
            }
        } catch (xBaseJException ex) {
            throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
        }
        int counterDni = 0;
        recordCount = dbf.getRecordCount();
        for (int i = 0; i < recordCount; i++) {
            try {
                dbf.read();
                if (dbf.deleted()) {
                    continue;
                }
                DniData d = new DniData();
                if (fieldsDni.get(ColDni.N_SYST).get().trim().isEmpty()) {
                    System.out.println("Ошибка : В посещении отстутствует N_SYST, строка  " + counterDni + " "+ dbf.getName());
                    out.println("Ошибка : В посещении отстутствует N_SYST, строка  " + counterDni + " "+ dbf.getName());
                    counterDni ++;
                    continue;
                }
                Integer nSyst = Integer.parseInt(fieldsDni.get(ColDni.N_SYST).get().trim());
                SstData sst = sstMap.get(nSyst);
                if (sst == null) {
                    System.out.println("Ошибка : Для посещения не найден статталон, N_SYST = " + nSyst + " " + dbf.getName());
                    out.println("Ошибка : Для посещения не найден статталон, N_SYST = " + nSyst + " " + dbf.getName());
                    counterDni ++;
                    continue;
                }
                d.date = null;
                try {
                    Calendar date = ((DateField)fieldsDni.get(ColDni.DATA)).getCalendar();
                    d.date = DateTimeUtils.getDateOnly(date).getTime();
                } catch (NumberFormatException ex) {
                    System.out.println("Ошибка : Отсутствует дата посещения, N_SYST = " + nSyst + " " + dbf.getName());
                    out.println("Ошибка : Отсутствует дата посещения, N_SYST = " + nSyst + " " + dbf.getName());
                    counterDni ++;
                    continue;
                }
                d.mes = fieldsDni.get(ColDni.MES).get().trim();
                d.uet = fieldsDni.get(ColDni.UET).get().trim();
                if (d.mes.length() == 6){
                    //Нормальное посещение
                    d.uet = "1";
                } else if (!d.uet.isEmpty() && !d.uet.equals("0")) {
                    //Стоматологическое посещение
                    d.mes = "629000";
                    DsData ds = new DsData();
                    ds.nSyst = nSyst;
                    ds.lnumber = sst.lnumber;
                    ds.tip = "З";
                    ds.mkb = sst.stomMkb;
          ds.encounter = sst.stomHarak;
                    ds.trawma = "";
                    ds.dateReg = d.date;
                    d.dsDataList.add(ds);
                } else {
                    System.out.println("Ошибка : Неправильное поле MES, N_SYST = " + nSyst + " " + dbf.getName());
                    out.println("Ошибка : Неправильное поле MES, N_SYST = " + nSyst + " " + dbf.getName());
                    counterDni ++;
                    continue;
                }
                d.idWrach = Integer.parseInt(fieldsDni.get(ColDni.IDWRACH).get().trim());
                sst.dniList.add(d);
            } 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);
            }
            counterDni ++;
        }
        closeDBF(dbf);
        System.out.println("Посещения прогружены");
        out.println("Посещения прогружены");



        //
        /*ds это диагнозы, их надо закидывать в посещения, соответствующие по nsyst
         * причем диагноз надо закидывать в посещение обслуженное лечащим врачем ближайшее по дате
         * предусмотреть случаи чтобы в посещении не было двух заключительных диагнозов
         * */
        followMap = new HashMap<FollowUpKey, ArrayList<EventKey>>();
        file = new File(cfg.getLastDBFImportPath(), "stat_ds.dbf");
        dbf = createDBF(file);
        HashMap<ColDS, Field> fieldsDs = new HashMap<ColDS, Field>();
        try {
            for (int i = 0; i < ColDS.values().length; i++) {
                ColDS col = ColDS.values()[i];
                fieldsDs.put(col, dbf.getField(col.toString()));
            }
        } catch (xBaseJException ex) {
            throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
        }
        recordCount = dbf.getRecordCount();
        int counterDs = 0;
        for (int i = 0; i < recordCount; i++) {
            try {
                dbf.read();
                if (dbf.deleted()) {
                    continue;
                }
                DsData d = new DsData();
                if (fieldsDs.get(ColDS.N_SYST).get().trim().isEmpty()) {
                    System.out.println("Ошибка : В диагнозе отстутствует N_SYST, строка  " + counterDni + " "+ dbf.getName());
                    out.println("Ошибка : В диагнозе отстутствует N_SYST, строка  " + counterDni + " "+ dbf.getName());
                    counterDs ++;
                    continue;
                }
                d.nSyst = Integer.parseInt(fieldsDs.get(ColDS.N_SYST).get().trim());
                d.lnumber = Integer.parseInt(fieldsDs.get(ColDS.LNUMBER).get().trim());
                d.tip = fieldsDs.get(ColDS.TIP).get().trim();
                d.mkb = fieldsDs.get(ColDS.DIAG_1).get().trim() + fieldsDs.get(ColDS.DIAG_2).get().trim();
                d.encounter = fieldsDs.get(ColDS.HAR_OSN_DS).get().trim();
                String disp = fieldsDs.get(ColDS.DISP).get().trim();
                d.disp = 0;
                if (!disp.isEmpty()) {
                    d.disp = Integer.parseInt(disp);
                }
                String dispSn = fieldsDs.get(ColDS.DISP_SN).get().trim();
                if (!disp.isEmpty()) {
                    d.dispSn = Integer.parseInt(disp);
                }
                if (d.tip.equals("1") || d.tip.equals("2")) {
                    d.encounter = "2";
                }
                d.trawma = fieldsDs.get(ColDS.TRAWMA).get().trim();
                try {
                    Calendar date = ((DateField)fieldsDs.get(ColDS.DAT_REG)).getCalendar();
                    date.set(Calendar.HOUR_OF_DAY, 0);
                    date.set(Calendar.MINUTE, 0);
                    date.set(Calendar.SECOND, 0);
                    date.set(Calendar.MILLISECOND, 0);
                    d.dateReg = date.getTime();
                } catch (NumberFormatException ex) {
                    System.out.println("Ошибка : Отсутствует дата регистрации диагноза, N_SYST = " + d.nSyst + " " + dbf.getName());
                    out.println("Ошибка : Отсутствует дата регистрации диагноза, N_SYST = " + d.nSyst + " " + dbf.getName());
                    counterDs ++;
                    continue;
                }

                SstData sst = sstMap.get(d.nSyst);
                if (sst == null) {
                    System.out.println("Ошибка : Для диагноза не найден статталон, N_SYST = " + d.nSyst + " " + dbf.getName());
                    out.println("Ошибка : Для диагноза не найден статталон, N_SYST = " + d.nSyst + " " + dbf.getName());
                    counterDni ++;
                    continue;
                }
                if (sst.lnumber != d.lnumber) {
                    System.out.println("Ошибка : Статталон и диагноз указывают на разных пациентов, N_SYST = " + d.nSyst + " " + dbf.getName());
                    out.println("Ошибка : Статталон и диагноз указывают на разных пациентов, N_SYST = " + d.nSyst + " " + dbf.getName());
                    counterDs ++;
                    continue;
                }
                sst.dsList.add(d);
                //Если в диагнозе указана диспансеризация то включаем его в мап
                if (d.disp > 1) {
                    int emcID = sst.getTrueEmc(clientMap.get(sst.lnumber));
                    if (emcID != 0) {
                        FollowUpKey key = new FollowUpKey(emcID, d.mkb);
                        followMap.put(key, new ArrayList<EventKey>());
                    }
                }
            } 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);
            }
            counterDs ++;
        }
        closeDBF(dbf);
        System.out.println("Диагнозы прогружены");
        out.println("Диагнозы прогружены");

        fixDoubleSst();
        fixSstLnumber();
        placeDiagnosys();

    }

    protected CollaboratorFunctionsChunk findCollFuncByExtKey(String extkey, String vmu) throws ClipsException {
        if (collabList == null) {
            collabList = new ArrayList<CollaboratorLocal>();
            DirectoryCollaborator dir = DirectoryLocator.getDirectory(DirectoryCollaborator.class);
            DirectoryLpuItem lpu = UserInfo.get().getCollaborator().getLpu();
            List<DirectoryCollaboratorItem> items = dir.getItemsFiltered(lpu, true, false, false);
            for (int i = 0; i < items.size(); i++) {
                CollaboratorLocal collab = new CollaboratorLocal(items.get(i).getID(), null);//NULL AL
                collabList.add(collab);
            }
        }
        for (int i = 0; i < collabList.size(); i++) {
            CollaboratorLocal collab = collabList.get(i);
            SelectorEditable<CollaboratorFunctionsChunk> functions = collab.getFunctions();
            CollaboratorFunctionsChunk foundedByExtKey = null;
            for (int j = 0; j < functions.size(); j++) {
                CollaboratorFunctionsChunk cfc = functions.get(j);
                if (cfc.getExtKey() != null && cfc.getExtKey().equals(extkey)) {
                    foundedByExtKey = cfc;
                }
                if (foundedByExtKey != null
                        && foundedByExtKey.getFirstMedicalAid() != null
                        && foundedByExtKey.getFirstMedicalAid().getExtKey() != null
                        && foundedByExtKey.getFirstMedicalAid().getExtKey().equals(vmu)) {
                    return foundedByExtKey;
                }
            }
            if (foundedByExtKey != null) {
                //По внешнему ключу нашли, по типу первичной помощи надо создать
                CollaboratorFunctionsDetails d = new CollaboratorFunctionsDetails();
                d.collaboratorID = collab.getID();
                d.dvrID = foundedByExtKey.getDvr().getID();
                d.firstMedicalAidID = dirVmu.getItemFromExtKey(vmu).getID();
                d.receptionTypeID = foundedByExtKey.getReceptionType().getID();
                d.specialityID = foundedByExtKey.getSpeciality().getID();
                d.external_key = foundedByExtKey.getExtKey();
                CollaboratorFunctionsChunk collFunc = new CollaboratorFunctionsChunk(collab, d);
                collab.getFunctions().append(collFunc);
                try {
                    collab.save1();
                } catch (ClipsException ex) {
                    collab.clearBean();
                    collab.save1();
                }
                return collFunc;
            }
        }
        return null;
    }

    private CollaboratorFunctionsChunk getCollFunc(CollaboratorLocal collab, String extkey) throws ClipsException {
        SelectorEditable<CollaboratorFunctionsChunk> functions = collab.getFunctions();
        for (int i = 0; i < functions.size(); i++) {
            CollaboratorFunctionsChunk cfc = functions.get(i);
            if (cfc.getExtKey() != null && cfc.getExtKey().equals(extkey)) {
                return cfc;
            }
        }
        return functions.get(0);
    }

    private void fixDoubleSst() {
        System.out.println("Корректировка статталонов, имеющих один N_SYST");
        Set<Entry<Integer, HashSet<SstData>>> hashSetList = doubleSstMap.entrySet();
        for (Entry<Integer, HashSet<SstData>> entry : hashSetList) {
            HashSet<SstData> sstSet = entry.getValue();
            SstData correct = null;
            for (SstData sstData : sstSet) {
                Integer lnumber = sstData.getLnumberFromDiagnosys(clientMap);
                if (lnumber != null && sstData.lnumber == lnumber) {
                    correct = sstData;
                }
            }
            if (correct == null) {
                System.out.println("Ошибка : Дублируется N_SYST = " + entry.getKey() + ", ни одного валидного");
                out.println("Ошибка : Дублируется N_SYST = " + entry.getKey() + ", ни одного валидного");
            } else {
                SstData source = sstMap.get(correct.nSyst);
                correct.dniList = source.dniList;
                correct.dsList = source.dsList;
                sstMap.put(correct.nSyst, correct);
                System.out.println("Предупреждение : Дублируется N_SYST = " + entry.getKey() + ", валидным выбран " + correct.toString());
                out.println("Предупреждение : Дублируется N_SYST = " + entry.getKey() + ", валидным выбран " + correct.toString());
            }
        }
    }

    /**
     * Корректировка невалидных ссылок из статталона на пациентов
     * Для статталонов у которых несуществующий LNUMBER выполняется поиск по
     * всем диагнозам, ссылающимся на него. Если все диагнозы ссылаются на
     * существующий LNUMBER, то статталон перевязывается.
     * ВЫЗЫВАТЬ ОБЯЗАТЕЛЬНО ДО placeDiagnosys
     * @param sstMap
     */
    private void fixSstLnumber() {
        System.out.println("Корректировка невалидных ссылок из статталона на пациентов");
        Set<Entry<Integer, SstData>> entrySet = sstMap.entrySet();
        for (Iterator<Entry<Integer, SstData>> it = entrySet.iterator(); it.hasNext();) {
            Entry<Integer, SstData> entry = it.next();
            SstData sst = entry.getValue();
            if (!clientMap.containsKey(sst.lnumber)) {
                //проверим ссылки LNUMBER у диагнозов
                Integer lNumber = sst.getLnumberFromDiagnosys(clientMap);
                if (lNumber != null) {
                    sst.lnumber = lNumber;
                    System.out.println("Предупреждение : Исправлен LNUMBER в статталоне N_SYST = " + sst.nSyst + " LNUMBER = " + sst.lnumber + " (по диагнозу)");
                    out.println("Предупреждение : Исправлен LNUMBER в статталоне N_SYST = " + sst.nSyst + " LNUMBER = " + sst.lnumber + " (по диагнозу)");
                } else {
                    it.remove();
                    System.out.println("Ошибка : Неправильный LNUMBER в статталоне N_SYST = " + sst.nSyst + " LNUMBER = " + sst.lnumber);
                    out.println("Ошибка : Неправильный LNUMBER в статталоне N_SYST = " + sst.nSyst + " LNUMBER = " + sst.lnumber);
                }
            }
            if (sst.dataSt == null) {
                Collections.sort(sst.dniList);
                sst.dataSt = sst.dniList.get(0).date;
            }
        }
    }

    /**
     * Размещает диагнозы по посещениям для всех посещений
     * @param sstMap
     */
    private void placeDiagnosys() {
        System.out.println("Расстановка диагнозов по посещениям");
        Collection<SstData> sstList = sstMap.values();
        int counter = 0;
        for (SstData sstData : sstList) {
            if ((counter % 5000) == 0) {
                System.out.println("Расстановка диагнозов - " + counter/((float)sstList.size())*100 + "%");
            }
            Collections.sort(sstData.dsList);
            for (DsData dsData : sstData.dsList) {
                plaсeDiagnos(sstData.dniList, dsData, sstData.idWrach);
            }
            sstData.dsList = null;
            counter ++;
        }
        System.out.println("Расстановка диагнозов по посещениям завершена");
    }

    /**
     * Размещает один диагноз по посещениям
     * @param dniList
     * @param dsData
     */
    private void plaсeDiagnos(ArrayList<DniData> dniList, DsData dsData, int idWrach) {
        DniData nearest = null;
        long minDays = Long.MAX_VALUE;
        for (DniData dniData : dniList) {
            long days = DateTimeUtils.daysBetween(dsData.dateReg, dniData.date);
            if (dniData.idWrach != idWrach) {
                days += 1000000;
            }
            if (days < minDays) {
                //Заключительный можно пихать только один
                if (dsData.isFinal() && !dniData.hasFinal()) {
                    minDays = days;
                    nearest = dniData;
                }
                //Сопутствующий можно пихать только если есть заключительный
                if (!dsData.isFinal() && dniData.hasFinal()) {
                    minDays = days;
                    nearest = dniData;
                }
            }
        }
        if (nearest != null) {
            if (nearest.idWrach != idWrach) {
                System.out.println("Предупреждение : Врач указанный в статталоне не указан ни в одном посещении, N_SYST = " + dsData.nSyst);
                out.println("Предупреждение : Врач указанный в статталоне не указан ни в одном посещении, N_SYST = " + dsData.nSyst);
            }
            nearest.dsDataList.add(dsData);
        } else {
            System.out.println("Ошибка : Диагноз невозможно привязать к посещению, N_SYST = " + dsData.nSyst);
            out.println("Ошибка : Диагноз невозможно привязать к посещению, N_SYST = " + dsData.nSyst);
        }
    }
}
TOP

Related Classes of clips.directory.editors.update.updaters.UpdaterMedData

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.