package open.dolphin.client;
import java.awt.Toolkit;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.swing.JOptionPane;
import open.dolphin.delegater.MasudaDelegater;
import open.dolphin.delegater.OrcaDelegater;
import open.dolphin.delegater.OrcaDelegaterFactory;
import open.dolphin.helper.DBTask;
import open.dolphin.infomodel.*;
/**
* KarteEditorで保存したとき呼ばれる
* KartePane内の薬剤をリストアップしてOrcaの薬剤併用データベースで検索
* 内服薬のみ。注射はなし。
* 臨時処方の日数や長期処方制限、2錠/分3などの確認も行う
*
* @author masuda, Masuda Naika
*/
public class CheckMedication {
protected static final String MEDICATION_CHECK_RESULT = "medicationCheckResult";
private static final String yakuzaiClassCode = "2"; // 薬剤のclaim class code
private static final int searchPeriod = 3;
private HashMap<String, String[]> rirekiItems; // カルテに記録されている薬剤
private long karteId;
private HashMap<String, String> drugCodeNameMap;
private List<ModuleModel> moduleList;
private List<BundleDolphin> bundleList; // 注射も含む
private final PropertyChangeSupport boundSupport;
private boolean result;
public CheckMedication() {
boundSupport = new PropertyChangeSupport(this);
}
public void addPropertyChangeListener(PropertyChangeListener l) {
boundSupport.addPropertyChangeListener(MEDICATION_CHECK_RESULT, l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
boundSupport.removePropertyChangeListener(MEDICATION_CHECK_RESULT, l);
}
public void setResult(boolean newResult) {
result = newResult;
boundSupport.firePropertyChange(MEDICATION_CHECK_RESULT, !result, result);
}
public void checkStart(Chart context, List<ModuleModel> stamps) {
karteId = context.getKarte().getId();
moduleList = stamps;
makeDrugList();
int len = drugCodeNameMap.size();
// 薬なかったらリターン
if (len == 0){
setResult(false);
return;
}
DBTask task = new DBTask<List<DrugInteractionModel>, Void>(context) {
@Override
protected List<DrugInteractionModel> doInBackground() throws Exception {
Collection<String> codes = drugCodeNameMap.keySet();
collectMedicine();
Collection<String> pastCodes = new ArrayList();
List<String> keys = new ArrayList<>(codes);
for(int i = 0; i < keys.size(); i++) {
pastCodes.add(keys.get(i));
}
if(rirekiItems != null && !rirekiItems.isEmpty()) {
keys = new ArrayList<>(rirekiItems.keySet());
for(int i = 0; i < keys.size(); i++) {
pastCodes.add(keys.get(i));
}
}
OrcaDelegater odl = OrcaDelegaterFactory.create();
List<DrugInteractionModel> list = odl.checkInteraction(codes, pastCodes);
return list;
}
@Override
protected void succeeded(List<DrugInteractionModel> list) {
if (list!=null && !list.isEmpty()){
java.util.ResourceBundle bundle = ClientContext.getMyBundle(CheckMedication.class);
StringBuilder sb = new StringBuilder();
for (DrugInteractionModel model : list){
StringBuilder tmp = new StringBuilder();
tmp.append(bundle.getString("ContraindicationsForCoadministration"));
tmp.append(drugCodeNameMap.get(model.getSrycd1()));
tmp.append(bundle.getString("text.and "));
if (rirekiItems!=null && !rirekiItems.isEmpty()) {
String[] str = rirekiItems.get(model.getSrycd2());
if(str != null && str.length > 0) {
tmp.append(str[0]);
} else {
tmp.append(drugCodeNameMap.get(model.getSrycd2()));
}
} else {
tmp.append(drugCodeNameMap.get(model.getSrycd2()));
}
tmp.append("\n");
tmp.append(model.getSskijo());
tmp.append(" ");
tmp.append(model.getSyojyoucd());
tmp.append("\n");
sb.append(formatMsg(tmp.toString()));
}
String msg = sb.toString();
Toolkit.getDefaultToolkit().beep();
String[] options = {GUIFactory.getCancelButtonText(), bundle.getString("option.ignore")};
int val = JOptionPane.showOptionDialog(context.getFrame(), msg, ClientContext.getFrameTitle(bundle.getString("title.optionPane.Coadministration")),
JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, options, options[0]);
switch (val) {
case 0:
setResult(true);
break;
case 1:
setResult(false);
break;
}
} else {
setResult(false);
}
}
@Override
protected void failed(Throwable e) {
setResult(false);
}
};
task.execute();
}
private void makeDrugList() {
drugCodeNameMap = new HashMap<>();
bundleList = new ArrayList<>();
for (ModuleModel stamp : moduleList) {
String entity = stamp.getModuleInfoBean().getEntity();
if (IInfoModel.ENTITY_MED_ORDER.equals(entity) || IInfoModel.ENTITY_INJECTION_ORDER.equals(entity)) {
BundleDolphin bundle = (BundleDolphin) stamp.getModel();
bundleList.add(bundle);
ClaimItem[] ci = bundle.getClaimItem();
if(ci != null) {
for (ClaimItem c : ci) {
if (c.getClassCode() != null && ClaimConst.YAKUZAI == Integer.valueOf(c.getClassCode())) {
drugCodeNameMap.put(c.getCode(), c.getName());
}
}
}
}
}
}
private void collectMedicine() {
rirekiItems = new HashMap();
// 過去3ヶ月の薬剤・注射ののModuleModelを取得する
MasudaDelegater del = MasudaDelegater.getInstance();
List<String> entities = new ArrayList();
entities.add(IInfoModel.ENTITY_MED_ORDER);
entities.add(IInfoModel.ENTITY_INJECTION_ORDER);
GregorianCalendar gcTo = new GregorianCalendar();
gcTo.add(GregorianCalendar.DAY_OF_MONTH,1);
Date toDate = gcTo.getTime();
GregorianCalendar gcFrom = new GregorianCalendar();
gcFrom.add(GregorianCalendar.MONTH, -searchPeriod);
Date fromDate = gcFrom.getTime();
List<ModuleModel> pastModuleList = del.getModulesEntitySearch(karteId, fromDate, toDate, entities);
if (pastModuleList == null) {
return;
}
// ModuleModelの薬剤を取得
for (ModuleModel mm : pastModuleList) {
ClaimBundle cb = (ClaimBundle) mm.getModel();
for (ClaimItem ci : cb.getClaimItem()) {
if (yakuzaiClassCode.equals(ci.getClassCode())) { // 用法などじゃなくて薬剤なら、薬剤リストに追加
final SimpleDateFormat frmt = new SimpleDateFormat("yyyy-MM-dd");
String code = ci.getCode(); // コード
String name = ci.getName(); // 薬剤名
String date = frmt.format(mm.getStarted()); // 処方日
rirekiItems.put(code, new String[]{name, date});
}
}
}
}
private String formatMsg(String str) {
final int width = 40; // 桁数
int pos = 0;
StringBuilder buf = new StringBuilder();
for (int i = 0; i < str.length(); ++i) {
String c = str.substring(i, i + 1);
if ("\n".equals(c)){
pos = 0;
} else if (pos == width){
pos = 0;
buf.append("\n");
} else {
++pos;
}
buf.append(c);
}
return buf.toString();
}
}