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);