/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package clips.directory.editors.update.updaters;
import beans.contract.entity.Polis;
import beans.directory.simple.entities.SocialStatus;
import beans.user.client.updater.ClientChunk;
import beans.user.client.updater.ClientUniq;
import beans.user.client.updater.UpdaterClientBean;
import beans.user.client.updater.UpdaterClientBeanRemote;
import cli_fmw.delegate.SharedBean;
import cli_fmw.delegate.directory.UpdaterDirectory;
import cli_fmw.delegate.directory.complex.DirectoryKladr;
import cli_fmw.delegate.directory.complex.DirectoryKladrItem;
import cli_fmw.delegate.directory.complex.DirectoryKladrType;
import cli_fmw.delegate.directory.complex.DirectoryKladrTypeItem;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import cli_fmw.delegate.directory.simple.DirectorySimpleItem;
import cli_fmw.main.ClipsException;
import cli_fmw.utils.MessageBox;
import clips.delegate.directory.simple.appointment.DirectoryAppointment;
import clips.delegate.directory.simple.clientDocumentType.DirectoryDocumentType;
import clips.delegate.directory.complex.DirectoryDistrict;
import clips.delegate.directory.complex.DirectoryDistrictItem;
import clips.delegate.directory.simple.insurer.DirectoryInsurer;
import clips.delegate.directory.simple.insurer.DirectoryInsurerItem;
import clips.delegate.directory.simple.name.DirectoryName;
import clips.delegate.directory.simple.pathron.DirectoryPathron;
import clips.delegate.directory.simple.regionIdCode.DirectoryRegionIdCode;
import clips.delegate.directory.simple.socialStatus.DirectorySocialStatus;
import clips.delegate.directory.simple.surname.DirectorySurname;
import clips.main.ClipsConfig;
import framework.beans.directory.DirectoryItemDetails;
import framework.beans.directory.simple.entities.ClientDocumentType;
import framework.beans.directory.simple.entities.Sex;
import framework.utils.Converter;
import framework.utils.FormatChecker;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.HashSet;
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 class UpdaterClients extends UpdaterDirectory {
public static final int THREAD_COUNT = 8;
private DirectorySurname dirSurname;
private DirectoryName dirName;
private DirectoryPathron dirPathron;
private DirectoryAppointment dirApp;
private DirectoryDistrict dirDistrict;
private DirectoryRegionIdCode dirRegionIdCode;
private DirectoryInsurer dirInsurer;
private DirectorySocialStatus dirSocialStatus;
private DirectoryDocumentType dirDocumentType;
private DirectoryKladr dirKladr;
private DirectoryKladrType dirKladrType;
public static DirectoryKladrTypeItem STREET;
public static DirectoryKladrTypeItem PER;
private static final String BIRSKIY_RAYON = "0201300000000000000";
private static final String BIRSK = "0201300100000000000";
private enum Col {
LNUMBER,
NUM_AMB_K,
ERR_DAT,
FAMILY,
NAME,
FATHER,
SEX,
BITHDATE,
INSUR_AREA,
INSUR_ORG,
IDAREA,
KLREGION,
KLITEM,
KLSTREET,
HOUSE,
LETTER,
ROOM,
UCH,
SOCSTATUS,
IDWORK,
PROF,
INN,
POLSERIA,
POLNUMBER,
DOCUMENT,
DOCSERIA,
DOCNUMBER,
SNILS,
NAM_STREET,
REG_WRACH,
DATA,
}
private enum ColDop{
LNUMBER,
INSUR_ORG
}
private enum ColJob {
ID,
NAME
}
public enum ColSst {
LNUMBER,
}
@Override
public String getFilename() {
return "KADR.DBF";
}
@Override
public String getTitle() {
return "Пациенты";
}
@Override
public void updateImpl() throws ClipsException {
SharedBean<UpdaterClientBeanRemote> bean =
new SharedBean<UpdaterClientBeanRemote>(UpdaterClientBean.class.getSimpleName());
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);
//Деление массивов
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>();
//Запись в базу
for (int i = 0; i < THREAD_COUNT; i++) {
Writer w = new Writer(chunkLists.get(i), i);
threadList.add(w);
}
for (int i = 0; i < THREAD_COUNT; i++) {
threadList.get(i).start();
}
try {
for (int i = 0; i < THREAD_COUNT; i++) {
threadList.get(i).join();
}
} catch (InterruptedException ex) {
//DO NOTHING
}
bean.get().setUseStaticMap(false);
GregorianCalendar gc2 = new GregorianCalendar();
long mc = gc2.getTimeInMillis() - gc1.getTimeInMillis();
System.out.println("Work time: " + mc + " ms");
out.println("Work time: " + mc + " ms");
}
private String fixTitle(String parentCode, String street) {
if (parentCode.equals("0201300100000000000")) { //Бирск
if (street.equals("пер.Школьный")) return "Школьный";
if (street.equals("пер.Высоковольтный")) return "Высоковольтный";
if (street.equals("пер.Советский")) return "Советский";
if (street.equals("пер. Гоголя")) return "Гоголя";
if (street.equals("пер.Уральский")) return "Уральский";
if (street.equals("пер.Коммунаров")) return "Коммунаров";
if (street.equals("пер.Уфимский")) return "Уфимский";
if (street.equals("Пер.речной")) return "Речной";
if (street.equals("пер.Крестьянский")) return "Крестьянский";
if (street.equals("пер.Рабочий")) return "Рабочий";
if (street.equals("пер. Зеленый")) return "Зеленый";
if (street.equals("пер.Некрасова")) return "Некрасова";
if (street.equals("пер.Первомайский")) return "Первомайский";
if (street.equals("пер.Больничный")) return "Больничный";
if (street.equals("Пер.революционный")) return "Революционный";
if (street.equals("пер.Октябрьский")) return "Октябрьский";
if (street.equals("пер.Набережный")) return "Набережный";
if (street.equals("Свердловская")) return "Свердлова";
if (street.equals("пер.Курбатова")) return "Курбатова";
if (street.equals("Красноармеская")) return "Красноармейская";
if (street.equals("8-ое марта")) return "8 Марта";
if (street.equals("Малокавказкая")) return "Малокавказская";
if (street.equals("Крупская")) return "Крупской";
if (street.equals("2-я Пятилетка")) return "2 Пятилетка";
if (street.equals("К.Маркса")) return "Карла Маркса";
if (street.equals("Космодемьянская")) return "Космодемьянской";
if (street.equals("Варенцова")) return "Варенцовой";
if (street.equals("Курчатого")) return "Курчатова";
if (street.equals("Цюрупа")) return "Цюрупы";
if (street.equals("М.Кузнечная")) return "Малокузнецкая";
if (street.equals("9-ое Января")) return "9 Января";
if (street.equals("9 Января")) return "9 Января";
if (street.equals("М. Гончарная")) return "Малогончарная";
if (street.equals("М.Кавказская")) return "Малокавказская";
if (street.equals("пер.Молодогвардейски")) return "Молодогвардейский";
if (street.equals("Давлетшина")) return "Давлетшиной";
if (street.equals("Кузнечная")) return "";
if (street.equals("пер.Гагарина")) return "Гагарина";
if (street.equals("60 лет октября")) return "70 лет октября";
if (street.equals("Пер.молодежный")) return "Молодежный";
if (street.equals("")) return "";
}
if (parentCode.equals("0200100100000000000")) { //Уфа
if (street.equals("Зорги")) return "Рихарда Зорге";
if (street.equals("Р.Зорге")) return "Рихарда Зорге";
if (street.equals("Цюрупа")) return "Цюрупы";
if (street.equals("")) return "";
}
return street;
}
/**
* Удаление невалидные данные пациентов
* удаляются пациенты с одинаковыми ФИО и датой рождения
* @param chunks
* @return
*/
private ArrayList<ClientChunk> compressChunks(ArrayList<ClientChunk> chunks, Set<Integer> whiteList) throws ClipsException {
int size = chunks.size();
//Collections.sort(chunks);
HashMap<ClientUniq, ClientChunk> target = new HashMap<ClientUniq, ClientChunk>(256);
/* Простейшее продположение (на основе 5 примеров) что в отчет идут данные
* первого пациента.
* Дополнение - худший чанк (по compare()) заменяется лучшим
* ------ все это неверно
* сначала надо составить белый список LNUMBER, участвующих в статталонах
* затем при дублировании чанк из белого списка может вытеснить чанк не
* из белого списка
*/
for (ClientChunk chunk : chunks) {
ClientUniq cu = new ClientUniq(chunk.famID, chunk.nameID, chunk.patronID, chunk.dateBorn);
ClientChunk oldChunk = target.get(cu);
if (oldChunk == null) {
target.put(cu, chunk);
} else {
if (whiteList.contains(chunk.lnumber)) {
if (!whiteList.contains(oldChunk.lnumber)) {
target.put(cu, chunk);
} else {
throw new ClipsException("Оба пациента участвуют в статталонах " +
" lnumber = " + oldChunk.lnumber +
", lnumber = " + chunk.lnumber);
}
}
}
}
System.out.println("Повторы удалены (source = " + size + " target = " + target.size() + ")");
return new ArrayList<ClientChunk>(target.values());
}
private void writeChunks(ArrayList<ClientChunk> clientChunks, int streamNumber, SharedBean<UpdaterClientBeanRemote> bean ) throws ClipsException {
int errorCount = 0;
for (int i = 0; i < clientChunks.size(); i++) {
if ((i%100) == 0) {
System.out.println("Поток " + streamNumber + ": Запись пациентов в базу : " + i/((float)clientChunks.size())*100 + "% (" + i + ") запись");
}
ClientChunk c = clientChunks.get(i);
try {
bean.get().update(c);
} catch (Exception ex) {
errorCount++;
bean.clear();
ex.printStackTrace();
System.out.print("Ошибка : Импорт пациента не удался KADR.DBF lnum=(" + c.lnumber + ") \n" + MessageBox.parseException(ex));
System.out.println("lnumber = " + c.lnumber);
out.print("Ошибка : Импорт пациента не удался KADR.DBF lnum=(" + c.lnumber + ") \n" + MessageBox.parseException(ex));
out.println("lnumber = " + c.lnumber);
if (errorCount >= i/2 && errorCount > 10) {
throw new ClipsException("Обновление не удалось");
}
}
}
}
class Writer extends Thread {
ArrayList<ClientChunk> list;
int number;
private SharedBean<UpdaterClientBeanRemote> bean =
new SharedBean<UpdaterClientBeanRemote>(UpdaterClientBean.class.getSimpleName());
public Writer(ArrayList<ClientChunk> list, int number) {
this.list = list;
this.number = number;
}
@Override
public void run() {
try {
writeChunks(list, number, bean);
} catch (ClipsException ex) {
//Заканчиваем выполнение потока
}
}
}
}
//Чтоб не мешалось
/*String s = String.format("%1$10s |%2$15s |%3$12s |%4$14s |%5$3s |%6$12s",
numambk,
fam,
name,
patron,
sex,
Converter.dateToString(dateBorn)
);
s = s + String.format(" |%1$4s |%2$5s |%3$4s |%4$13s |%5$13s |%6$18s |%7$5s |%8$5s |%9$5s",
insurArea,
insurOrg,
idArea,
klRegion,
klItem,
klStreet,
house,
letter,
room
);
s = s + String.format(" |%1$3s |%2$12s |%3$6s |%4$17s |%5$3s |%6$4s |%7$7s |%8$15s |%8$20s",
socStatus,
inn,
polSeria,
polNumber,
docType,
docSeria,
docNumber,
snils,
namstreet
);
System.out.println(s);*/