/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package clips.directory.editors.update.updaters;
import beans.directory.mkb10.MKBCode;
import beans.directory.mkb10.MKBCode.CompareResould;
import beans.directory.mkb10.MKBParser;
import cli_fmw.delegate.directory.UpdaterDirectory;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import cli_fmw.main.ClipsException;
import cli_fmw.utils.Selector;
import clips.delegate.directory.complex.DirectoryMKB10;
import clips.delegate.directory.complex.DirectoryMKB10Item;
import clips.main.ClipsConfig;
import beans.directory.mkb10.entity.Mkb10Details;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.util.HashMap;
import org.xBaseJ.micro.DBF;
import org.xBaseJ.micro.fields.Field;
import org.xBaseJ.micro.xBaseJException;
/**
*
* @author vip
*/
public class UpdaterDirectoryMKB extends UpdaterDirectory{
DirectoryMKB10 dirMKB;
@Override
public String getFilename() {
return "s_mkb10.dbf";
}
@Override
public String getTitle() {
return "Справочник МКБ";
}
@Override
public void updateImpl() throws ClipsException {
dirMKB = DirectoryLocator.getDirectory(DirectoryMKB10.class);
ClipsConfig cfg = ClipsConfig.getInstance();
File file = new File(cfg.getLastDBFImportPath(),getFilename());
DBF dbf = createDBF(file);
HashMap<String, Field> fields = new HashMap<String, Field>();
try {
//fields.put("PRIZNAK", dbf.getField("PRIZNAK"));
fields.put("CODE", dbf.getField("CODE"));
fields.put("NAME", dbf.getField("NAME"));
//fields.put("SHIFT", dbf.getField("SHIFT"));
} catch (xBaseJException ex) {
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
}
int recordCount = dbf.getRecordCount();
for (int c = 0; c < recordCount; c++) {
try {
if ((c%500) == 0) {
System.out.println("Обновление МКБ выполнено " + (c+1)/((float)recordCount)*100 + "%");
out.println("Обновление МКБ выполнено " + (c+1)/((float)recordCount)*100 + "%");
}
dbf.read();
//String priznak = fields.get("PRIZNAK").get().trim();
String kod = fields.get("CODE").get().trim();
String title = fields.get("NAME").get().trim();
//String shortTitle = fields.get("SHIFT").get().trim();
/*if (priznak.equals("1")
|| title.isEmpty() && shortTitle.isEmpty()) {
continue;
}*/
if (title.isEmpty()) {
continue;
}
DirectoryMKB10Item item = dirMKB.getItemByCode(kod);
if (item == null) {
DirectoryMKB10Item parent = getParent(kod);
Mkb10Details d = new Mkb10Details();
d.code = kod;
d.title = title;
//d.shortTitle = shortTitle;
d.parentItem = parent.getID();
item = new DirectoryMKB10Item(d);
parent.getItems().append(item);
System.out.println("Новый МКБ итем : " + item);
}
if (!item.getTitle().equals(title)) {
//System.out.println("МКБ итем - другое название : " + title);
//item.setTitle(title);
}
/*if (!item.getShortTitle().equals(shortTitle)) {
item.setShortTitle(shortTitle);
}*/
} catch (IOException ex) {
closeDBF(dbf);
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " строка + " + c, ex);
} catch (xBaseJException ex) {
closeDBF(dbf);
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " строка + " + c, ex);
} catch (ParseException ex) {
closeDBF(dbf);
throw new ClipsException("Ошибка при парсинге кода мкб. Файл " + dbf.getName() + " строка + " + c, ex);
}
}
closeDBF(dbf);
}
private DirectoryMKB10Item getParent(String code) throws ParseException, ClipsException{
MKBCode decoded = MKBParser.decodeWellFormed(code);
return dirScanRecursive(null, dirMKB.getItems(), decoded);
}
private DirectoryMKB10Item dirScanRecursive(DirectoryMKB10Item cur, Selector<DirectoryMKB10Item> selector, MKBCode code) throws ParseException, ClipsException{
int size = selector.size();
for (int i = 0; i < size; i++){
DirectoryMKB10Item item = selector.get(i);
if (item.getID() == 0){
continue;
}
MKBCode itemCode = item.getDecodedCode();
CompareResould res = itemCode.advanceCompare(code);
switch (res){
case contains:
return dirScanRecursive(item, item.getItems(), code);
}
}
return cur;
}
}