package open.dolphin.session;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import open.dolphin.infomodel.*;
import open.dolphin.mbean.KanaToAscii;
import open.dolphin.mbean.ServletContextHolder;
/**
*
* @author Kazushi Minagawa, Digital Globe, Inc.
*/
@Named
@Stateless
public class PVTServiceBean {
private static final String QUERY_PATIENT_BY_FID_PID = "from PatientModel p where p.facilityId=:fid and p.patientId=:pid";
private static final String QUERY_PVT_BY_FID_PID_DATE = "from PatientVisitModel p where p.facilityId=:fid and p.pvtDate like :date and p.patient.patientId=:pid";
private static final String QUERY_PVT_BY_FID_DATE = "from PatientVisitModel p where p.facilityId=:fid and p.pvtDate like :date order by p.pvtDate";
private static final String QUERY_PVT_BY_FID_DID_DATE = "from PatientVisitModel p where p.facilityId=:fid and p.pvtDate like :date and (doctorId=:did or doctorId=:unassigned) order by p.pvtDate";
private static final String QUERY_INSURANCE_BY_PATIENT_ID = "from HealthInsuranceModel h where h.patient.id=:id";
private static final String QUERY_KARTE_BY_PATIENT_ID = "from KarteBean k where k.patient.id=:id";
private static final String QUERY_APPO_BY_KARTE_ID_DATE = "from AppointmentModel a where a.karte.id=:id and a.date=:date";
private static final String QUERY_PVT_BY_PK = "from PatientVisitModel p where p.id=:id";
//masuda^
private static final String QUERY_KARTE_ID_BY_PATIENT_ID = "select k.id from KarteBean k where k.patient.id = :id";
private static final String FID = "fid";
private static final String PID = "pid";
private static final String DID = "did";
private static final String UNASSIGNED = "unassigned";
private static final String ID = "id";
private static final String DATE = "date";
private static final String PERCENT = "%";
private static final int BIT_SAVE_CLAIM = 1;
private static final int BIT_MODIFY_CLAIM = 2;
private static final int BIT_CANCEL = 6;
@PersistenceContext
private EntityManager em;
@Inject
private ChartEventServiceBean eventServiceBean;
@Inject
private ServletContextHolder contextHolder;
/**
* 患者来院情報を登録する。
* @param pvt
* @return 登録個数
*/
public int addPvt(PatientVisitModel pvt) {
// CLAIM 送信の場合 facilityID がデータベースに登録されているものと異なる場合がある
// 施設IDを認証にパスしたユーザの施設IDに設定する。
String fid = pvt.getFacilityId();
PatientModel patient = pvt.getPatientModel();
pvt.setFacilityId(fid);
patient.setFacilityId(fid);
// 1.4との互換性のためdepartmentにも設定する
StringBuilder sb = new StringBuilder();
sb.append(pvt.getDeptName()).append(",");
sb.append(pvt.getDeptCode()).append(",");
sb.append(pvt.getDoctorName()).append(",");
sb.append(pvt.getDoctorId()).append(",");
sb.append(pvt.getJmariNumber()).append(",");
pvt.setDepartment(sb.toString());
// 既存の患者かどうか調べる
try {
// 既存の患者かどうか調べる。なければNoResultException
PatientModel exist = (PatientModel)
em.createQuery(QUERY_PATIENT_BY_FID_PID)
.setParameter(FID, fid)
.setParameter(PID, patient.getPatientId())
.getSingleResult();
Logger.getLogger("open.dolphin").info("addPvt : merge patient");
//-----------------------------
// 健康保険情報を更新する
//-----------------------------
@SuppressWarnings("unchecked")
List<HealthInsuranceModel> old =
em.createQuery(QUERY_INSURANCE_BY_PATIENT_ID)
.setParameter(ID, exist.getId())
.getResultList();
// ORCAからpvtに乗ってやってきた保険情報を取得する。検索などからPVT登録したものには乗っかっていない
List<HealthInsuranceModel> newOne = patient.getHealthInsurances();
if (newOne != null && !newOne.isEmpty()) {
// 現在の保険情報を削除する
for (HealthInsuranceModel model : old) {
em.remove(model);
}
// 新しい健康保険情報を登録する
for (HealthInsuranceModel model : newOne) {
model.setPatient(exist);
em.persist(model);
}
// 健康保険を新しいものに更新する
exist.setHealthInsurances(newOne);
} else {
// pvtに保険情報が乗っかっていない場合は古いのを使う
exist.setHealthInsurances(old);
}
// 名前を更新する 2007-04-12
exist.setFamilyName(patient.getFamilyName());
exist.setGivenName(patient.getGivenName());
exist.setFullName(patient.getFullName());
exist.setKanaFamilyName(patient.getKanaFamilyName());
exist.setKanaGivenName(patient.getKanaGivenName());
exist.setKanaName(patient.getKanaName());
//exist.setRomanFamilyName(patient.getRomanFamilyName()); // ローマ字はマージしない 2013.10.25 K.Funabashi 3Line
//exist.setRomanGivenName(patient.getRomanGivenName());
//exist.setRomanName(patient.getRomanName());
// 性別
exist.setGender(patient.getGender());
exist.setGenderDesc(patient.getGenderDesc());
exist.setGenderCodeSys(patient.getGenderCodeSys());
// Birthday
exist.setBirthday(patient.getBirthday());
// 住所、電話を更新する
exist.setSimpleAddressModel(patient.getSimpleAddressModel());
exist.setTelephone(patient.getTelephone());
//exist.setMobilePhone(patient.getMobilePhone());
//s.oh^ 2014/08/19 施設患者一括表示機能
exist.setAppMemo(patient.getAppMemo());
//s.oh$
// PatientModelを新しい情報に更新する
em.merge(exist);
// PatientVisit との関係を設定する
pvt.setPatientModel(exist);
} catch (NoResultException e) {
Logger.getLogger("open.dolphin").info("addPvt : add patient");
// 新規患者であれば登録する
// 患者属性は cascade=PERSIST で自動的に保存される
em.persist(patient);
// この患者のカルテを生成する
KarteBean karte = new KarteBean();
karte.setPatientModel(patient);
karte.setCreated(new Date());
em.persist(karte);
}
// ここからPVT登録処理
// CLAIM の仕様により患者情報のみを登録し、来院情報はない場合がある
// 来院情報を登録する。pvtDate == nullなら患者登録のみ
if (pvt.getPvtDate() == null) {
return 0; // 追加0個、終了
}
//minagawa^ 予約: ORCAで未来日受付の場合、persistしてリターン(予定カルテ対応)
if (!isToday(pvt.getPvtDate())) {
Logger.getLogger("open.dolphin").log(Level.INFO, "scheduled PVT: {0}", pvt.getPvtDate());
// 2重登録をチェックする
int index = pvt.getPvtDate().indexOf("T");
String test = pvt.getPvtDate().substring(0, index);
List<PatientVisitModel> list = (List<PatientVisitModel>)em
.createQuery(QUERY_PVT_BY_FID_PID_DATE)
.setParameter(FID, fid)
.setParameter(DATE, test+PERCENT)
.setParameter(PID, patient.getPatientId())
.getResultList();
if (list.isEmpty()) {
// 受付がない場合
em.persist(pvt);
} else {
// 最初のレコードを後から来たデータで上書きする
PatientVisitModel target = list.get(0);
target.setDepartment(pvt.getDepartment());
target.setDeptCode(pvt.getDeptCode());
target.setDeptName(pvt.getDeptName());
target.setDoctorId(pvt.getDoctorId());
target.setDoctorName(pvt.getDoctorName());
target.setFirstInsurance(pvt.getFirstInsurance());
target.setInsuranceUid(pvt.getInsuranceUid());
target.setJmariNumber(pvt.getJmariNumber());
// transient及び値が変更されないもの
//target.setAppointment(pvt.getAppointment());
//target.setFacilityId(pvt.getFacilityId());
//target.setMemo(pvt.getMemo());
//target.setNumber(pvt.getNumber());
//target.setPatientModel(pvt.getPatientModel());
//target.setPvtDate(pvt.getPvtDate());
//target.setState(pvt.getState());
//target.setWatingTime(pvt.getWatingTime());
}
return 1;
}
//minagawa$
// これ以降は今日の受付で排他制御がかかる
// カルテの PK を得る
long karteId = (Long)
em.createQuery(QUERY_KARTE_ID_BY_PATIENT_ID)
.setParameter(ID, pvt.getPatientModel().getId())
.getSingleResult();
// 予約を検索する
@SuppressWarnings("unchecked")
List<AppointmentModel> c =
em.createQuery(QUERY_APPO_BY_KARTE_ID_DATE)
.setParameter(ID, karteId)
.setParameter(DATE, contextHolder.getToday().getTime())
.getResultList();
if (c != null && !c.isEmpty()) {
AppointmentModel appo = c.get(0);
pvt.setAppointment(appo.getName());
}
// 受付嬢にORCAの受付ボタンを連打されたとき用w 復活!!
List<PatientVisitModel> pvtList = eventServiceBean.getPvtList(fid);
for (int i = 0; i < pvtList.size(); ++i) {
PatientVisitModel test = pvtList.get(i);
// pvt時刻が同じでキャンセルでないものは更新(merge)する
if (test.getPvtDate().equals(pvt.getPvtDate())
&& (test.getState() & (1<< PatientVisitModel.BIT_CANCEL)) ==0) {
//s.oh^ 2013/12/24 同時受付不具合修正
// 同一患者のみ
if(test.getPatientId() != null && pvt.getPatientId() != null && test.getPatientId().equals(pvt.getPatientId()) && test.getFacilityId().equals(pvt.getFacilityId())) {
//s.oh$
pvt.setId(test.getId()); // pvtId, state, ownerUUID, byomeiCountは既存のものを使う
pvt.setState(test.getState());
pvt.getPatientModel().setOwnerUUID(test.getPatientModel().getOwnerUUID());
pvt.setByomeiCount(test.getByomeiCount());
pvt.setByomeiCountToday(test.getByomeiCountToday());
// データベースを更新
em.merge(pvt);
// 新しいもので置き換える
pvtList.set(i, pvt);
// クライアントに通知
String uuid = contextHolder.getServerUUID();
ChartEventModel msg = new ChartEventModel(uuid);
msg.setParamFromPvt(pvt);
msg.setPatientVisitModel(pvt);
msg.setEventType(ChartEventModel.PVT_MERGE);
eventServiceBean.notifyEvent(msg);
return 0; // 追加0個
}
}
}
// 同じ時刻のPVTがないならばPVTをデータベースに登録(persist)する
eventServiceBean.setByomeiCount(karteId, pvt); // 病名数をカウントする
em.persist(pvt);
// pvtListに追加
pvtList.add(pvt);
// クライアントに通知
String uuid = contextHolder.getServerUUID();
ChartEventModel msg = new ChartEventModel(uuid);
msg.setParamFromPvt(pvt);
msg.setPatientVisitModel(pvt);
msg.setEventType(ChartEventModel.PVT_ADD);
eventServiceBean.notifyEvent(msg);
// 2013/07/16
try {
Properties config = new Properties();
sb = new StringBuilder();
sb.append(System.getProperty("jboss.home.dir"));
sb.append(File.separator);
sb.append("custom.properties");
File f = new File(sb.toString());
FileInputStream fin = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fin, "JISAutoDetect");
config.load(isr);
isr.close();
if(config.getProperty("csv.output") != null) {
Logger.getLogger("open.dolphin").log(Level.INFO, "Output CSV : " + pvt.getPatientId());
sb = new StringBuilder();
sb.append(pvt.getPatientModel().getPatientId()).append(","); // pid,
sb.append(pvt.getPatientModel().getFullName()).append(","); // name,
if(config.getProperty("csv.link") == null) {
sb.append(","); // ,
}else if(config.getProperty("csv.link").equals("RF")) {
sb.append(pvt.getPatientModel().getKanaName()).append(","); // kana
}
KanaToAscii kanaToAscii = new KanaToAscii();
String rm = kanaToAscii.CHGKanatoASCII(pvt.getPatientModel().getKanaName(), "");
sb.append(rm).append(","); // roman,
String g = pvt.getPatientModel().getGender();
sb.append(ModelUtils.getGenderMFDesc(g)).append(","); // F | M,
String birth = pvt.getPatientModel().getBirthday();
birth = birth.replaceAll("-", "");
sb.append(birth); // yyyyMMdd
String line = sb.toString();
// File
sb = new StringBuilder();
SimpleDateFormat sdf = new SimpleDateFormat(config.getProperty("csv.file.name"));
sb.append(config.getProperty("csv.dir"));
sb.append(File.separator);
sb.append(sdf.format(new Date()));
String fileNameWithoutExt = sb.toString();
sb.append(".inp");
String tempName = sb.toString();
File tmp = new File(tempName);
FileOutputStream out = new FileOutputStream(tmp);
BufferedOutputStream w = new BufferedOutputStream(out);
w.write(line.getBytes(config.getProperty("csv.file.encoding")));
w.flush();
w.close();
sb = new StringBuilder();
sb.append(fileNameWithoutExt);
sb.append(".");
sb.append(config.getProperty("csv.file.ext"));
String fileName = sb.toString();
File dest = new File(fileName);
tmp.renameTo(dest);
}
} catch (IOException ex) {
Logger.getLogger(PVTServiceBean.class.getName()).log(Level.SEVERE, null, ex);
}
return 1; // 追加1個
}
/**
* 引数の日付が今日かどうかを返す。
* (予定カルテ対応)
* @param mmlDate yyyy-MM-ddTHH:mm:ss
* @return 今日の時 true
*/
private boolean isToday(String mmlDate) {
try {
int index = mmlDate.indexOf("T");
String test = mmlDate.substring(0, index);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String today = sdf.format(new Date());
return test.equals(today);
} catch (Exception e) {
}
return false;
}
// /**
// * 患者来院情報を登録する。
// * @param spec 来院情報を保持する DTO オブジェクト
// * @return 登録個数
// */
//
// public int addPvt(PatientVisitModel pvt) {
//
// PatientModel patient = pvt.getPatientModel();
// String fid = pvt.getFacilityId();
//
// // 2012-07
// // ORCAの受付で、受付する保険や担当医を間違え、キャンセルなしに再受付した場合の処理を変更。
// // 前のレコードを削除して新規に受付のレコードを生成すると、クライアントプログラムで削除した受付レコードを
// // 保持し、カルテ保存後もステータスが更新されないケースがあった。
// // 再受付の場合は最初のレコードを後からきたデータで上書きするようにした。
//
//// //--------------------------------------------
//// // 二重登録をチェックする
//// //--------------------------------------------
//// try {
//// List<PatientVisitModel> list = (List<PatientVisitModel>)em
//// .createQuery(QUERY_PVT_BY_FID_PID_DATE)
//// .setParameter(FID, fid)
//// .setParameter(DATE, pvt.getPvtDate()+PERCENT)
//// .setParameter(PID, patient.getPatientId())
//// .getResultList();
//// if (!list.isEmpty()) {
//// for (PatientVisitModel doubleEntry : list) {
//// em.remove(doubleEntry);
//// }
//// }
////
//// } catch (Exception te) {
//// return 0;
//// }
//
// // 既存の患者かどうか調べる
// try {
// PatientModel exist = (PatientModel) em
// .createQuery(QUERY_PATIENT_BY_FID_PID)
// .setParameter(FID, fid)
// .setParameter(PID, patient.getPatientId())
// .getSingleResult();
//
// //-----------------------------
// // 健康保険情報を更新する
// //-----------------------------
// Collection<HealthInsuranceModel> ins = patient.getHealthInsurances();
// if (ins != null && ins.size() > 0) {
//
// // 健康保険を更新する
// Collection old = em.createQuery(QUERY_INSURANCE_BY_PATIENT_ID)
// .setParameter(ID, exist.getId())
// .getResultList();
//
// // 現在の保険情報を削除する
// for (Iterator iter = old.iterator(); iter.hasNext(); ) {
// HealthInsuranceModel model = (HealthInsuranceModel) iter.next();
// em.remove(model);
// }
//
// // 新しい健康保険情報を登録する
// Collection<HealthInsuranceModel> newOne = patient.getHealthInsurances();
// for (HealthInsuranceModel model : newOne) {
// model.setPatient(exist);
// em.persist(model);
// }
// }
//
// // 名前を更新する 2007-04-12
// exist.setFamilyName(patient.getFamilyName());
// exist.setGivenName(patient.getGivenName());
// exist.setFullName(patient.getFullName());
// exist.setKanaFamilyName(patient.getKanaFamilyName());
// exist.setKanaGivenName(patient.getKanaGivenName());
// exist.setKanaName(patient.getKanaName());
// exist.setRomanFamilyName(patient.getRomanFamilyName());
// exist.setRomanGivenName(patient.getRomanGivenName());
// exist.setRomanName(patient.getRomanName());
//
// // 性別
// exist.setGender(patient.getGender());
// exist.setGenderDesc(patient.getGenderDesc());
// exist.setGenderCodeSys(patient.getGenderCodeSys());
//
// // Birthday
// exist.setBirthday(patient.getBirthday());
//
// // 住所、電話を更新する
// exist.setSimpleAddressModel(patient.getSimpleAddressModel());
// exist.setTelephone(patient.getTelephone());
// //exist.setMobilePhone(patient.getMobilePhone());
//
// // PatientVisit との関係を設定する
// pvt.setPatientModel(exist);
//
// } catch (NoResultException e) {
// // 新規患者であれば登録する
// // 患者属性は cascade=PERSIST で自動的に保存される
// em.persist(patient);
//
// // この患者のカルテを生成する
// KarteBean karte = new KarteBean();
// karte.setPatientModel(patient);
// karte.setCreated(new Date());
// em.persist(karte);
// }
////
//// // 来院情報を登録する
//// // CLAIM の仕様により患者情報のみを登録し、来院情報はない場合がある
//// // それを pvtDate の属性で判断している
//// if (pvt.getPvtDate() != null) {
//// em.persist(pvt);
//// }
//
// // 来院情報を登録する
// // CLAIM の仕様により患者情報のみを登録し、来院情報はない場合がある
// // それを pvtDate の属性で判断している
// if (pvt.getPvtDate()==null) {
// return 1;
// }
//
// //------------------------------------------
// // 既に同一患者同一時刻で受け付けがあるか ?
// //------------------------------------------
// List<PatientVisitModel> list = (List<PatientVisitModel>)em
// .createQuery(QUERY_PVT_BY_FID_PID_DATE)
// .setParameter(FID, fid)
// .setParameter(DATE, pvt.getPvtDate()+PERCENT)
// .setParameter(PID, patient.getPatientId())
// .getResultList();
//
// if (list.isEmpty()) {
// // 受付がない場合
// em.persist(pvt);
//
// } else {
// // 最初のレコードを後から来たデータで上書きする
// PatientVisitModel target = list.get(0);
// target.setDepartment(pvt.getDepartment());
// target.setDeptCode(pvt.getDeptCode());
// target.setDeptName(pvt.getDeptName());
// target.setDoctorId(pvt.getDoctorId());
// target.setDoctorName(pvt.getDoctorName());
// target.setFirstInsurance(pvt.getFirstInsurance());
// target.setInsuranceUid(pvt.getInsuranceUid());
// target.setJmariNumber(pvt.getJmariNumber());
// // transient及び値が変更されないもの
// //target.setAppointment(pvt.getAppointment());
// //target.setFacilityId(pvt.getFacilityId());
// //target.setMemo(pvt.getMemo());
// //target.setNumber(pvt.getNumber());
// //target.setPatientModel(pvt.getPatientModel());
// //target.setPvtDate(pvt.getPvtDate());
// //target.setState(pvt.getState());
// //target.setWatingTime(pvt.getWatingTime());
// }
//
// return 1;
// }
/**
* 施設の患者来院情報を取得する。
* @param fid
* @param date
* @param firstResult
* @param appoDateFrom
* @param appoDateTo
* @return 来院情報のCollection
*/
public List<PatientVisitModel> getPvt(String fid, String date, int firstResult, String appoDateFrom, String appoDateTo) {
if (!date.endsWith(PERCENT)) {
date += PERCENT;
}
// PatientVisitModelを施設IDで検索する
List<PatientVisitModel> result =
(List<PatientVisitModel>) em.createQuery(QUERY_PVT_BY_FID_DATE)
.setParameter(FID, fid)
.setParameter(DATE, date+PERCENT)
.setFirstResult(firstResult)
.getResultList();
int len = result.size();
if (len == 0) {
return result;
}
int index = date.indexOf(PERCENT);
Date theDate = ModelUtils.getDateAsObject(date.substring(0, index));
boolean searchAppo = (appoDateFrom != null && appoDateTo != null);
// 来院情報と患者は ManyToOne の関係である
for (int i = 0; i < len; i++) {
//for (int i = firstResult; i < len; i++) {
PatientVisitModel pvt = result.get(i);
PatientModel patient = pvt.getPatientModel();
// 患者の健康保険を取得する
List<HealthInsuranceModel> insurances = (List<HealthInsuranceModel>)em.createQuery(QUERY_INSURANCE_BY_PATIENT_ID)
.setParameter(ID, patient.getId()).getResultList();
patient.setHealthInsurances(insurances);
// 予約を検索する
if (searchAppo) {
KarteBean karte = (KarteBean)em.createQuery(QUERY_KARTE_BY_PATIENT_ID)
.setParameter(ID, patient.getId())
.getSingleResult();
// カルテの PK を得る
long karteId = karte.getId();
List c = em.createQuery(QUERY_APPO_BY_KARTE_ID_DATE)
.setParameter(ID, karteId)
.setParameter(DATE, theDate)
.getResultList();
//System.err.println("appo size = " + c.size());
if (c != null && c.size() > 0) {
// 当日の予約で最初のもの
AppointmentModel appo = (AppointmentModel) c.get(0);
pvt.setAppointment(appo.getName());
}
}
}
return result;
}
public List<PatientVisitModel> getPvt(String fid, String did, String unassigned, String date, int firstResult, String appoDateFrom, String appoDateTo) {
if (!date.endsWith(PERCENT)) {
date += PERCENT;
}
// PatientVisitModelを施設IDで検索する
List<PatientVisitModel> result =
(List<PatientVisitModel>) em.createQuery(QUERY_PVT_BY_FID_DID_DATE)
.setParameter(FID, fid)
.setParameter(DID, did)
.setParameter(UNASSIGNED, unassigned)
.setParameter(DATE, date+PERCENT)
.setFirstResult(firstResult)
.getResultList();
int len = result.size();
if (len == 0) {
return result;
}
int index = date.indexOf(PERCENT);
Date theDate = ModelUtils.getDateAsObject(date.substring(0, index));
boolean searchAppo = (appoDateFrom != null && appoDateTo != null);
// 来院情報と患者は ManyToOne の関係である
for (int i = 0; i < len; i++) {
//for (int i = firstResult; i < len; i++) {
PatientVisitModel pvt = result.get(i);
PatientModel patient = pvt.getPatientModel();
// 患者の健康保険を取得する
List<HealthInsuranceModel> insurances = (List<HealthInsuranceModel>)em.createQuery(QUERY_INSURANCE_BY_PATIENT_ID)
.setParameter(ID, patient.getId()).getResultList();
patient.setHealthInsurances(insurances);
// 予約を検索する
if (searchAppo) {
KarteBean karte = (KarteBean)em.createQuery(QUERY_KARTE_BY_PATIENT_ID)
.setParameter(ID, patient.getId())
.getSingleResult();
// カルテの PK を得る
long karteId = karte.getId();
List c = em.createQuery(QUERY_APPO_BY_KARTE_ID_DATE)
.setParameter(ID, karteId)
.setParameter(DATE, theDate)
.getResultList();
//System.err.println("appo size = " + c.size());
if (c != null && c.size() > 0) {
// 当日の予約で最初のもの
AppointmentModel appo = (AppointmentModel) c.get(0);
pvt.setAppointment(appo.getName());
}
}
}
return result;
}
/**
* 受付情報を削除する。
* @param id
* @param fid
* @return 削除件数
*/
public int removePvt(long id, String fid) {
try {
// データベースから削除
PatientVisitModel exist = em.find(PatientVisitModel.class, id);
// WatingListから開いていないとexist = nullなので。
if (exist != null) {
em.remove(exist);
}
// pvtListから削除
List<PatientVisitModel> pvtList = eventServiceBean.getPvtList(fid);
PatientVisitModel toRemove = null;
for (PatientVisitModel model : pvtList) {
if (model.getId() == id) {
toRemove = model;
break;
}
}
if (toRemove != null) {
pvtList.remove(toRemove);
return 1;
}
} catch (Exception e) {
}
return 0;
}
/**
* 受付情報を削除する。
* @param id 受付レコード
* @return 削除件数
*/
public int removePvt(long id) {
PatientVisitModel exist = (PatientVisitModel) em.find(PatientVisitModel.class, new Long(id));
em.remove(exist);
return 1;
}
/**
* 診察終了情報を書き込む。
* @param pk レコードID
* @param state 診察終了の時 1
* @return
*/
public int updatePvtState(long pk, int state) {
//PatientVisitModel exist = (PatientVisitModel) em.find(PatientVisitModel.class, new Long(pk));
List<PatientVisitModel> list = em
.createQuery(QUERY_PVT_BY_PK)
.setParameter(ID, pk)
.getResultList();
if (list.isEmpty()) {
return 0;
}
PatientVisitModel exist = list.get(0);
// 保存(CLAIM送信)==2 (bit=1)
// 修正送信 == 4 (bit=2)
if (state == 2 || state == 4) {
exist.setState(state);
em.flush();
return 1;
}
int curState = exist.getState();
boolean red = ((curState & (1<<BIT_SAVE_CLAIM))!=0);
boolean yellow = ((curState & (1<<BIT_MODIFY_CLAIM))!=0);
boolean cancel = ((curState & (1<<BIT_CANCEL))!=0);
// 保存 | 修正 | キャンセル --> 変更不可
if (red || yellow || cancel) {
return 0;
}
exist.setState(state);
em.flush();
return 1;
}
/**
* メモを更新する。
* @param pk レコードID
* @param memo メモ
* @return 1
*/
public int updateMemo(long pk, String memo) {
PatientVisitModel exist = (PatientVisitModel) em.find(PatientVisitModel.class, new Long(pk));
exist.setMemo(memo);
return 1;
}
}