}
@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];