/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package clips.directory.editors.update.updaters.dlo;
import beans.user.client.facilityClient.FacilityClient;
import beans.user.client.facilityClient.FacilityClientDetails;
import beans.user.client.facilityClient.FacilityDocumentDetails;
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.DirectoryLocator;
import cli_fmw.delegate.directory.simple.DirectorySimpleItem;
import cli_fmw.main.ClipsException;
import clips.delegate.directory.simple.clientDocumentType.DirectoryDocumentType;
import clips.delegate.directory.simple.exemptionType.DirectoryExcemption;
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.beans.directory.simple.entities.Sex;
import framework.generic.ClipsServerException;
import framework.utils.Comparator;
import framework.utils.Converter;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
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 lacoste
*/
public class UpdaterFacilityClients extends UpdaterDirectory {
private DirectorySurname dirSurname;
private DirectoryName dirName;
private DirectoryPathron dirPathron;
private DirectoryDocumentType dirDocumentType;
private DirectoryExcemption dirExemption;
private Date nullDate= new Date();
private enum Col {
SS,
SN_POL,
FAM,
IM,
OT,
W,
DR,
SN_DOC,
C_DOC,
ADRES,
DOM,
KOR,
KV,
OKATO_REG,
S_EDV,
DB_EDV,
DE_EDV,
C_KAT1,
C_KAT2,
DATE_RSB,
DATE_RSE,
U_TYPE,
D_TYPE,
C_REG
}
private enum ColDoc {
SS,
C_KAT,
NAME_DL,
SN_DL,
DATE_BL,
DATE_EL
}
@Override
public String getFilename() {
return "C_REGO.DBF";
}
@Override
public String getTitle() {
return "Льготники";
}
@Override
protected void updateImpl() throws ClipsException {
Calendar cal = new GregorianCalendar(9999, 99, 99);
nullDate = cal.getTime();
SharedBean<UpdaterClientBeanRemote> bean =
new SharedBean<UpdaterClientBeanRemote>(UpdaterClientBean.class.getSimpleName());
ClipsConfig cfg = ClipsConfig.getInstance();
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);
}
int 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);
for (int i = 0; i < recordCount; i++) {
try {
dbf.read();
famList.add(Converter.firstUpper(fields.get(Col.FAM).get().trim(), true));
namList.add(Converter.firstUpper(fields.get(Col.IM).get().trim(), true));
patronList.add(Converter.firstUpper(fields.get(Col.OT).get().trim(), true));
} 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("Отчества загружены");
dirDocumentType = DirectoryLocator.getDirectory(DirectoryDocumentType.class, true);
dirExemption = DirectoryLocator.getDirectory(DirectoryExcemption.class, true);
try {
dbf.startTop();
} catch (IOException ex) {
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
} catch (xBaseJException ex) {
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
}
int counter = 0;
GregorianCalendar gc1 = new GregorianCalendar();
ArrayList<FacilityClientDetails> clientList = new ArrayList<FacilityClientDetails>(recordCount);
HashMap<String, Integer> snilsMap = new HashMap<String, Integer>();
for (int i = 0; i < recordCount; i++) {
try {
dbf.read();
if ((counter%500) == 0) {
try {
UserInfo.get().disturbServer();
} catch (Throwable ex) {
//пофиг
}
}
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;
}
FacilityClientDetails c = new FacilityClientDetails();
//код изменения
int uType = 0;
try {
uType = Integer.parseInt(fields.get(Col.U_TYPE).get().trim());
if (uType < 0 || uType > 3) {
throw new NumberFormatException();
}
} catch (NumberFormatException ex) {
System.out.println("Предупреждение : код изменения некорректен " + dbf.getName() + " snils=(" + c.snils + ")");
out.println("Предупреждение : код изменения некорректен " + dbf.getName() + " snils=(" + c.snils + ")");
uType = 0;
}
String snils = fields.get(Col.SS).get().trim();
if (snilsMap.containsKey(snils)) {
throw new ClipsException("Повторяющийся СНИЛС " + dbf.getName() + " snils=(" + snils + ")" + " строка=" + i);
}
snilsMap.put(snils, uType);
c.snils = snils;
c.uType = uType;
c.polisSN = fields.get(Col.SN_POL).get().trim();
c.surnameId = dirSurname.getItemFromTitle(Converter.firstUpper(fields.get(Col.FAM).get().trim(), true)).getID();
c.nameId = dirName.getItemFromTitle(Converter.firstUpper(fields.get(Col.IM).get().trim(), true)).getID();
c.pathronId = dirPathron.getItemFromTitle(Converter.firstUpper(fields.get(Col.OT).get().trim(), true)).getID();
//пол льготника
String sex = fields.get(Col.W).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() + " snils=(" + c.snils + ")");
out.println("Предупреждение : У пациента неопределен пол. " + dbf.getName() + " snils=(" + c.snils + ")");
c.sexId = Sex.CLIENT_SEX_MALE;
String fam = fields.get(Col.FAM).get().trim();
if (fam.endsWith("а")) {
c.sexId = Sex.CLIENT_SEX_FEMALE;
} else {
String nam = fields.get(Col.IM).get().trim();
if (nam.endsWith("а") || nam.endsWith("я")) {
c.sexId = Sex.CLIENT_SEX_FEMALE;
}
}
out.println("Пол выставлен : " + (c.sexId == Sex.CLIENT_SEX_MALE ? "Муж." : "Жен."));
}
//дата рождения
c.bornDate = null;
try {
Calendar bornDate = ((DateField)fields.get(Col.DR)).getCalendar();
if (Comparator.dataEqual(nullDate, bornDate.getTime())) {
c.bornDate = null;
}
else {
c.bornDate = bornDate.getTime();
}
} catch (NumberFormatException ex) {
System.out.println("Предупреждение : Дата рождения пациента некорректна " + dbf.getName() + " snils=(" + c.snils + ")");
out.println("Предупреждение : Дата рождения пациента некорректна " + dbf.getName() + " snils=(" + c.snils + ")");
}
//документ, удостоверяющий личность
DirectorySimpleItem doctype = dirDocumentType.getItemFromExtKey(fields.get(Col.C_DOC).get().trim());
if (doctype == null) {
c.docTypeId = 0;
System.out.println("Предупреждение : не найден тип документа " + dbf.getName() + " snils=(" + c.snils + ")");
out.println("Предупреждение : не найден тип документа " + dbf.getName() + " snils=(" + c.snils + ")");
}
else {
c.docTypeId = doctype.getID();
}
c.docSN = fields.get(Col.SN_DOC).get().trim();
//адрес, регистрация
c.address = fields.get(Col.ADRES).get().trim();
c.building = fields.get(Col.DOM).get().trim();
c.corpus = fields.get(Col.KOR).get().trim();
c.flat = fields.get(Col.KV).get().trim();
c.okatoReg = fields.get(Col.OKATO_REG).get().trim();
//льготность
Integer flag = null;
try {
flag = Integer.parseInt(fields.get(Col.S_EDV).get().trim());
if (flag < 0 || flag > 1) {
throw new NumberFormatException();
}
} catch (NumberFormatException ex) {
flag = null;
System.out.println("Предупреждение : признак получения НСУ некорректен " + dbf.getName() + " snils=(" + c.snils + ")");
out.println("Предупреждение : признак получения НСУ некорректен " + dbf.getName() + " snils=(" + c.snils + ")");
}
c.flagNSU = flag;
c.nsuBegin = null;
try {
Calendar nsuBegin = ((DateField)fields.get(Col.DB_EDV)).getCalendar();
if (Comparator.dataEqual(nullDate, nsuBegin.getTime())) {
c.nsuBegin = null;
}
else {
c.nsuBegin = nsuBegin.getTime();
}
} catch (NumberFormatException ex) {
System.out.println("Предупреждение : Дата начала действия права на получение НСУ некорректна " + dbf.getName() + " snils=(" + c.snils + ")");
out.println("Предупреждение : Дата начала действия права на получение НСУ некорректна " + dbf.getName() + " snils=(" + c.snils + ")");
}
c.nsuEnd = null;
try {
Calendar nsuEnd = ((DateField)fields.get(Col.DE_EDV)).getCalendar();
if (Comparator.dataEqual(nullDate, nsuEnd.getTime())) {
c.nsuEnd = null;
}
else {
c.nsuEnd = nsuEnd.getTime();
}
} catch (NumberFormatException ex) {
System.out.println("Предупреждение : Дата окончания действия права на получение НСУ некорректна " + dbf.getName() + " snils=(" + c.snils + ")");
out.println("Предупреждение : Дата окончания действия права на получение НСУ некорректна " + dbf.getName() + " snils=(" + c.snils + ")");
}
DirectorySimpleItem exemp1 = dirExemption.getItemFromExtKey(fields.get(Col.C_KAT1).get().trim());
if (exemp1 == null) {
c.exemp1Id = 0;
}
else {
c.exemp1Id = exemp1.getID();
}
DirectorySimpleItem exemp2 = dirExemption.getItemFromExtKey(fields.get(Col.C_KAT2).get().trim());
if (exemp2 == null) {
c.exemp2Id = 0;
}
else {
c.exemp2Id = exemp2.getID();
}
if (c.exemp1Id == 0 && c.exemp2Id == 0) {
System.out.println("Предупреждение : не найдена категория льготности " + dbf.getName() + " snils=(" + c.snils + ")");
out.println("Предупреждение : не найдена категория льготности " + dbf.getName() + " snils=(" + c.snils + ")");
}
else if (c.exemp1Id != 0 && c.exemp2Id != 0) {
System.out.println("Предупреждение : указаны две категории льготности " + dbf.getName() + " snils=(" + c.snils + ")");
out.println("Предупреждение : указаны две категории льготности " + dbf.getName() + " snils=(" + c.snils + ")");
}
//даты включения в регистр и исключения из регистра
c.regBegin = null;
try {
Calendar regBegin = ((DateField)fields.get(Col.DATE_RSB)).getCalendar();
if (Comparator.dataEqual(nullDate, regBegin.getTime())) {
c.regBegin = null;
}
else {
c.regBegin = regBegin.getTime();
}
} catch (NumberFormatException ex) {
System.out.println("Предупреждение : Дата включения в региональный Регистр некорректна " + dbf.getName() + " snils=(" + c.snils + ")");
out.println("Предупреждение : Дата включения в региональный Регистр некорректна " + dbf.getName() + " snils=(" + c.snils + ")");
}
c.regEnd = null;
try {
Calendar regEnd = ((DateField)fields.get(Col.DATE_RSE)).getCalendar();
if (Comparator.dataEqual(nullDate, regEnd.getTime())) {
c.regEnd = null;
}
else {
c.regEnd = regEnd.getTime();
}
} catch (NumberFormatException ex) {
System.out.println("Предупреждение : Дата исключения из регионального Регистра некорректна " + dbf.getName() + " snils=(" + c.snils + ")");
out.println("Предупреждение : Дата исключения из регионального Регистра некорректна " + dbf.getName() + " snils=(" + c.snils + ")");
}
//признак "особый случай"
c.dType = fields.get(Col.D_TYPE).get().trim();
c.c_reg = fields.get(Col.C_REG).get().trim();
clientList.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);
}
}
closeDBF(dbf);
GregorianCalendar gc2 = new GregorianCalendar();
long mc = gc2.getTimeInMillis() - gc1.getTimeInMillis();
System.out.println("Закончилось чтение льготников из файла. Work time: " + mc + " ms");
out.println("Закончилось чтение льготников из файла. Work time: " + mc + " ms");
File fileDoc = new File(cfg.getLastDBFImportPath(), "C_REGL.DBF");
DBF dbfDoc = createDBF(fileDoc);
HashMap<ColDoc, Field> docFields = new HashMap<ColDoc, Field>();
try {
for (int i = 0; i < ColDoc.values().length; i++) {
ColDoc col = ColDoc.values()[i];
docFields.put(col, dbfDoc.getField(col.toString()));
}
} catch (xBaseJException ex) {
throw new ClipsException("Ошибка при чтении данных из файла " + dbfDoc.getName(), ex);
}
recordCount = dbfDoc.getRecordCount();
gc1 = new GregorianCalendar();
ArrayList<FacilityDocumentDetails> docList = new ArrayList<FacilityDocumentDetails>(recordCount);
Set<String> snilsSet = new HashSet<String>();
for (int i = 0; i < recordCount; i++) {
try {
dbfDoc.read();
if ((counter%500) == 0) {
try {
UserInfo.get().disturbServer();
} catch (Throwable ex) {
//пофиг
}
}
if ((i%1000) == 0) {
System.out.println("Обновление данных о документах льготности : " + i/((float)recordCount)*100 + "% (" + i + ") запись");
gc2 = new GregorianCalendar();
mc = gc2.getTimeInMillis() - gc1.getTimeInMillis();
System.out.println("Work time: " + mc + " ms");
}
if (dbfDoc.deleted()) {
continue;
}
FacilityDocumentDetails d = new FacilityDocumentDetails();
String snils = docFields.get(ColDoc.SS).get().trim();
Integer uType = snilsMap.get(snils);
if (snilsSet.contains(snils) && uType != null && uType != FacilityClient.CHANGES_IN_INFO) {
throw new ClipsException("Повторяющийся СНИЛС " + dbfDoc.getName() + " snils=(" + snils + ")" + " строка=" + i);
}
snilsSet.add(snils);
d.snils = snils;
DirectorySimpleItem exemp = dirExemption.getItemFromExtKey(docFields.get(ColDoc.C_KAT).get().trim());
if (exemp == null) {
d.exempId = 0;
System.out.println("Предупреждение : не найден тип льготности " + dbfDoc.getName() + " snils=(" + d.snils + ")");
out.println("Предупреждение : не найден тип льготности " + dbfDoc.getName() + " snils=(" + d.snils + ")");
}
else {
d.exempId = exemp.getID();
}
d.docType = docFields.get(ColDoc.NAME_DL).get().trim();
d.docSN = docFields.get(ColDoc.SN_DL).get().trim();
d.gspBegin = null;
try {
Calendar nsuBegin = ((DateField)docFields.get(ColDoc.DATE_BL)).getCalendar();
if (Comparator.dataEqual(nullDate, nsuBegin.getTime())) {
d.gspBegin = null;
}
else {
d.gspBegin = nsuBegin.getTime();
}
} catch (NumberFormatException ex) {
System.out.println("Предупреждение : Дата начала действия права на ГСП некорректна " + dbfDoc.getName() + " snils=(" + d.snils + ")");
out.println("Предупреждение : Дата начала действия права на ГСП некорректна " + dbfDoc.getName() + " snils=(" + d.snils + ")");
}
d.gspEnd = null;
try {
Calendar nsuEnd = ((DateField)docFields.get(ColDoc.DATE_EL)).getCalendar();
if (Comparator.dataEqual(nullDate, nsuEnd.getTime())) {
d.gspEnd = null;
}
else {
d.gspEnd = nsuEnd.getTime();
}
} catch (NumberFormatException ex) {
System.out.println("Предупреждение : Дата окончания действия права на ГСП некорректна " + dbfDoc.getName() + " snils=(" + d.snils + ")");
out.println("Предупреждение : Дата окончания действия права на ГСП некорректна " + dbfDoc.getName() + " snils=(" + d.snils + ")");
}
docList.add(d);
} catch (IOException ex) {
closeDBF(dbfDoc);
throw new ClipsException("Ошибка при чтении данных из файла " + dbfDoc.getName() + " (строка " + i + ")", ex);
} catch (xBaseJException ex) {
closeDBF(dbfDoc);
throw new ClipsException("Ошибка при чтении данных из файла " + dbfDoc.getName() + " (строка " + i + ")", ex);
}
}
closeDBF(dbfDoc);
gc2 = new GregorianCalendar();
mc = gc2.getTimeInMillis() - gc1.getTimeInMillis();
System.out.println("Закончилось чтение данных о документах о льготности из файла. Work time: " + mc + " ms");
out.println("Закончилось чтение данных о документах о льготности из файла. Work time: " + mc + " ms");
System.out.println("---------------------------------------------------");
out.println("---------------------------------------------------");
try {
bean.get().updateFacilityClients(clientList, docList);
} catch (ClipsServerException ex) {
throw new ClipsException("Ошибка при записи в базу списка льготников", ex);
}
}
}