/*
* CheckUpLocal.java
*
* Created on 23 Декабрь 2007 г., 19:58
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package clips.delegate.doctor.checkup;
import beans.doctor.checkup.CheckupBean;
import beans.doctor.checkup.CheckupBeanRemote;
import cli_fmw.delegate.cache.ExtraDataManager;
import clips.delegate.client.ClientLocal;
import clips.delegate.service.SerRenLocal;
import clips.delegate.directory.filtered.DirectoryCheckupType;
import clips.delegate.directory.filtered.DirectoryCheckupTypeItem;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import clips.delegate.doctor.HasSerrenLocal;
import clips.delegate.doctor.Iconable;
import clips.delegate.DEC.DECServiceRender;
import cli_fmw.delegate.cache.DelegateSecondaryCache;
import cli_fmw.report.SegmentedTableReporter;
import beans.doctor.checkup.dicom.CheckupDicomDetails;
import framework.beans.ModificationInfo;
import framework.utils.Converter;
import cli_fmw.main.ClipsException;
import cli_fmw.main.DelegatePrintable;
import cli_fmw.report.AlignmentType;
import cli_fmw.report.CombinedReportCreator;
import cli_fmw.report.ExtraField;
import cli_fmw.report.TableReportOptions;
import clips.delegate.directory.ro.DirectoryCollaboratorItem;
import clips.delegate.doctor.Signable;
import beans.doctor.checkup.CheckupDetails;
import cli_fmw.delegate.AuditListener;
import clips.doctor.newEMC.init.generic.ChildrenListStateless;
import clips.doctor.newEMC.init.generic.DelegateNode;
import framework.utils.ROList;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
/**
* Делегат, представляющий доступ к 1 записи в таблице checkup -
* осмотр, включая анализы
* @author Администратор
*/
public class CheckupLocal extends DelegateNode<CheckupBeanRemote, CheckupDetails, CheckupDICOMLocal>
implements Iconable, DelegatePrintable, HasSerrenLocal, Signable {
private DECServiceRender serviceRender = new DECServiceRender(this, "информацию об услуге, в рамках которой проведён осмотр/анализ", getAuditListener());
private DelegateSecondaryCache<CheckupXMLData> cacheCheckupXMLData
= new DelegateSecondaryCache<CheckupXMLData>(getSCM(), "список проб") {
@Override
protected CheckupXMLData init() throws Exception {
return new CheckupXMLData(getType(), getDetails().xml, isNewlyCreated());
}
@Override
protected CheckupXMLData initNew() throws ClipsException {
try {
return new CheckupXMLData(getType(), getDetails().xml, isNewlyCreated());
} catch (JDOMException ex) {
throw new ClipsException("Не удалось создать осмотр либо анализ: ", ex);
}
}
@Override
protected void setPrimary(CheckupXMLData type) throws ClipsException {
getDetails().xml = type.getXMLStr();
}
};
private static ImageIcon icon = null;
private DICOMList dicomObjects
= new DICOMList(getEDM());
class DICOMList extends ChildrenListStateless<CheckupDICOMLocal, CheckupDicomDetails>{
public DICOMList(ExtraDataManager contaner) {
super(contaner);
}
@Override
protected CheckupDICOMLocal createDelegate(CheckupDicomDetails d) throws Exception {
return new CheckupDICOMLocal(d, CheckupLocal.this, getAuditListener());
}
@Override
protected List<CheckupDicomDetails> initDetails() throws Exception {
return getBean().getDicomObjects();
}
}
/**
* Создание нового чекапа для существующей в базе услуги
* @param serRen
* @throws ClipsException
*/
public CheckupLocal(SerRenLocal serRen) throws ClipsException {
super(serRen.getAuditListener());
Document xmlDoc = new Document(new Element("analysys"));
getDetails().xml = Converter.xmlToString(xmlDoc);
serviceRender.initBy(serRen);
}
public CheckupLocal(CheckupDetails details, SerRenLocal serRen, AuditListener al) throws ClipsException {
super(details, al);
serviceRender.initBy(serRen);
}
@Override
protected CheckupDetails getNewDetails() {
return new CheckupDetails();
}
/**
* Когда заканчивается срок годности пробы. Возвращаемое значение может быть null
* @return
* @throws ClipsException
*/
public Date getWorkingLifeDate() throws ClipsException {
CheckupXMLData xml = getCheckupXMLData();
String s = xml.getWorkingLife();
if (!s.equals("") && this.getDate() != null) {
try {
int days = Integer.parseInt(s);
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(this.getDate());
gc.add(GregorianCalendar.DAY_OF_YEAR, days);
return gc.getTime();
} catch (NumberFormatException ex) {
throw new ClipsException("Значение ["+s+"] не является целым числом",ex);
}
} else {
return null;
}
}
@Override
public SerRenLocal getSerrenLocal() throws ClipsException {
return serviceRender.get();
}
public DirectoryCheckupTypeItem getType() throws ClipsException {
DirectoryCheckupType checkUpTypes = DirectoryLocator.getDirectory(DirectoryCheckupType.class, false);
return checkUpTypes.getItemFromID(getDetails().typeID);
}
public void setType(DirectoryCheckupTypeItem item) throws ClipsException {
if (getDetails().typeID != 0) {
throw new ClipsException("Запрещено менять тип чекапа");
}
getDetails().typeID = item.getID();
cacheCheckupXMLData.clearCache();
fireContentStateEvent();
}
/**
* Дата взятия проб
* @return
* @throws cli_fmw.delegate.exception.ClipsException
*/
public Date getDate() throws ClipsException {
return getDetails().date;
}
public void setDate(Date date) throws ClipsException {
getDetails().date = date;
fireContentStateEvent();
}
/**
* выдает хмльные данные
* @return
*/
public CheckupXMLData getCheckupXMLData() throws ClipsException {
return cacheCheckupXMLData.get();
}
/**
* принимает хмльные данные
* @return
*/
public void setCheckupXMLData(CheckupXMLData checkupXMLData) throws ClipsException {
cacheCheckupXMLData.set(checkupXMLData);
cacheCheckupXMLData.clearCache();
}
/**
* Делает услугу оказанной.
* !Внимание:
* - после вызова этого метода связанный с чекапом делегат
* SerrenLocal теряет актуальность, его надо обновить с базы
* - Результаты анализа НЕ СОХРАНЯЮТСЯ, это надо сделать заранее
* @return
* @throws generic.ClipsServerException
*/
public void renderAnalyse() throws ClipsException {
try {
ModificationInfo mi = getBean().renderAnalyse();
auditDetailsList.addAll(mi.getAudit());
fireAuditEvent();
} catch (Exception ex) {
clearBean();
throw new ClipsException("Не удалось сохранить анализ", ex);
}
fireContentStateEvent();
}
/**
* печать...
* @return
* @throws cli_fmw.delegate.exception.ClipsException
*/
@Override
public void print(CombinedReportCreator cCreator) throws ClipsException {
SerRenLocal serRen = getSerrenLocal();
boolean rendered = serRen.isRendered();
CheckupXMLData data = getCheckupXMLData();
boolean isAnalysys = data.getCheckupType().isAnalyse();
SegmentedTableReporter analyseReporter = cCreator.createAnalyseReporter(getClass());
//название анализа
String title;
if (isAnalysys) {
title = "Анализ: ";
}
else {
title = "Осмотр: ";
}
analyseReporter.setTitle(title + data.getCheckupType().getTitle());
//Фиелды до таблицы
String fieldName;
String fieldValue;
ExtraField extraField;
ClientLocal client = serRen.getPolisData().getClient(getAuditListener());
fieldName = "Пациент: ";
fieldValue = client.toString();
if (isAnalysys) {
fieldValue += " (" + Converter.dateToString(client.getBorn()) + ")";
}
extraField = new ExtraField(fieldValue, fieldName, AlignmentType.left);
analyseReporter.addField(extraField, false);
if (isAnalysys) {
fieldName = "Направил: ";
fieldValue = serRen.getSerRenDirector().toString();
fieldValue += " (" + Converter.dateToString(serRen.getSerDate()) + ")";
extraField = new ExtraField(fieldValue, fieldName, AlignmentType.left);
analyseReporter.addField(extraField, false);
if (rendered) {
fieldName = "Дата забора биоматериала: ";
fieldValue = Converter.dateToString(getDate());
extraField = new ExtraField(fieldValue, fieldName, AlignmentType.left);
analyseReporter.addField(extraField, false);
}
}
else {
ArrayList<FieldForXML> preField = data.getPreFieldList();
for(int i = 0; i < preField.size(); i++) {
fieldName = preField.get(i).title + ": ";
fieldValue = data.getField(preField.get(i).id);
if (fieldValue == null) {
fieldValue = "";
}
extraField = new ExtraField(fieldValue, fieldName, AlignmentType.dataInOneColoumnByLeft);
analyseReporter.addField(extraField, false);
}
}
ArrayList<String> probeList = data.getProbeList();
if (!probeList.isEmpty()) {
//добавляем заголовок таблицы
List<String> header = new ArrayList<String>();
header.add("Методика");
ArrayList<String> valueList = data.getProbeValueList();
for (int i = 0; i < valueList.size(); i++) {
String titleStr = data.getProbeValueTitle(valueList.get(i));
header.add(titleStr);
}
header.add("Описание");
analyseReporter.setHeader(header);
//добавляем строки таблицы
List<String> row;
for (int i = 0; i < probeList.size(); i++) {
row = new ArrayList<String>();
if (probeList.get(i).startsWith("separator")) {
String separator = data.getProbeTitle(probeList.get(i)).replace("separator ", "");
analyseReporter.addSeparator(separator);
}
else {
row.add(data.getProbeTitle(probeList.get(i)));
for (int j = 0; j < valueList.size(); j++) {
Object value = data.getProbeValue(probeList.get(i), valueList.get(j));
String metric = data.getProbeValueMetric(probeList.get(i), valueList.get(j));
String valueMetric = ( value == null ? "" : value.toString() + " " + (metric == null ? "" : metric));
row.add(valueMetric);
}
String description = data.getProbeDescription(probeList.get(i));
row.add(description);
analyseReporter.addRow(row);
}
}
}
//Фиелды после таблицы
if (isAnalysys) {
if (rendered) {
fieldName = "Анализ провел(дата исследования): ";
fieldValue = serRen.getCollaboratorFunctions() == null
? "" : serRen.getCollaboratorFunctions().getCollaborator().toString();
fieldValue += serRen.getSerRenderDate() == null
? "" : " (" + Converter.dateToString(serRen.getSerRenderDate()) + ")";
}
else {
fieldName = "Рекомендации: ";
fieldValue = serRen.getService().getDescription();
}
extraField = new ExtraField(fieldValue, fieldName, AlignmentType.dataInOneColoumnByLeft);
analyseReporter.addField(extraField, true);
}
else {
ArrayList<FieldForXML> postField = data.getPostFieldList();
for(int i = 0; i < postField.size(); i++) {
fieldName = postField.get(i).title + ": ";
fieldValue = data.getField(postField.get(i).id);
if (fieldValue == null) {
fieldValue = "";
}
extraField = new ExtraField(fieldValue, fieldName, AlignmentType.dataInOneColoumnByLeft);
analyseReporter.addField(extraField, true);
}
DirectoryCollaboratorItem collab = serRen.getSerRenDirector();
fieldName = "Врач: ";
fieldValue = collab.getTitle();
extraField = new ExtraField(fieldValue, fieldName, AlignmentType.left);
analyseReporter.addField(extraField, true);
}
TableReportOptions ops = new TableReportOptions();
ops.topMargin = 0;
ops.bottomMargin = 0;
analyseReporter.setPageOptions(ops);
analyseReporter.finish();
}
@Override
public String toString() {
try {
DirectoryCheckupTypeItem type = getType();
if (type.isAnalyse()) {
return "Анализ";
} else {
return "Осмотр";
}
} catch (ClipsException ex) {
//ничо не делать
return ("Осмотр/анализ");
}
}
@Override
public Icon getIcon() {
return icon;
}
@Override
protected String getBeanName() {
return CheckupBean.class.getSimpleName();
}
@Override
public void restore() {
super.restore();
cacheCheckupXMLData.clearCache();
}
@Override
public boolean isSignCorrect() throws ClipsException{
//STUB
return (getID() != -1 );
//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
}
@Override
protected void addChildImpl(CheckupDICOMLocal child) throws ClipsException {
dicomObjects.get().add(child);
}
@Override
protected void removeChildImpl(CheckupDICOMLocal child) throws ClipsException {
dicomObjects.get().remove(child);
}
@Override
public ROList<CheckupDICOMLocal> getChildren() throws ClipsException {
ROList<CheckupDICOMLocal> rOList = new ROList<CheckupDICOMLocal>(dicomObjects.get());
return rOList;
}
@Override
public int getChildCount() throws ClipsException {
int size = dicomObjects.getSize();
return size;
}
}