/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package clips.delegate.doctor.profchekup;
import beans.contract.entity.PolisDetails;
import beans.profcheckup.ProfcheckupItemBean;
import beans.profcheckup.entity.TransportData;
import cli_fmw.delegate.cache.SecondaryCacheManager;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import beans.profcheckup.ProfcheckupItemBeanRemote;
import beans.profcheckup.chunks.ProfcheckupItemChunk;
import beans.profcheckup.entity.ProfcheckupItemDetails;
import beans.service.create.ServiceCheckupChunk;
import cli_fmw.utils.SelectorEditable;
import cli_fmw.utils.SelectorEditableExceptional;
import clips.delegate.contract.PolisData;
import clips.delegate.directory.complex.DangerServiceData;
import clips.delegate.directory.complex.DirectoryDanger;
import clips.delegate.directory.complex.DirectoryDangerItem;
import clips.delegate.doctor.HasDiseaseLocal;
import clips.delegate.doctor.DiseaseLocal;
import cli_fmw.delegate.DelegateLine2;
import cli_fmw.delegate.cache.Cache;
import cli_fmw.delegate.cache.DelegateSecondaryCache;
import cli_fmw.delegate.cache.DelegateSecondaryCacheDgt;
import cli_fmw.delegate.cache.ExtraDataManager;
import cli_fmw.delegate.lists.DataChunkMapList;
import cli_fmw.main.ClipsException;
import cli_fmw.main.DirectoryItemReplacedException;
import clips.delegate.DEC.DECDisease;
import clips.delegate.directory.simple.profcheckupResult.DirectoryProfcheckupResult;
import clips.delegate.directory.simple.profcheckupResult.DirectoryProfcheckupResultItem;
import clips.delegate.doctor.medexam.HasSerrenResult;
import clips.delegate.doctor.medexam.MedSerrenResultData;
import clips.delegate.service.SerRenLocal;
import beans.service.medexam.MedSerrenResultDetails;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
*
* @author petr
*/
public class ProfcheckupItemLocal extends
DelegateLine2<ProfcheckupItemBeanRemote, ProfcheckupItemDetails>
implements HasDiseaseLocal, HasSerrenResult{
private DECDisease disease = new DECDisease(this, "случай заболевания", getAuditListener()){
@Override
protected void setPrimary(DiseaseLocal type) throws ClipsException {
if (type != null){
super.setPrimary(type);
}
}
};
private PolisCache polisCache = new PolisCache(getSCM());
private ResultList resultList = new ResultList(getEDM());
/**
* есть только у новосозданных итемов, загрузить данные с базы нельзя, тк
* нельзя определить какая из услуг из заболевания назначена по данному фактору
*/
private Cache<List<ServiceCheckupChunk>> serviceList1
= new Cache<List<ServiceCheckupChunk>>();
private ProfcheckupCache profcheckup = new ProfcheckupCache(getSCM());
private class ResultList extends DataChunkMapList<MedSerrenResultData, Integer> {
public ResultList(ExtraDataManager contaner) {
super(contaner);
}
@Override
protected void deleteDB(MedSerrenResultData data) throws Exception {
throw new ClipsException("Удаление не поддерживается");
}
@Override
protected int saveDB(MedSerrenResultData data) throws Exception {
return getBean().setMedSerrenResult(data.getDetails());
}
@Override
protected void loadDB() throws Exception {
Set<Integer> currentSerrens = new HashSet<Integer>();
SelectorEditableExceptional<DangerServiceData> dangerServices = getDanger().getDangerServices();
List<SerRenLocal> serrenList = getDiseaseLocal().getSerrenList();
for (int i = 0; i < dangerServices.size(); i++){
DangerServiceData data = dangerServices.get(i);
int serviceID = data.getService().getID();
for (SerRenLocal serRenLocal : serrenList) {
if (serRenLocal.getService().getID() == serviceID){
currentSerrens.add(serRenLocal.getID());
}
}
}
List<MedSerrenResultDetails> list = getBean().getSerrenResults();
for (int i = 0; i < list.size(); i++) {
if (currentSerrens.contains(list.get(i).serrenID)){
MedSerrenResultData data = new MedSerrenResultData(list.get(i));
initByDetails(data);
}
}
}
}
@Override
public SelectorEditable<MedSerrenResultData> getResultList() throws ClipsException {
return resultList.selector();
}
@Override
public SerRenLocal getSerRen(MedSerrenResultData resultData) throws ClipsException {
int serrenID = resultData.getSerrenID();
List<SerRenLocal> serrenList = getDiseaseLocal().getSerrenList();
for (SerRenLocal serRenLocal : serrenList) {
if (serRenLocal.getID() == serrenID){
return serRenLocal;
}
}
return null;
}
@Override
public int getSerrenCount() throws ClipsException {
int serrenCount = 0;
Set<Integer> currentServices = new HashSet<Integer>();
SelectorEditableExceptional<DangerServiceData> dangerServices = getDanger().getDangerServices();
for (int i = 0; i < dangerServices.size(); i++){
DangerServiceData data = dangerServices.get(i);
currentServices.add(data.getService().getID());
}
List<SerRenLocal> serrenList = getDiseaseLocal().getSerrenList();
for (SerRenLocal serRenLocal : serrenList) {
if (serRenLocal.getAnalysis() == null && currentServices.contains(serRenLocal.getService().getID())){
serrenCount++;
}
}
return serrenCount;
}
/**
*
*/
private class PolisCache extends DelegateSecondaryCache<PolisData> {
public PolisCache(SecondaryCacheManager container) throws ClipsException {
super(container, "информацию о полисе");
}
@Override
protected void setPrimary(PolisData type) throws ClipsException {
if(type.getId() == 0) {
throw new IllegalArgumentException("Член договора не существует");
}
getDetails().polisID = type.getId();
}
@Override
protected PolisData init() throws Exception {
PolisDetails cmd = getBean().getPolis();
return new PolisData(null, null, cmd);
}
}
/**
*
*/
/*
private class ServiceListCache extends DelegateExtraInfo<List<ServiceCheckupChunk>> {
public ServiceListCache(ExtraCacheManager contaner) {
super(contaner);
}
@Override
protected void saveDB() throws Exception {
profcheckup.get().addMyToSaveList(
new ProfcheckupItemChunk(getDetails().dangerId,
getDetails().polisID, get()));
}
@Override
protected List<ServiceCheckupChunk> init() throws Exception {
return null;
}
@Override
public boolean isDirty() {
return super.isDirty();
}
}
*/
/**
*
*/
private class ProfcheckupCache extends DelegateSecondaryCacheDgt<ProfcheckupLocal> {
public ProfcheckupCache(SecondaryCacheManager contaner) throws ClipsException {
super(contaner, true, "информацию о профосмотре");
}
@Override
protected void setPrimary(ProfcheckupLocal type) throws ClipsException {
getDetails().profcheckupID = type.getID();
}
@Override
protected ProfcheckupLocal init() throws Exception {
if(getDetails().profcheckupID == 0) {
return null;
}
return new ProfcheckupLocal(getDetails().profcheckupID, getAuditListener());
}
@Override
protected void checkNotZero(int id) {
if(id == 0) {
System.out.println("Инициализация нулевым идентификатором");
}
}
}
/**
* Создаёт новый итем
* проверка на существование не происходит, т.к профчекап не обязательно может быть сохранён
* сюда передаётся ссылка на профчекап и итем сам себя пропишет в его кеш (похоже уже нет), при сохранении профчекапа
* у него появится ид, и функция сохранения должна сработать
* @param profch профосмотр
* @param sl лист кусков услуг
* @param dangerId ид опасного фактора
* @param polisData данные полиса
* @throws cli_fmw.main.ClipsException
*/
public ProfcheckupItemLocal(ProfcheckupLocal profch,
ArrayList<ServiceCheckupChunk> sl,
int dangerId,
PolisData polisData) throws ClipsException {
super(profch.getAuditListener());
profcheckup.initBy(profch);
polisCache.initBy(polisData);
serviceList1.set(new ArrayList<ServiceCheckupChunk>(sl));
getDetails().polisID = polisData.getId();
getDetails().dangerId = dangerId;
}
public ProfcheckupItemLocal(DiseaseLocal diseaseLocal, int id) throws ClipsException {
super(id, diseaseLocal.getAuditListener());
assert id != 0;
disease.initBy(diseaseLocal);
serviceList1.set(new ArrayList<ServiceCheckupChunk>());
}
public ProfcheckupItemLocal(DiseaseLocal diseaseLocal, ProfcheckupLocal profch, ProfcheckupItemDetails detales) throws ClipsException {
super(detales, diseaseLocal.getAuditListener());
profcheckup.initBy(profch);
disease.initBy(diseaseLocal);
serviceList1.set(new ArrayList<ServiceCheckupChunk>());
}
// public ProfcheckupItemLocal(ProfcheckupLocal profch, ProfcheckupItemDetails detales) throws ClipsException {
// super(detales);
// profcheckup.initBy(profch);
// serviceList1.set(new ArrayList<ServiceCheckupChunk>());
// }
@Override
protected ProfcheckupItemDetails getNewDetails() {
return new ProfcheckupItemDetails();
}
@Override
public void save1() throws ClipsException {
if(isNewlyCreated()) {
try {
int iD = profcheckup.get().getID();
//todo save by chunk --> saving
TransportData transportData = getBean().createItem(new ProfcheckupItemChunk(getDetails().dangerId, getDetails().polisID, iD, serviceList1.get()));
ProfcheckupItemDetails details = transportData.itemDetails;
getDetails().dangerId = details.dangerId;
getDetails().diseaseID =details.diseaseID;
getDetails().id = details.id;
getDetails().lightWorkTill = details.lightWorkTill;
getDetails().passed = details.passed;
getDetails().polisID = details.polisID;
getDetails().profcheckupID = details.profcheckupID;
getDetails().resultExtra = details.resultExtra;
getDetails().resultID = details.resultID;
setDisease(new DiseaseLocal(getDetails().diseaseID, getAuditListener()));
//подменим на сервере ид, что б не пытался создать новых сущностей
getBean().initByID(details.id, getBean().getSessionId());
auditDetailsList.addAll(transportData.auditList);
fireAuditEvent();
} catch (Exception ex) {
clearBean();
throw new ClipsException("Не удалось сохранить профосмотр", ex);
}
}
super.save1();//единственный способ сменить ид делегата
}
public Date getLightWorkTill() throws ClipsException {
return getDetails().lightWorkTill;
}
public void setLightWorkTill(Date lightWorkTill) throws ClipsException {
this.getDetails().lightWorkTill = lightWorkTill;
fireContentStateEvent();
}
public boolean isPassed() throws ClipsException {
return getDetails().passed;
}
public void setPassed(boolean passed) throws ClipsException {
this.getDetails().passed = passed;
fireContentStateEvent();
}
public ProfcheckupLocal getProfCheckup() throws ClipsException {
return new ProfcheckupLocal(getDetails().profcheckupID, getAuditListener());
}
public void setProfCheckup(ProfcheckupLocal profCheckup) throws ClipsException {
this.getDetails().profcheckupID = profCheckup.getID();
fireContentStateEvent();
}
public DirectoryProfcheckupResultItem getResult() throws ClipsException {
DirectoryProfcheckupResult ds = DirectoryLocator.getDirectory(DirectoryProfcheckupResult.class);
try {
return ds.getItemFromID(getDetails().resultID);
} catch (DirectoryItemReplacedException ex) {
reload();
return ds.getItemFromID(getDetails().resultID);
}
}
public void setResult(DirectoryProfcheckupResultItem result) throws ClipsException {
this.getDetails().resultID = result.getID();
fireContentStateEvent();
}
public DirectoryDangerItem getDanger() throws ClipsException {
DirectoryDanger dangers = DirectoryLocator.getDirectory(DirectoryDanger.class, false);
return dangers.getItemFromID(getDetails().dangerId);
}
public void setDanger(DirectoryDangerItem danger) throws ClipsException {
checkChanges();
this.getDetails().dangerId = danger.getID();
fireContentStateEvent();
}
public String getResultExtra() throws ClipsException {
return getDetails().resultExtra;
}
public void setResultExtra(String resultExtra) throws ClipsException {
this.getDetails().resultExtra = resultExtra;
fireContentStateEvent();
}
@Override
public DiseaseLocal getDiseaseLocal() throws ClipsException {
return disease.get();
}
private void setDisease(DiseaseLocal disease) throws ClipsException {
this.disease.set(disease);
}
@Override
protected String getBeanName() {
return ProfcheckupItemBean.class.getSimpleName();
}
public PolisData getPolisData() throws ClipsException {
return polisCache.get();
}
public void setPolisData(PolisData polisData) throws ClipsException {
checkChanges();
polisCache.set(polisData);
}
/**
* предоставляет доступ к листу прицепленных услуг, кеш всё равно без поддержки состояний,
* нахер ему отдельные геттер - сеттер
* @return
* @throws cli_fmw.main.ClipsException
*/
public List<ServiceCheckupChunk> serviceList() throws ClipsException {
return serviceList1.get() ;
}
// public List<ServiceCheckupChunk> getServiceList() throws ClipsException {
// return new ArrayList<ServiceCheckupChunk>(serviceList1.get()) ;
// }
// /**
// * if serviceLise is null then throw exception
// * @param sl
// * @throws ClipsException
// */
// public void setServiceList(List<ServiceCheckupChunk> sl) throws ClipsException {
// checkChanges();
// serviceList1.set(new ArrayList<ServiceCheckupChunk>(sl));
// fireContentStateEvent();
// }
private void checkChanges(){
if (!this.isNewlyCreated()){
throw new RuntimeException("Данные изменения возможно внести только в новосозданый элемент");
}
}
}