/*
* 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);
}
}
}