/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package clips.delegate.doctor.diagnosis;
import beans.directory.simple.entities.DiagnosisType;
import beans.doctor.diagnosis.DiagnosisBean;
import cli_fmw.delegate.cache.ExtraDataManager;
import beans.doctor.diagnosis.DiagnosisDetails;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import clips.delegate.directory.complex.DirectoryMKB10;
import clips.delegate.directory.complex.DirectoryMKB10Item;
import beans.doctor.diagnosis.DiagnosisBeanRemote;
import cli_fmw.delegate.AuditListener;
import clips.delegate.doctor.HasSerrenLocal;
import clips.delegate.doctor.Iconable;
import clips.delegate.DEC.DECServiceRender;
import cli_fmw.delegate.cache.DelegateExtraData;
import clips.delegate.service.SerRenLocal;
import cli_fmw.main.ClipsException;
import cli_fmw.delegate.utils.TimeLocal;
import clips.doctor.diagnosis.TableModelAccompDiagnosisList;
import cli_fmw.main.DelegatePrintable;
import cli_fmw.report.AlignmentType;
import cli_fmw.report.CombinedReportCreator;
import cli_fmw.report.ExtraField;
import cli_fmw.report.FormReportCreator;
import cli_fmw.report.TableReportOptions;
import cli_fmw.utils.ErrorValue;
import clips.doctor.newEMC.init.generic.DelegateNodeLeaf;
import clips.delegate.directory.simple.diagnosisEncounter.DirectoryDiagnosisEncounter;
import clips.delegate.directory.simple.diagnosisEncounter.DirectoryDiagnosisEncounterItem;
import clips.delegate.directory.simple.diagnosisType.DirectoryDiagnosisType;
import clips.delegate.directory.simple.diagnosisType.DirectoryDiagnosisTypeItem;
import clips.delegate.directory.simple.traumaType.DirectoryTraumaType;
import clips.delegate.directory.simple.traumaType.DirectoryTraumaTypeItem;
import clips.delegate.doctor.Signable;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.table.TableModel;
import framework.utils.Converter;
/**
* Делегат, предоставляющий доступ к одной записи в таблице diagnosis
* (постановка диагноза)
* @author ViP
*/
public class DiagnosisLocal extends DelegateNodeLeaf<DiagnosisBeanRemote, DiagnosisDetails>
implements Iconable, DelegatePrintable, HasSerrenLocal, Signable {
public static String[] STAGES = new String[]{ "","I","II","III","IV" };
private DiagnosisCacheList accompDiagnosisList = new DiagnosisCacheList(getEDM());
private DECServiceRender serviceRender = new DECServiceRender(this, "услуга, в рамках которой поставлен дигноз", getAuditListener());
private static ImageIcon icon = null;
/**
*
*/
private class DiagnosisCacheList extends DelegateExtraData<List<DiagnosisLocal>> {
public DiagnosisCacheList(ExtraDataManager contaner) {
super(contaner);
}
@Override
protected List<DiagnosisLocal> init() throws Exception {
List<DiagnosisLocal> res = new ArrayList<DiagnosisLocal>();
for(DiagnosisDetails d: getBean().getAccomplichedDiagnosisList()) {
res.add(new DiagnosisLocal(d, serviceRender.get(), getAuditListener()));
}
return res;
}
@Override
protected List<DiagnosisLocal> initNew() {
return new ArrayList<DiagnosisLocal>();
}
@Override
protected void saveDB() throws Exception {
for (DiagnosisLocal diagnosisLocal : get()) {
diagnosisLocal.save1();
}
}
}
public DiagnosisLocal(SerRenLocal serRen) throws ClipsException {
super(serRen.getAuditListener());
getDetails().date = TimeLocal.getCurrentTime().getTime();
serviceRender.initBy(serRen);
}
public DiagnosisLocal(int id/*, SerRenLocal serRen*/, AuditListener al) throws ClipsException {
super(id, al);
//serviceRender.initBy(serRen);
}
public DiagnosisLocal(DiagnosisDetails details, SerRenLocal serRen, AuditListener al) throws ClipsException {
super(details, al);
serviceRender.initBy(serRen);
}
@Override
protected DiagnosisDetails getNewDetails() {
return new DiagnosisDetails();
}
@Override
public SerRenLocal getSerrenLocal() throws ClipsException {
return serviceRender.get();
}
/**
* рекомендуется использовать hasReferencedDiagnosis()
* @return
* @throws cli_fmw.main.ClipsException
* @deprecated
*/
@Deprecated
public DiagnosisLocal getReferencedDiagnosis() throws ClipsException {
if (getDetails().referenced == 0) {
return null;
} else {
return new DiagnosisLocal(getDetails().referenced, getAuditListener());
}
}
public boolean hasReferencedDiagnosis() throws ClipsException {
return getDetails().referenced != 0;
}
public void setReferencedDiagnosis(DiagnosisLocal diagnosis) throws ClipsException {
getDetails().referenced = diagnosis.getID();
fireContentStateEvent();
}
public DirectoryMKB10Item getMkb() throws ClipsException {
DirectoryMKB10 dmkb = (DirectoryMKB10) DirectoryLocator.getDirectory(DirectoryMKB10.class, false);
return dmkb.getItemFromID(getDetails().mkbID);
}
public void setMkb(DirectoryMKB10Item item) throws ClipsException {
getDetails().mkbID = item.getID();
fireContentStateEvent();
}
public DirectoryMKB10Item getComplication() throws ClipsException {
DirectoryMKB10 dmkb = DirectoryLocator.getDirectory(DirectoryMKB10.class, false);
return dmkb.getItemFromID(getDetails().complicationID);
}
public void setComplication(DirectoryMKB10Item item) throws ClipsException {
getDetails().complicationID = item.getID();
fireContentStateEvent();
}
/**
* @return Полное название диагноза, включая код мкб и стадию
* @throws cli_fmw.main.ClipsException
*/
public String getMkbAndStage() throws ClipsException {
String res;
if (getStage() > 0) {
res = getMkb().getDiseaseCode() + " " + getMkb().getTitle() + " - " + STAGES[getStage()] + " стадия";
} else {
res = getMkb().getDiseaseCode() + " " + getMkb().getTitle();
}
return res;
}
public DirectoryDiagnosisTypeItem getType() throws ClipsException {
DirectoryDiagnosisTypeItem item = DirectoryLocator.getDirectory(DirectoryDiagnosisType.class).getItemFromID(getDetails().type);
return item;
}
public void setType(DirectoryDiagnosisTypeItem type) throws ClipsException {
getDetails().type = type.getID();
fireContentStateEvent();
}
public DirectoryDiagnosisEncounterItem getEncounter() throws ClipsException {
DirectoryDiagnosisEncounter dirEncounter = DirectoryLocator.getDirectory(DirectoryDiagnosisEncounter.class);
return dirEncounter.getItemFromID(getDetails().encounter);
}
public void setEncounter(DirectoryDiagnosisEncounterItem encounter) throws ClipsException {
getDetails().encounter = encounter.getID();
fireContentStateEvent();
}
public String getAuthor() throws ClipsException {
return getDetails().author;
}
public void setAuthor(String author) throws ClipsException {
if (author == null || author.equals("")) {
getDetails().author = null;
} else {
getDetails().author = author;
}
fireContentStateEvent();
}
public DirectoryTraumaTypeItem getTrauma() throws ClipsException{
return DirectoryLocator.getDirectory(DirectoryTraumaType.class).getItemFromID(getDetails().traumaTypeID);
}
public void setTrauma(DirectoryTraumaTypeItem traumaType) throws ClipsException{
getDetails().traumaTypeID = traumaType.getID();
fireContentStateEvent();
}
/**
* Дата постановки диагноза
* @return
* @throws ClipsException
*/
public Date getDate() throws ClipsException {
return getDetails().date;
}
/**
* Дата постановки диагноза
* @param date
* @throws ClipsException
*/
@Deprecated
public void setDate(Date date) throws ClipsException {
getDetails().date = date;
fireContentStateEvent();
}
/**
* Возвращает итератор сопутствующих диагнозов
* если он еще не загружен, то загружает
* @return
* @throws ClipsException
*/
public List<DiagnosisLocal> getAccompDiagnosis() throws ClipsException {
return new ArrayList<DiagnosisLocal>(accompDiagnosisList.get());
}
public void setAccompDiagnosis(List<DiagnosisLocal> diagnosisLocals) throws ClipsException {
accompDiagnosisList.set(new ArrayList<DiagnosisLocal>(diagnosisLocals));
}
public int getStage() throws ClipsException {
return getDetails().stage;
}
public void setStage(int stage) throws ClipsException {
getDetails().stage = stage;
fireContentStateEvent();
}
@Override
public boolean isSignCorrect() throws ClipsException{
//STUB
return (getID() != 63 );
//END STUB
}
@Override
public String getSignMessage() throws ClipsException {
if (getID() == 0) {
return "Подпись отсутствует";
}
//STUB
String coll;
if (getSerrenLocal().getCollaboratorFunctions() != null) {
coll = getSerrenLocal().getCollaboratorFunctions().getTitle();
} else {
coll = getSerrenLocal().getSerRenDirector().getTitle();
}
String s = "Подписано " + Converter.dateToString(getDate())
+ " - " + coll;
if (isSignCorrect() ) {
return s;
} else {
return "Подпись не соответствует данным!";
}
//END STUB
}
/**
* перенесено в делегат клиента
* Запрашивает у базы характер диагноза с данным заболеванием.
* База должна самы вычислить характер на основе всех диагнозов данного
* пациента, исключая текущий диагноз (т.к. он в данный момент изменён)
* @param item
* @return элемент справочника
* @throws ClipsException
* @deprecated
*/
@Deprecated
public DirectoryDiagnosisEncounterItem getAutocalculatedEncounter(DiagnosisLocal dl) throws ClipsException {
DirectoryDiagnosisEncounter encounterList = DirectoryLocator.getDirectory(DirectoryDiagnosisEncounter.class);
return encounterList.getItemFromID(1);
}
@Override
public Icon getIcon() {
try {
if (isSignCorrect()) {
return icon;
} else {
return ErrorValue.RED_KEY_ICON;
}
} catch (ClipsException ex) {
ex.printStackTrace();
return null;
}
}
@Override
public String toString() {
return "Диагноз";
}
@Override
protected String getBeanName() {
return DiagnosisBean.class.getSimpleName();
}
@Override
public void print(CombinedReportCreator cCreator) throws ClipsException {
FormReportCreator creater = cCreator.createFormReporter(getClass(), 1);
HashMap<String, Object> data = new LinkedHashMap<String, Object>();
String title = "Данные диагноза";
AlignmentType alType = AlignmentType.dataInOneColoumnByLeft;
String val = getSerrenLocal().getPolisData().getClient(getAuditListener()).toString();
ExtraField extraField = new ExtraField(val, "Пациент:", alType);
data.put("client", extraField);
val = Converter.dateToString(getDate());
extraField = new ExtraField(val, "Дата:", alType);
data.put("date", extraField);
val = getMkbAndStage();
extraField = new ExtraField(val, "Диагноз:", alType);
data.put("mkb", extraField);
val = getType().getTitle();
extraField = new ExtraField(val, "Тип диагноза:", alType);
data.put("type", extraField);
val = getEncounter().getTitle();
extraField = new ExtraField(val, "Повторяемость:", alType);
data.put("enc", extraField);
if (getAuthor() != null) {
val = getAuthor();
extraField = new ExtraField(val, "Автор:", alType);
data.put("author", extraField);
}
TableModel model = null;
if (!getAccompDiagnosis().isEmpty()) {
data.put("attended", "Список сопутствующих диагнозов:");
model = new TableModelAccompDiagnosisList(getAccompDiagnosis(), false);
}
TableReportOptions ops = new TableReportOptions();
ops.tableHeaderColor = Color.WHITE;
ops.bottomMargin = 0;
ops.topMargin = 0;
creater.createReport(title, ops, data.entrySet(), model);
creater.finish();
}
/**
* Является ли диагноз заключительным
* @return
*/
public boolean isFinal() throws ClipsException{
return getType().getID() == DiagnosisType.DIAGNOSIS_TYPE_FINAL;
}
}