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